adn-agov-iam-admin-inventory/DEFAULT-ADN-AGOV-ADMIN-PROJECT/DEFAULT-ADN-AGOV-ADMIN-INV/idm-job-v1/var/opt/nevisidm/default/status.sh

145 lines
3.7 KiB
Bash
Executable File

#!/bin/bash
#
# NAME
# status.sh - Checks the status of the nevisIDM Service.
#
# SYNOPSIS
# status.sh
#
# DESCRIPTION
# Performs periodic checks until the service is up or broken or timeout is reached.
# The script terminates when the process of the service stops running.
# There are no arguments for this script.
#
# EXIT CODES
# 0 Service is up.
# 1 Service process is not running.
# 2 Service is broken.
# 3 Timeout reached.
# Defines how much we should sleep between checking if the service is up.
interval=1
# Defines how much we should wait the service to start up until we give up and exit.
timeout=180
((end_time=${SECONDS}+$timeout))
# Checks if the process of the service is still running.
# Arguments:
# None
# Returns:
# In case it is running, returns 0, otherwise non-zero (exit code of systemctl).
isProcessRunning() {
systemctl is-active --quiet nevisidm@default
IS_RUNNING=$?
return $IS_RUNNING
}
# Checks if the readiness (/health) management endpoint can be used for checking status.
# (nevisIDM introduced the readiness (/health) management endpoint in 2.73.1.15 version.)
# Arguments:
# None
# Returns:
# If the nevisIDM version is at least 2.73.1.15, returns 0.
# Otherwise returns 1.
canHealthCheckUsed() {
minimal=2.73.1.15
installed=`readlink -f /opt/nevisidm/bin | awk -F'/' '{print $4}' | sed 's/rc.*//'`
if [ "$installed" = "`echo -e "$installed\n$minimal" | sort -V | tail -n1`" ]; then
return 0
else
return 1
fi
}
# Checks if the service is up.
# Based on nevisIDM version uses different nevisIDM endpoints.
# Arguments:
# None
# Returns:
# The result of ServiceCheck function.
checkService() {
if canHealthCheckUsed; then
doServiceCheckHealth
return $?
else
doServiceCheckOld
return $?
fi
}
# Checks if the service is up. (Attempts connecting the service with curl.)
# In case the service is broken, exits with exit code 2.
# Arguments:
# None
# Returns:
# If the connection was successful and the service up (is not broken), returns 0.
# If the connection was not successful, returns the curl exit code.
doServiceCheckOld() {
HC=`curl --insecure --silent --output /dev/null --write-out "%{http_code}" https://idm-job-v1:8989/nevisidm/admin/`
CON=$?
if [ "$CON" -ne 0 ]; then
EXIT_CODE=$CON
elif [ $HC -ge 500 ]; then
echo "Service is broken (HTTP code $HC)."
exit 2
else
EXIT_CODE=0
fi
return $EXIT_CODE
}
# Checks if the service is up. (Attempts connecting the service with curl.)
# Note: With the health check endpoint there is no way fail early when the endpoint returns HTTP 503, because it can come up
# later and then return HTTP 200.
# Arguments:
# None
# Returns:
# If the connection was successful and the service up (is not broken), returns 0.
# If the connection was not successful, returns 1.
doServiceCheckHealth() {
HC=`curl --silent --output /dev/null --write-out "%{http_code}" http://0.0.0.0:8998/health`
CON=$?
if [ $HC -eq 200 ]; then
EXIT_CODE=0
else
EXIT_CODE=1
fi
return $EXIT_CODE
}
# This function encapsulates the logic of checking if the process is running and if the service is up.
# In case the process is not running, exits with exit code 1.
# Arguments:
# None
# Returns:
# If the service process is running, returns the result of the service check function.
check() {
if isProcessRunning
then
checkService
CS=$?
return $CS
else
echo "Process is not running."
exit 1
fi
}
# Check the status of the service periodically.
while ((${SECONDS} < ${end_time}))
do
sleep ${interval}
if check
then
echo "Service is up."
exit 0
fi
done
echo "Exceeded check timeout (${timeout}s). Service is down."
exit 3