#!/bin/bash ### Funktionen ################################### function print () { echo -e "\033[01;29m$@\033[00m" } function error () { echo -e "\033[01;31m$@\033[00m" exit 1 } function warning () { echo -e "\033[01;33m$@\033[00m" } ### Variablen ################################### # Web MIRROR="http://mltk.boot.openslx.org" MIRRORDIR="files" # Dateien und Verzeichnisse PXEDIR="/srv/openslx/tftp/pxelinux.cfg" PXECONFIG="$PXEDIR/default" PXETEMPLATE="/opt/openslx/templates/pxemenu-header" FILEPRAEFIX="openslx-" WWWDIR="/srv/openslx/www" SLXSCRIPTS="openslx-install openslx-update" SCRIPTPATH=$(dirname "$0") SCRIPTBACKUPDIR=/root/backup # Konfigurationsdateien SERVERDEFAULTS="/opt/openslx/server-defaults" # Temporäres REMOTEINDEX=$(mktemp /tmp/mlversionXXX) LOCALINDEX="/opt/openslx/local_version" WWWTEMP="/srv/openslx/www-temp" DLFLAG=0 # if something was downloaded # Vars zum Überladen LOCAL_STABLE=0 LOCAL_TESTING=0 # Vars für Prüfsummen CRCCOMMAND=md5sum CRCEXTENSION=md5 # Mindestens freier Plattenplatz in Kilobytes MINSPACE=409600 # 400MB # Allgemein DATUM=$(date +%Y%m%d) trap "{ rm -f $REMOTEINDEX $WWWTEMP/* $WWWDIR/*.$CRCEXTENSION; }" SIGINT SIGTERM EXIT # Warnung ausgeben, wenn Raum für $WWWTEMP eventuell zu klein if [ $(df -Pk $WWWTEMP|tail -1| tr -s ' '|cut -d " " -f 4) -lt $MINSPACE ]; then warning "Achtung: Eventuell zu wenig freier Speicherplatz verfügbar." fi . "$SERVERDEFAULTS" || error "Konnte Serverkonfiguration nicht laden. Wurde openslx-install ausgeführt?" if [ -s "$LOCALINDEX" ]; then . "$LOCALINDEX" || error "Fehler beim laden der lokalen Versionsinfirmationen aus $LOCALINDEX" fi print "" print "Lade Liste aktuell verfügbarer Versionen..." wget -O "$REMOTEINDEX" "$MIRROR/index" || error "Konnte Liste verfügbarer Releases nicht herunterladen." . "$REMOTEINDEX" || error "Liste verfügbarer Releases Fehlerhaft (konnte $REMOTEINDEX nicht sourcen)" # Regenerate pxemenu [ -d "$PXEDIR" ] || mkdir -p "$PXEDIR" cp "$PXETEMPLATE" "$PXECONFIG" ERR=$?; [ $ERR -ne 0 ] && error "Kann PXE-Vorlage nicht umkopieren!" mkdir -p "$WWWTEMP" print "Kopiere bestehende Dateien sicherheitshalber um..." cp -p "$WWWDIR/$FILEPRAEFIX"* "$WWWTEMP/" ERR=$?; [ $ERR -ne 0 ] && error "Kann bestehende Dateien nicht nach $WWWTEMP kopieren!" for REL in ${!AVAILABLE_*}; do BRANCH="${REL#AVAILABLE_}" print "Remote has branch $BRANCH" PXELINE="" KERNEL="" for FILE in ${!REL}; do # Handle pxelinux.cfg if [[ "$FILE" == kernel* ]]; then KERNEL="KERNEL http://$SLX_LOCAL_ADDR/$FILEPRAEFIX$FILE" else if [ -z "$PXELINE" ]; then PXELINE="INITRD " else PXELINE+="," fi PXELINE+="http://$SLX_LOCAL_ADDR/$FILEPRAEFIX$FILE" fi # If file is available locally, don't download again if [ -s "$WWWTEMP/$FILEPRAEFIX$FILE" ]; then continue fi # Download wget -O "$WWWTEMP/$FILEPRAEFIX$FILE" "$MIRROR/$MIRRORDIR/$FILE" && DLFLAG=1 || { warning "Could not download $FILE"; continue; } # Download md5 value wget -O "$WWWTEMP/$FILEPRAEFIX$FILE.$CRCEXTENSION" "$MIRROR/$MIRRORDIR/$FILE.$CRCEXTENSION" \ || { warning "Could not download $FILE.$CRCEXTENSION!"; continue; } # check file checksums if [ $($CRCCOMMAND "$WWWTEMP/$FILEPRAEFIX$FILE"|cut -f 1 -d " ") != "$(cat $WWWTEMP/$FILEPRAEFIX$FILE.$CRCEXTENSION)" ]; then warning "$CRCCOMMAND: $FILE: checksum mismatch! Transmission error or disk full." warning "$CRCCOMMAND: $FILE: Prüfsummendiskrepanz! Übertragungsfehler oder Laufwerk voll." error "Beende Skript aufgrund Prüfsummendiskrepanz!" else print "Prüfsummencheck Datei $FILE ok." fi done if [ -z "$PXELINE" -o -z "$KERNEL" ]; then warning "Incomplete entry. KERNEL or INITRD missing." continue fi # Append to pxeconfig echo "# Branch $BRANCH" >> "$PXECONFIG" echo "LABEL $BRANCH" >> "$PXECONFIG" echo " MENU LABEL OpenSLX-NG $BRANCH [${!REL}]" >> "$PXECONFIG" echo " $KERNEL" >> "$PXECONFIG" echo " $PXELINE" >> "$PXECONFIG" echo " IPAPPEND 3" >> "$PXECONFIG" echo " APPEND slxconfig=http://$SLX_LOCAL_ADDR/config" >> "$PXECONFIG" # Extra files (e.g. vmplayer in it's own sqfs that gets downloaded later) EXTRA="${BRANCH}_EXTRA" for FILE in ${!EXTRA}; do # If file is available locally, don't download again if [ -s "$WWWTEMP/$FILEPRAEFIX$FILE" ]; then # mv "$WWWTEMP/$FILEPRAEFIX$FILE" "$WWWDIR/" continue fi # Download wget -O "$WWWTEMP/$FILEPRAEFIX$FILE" "$MIRROR/$MIRRORDIR/$FILE" || warning "Could not download $FILE" done done # If we are here, then we can assume everything went either right, or at least no fatal error happened. # So, we will move the stuff in $WWWTEMP to $WWWDIR. if [ "$DLFLAG" -ne 0 ]; then print "Alles scheint ok - Bewege neue Abbilder zum Webserver." mv "$WWWTEMP/"* "$WWWDIR/" print "Neue Abbilder bewegt." else print "Keine Abbilder heruntergeladen - leere temporäres Verzeichnis $WWWTEMP." rm -f "$WWWTEMP/"* fi # Update Scripts openslx-install and openslx-update, if possible. if [ ! -d "$SCRIPTBACKUPDIR" ]; then print "Erzeuge Sicherungsverzeichnis für Skripte $SCRIPTBACKUPDIR" mkdir -p "$SCRIPTBACKUPDIR" || error "Kann Sicherungsverzeichnis für Skripte nicht erstellen!" fi for FILE in $SLXSCRIPTS; do wget -O "$WWWTEMP/$FILE.$CRCEXTENSION" "$MIRROR/$MIRRORDIR/$FILE.$CRCEXTENSION" CRCVALNEW=$(cat "$WWWTEMP/$FILE.$CRCEXTENSION"|cut -f 1 -d " ") CRCVALOLD=$($CRCCOMMAND "$SCRIPTPATH/$FILE"|cut -f 1 -d " ") if [ "$CRCVALNEW" == "$CRCVALOLD" ]; then print "$SCRIPTPATH/$FILE - kein Update notwendig." continue else wget -O "$WWWTEMP/$FILE" "$MIRROR/$MIRRORDIR/$FILE" if [ $($CRCCOMMAND "$WWWTEMP/$FILE"|cut -f 1 -d " ") != "$CRCVALNEW" ]; then warning "$SCRIPTPATH/$FILE konnte nicht upgedatet werden ($CRCEXTENSION-Fehler)!" continue else print "$SCRIPTPATH/$FILE wird upgedatet - $CRCEXTENSION ok." print "Alte Version $SCRIPTPATH/$FILE gesichert nach: $SCRIPTBACKUPDIR/$FILE.$DATUM." mv "$SCRIPTPATH/$FILE" "$SCRIPTBACKUPDIR/$FILE.$DATUM" chmod u+x "$WWWTEMP/$FILE" # sonst wg. wget keine exec-bit mv "$WWWTEMP/$FILE" "$SCRIPTPATH" fi fi done exit 0