EVOLUTION-MANAGER
Edit File: ntopng-utils-manage-updates
#!/bin/bash # bin paths LSB_RELEASE="/usr/bin/lsb_release -i" APT_GET="/usr/bin/apt-get" YUM="/usr/bin/yum" NTOPNG_CONFIG_TOOL="/usr/bin/ntopng-utils-manage-config" REDIS_CLI="/usr/bin/redis-cli" PRODUCT="ntopng" # redis keys REDIS_CHECK_FOR_UPDATES_KEY="ntopng.updates.check_for_updates" REDIS_NEW_VERSION_AVAILABLE_KEY="ntopng.updates.new_version" REDIS_RUN_UPGRADE_KEY="ntopng.updates.run_upgrade" REDIS_UPGRADE_FAILURE_KEY="ntopng.updates.upgrade_failure" REDIS_AUTO_UPDATES_KEY="ntopng.prefs.is_autoupdates_enabled" REDIS_IN_PROGRESS_KEY="ntopng.updates.in_progress" ACTION="" QUIET=true LOGFILE_BASE="/var/log/ntopng-updates" LOGFILE="${LOGFILE_BASE}.log" RETAIN_NUM_LINES=1000 # Required by apt-get on Ubuntu 18 to run in non interactive mode export DEBIAN_FRONTEND="noninteractive" # Workaround for third-party installers not using absolute paths export PATH="$PATH:/sbin:/usr/sbin" # Read redis connection info REDIS_INFO=$(${NTOPNG_CONFIG_TOOL} -a print-redis-info) HOST=$(echo ${REDIS_INFO} | cut -d'=' -f2 | cut -d'@' -f1 | cut -d':' -f1) PORT=$(echo ${REDIS_INFO} | cut -d'=' -f2 | cut -d'@' -f1 | cut -d':' -f2 -s) PSWD=$(echo ${REDIS_INFO} | cut -d'=' -f2 | cut -d'@' -f1 | cut -d':' -f3 -s) DBID=$(echo ${REDIS_INFO} | cut -d'@' -f2 -s) REDIS_CLI_OPT="" if [ ! -z "${HOST}" ]; then REDIS_CLI_OPT="${REDIS_CLI_OPT}-h ${HOST} " fi if [ ! -z "${PORT}" ]; then REDIS_CLI_OPT="${REDIS_CLI_OPT}-p ${PORT} " fi if [ ! -z "${PSWD}" ]; then REDIS_CLI_OPT="${REDIS_CLI_OPT}-a ${PSWD} " fi if [ ! -z "${DBID}" ]; then REDIS_CLI_OPT="${REDIS_CLI_OPT}-n ${DBID} " fi # Detect OS OS="DEBIAN" REDHAT=$(${LSB_RELEASE} | grep -i "CentOS\|RedHat") if [ ! -z "${REDHAT}" ]; then OS="REDHAT" fi if [ "${OS}" == "DEBIAN" ]; then # Check for nEdge if dpkg --get-selections | grep -q "^nedge[[:space:]]*install$" >/dev/null; then PRODUCT="nedge" fi fi # Log init function logsetup { if [ ! -z "$1" ]; then LOGFILE="${LOGFILE_BASE}-$1.log" fi TMP=$(tail -n $RETAIN_NUM_LINES $LOGFILE 2>/dev/null) && echo "${TMP}" > $LOGFILE exec > >(tee -a $LOGFILE) exec 2>&1 } # Log function log { echo "$(date +"%b %d %T"): $*" } # Help function print_usage() { echo "${PRODUCT} updates utility" echo "" echo "Usage:" echo "`basename $0` -a check-updates" echo "`basename $0` -a check-updates-on-demand" echo "`basename $0` -a handle-upgrade-requests" echo "" echo "[-a check-updates]" echo "`basename $0` -a check-updates" echo "Check for ${PRODUCT} updates." echo "" echo "[-a check-updates-on-demand]" echo "`basename $0` -a check-updates-on-demand" echo "Check for requests for checking ${PRODUCT} updates." echo "" echo "[-a handle-upgrade-requests]" echo "`basename $0` -a handle-upgrade-requests" echo "Check for update requests and update ${PRODUCT}." echo "" } # Uncomment to enable logging #logsetup $ACTION #log Requested $ACTION POSITIONAL=() while [[ $# -gt 0 ]] do key="$1" case $key in -a|--action) ACTION="$2" shift shift ;; -v|--verbose) QUIET=false shift ;; *) POSITIONAL+=("$1") shift ;; esac done set -- "${POSITIONAL[@]}" # restore positional parameters if [[ ( $ACTION != "check-updates" && $ACTION != "check-updates-on-demand" && $ACTION != "handle-upgrade-requests" ) ]]; then print_usage exit 1 fi function stall_check() { INSTANCES=$(pgrep -fc "$0 -a ${ACTION}") if [ $INSTANCES -gt 2 ]; then #echo "Another instance is running with the same action" exit 0 fi } # Check if the user requested a ntopng update, and upgrade it in case function run_upgrade() { RESULT=1 # Check if upgrade is in progress (it can take more than 1 min) IN_PROGRESS=$(${REDIS_CLI} ${REDIS_CLI_OPT} GET ${REDIS_IN_PROGRESS_KEY} 2>/dev/null | grep 1) if [ "${IN_PROGRESS}" == "1" ]; then return fi # Set "in progress" flag ${REDIS_CLI} ${REDIS_CLI_OPT} SET ${REDIS_IN_PROGRESS_KEY} "1" EX 3600 2>&1 >/dev/null if [ "${OS}" == "DEBIAN" ]; then # Debian or Ubuntu # Update repo index ${APT_GET} update -o Dir::Etc::sourcelist="sources.list.d/ntop-stable.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" # Install ${APT_GET} upgrade --assume-yes --fix-broken --allow-unauthenticated ${PRODUCT} RESULT=$? # Check if installation is successful (we do not trust $?) NTOPNG_VERSION=$(${APT_GET} --just-print upgrade 2>&1 | grep "Inst ${PRODUCT} " | cut -d'(' -f2 | cut -d' ' -f1) if [ -z "${NTOPNG_VERSION}" ]; then RESULT=0 fi else # CentOS # Install ${YUM} clean all ${YUM} check-update ${PRODUCT} ${YUM} -y install ${PRODUCT} RESULT=$? fi if [ $RESULT -eq 0 ]; then [ $QUIET = false ] && echo "${PRODUCT} updated successfully" # Cleanup new version available key ${REDIS_CLI} ${REDIS_CLI_OPT} DEL ${REDIS_NEW_VERSION_AVAILABLE_KEY} 2>&1 >/dev/null ${REDIS_CLI} ${REDIS_CLI_OPT} DEL ${REDIS_UPGRADE_FAILURE_KEY} 2>&1 >/dev/null else [ $QUIET = false ] && echo "Unable to update" ${REDIS_CLI} ${REDIS_CLI_OPT} SET ${REDIS_UPGRADE_FAILURE_KEY} "upgrade-failure" 2>&1 >/dev/null fi # Cleanup "in progress" flag ${REDIS_CLI} ${REDIS_CLI_OPT} DEL ${REDIS_IN_PROGRESS_KEY} 2>&1 >/dev/null # Cleanup upgrade request key if any ${REDIS_CLI} ${REDIS_CLI_OPT} DEL ${REDIS_RUN_UPGRADE_KEY} 2>&1 >/dev/null } # Check for new ntopng updates available function check_updates() { NTOPNG_VERSION="" RESULT=1 if [ "${OS}" == "DEBIAN" ]; then # Debian or Ubuntu # Update repo index ${APT_GET} update -o Dir::Etc::sourcelist="sources.list.d/ntop-stable.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" # Check for broken packages ${APT_GET} --just-print upgrade 2>&1 >/dev/null if [ ! $? -eq 0 ]; then # Something went wrong, trying to fix it ${APT_GET} --assume-yes --fix-broken install ${APT_GET} --just-print upgrade 2>&1 >/dev/null fi if [ ! $? -eq 0 ]; then # Something went wrong, unable to fix it ${REDIS_CLI} ${REDIS_CLI_OPT} SET ${REDIS_UPGRADE_FAILURE_KEY} "upgrade-failure" 2>&1 >/dev/null else # Check update and get version NTOPNG_VERSION=$(${APT_GET} --just-print --assume-yes upgrade 2>&1 | grep "Inst ${PRODUCT} " | cut -d'(' -f2 | cut -d' ' -f1) RESULT=0 fi else # CentOS # Check update and get version ${YUM} clean all NTOPNG_VERSION=$(${YUM} check-update ${PRODUCT} | grep ${PRODUCT} | tr -s ' ' | cut -d' ' -f2) RESULT=0 fi # If there is an update, set new version on redis, otherwise delete the current version (if any) if [ ! -z "${NTOPNG_VERSION}" ]; then ${REDIS_CLI} ${REDIS_CLI_OPT} SET ${REDIS_NEW_VERSION_AVAILABLE_KEY} ${NTOPNG_VERSION} EX 86400 2>&1 >/dev/null # Check if automatic updates are enabled AUTO_UPDATES=$(${REDIS_CLI} ${REDIS_CLI_OPT} GET ${REDIS_AUTO_UPDATES_KEY} 2>/dev/null | grep 1) if [ "${AUTO_UPDATES}" == "1" ]; then run_upgrade fi else ${REDIS_CLI} ${REDIS_CLI_OPT} DEL ${REDIS_NEW_VERSION_AVAILABLE_KEY} 2>&1 >/dev/null if [ $RESULT -eq 0 ]; then ${REDIS_CLI} ${REDIS_CLI_OPT} DEL ${REDIS_UPGRADE_FAILURE_KEY} 2>&1 >/dev/null fi fi } # Check if the user requested a 'Check for updates' manually function check_updates_on_demand() { CHECK_FOR_UPDATES=$(${REDIS_CLI} ${REDIS_CLI_OPT} GET ${REDIS_CHECK_FOR_UPDATES_KEY} 2>/dev/null | grep 1) if [ "${CHECK_FOR_UPDATES}" == "1" ]; then stall_check check_updates ${REDIS_CLI} ${REDIS_CLI_OPT} DEL ${REDIS_CHECK_FOR_UPDATES_KEY} 2>&1 >/dev/null fi } # Check if the user requested a ntopng update, and upgrade it in case function handle_upgrade_requests() { # Check redis for upgrade requests UPGRADE=$(${REDIS_CLI} ${REDIS_CLI_OPT} GET ${REDIS_RUN_UPGRADE_KEY} 2>/dev/null | grep 1) if [ "${UPGRADE}" == "1" ]; then stall_check run_upgrade fi } # Run this cron script when the ntopng service is enabled only SERVICE_ENABLED=$(/bin/systemctl is-enabled ${PRODUCT} 2>/dev/null) if [ ! "${SERVICE_ENABLED}" == "enabled" ]; then exit 0 fi if [ $ACTION == "check-updates" ]; then check_updates elif [ $ACTION == "check-updates-on-demand" ]; then check_updates_on_demand elif [ $ACTION == "handle-upgrade-requests" ]; then handle_upgrade_requests else # never reached echo "Unknown action $ACTION" exit 1 fi exit 0