#!/bin/sh # # Programme pour graver un CD sans créer d'image iso9660, à la volée... # (c) Thomas Nemeth 1999 # email : tnemeth@free.fr # # Paramètres : # -h Aide sur l'usage. # -version version. # -debug debuggage. # -eject Éjection du cd après gravage # -V Nom de volume. # - Type : Chaine quotée. # - Valeurs : Toute chaine entre guillemets. # - Ex. : -V "Archives #n" # -p Chemin vers les sources. # - Type : Chemin de répertoires. # - Valeurs : Tout chemin accessible, sur un support monté et dont le # taux de transfert est suffisament élevé pour permettre le # gravage. # - Ex. : -p /archives/données/ # -m Type de session (pour le multi-session). # - Type : Chaîne spécifique. # - Valeurs : 0 (pas de multi-session), # 1 (créé une 1ère piste multi) # 2 (créé une n-ième piste multi) # 3 (créé une dernière piste multi) # - Ex. : -m 0 # -d Device-Num pour le multi-session # - Type : Fichier device /dev/srX # - Valeurs : X avec X dépend du système # - Ex. : -d 1 # -i Numéro de l'ID SCSI du graveur. # - Type : Valeur numérique. # - Valeurs : 0..15 # - Ex. : -i 6 # -b Numéro du bus SCSI à utiliser # - Type : Valeur numérique. # - Valeurs : 0..oo # - Ex. : -b 1 # -A APPLICATION ID # - Type : Chaine de caractère # - Valeurs : Toute chaine entre guillemets. # - Ex. : -A "DirectBurn v1.1" # -P PUBLISHER ID # - Type : Chaine de caractère # - Valeurs : Toute chaine entre guillemets. # - Ex. : -P "Thomas Nemeth's Scripting Head ;-)" # -R PREPARER ID # - Type : Chaine de caractère # - Valeurs : Toute chaine entre guillemets. # - Ex. : -R "Thomas Nemeth" # -J faire un CD au format Joliet. # -x Chemin à exclure du gravage. # - Type : Chemin de répertoires. # - Valeurs : Tout chemin accessible, sur un support monté. # - Ex. : -x /archives/données/dontburn/ # -g Types de fichiers à exclure du gravage. # - Type : Expression de fichiers à exclure. # - Valeurs : Toutes expression de type "wildcard" pour fichier. # - Ex. : -m *.o # -B Chemin vers une image de boot pour CD bootable. # - Type : Chemin de répertoires avec fichier. # - Valeurs : Tout fichier accessible, sur un support monté. # - Ex. : -B /archives/bootimage.raw # -c Boot catalog. # - Type : Fichier (qui sera créé par mkisofs). # - Valeurs : Chaine de caractère. # - Ex. : -c boot.catalog # -t Fichier image # - Type : Fichier image (qui sera créé par mkisofs). # - Valeurs : Chaine de caractère. # - Ex. : -t /archives/image.iso # -s Vitesse de gravage # - Type : Valeur numérique # - Valeurs : 0..4 # - Ex. : -s 4 # test : Test du gravage. # ou # write : Gravage effectif du CD. # # TODO : # - Faire un scan automatique des bus SCSI pour trouver l'ID du graveur # - Faire des tests plus poussés sur les paramètres # - Faire quelque chose pour le fichier temporaire # - Ajouter le support d'autres options de cdrecord / mkisofs # # <--- CONSTANTES ---> # Générales TRUE=true FALSE=false MAXCOUNT=21 VERSION="1.1.2" QUOTE="'" # Erreurs NOERR=0 USAGE=1 SHOWVERSION=2 BADARGVOL=3 BADARGREP=4 BADARGDEV=5 BADARGMS=6 BADARGTW=7 BADARGID=8 BADARGBUS=9 BADARGNB=10 BADARGAPPID=11 BADARGPREID=12 BADARGPUBID=13 BADARGEXCPATH=14 BADARGEREGEXP=15 BADARGBOOTIMG=16 BADARGBOOTCAT=17 BADARGIMGFILE=18 BADARGSPEED=19 BADSUPPORT=20 # <--- VARIABLES LOCALES ---> # Pour le débuggage #SAVEERRFILE=$HOME/.erreur_gravage SAVEERRFILE=$HOME/tmp/erreur_gravage DEBUG=$FALSE # Générales #TMPFILE=$HOME/.BurnTmpInfos TMPFILE=/tmp/$USER/BurnTmpInfos ENDSOUNDFILE=/usr/local/share/sounds/WarSounds/Owrkdone.wav PLAYSOUND=$TRUE # Pour les tests d'erreur ERROR=$NOERR TESTWRITE=$FALSE ARGCOUNT=0 # Logiciels MKFS=mkisofs WRITER=cdrecord WAVPLAYER=play # Options de gravage WRITEPOS="" SCANOPT="-scanbus" MSOPT="-msinfo" # Valeurs par défaut IMGFILE=/archives/image.iso JOLIET=$FALSE MKFSOPTS="-l -L -r" WRITEOPTS="-v" VOLNAME="" SPEED=4 REP=/archives/données/ MSTYPE=0 PREPARERID="" PUBLISHERID="" APPLICATIONID="" EXCLUDEPATH="" EXCLUDEREGEXP="" BOOTIMGPATH="" BOOTCATALOG="boot.catalog" # + Matériel SCSIBUS=0 SCSI_ID=6 DEVICE=1 DONTDETECT=$FALSE # <--- CODE ---> # Vérification des entrées... Elle n'est pas exhaustive :-/ ARGSHIFT=0 while [ "$1" != "" -a $ARGCOUNT != $MAXCOUNT ]; do ARGCOUNT=`expr $ARGCOUNT + 1` case "$1" in # Nom de volume "-V") if [ "$2" != "" ]; then VOLNAME="$2" ARGSHIFT=2 else ERROR=$BADARGVOL fi;; # Chemin "-p") if [ "$2" != "" ]; then ### Inclure le test de la validité du chemin REP=$2 ARGSHIFT=2 else ERROR=$BADARGREP fi;; # Multi-session "-m") if [ "$2" = "0" -o "$2" = "1" -o "$2" = "2" -o "$2" = "3" ]; then MSTYPE=$2 ARGSHIFT=2 else ERROR=$BADARGMS fi;; # Device "-d") if [ "$2" != "" ]; then ### Inclure le test de la validité du device DEVICE=$2 ARGSHIFT=2 else ERROR=$BADARGDEV fi;; # Test/Write "test") TESTWRITE=$TRUE WRITEOPTS="$WRITEOPTS -dummy" ARGSHIFT=1;; "write") TESTWRITE=$TRUE ARGSHIFT=1;; # Éjecter le CD "-eject") WRITEOPTS="$WRITEOPTS -eject" ARGSHIFT=1;; # Aide "-h"|"--help") ERROR=$USAGE ARGSHIFT=1;; # Version "-version") ERROR=$SHOWVERSION ARGSHIFT=1;; # Joliet "-J") JOLIET=$TRUE ARGSHIFT=1;; # Débuggage "-debug") DEBUG=$TRUE ARGSHIFT=1;; # ID SCSI "-i") if [ "$2" != "" ]; then ### Inclure le test de la validité de l'ID SCSI_ID=$2 ARGSHIFT=2 else ERROR=$BADARGID fi;; # BUS SCSI "-b") if [ "$2" != "" ]; then ### Inclure le test de la validité du bus SCSIBUS=$2 DONTDETECT=$TRUE ARGSHIFT=2 else ERROR=$BADARGBUS fi;; # APPLICATION ID "-A") if [ "$2" != "" ]; then ### Inclure le test de la validité de l'ID APPLICATIONID=$2 ARGSHIFT=2 else ERROR=$BADARGAPPID fi;; # PUBLISHER ID "-P") if [ "$2" != "" ]; then ### Inclure le test de la validité de l'ID PUBLISHERID=$2 ARGSHIFT=2 else ERROR=$BADARGPUBID fi;; # PREPARER ID "-R") if [ "$2" != "" ]; then ### Inclure le test de la validité de l'ID PREPARERID=$2 ARGSHIFT=2 else ERROR=$BADARGPREID fi;; # Chemin à exclure du gravage "-x") if [ "$2" != "" ]; then ### Inclure le test de la validité du chemin EXCLUDEPATH=$2 ARGSHIFT=2 else ERROR=$BADARGEXCPATH fi;; # Chemin à exclure du gravage "-g") if [ "$2" != "" ]; then ### Inclure le test de la validité du chemin EXCLUDEREGEXP=$2 ARGSHIFT=2 else ERROR=$BADARGEREGEXP fi;; # Image de boot pour CD bootable El Torito "-B") if [ "$2" != "" ]; then ### Inclure le test de la validité du chemin BOOTIMGPATH=$2 ARGSHIFT=2 else ERROR=$BADARGBOOTIMG fi;; # Catalogue de boot "-c") if [ "$2" != "" ]; then ### Inclure le test de la validité du chemin BOOTCATALOG=$2 ARGSHIFT=2 else ERROR=$BADARGBOOTCAT fi;; # Fichier image "-t") if [ "$2" != "" ]; then ### Inclure le test de la validité du chemin IMGFILE=$2 ARGSHIFT=2 else ERROR=$BADARGIMGFILE fi;; # Vitesse de gravage "-s") if [ "$2" = "0" -o "$2" = "1" -o "$2" = "2" -o "$2" = "3" -o "$2" = "4" ]; then SPEED=$2 ARGSHIFT=2 else ERROR=$BADARGSPEED fi;; esac if [ $DEBUG = $TRUE -a $ARGSHIFT = 2 ]; then echo -n "$ARGCOUNT : $1 $2" elif [ $DEBUG = $TRUE -a $ARGSHIFT = 1 ]; then echo -n "$ARGCOUNT : $1" fi if [ $DEBUG = $TRUE ]; then echo ", Args shifted : $ARGSHIFT." fi shift $ARGSHIFT done if [ $TESTWRITE = $FALSE -a $ERROR = $NOERR ]; then ERROR=$BADARGTW fi if [ $ARGCOUNT = $MAXCOUNT -a $ERROR = $NOERR ]; then ERROR=$BADARGNB fi # Création de la ligne de commande if [ $ERROR = $NOERR ]; then # Configuration du BUS SCSI if [ $DONTDETECT = $FALSE ]; then # S'il n'y a pas de bus SCSI #1 c'est que le scanner sur la 1ère # carte est éteind, sinon, comme le graveur est sur la 2nde carte # SCSI, mise à jour de la variable correspondante. $WRITER $SCANOPT > $TMPFILE lSCSIBUS=`grep -w scsibus1: $TMPFILE` if [ $DEBUG = $TRUE ]; then cp $TMPFILE $SAVEERRFILE echo "Pré-débuggage : " echo "\$lSCSIBUS = $lSCSIBUS" fi if [ "$lSCSIBUS" != "" ]; then SCSIBUS=1 fi rm $TMPFILE fi # Détermination des options pour $MKFS et $WRITER if [ "$APPLICATIONID" != "" ]; then MKFSOPTS="-p \"$APPLICATIONID\" $MKFSOPTS" fi if [ "$PUBLISHERID" != "" ]; then MKFSOPTS="-p \"$PUBLISHERID\" $MKFSOPTS" fi if [ "$PREPARERID" != "" ]; then MKFSOPTS="-p \"$PREPARERID\" $MKFSOPTS" fi if [ "$EXCLUDEPATH" != "" ]; then MKFSOPTS="-x $EXCLUDEPATH $MKFSOPTS" fi if [ "$EXCLUDEREGEXP" != "" ]; then MKFSOPTS="-m $EXCLUDEREGEXP $MKFSOPTS" fi if [ "$BOOTIMGPATH" != "" ]; then if [ "$BOOTCATALOG" != "" ]; then MKFSOPTS="-c $BOOTCATALOG $MKFSOPTS" else MKFSOPTS="-c boot.catalog $MKFSOPTS" fi MKFSOPTS="-b $BOOTIMGPATH $MKFSOPTS" fi if [ "$VOLNAME" != "" ]; then MKFSOPTS="-V \"$QUOTE$VOLNAME$QUOTE\" $MKFSOPTS" fi WRITEOPTS="$WRITEOPTS -speed=$SPEED" # Multi-session diffs if [ $MSTYPE = 0 ]; then MKFSOPTS="$MKFSOPTS $REP" WRITEOPTS="$WRITEOPTS -dev=$SCSIBUS,$SCSI_ID,0" elif [ $MSTYPE = 1 ]; then MKFSOPTS="$MKFSOPTS $REP" WRITEOPTS="-multi $WRITEOPTS -dev=$SCSIBUS,$SCSI_ID,0" elif [ $MSTYPE = 2 ]; then $WRITER $MSOPT -dev=$SCSIBUS,$SCSI_ID,0 > $TMPFILE 2>&1 echo "$WRITER $MSOPT -dev=$SCSIBUS,$SCSI_ID,0" lERROR=`grep error $TMPFILE` if [ $DEBUG = $TRUE ]; then cat $TMPFILE >> $SAVEERRFILE echo "\$lERROR = « $lERROR »" fi if [ "$lERROR" != "" ]; then ERROR=$BADSUPPORT else WRITEPOS=`$WRITER $MSOPT -dev=$SCSIBUS,$SCSI_ID,0` MKFSOPTS="$MKFSOPTS -C $WRITEPOS -M /dev/sr$DEVICE -o $IMGFILE $REP" WRITEOPTS="-waiti -multi $WRITEOPTS -dev=$SCSIBUS,$SCSI_ID,0" fi rm $TMPFILE elif [ $MSTYPE = 3 ]; then $WRITER $MSOPT -dev=$SCSIBUS,$SCSI_ID,0 > $TMPFILE 2>&1 echo "$WRITER $MSOPT -dev=$SCSIBUS,$SCSI_ID,0" lERROR=`grep error $TMPFILE` if [ $DEBUG = $TRUE ]; then cat $TMPFILE >> $SAVEERRFILE echo "\$lERROR = « $lERROR »" fi if [ "$lERROR" != "" ]; then ERROR=$BADSUPPORT else WRITEPOS=`$WRITER $MSOPT -dev=$SCSIBUS,$SCSI_ID,0` MKFSOPTS="$MKFSOPTS -C $WRITEPOS -M /dev/sr$DEVICE -o $IMGFILE $REP" WRITEOPTS="-waiti $WRITEOPTS -dev=$SCSIBUS,$SCSI_ID,0" fi rm $TMPFILE fi fi if [ $DEBUG = $TRUE ]; then echo "Débuggage... ------>" echo # if [ $ERROR != $USAGE ]; then # echo "ATTENTION ! Le fichier $SAVEERRFILE a été créé." # echo "C'est à vous de penser à l'effacer !" # echo # fi echo "AFFICHAGE DU CONTENU DES VARIABLES :" echo # Générales echo "GÉNÉRALES :" echo " \$USER = $USER" echo " \$TMPFILE = $TMPFILE" echo " \$SAVEERRFILE = $SAVEERRFILE" echo " \$ENDSOUNDFILE = $ENDSOUNDFILE" echo # Pour les tests d'erreur echo "POUR LES TESTS D'ERREUR :" echo " \$ERROR = $ERROR" echo " \$TESTWRITE = $TESTWRITE" echo " \$ARGCOUNT = $ARGCOUNT" echo # Logiciels echo "LOGICIELS :" echo " \$MKFS = $MKFS" echo " \$WRITER = $WRITER" echo " \$WAVPLAYER = $WAVPLAYER" echo # Options de gravage echo "OPTIONS DE GRAVAGE :" echo " \$WRITEPOS = $WRITEPOS" echo " \$SCANOPT = $SCANOPT" echo " \$MSOPT = $MSOPT" echo # Valeurs par défaut echo "VALEURS PAR DÉFAUT OU MODIFIÉES :" echo " \$IMGFILE = $IMGFILE" echo " \$JOLIET = $JOLIET" echo " \$MKFSOPTS = $MKFSOPTS" echo " \$WRITEOPTS = $WRITEOPTS" echo " \$VOLNAME = \"$VOLNAME\"" echo " \$REP = $REP" echo " \$MSTYPE = $MSTYPE" echo " \$PREPARERID = \"$PREPARERID\"" echo " \$PUBLISHERID = \"$PUBLISHERID\"" echo " \$APPLICATIONID = \"$APPLICATIONID\"" echo " \$EXCLUDEPATH = $EXCLUDEPATH" echo " \$EXCLUDEREGEXP = $EXCLUDEREGEXP" echo " \$BOOTIMGPATH = $BOOTIMGPATH" echo " \$BOOTCATALOG = $BOOTCATALOG" echo # Matériel echo "MATÉRIEL :" echo " \$SCSIBUS = $SCSIBUS" echo " \$SCSI_ID = $SCSI_ID" echo " \$DEVICE = $DEVICE" echo " \$DONTDETECT = $DONTDETECT" echo #Fichiers temporaires echo "FICHIER DE DÉTECTION TEMPORAIRE :" echo "$SAVEERRFILE =" cat $SAVEERRFILE rm $SAVEERRFILE fi # Traitement des erreurs echo if [ $ERROR = $BADARGVOL ]; then echo "Mauvais nom de volume, ou nom de volume absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGREP ]; then echo "Mauvais nom de répertoire, ou nom de répertoire absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGDEV ]; then echo "Mauvais nom de device, ou nom de device absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGMS ]; then echo "Mauvais argument de multi-session, ou argument de multi-session\ absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGTW ]; then echo "Paramètre \"test\" ou \"write\" absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGID ]; then echo "Mauvais ID SCSI, ou ID SCSI absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGBUS ]; then echo "Mauvais bus SCSI, ou bus SCSI absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGNB ]; then echo "Mauvais nombre d'arguments (paramètres) !" echo ERROR=$USAGE elif [ $ERROR = $BADARGAPPID ]; then echo "Mauvais nom d'application, ou nom d'application absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGPREID ]; then echo "Mauvais nom de préparateur, ou nom de préparateur absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGPUBID ]; then echo "Mauvais nom de publicateur, ou nom de publicateur absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGEXCPATH ]; then echo "Mauvais répertoire à exclure, ou répertoire à exclure absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGEREGEXP ]; then echo "Mauvaise expression, ou expression absente !" echo ERROR=$USAGE elif [ $ERROR = $BADARGBOOTIMG ]; then echo "Mauvaise image de boot, ou image de boot absente !" echo ERROR=$USAGE elif [ $ERROR = $BADARGBOOTCAT ]; then echo "Mauvais catalogue de boot, ou catalogue de boot absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGIMGFILE ]; then echo "Mauvais fichier image, ou fichier image absent !" echo ERROR=$USAGE elif [ $ERROR = $BADARGSPEED ]; then echo "Mauvaise vitesse de gravage, ou vitesse de gravage absente !" echo ERROR=$USAGE elif [ $ERROR = $BADSUPPORT ]; then echo "Mauvais type de support pour ajouter des pistes en multi-session !" echo "Soit il n'y a pas de 1ère piste multi-session déjà faite, soit le" echo "disque est finalisé." echo fi # Gravage ? Ou USAGE ? ou VERSION ? if [ $ERROR = $NOERR ]; then echo "Nom de volume : \"$VOLNAME\"" if [ $DEBUG = $FALSE ]; then #if [ $MSTYPE = 2 -o $MSTYPE = 3 ]; then # $MKFS $MKFSOPTS | # $WRITER $WRITEOPTS $IMGFILE # rm $IMGFILE #else $MKFS $MKFSOPTS | $WRITER $WRITEOPTS - #fi else #if [ $MSTYPE = 2 -o $MSTYPE = 3 ]; then # echo "$MKFS $MKFSOPTS" # echo "$WRITER $WRITEOPTS $IMGFILE" # echo "rm $IMGFILE" #else echo "$MKFS $MKFSOPTS | $WRITER $WRITEOPTS -" #fi fi if [ $PLAYSOUND = $TRUE ]; then $WAVPLAYER $ENDSOUNDFILE fi elif [ $ERROR = $USAGE ]; then echo "directburn v$VERSION, (c) Thomas Nemeth 1999" echo "email : tnemeth@free.fr" echo echo "Usage : directburn [-debug] [-h|--help] [-version] [-eject]\ [-V volname] [-p source-tree] [-m 0|1|2|3] [-s device-num] [-i #] [-b #]\ [-A aplpication_id] [-P publisher_id] [-R preparer_id] [-J] [-x directory]\ [-g expression] [-B boot_image] [-c filename] [-t filename] [-s #] test|write" echo echo "Gravage de CDs de données à la volée (sauf pour l'ajout de piste multi\ -session)." echo echo " -debug : Afficher les infos de débuggage." echo " Doit être le premier argument pour une\ meilleure efficacité." echo " -h|--help : Aide sur l'usage (cet écran)." echo " -version : Version." echo " -eject : Éjecter le CD après gravage." echo " -V volname : Nom de volume pour le futur CD gravé." echo " Mettre des \" \" s'il y a des espaces." echo " -p source-tree : Chemin des fichiers sources du master." echo " Par défaut = /archives/données/." echo " -m 0|1|2|3 : Type de multi-session." echo " - 0 : Pas de multi-session." echo " - 1 : Commencer un disque multi-session." echo " - 2 : Ajouter une piste à un CD multi-session." echo " - 3 : Ajouter une dernière piste à un CD multi\ -session." echo " Par défaut = 0." echo " -d device-num : Fichier device du graveur pour le multi-session\ 2/3." echo " Par défaut vaut 1 (/dev/sr1)" echo " -i # : Numéro de l'ID SCSI du graveur." echo " Par défaut = 6." echo " -b # : Numéro du bus SCSI sur lequel est branché\ graveur." echo " Par défaut = 0." echo " -A application_id : Titre de l'application." echo " -P publisher_id : Nom du publicateur." echo " -R preparer_id : Nom du préparateur." echo " -J : Faire un CD au format Joliet." echo " -x directory : Chemin à exclure du gravage." echo " -g expression : Expression des fichiers à exclure du gravage." echo " -B boot_image : Fichier image de boot." echo " -c filename : Nom du fichier catalogue de boot qui sera créé." echo " Par défaut = boot.catalog" echo " -t filename : Nom du fichier image qui sera créé si le\ gravage ne se fait pas à la volée." echo " Par défaut = /archives/image.iso" echo " -s # : Vitesse de gravage comprise entre 0 et 4." echo " Par défaut = 4" echo " test : Effectue un test de gravage." echo " write : Grave le CD." echo elif [ $ERROR = $SHOWVERSION ]; then echo "directburn v$VERSION, (c) Thomas Nemeth 1999" echo "email : tnemeth@free.fr" echo fi