#!/bin/bash
# vim:tabstop=2:softtabstop=0:shiftwidth=2:syntax=sh
# backup-lxc-container
#
#V15-001
#|=============================================================================|
#|                *** PROPRIETARY RIGHTS NOTICE ***                            |
#|   This material contains proprietary information of MULI Holdings P/L,      |
#|   Wahroonga, NSW, Australia and/or its licensor, embodying                  |
#|   "CONFIDENTIAL INFORMATION" ideas and expressions, no part of which may    |
#|   be reproduced or transmitted without permission of MULI Management P/L.   |
#|      ***  COPYRIGHT  1982 - 2016  ***  MULI Holdings P/L  ***               |
#|                          All rights reserved.                               |
#|=============================================================================|

###
###
#
# This script requires:
# 1) rsync
# 3) the corrrect entry in the host or dns for the virtual
# 2) the required Backup_prefix line below to be uncommented.
# 3) the corect crontab entry to be in place - use contab-muli-host as a templet
# 4) ssh certificates to be in lace for root to run this script.
# 5) the mb-usb-mount.sh script in /usr/local/scripts/
# 
# This script is to be scp'd to the root account on the Muli server.
# When this script is in place there uncomment the correct Backup_prefix line 
# and add in a crontab entry using the crontab-muli-host file as a template
#
###
###

# create abort function
send_failure_email ()
{
	mutt -s "`hostname`: FAILURE ${Virt_Host} backup log" -b ${Email_address_client} ${Email_address_muli} <  ${Log_File}
}

Email_address_muli=mulilg@muli.com.au
Email_address_client=${Email_address_muli}

if [ $# -lt 3 ] || [ $# -gt 4 ]; then
	mutt -s "`hostname`: backup log" -b ${Email_address_muli} <<!
Usage $0 expected: Virtual_hostname backup_type email_address [Samba hostname]
received: $*
!
	exit 1
fi

PREFIX=/var/lib/lxd/containers
## Parameter 1 Virtual hostname to backup
Virt_Host=$1

## Parameter 2 type of backup USB or NET if NET no copy to usb attempted
Backup_Type=$2
case ${Backup_Type} in
	"USB") ;;
  "NET") ;;
	*)	mutt -s "`hostname`: backup log" -b ${Email_address_muli} <<!
Usage $0 invalid backup_type - expected : Virtual_hostname [USB||NET] email_address [Samba hostname]
received $*
!
	exit 1;;
esac

## Parameter 3  Email address for client emails
if [[ $3 =~ .*\@.*\..* ]]; then
	Email_address_client=$3
else
	mutt -s "`hostname`: backup log" -b ${Email_address_muli} <<!
Usage $0 expected: Virtual_hostname backup_type email_address [Samba hostname]
received: $*
Bad email address in parameter 3
!
	exit 1
fi

## Paramater 4 if exists  if Samba hostname for additional backup
Do_Samba="N"
if [ $# -eq 4 ]; then
	Samba_Host=$4
	Do_Samba="Y"
fi

Backup_prefix=/backup

if [ ! -d "${Backup_prefix}" ];then
	mutt -s "`hostname`: ${Virt_Host} backup log" -b ${Email_address_client} ${Email_address_muli} <<!
failed no Backup_prefix=${Backup_prefix} on system!!
!
	exit 1
fi



#check on $Log_File
if [ ! -d ${Backup_prefix}/logs ];then
	mkdir ${Backup_prefix}/logs
	res=$?
	if [ ${res} -ne 0 ]; then
		mutt -s "`hostname`: {Virt_Host} backup log" -b ${Email_address_client} ${Email_address_muli} <<!
failed to make ${Backup_prefix}/logs
!
		send_failure_email
		exit 1
	fi
fi
	
Log_Dir=${Backup_prefix}/logs/${Virt_Host}
if [ ! -d ${Log_Dir} ];then
	mkdir ${Log_Dir}
	res=$?
	if [ ${res} -ne 0 ]; then
		mutt -s "`hostname`: {Virt_Host} backup log" -b ${Email_address_client} ${Email_address_muli} <<!
failed to make ${log_Dir}
!
		send_failure_email
		exit 1
	fi
fi
	
DST_virt=${Backup_prefix}/${Virt_Host}
if [ $Do_Samba = "Y" ]; then
	DST_samba=${Backup_prefix}/${Samba_Host}
fi
Daynum=`date +%j`
Log_File=${Log_Dir}/backup-${Virt_Host}_${Daynum}
Status_File=${Log_Dir}/BackupStatus-${Virt_Host}_${Daynum}


	
# redirect to log file
exec > ${Log_File} 2>&1

echo "${Virt_Host} Backup" > ${Status_File}
echo "START `date`" >> ${Status_File}
echo "arg list: $*" >>${Status_File}
echo "#### Backup of ${Virt_Host} ###"

echo "running mulipgbackup_all.sh for ${Virt_Host}"
echo

#check for rsync
rsync_prog=`which rsync`
if [ -z "$rsync_prog}" ]; then
  echo "Aborting 	rsync is missing"
  echo "FAIL Aborting rsync is missing `date`" >> ${Status_File}
	send_failure_email
	exit 1
fi

# check for hostname set
if [ -z "${Virt_Host}" ]; then
  echo "Aborting 	\$Virt_Host is NULL"
  echo "FAIL Aborting 	\$Virt_Host is NULL `date`" >> ${Status_File}
	send_failure_email
	exit 1
fi

# check hostname pings
ping -c1 ${Virt_Host} 2>&1 > /dev/null
res=$?
if [ ${res} -ne 0 ];then
	echo "Cannot ping ${Virt_Host} error: ${res}"
  echo "FAIL Aborting Cannot ping ${Virt_Host} error: ${res} `date`" >> ${Status_File}
	send_failure_email
	exit 1
fi

#check ${DST}
if [ ! -d ${DST_virt} ];then
	mkdir ${DST_virt}
	res=$?
	if [ ${res} -ne 0 ]; then
		echo "Failed to make directory ${DST_virt}"
    echo "FAIL Aborting Failed to make directory ${DST_virt}  `date`" >> ${Status_File}
		send_failure_email
		exit 1
	fi
fi

# kill running processes on virtual
echo "ssh root@${Virt_Host} su - root -l -c /usr/local/muli/scripts/muliX2gokill.sh"
echo "START ssh root@${Virt_Host} su - root -l -c /usr/local/muli/scripts/muliX2gokill.sh `date`" >> ${Status_File}

ssh root@${Virt_Host} su - root -l -c /usr/local/muli/scripts/muliX2gokill.sh
echo

# run backup dump rotate script
echo "ssh root@${Virt_Host} su - muliadm -l -c /usr/local/muli/scripts/mulipgbackup_all.sh"
echo "START ssh root@${Virt_Host} su - muliadm -l -c /usr/local/muli/scripts/mulipgbackup_all.sh `date`" >> ${Status_File}
ssh root@${Virt_Host} su - muliadm -l -c /usr/local/muli/scripts/mulipgbackup_all.sh
res=$?
if [ ${res} -ne 0 ]; then
	echo "dump script failed with ${res} "
  echo "FAIL Aborting dump script failed with ${res}  `date`" >> ${Status_File}
	send_failure_email
	exit 1
fi

date

# run LDAP backup dump script
echo "ssh root@${Virt_Host} su - root -l -c /usr/local/muli/scripts/ldap_backup.bash"
echo "START ssh root@${Virt_Host} su - root -l -c /usr/local/muli/scripts/ldap_backup.bash `date`" >> ${Status_File}
ssh root@${Virt_Host} su - root -l -c /usr/local/muli/scripts/ldap_backup.bash
res=$?
if [ ${res} -ne 0 ]; then
	echo "LDAP dump script failed with ${res} "
  echo "FAIL Aborting LDAP dump script failed with ${res}  `date`" >> ${Status_File}
	send_failure_email
	exit 1
fi

date




# check for usr/local/mulidata in backup partition
if [ ! -d ${DST_virt}/usr/local/mulidata ]; then
	mkdir -p ${DST_virt}/usr/local/mulidata
fi

echo "%% ${Virt_Host} /usr/local/mulidata to ${DST_virt}/ %%"
echo 
echo "${rsync_prog} -av  --delete ${PREFIX}/${Virt_Host}/rootfs/usr/local/mulidata/ ${DST_virt}/usr/local/mulidata/"
echo "START ${rsync_prog} -av  --delete ${PREFIX}/${Virt_Host}/rootfs/usr/local/mulidata/ ${DST_virt}/usr/local/mulidata/ `date`" >> ${Status_File}
${rsync_prog} -av  --delete ${PREFIX}/${Virt_Host}/rootfs/usr/local/mulidata/ ${DST_virt}/usr/local/mulidata/
res=$?
if [ ${res} -ne 0 ]; then
	echo "rsync of mulidata failed with ${res} "
  echo "FAIL Aborting rsync of /usr/local/mulidata failed with ${res}  `date`" >> ${Status_File}
	send_failure_email
	exit 1
fi

echo
# Check for etc in backup area
if [ ! -d ${DST_virt}/etc ];
	then mkdir -p ${DST_virt}/etc
fi

echo "%% ${Virt_Host} /etc to ${DST_virt}/etc/ %%"
echo 
echo "${rsync_prog} -av  --delete ${PREFIX}/${Virt_Host}/rootfs/etc/ ${DST_virt}/etc/"
echo "START ${rsync_prog} -av  --delete ${PREFIX}/${Virt_Host}/rootfs/etc/ ${DST_virt}/etc/ `date`" >> ${Status_File}
${rsync_prog} -av  --delete ${PREFIX}/${Virt_Host}/rootfs/etc/ ${DST_virt}/etc/
res=$?
if [ ${res} -ne 0 ]; then
	echo "rsync of ${Virt_Host}/etc failed with ${res} "
  echo "FAIL Aborting rsync of /etc failed with ${res}  `date`" >> ${Status_File}
	send_failure_email
	exit 1
fi
echo


if [ $Do_Samba = 'Y' ]; then

	while true
	do
		echo "%% SAMBA requested for ${Samba_Host} %%"
		echo "START %% SAMBA requested for ${Samba_Host} %% `date`" >> ${Status_File}
		# check hostname pings for samba
		ping -c1 ${Samba_Host} 2>&1 > /dev/null
		res=$?
		if [ ${res} -ne 0 ];then
			echo "Cannot ping ${Samba_Host} error: ${res}"
			echo "FAIL ping ${Samba_Host} error: ${res} `date`" >> ${Status_File}
			send_failure_email
			break
		fi

		#check ${DST}
		if [ ! -d ${DST_samba} ];then
			mkdir ${DST_samba}
			res=$?
			if [ ${res} -ne 0 ]; then
				echo "Failed to make directory ${DST_samba}"
				echo "FAIL Aborting Failed to make directory ${DST_samba}  `date`" >> ${Status_File}
				send_failure_email
				break
			fi
		fi

		# Check for etc in backup area
		if [ ! -d ${DST_samba}/etc ];
			then mkdir -p ${DST_samba}/etc
		fi
				
		echo "%% ${Samba_Host} /etc to ${DST_samba}/etc/ %%"
		echo 
		echo "START ${rsync_prog} -av  --delete ${PREFIX}/${Samba_Host}/rootfs/etc/ ${DST_samba}/etc/ `date`" >> ${Status_File}
		echo "${rsync_prog} -av  --delete ${PREFIX}${Samba_Host}/rootfs/etc/ ${DST_samba}/etc/"
		${rsync_prog} -av  --delete ${PREFIX}/${Samba_Host}/rootfs/etc/ ${DST_samba}/etc/
		res=$?
		if [ ${res} -ne 0 ]; then
			echo "rsync of ${Samba_Host}/etc failed with ${res} "
			echo "FAIL Aborting rsync of ${Samba_Host}/etc failed with ${res}  `date`" >> ${Status_File}
			send_failure_email
			break
		fi
		echo

		# Check for etc in backup area
		if [ ! -d ${DST_samba}/samba ];
			then mkdir -p ${DST_samba}/samba
		fi

		echo "%% ${Samba_Host} /samba to ${DST_samba}/samba/ %%"
		echo 
		echo "${rsync_prog} -av  --delete ${PREFIX}/${Samba_Host}/rootfs/samba/ ${DST_samba}/samba/"
		echo "START ${rsync_prog} -av  --delete ${PREFIX}/${Samba_Host}/rootfs/samba/ ${DST_samba}/samba/ `date`" >> ${Status_File}
		${rsync_prog} -av  --delete ${PREFIX}/${Samba_Host}/rootfs/samba/ ${DST_samba}/samba/
		res=$?
		if [ ${res} -ne 0 ]; then
			echo "rsync of ${Samba_Host}/samba failed with ${res} "
			echo "FAIL Aborting rsync of ${Samba_Host}/samba failed with ${res}  `date`" >> ${Status_File}
			send_failure_email
			break
		fi
		echo


		break

	done

fi

echo "Completed disk transfer"
echo "Completed disk transfer `date`" >> ${Status_File}
date


## exit ok if success and net backup
if [ ${Backup_Type} = "NET" ];then
	mutt -s "`hostname`: ${Virt_Host} backup log" ${Email_address_client} <  ${Log_File}
	echo "O.K. Backup Finished `date`" >> ${Status_File}
  exit 0
fi
	
## Perform usb backup

# Mount the usb disk 
/usr/local/sbin/mb-usb-mount.sh mount
res=$?
if [ ${res} -ne 0 ]; then
	echo "usb mount failed with ${res}"
	echo "FAIL usb mount failed with ${res}  `date`" >> ${Status_File}
	send_failure_email
	exit 1
fi

echo "Mounted `cat /mnt/muli/BackupLabel` `date`"  >> ${Status_File}

#make directory for rsync on usb device
if [ ! -d /mnt/muli/${Virt_Host} ]; then
	mkdir /mnt/muli/${Virt_Host}
	res=$?
	if [ ${res} -ne 0 ]; then
		echo "failed to mkdir /mnt/muli/${Virt_Host} with res ${res}"
		echo "FAIL mkdir of /mnt/muli/${Virt_Host} failed with ${res}  `date`" >> ${Status_File}
		send_failure_email
		/usr/local/sbin/mb-usb-mount.sh umount
		exit 1
	fi
fi
	

# copy to usb
echo "${rsync_prog}  -av  --delete ${DST_virt} /mnt/muli/"
echo "STARTED ${rsync_prog}  -av  --delete ${DST_virt} /mnt/muli/ `date`" >> ${Status_File}
${rsync_prog}  -av  --delete ${DST_virt} /mnt/muli/
res=$?
if [ ${res} -ne 0 ]; then
	echo "rsync from ${DST_virt} to usb failed with ${res}"
	echo "FAIL rsync from ${DST_virt} to usb failed with ${res}  `date`" >> ${Status_File}
	send_failure_email
	/usr/local/sbin/mb-usb-mount.sh umount
	exit 1
fi

if [ $Do_Samba = "Y" ];then
	echo "${rsync_prog}  -av  --delete ${DST_samba} /mnt/muli/"
	echo "STARTED ${rsync_prog}  -av  --delete ${DST_samba} /mnt/muli/ `date`" >> ${Status_File}
	${rsync_prog}  -av  --delete ${DST_samba} /mnt/muli/
	res=$?
	if [ ${res} -ne 0 ]; then
		echo "rsync from ${DST_samba} to usb failed with ${res}"
		echo "FAIL rsync from ${DST_samba} to usb failed with ${res}  `date`" >> ${Status_File}
		send_failure_email
		/usr/local/sbin/mb-usb-mount.sh umount
		exit 1
	fi
fi




# dismount usb
/usr/local/sbin/mb-usb-mount.sh umount
res=$?
if [ ${res} -ne 0 ]; then
	echo "failed to umount usb"
	echo "FAIL failed to umount usb with ${res}  `date`" >> ${Status_File}
	send_email_failure
	exit 1
fi


mutt -s "`hostname`: ${Virt_Host} backup log" ${Email_address_client} <  ${Log_File}

echo "O.K. Backup Finished `date`" >> ${Status_File}

###############################################################################
#=>Vn			Who			When			Risk			What
#=.
#=>N-000	BrowCh	19.06.16	Changed from backup.virtual
#=>V15-001	BrowCh	11.04.19	Changed mulisu to muliadm
#=..
###############################################################################
