#! /bin/sh # # Autor : Carsten Grohmann # # Stand : 23. Dezember 2004 # VERSION="0.7g" # # Lizenz : GPL # # Erstellt eine Daten CD mit dem Inhalt eines Verzeichnisses. # # $Id: writeCD,v 1.41 2004/12/23 12:27:00 carsten Exp $ # # Veränderungen: # - zu Version 0.2 Autor: Carsten Grohmann # - Anzeigen und Überprüfen des Syntax eingefügt # - Auslagerung diverser Einstellungen in Variablen # - zu Version 0.2a Autor: Carsten Grohmann # - Parameter der aufgerufenen Programme im Kommentar erläutert # - zu Version 0.3 Autor: Carsten Grohmann # - Syntaxauswertung hinzugefügt # - Joliet-Erweiterung wird unterstützt # - Geschwindigkeit wählbar # - zu Version 0.3b Autor: Carsten Grohmann # - Syntaxauswertung verbessert # - zu Version 0.3c Autor: Carsten Grohmann # - trap und function ende eingefügt # - Auswertung der Rückgabewerte eingefügt # - zu Version 0.3d 03.09.2001 Autor: Carsten Grohmann # - Rock Ridge Protokoll ab jetzt abschaltbar # - zu Version 0.4 27.09.2001 Autor: Carsten Grohmann # - Multi-Session möglich # - zu Version 0.5 13.12.2001 Autor: Carsten Grohmann # - CDRWs erkennen und auf Wunsch vorher löschen # - Löschverfahren ist frei (entsprechend cdrecord) wählbar # - zu Version 0.5b 14.01.2002 Autor: Carsten Grohmann # - Eigenschaften des Brenners werden überprüft: # - Schreiben von CDRWs # - Unterstützung von BURN-Proof # - simulierten Schreiben # - Multi-Session-CDs # - --disable-burnproof hinzugefügt # - zu Version 0.5c 15.01.2002 Autor: Carsten Grohmann # - um --use-sudo erweitert # - kleinere Umstrukturierung # - zu Version 0.5d 25.01.2002 Autor: Carsten Grohmann # - Fehler beseitigt # - Kleine Änderungen im Syntax # - zu Version 0.5e 01.02.2002 Autor: Carsten Grohmann # - dao bzw nodao hinzugefügt (EXPERIMENTELL) # - case * hinzugefügt, um alle nicht erkannten Argumente auszugeben # - zu Version 0.5f 04.02.2002 Autor: Carsten Grohmann # - Erkennung für DAO bzw. TAO hinzugefügt # - burnproof durch burnfree ersetzt # - zu Version 0.5g 07.02.2002 Autor: Carsten Grohmann # - Prüfung auf das Vorhandensein von cdrecord, mkisofs und sudo geprüft # - Ausführbare Programme müssen einfache Dateien sein und für den # Benutzer ausführbar sein # - $TEMPDATEI wird überprüft, ob es eine reguläre Datei ist # - zu Version 0.5h 27.02.2002 Autor: Carsten Grohmann # - Bug gefixt -isosize ist bei Multi-Session CDs nicht möglich # - Zusammenspiel der Optionen überarbeitet # - zu Version 0.5i 12.03.2002 # - diverse Debugmeldungen eingefügt # - Erkennung der Buffer-Underrun-Technologie der aktuellen Version von # cdrecord angepaßt # - zu Version 0.5j 02.05.2002 # - copy-cd testweise ohne Eintrag in den Syntax hinzugefügt # - zu Version 0.5k 17.05.2002 # - --copycd befindet sich schon im Syntax # - --cleancdrw eingefügt # - zu Version 0.5l 22.05.2002 # - $VERZEICHNIS nach $DIRECTORIES umgewandelt # - Optionen --tao und --notao hinzugefügt, haben aber keinen Einfluß auf # cdrecord # - zu Version 0.5m 23.05.2002 # - Fehler behoben # - zu Version 0.5n 28.05.2002, 30.05.2002, 04.06.2002 # - Syntax an mehrere Verzeichnisse angepassen # - CD-Name wählbar gestaltet # - folgende Funktionen umbenannt, damit diese besser von Systemfunktionen # unterschieden werden können: # info -> do_info debug -> do_debug # syntax_zeigen -> do_usage ende -> do_exit # doku_zeigen -> do_showdoc sub_clean_cdrw -> do_cleancdrw # test_file -> do_searchprog # - TEMPDATEI in TEMPFILE umbenannt # - ERGEBNIS in RESULT umbenannt # - Funktionsbeschreibung weiter kommentiert # - Variable CD_TYPE eingefügt # - --version hinzugefügt # - zu Version 0.5o 11.06.2002 # - Fehler bei der Erkennung des korrekten CD-Typs beseitigt # - Hinweise zur Garantie und Haftung bei do_showhints hinzugefügt # - zu Version 0.5p 19.01.2003 # - Fehler beim Erkenner unbekannter Optionen behoben # # $Log: writeCD,v $ # Revision 1.41 2004/12/23 12:27:00 carsten # - falsch geschriebene Variable USE_DAO berichtigt # - version 0.7g # # Revision 1.40 2004/12/13 18:42:23 carsten # - Eigenschaften von Brenner und CD werden nun zwischengespeichert # # Revision 1.39 2004/11/14 18:31:49 carsten # - Zwischenspeicher der Laufwerksinformationen wird nun beim Suchen nach Laufwerken # gelöscht # # Revision 1.38 2004/11/10 21:20:57 carsten # - neue Version 0.7e # - löschen der Zwischenergebnisse beim automatischen Suchen # eines Brenners hinzugefügt # # Revision 1.37 2004/11/01 20:27:43 carsten # - neue Version 0.7d # - Erkennung des Brenners (check_device) beschleunigt # # Revision 1.36 2004/10/11 18:35:20 carsten # - neue Version 0.7c # - Verbesserungen der Performance durch Zwischenspeicherung der Abfrageergebnisse # der CD bzw. des Brenners # # Revision 1.35 2004/10/05 20:14:54 carsten # - neue Version 0.7b # - fehlerhafte Variablennamen in cd_isclosed und cd_isfirstsession korrigiert # # Revision 1.34 2004/10/03 17:31:17 carsten # - neue Version 0.7a # - struktureller Fehler in zwei verschachtelten if anweisungen behoben # # Revision 1.33 2004/10/01 20:31:35 carsten # # - Rockridge-Optionen für mkisofs geändert - Eigentum und Berechtigung # der Dateien werden root:root und rxrxrx gesetzt (-rational-rock) # # Revision 1.32 2004/09/28 19:06:24 carsten # - neue Version 0.7 # - ungenutzte Unterstützung für Logdateien entfernt # - automatische Erkennung des Brenners hinzugefügt # - Dokumentation erweitert # - Option --norun entfernt, statt dessen--dummy benutzen # - Option zum Schreiben eines ISO-Abbildes hinzugefügt # - Erkennung von Eigenschaften des Brenners oder der CD in Funktionen # ausgelagert # - Anzahl der Debugmeldungen reduziert # # Revision 1.31 2004/01/29 18:52:56 carsten # - neue Version 0.6b # - temporäre Datei wird mit mktemp erzeugt # - kleine Änderungen # # Revision 1.30 2003/01/20 20:29:58 carsten # # neue Version 0.6 # kleine Schönheitskorrekturen # # Revision 1.29 2003/01/20 20:26:37 carsten # # folgende Schalter hinzugefügt: # --leadingdot, --appid, --volid, --preparer, --publisher # # # Rückgabewerte: # - 1 Fehlerhafter Syntax # - 2 cdrecord nicht gefunden # - 3 cdrecord darf nicht ausgeführt werden # - 4 mkisofs nicht gefunden # - 5 mkisofs darf nicht ausgeführt werden # - 6 sudo nicht gefunden # - 7 sudo darf nicht ausgeführt werden # - 8 Fehler beim Anlegen der temporären Datei # - 11 Keine oder beschädigte CD im Laufwerk # - 12 CD wahrscheinlich schon abgeschlossen # - 13 Brenner kann keine CDRWs schreiben # - 14 Brenner unterstützt kein simuliertes Schreiben # - 15 Benutzer möchte mit --use-sudo eine weitere Session hinzufügen # => abgelehnt, da Rechte dazu fehlen # - 16 Brenner unterstützt kein DAO-Mode # - 17 Brenner unterstützt kein TAO-Mode # - 21 Fehler beim Erstellen des Abbildes # - 22 Fehler beim Löschen der CDRW # - 23 Fehler beim Schreiben der CD # - 24 Kein Brenner gefunden # - 25 Angebenener Brenner wurde nicht gefunden # - 100 Fehler bei der Kombination von Optionen # # Verbesserungen: # - CD Status erweitern # - SUPPORT_MULTISESSION weiter integrieren -> Parameter am Ende zusammenstellen # - genauere Optionen des Laufwerks erfragen # - maximale Schreibgeschwindigkeit aus -prcap entnehmen # - COPY_SOURCE_DEVICE über Parameter auswählbar gestalten # - --dao und --tao an die neuen cdrecord Schalter anpassen # - CD schreiben in eine Funktion auslagern # - CD Infos beim einfachen löschen von cdrws nicht ausgeben # - mehrere identische CDs ermoeglichen #set -x #set -n #set -v # Variablen setzen TIME=`date +%d.%m.%Y` TEMPFILE="NOT_SET" DEBUG="no" # Debug-Modus abschalten SILENT="yes" # Meldungen ausgeben # Vom Brenner unterstützte Optionen SUPPORT_MULTISESSION="" # (yes|no) entsprechend Brennerunterstützung SUPPORT_BURNFREE="" # (yes|no) entsprechend Brennerunterstützung SUPPORT_DUMMY="" # (yes|no) entsprechend Brennerunterstützung SUPPROT_CDRW="" # (yes|no) entsprechend Brennerunterstützung # Allgemeine Konfiguration CDRECORD_BIN="/usr/bin/cdrecord" # Pfad zu cdrecord MKISOFS_BIN="/usr/bin/mkisofs" # Pfad zu mkisofs SUDO_BIN="/usr/bin/sudo" # Pfad zu sudo MAX_SPEED=48 # Maxiamal zulässige Geschwindigkeit ST_DEVICE="AUTO" # Standarddevice setzen ST_SPEED=16 # Standardgeschwindigkeit USE_SUDO="no" # Vorgabe für die Verwendung von sudo USE_DAO="yes" # Vorgabe zum Schreiben der CDs im Disk at Once Mode USE_TAO="no" # Vorgabe zum Schreiben der CDs im Track at Once Mode # Standardeinstellungen zur CD APPLICATION_ID="" # Applicationsname BLANKTYPE="all" # Löschenverfahren CD_TYPE="" # Type der eingelegten CD (CDR|CDRW) CLEAN_CDRW="no" # CDRWs nicht vorher löschen COPY_CD="no" # yes -> CD wird kopiert COPY_SOURCE_DEVICE="/dev/hdd" # Quellcd beim Kopieren COPY_USE_DAO="yes" # CDs im DAO-Mode kopieren DIRECTORIES="" # Soll alle Verzeichnisse enthalten ISO_IMAGE="" # Name des fertigen ISO-Image LAST_SESSION="no" # Letzte Session MKISOFS_VERBOSE="no" # Geschwätzigkeit von mkisofs erhöhen MULTISESSION_CD="yes" # Multi-Session CDs erzeugen PREPARER="" # Erzeuger der CD PUBLISHER="" # Herausgeber der CD SIMULATE_WRITING="no" # Brennen nur simulieren USE_BURNFREE="yes" # BURN-Proof o.ä. nutzen, wenn vorhanden USE_JOLIET="yes" # Joliet einschalten USE_LEADINGDOT="no" # Dateinamen mit Punkten am Anfang (verletzt ISO 9660) USE_ROCKRIDGE="yes" # Rock Ridge Protokoll benutzen VOLUMEN_ID="" # CD-Name MSINFO="" # MultiSession Informationen der CD # # Eigene Funktionen # function do_info () { # Zeigt zusätzliche Informationen zum Programmablauf an # zu übergebene Parameter - keine if [ ! "$SILENT" = "yes" ]; then echo $* fi } function do_debug () { # Zeigt zusätzliche Debuginformationen an # zu übergebene Parameter # - Parameter können in beliebiger Form und Anzahl übergeben werden if [ "$DEBUG" = "yes" ]; then echo Debug: $* fi } function do_exit () { # Beendet das Programm sauber # zu übergebene Parameter # 1. Parameter: Rückgabewert if [ "$TEMPFILE" != "NOT_SET" -a -e $TEMPFILE ]; then rm $TEMPFILE fi if [ ! $1 ]; then do_debug "Programmende ohne Rückgabewert" else do_debug "Programmende Rückgabewert $1" fi exit $1 } function do_searchprog() { # Sucht die ausführbaren Programme, falls der angegebene Pfad nicht stimmt # zu übergebene Parameter # 1. Parameter: Programmname # 2. Parameter: Fehlercode fürs nicht finden # 3. Parameter: Fehlercode fürs nicht ausführbar FILE=$1 if [ ! -f "$FILE" ]; then do_debug "$FILE existiert nicht. Suche Alternative..." BASENAME=`basename $FILE` FILE=`which $BASENAME` if [ -z "$FILE" ]; then do_debug "... keine Alternative gefunden" echo Fehler $FILE bzw. `basename $FILE`wurde nicht gefunden do_exit $2; fi do_debug "... Alternative $FILE gefunden" fi if [ ! -x "$FILE" ]; then echo "Fehler $FILE darf nicht ausgeführt werden. Bitte setzen" echo "Sie die passenden Attribute." do_exit $3 fi return 0 } function do_usage() { # Zeigt den Syntax des Programmes an # zu übergebene Parameter - keine echo "Syntax: writeCD [Verzeichnis(se)] [Optionen] " echo "Schreibt den Inhalt der angebenen Verzeichnisses inkl. Unterver- " echo "zeichnisse auf eine CD-R bzw. CD-RW. " echo "Die Reihenfolge von Optionen und Verzeichnis(sen) spielt keine Rolle." echo " --appid Name der Anwendung" echo " --blanktype Verfahren zum Löschen der CDRW (Standard: $BLANKTYPE)" echo " --cleancdrw Löscht die CDRW einzeln bzw. vor dem Schreiben" echo " --copycd Kopiert eine CD. $COPY_SOURCE_DEVICE ist das Quelllaufwerk" echo " --dao Schreibt die CD im Disk At Once Mode (DAO)" echo " --debug Gibt programminterne Informationen aus" echo " --device Gerät zum Brennen der CD (Standard: $ST_DEVICE)" echo " --disable-burnfree BURNFree bzw. alternative Buffer-Underrun-" echo " Technologien nicht nutzen" echo " --doc Zeigt eine kurze Dokumentation an" echo " --dummy Simuliert den Brennvorgang" echo " --image [Datei] Brennt ein fertiges ISO-Abbild auf CD" echo " --joliet Erzeugt zusätzlich Joliet-Verzeichniseinträge (Standard)" echo " --lastsession Schließt nach dem Schreiben der Daten die CD ab" echo " --leadingdot Erlaubt Dateinamen mit einen Punkt am Anfang **" echo " --multisession Erzeugt eine Multi-Session-CD (Standard)" echo " --nodao Schaltet den DAO-Mode aus" echo " --nojoliet Erzeugt keine Joliet-Verzeichniseinträge " echo " --nomultisession Erzeugt KEINE Multi-Session-CD" echo " --norockridge Verwendet das Rock Ridge Protokoll nicht" echo " --nosilent Gibt mehr Meldungen aus" echo " --notao Schaltet den TAO-Mode aus *" echo " --rockridge Verwendet das Rock Ridge Protokoll (Standard)" echo " --preparer Erzeuger der CD" echo " --publisher Herausgeber der CD" echo " --silent Verhindert die Ausgabe von Meldungen " echo " --speed Schreibgeschwindigkeit zwischen 1 und $MAX_SPEED " echo " --tao Schreibt die CD im Track At Once Mode (TAO) *" echo " --use-sudo sudo verwenden, um die Rechte zum Brennen zu erlangen" echo " --verbose Identisch mit --nosilent" echo " --version zeigt die Version des Skriptes an" echo " --volid Name der CD" echo " --help Zeigt diese Hilfe an" echo " * Diese Optionen haben noch keinen Einfluß auf das Programm" echo " ** Diese Optionen verletzen ISO 9660" do_exit 1 }; function do_showdoc() { # Zeigt die Dokumentation zum Programm an # zu übergebene Parameter - keine cat << EOF Dokumentation für writeCD Stand 29. August 2004 WARNUNG: Ich übernehme keine Garantie, ob writeCD funktioniert und wirklich das tut was von ihm erwartet wird. Ich übernehme auch keine Haftung für eventuelle Schäden, die durch writeCD entstehen können. Die Benutzung von writeCD erfolgt auf eigene Gefahr und Verantwortung. Lizenz ------ Dieses Skript steht unter GPL. Mehr Informationen zur GPL befinden sich unter http://www.fsf.org/licenses/licenses.html. Allgemeines ----------- Auf vielen neueren Systemen sollte das Brennen von CDs ohne root-Rechte möglich sein. Sollte dies nicht er Fall kann, kann der Administrator die berechtigten Benutzer für das Programm cdrecord in /etc/sudoers eintragen. Diese Benutzer können anschließend über die Option --use-sudo CDs brennen. Leider ist es damit nicht mehr möglich weitere Sessions an eine CD anzuhängen. Erkennung von CD-Brennern ------------------------- Dieses Skript kann im System vorhandene CD-Brenner automatisch erkennen. WriteCD verwendet den ersten gefundenen Brenner des Systems, wenn keine manuelle Auswahl über die Option "--device" erfolgte. Aktuelle Version ---------------- Die aktuelle Version dieses Skriptes befindet sich auf http://www.carstengrohmann.de Fehler und Verbesserungsvorschläge ---------------------------------- writeCD wurde nach besten Wissen und Gewissen programmiert. Falls dennoch ein Fehler auftritt, bitte ich um eine Mail, mit einer kurzen Fehlerbeschreibung an folgende Adresse mail_ad_carstengrohmann.de . EOF do_exit } function can_writeCDR() { # prüft, ob das Gerät CD-Rs schreiben kann # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 Gerät unterstützt Merkmal # 1 Gerät unterstützt Merkmal nicht [ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1) echo $_PRCAP | grep --silent "Does write CD-R media" } function can_writeCDRW() { # prüft, ob das Gerät CD-RWs schreiben kann # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 Gerät unterstützt Merkmal # 1 Gerät unterstützt Merkmal nicht [ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1) echo $_PRCAP | grep --silent "Does write CD-RW media" } function can_writeTEST() { # prüft, ob das Gerät den Brennvorgang simulieren kann # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 Gerät unterstützt Merkmal # 1 Gerät unterstützt Merkmal nicht [ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1) echo $_PRCAP | grep --silent "Does support test writing" } function can_writeMS() { # prüft, ob der Brenner multi-session CDs brennen kann # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 Gerät unterstützt Merkmal # 1 Gerät unterstützt Merkmal nicht [ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1) echo $_PRCAP | grep --silent "Does read multi-session CDs" } function can_useBUT() { # überprüft, ob der Brenner Technologien zur Vermeidung von Pufferunterläufen # unterstützt # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 Gerät unterstützt Merkmal # 1 Gerät unterstützt Merkmal nicht [ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1) echo $_PRCAP | grep --silent "Does support Buffer-Underrun-Free recording" } function can_writeTAO() { # prüft, ob der Brenner CDs im TAO (Track at once) Modus schreiben kann # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 Gerät unterstützt Merkmal # 1 Gerät unterstützt Merkmal nicht [ -z "$_ATIP" ] && _ATIP=$(cdrecord -dev=$1 -atip 2>&1) echo $_ATIP | grep --silent "Supported modes:.*TAO.*" } function can_writeDAO() { # prüft, ob der Brenner CDs im DAO (Disk at once) Modus schreiben kann # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 Gerät unterstützt Merkmal # 1 Gerät unterstützt Merkmal nicht [ -z "$_ATIP" ] && _ATIP=$(cdrecord -dev=$1 -atip 2>&1) echo $_ATIP | grep --silent "Supported modes:.*SAO.*" } function disktype() { # ermittelt den Typ der eingelegten CD # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # CDR eingelegte CD ist eine CD-R # CDRW eingelegte CD ist eine CD-RW [ -z "$_ATIP" ] && _ATIP=$(cdrecord -dev=$1 -atip 2>&1) echo $_ATIP | grep --silent "Is erasable" [ $? -eq 0 ] && echo "CDRW" || echo "CDR" } function is_disk() { # prüft, ob eine CD eingelegt ist # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 CD eingelegt # 1 CD nicht eingelegt [ -z "$_ATIP" ] && _ATIP=$(cdrecord -dev=$1 -atip 2>&1) echo $_ATIP | grep --silent --invert-match "No disk / Wrong disk!" } function cd_isclosed() { # prüft, ob eine CD abgeschlossen ist # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 CD ist abgeschlossen # 1 CD ist nicht abgeschlossen [ -z "$_MSINFO" ] && _MSINFO=$(cdrecord -dev=$1 -msinfo 2>&1) echo $_MSINFO | grep --silent "Cannot read first writeable address" } function cd_isfirstsession() { # prüft, ob schon die aktuelle session die erste session wird # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # 0 aktuelle session wird die erste session # 1 aktuelle session wird nicht die erste session [ -z "$_MSINFO" ] && _MSINFO=$(cdrecord -dev=$1 -msinfo 2>&1) echo $_MSINFO | grep --silent "Cannot read session offset" } function check_device() { # überprüft, ob das Device existiert und gültig ist # zu übergebene Parameter # 1. Parameter: DEVICE # Ausgaben: # not_found -> kein Brenner gefunden # found -> Brenner gefunden # DEVICE -> Brenner nicht gefunden, Vorschlag eines anderen Brenners # schnelle Überprüfung can_writeCDR $1 && { echo "found" return } # lösche _PRCAP Buffer unset _PRCAP _DEVICE=$1 # ermittle alle vorhandenen Geräte _DEVLIST=$(cdrecord -scanbus 2>/dev/null | awk '/Removable/ { print $1 }') # leere Liste -> not_found zurückgeben if [ -z "$_DEVLIST" ]; then echo "not_found" return fi # Liste überprüfen echo $_DEVLIST | grep --silent $_DEVICE if [ $? -eq 0 ]; then # Brenner gefunden echo "found" return fi # Brenner suchen for i in $_DEVLIST; do can_writeCDR $i && { echo $i return } # lösche _PRCAP Buffer unset _PRCAP done # kein Brenner gefunden echo "not_found" } function do_cleancdrw() { # Löscht eine CDRW # zu übergebene Parameter # 1. Parameter: DEVICE # 2. Parameter: Löschtyp # 3. Parameter: Geschwindigkeit if [ "$CD_TYPE" = "CDRW" ]; then CDRECORD_OPTIONEN="-v speed=$3 dev=$1 blank=$2" do_info do_info "CDRW löschen" do_info "------------" do_info "CDRW löschen: $CDRECORD_BIN $CDRECORD_OPTIONEN" do_info do_debug "Zeile $LINENO: $CDRECORD_BIN wird gestartet" $CDRECORD_BIN $CDRECORD_OPTIONEN RESULT=$? if [ $RESULT -ne 0 ]; then echo "Es trat beim Löschen der CDRW ein Fehler auf." echo "Rückgabewert: $RESULT" do_exit 22 fi fi; } trap do_exit SIGHUP SIGSTOP SIGKILL SIGTERM # # Syntax auswerten # # Syntax ausgeben, wenn keine Parameter [ $# -eq 0 -o "$1" == "--help" ] && do_usage # Variablen vorher auf Standard setzen SPEED=$ST_SPEED DEVICE=$ST_DEVICE # Auswertung for ARG do case $1 in --speed) SPEED=$2 do_debug "Option $1 \$SPEED=$2" shift 2 ;; --device) DEVICE=$2 do_debug "Option $1" shift 2 ;; --dummy) SIMULATE_WRITING=yes do_debug "Option $1" shift ;; --joliet) USE_JOLIET=yes do_debug "Option $1" shift ;; --nojoliet) USE_JOLIET=no do_debug "Option $1" shift ;; --use-sudo) USE_SUDO=yes do_debug "Option $1" shift ;; --rockridge) USE_ROCKRIDGE=yes do_debug "Option $1" shift ;; --norockridge) USE_ROCKRIDGE=no do_debug "Option $1" shift ;; --multisession) MULTISESSION_CD=yes do_debug "Option $1" shift ;; --nomultisession) MULTISESSION_CD=no do_debug "Option $1" shift ;; --lastsession) LAST_SESSION=yes do_debug "Option $1" shift ;; --disable-burnfree) USE_BURNFREE="no" do_debug "Option $1" shift ;; --debug) DEBUG=yes do_debug "Option $1" shift ;; --silent) SILENT="yes" do_debug "Option $1" shift ;; --nosilent|--verbose) SILENT="no" do_debug "Option $1" shift ;; --cleancdrw) CLEAN_CDRW="yes" do_debug "Option $1" shift ;; --copycd) COPY_CD="yes" do_debug "Option $1" shift ;; --blanktype) BLANKTYPE=$2 do_debug "Option $1" shift 2 ;; --help) do_usage ;; --doc) do_showdoc ;; --dao) USE_DAO="yes" do_debug "Option $1" shift ;; --nodao) USE_DAO="no" do_debug "Option $1" shift ;; --tao) USE_TAO="yes" do_debug "Option $1" shift ;; --notao) USE_TAO="no" do_debug "Option $1" shift ;; --leadingdot) USE_LEADINGDOT="yes" do_debug "Option $1" shift ;; --version) echo "writeCD $VERSION Copyright by Carsten Grohmann" do_exit ;; --volid) VOLUMEN_ID=$2 do_debug "Option $1 \$VOLUMEN_ID=$2" shift 2 ;; --appid) APPLICATION_ID=$2 do_debug "Option $1 \$APPLICATION_ID=$2" shift 2 ;; --preparer) PREPARER=$2 do_debug "Option $1 \$PREPARER=$2" shift 2 ;; --publisher) PUBLISHER=$2 do_debug "Option $1 \$PUBLISHER=$2" shift 2 ;; --image) ISO_IMAGE=$2 do_debug "Option $1 \$ISO_IMAGE=$2" shift 2 ;; # Alles was bis jetzt noch nicht erkannt wurde, wird verwurfen *) if [ -d "$1" ]; then DIRECTORIES=${DIRECTORIES}"$1 "; do_debug "$1 zur Verzeichnisliste hinzugefügt" elif [ -e "$1" ]; then echo "Fehler: $1 ist kein Verzeichnis." do_exit 1 elif [ "$1" != "" ]; then echo "Option $1 unbekannt, wird ignoriert" fi shift ;; esac done # Programmname und Version ausgeben echo "writeCD Version $VERSION" # Fehler ausgeben, wenn der übergebene Parameter kein Verzeichnis ist if [ -z "$DIRECTORIES" -a "$COPY_CD" = "no" -a "$CLEAN_CDRW" = "no" -a -z "$ISO_IMAGE" ]; then echo -n "Fehler! Sie habe vergessen ein existierendes Verzeichnis mit zu " echo "übergeben." do_usage fi ############################################################################### # Hauptroutine # ############################################################################### # Überprüfen, ob $TEMPFILE eine reguläre Datei ist TEMPFILE=`mktemp /tmp/CDImage.XXXXXX` if [ $? -ne 0 ]; then echo "Fehler! beim Erzeugen der temporären Datei." TEMPFILE="NOT_SET" do_exit 8 fi # Auf die Existenz der ausführbaren Programme testen #################################################### # cdrecord do_searchprog $CDRECORD_BIN 2 3 && CDRECORD_BIN=$FILE # mkisofs do_searchprog $MKISOFS_BIN 4 5 && MKISOFS_BIN=$FILE # sudo if [ "$USE_SUDO" = "yes" ]; then do_searchprog $SUDO_BIN 6 7 && SUDO_BIN=$FILE CDRECORD_BIN="$SUDO_BIN $CDRECORD_BIN" fi # Allgemeine Syntaxauswertung ############################# # Übergebene Geschwindigkeit überprüfen [ "$SPEED" -lt 1 -o "$SPEED" -gt "$MAX_SPEED" ] && SPEED=$MAX_SPEED # Löschmodus überprüfen [ "$BLANKTYPE" = "" ] && BLANKTYPE="all" # COPY_CD auf $DIRECTORIES prüfen if [ "$COPY_CD" = "yes" ]; then if [ "$DIRECTORIES" ]; then echo "WARNUNG: Obwohl --copycd angewählt ist, sind noch ein oder mehrere " echo "Verzeichnisse übergeben wurden. Dies ist nicht zulässig." do_exit 1 fi # Beim Kopieren sollen keine multi-session Einstellungen verwendet werden if [ "$MULTISESSION_CD" = "yes" ]; then MULTISESSION_CD="no" fi # Die gesamte CD sollte in einem Rutsch kopiert werden. if [ "$COPY_USE_DAO" = "yes" ]; then USE_DAO="yes" else USE_DAO="no" fi fi # Zusammenspiel von DAO und TAO überprüfen if [ "$USE_DAO" = "yes" -a "$USE_TAO" = "yes" ]; then echo "FEHLER: Die Optionen --dao und --tao können nicht gleichzeitig verwendet" echo "werden. Bitte wählen Sie eine aus und starten das Programm neu" do_usage do_exit 1 fi # ausgewähltes Device überprüfen ################################ _RESULT=$(check_device $DEVICE) case $_RESULT in "not_found") echo "Es wurde kein CD-Brenner gefunden." do_exit 24 ;; "found") do_info "Brenner $DEVICE wurde gefunden." ;; *) if [ "$DEVICE" = "AUTO" ]; then do_info "Es wurde ein CD-Brenner unter \"$_RESULT\" gefunden und ausgewählt." DEVICE=$_RESULT else echo "Das Gerät \"$DEVICE\" existiert nicht. Bitte wählen Sie ein anderes" echo "Gerät. Wenn Sie die Option \"--device\" nicht setzen, sucht writeCD" echo "automatisch nach einem passenden CD-Brenner." do_exit 25 fi ;; esac unset _RESULT # Eigenschaften des Brenners prüfen ################################### do_debug "Auswertung der Fähigkeiten des Brenners" # cache Eigenschaften von Brenner und CD [ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$DEVICE -prcap 2>&1) [ -z "$_ATIP" ] && _ATIP=$(cdrecord -dev=$DEVICE -atip 2>&1) [ -z "$_MSINFO" ] && _MSINFO=$(cdrecord -dev=$DEVICE -msinfo 2>&1) # Schreiben von CDRWs prüfen can_writeCDRW $DEVICE && SUPPORT_CDRW="yes" || SUPPORT_CDRW="no" if [ "$CLEAN_CDRW" = "yes" -a "$SUPPORT_CDRW" = "no" ]; then echo "FEHLER: Dieser CD-Brenner kann keine CD-RWs beschreiben bzw löschen."; do_exit 13 fi # BURNFREE testen can_useBUT $DEVICE && SUPPORT_BURNFREE="yes" || SUPPORT_BURNFREE="no" # Unterstützung für Schreibtest can_writeTEST $DEVICE && SUPPORT_DUMMY="yes" || SUPPORT_DUMMY="no" # Unterstützung für Multi-Session CDs can_writeMS $DEVICE && SUPPORT_MULTISESSION="yes" || SUPPORT_MULTISESSION="no" # Unterstützung für das Schreiben im DAO (Disk at once) Modus can_writeDAO $DEVICE && SUPPORT_DAO="yes" || SUPPORT_DAO="no" if [ $SUPPORT_DAO = "no" -a $USE_DAO = "yes" ]; then echo "Dieses Laufwerk unterstützt kein Schreiben der CDs im Disk-At-Once Modus." echo "Bitte verwenden sie daher die Option -dao nicht mehr." do_exit 16 fi # Unterstützung für das Schreiben im TAO (Track at once) Modus can_writeTAO $DEVICE && SUPPORT_TAO="yes" || SUPPORT_TAO="no" if [ $SUPPORT_TAO = "no" -a $USE_TAO = "yes" ]; then echo "Dieses Laufwerk unterstützt kein Schreiben der CDs im Track-At-Once Modus." echo "Bitte verwenden sie daher die Option -tao nicht mehr." do_exit 17 fi # Eigenschaften der CD prüfen ############################# do_debug "Auswertung der Eigenschaften der CD" # CD eingelegt ? is_disk $DEVICE || { echo "Bitte legen Sie eine CD ein. Falls schon eine CD im Laufwerk ist, so" echo "ist diese wahrscheinlich unbrauchbar. Probieren Sie es mit einer " echo "anderen noch einmal." do_exit 11 } # Auf CD-Typ testen CDR oder CDRW ? CD_TYPE=$(disktype $DEVICE) # CD schon abgeschlossen ? cd_isclosed $DEVICE && { echo "Die eingelegte CD ist wahrscheinlich schon abgeschlossen. Bitte" echo "probieren Sie es mit einer anderen noch einmal." do_exit 12 } # Vorhergehenden Sessions ermitteln if [ "$MULTISESSION_CD" = "yes" ]; then cd_isfirstsession $DEVICE if [ $? -eq 0 ]; then FIRST_SESSION="yes" else FIRST_SESSION="no" MSINFO=${_MSINFO} fi fi # lösche Eigenschaften von Brenner und CD aus dem Cache unset _PRCAP unset _ATIP unset _MSINFO # Zusammenspiel der Optionen prüfen ################################### if [ "$MULTISESSION_CD" = "yes" ]; then # Multisession automatisch löschen, wenn nicht verfügbar if [ "$MULTISESSION_CD" = "yes" -a "$SUPPORT_MULTISESSON" = "no" ]; then do_info "Die Erstellung von Multisession-CDs wird vom CD-Brenner nicht unter-" do_info "stützt, daher wird die Option abgeschaltet" MULTISESSION_CD="no"; fi # DAO und Multisession funktionieren nicht zusammen if [ "$MULTISESSION_CD" = "yes" -a "USE_DAO" = "yes" ]; then USE_DAO="no"; fi fi # Kann keine CDRWs verarbeiten -> beenden if [ "$CD_TYPE" = "CDRW" -a "$SUPPORT_CDRW" = "no" ]; then echo "Dieser CD-Brenner kann keine CD-RWs beschreiben. Bitte nutzen Sie"; echo "einen anderen Rohling." do_exit 13; fi # Kein simuliertes Schreiben verfügbar -> beende if [ "$SIMULATE_WRITING" = "yes" -a "$SUPPORT_DUMMY" = "no" ]; then echo "WARNUNG: Dieser CD-Brenner unterstützt das simulierte Schreiben nicht."; do_exit 14; fi # BURNFREE automatisch löschen, wenn nicht verfügbar if [ "$USE_BURNFREE" = "yes" -a "$SUPPORT_BURNFREE" = "no" ]; then echo "WARNUNG: Dieser CD-Brenner unterstützt BURNFREE nicht. Es wird daher" echo "nicht verwendet!" USE_BURNFREE="no"; fi # Ausgabe von zusätzlichen Informationen ######################################## if [ "$DEBUG" = yes ]; then # Allgemeine Informationen echo "Gerät: $DEVICE" echo "Geschwindigkeit: $SPEED" [ "$DIRECTORIES" ] && echo "Verzeichnisse: $DIRECTORIES" echo "Temporäre Datei: $TEMPFILE" echo "CD Typ: $CD_TYPE" [ "$USE_SUDO" = "yes" ] && echo "Es wird sudo zum Starten von cdrecord verwendet" # Ausgabe der vom Brenner unterstützten Optionen [ "$SUPPORT_BURNFREE" = "yes" ] && AUSGABE=" - BURN-Proof\n" [ "$SUPPORT_CDRW" = "yes" ] && AUSGABE=${AUSGABE}" - Schreiben von CDRWs\n" [ "$SUPPORT_DUMMY" = "yes" ] && AUSGABE=${AUSGABE}" - Simuliertes Schreiben\n" [ "$SUPPORT_MULTISESSION" = "yes" ] && AUSGABE=${AUSGABE}" - Multi-Session CDs\n" [ "$SUPPORT_DAO" = "yes" ] && AUSGABE=${AUSGABE}" - Disk At Once Mode\n" [ "$SUPPORT_TAO" = "yes" ] && AUSGABE=${AUSGABE}" - Track At Once Mode\n" [ "$AUSGABE" ] && echo -e "Ihr Brenner unterstützt folgende Optionen:\n$AUSGABE" # Ausgabe der gewählten Optionen [ "$SIMULATE_WRITING" = "yes" ] && echo "Das Schreiben der CD wird nur simuliert." echo "Informationen zur CD:" [ "$VOLUMEN_ID" ] && echo " Die CD wird mit $VOLUMEN_ID benannt." [ "$CLEAN_CDRW" = "yes" ] && echo " Die CDRW wird vor den Beschreiben gelöscht." [ "$LAST_SESSION" = "yes" ] && echo " Die CD wird nach dem brennen abgeschlossen." [ "$USE_DAO" = "yes" ] && echo " Die CD wird im Disk At Once Mode erzeugt." [ "$USE_TAO" = "yes" ] && echo " Die CD wird im Track At Once Mode erzeugt." [ "$MULTISESSION_CD" = "yes" ] && echo " Es wird eine Multi-Session-CD erzeugt." \ || echo " Es wird eine Single-Session-CD erzeugt." echo " Es werden folgende Verzeichnisinformationen erzeugt:" [ "$USE_JOLIET" = "yes" ] && echo " - Joliet" [ "$USE_ROCKRIDGE" = "yes" ] && echo " - Rockridge" [ ! "$USE_JOLIET" = "yes" -a \ ! "$USE_ROCKRIDGE" = "yes" ] && echo " - pures ISO 9660" fi # CDRW löschen? if [ "$CLEAN_CDRW" = "yes" ]; then # cdrw löschen do_cleancdrw $DEVICE $BLANKTYPE $SPEED # Einstellungen für multi-session CDs zurücksetzen FIRST_SESSION="yes" # beendet das Programm wenn nur die CDRW gelöscht werden sollte [ -z "$DIRECTORIES" -a "$COPY_CD" = "no" -a -z "$ISO_IMAGE" ] && do_exit fi # Beenden bei USE_SUDO und mehreren Sitzungen if [ "$USE_SUDO" = "yes" -a "$MULTISESSION_CD" = "yes" -a ! "$FIRST_SESSION" = "yes" ]; then echo "Da Sie --use-sudo nutzen können Sie keine weiteren Session zur einer " echo "Multisession-CD hinzufügen." do_exit 15 fi # Optionen zusammensetzen # Parameter von mkisofs: # -o Dateiname der Image-Datei # -full-iso9660-filenames Erlaube 32 Zeichen lange Dateinamen für ISO 9660 # -rational-rock Rock Ridge Verzeichnisinformationen erzeugen # und Berechtigungen zurücksetzen # -disable-deep-relocation disable deep directory information # -allow-leading-dots Erlaube Dateinamen mit '.' am Anfang # -allow-multidot Erlaube Dateinamen mit mehreren Punkten # -p Setze Erzeuger, des ISO-Abbildes # -appid Setze Anwendungs-ID # Für Multi-Session-CDs # -M $DEVICE Pfad zum vorherigen Abbild # -C XX,XX Multi-Session-Infos aus cdrecord # Den Parameter -p -A -V -P folgende Beschreibung darf max. 128 Zeichen # lang sein # Allgemeine Parameter setzen MKISOFS_OPTIONEN="-o $TEMPFILE -allow-multidot -full-iso9660-filenames" MKISOFS_OPTIONEN=${MKISOFS_OPTIONEN}" -disable-deep-relocation" MKISOFS_OPTIONEN=${MKISOFS_OPTIONEN}" $DIRECTORIES" # Parameter in Abhängigkeit von den Schaltern setzen [ "$MKISOFS_VERBOSE" = "yes" ] && MKISOFS_OPTIONEN="-verbose "${MKISOFS_OPTIONEN} [ "$USE_JOLIET" = "yes" ] && MKISOFS_OPTIONEN="-joliet "${MKISOFS_OPTIONEN} [ "$USE_ROCKRIDGE" = "yes" ] && MKISOFS_OPTIONEN="-rational-rock "${MKISOFS_OPTIONEN} [ "$USE_LEADINGDOT" = "yes" ] && MKISOFS_OPTIONEN="-allow-leading-dots "${MKISOFS_OPTIONEN} [ "$FIRST_SESSION" = "no" ] && MKISOFS_OPTIONEN="-M $DEVICE -C $MSINFO "${MKISOFS_OPTIONEN} [ "$VOLUMEN_ID" ] && MKISOFS_OPTIONEN="-volid \"$VOLUMEN_ID\" "${MKISOFS_OPTIONEN} [ "$APPLICATION_ID" ] && MKISOFS_OPTIONEN="-appid \"$APPLICATION_ID\" "${MKISOFS_OPTIONEN} [ "$PREPARER" ] && MKISOFS_OPTIONEN="-preparer \"$PREPARER\" "${MKISOFS_OPTIONEN} [ "$PUBLISHER" ] && MKISOFS_OPTIONEN="-publisher \"$PUBLISHER\" "${MKISOFS_OPTIONEN} # Parameter von cdrecord: # -v Erhöhe das Ausgabelevel der Meldungen um eins # speed= Schreibgeschwindigkeit des CD-Brenners # dev= Device des CD-Brenners z.B.'1,00,00' # -multi Erzeut Multi-Session-CDs # -data CD-ROM data mode 1 # Datei mit dem zu schreibenden Track # Allgemeine Parameter setzen if [ "$COPY_CD" = "yes" -o "$ISO_IMAGE" ]; then CDRECORD_OPTIONEN="-v speed=$SPEED dev=$DEVICE -pad " else CDRECORD_OPTIONEN="-v speed=$SPEED dev=$DEVICE -pad -data " fi # Parameter in Abhängigkeit von den Schaltern setzen [ "$USE_BURNFREE" = "yes" ] && CDRECORD_OPTIONEN="driveropts=burnfree "${CDRECORD_OPTIONEN} [ "$SIMULATE_WRITING" = "yes" ] && CDRECORD_OPTIONEN="-dummy "${CDRECORD_OPTIONEN} [ "$USE_DAO" = "yes" ] && CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}"-dao " if [ ! "$LAST_SESSION" = "yes" -a "$MULTISESSION_CD" = "yes" ]; then CDRECORD_OPTIONEN="-multi "${CDRECORD_OPTIONEN} else CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}"-isosize " fi # Abbilddatei an die letzte Stelle "hängen" if [ "$COPY_CD" = "yes" ]; then CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}" $COPY_SOURCE_DEVICE" elif [ "$ISO_IMAGE" ]; then CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}" $ISO_IMAGE" else CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}" $TEMPFILE" do_info do_info "Temporäres CD-Image erzeugen" do_info "----------------------------" do_info "Abbild erstellen: $MKISOFS_BIN $MKISOFS_OPTIONEN" do_info do_debug "Zeile $LINENO: $MKISOFS_BIN wird gestartet" $MKISOFS_BIN $MKISOFS_OPTIONEN RESULT=$? if [ $RESULT -ne 0 ]; then echo "Es trat beim Erzeugen des CD-Abbildes ein Fehler auf." echo "Rückgabewert: $RESULT" do_exit 21 fi fi do_info do_info "CD erstellen" do_info "------------" do_info "CD brennen: $CDRECORD_BIN $CDRECORD_OPTIONEN" do_info do_debug "Zeile $LINENO: $CDRECORD_BIN wird gestartet" $CDRECORD_BIN $CDRECORD_OPTIONEN RESULT=$? # Rückgabewert überprüfen if [ $RESULT -ne 0 ]; then echo "Es trat beim Schreiben der CD ein Fehler auf." echo "Rückgabewert: $RESULT" do_exit 23 fi do_exit