Shell backup script – Windows SMB / Linux Server

prepare

  • copy all files in one folder
  • modify backup-start.sh with your path and configs
  • make a btrfs partition
  • create a subvolume for the backup path
  • create a cronjob

start

backup-start.sh daily
backup-start.sh weekly

backup modes

  • smb
  • sshs
  • sshnosymlink
  • sshsudoftp

backup-start.sh

#!/bin/bash
# check the backup script if its running and if yes then calc for a snapshot
script_name=/home/backup/backup-script.sh
email_admin=mail1@mail.de,mail2@mail.de
backup_path=/srv/backup/done
snapshot_path=/srv/backup/snapshots/backup-$(date +%Y-%m-%d-%H-%M)
snapshot_script=/home/eit/backup/services-snapshots.sh

## script start

if [ -z "$1" ];then
 echo "no target set"
 exit 1
else
 #echo "Set Target"
 backup_mode=$1
fi

## function for the errpr codes
check_error(){
 if [ "$1" -ge "100" ]; then
 echo "Start - Backup still running"
 exit 1
 fi
 if [ "$1" -eq "10" ]; then
 echo "Start - Backup done - no files"
 MODE=$backup_mode $snapshot_script $backup_local_path/$server $snapshot_local_path/$server
 else
 if [ "$1" -eq "0" ]; then
 echo "Start - Backup done - with files"
 MODE=$backup_mode $snapshot_script $backup_local_path/$server $snapshot_local_path/$server
 fi
 fi
}

script_start(){
 if [ ! -d "$backup_local_path/$server" ]; then
 echo "backup folder not exist"
 btrfs subvolume create $backup_local_path/$server
 chmod 740 $backup_local_path/$server
 echo "backup folder created"
 else
 echo "backup folder exist"
 fi
}

##
# run backup script
##

server=mysvwe1
script_start
sh $script_name $email_admin $server /path/to/backup/data $backup_local_path ssh username password
error_now=$?
check_error $error_now

exit 0

backup-script.sh

#!/bin/bash
#
# Thomas Mosandl - 2014-11-14
#
# apt-get install cifs-utils sendmail-bin
# sendmail config
#
# define parameter#!/bin/sh
# define parameterss
## variablen
## 1. mail to
## 2. backup_source_ip
## 3. backup_source_path
## 4. backup_dest_path

backup_source_ip=$2
backup_source_path=$3
backup_source_user=$6
backup_source_domain='asd'
backup_source_pw=$7
backup_log_path=/var/log
backup_check_client_ping="1"
backup_service=$5
backup_dest_path=$4/$backup_source_ip
backup_log_path=/var/log
backup_log_file=backup_$backup_source_ip
backup_email_to_config="thomas.mosandl@mosandl.eu"
backup_email_from="backup@mosandl.eu"

# end config

echo "Backup Start - $backup_source_ip"

# vaiable check
if [ -z "$1" ];then
        echo "mail set to config"
        backup_email_to="$backup_email_to_config"
else
        echo "mail set to parameter"
        backup_email_to=$1
fi
# check iscsi target


#ping -q -c$backup_check_client_ping $backup_iscsi_target_1 > /dev/null
#if [ ! $? -eq 0 ]; then
#	echo "ISCSI Ping not availible"
#	echo " "  | mail -s "Backup - ISCSI - Ping is not working" -a "From: $backup_email_from" $backup_email_to
#	exit 1
#else
#	#if [ $(iscsiadm -m session | grep -c "$backup_iscsi_target_1") -eq 0 ]; then
	#	echo "ISCSI Mount not availible"
	#	echo " "  | mail -s "Backup - ISCSI - Mount is not working" -a "From: $backup_email_from" $backup_email_to
	#	exit 1
	#else
#		echo "ISCSI is okay"
	#fi
#fi

#192.168.144.167
# check if backup is running
ps aux > /tmp/temp.txt
if [ $(cat /tmp/temp.txt  | grep -c "ssh -o StrictHostKeyChecking=no -l")  -gt 0 ]; then
	echo "backup was broken or not running"
	if [ -f "$backup_log_path/$backup_log_file.lck" ]; then
		rm -rf "$backup_log_path/$backup_log_file.lck"
	fi
fi
rm -rf /tmp/temp.txt

if [ -f "$backup_log_path/$backup_log_file.lck" ]; then
		echo " "  | mail -s "Backup - $backup_source_ip - Backup is still running"  -r  $backup_email_from  $backup_email_to
		echo "Script - backup is running"
		set -e
		exit 100
else
	echo "Script - backup is not still running"
	touch "$backup_log_path/$backup_log_file.lck"
fi

# check if log is in logrotate

if [ $(grep -c "$backup_log_path/$backup_log_file" /etc/logrotate.d/rsyslog)  -eq 1 ]; then
	echo "Script - rsyslog is set"
else
	echo "$backup_log_path/$backup_log_file {}" >> /etc/logrotate.d/rsyslog
	echo "Script - rsyslog created"
fi

#
if [ ! $(mount | grep -c "/media/data0/srv/backup type btrfs (rw)")  -eq 0 ]; then
	echo "storage not mounted"
	exit 11
	echo " "  | mail -s "Backup - storage not mounted"  -r  $backup_email_from  $backup_email_to
else
	echo "storage is mounted"
fi

# create folders

# check backup dir
if [ ! -d "$backup_dest_path" ]; then
      echo "backup folder not exist"
      mkdir -p $backup_dest_path
      chmod 740 $backup_dest_path
      echo "backup folder created"
else
      echo "backup folder exist"
fi


if [ ! -d "$backup_log_path" ]; then
      echo "backup log folder not exist"
      mkdir -p $backup_log_path
      echo "backup log folder created"
else
      echo "backup log folder exist"
fi





# nslookup check
nslookup $backup_source_ip > /dev/null
if [ ! $? -eq 0 ]; then
	echo "DNS is not working for $backup_source_ip"
	echo " "  | mail -s "Backup - $backup_source_ip - nslookup is not working for $backup_source_ip"  -r  $backup_email_from  $backup_email_to
	rm -rf "$backup_log_path/$backup_log_file.lck"
	set -e
	exit 1
else
	echo "DNS is okay"
fi


# ping check
if [ ! $backup_source_ip = "server.de" ]; then
	ping -q -c$backup_check_client_ping $backup_source_ip > /dev/null
		if [ ! $? -eq 0 ]; then
		echo "PING is not working for $backup_source_ip"
		echo " "  | mail -s "Backup - $backup_source_ip - ping $backup_source_ip is not working"  -r  $backup_email_from  $backup_email_to
		rm -rf "$backup_log_path/$backup_log_file.lck"
		set -e
		exit 1
	else
		echo "Ping is okay"
	fi
fi

# rsync
echo  $backup_service
if [ $backup_service = ssh ]; then
	exit_code="0"
	log_file_temp=$backup_log_file_$(date +%Y_%m_%d_%H_%M_%S)
	export SSHPASS=$backup_source_pw
	ionice -c 3 rsync -rptgoDvzLKh --delete --rsh="/usr/bin/sshpass -e ssh -o StrictHostKeyChecking=no -l $backup_source_user " $backup_source_ip:$backup_source_path  $backup_dest_path --log-file=$backup_log_path/$log_file_temp --stats >> $backup_log_path/$log_file_temp
	if [ ! $? -ge 0 ]; then
		echo "Backup error - $?"
		cat -v $backup_log_path/$backup_log_file | mail -s "Backup - $backup_source_ip - Error Backup - $?" -a "From: $backup_email_from" $backup_email_to
		set -e
		exit 1
	else
		echo "Backup is okay"
		if [ ! $(grep -c "Number of created files: 0" $backup_log_path/$log_file_temp) -eq 0 ]; then
			 mail -s "Backup - $backup_source_ip - Done Backup - no files" -r  $backup_email_from   $backup_email_to < $backup_log_path/$log_file_temp
			 echo "Script - no files"
			 exit_code="10"
		 else
			 cat -v  $backup_log_path/$log_file_temp | mail -s "Backup - $backup_source_ip - Done Backup"  -r  $backup_email_from  $backup_email_to
		 fi
		 cat  $backup_log_path/$log_file_temp >>  $backup_log_path/$backup_log_file
		 rm  $backup_log_path/$log_file_temp
	 fi
elif [ $backup_service = sshnosymlink ]; then
	 exit_code="0"
	 log_file_temp=$backup_log_file_$(date +%Y_%m_%d_%H_%M_%S)
	 export SSHPASS=$backup_source_pw
	 ionice -c 3 rsync -rptgoDvzlKh --delete --rsh="/usr/bin/sshpass -e ssh -o StrictHostKeyChecking=no -l $backup_source_user " $backup_source_ip:$backup_source_path  $backup_dest_path --log-file=$backup_log_path/$log_file_temp --stats >> $backup_log_path/$log_file_temp
	 if [ ! $? -ge 0 ]; then
		 echo "Backup error - $?"
		 cat -v $backup_log_path/$backup_log_file | mail -s "Backup - $backup_source_ip - Error Backup - $?" -a "From: $backup_email_from" $backup_email_to
		 set -e
		 exit 1
	 else
		 echo "Backup is okay"
		 if [ ! $(grep -c "Number of created files: 0" $backup_log_path/$log_file_temp) -eq 0 ]; then
			 mail -s "Backup - $backup_source_ip - Done Backup - no files" -r  $backup_email_from   $backup_email_to < $backup_log_path/$log_file_temp
			 echo "Script - no files"
			 exit_code="10"
		 else
			 cat -v  $backup_log_path/$log_file_temp | mail -s "Backup - $backup_source_ip - Done Backup"  -r  $backup_email_from  $backup_email_to
		 fi
		 cat  $backup_log_path/$log_file_temp >>  $backup_log_path/$backup_log_file
		 rm  $backup_log_path/$log_file_temp
	 fi
elif [ $backup_service = sshsudoftp ]; then
	 exit_code="0"
	 log_file_temp=$backup_log_file_$(date +%Y_%m_%d_%H_%M_%S)
	 export SSHPASS=$backup_source_pw
	 ionice -c 3 rsync -rptgoDzLKh --delete --exclude "*users/data*" --exclude "*users/*/data*"  --rsync-path="sudo rsync" --rsh="/usr/bin/sshpass -e ssh -o StrictHostKeyChecking=no -l $backup_source_user " $backup_source_ip:$backup_source_path  $backup_dest_path --log-file=$backup_log_path/$log_file_temp --stats >> $backup_log_path/$log_file_temp
	 if [ ! $? -ge 0 ]; then
		 echo "Backup error - $?"
		 cat -v $backup_log_path/$backup_log_file | mail -s "Backup - $backup_source_ip - Error Backup - $?" -a "From: $backup_email_from" $backup_email_to
		 set -e
		 exit 1
	 else
		 echo "Backup is okay"
		 if [ ! $(grep -c "Number of created files: 0" $backup_log_path/$log_file_temp) -eq 0 ]; then
			  mail -s "Backup - $backup_source_ip - Done Backup - no files" -r  $backup_email_from   $backup_email_to < $backup_log_path/$log_file_temp
			  echo "Script - no files"
			  exit_code="10"
		  else
			  cat -v  $backup_log_path/$log_file_temp | mail -s "Backup - $backup_source_ip - Done Backup"  -r  $backup_email_from  $backup_email_to
		  fi
		  cat  $backup_log_path/$log_file_temp >>  $backup_log_path/$backup_log_file
		  rm  $backup_log_path/$log_file_temp
	  fi

elif [ $backup_service = smb ]; then
        # mount backup
        mount -t cifs //$backup_source_ip/$backup_source_path $backup_mount_path -o username=$backup_source_user,password=$backup_source_pw,ro,sec=ntlm

        if [ ! $? -eq 0 ]; then
                echo "Mount is not okay - $?"
                echo " "  | mail -s "Backup - $backup_source_ip - mount -t cifs //$backup_source_ip/$backup_source_path $backup_mount_path  is not working" -a "From: $backup_email_from" $backup_email_to
                rm -rf "$backup_log_path/$backup_log_file.lck"
                set -e
                exit 1
        else
                echo "Mount is okay"
        fi


        # rsync
        exit_code="0"
        log_file_temp=$backup_log_file_$(date +%Y_%m_%d_%H_%M_%S)
        rsync -rlptDvz $backup_mount_path $backup_dest_path --log-file=$backup_log_path/$log_file_temp --stats --chmod=u=rwx,g=rx,o=rx >> $backup_log_path/$log_file_temp
        if [ ! $? -ge 0 ]; then
                echo "Backup error - $?"
                cat -v $backup_log_path/$backup_log_file | mail -s "Backup - $backup_source_ip - Error Backup - $?" -a "From: $backup_email_from" $backup_email_to
                set -e
                exit 1
        else
                echo "Backup is okay"
                                                                                                                     199,2-9       92%
        else
                echo "Backup is okay"
                if [ ! $(grep -c "Number of created files: 0" $backup_log_path/$log_file_temp) -eq 0 ]; then
                        cat -v  $backup_log_path/$log_file_temp | mail -s "Backup - $backup_source_ip - Done Backup - no files" -a "From: $backup_email_from" $backup_email_to
                        echo "Script - no files"
                        exit_code="10"
                else
                        cat -v  $backup_log_path/$log_file_temp | mail -s "Backup - $backup_source_ip - Done Backup" -a "From: $backup_email_from" $backup_email_to
                fi
                cat  $backup_log_path/$log_file_temp >>  $backup_log_path/$backup_log_file
                rm  $backup_log_path/$log_file_temp
        fi
fi

# unmount

rm -rf "$backup_log_path/$backup_log_file.lck"
exit $exit_code

services-snapshots.sh

#!/bin/bash
set -e

if [[ -z $MODE ]]; then
	echo "$MODE not specified"
	exit 1
fi

if [[ $UID -ne 0 ]]; then
	echo "Must be run as root"
	exit 1
fi

if [ -z "$1" ];then
	echo "not sources set"
	exit 1
else
	echo "Set Source"
	BACKUP_SOURCE_DIR=$1

fi

if [ -z "$2" ];then
	echo "no target set"
	exit 1
else
	echo "Set Target"
	BACKUP_BASE_DIR=$2
fi

BACKUP_DIR_DAILY=${BACKUP_BASE_DIR}/daily
BACKUP_DIR_WEEKLY=${BACKUP_BASE_DIR}/weekly
BACKUP_DIR_MONTHLY=${BACKUP_BASE_DIR}/monthly
BACKUP_DIR_YEARLY=${BACKUP_BASE_DIR}/yearly

if [ ! -d "$BACKUP_DIR_DAILY" ]; then
	echo "backup folder not exist"
	mkdir -p $BACKUP_DIR_DAILY
	chmod 740 $BACKUP_DIR_DAILY
	echo "backup folder created"
else
	echo "backup folder exist"
fi
if [ ! -d "$BACKUP_DIR_WEEKLY" ]; then
	echo "backup folder not exist"
	mkdir -p $BACKUP_DIR_WEEKLY
	chmod 740 $BACKUP_DIR_WEEKLY
	echo "backup folder created"
else
	echo "backup folder exist"
fi
if [ ! -d "$BACKUP_DIR_MONTHLY" ]; then
	echo "backup folder not exist"
	mkdir -p $BACKUP_DIR_MONTHLY
	chmod 740 $BACKUP_DIR_MONTHLY
	echo "backup folder created"
else
	echo "backup folder exist"
fi
if [ ! -d "$BACKUP_DIR_YEARLY" ]; then
	echo "backup folder not exist"
	mkdir -p $BACKUP_DIR_YEARLY
	chmod 740 $BACKUP_DIR_YEARLY
	echo "backup folder created"
else
	echo "backup folder exist"
fi




NUM_FILES_TO_KEEP_DAILY=10
NUM_FILES_TO_KEEP_WEEKLY=20
NUM_FILES_TO_KEEP_MONTHLY=12
NUM_FILES_TO_KEEP_YEARLY=10

if [[ $MODE = "DAILY" ]]; then
	BACKUP_DIR=$BACKUP_DIR_DAILY
	NUM_FILES_TO_KEEP=$NUM_FILES_TO_KEEP_DAILY
elif [[ $MODE = "WEEKLY" ]]; then
	BACKUP_DIR=$BACKUP_DIR_WEEKLY
	NUM_FILES_TO_KEEP=$NUM_FILES_TO_KEEP_WEEKLY
elif [[ $MODE = "MONTHLY" ]]; then
	BACKUP_DIR=$BACKUP_DIR_MONTHLY
	NUM_FILES_TO_KEEP=$NUM_FILES_TO_KEEP_MONTHLY
elif [[ $MODE = "YEARLY" ]]; then
	BACKUP_DIR=$BACKUP_DIR_YEARLY
	NUM_FILES_TO_KEEP=$NUM_FILES_TO_KEEP_YEARLY
else
	echo "available $MODE values are: DAILY, MONTHLY, WEEKLY, YEARLY"
	exit 1
fi

NUM_FILES_TO_KEEP=$(( $NUM_FILES_TO_KEEP + 1 ))

_backup () {
	/sbin/btrfs subvolume snapshot -r $BACKUP_SOURCE_DIR ${BACKUP_DIR}/backup-$(date +%Y-%m-%d)
}

_cleanup () {
	for file in $(ls -rt $BACKUP_DIR | tail -n  +${NUM_FILES_TO_KEEP} ); do
		sudo btrfs subvolume delete ${BACKUP_DIR}/$file
	done
}

_backup
_cleanup

 

Bad RAID controller

IMG_26022014_084034

If you have a UCS chassis where the VMs go offline and you can’t access the VMs with vSphere, you may have to reboot the chassis via the IMC web interface. But, when you reboot it and watch it via the IP KVM console, this is what you don’t want to see:

LSI MegaRAID SAS-MFI BIOS
Version 3.20.00 (Build November 19, 2010)
Copyright(c) 2010 LSI Corporation
HA -0 (Bus 14 Dev 0) LSI MegaRAID SAS 9261-8i
FW package: 12.12.0-0038
 
Multibit ECC errors were detected on the RAID controller.
The DIMM on the controller needs replacement.
Please contact technical support to resolve this issue.
If you continue, data corruption can occur.
Press 'X' to continue or else power off the system and replace the
DIMM module and reboot. If you have replaced the DIMM press 'X' to continue.
OK, so get TAC on the phone and have them send you the replacement controller. Hopefully, you have 4 hour response. Here is the link to replace the RAID controller in the UCS chassis:
After replacing the RAID controller, you will want to make sure to copy the drive configuration to the newly replaced controller. This was not documented in the card replacement documentation. Here is the link to do this. Follow the instructions EXACTLY:
Verify the virtual devices show up on the RAID controller during bootup. Things still might go south. The vSphere client may show CUCM and UCXN as missing. This is because the datastores are not there. TAC will need to re-add the datastores for you, possibly via CLI. More than likely, the file system will have errors on the VMs. It may be so bad that the won’t boot, so you will need to mount the Recovery CD, boot to it, then choose the option to fix the file system errors. After that, grab a beer. The servers should come up just fine.
see -> http://iptbuzz.blogspot.de/2011/10/bad-raid-controller-on-ucs-c210-m2.html