#!/usr/local/bin/perl -w # # $Id: cdcut,v 1.4 1999/02/23 21:48:28 mccannwj Exp $ # ------------------------------------------------------------------------- # CD cutting # Interface to Young Minds MakeDisc CD Mastering System # # ------------------------------------------------------------------------- # written by: # William Jon McCann # 8-13-97 # Advanced Camera for Surveys # Johns Hopkins University # ------------------------------------------------------------------------- # --------------------Local Configuration--------------------------- # system affiliation (used for startup message) $SYSaffiliation = 'JHU/ACS'; # speed of CD-R device $CDspeed = 4; # seconds of pause before cutting $INITIAL_PAUSE = 10; # default CD device (overridden by command line) $Default_CDdev_name = '/dev/rmt/0'; # default work directory (overridden by command line) $Default_CDwork_dir = '/tmp/makedisc'; # platform specific magnetic tape device control $SYSmt_command = '/bin/mt -f'; # Forward space one file (initiates the CD cut) $SYSmt_file_command = 'fsf 1'; # ---------------------Do Not Edit Below This Line-------------------- $VERSION = substr '$Revision: 1.4 $ ', 11, -3; $VERSION_DATE = substr '$Date: 1999/02/23 21:48:28 $ ', 7, -3; use Getopt::Std; use vars qw( $opt_f $opt_n $opt_s $opt_w $opt_h $opt_k $opt_q $opt_v $opt_V ); # Calibration of device $CDmb_per_min = ( ($CDspeed*650) / 74 ) + 1; # Process commandline options getopt('fnsw'); getopts('hkqvV:'); $Help_Flag = $opt_h; $Keep_Flag = $opt_k; $Quiet_Flag = $opt_q; $Version_Flag = $opt_V; $Verbose_Flag = $opt_v; # initialize flags if not defined $Help_Flag = 0 unless (defined $Help_Flag); $Keep_Flag = 0 unless (defined $Keep_Flag); $Quiet_Flag = 0 unless (defined $Quiet_Flag); $Verbose_Flag = 0 unless (defined $Verbose_Flag); $Version_Flag = 0 unless (defined $Version_Flag); &usage if ($Help_Flag == 1); &version( $VERSION, $VERSION_DATE ) if ($Version_Flag == 1); $CDdevice_name = $opt_f; $CDdata_size = $opt_s; $CDwork_dir = $opt_w; $CDnumber = $opt_n; # initialize variables if not defined $CDdevice_name = '' unless (defined $CDdevice_name ); $CDdata_size = '' unless (defined $CDdata_size ); $CDwork_dir = '' unless (defined $CDwork_dir ); $CDnumber = '' unless (defined $CDnumber ); if (($Quiet_Flag == 1) && ($CDdata_size eq '')) { print STDERR "error: Data size not specified.\n"; print STDERR "\n You must specify data size on the command line\n"; print STDERR " in order to use the quiet switch.\n\n"; exit(1); } $CDdevice_name = $Default_CDdev_name if ( $CDdevice_name eq ''); $CDwork_dir = $Default_CDwork_dir if ( $CDwork_dir eq ''); $CDnumber = 1 if ($CDnumber eq ''); # Prompt user unless ($Quiet_Flag == 1) { print "$SYSaffiliation CD mastering facility\n\n"; print "Pre-mastering complete and ready to cut CD (y/n)? "; $input = lc ; chop $input; exit(1) unless ( ($input eq "y") || ($input eq "yes") ); if( $CDdata_size eq '' ) { $input = ''; while ($input eq '') { print "Enter size of data set (in megabytes): "; $input = lc ; chop $input; } $CDdata_size = $input; } for ($i=0; $i < $CDnumber; $i++ ) { $input = ''; print "Blank CD in drive and ready to begin (y/n)? "; $input = lc ; chop $input; exit(1) unless ( ($input eq "y") || ($input eq "yes") ); unless( $INITIAL_PAUSE == 0 ) { print " pausing $INITIAL_PAUSE seconds to allow opportunity to cancel cut...\n"; sleep $INITIAL_PAUSE; } $iplusone = $i + 1; print " creating CD $iplusone of $CDnumber...\n"; &executecut; &showstatus; } } else { &executecut; &showstatus; } &cleanexit unless ($Keep_Flag == 1); &keepexit; # --------------------Subroutines--------------------------- sub executecut { # Execute the CD cut my ( $cutcmd, $output, $retval ); $cutcmd = "$SYSmt_command $CDdevice_name $SYSmt_file_command"; if ($Quiet_Flag == 1) { $output = `$cutcmd 2>&1`; } else { $output = `$cutcmd`; } $retval = $?; if( $retval ne 0 ) { print STDERR "error running cut command: $output"; exit(1); } } sub showstatus { my ( $optime, $i, $sleeptime ); # set autoflush output $| = 1; # operation time in minutes $optime = $CDdata_size / $CDmb_per_min; # sleep time in minutes (1/20th of optime) # sleeptime is the time between each 5% of completion $sleeptime = $optime/20; # sleep time in seconds $sleeptime = $sleeptime * 60; printf( "Estimated time: %.2f minutes\n", $optime ) unless ($Quiet_Flag == 1); print "Percentage of media complete :\n" unless ($Quiet_Flag == 1); for( $i=5; $i < 100; $i=$i+5 ) { select( undef, undef, undef, $sleeptime ); print "$i.." unless ($Quiet_Flag == 1); } select( undef, undef, undef, $sleeptime ); print "100 %\n" unless ($Quiet_Flag == 1); } sub cleanexit { # Perform a cleanup and then exit print "@_\n" unless ($Quiet_Flag == 1); print " cleaning up..." unless ($Quiet_Flag == 1); if( -e $CDwork_dir ) { `/bin/rm -rf $CDwork_dir 2>&1`; } print " done.\n" unless ($Quiet_Flag == 1); exit(0); } sub keepexit { # keep work directory and exit print "@_\n" unless ($Quiet_Flag == 1); print " keeping work directory..." unless ($Quiet_Flag == 1); print " done.\n" unless ($Quiet_Flag == 1); exit(0); } sub usage { # Show usage info and then exit my ( @message ) = @_; my ( $program ); $program = $0; $program =~ s/^.*\/([\S]+)$/$1/o; print STDERR "@message\n"; print STDERR "usage: $program [-hkqvV] [-f device] [-n number] [-s datasize] [-w workdir] \n"; print STDERR " -f device CD Studio device name\n"; print STDERR " -h display this help\n"; print STDERR " -k keep work directory\n"; print STDERR " -n number number of CDs to create\n"; print STDERR " -q suppress all messages (noninteractive)\n"; print STDERR " -s datasize size of CD image in megabytes\n"; print STDERR " -w workdir path of Makedisc work directory\n"; print STDERR " -v verbose mode\n"; print STDERR " -V display version number\n"; exit(1); } sub version { # show version info and exit my ( $ver, $ver_date ) = @_; my ( $program ); $ver = lc $ver; $ver_date = lc $ver_date; $ver =~ s/\$//g; $ver_date =~ s/\$//g; $program = $0; $program =~ s/^.*\/([\S]+)$/$1/o; print STDERR "$program $ver released on $ver_date\n"; exit(1); }