#!/usr/bin/perl -w # # make disk image from folder # # usage: makedmg src dst name # # Donated by Frank Vercruesse $hdiUtilExec = "/usr/bin/hdiutil"; $hdiDrvExec = "/usr/bin/hdid"; $newfsExec = "/sbin/newfs_hfs"; $duExec = "/usr/bin/du"; $dittoExec = "/usr/bin/ditto"; if ( $#ARGV != 2 ) { die "Wrong number of arguments.\nUsage: makedmg src dst name\n"; } &make_dmg( $ARGV[0], $ARGV[1], $ARGV[2]); sub make_dmg { my $src = $_[0]; my $dst = $_[1]; my $name = $_[2]; # check dirs if( not -d $dst && -d $src ) { die "src and dst must be directories\n"; } # calc disk image size if( not open( MYPIPE, "$duExec -sk \"${src}\" |") ) { die "couldn't open pipe\n"; } (my $dmgsize) = split( /\s+/, ); close( MYPIPE); $dmgsize /= 1024; $dmgsize = int($dmgsize + 4); if( $dmgsize < 5 ) { $dmgsize = 5 } # create disk image system "cd \"$dst\"; $hdiUtilExec create -megabytes $dmgsize -ov \"_${name}\""; if( $? ) { die "couldn't create disk image\n"; } # format disk image if( not open( MYPIPE, "cd \"$dst\"; $hdiDrvExec -nomount \"_${name}.dmg\" |") ) { die "couldn't open pipe\n"; } (my $dev) = split( /\t/, ); $dev =~ s/^(.*\S)\s*$/$1/; my( $part, $raw, $pname); while( ) { ($part,$pname) = split /\t/; if( $pname =~ m/^Apple_HFS/ ) { $part =~ s/^\s*(.*\S)\s*$/$1/; $raw = $part; $raw =~ s/^(\/dev\/)(.+)/$1r$2/; last; } } close( MYPIPE); system "cd \"$dst\" ; $newfsExec -v \"$name\" $raw"; if( $? ) { system "$hdiUtilExec eject $dev"; die "couldn't format disk image\n"; } system "$hdiUtilExec eject $dev"; if( $? ) { die "couldn't eject disk image\n"; } # copy files if( not open( MYPIPE, "cd \"$dst\"; $hdiDrvExec \"_${name}.dmg\" |") ) { die "couldn't open pipe\n"; } ($dev) = split( /\t/, ); $dev =~ s/^(.*\S)\s*$/$1/; my $vname; while( ) { ($part,$pname,$vname) = split /\t/; if( $pname =~ m/^Apple_HFS/ ) { $vname =~ s/^(.*\S)\s*$/$1/; last; } } close( MYPIPE); system "$dittoExec \"${src}\" \"${vname}\""; if( $? ) { system "$hdiUtilExec eject $dev"; die "couldn't copy files\n"; } system "$hdiUtilExec eject $dev"; if( $? ) { die "couldn't eject disk image\n"; } # convert disk image system "cd \"$dst\"; $hdiUtilExec convert \"_${name}.dmg\" -format UDCO -o \"${name}\""; if( $? ) { die "couldn't convert disk image\n"; } }