#!/bin/sh # # Parameter: LISTE ACTION # z.B. ./get_files programme download # set -eu # die Key-Server muessen wohl einzeln angegeben werden - somit einzelne Direktiven KEY_SERVERS="x-hkp://pgp.mit.edu --keyserver hkp://subkeys.pgp.net" function download_file() { local QUELLE=$(grep "^$1[[:space:]]" $URL_FILE | cut -f 2) local ZIEL=$DEST_DIR/$1 # leider sind die exitcodes von wget derzeit noch nicht zuverlaessig (< v1.11) wget --continue --output-document "$ZIEL" "$QUELLE" # loesche die Datei, falls sie existiert jedoch leer ist test -e "$ZIEL" -a ! -s "$ZIEL" && rm "$ZIEL" } function verify_file() { # eventuell die Datei herunterladen [ ! -e "$DEST_DIR/$1" ] && download_file "$1" [ ! -e "$DEST_DIR/$1" ] && return 1 # Signatur-URL ermitteln local SIG_URL=$(grep "^$1[[:space:]]" $URL_FILE | cut -f 3) # bei fehlender Signatur erfolgreich abbrechen [ -z "$SIG_URL" ] && return 0 # Signatur herunterladen local SIG_FILE=$DEST_DIR/$(basename "$SIG_URL") # html-encodierte Leerzeichen wiederherstellen SIG_FILE=${SIG_FILE//\%20/ } [ ! -e "$SIG_FILE" ] && wget --output-document "$SIG_FILE" "$SIG_URL" # pruefen - notfalls den Schluessel importieren # erstmal Ausgabe unterdruecken if gpg --quiet --keyserver $KEY_SERVERS --keyserver-options auto-key-retrieve \ --verify "$SIG_FILE" "$DEST_DIR/$1" &>/dev/null then return 0 else # nochmal - diesmal mit Fehlerausgabe gpg --quiet --keyserver $KEY_SERVERS --keyserver-options auto-key-retrieve \ --verify "$SIG_FILE" "$DEST_DIR/$1" # loesche die heruntergeladene Datei und die Signatur falls die # Verifikation fehlschlaegt rm "$DEST_DIR/$1" "$SIG_FILE" echo "Die heruntergeladene Datei und die Signatur-Datei wurden geloescht." echo "Versuche es nochmal ..." return 1 fi } ########### main ############ if [ $# -lt 2 ] then echo "wrong parameters: $@" echo echo "Syntax: $(basename $0) DATEI_LISTE ACTION [DESTINATION]" echo exit 1 fi URL_FILE=$(dirname $0)/${1}.lst DEST_DIR=$(dirname $0)/${1} shift [ ! -e "$URL_FILE" ] && echo "Die Datei ($URL_FILE) existiert nicht!" && exit 2 [ -e "$DEST_DIR" ] || mkdir -p "$DEST_DIR" ACTION=help [ $# -gt 0 ] && ACTION=$1 && shift case "$ACTION" in download ) grep -v "^#" "$URL_FILE" | cut -f 1 | while read a do [ ! -e "$DEST_DIR/$a" ] && download_file "$a" done # ExitCode auf Null setzen true ;; verify ) grep -v "^#" "$URL_FILE" | cut -f 1 | while read a do if verify_file "$a" then true else echo "Verification of '$a' failed ..." exit 1 fi done ;; clean ) # Datei loeschen grep -v "^#" "$URL_FILE" | cut -f 1 | while read a; do rm -f "$DEST_DIR/$a"; done # Signatur loeschen, falls vorhanden grep -v "^#" "$URL_FILE" | cut -f 3 | sed /^$/d | while read a; do rm -f "$DEST_DIR/$(basename $a)"; done ;; install ) [ $# -eq 0 ] && echo 'You need to specify the destination directory!' && exit 1 INST_DIR=$1 [ ! -e "$INST_DIR" ] && mkdir -p "$INST_DIR" grep -v "^#" "$URL_FILE" | cut -f 1 | while read a do [ -e "$DEST_DIR/$a" ] || download_file "$a" cp "$DEST_DIR/$a" "$INST_DIR/" done ;; * ) echo "Syntax: $0 LIST { download | install | clean } [ZIEL_VERZEICHNIS]" echo ;; esac