#!/bin/sh # rc=0 trap 'exit $rc' 0 trap 'exit 221' 1 2 3 14 15 # ###################################################################### # # # B F T - [B]inary [F]ile [T]ransfer # # # # Version 1.0 - Written 24.02.95 by Steffen Beyer # # # # Copyright (C) 1995 by software design & management GmbH & Co. KG # # # ###################################################################### # ###################################################################### # # # Aenderungshistorie: # # # # Versions-Nr. Datum Bearbeiter Aenderung # # ------------- -------- ---------- ------------------------------ # # Version 1.1 01.03.95 sb Bug in trap-Anweisung behoben # # sowie kleinere Verbesserungen # # Version 1.2 02.03.95 sb Bug in trap-Anweisung behoben # # Version 1.3 04.03.95 sb Auf Bourne-Shell umgestellt # # Version 1.4 14.06.96 sb `whoami` ersetzt d. $LOGNAME # # # ###################################################################### # ###################################################################### # # # Temporaere Dateien: # # # # - BFT_BINARY$$.tmp (mit 'uuencode' verpackte Kopie der Datei) # # - BFT_HEADER$$.tmp (Inhalt der Ankuendigungs-Mail) # # - BFT_REMARK$$.tmp* (Kommentar des Absenders und evtl. Backup) # # # # (Diese temporaeren Dateien werden im selben Verzeichnis # # angelegt wie die zu versendende Datei!) # # # ###################################################################### # ###################################################################### # # # Hinweis: # # # # Ein- und dieselbe Datei kann gleichzeitig an mehrere e-mail - # # Adressen verschickt werden! # # # ###################################################################### # ###################################################################### # # # Benoetigt: # # # # - sh # # - basename # # - dirname # # - hostname # # - which # # - finger # # - date # # - pwd # # - cat # # - cd # # - rm # # - wc # # - awk # # - uuencode # # - elm # # - ein Pager (Umgebungsvariable '$PAGER', sonst more oder cat) # # - ein Editor (Umgebungsvariable '$EDITOR', sonst vi oder emacs) # # - Umgebungsvariable '$LOGNAME', '$USERNAME' oder '$USER' # # # ###################################################################### # ################# # # # B E G I N # # # ################# # # Einige wichtige elementare Informationen: # self=`basename $0 .sh` user=$LOGNAME if [ ! "$user" ] then user=$USERNAME fi if [ ! "$user" ] then user=$USER fi if [ ! "$user" ] then user="nobody" fi host=`hostname` name=`finger $user | awk -F: '/Login/{x=$3;exit}END{x=substr(x,2);print x}'` # # Einige Texte, die z.T. an mehreren Stellen gebraucht werden: # syntax="Syntax: $self [ ] [ ... ]" text_1="Dieses Tool dient dazu, Binaerdateien (Dokumente, Bilder, Toene)" text_2="per 'electronic mail' (e-mail) zu verschicken." text_3="Der Empfaenger braucht lediglich die erhaltene Mail in einer" text_4="Datei abzuspeichern und diese mit 'uudecode' zu entpacken." text_5="Falls der Benutzer das entsprechende '.forward' und '.procmailrc'" text_6="installiert hat, geschieht dies auch automatisch." text_7="Siehe unter 'man elm' fuer weitere Erlaeuterungen!" text_8="Fuer weitere Hilfe siehe unter '$self -h' oder 'man $self'!" text_9="Fuer weitere Hilfe siehe unter 'man $self'!" # # Liste der moeglichen Optionen: # option_0="Moegliche Optionen sind:" option_1=" -h oder" option_2=" -? : Hilfe" option_3=" -c : Eingabe des Kommentars unterdruecken" option_4=" -e : Eingabe des Kommentars sofort ueber Editor" # # Default-Werte fuer Flags und Optionen: # help="" error="" remark="on" edit="" # # Aufruf ohne Parameter ==> Hilfe ausgeben: # if [ "$#" = "0" ] then help="on" fi # # Uebernahme der Optionen: # while [ "$1" != "" ] do case "$1" in -c) remark="" ;; -e) edit="on" ;; -h|-\?) help="on" break ;; -*) error="on" break ;; *) break ;; esac shift done # # Hilfe gewuenscht? # if [ "$help" ] then echo echo "Hilfe zu B F T - ( [B]inary [F]ile [T]ransfer ) :" echo echo "$syntax" echo echo "$option_0" echo echo "$option_1" echo "$option_2" echo "$option_3" echo "$option_4" echo echo "$text_1" echo "$text_2" echo echo "$text_3" echo "$text_4" echo echo "$text_5" echo "$text_6" echo echo "$text_9" echo rc=0 exit fi # # Unbekannte Option gefunden? # if [ "$error" ] then echo >&2 echo "Fehler: Unbekannte Option '$1' gefunden!" >&2 echo >&2 echo "$syntax" >&2 echo >&2 echo "$option_0" >&2 echo >&2 echo "$option_1" >&2 echo "$option_2" >&2 echo "$option_3" >&2 echo "$option_4" >&2 echo >&2 echo "$text_8" >&2 echo >&2 rc=223 exit fi # # Nicht genuegend Argumente? # if [ "$1" = "" ] then echo >&2 echo "Fehler: Der fehlt!" >&2 echo >&2 echo "$syntax" >&2 echo >&2 echo "$text_8" >&2 echo >&2 rc=224 exit fi # # Dateinamen in den Pfad und den reinen Dateinamen zerlegen: # file=`basename $1` path=`dirname $1` # # Existiert das angegebene Verzeichnis und ist es benutzbar? # if [ ! \( -d "$path" -a -r "$path" -a -w "$path" -a -x "$path" \) ] then echo >&2 echo "Fehler: Das Verzeichnis '$path'" >&2 echo "existiert nicht, ist nicht lesbar, nicht schreibbar oder nicht ausfuehrbar!" >&2 echo >&2 rc=225 exit fi # # Wechsle in das angegebene Verzeichnis und bestimme den vollen Pfad: # cd $path path=`pwd` if [ "$path" = "/" ] then path="" fi # # Erzeuge alle Dateinamen, die ab hier benoetigt werden: # bin_file=BFT_BINARY$$.tmp hdr_file=BFT_HEADER$$.tmp rem_file=BFT_REMARK$$.tmp org_file=$path/$file # # Bei einem Abbruch sollen vorher alle temporaeren Dateien geloescht werden: # rc=0 trap 'rm -f $bin_file ; rm -f $hdr_file ; rm -f $rem_file* ; exit $rc' 0 trap 'rm -f $bin_file ; rm -f $hdr_file ; rm -f $rem_file* ; exit 222' 1 2 3 14 15 # # Durch die obige trap-Anweisung mit dem Signal "0" wird erreicht, # dass auch bei jedem (nachfolgenden) exit-Kommando in diesem Shell-Skript # vorher alle temporaeren Dateien geloescht werden. # # Der Stern (*) nach dem '$rem_file' dient dazu, eventuelle Backup-Dateien, # die vom Editor hinterlassen wurden, ebenfalls zu loeschen. # # Existiert die angegebene Datei und ist sie lesbar sowie nicht-leer? # if [ ! \( -f "$org_file" -a -r "$org_file" -a -s "$org_file" \) ] then echo >&2 echo "Fehler: Die Datei '$org_file'" >&2 echo "existiert nicht, ist nicht lesbar oder leer oder keine Datei!" >&2 echo >&2 rc=226 exit fi # # Der Dateiname ist verarbeitet. Hole alle e-mail-Adressen nach vorne: # shift # # Ist mindestens eine Adresse angegeben? # if [ "$1" = "" ] then echo >&2 echo "Fehler: Die fehlt!" >&2 echo >&2 echo "$syntax" >&2 echo >&2 echo "$text_8" >&2 echo >&2 rc=227 exit fi # # Nun kann die eigentliche Verarbeitung beginnen: # uuencode $org_file $file >$bin_file rc=$? # # Alles glatt gegangen? # if [ "$rc" != "0" ] then echo >&2 echo "'uuencode' meldet beim Verpacken der Datei einen Fehler!" >&2 echo >&2 echo "Der Returncode ist '$rc'." >&2 echo >&2 echo "Siehe unter 'man uuencode' fuer weitere Erlaeuterungen!" >&2 echo >&2 exit fi # # Falls nicht abgeschaltet, Benutzer nach einem Kommentar fragen: # if [ "$remark" ] then # # Einen verfuegbaren Pager bestimmen: # for pager in "$PAGER" more cat do path=`which "$pager" | awk '{print $1}'` if [ "$path" != "no" -a -f "$path" -a -x "$path" ] then break fi pager="" done # # Einen verfuegbaren Editor bestimmen: # for editor in "$EDITOR" vi emacs do path=`which "$editor" | awk '{print $1}'` if [ "$path" != "no" -a -f "$path" -a -x "$path" ] then break fi editor="" done # # Falls der Editor schon zu Beginn gestartet werden soll (Option '-e'): # if [ "$edit" ] then edit="$editor" # # Falls ein Editor vorhanden ist: # if [ "$edit" ] then echo "Kommentar:" >$rem_file echo >>$rem_file fi fi # # Eingabeschleife (fuer Korrekturmoeglichkeit): # while [ "true" ] do # # Falls kein Editor vorhanden oder erstes Mal (ohne Option '-e'): # if [ "$edit" = "" ] then echo echo "Nachfolgend kann ein (beliebiger) Kommentar eingegeben werden:" echo echo "(Zum Abschluss des Kommentars auf einer leeren Zeile druecken!)" echo echo "Kommentar:" >$rem_file echo >>$rem_file cat >>$rem_file echo else $edit $rem_file fi # # Falls der Benutzer korrigieren will, ab jetzt auf jeden Fall # einen Editor verwenden (vorausgesetzt es ist einer vorhanden): # edit="$editor" # # Ist der Benutzer zufrieden mit dem Kommentar? # while [ "true" ] do if [ "$pager" ] then echo $pager $rem_file fi echo echo -n "Ist der Kommentar so in Ordnung, a oder ein? " read rc case "$rc" in j*|J*|y*|Y*) break 2 ;; n*|N*) break ;; esac done done echo fi # # Ab hier sollte nun nichts mehr schiefgehen koennen... # bin_length=`wc -c $bin_file | awk '{print $1}'` org_length=`wc -c $org_file | awk '{print $1}'` # # Ankuendigungs-Mail vorbereiten: # cat >$hdr_file <<@ Ankuendigung: Auf diese Mail folgt eine weitere, die eine verpackte Binaerdatei enthaelt. Das Thema ('Subject') der nachfolgenden Mail lautet: BFT: '$file' Um diese Mail zu entpacken, muss sie zuerst als Datei abgespeichert werden. Unter UNIX kann sie daraufhin mit 'uudecode ' entpackt werden. Falls das entsprechende '.forward' und '.procmailrc' installiert ist, geschieht diese Dekodierung automatisch. Die entpackte Datei ist dann im Verzeichnis '\$HOME/bft' zu finden. Login-Name des Absenders: $user Voller Name des Absenders: $name Rechner-Name des Absenders: $host Name der uebertragenen Datei: $file Name der Datei mit vollem Pfad: $org_file Laenge der uebertragenen Datei: $bin_length Bytes Laenge der urspruenglichen Datei: $org_length Bytes Datum und Uhrzeit: `date` @ # # Kommentar einfuegen: # if [ "$remark" ] then if [ -f "$rem_file" -a -r "$rem_file" -a -s "$rem_file" ] then cat <$rem_file >>$hdr_file fi fi # # Zweiten (bzw. dritten) Teil der Ankuendigungs-Mail hinzufuegen: # cat >>$hdr_file <<@ ACHTUNG: 1.: Beim Abspeichern der Mail sollte ein Dateiname gewaehlt werden, der von '$file' VERSCHIEDEN ist, da sonst 'uudecode' nicht immer korrekt funktioniert! 2.: Beim Entpacken der Datei mit 'uudecode' ist darauf zu achten, dass im selben Verzeichnis KEINE ANDERE DATEI mit dem Namen '$file' liegt, da diese sonst ueberschrieben wird! +------------------------------------------------------------------+ | | | B F T - [B]inary [F]ile [T]ransfer | | | | Version 1.4 - Written 14.06.96 by Steffen Beyer | | | | Copyright (C) 1995 by software design & management GmbH & Co. KG | | | +------------------------------------------------------------------+ @ # # Ab hier soll kein Benutzer-Abbruch (ctrl-c) mehr moeglich sein: # trap '' 2 # # Ankuendigungs-Mail verschicken: # elm -s "Ankuendigung Binary File Transfer" $@ <$hdr_file rc=$? # # Alles glatt gegangen? # if [ "$rc" != "0" ] then echo >&2 echo "'elm' meldet beim Senden der Ankuendigung einen Fehler!" >&2 echo >&2 echo "Der Returncode ist '$rc'." >&2 echo >&2 echo "$text_7" >&2 echo >&2 exit fi # # Die verpackte Datei verschicken: # elm -s "BFT: '$file'" $@ <$bin_file rc=$? # # Alles glatt gegangen? # if [ "$rc" != "0" ] then echo >&2 echo "'elm' meldet beim Senden der verpackten Datei einen Fehler!" >&2 echo >&2 echo "Der Returncode ist '$rc'." >&2 echo >&2 echo "$text_7" >&2 echo >&2 exit fi # # Und fertig! # exit # # (Aufgeraeumt wird durch die entsprechende trap-Anweisung!) # ################### # # # T H E E N D # # # ###################