#!/bin/bash # Use special param to make sure we're running under bash (in case user does "sh install.sh") [ "x$1" != "x--exec-self" ] && exec /bin/bash "$0" --exec-self "$@" IGNORE_ERRORS= while [ $# -gt 0 ]; do [ "x$1" = "x--ignore-errors" ] && IGNORE_ERRORS=jup shift done declare -rg SELFPID=$$ perror () { if [ -n "$IGNORE_ERRORS" ]; then echo "[ERROR] $@" return 0 fi echo "[FATAL] $@" [ "$$" != "$SELFPID" ] && kill "$SELFPID" exit 1 } if [ "$UID" != "0" ]; then perror "Must be running as root" fi # ** Extract value from text file containing key=value pairs extractfield () { grep -m1 "^\s*$2\b" "$1" | awk -F '=' '{print $2}' | sed 's/\s//g' } # ** Wrap mysql command line client so we're always using the deb-sys-maint credentials mysql () { "$(which mysql)" --defaults-extra-file=/etc/mysql/debian.cnf --default-character-set=utf8 "$@" } # ** Constants - to be patched by the packaging script declare -rg TARGET_WEBIF_VERSION="%TARGET_WEBIF_VERSION%" declare -rg TGZ_SLXADMIN="%TGZ_SLXADMIN%" declare -rg PAYLOAD_OFFSET="%PAYLOAD_OFFSET%" # ** Constants - hardcoded or determined at runtime declare -rg PATH_SLXADMIN="/srv/openslx/www/slx-admin" # ** Check if constants have been filled, bail out otherwise if [ -z "$TARGET_WEBIF_VERSION" ] || [[ "$TARGET_WEBIF_VERSION" == %*% ]]; then perror "Bad upgrader: TARGET_WEBIF_VERSION not set" fi if [ -z "$PAYLOAD_OFFSET" ] || [[ "$PAYLOAD_OFFSET" == %*% ]]; then perror "Bad upgrader: PAYLOAD_OFFSET not set" fi # ********************************************************** # Get current webif version declare -rg CURRENT_WEBIF_VERSION=$(mysql -e 'SELECT value FROM openslx.property WHERE name = "webif-version" LIMIT 1' | tail -n 1) [ -z "$CURRENT_WEBIF_VERSION" ] && perror "Could not determine current webif version" if [ "$TARGET_WEBIF_VERSION" = "missing" ] || [ "$CURRENT_WEBIF_VERSION" -le "$TARGET_WEBIF_VERSION" ]; then : else perror "This update seems to be older than the server version you're currently running" fi # ************** Extract payload *************************** TMPDIR=$(mktemp -d) [ -z "$TMPDIR" ] && perror "Could not create temporary directory for installer" dd "bs=$PAYLOAD_OFFSET" "if=$0" skip=1 | tar -z -x -C "$TMPDIR" RET=$? [ "$RET" -ne 0 ] && perror "Extracting installer payload failed with exit code $RET" # ********************************************************** # ************************** SLX-Admin ********************* if [ -n "$TGZ_SLXADMIN" ]; then [ -e "$TMPDIR/$TGZ_SLXADMIN" ] || perror "$TGZ_SLXADMIN missing from payload." echo "* SLX-Admin: $CURRENT_WEBIF_VERSION -> $TARGET_WEBIF_VERSION" # Cheap hack: extract, then delete, extract again to get rid of old unused files. If the extraction fails, we don't leave # the user with a broken webif, because we didn't remove the directories yet tar -x -C "$PATH_SLXADMIN" -f "$TMPDIR/$TGZ_SLXADMIN" || perror "Could not extract $TGZ_SLXADMIN to $PATH_SLXADMIN" rm -rf -- "$PATH_SLXADMIN/inc" "$PATH_SLXADMIN/apis" "$PATH_SLXADMIN/modules" "$PATH_SLXADMIN/templates" tar -x -C "$PATH_SLXADMIN" -f "$TMPDIR/$TGZ_SLXADMIN" rm -- "$PATH_SLXADMIN/config.php.example" chmod -R go+rX-w,u+rwX "$PATH_SLXADMIN" chown -R root:root "$PATH_SLXADMIN" chmod 0640 "$PATH_SLXADMIN/config.php" chown root:www-data "$PATH_SLXADMIN/config.php" curl -s "http://localhost/slx-admin/api.php?do=update" > /dev/null curl -s "http://localhost/slx-admin/api.php?do=update" | grep -q 'Up to date' || perror "Updating the web interface database failed" echo "Web interface upgrade complete" fi # ************************* Dozmod ************************* echo "* Dozentenmodul" echo "Adjusting mysql permissions of user sat" mysql -e 'GRANT CREATE, ALTER ON sat.* TO sat@localhost' || perror "Could not GRANT permissions ON sat.* to sat@localhost" mysql -e 'GRANT SELECT ON openslx.location TO sat@localhost' || perror "Could not GRANT permissions ON openslx.location to sat@localhost" # File end exit 0 # Payload to follow