From 6cc439e6fda923a6aa360eb29aa24cf5f609edb3 Mon Sep 17 00:00:00 2001 From: djach7 Date: Wed, 3 Apr 2024 14:58:03 -0400 Subject: [PATCH] greenboot: add feature to disable healthchecks Addresses #119. Allows users to specify healthchecks to be skipped via a DISABLED_HEALTHCHECKS variable in greenboot.conf. Skipped healthchecks will be reflected with an appropriate message in the logs. Signed-off-by: djach7 --- etc/greenboot/greenboot.conf | 11 +++++++- usr/libexec/greenboot/greenboot | 49 +++++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/etc/greenboot/greenboot.conf b/etc/greenboot/greenboot.conf index 3cae5ff..d3495ef 100644 --- a/etc/greenboot/greenboot.conf +++ b/etc/greenboot/greenboot.conf @@ -12,4 +12,13 @@ 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. +### NOTE: Script names must be spelled EXACTLY. Typos will result in +### unwanted behaviour. +### DISABLED_HEALTHCHECKS=(01_repository_dns_check.sh 02_watchdog.sh) +DISABLED_HEALTHCHECKS=(01_repository_dns_check.sh) diff --git a/usr/libexec/greenboot/greenboot b/usr/libexec/greenboot/greenboot index 87405a3..3c0e718 100755 --- a/usr/libexec/greenboot/greenboot +++ b/usr/libexec/greenboot/greenboot @@ -7,6 +7,23 @@ 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 + # shellcheck source=/etc/greenboot/greenboot.conf + source $GREENBOOT_CONFIGURATION_FILE + fi +} + +source_configuration_file +function is_disabled { + HEALTHCHECK=$1 + for DISABLED_HEALTHCHECK in "${DISABLED_HEALTHCHECKS[@]}"; do + if [ "${HEALTHCHECK}" == "${DISABLED_HEALTHCHECK}" ]; then return 0; fi + done + return 1 +} + script_runner () { local scripts_dir=$1; shift local mode=$1; shift @@ -14,21 +31,25 @@ script_runner () { local required_hc_failed=false echo "$start_msg" for script in $(find "$scripts_dir" -name '*.sh' | sort); do - 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 + if is_disabled "$(basename "$script")"; then + echo "'$(basename "$script")' was skipped, as specified in config" else - echo "<6>Script '$(basename "$script")' SUCCESS" + 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