Skip to content

Commit

Permalink
greenboot: add feature to disable healthchecks
Browse files Browse the repository at this point in the history
Addresses fedora-iot#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 <[email protected]>
  • Loading branch information
djach7 committed Apr 3, 2024
1 parent 332e5e3 commit 6d03294
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 1 deletion.
9 changes: 8 additions & 1 deletion etc/greenboot/greenboot.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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
# 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=("")
47 changes: 47 additions & 0 deletions usr/libexec/greenboot/greenboot
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 6d03294

Please sign in to comment.