#!/bin/bash
# 
# check_longhorn_volumes_backup_job
#
# Author        : Nohaj
# Contact       : johan@slashroot.fr
# Date          : 02/02/22
# Version       : 1.0
# Description   : Basic script to list the longhorn volumes without a backup strategy
# 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

#
# 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_pod=$(echo $volume_json | jq -r .status.kubernetesStatus.workloadsStatus[].podName)
    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
            echo "$volume_name" >> $temp_ok
            ok=$((ok+1))
        else
            echo "$volume_name" >> $temp_err
            err=$((err+1))
        fi
    fi
done

if [[ $err -gt 0 ]] ; then
    if [[ $err -eq 1 ]] ; then
        echo "WARNING: 1 volume n'a pas de job de backup"
    else
        echo "WARNING: $err volumes n'ont pas de job de backup"
    fi
    sort $temp_err
    rm -f $temp_err $temp_ok
    exit 1
fi

if [[ $err -eq 0 ]] ; then
    echo "OK: Tous les volumes ont un job de backup"
    sort $temp_ok
    rm -f $temp_err $temp_ok
    exit 0
fi

echo "UNKNOWN: "
exit 3

