#!/usr/bin/perl ######################################################################### #Autor :Gustavo Guillermo Pérez #Email :gustavo@compunauta.com,gus_est_prgms@yahoo.com #XTRAS :Ernesto Varela evarela@pes.fvet.edu.uy #Lic. :GNU/GPL #Url :http://www.compunauta.com/forums/linux/grabarcds/add2cd.html #Url2 :http://www.compunauta.com/forums/linux/grabarcds/img/add2cd #cdrecord :Cdrecord-Clone 2.01 (i686-pc-linux-gnu) Copyright (C) 1995-2004 Jrg Schilling # :and avobe #mkisofs :mkisofs 2.01 (i686-pc-linux-gnu) # :and avobe #Descripción :Agrega datos a un CDR o CDRW en modo multisesión, interfaz para cdrecord #Description :Add data onto a CDR or CDRW in multisession mode, frontend for cdrecord $VERSION="3.0-20080308"; #LAST MODIFY $VOLUME_NAME="ADD2CDPRJ"; ######################################################################### ######################### SETUP DEFAULTS ############################## $CDR_DEVICE="/dev/hdg"; #DISPOSITIVO SCSI, BUSCARLO CON:cdrecord -scanbus #SCSI DEVICE OR IDE DEVICE try:cdrecord -scanbus $CDR_SPEED="32"; #MAXIMA VELOCIDAD, SI EL SISTEMA SE ENLENTECE, BAJAR #MAX SPEED, IF SYSTEM GOES SLOW, DOWN IT $CDR_FIFOSIZE="30m"; #TAMAÑO DEL BUFFER, NO SE PUEDE MAS DE 30m #BUFFER SIZE, CAN'T BE MORE THAN 30m $FOLLOW=""; #PONER "-f" SI SE DESEA QUE SE PERSIGAN ENLACES #PUT "-f" if you wish to follow symlinks by default $FILES=""; #PONER UN DIRECTORIO POR DEFECTO Ej: "\"/home\"" #PUT HERE IF YOU WISH A DEFAULT FOLDER ej: "\"/home\"" $EJECT="-eject"; #PONER "-eject" PARA EXPULSAR EL CD, OBLIGATORIO PARA AGREGAR OTRA SESION! #PUT HERE "-eject" TO EJECT THE CD, A LOT OF RECORDERS NEED IT TO ADD NEW SESSION! $IGNORESIZE="off"; #IGNORA EL TAMAÑO DE LOS DATOS Y CONFIA EN QUE CABEN #IGNORES IF DATA FITS AND BELIVE IT FITS ######################################################################### #$CDR_XTRAS=""; $CDR_XTRAS="driveropts=burnfree"; #FLAGS EXTRAS PARA USO GENERAL VER:add2cd --help #EXTRA FLAGS FOR GENERAL PURPOSE SEE: add2cd --help #SOME RECORDERS HAS NO OPTION BURNFREE BUT USE IT AS DEFAULT $DUMMY=""; #SOLO PARA DEBUG, EN CASO DE REPROGRAMACION #JUST FOR DEBUG IF YOU WISH TO TOUCH THE CODE ######################################################################### $MKF_XTRAS="-J -r -allow-leading-dots --graft-points --joliet-long"; #FLAGS EXTRAS PARA USO GENERAL VER:add2cd --help #EXTRA FLAGS FOR GENERAL PURPOSE SEE: add2cd --help ######################################################################### $DEBUG="off"; #ENSEÑA LA LINEA DE CDRECORD ANTES DE EJECUTARLA #SHOWS CDRECORD CMDLINE BEFORE RUN IT, PUT "on" $CDR_SIZE="650"; #TAMAÑO POR DEFECTO DADO CASOS MUY ESPECIALES #DEFAULT SIZE FOR VERY SPECIAL CASES $CDR_MIN="74"; #TAMAÑO POR DEFECTO DADO CASOS MUY ESPECIALES #DEFAULT SIZE FOR VERY SPECIAL CASES ######################################################################### $CXTRAS=""; #NO USAR!!!! ES PARA LA DETECCION DE MULTISESION #DON'T USE!!! IS FOR MULTISESSION AUTODETECTION $MXTRAS=""; #NO USAR!!!! ES PARA LA DETECCION DE MULTISESION #DON'T USE!!! IS FOR MULTISESSION AUTODETECTION $CDR_FLAGS="-tao -multi -waiti $EJECT $DUMMY gracetime=2 -v -data"; #FLAGS PARA CDRECORD, TRATAR DE NO MODIFICAR!!!! #CDRECORD FLAGS, TRY TO DON'T TOUCH!!! $ERASE="off"; #NO USAR!!!! ES PARA BORRAR EN VEZ DE GRABAR #DON'T USE IS FOR ERASE INSTEAD OF RECORD $BURNISO="off"; #NO USAR!!!! ES PARA GRABAR UNA ISO #DON'T USE IS FOR ERASE INSTEAD OF RECORD ######################################################################### ######################### ARGUMENTOS DE ENTRADA ######################### system("clear"); print "add2cd Ver $VERSION\nAutor: Gustavo Pérez gustavo\@compunauta.com\nhttp://www.compunauta.com/forums/linux/grabarcds/add2cd.html\n"; if (@ARGV[0] eq "") {usage();} foreach(@ARGV){ $l=$_; #print "$l\n"; $flag="off"; if($l eq "--help"){usage();} if($l=~/(.*)=(.*)/i){ #print "\$1:$1\n\$2:$2\n"; $param=$1;$arg=$2; if ($param eq "--speed"){$CDR_SPEED=$arg;$flag="on";} if ($param eq "--dev"){$CDR_DEVICE=$arg;$flag="on";} if ($param eq "--fs"){$CDR_FIFOSIZE=$arg;$flag="on";} if ($param eq "--V"){$VOLUME_NAME=$arg;$flag="on";} if ($param eq "--f"){if ($arg eq "on"){$FOLLOW="-f";} if ($arg eq "off"){$FOLLOW="";} $flag="on";} if ($param eq "--cdxtras"){$CDR_XTRAS="$CDR_XTRAS $arg";$flag="on";} if ($param eq "--mkxtras"){$MKF_XTRAS="$MKF_XTRAS $arg";$flag="on";} if ($param eq "--debug"){$DEBUG=$arg;$flag="on";} if ($param eq "--erase"){$ERASE=$arg;$flag="on";} if ($param eq "--ignoresize"){$IGNORESIZE=$arg;$flag="on";} if ($param eq "--burniso"){$BURNISO=$arg;} }#end argv if ($flag eq "off"){$FILES="$FILES\"$l\" ";} }# $FILES=~s/=/\"=\"/g; ######################################################################### ################### CHEQUEOS DE ESPACIO Y DISCO ####################### if ($ERASE eq "on"){print("Mode : Deleting CDRW / Borrando disco REGRABABLE\n\n\n"); system("sleep 4"); system("cdrecord dev=$CDR_DEVICE -v speed=$CDR_SPEED blank=fast $CDR_XTRAS $EJECT"); if (($FILES eq "") and ($BURNISO eq "")){exit(0);} } if ($BURNISO ne "off"){ $CDR_CMDLINE="cdrecord dev=$CDR_DEVICE -dao -multi -eject -v $CDR_XTRAS fs=$CDR_FIFOSIZE speed=$CDR_SPEED -data $BURNISO"; print "$CDR_CMDLINE\n"; system($CDR_CMDLINE); exit(0); } $CDR_SPEED=getSpeed($CDR_SPEED); $CDSTAT=`cdrecord dev=$CDR_DEVICE -msinfo 2>/dev/null`; chomp $CDSTAT; if ($CDSTAT ne "") {print("Mode : Continuando CD multisesión\n"); $MXTRAS="-M $CDR_DEVICE";$CXTRAS="-C $CDSTAT";} else { if (getToc() eq "on"){print "Put a valid disc / Inserte un disco válido\n"; exit(1);} print ("Mode : Starting / Iniciando CD multisesión\n");} $CDR_CMDLINE="mkisofs $MKF_XTRAS -V $VOLUME_NAME $FOLLOW $MXTRAS $CXTRAS $FILES | cdrecord dev=$CDR_DEVICE fs=$CDR_FIFOSIZE speed=$CDR_SPEED $CDR_XTRAS $CDR_FLAGS -"; $MKI_CMDLINE="mkisofs -o /dev/null $MKF_XTRAS $FOLLOW $MXTRAS $CXTRAS $FILES 2>&1"; checkSize($MKI_CMDLINE); print "\n\n\n"; if ($DEBUG eq "on"){ print("Datos: $FILES\n"); print("$CDR_CMDLINE\n\n"); } ######################################################################### ########################### GRABAR EL CD ################################ system("sleep 4"); system("$CDR_CMDLINE"); ########################## FIN DEL SCRIPT / END OF SCRIPT ############### ######################################################################### # # SUBRUTINAS PARA LA DETECCION Y CREADO DE IMAGENES # ######################################################################## #SUBRUTINA DE MODO DE USO sub usage { if ($ENV{'LANG'}=~/.*(es).*/i){usage_es();} else{usage_en();} } sub usage_es { print ("Modo de uso: add2cd [--opción=valor] files dirs\n"); print ("\t--speed=4\t\t\tVelocidad\n"); print ("\t--dev=0,0,0\t\tDispositivo SCSI\n"); print ("\t--fs=30m \t\tTAMAÑO DEL BUFFER\n"); print ("\t--f=on \t\tFollow SymLinks\n"); print ("\t--erase=on \t\tBorra regrabables\n"); print ("\t--cdxtras=-dummy\t\tCDRECORD EXTRAS\n"); print ("\t--mkxtras=-f\t\tMKISOFS EXTRAS\n"); print ("\t--V=\t\t VOLUME_NAME\n"); print ("\t--debug=on\t\tDEBUG, IMPRIME LA SALIDA\n"); print ("\t--ignoresize=on\t\tIGNORA EL CHEQUEO DE DATOS\n"); print ("\n\nej: add2cd /home/gus/bin\n"); print ("agrega al cd el contenido de un directorio (/bin)\n\n"); print ("ej: add2cd /home/gus/bin /compartir/publicar.html\n"); print ("agrega al cd el contenido de un directorio (/bin) y un archivo (publicar.html)\n\n"); print ("ej: add2cd bin/=/home/gus/bin\n"); print ("agrega bajo una carpeta (bin) el contenido del directorio /bin\n\n"); print ("ej: add2cd /home/gus/bin --cdxtras=-dummy\n"); print ("El agregado (--cdxtras=-dummy) es para simular la escritura\n\n"); print ("ej: add2cd bin/=/home/gus/bin /compartir/publicar.html --f=on\n"); print ("sigue los enlaces simbolicos dentro de (/home/gus/bin) y el archivo\n\n"); print ("ej: add2cd --erase=on\n"); print ("Borra el CDRW (sólo TOC)\n\n"); print ("Ej: add2cd --burniso=ulinux_full.iso\t\tGRABA LA ISO EN EL CD\n"); exit(0); } sub usage_en { print ("Usage: add2cd [--option=value] files dirs\n"); print ("\t--speed=4\t\t\tSpeed\n"); print ("\t--dev=0,0,0\t\tSCSI or IDE DEVICE\n"); print ("\t--fs=30m \t\tBUFFER SIZE\n"); print ("\t--f=on \t\tFollow SymLinks\n"); print ("\t--erase=on \t\tDELETE CDRW\n"); print ("\t--cdxtras=-dummy\t\tCDRECORD EXTRAS\n"); print ("\t--mkxtras=-f\t\tMKISOFS EXTRAS\n"); print ("\t--debug=on\t\tDEBUG, PRINT CMDLINE BEFORE EXECUTING\n"); print ("\t--ignoresize=on\t\tIGNORES DATA CHECKING\n"); print ("\n\nej: add2cd /home/gus/bin\n"); print ("Add onto CD the content of a folder (/bin)\n\n"); print ("ej: add2cd /home/gus/bin /compartir/publicar.html\n"); print ("Add onto the CD the content of (/bin) and a file (publicar.html)\n\n"); print ("ej: add2cd bin/=/home/gus/bin\n"); print ("Add onto the CD over a folder (bin) the content of the folder /bin\n\n"); print ("ej: add2cd /home/gus/bin --cdxtras=-dummy\n"); print ("The option (--cdxtras=-dummy) is to simulate the writing\n\n"); print ("ej: add2cd bin/=/home/gus/bin /compartir/publicar.html --f=on\n"); print ("Follows the symlinks inside (/home/gus/bin) and the file\n\n"); print ("ej: add2cd --erase=on\n"); print ("ERASES CDRW (TOC ONLY)\n\n"); exit(0); } #SUBRUTINA DE VELOCIDAD y TAMAÑO sub getSpeed { my ($cdrspeed)=@_; my $speedflag,$info,$man,$type,@cdrlines,$cdrmin; my $cmdline=`cdrecord dev=$CDR_DEVICE -atip 2>/dev/null`; @cdrlines=split /\n/,$cmdline; foreach(@cdrlines){$l=$_; if($l=~/.*(ATIP info from disk\:).*/i){$info="on";} if($l=~/.*Disk sub type\:(.*)/i){$type=$1;} if($l=~/.*Disk type\: (.*)/i){$type="$1 $type";} if($l=~/.*Manufacturer\:(.*)/i){$man=$1;} if($l=~/.*speed high\: (.*)/i){$speedflag=$1;} if($l=~/.*lead out\:.*\((.*)\:.*/i){$cdrmin=$1;} }#end foreach if ($info ne "on"){print "Insert a Valid disc / Inserte un disco válido\n"; exit(1);} if ($cdrmin eq "74"){$CDR_SIZE="650";} if ($cdrmin eq "75"){$CDR_SIZE="650";} if ($cdrmin eq "79"){$CDR_SIZE="700";} if ($cdrmin eq "80"){$CDR_SIZE="700";} print "Type :$type\n"; print "Made by :$man\n"; print "CdSpeed : $speedflag\n"; print "CdMin : $cdrmin\n"; print "Size : $CDR_SIZE\n"; #SOME RECORDERS DAMAGE CDS FLAGGED 8X BURNING THEM AT 12X if($speedflag eq "8"){ if ($cdrspeed > 10){$cdrspeed=10; print "Speed : 10 (fixed)\n";} else {print "Speed : $cdrspeed\n";} return $cdrspeed;} else{ print "Speed : $cdrspeed\n"; return $cdrspeed;} } #SUBRUTINA DE DETECCION DE TAMAÑO A GRABAR sub checkSize(){ if($IGNORESIZE eq "on"){ print "ESize : UNKNOWN MB\n"; return $CDR_SIZE;} my $size=""; my ($mkiso)=@_; my $cmdline=`$mkiso`; @cdrlines=split /\n/,$cmdline; foreach(@cdrlines){$l=$_; if($l=~/.*extents written \((.*) .*/i){$size=$1;} }#end foreach print "ESize : $size MB\n"; if ($size eq ""){ print "\n\nMkisofs no devolvió tamaño, revise que los archivos existan.\nY que no haya algún problema que implique borrar el disco\nGENERANDO SALIDA DE ERRORES, ESPERE 5 SEGUNDOS...\n\n"; print "\n\nMkisofs does not give size, check the files for existence\nAnd any other weird problem that implies to erase the disk\nGENERATING ERRORS, 5 SECONDS OF SLEEP...\n\n"; system("sleep 5"); foreach(@cdrlines){print "$_\n";}#end foreach exit(1); } if ($size > $CDR_SIZE) { print "Error: Data will not fit / No van a entrar los datos\n"; exit(1); } return $size; } #SUBRUTINA DE DETECCION DE TOC sub getToc(){ my $toc="off"; my $cmdline=`cdrecord dev=$CDR_DEVICE -toc 2>/dev/null`; @cdrlines=split /\n/,$cmdline; foreach(@cdrlines){$l=$_; if($l=~/.*(track\:).*/i){$toc="on";} }#end foreach return $toc; }