#!/bin/bash declare -rg SELFPID=$$ perror () { if [ -n "$IGNORE_ERRORS" ]; then echo "${RED}[ERROR]${RESET} $@" return 0 fi echo "${RED}[FATAL]${RESET} $@" [ "$$" != "$SELFPID" ] && kill "$SELFPID" exit 1 } patchtgz () { [ -z "$1" ] && perror "patchtgz call failure" local VARNAME="$1" local VALUE="$2" sed -i "s,%${VARNAME}%,${VALUE},g" "$UPDATER" || perror "could not patchtgz $VARNAME in updater" } declare -rg UPDATER="updater.sh" declare -rg TGZ_SLXADMIN="files/slx-admin.tar.gz" declare -rg TGZ_DOZMOD="files/dozmod.tar.gz" declare -rg TGZ_TASKMANAGER="files/taskmanager.tar.gz" declare -rg TGZ_TFTP="files/tftpdir.tar.gz" declare -rg TGZ_IPXE="files/ipxe.tar.gz" declare -rg FILES_IPXE=" pxelinux.0 src/ .git/ " declare -rg TGZ_LDADP="files/ldadp.tar.gz" declare -rg LIST_LDADP=" Makefile .localversion version.in.h ldadp.c " declare -rg TGZ_DNBD3="files/dnbd3.tar.gz" declare -rg FILES_DNBD3=" CMakeLists.txt src/ version.txt " checkfiles () { tar tf "$1" | awk -v strings="$2" ' BEGIN { numStrings = split(strings,tmp) for (i in tmp) strs[tmp[i]] } numStrings == 0 { exit 0 } { for (str in strs) { if ( $0 == str ) { delete strs[str] numStrings-- } } } END { exit (numStrings ? 1 : 0) } ' } RED= GREEN= RESET= if [ -t 1 ]; then RED=$( echo -en '\033[1;31m' ) GREEN=$( echo -en '\033[1;32m' ) RESET=$( echo -en '\033[0m' ) fi readonly RED GREEN RESET # Prepare installer cp "updater.template.sh" "$UPDATER" || perror "could not copy template" chmod +x "$UPDATER" LEAN= while true; do case "$1" in --lean|-l) LEAN=true ;; *) break ;; esac shift done # Prepare source directory declare -rg SRCDIR=$1 if [ -z "$SRCDIR" ]; then echo "Usage: $0 " echo "Where is the directory you put all the file to pack as payload" exit 1 fi if [ "x$(stat -c "%d:%i" "$SRCDIR")" != "x$(stat -c "%d:%i" files)" ]; then rm -rf "files" [ -d "files" ] && perror "files still exists..." cp -r "$SRCDIR" "files" fi if [ ! -d "$SRCDIR" ]; then echo "Source dir '$SRCDIR' not found!" fi #declare -rg TMPDIR=$(mktemp -d) #[ -d "$TMPDIR" ] || perror "TMPDIR fail." addpayload () { echo -n "Includes $2: " local FILEVAR="TGZ_$1" local LISTVAR="FILES_$1" local FILENAME=${!FILEVAR} local LISTFILES=${!LISTVAR} if [ -e "${FILENAME}" ]; then if [ -n "$LISTFILES" ] && ! checkfiles "$FILENAME" "$LISTFILES"; then echo "${RED}no !!! BAD FORMAT !!!${RESET}" patchtgz "$FILEVAR" return fi echo "${GREEN}yes${RESET}" patchtgz "$FILEVAR" "$FILENAME" else echo "${RED}no${RESET}" patchtgz "$FILEVAR" fi } addinstallfile () { echo -n "Includes $1: " local file=$1 local path=$(dirname "$file") if [ ! -d "../satellit_installer" ]; then echo "${RED}NO!${RESET} (satellit_installer not found)" elif [ ! -e "../satellit_installer/static_files/$file" ]; then echo "${RED}NO!${RESET} (file not found in satellit_installer/static_files)" else mkdir -p "files/$path" || echo -n "(mkdir failed) " if cp "../satellit_installer/static_files/$file" "files/$file"; then echo "${GREEN}yes${RESET}" else echo "...${RED}no!${RESET} (copy failed)" fi fi } # Replace variables # slxadmin version echo -n "Includes SLX-Admin: " if [ -e "$TGZ_SLXADMIN" ]; then echo "${GREEN}yes${RESET}" VERS=$(date +%Y%j%H) [ -n "$VERS" ] || perror "Could not extract slx-admin version!" echo "Version: $VERS" sed -i "s/%TARGET_WEBIF_VERSION%/${VERS}/" "$UPDATER" || perror "could not patch slxadmin version in updater" sed -i "s/%SLXADMIN_FOOTER%/$(date '+%y-%m-%d %H:%M')/" "$UPDATER" || perror "could not patch slxadmin footer in updater" patchtgz "TGZ_SLXADMIN" "$TGZ_SLXADMIN" else echo "${RED}no${RESET}" patchtgz "TGZ_SLXADMIN" fi addpayload "DOZMOD" "Dozmod server" addpayload "TASKMANAGER" "Taskmanager" addpayload "TFTP" "TFTP/PxeLinux data" addpayload "IPXE" "iPXE source code" addpayload "LDADP" "ldap/ad proxy source code" addpayload "DNBD3" "dnbd3-server source code" if [ -z "$LEAN" ]; then addinstallfile "lighttpd.conf" addinstallfile "lighttpd-auto-ssl.sh" addinstallfile "lighttpd-include-conf-d.sh" addinstallfile "slxadmin-config.php" addinstallfile "slxadmin-cronscript" addinstallfile "slxadmin-crontab" addinstallfile "patch_lighttpd_phpchildren" # Not quite ideal, watch out for similar names addinstallfile "dnbd3/dnbd3-server.service" addinstallfile "dnbd3/is-enabled" addinstallfile "dnbd3/server.conf" addinstallfile "dnbd3/rpc.acl" addinstallfile "tftpd/tftpd-hpa.service" addinstallfile "tftpd/tftpd-hpa" # TODO: Unify more source ../satellit_installer/includes/10-sudo_config.inc sudo_config files/tm-sudo-config fi # Last patch: Payload offset # Calc payload offset, which is tricky as the size changes as we patch SIZE=$(stat -c %s "$UPDATER") SIZE=$(( ( $SIZE / 1024 ) * 1024 + 1024 )) sed -i "s/%PAYLOAD_OFFSET%/${SIZE}/" "$UPDATER" || perror "could not patch payload variable in updater" # Truncate, append payload truncate --size="$SIZE" "$UPDATER" || perror "Could not truncate updater to $SIZE bytes" echo "Appending tar payload to final updater..." tar ckz files/* >> "$UPDATER" || perror "Could not append payload to updater" echo "..done"