scripts/cluster/apt.check.update.sh

228 lines
5.4 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
# This script will check if any APT upgrade is available and
# will prepare the host in order to apply upgrade with another script
# 1. Create a temp file
# 2. Disable SGE queue
# This script can be call by a cronjob (eg. weekly)
# Another script should try to apply upgrades also with cron (eg. hourly)
# Vars {{{
readonly PROGNAME=$(basename "${0}")
readonly PROGDIR=$(readlink -m $(dirname "${0}"))
readonly ARGS="${*}"
readonly NBARGS="${#}"
[ -z "${DEBUG}" ] && DEBUG=1
## Export DEBUG for sub-script
export DEBUG
readonly APT_TMP_FILE="/tmp/.apt.upgrade"
## Colors
readonly PURPLE='\033[1;35m'
readonly RED='\033[0;31m'
readonly RESET='\033[0m'
readonly COLOR_DEBUG="${PURPLE}"
# }}}
usage() { # {{{
cat <<- EOF
usage: $PROGNAME
Verify if any APT package upgrade is available and
try to prepare the host by:
* Disabling SGE queue
EXAMPLES:
- Verify upgrade and prepare the current host
${PROGNAME}
OPTIONS:
-d,--debug
Enable debug messages.
-h,--help
Print this help message.
EOF
}
# }}}
debug_message() { # {{{
local_message="${1}"
## Print message if DEBUG is enable (=0)
[ "${DEBUG}" -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' "DEBUG ${PROGNAME}: ${local_message}"
return 0
}
# }}}
is_apt_upgrade_absent() { # {{{
## Count the number of upgradable packages and substract 1 for the header
local_apt_upgrade_number="$(apt list --upgradable 2>/dev/null \
| wc -l \
| awk '{print $1-1}')"
case "${local_apt_upgrade_number}" in
0 ) ## No available upgrade
return_apt_upgrade_absent="0"
;;
* ) ## Upgrade seems available
return_apt_upgrade_absent="1"
;;
esac
## Simple debug message to valid current variable
debug_message "is_apt_upgrade_absent \
APT upgrade available for this system: ${RED}${local_apt_upgrade_number:=/dev/null}${COLOR_DEBUG}."
return "${return_apt_upgrade_absent}"
}
# }}}
is_apt_upgrade_present() { # {{{
## Count the number of upgradable packages and substract 1 for the header
local_apt_upgrade_number="$(apt list --upgradable 2>/dev/null \
| wc -l \
| awk '{print $1-1}')"
case "${local_apt_upgrade_number}" in
0 ) ## No available upgrade
return_apt_upgrade_present="1"
;;
* ) ## Upgrade seems available
return_apt_upgrade_present="0"
;;
esac
## Simple debug message to valid current variable
debug_message "is_apt_upgrade_present \
APT upgrade available for this system: ${RED}${local_apt_upgrade_number:=/dev/null}${COLOR_DEBUG}."
return "${return_apt_upgrade_present}"
}
# }}}
is_pending_job_empty() { # {{{
## Count the number of pending jobs (qw state only)
## Excluding root's jobs
local_pending_jobs="$(qstat -s p -u '*' \
| grep --count --perl-regexp -- "(?=.*?\bqw\b)((?!root).)*$")"
case "${local_pending_jobs}" in
0 ) ## Pending jobs list is empty
return_pending_job_empty="0"
;;
* ) ## Some jobs are waiting
return_pending_job_empty="1"
;;
esac
## Simple debug message to valid current variable
debug_message "is_pending_job_empty \
Pending jobs for the compute cluster: ${RED}${local_pending_jobs:=/dev/null}${COLOR_DEBUG}."
return "${return_pending_job_empty}"
}
# }}}
main() { # {{{
sge_disable_host_queue_script="${PROGDIR}/sge.disable.host.queue.sh"
## If NO APT package upgrade is available {{{
### Ensure to remove any temp file related to APT upgrades
### Exit
is_apt_upgrade_absent \
&& rm -f -- "${APT_TMP_FILE}" \
&& exit 0
## }}}
## If pending job list is empty AND {{{
## APT package upgrade is available
### Create a temp file
### Disable SGE queue
is_pending_job_empty \
&& is_apt_upgrade_present \
&& touch "${APT_TMP_FILE}" && echo "APT upgrade is available." >> "${APT_TMP_FILE}" \
&& sh "${sge_disable_host_queue_script}" \
&& exit 0
## }}}
## If APT package upgrade is available {{{
### Create a temp file
### Disable SGE queue
is_apt_upgrade_present \
&& touch "${APT_TMP_FILE}" && echo "APT upgrade is available." >> "${APT_TMP_FILE}" \
&& sh "${sge_disable_host_queue_script}" \
&& exit 0
## }}}
}
# }}}
# Manage arguments # {{{
# This code can't be in a function due to arguments
if [ ! "${NBARGS}" -eq "0" ]; then
manage_arg="0"
## If the first argument is not an option
if ! printf -- '%s' "${1}" | grep -q -E -- "^-+";
then
## Print help message and exit
printf '%b\n' "${RED}Invalid option: ${1}${RESET}"
printf '%b\n' "---"
usage
exit 1
fi
# Parse all options (start with a "-") one by one
while printf -- '%s' "${1}" | grep -q -E -- "^-+"; do
case "${1}" in
-d|--debug ) ## debug
DEBUG=0
;;
-h|--help ) ## help
usage
## Exit after help informations
exit 0
;;
* ) ## unknow option
printf '%b\n' "${RED}Invalid option: ${1}${RESET}"
printf '%b\n' "---"
usage
exit 1
;;
esac
debug_message "Arguments management \
${RED}${1}${COLOR_DEBUG} option managed."
## Move to the next argument
shift
manage_arg=$((manage_arg+1))
done
debug_message "Arguments management \
${RED}${manage_arg}${COLOR_DEBUG} argument(s) successfully managed."
else
debug_message "Arguments management \
No arguments/options to manage."
fi
# }}}
main
exit 255