diff --git a/etc/greenboot/greenboot.conf b/etc/greenboot/greenboot.conf index 3cae5ff..e3bd8a9 100644 --- a/etc/greenboot/greenboot.conf +++ b/etc/greenboot/greenboot.conf @@ -12,4 +12,11 @@ GREENBOOT_WATCHDOG_CHECK_ENABLED=true ### This variable is the number of hours after an upgrade that we consider ### the new deployment as culprit of reboot. ### It has to be a positive integer. Defaults to 24 (hours). -# GREENBOOT_WATCHDOG_GRACE_PERIOD=24 \ No newline at end of file +# GREENBOOT_WATCHDOG_GRACE_PERIOD=24 + +### This variable allows you to specify healthchecks to be skipped. +### The healthcheck must be specified by script name, as in the +### example below. Multiple healthchecks may be skipped by separating +### the script names with spaces. +### DISABLED_HEALTHCHECKS=("01_repository_dns_check.sh 02_watchdog.sh") +DISABLED_HEALTHCHECKS=("") diff --git a/usr/libexec/greenboot/greenboot b/usr/libexec/greenboot/greenboot index 87405a3..3864125 100755 --- a/usr/libexec/greenboot/greenboot +++ b/usr/libexec/greenboot/greenboot @@ -7,6 +7,53 @@ SCRIPTS_CHECK_PATHS=("/usr/lib/greenboot/check" "/etc/greenboot/check") SCRIPTS_GREEN_PATHS=("/usr/lib/greenboot/green.d" "/etc/greenboot/green.d") SCRIPTS_RED_PATHS=("/usr/lib/greenboot/red.d" "/etc/greenboot/red.d") +source_configuration_file() { + GREENBOOT_CONFIGURATION_FILE=/etc/greenboot/greenboot.conf + if test -f "$GREENBOOT_CONFIGURATION_FILE"; then + source $GREENBOOT_CONFIGURATION_FILE + fi +} + +source_configuration_file +function exists_in_list { + VALUE=$1 + echo "${DISABLED_HEALTHCHECKS,,}" | tr " " '\n' | grep -F -q -x "$VALUE" +} + +script_runner () { + local scripts_dir=$1; shift + local mode=$1; shift + local start_msg=$1; shift + local required_hc_failed=false + echo "$start_msg" + for script in $(find "$scripts_dir" -name '*.sh' | sort); do + if exists_in_list "$(basename "$script")"; then + echo "'$(basename "$script")' was skipped, as specified in config" + else + local rc=0 + systemd-cat -t "$(basename "$script")" bash "$script" || rc=$? + if [ $rc -ne 0 ]; then + local failure_msg + failure_msg="Script '$(basename "$script")' FAILURE (exit code '$rc')" + case "$mode" in + "relaxed") + echo "<2>$failure_msg. Continuing..." >&2 + ;; + "strict") + required_hc_failed=true + echo "<0>$failure_msg. Continuing..." >&2 + esac + else + echo "<6>Script '$(basename "$script")' SUCCESS" + fi + fi + done + + if [[ $required_hc_failed == true ]]; then + exit 1 + fi +} + script_runner () { local scripts_dir=$1; shift local mode=$1; shift