#!{{ shell_binary }} set -e LC_ALL=C export LC_ALL umask 077 # Redirect output to log exec > >(tee -ai {{ output_log_file }}) exec 2>&1 RESTORE_EXIT_CODE_FILE="{{ restore_exit_code_file }}" RESTORE_ERROR_MESSAGE_FILE="{{ restore_error_message_file }}" ERROR_MESSAGE="" fail_with_exit_code () { echo 1 > $RESTORE_EXIT_CODE_FILE echo -e "Failure during step : $ERROR_MESSAGE" > $RESTORE_ERROR_MESSAGE_FILE } trap fail_with_exit_code ERR log_message () { ERROR_MESSAGE=$1 echo -e $1 } # Delete the error message file, to not keep it even after a successful build rm $RESTORE_ERROR_MESSAGE_FILE || true srv_directory={{ directory['srv'] }} restore_element () { backup_path=$1 restore_path=$2 shift 2 element_list=$* for element in $element_list do cd $backup_path; if [ -f $element ] || [ -d $element ]; then command="{{ rsync_binary }} --stats -av --delete --exclude *.sock --exclude *.socket --exclude *.pid --exclude .installed.cfg --exclude .installed-switch-softwaretype.cfg $backup_path/$element $restore_path" echo "Running: \"$command\"" $command fi done } echo -e "\n\nrunner-import run at : $(date)" log_message "Restoring WebRunner content..." restore_element {{ directory['backup'] }}/runner/ $srv_directory/runner instance project proxy.db log_message "Restoring WebRunner config (etc directory)..." restore_element {{ directory['backup'] }}/etc/ {{ directory['etc'] }} config.json cp -r {{ directory['backup'] }}/etc/.??* {{ directory['etc'] }}; # Invoke arbitrary script to perform specific restoration # procedure. RESTORE_EXIT_CODE=0 runner_import_restore=$srv_directory/runner-import-restore if [ ! -e "$runner_import_restore" ]; then touch $runner_import_restore chmod +x $runner_import_restore fi log_message "Running $runner_import_restore..." $srv_directory/runner-import-restore || RESTORE_EXIT_CODE=$? log_message "Updating slapproxy database..." HOME="{{ directory['home'] }}" # XXX Hardcoded export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" export MAKEFLAGS=-j4 SLAPOS="{{ directory['bin'] }}/slapos" # XXX hardcoded SQLITE3="$HOME/software_release/parts/sqlite3/bin/sqlite3" DATABASE="$HOME/srv/runner/proxy.db" # Change slapproxy database to point instances to new software release # XXX hardcoded PARTITION=$(basename $HOME) OLD_SOFTWARE_RELEASE=$($SQLITE3 $DATABASE "select software_release from partition11 where reference='slappart0';") SOFTWARE_RELEASE=$(echo $OLD_SOFTWARE_RELEASE | sed -e 's/\(.*\)\(slappart\|test0-\)[0-9][0-9]\?/\1'"$PARTITION"'/') $SQLITE3 $DATABASE "update partition11 set software_release='$SOFTWARE_RELEASE' where software_release NOT NULL;" $SQLITE3 $DATABASE "update software11 set url='$SOFTWARE_RELEASE' where url='$OLD_SOFTWARE_RELEASE';" || $SQLITE3 $DATABASE "delete from software11 where url='$OLD_SOFTWARE_RELEASE';" # Change slapproxy database to have all instances stopped $SQLITE3 $DATABASE "update partition11 set requested_state='stopped';" # Change slapproxy database to get correct IPs IPV4={{ ipv4 }} IPV6={{ ipv6 }} $SQLITE3 $DATABASE "update partition_network11 set address='$IPV4' where netmask='255.255.255.255';" $SQLITE3 $DATABASE "update partition_network11 set address='$IPV6' where netmask='ffff:ffff:ffff::';" MASTERURL="http://{{ ipv4 }}:{{ proxy_port }}" log_message "Removing old supervisord service description files..." # XXX: Path hardcoded in slapos.core rm {{ instance_folder }}/etc/supervisord.conf.d/* || true log_message "Building newest Software Release..." $SLAPOS node software --cfg {{ supervisord['slapos-cfg'] }} --all --master-url=$MASTERURL --logfile {{ supervisord['slapgrid-sr-log'] }} --pidfile {{ supervisord['slapgrid-sr-pid'] }} >/dev/null 2>&1 || $SLAPOS node software --cfg {{ supervisord['slapos-cfg'] }} --all --master-url=$MASTERURL --logfile {{ supervisord['slapgrid-sr-log'] }} --pidfile {{ supervisord['slapgrid-sr-pid'] }} >/dev/null 2>&1 || $SLAPOS node software --cfg {{ supervisord['slapos-cfg'] }} --all --master-url=$MASTERURL --logfile {{ supervisord['slapgrid-sr-log'] }} --pidfile {{ supervisord['slapgrid-sr-pid'] }} >/dev/null 2>&1 || (tail -n 200 {{ supervisord['slapgrid-sr-log'] }} && false) # Remove defined scripts to force buildout to recreate them to have updated paths rm $srv_directory/runner/instance/slappart*/srv/runner-import-restore || true log_message "Fixing Instances as needed after import..." # XXX hardcoded $SLAPOS node instance --cfg {{ supervisord['slapos-cfg'] }} --master-url=$MASTERURL --logfile {{ supervisord['slapgrid-cp-log'] }} --pidfile {{ supervisord['slapgrid-cp-pid'] }} >/dev/null 2>&1 || $SLAPOS node instance --cfg {{ supervisord['slapos-cfg'] }} --master-url=$MASTERURL --logfile {{ supervisord['slapgrid-cp-log'] }} --pidfile {{ supervisord['slapgrid-cp-pid'] }} >/dev/null 2>&1 || $SLAPOS node instance --cfg {{ supervisord['slapos-cfg'] }} --master-url=$MASTERURL --logfile {{ supervisord['slapgrid-cp-log'] }} --pidfile {{ supervisord['slapgrid-cp-pid'] }} >/dev/null 2>&1 || (tail -n 200 {{ supervisord['slapgrid-cp-log'] }} && false) # Invoke defined scripts for each partition inside of slaprunner log_message "Invoke custom import scripts defined by each instances..." for partition in $srv_directory/runner/instance/slappart*/ do script=$partition/srv/runner-import-restore if [ -e "$script" ]; then log_message "Running $script..." $script || RESTORE_EXIT_CODE=$? fi done # Change back slapproxy database to have all instances started log_message "Set instances as to start after takeover..." $SQLITE3 $DATABASE "update partition11 set requested_state='started';" # Write exit code to an arbitrary file that will be checked by promise/monitor log_message "Writing status file... End" echo $RESTORE_EXIT_CODE > $RESTORE_EXIT_CODE_FILE exit $RESTORE_EXIT_CODE