#!/bin/bash
# Monitoring und Cleanup Script zur Ueberwachung der invis-Datensicherung mit invis-bbu
# (c) 2016,2020 Stefan Schaefer -- invis-server.org

# Version 0.8

# License: GPLv3
# Questions: info@invis-server.org

# Dieses Programm ist freie Software. Sie können es unter den Bedingungen der 
# GNU General Public License, wie von der Free Software Foundation veröffentlicht,
# weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder
# (nach Ihrer Option) jeder späteren Version.

# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen
# von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite 
# Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. 
# Details finden Sie in der GNU General Public License.

# Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem 
# Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>. 

## Logik
# Datensicherung ueberwachen
# Wenn eine der folgenden verschiedenen Programm Kombinationen aktiv ist, laeuft die Datensicherung
# 1: udbsync & dd
# 2: udbsync & bbackup
# Ist eine der beiden Kombis aktiv wird ein Dasi Flag in /var/spool/results gesetzt
# Sind beide Kombinationen nicht aktiv, und erfolgt keine Netzwerksicherung wird geschaut, ob
# mit Mounts und Snapshot-Volumes aufgeraeumt werden kann.

# Globale Einstellungen
confdir="/etc/invis"
netconffile="$confdir/bbunet.conf"
diskconffile="$confdir/bbudisk.conf"
logfile="/var/log/dasicleanup.log"


# Kontrollverzeichnis für Ergebnisdateien
controldirectory="/var/spool/results/backup"

getconfvalue() {
    cat $3 | grep "$1:" | cut -d ":" -f "$2"
}



# Disk-Backup Snapshot-Volume ermitteln
if [[ -f $diskconffile ]]; then
    volumegroup=$(getconfvalue "volumeGroup" "2" "$diskconffile")
    disksnapvol=$(getconfvalue "snapshotVolume" "2" "$diskconffile")
    scharf=$(getconfvalue "dasiMonitorAct" "2" "$diskconffile")
fi

# Prozesse suchen -> Disk-Backup
udbsyncact=`pgrep -x udbsync`
bbackupact=`pgrep -x bbackup`
ddact=`pgrep -x dd`

# Pruefen, ob Disk-Dasi laeuft
if [[ -n $udbsyncact && -n $bbackupact ]]; then
    dasiact="1"
fi

if [[ -n $udbsyncact && -n $ddact ]]; then
    dasiact="1"
fi

# Prozesse suchen -> Net-Backup
# Ist die Netzwerksicherung aktiv?
if [[ -f $netconffile ]]; then
    netbuactive=$(getconfvalue "netBackupActive" "2" "$netconffile")
    volumegroup=$(getconfvalue "volumeGroup" "2" "$netconffile")
    netsnapvol=$(getconfvalue "snapshotVolume" "2" "$netconffile")
    ((scharf=$scharf + $(getconfvalue "dasiMonitorAct" "2" "$diskconffile")))
fi

bbunetact=`pgrep -x bbunet`

if [[ $netbuactive == 1 && -n $bbunetact ]]; then
    dasiact="1"
fi

# ggf. Aufraeumen 
if [[ $dasiact == "1" ]]; then
    echo "Datensicherung aktiv"
    echo "1" > $controldirectory/buactive
else
    echo "Datensicherung inaktiv"
    echo "0" > $controldirectory/buactive
    if (( $scharf > 0 )); then
	datum=$(date "+%d.%m.%Y - %H:%M")
	echo "$datum: Aufräumen notwendig" > $logfile
	if [[ -n $disksnapvol ]]; then
	    svols[0]=$disksnapvol
	fi

	if [[ -n $netsnapvol ]]; then
	    svols[1]=$netsnapvol
	fi
    
	# Verwaiste Mounts entfernen
	while [[ `mount |grep /mnt/udevsync` ]]; do 
	    umount /mnt/udevsync
	done

	while [[ `mount |grep /mnt/backup` ]]; do 
	    umount /mnt/backup
	done

	# Dirty Workaround zum Entfernen stoerrischer Snapshot-Volumes
	for svol in ${svols[*]}; do
	    if [[ `lvscan | grep $svol` ]]; then
		ecode=1
		while [[ $ecode != 0 ]]; do
		    #echo $volumegroup
		    #echo $svol
		    /sbin/lvremove -f --noudevsync /dev/$volumegroup/$svol >> $logfile
		    ecode=${?} 
		    if [[ $ecode != 0 ]]; then
			echo "$datum - Das Backup-Volume konnte nicht gelöscht werden. Exit-Code: $ecode." >> $logfile
			sleep 2
		    else
		    echo "$datum - Backup-Volume wurde erfolgreich gelöscht." >> $logfile
		    fi
		done
	    fi
	done
    fi
fi
