Skip to content
Snippets Groups Projects
check_iml_backup_server 5.33 KiB
#!/bin/bash
# ======================================================================
#
# Check IML BACKUP SERVER
#
# requires access to storage_helper.sh
# in /opt/imlbackup/server/
#
# ----------------------------------------------------------------------
# 2020-07-27  v0.x  <axel.hahn@iml.unibe.ch>
# 2023-12-20  v0.2  <axel.hahn@iml.unibe.ch>
# 2023-12-21  v1.0  <axel.hahn@iml.unibe.ch>  first version
# 2023-12-21  v1.1  <axel.hahn@iml.unibe.ch>  Update help text
# 2024-03-22  v1.2  <axel.hahn@iml.unibe.ch>  Update grep for backup via restic rest
# ======================================================================


. $(dirname $0)/inc_pluginfunctions
export self_APPVERSION=1.2

sInstalldir=/opt/imlbackup/server
sScript=storage_helper.sh
sMode=

# ----------------------------------------------------------------------
# FUNCTIONS
# ----------------------------------------------------------------------

# show help
function showHelp(){
    local _self; _self=$(basename $0)
    cat <<EOF
$( ph.showImlHelpHeader )

Show status of backup server.
You can get the count of connections or the status of server backup.

See https://os-docs.iml.unibe.ch/iml-backup-server/

SYNTAX:

  $_self [-d DIRECTORY] -m MODE

OPTIONS:

  -h, --help
      show this help.

  -d, --dir PATH
      set installation dir of iml deployment to find its check skript
      default dir: ${sInstalldir}
      script: ${sInstalldir}/${sScript}

  -m, --mode MODE
      mode: set type of result; one of status|backupstatus
        backupstatus  status of backup sets of all servers
        status        count of connected servers

EXAMPLE:

  $_self -m status 
  $_self -m backupstatus 

EOF
}

# get all server entries with a given status
# param  string  status character in 1st column; one of .|?|D|E
# param  string  text to parse
function _getServerOfStatus(){
    local _key="$1"
    local _data="$2"
    # grep "$_key .*| [0-9].* |" <<< "$_data"
    grep "$_key .*/" <<< "$_data"
}

# get count of servers with a given status
# param  string  status character in 1st column; one of .|?|D|E
# param  string  text to parse
function _getStatusCount(){
    _getServerOfStatus "$1" "$2" | wc -l
}

# ----------------------------------------------------------------------
# MAIN
# ----------------------------------------------------------------------

# --- check param -h
while [[ "$#" -gt 0 ]]; do case $1 in
    -h|--help)      showHelp; exit 0;;
    -d|--dir)       sInstalldir=$2; shift ;shift;;
    -m|--mode)      sMode=$2;
                    shift ;shift
                    if ! grep -E "^(status|backupstatus)$" <<< "$sMode" >/dev/null; then
                        ph.abort "ERROR: unknown mode [$sMode]."
                    fi
                    ;;
    *) echo "ERROR: Unknown parameter: $1"; showHelp; exit 1;
esac; done

if [ -z "$sMode" ]; then
    ph.abort "ERROR: The mode was not set. Use parameter -m for it. Get help with -h."
fi

myscript="$sInstalldir/$sScript"

if [ ! -x "$myscript" ]; then
    ph.abort "UNKNOWN: $myscript is not available / executable. Use -d to fix the installation dir. Get help with -h."
fi

# --- read data + remove ansii colors
data=$( "$myscript" "$sMode" | sed 's/\x1B\[[0-9;]\{1,\}[A-Za-z]//g' )

case "$sMode" in
    "backupstatus")
        typeset -i iTotal;   iTotal=$(  grep "^total : " <<< "$data" | cut -f 2 -d ":" | awk '{ print $1 }' )
        typeset -i iErrors;  iErrors=$( grep "^errors: " <<< "$data" | cut -f 2 -d ":")

        typeset -i iOK;         iOK=$(         _getStatusCount "\." "$data" )
        typeset -i iNotStarted; iNotStarted=$( _getStatusCount "\?" "$data")
        typeset -i iDisable;    iDisable=$(    _getStatusCount "D"  "$data" )
        typeset -i iRunning;    iRunning=$(    _getStatusCount "R"  "$data")

        if [ $iErrors -gt 0 ]; then
            ph.setStatus critical
        fi
        if [ $iNotStarted -eq $iTotal ]; then
            ph.setStatus unknown
        fi
        ph.status "Server Backups - $iTotal servers in backup - $iErrors errors - $iDisable disbled - $iRunning running"
        echo "List of server backups grouped by status (non-OK only)"
        echo
        (
            # draw 1st line with table header
            echo "$data" | grep "server.*start.*end"
            echo

            # show servers grouped by status
            for mystatus in E D R "\?"
            do
                srvlist=$( _getServerOfStatus "$mystatus" "$data" )
                test -n "$srvlist" && ( echo "$srvlist"; echo )
            done
            echo "$data" | grep "server.*start.*end"
            echo
        ) | tr '|' ':'

        ph.perfadd "notstarted"   "${iNotStarted}"   "" "" 0 $iTotal
        ph.perfadd "disabled"     "${iDisable}"      "" "" 0 $iTotal
        ph.perfadd "ok"           "${iOK}"           "" "" 0 $iTotal
        ph.perfadd "running"      "${iRunning}"      "" "" 0 $iTotal
        ph.perfadd "error"        "${iErrors}"       "" "" 0 $iTotal
        ;;
    "status")
        typeset -i iRunning; iRunning=$( grep "STATUS" <<< "$data" | cut -f 2 -d " ")
        typeset -i iMax;     iMax=$(     grep "STATUS" <<< "$data" | cut -f 8 -d " " | tr -d '.')

        # --- status output
        ph.status "Backups running: $iRunning (max $iMax)"
        # echo "$data"

        ph.perfadd "running"   "${iRunning}"   "" "" 0 $iMax
        ;;
esac

ph.exit

# ----------------------------------------------------------------------