#!/bin/bash
# 
# check_longhorn_volumes_backup
#
# Author        : Nohaj
# Contact       : johan@slashroot.fr
# Date          : 02/02/22
# Version       : 1.0
# Description   : Basic script to check that the volume are backed up
# Require       : kubectl utility with a configured access to a k8s cluster
#               : the name of the reccuring job in the $LH_BACKUP_JOB variable
# Optional      : a list of namespaces to exclude ($LH_NS_EXCLUDE variable)
#               : a list of volumes to exclude ($LH_VOL_EXCLUDE variable)
#

#
# Variables and checks
#
temp_ok=$(mktemp)
temp_err=$(mktemp)
err=0
ok=0
source /etc/profile.d/env.sh

# This script needs kubectl
type kubectl &> /dev/null || { echo >&2 "UNKNOWN: This script need the kubectl utility to run."; exit 3; }

# Check kubectl command
if ( ! kubectl get volumes -n longhorn-system &> /dev/null ) ; then
    echo "UNKNOWN: Kubectl command doesn't seems to be working"
    exit 3
fi

# Source config file
if [[ -z "$LH_BACKUP_JOB" ]] ; then
    echo "UNKNOWN: We need a backup reccuring job name"
    exit 3
fi

# Date now
date_now=$(date +%s)

#
# Let's go
#
for volume in $(kubectl get volumes -n longhorn-system | awk '{print $1}' | sed 1d) ; do
    volume_json=$(kubectl get volume -n longhorn-system $volume -o json)
    volume_ns=$(echo $volume_json | jq -r .status.kubernetesStatus.namespace)
    volume_pvc_name=$(echo $volume_json | jq -r .status.kubernetesStatus.pvcName)
    volume_name="$volume_ns/$volume_pvc_name"
    if ( ! echo $LH_BACKUP_NS_EXCLUDE | grep -q "$volume_ns\," ) && ( ! echo $LH_BACKUP_VOL_EXCLUDE | grep -q $volume_pvc_name ) ; then 
        if [[ $(kubectl get volume -n longhorn-system $volume -o json | jq -r '.metadata.labels."recurring-job.longhorn.io/'$LH_BACKUP_JOB'"') == "enabled" ]] ; then
            volume_last_backup=$(echo $volume_json | jq -r .status.lastBackupAt)
            volume_last_backup_ts=$(date  -d "$volume_last_backup" +%s)
            diff_time=$((date_now-volume_last_backup_ts))
            if [[ $diff_time -gt 86400 ]] ; then
                echo "$volume_name" >> $temp_err
                err=$((err+1))
            else
                echo "$volume_name" >> $temp_ok
                ok=$((ok+1))
            fi
        fi
    fi
done

if [[ $err -gt 0 ]] ; then
    if [[ $err -eq 1 ]] ; then
        echo "WARNING: 1 volume n'a pas ete sauvegarde aujourd'hui"
    else
        echo "WARNING: $err volumes n'ont pas etes sauvegardes aujourd'hui"
    fi
    sort $temp_err
    rm -f $temp_err $temp_ok
    exit 1
fi

if [[ $err -eq 0 ]] ; then
    echo "OK: Tous les volumes ont ete sauvegardes aujourd'hui"
    sort $temp_ok
    rm -f $temp_err $temp_ok
    exit 0
fi

echo "UNKNOWN: "
exit 3

