You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ngcpcfg/scripts/status

189 lines
5.3 KiB

#!/bin/bash
# Purpose: display state of ngcpcfg setup and pending/recommended actions
################################################################################
set -e
set -u
set -o pipefail
# support testsuite
FUNCTIONS="${FUNCTIONS:-/usr/share/ngcp-ngcpcfg/functions/}"
if ! [ -r "${FUNCTIONS}"/main ] ; then
printf "Error: %s/main could not be read. Exiting.\n" "${FUNCTIONS}">&2
exit 1
fi
timestamp_replacementchars=''
. "${FUNCTIONS}"/main
# main script
if ! [ -d "${NGCPCTL_MAIN:-}" ] ; then
log_error "Directory ${NGCPCTL_MAIN:-} does not exist yet. Execute 'ngcpcfg initialise'."
exit 1
fi
usage() {
printf "ngcpcfg status -- supported command line options:
--local-only - do not check state on any remote host(s) (HA/PRO only)\n\n"
}
# shellcheck disable=SC2034
{
# used on ngcpcfg-ha/functions/ha_features.execute_check_remote()
CHECK_REMOTE=true
REMOTE_INVOKED=false
while [ -n "${1:-}" ] ; do
case "$1" in
*--local-only*) CHECK_REMOTE=false ; shift ;;
*--remote*) REMOTE_INVOKED=true ; shift ;; # used when invoking ngcpcfg status remotely
*--help*) usage ; exit 0 ;;
*) break ;;
esac
done
}
check_local_state() {
log_debug "check_local_state"
log_debug "cd $NGCPCTL_MAIN"
cd "$NGCPCTL_MAIN"
log_info "Checking state of ngcpcfg:"
if ! [ -r /etc/ngcp-config/.git/HEAD ] ; then
log_warn "ngcpcfg has not been initialised yet. Execute 'ngcpcfg initialise'."
exit 0
fi
log_info "OK: has been initialised already"
log_info "Checking state of configuration files:"
log_debug "git status | grep -qE 'working (directory|tree) clean"
if git status | grep -qE 'working (directory|tree) clean' ; then
log_info "OK: nothing to commit"
else
if git diff-index --name-only HEAD | grep -q . ; then
log_info "ACTION_NEEDED: configuration files have been modified:"
log_debug "git diff-index --name-only HEAD | sed \"s;^;${NGCPCTL_MAIN}/;\""
git diff-index --name-only HEAD | sed "s;^;${NGCPCTL_MAIN}/;" | sed "s/^/$timestamp_replacementchars/"
fi
if git ls-files --other --exclude-standard | grep -q . ; then
log_info "ACTION_NEEDED: configuration files have been added:"
log_debug "git ls-files --other --exclude-standard | sed \"s;^;${NGCPCTL_MAIN}/;\""
git ls-files --other --exclude-standard | sed "s;^;${NGCPCTL_MAIN}/;" | sed "s/^/$timestamp_replacementchars/"
fi
log_info "-> execute 'ngcpcfg build' and 'ngcpcfg commit'"
fi
}
check_etc_state() {
log_debug "check_etc_state"
log_debug "cd /etc"
cd /etc
log_info "Checking state of /etc files:"
log_debug "git status | grep -qE 'working (directory|tree) clean'"
if git status | grep -qE 'working (directory|tree) clean' ; then
log_info "OK: nothing to commit"
else
log_info "ACTION_NEEDED: configuration files changed (execute 'etckeeper commit [message]')"
fi
}
check_branch() {
log_info "Checking currently active branch:"
local current_branch=$(compare_active_branch 'master')
if [ "$current_branch" = 'master' ] ; then
log_info "OK: branch master active"
else
log_info "ACTION_NEEDED: branch '$current_branch' active - please switch to branch 'master'"
fi
}
check_push() {
if type -p execute_check_shared_storage &>/dev/null ; then
log_debug "execute_check_shared_storage function, action 'push'"
execute_check_shared_storage push
fi
}
check_shared_storage() {
if type -p execute_check_shared_storage &>/dev/null ; then
log_debug "execute_check_shared_storage function, action all"
execute_check_shared_storage all
fi
}
check_remote() {
if type -p execute_check_remote &>/dev/null ; then
log_debug "execute_check_remote function"
execute_check_remote
fi
}
check_reboot_requests() {
log_debug "check_requested_reboot"
log_info "Checking for pending reboot requests:"
if [ -f "${RUN_DIR}/reboot-required" ]; then
log_info "ACTION_NEEDED: configuration, service or system changes requested a reboot"
log_info "-> reboot the system at your earliest convenience"
else
log_info "OK: no reboot requested"
fi
}
check_pending_build() {
log_debug "$FUNCNAME"
log_debug "cd $NGCPCTL_MAIN"
cd "$NGCPCTL_MAIN"
log_info "Checking state of pending builds:"
local latest_commit=$(git log -1 --format="%H")
log_debug "latest_commit = $latest_commit"
if ! [ -f "${STATE_FILES_DIR}/build" ] ; then
log_debug "File ${STATE_FILES_DIR}/build doesn't exist."
log_info "OK: no build/apply executed yet, nothing to do"
return 0
fi
local latest_build_commit=$(cat "${STATE_FILES_DIR}/build")
log_debug "latest_build_commit = $latest_build_commit"
if [ -n "$latest_commit" ] && [ -n "$latest_build_commit" ] ; then
if [ "$latest_build_commit" = "dirty" ] ; then
log_info "OK: nothing to build (latest build newer than latest commit)"
elif [ "$latest_commit" = "$latest_build_commit" ] ; then
log_info "OK: nothing to build"
else
log_info "ACTION_NEEDED: commits without according build identified"
log_info "-> execute either 'ngcpcfg build' or 'ngcpcfg apply'"
fi
fi
}
if [ -z "${1:-}" ] ; then
check_local_state
check_branch
check_push
check_etc_state
check_pending_build
check_shared_storage "$@"
check_reboot_requests
fi
check_remote "$@"
## END OF FILE #################################################################