1 #! /bin/bash -e  | 
         | 
     2   | 
         | 
     3 # just a simple(!) example, not intended for production use  | 
         | 
     4 # without supervision!  | 
         | 
     5   | 
         | 
     6 export TMPDIR=/var/tmp  | 
         | 
     7 export LC_ALL=C  | 
         | 
     8   | 
         | 
     9 SNAPSIZE=1G  | 
         | 
    10 DST=${1?need destination folder} | 
         | 
    11 VG=`hostname`  | 
         | 
    12 DEV=/dev/sda1  | 
         | 
    13 NICE=  | 
         | 
    14   | 
         | 
    15 NAGIOS_NSCA=nagios.net.schlittermann.de  | 
         | 
    16 NAGIOS_HOST=gentoo-chemnitz/wintraken  | 
         | 
    17 NAGIOS_SVC=BACKUP  | 
         | 
    18 NAGIOS_MSG="failed ($DST)"  | 
         | 
    19 NAGIOS_STATUS=2  | 
         | 
    20   | 
         | 
    21   | 
         | 
    22 now=`date +%s`  | 
         | 
    23 tmp=`mktemp`  | 
         | 
    24 snaps=`mktemp`  | 
         | 
    25   | 
         | 
    26 send_nsca() { | 
         | 
    27         /usr/lib/nagios/plugins/send_nsca \  | 
         | 
    28                 -H $NAGIOS_NSCA \  | 
         | 
    29                 -c /etc/nagios/send_nsca.cfg "$@"  | 
         | 
    30 }  | 
         | 
    31   | 
         | 
    32   | 
         | 
    33 _lvremove() { | 
         | 
    34 	local dev=$1  | 
         | 
    35 	local vg=${dev%/*} | 
         | 
    36 	local lv=${dev#*/} | 
         | 
    37   | 
         | 
    38 	udevadm settle || true  | 
         | 
    39 	lvremove -f "$dev" || { | 
         | 
    40 		dmsetup remove /dev/$vg/$lv \  | 
         | 
    41 		&& udevadm settle \  | 
         | 
    42 		&& dmsetup remove /dev/$vg/$lv-cow \  | 
         | 
    43 		&& udevadm settle \  | 
         | 
    44 		&& lvremove -f "$dev" || true  | 
         | 
    45 	}  | 
         | 
    46 }  | 
         | 
    47   | 
         | 
    48 cleanup() { | 
         | 
    49   | 
         | 
    50 	while read lvm dev orig cleanup; do  | 
         | 
    51 		udevadm settle  | 
         | 
    52 		test -e "$dev" && test "$cleanup" || continue  | 
         | 
    53 		eval $cleanup || true  | 
         | 
    54 	done < $snaps  | 
         | 
    55   | 
         | 
    56 	rm -f $tmp $snaps  | 
         | 
    57   | 
         | 
    58 	echo "$NAGIOS_HOST:$NAGIOS_SVC:$NAGIOS_STATUS:$NAGIOS_SVC $NAGIOS_MSG" | send_nsca -d :  | 
         | 
    59   | 
         | 
    60 }  | 
         | 
    61   | 
         | 
    62 trap cleanup EXIT INT  | 
         | 
    63   | 
         | 
    64 for dev in $DEV; do  | 
         | 
    65 	if mount -o remount,ro $dev; then  | 
         | 
    66 		echo "- $tmp - rm -fv $tmp" >>$snaps  | 
         | 
    67 		cp -v $dev $tmp  | 
         | 
    68 		mount -o remount,rw $dev  | 
         | 
    69 		file -s $tmp | egrep -q "ext[234] filesystem" && e2fsck -C0 -f -y $tmp || true  | 
         | 
    70 		imager save --now=$now -z $tmp:$dev $DST  | 
         | 
    71 		rm -f $tmp  | 
         | 
    72 	fi  | 
         | 
    73 done  | 
         | 
    74   | 
         | 
    75   | 
         | 
    76 lvs -o vg_name,lv_name,origin --noheadings $VG | while read vg lv origin; do  | 
         | 
    77 	# LVM-name DEV-name ORIG-name (cleanup)  | 
         | 
    78   | 
         | 
    79 	orig="$vg/$lv"  | 
         | 
    80 	if test "$origin"; then  | 
         | 
    81 		dev="/dev/$vg/$lv"  | 
         | 
    82 		echo "$vg/$lv $dev $dev" >>$snaps  | 
         | 
    83 		continue  | 
         | 
    84 	fi  | 
         | 
    85 	snap="$vg/$lv.snap.$now"  | 
         | 
    86 	dev="/dev/$vg/$lv.snap.$now"  | 
         | 
    87 	lvcreate -s -L $SNAPSIZE -n "$snap" "$orig"  | 
         | 
    88 	echo "$snap $dev /dev/$vg/$lv _lvremove $snap" >>$snaps  | 
         | 
    89 done  | 
         | 
    90   | 
         | 
    91 udevadm settle  | 
         | 
    92   | 
         | 
    93 while read snap dev name cleanup; do  | 
         | 
    94 	test "$snap" = "-" && continue  | 
         | 
    95 	for a in 1 2 3; do  | 
         | 
    96 		file -s `readlink -f $dev` | egrep -q "ext[234] filesystem" && $NICE fsck -y "$dev" && break  | 
         | 
    97 		case $? in  | 
         | 
    98 			32)	exit;;  | 
         | 
    99 			*)	true;;  | 
         | 
   100 		esac  | 
         | 
   101 	done  | 
         | 
   102 	if test $? = 0; then  | 
         | 
   103 		$NICE imager save --now=$now -z $dev:$name $DST   | 
         | 
   104 		case `lvs -o snap_percent --noheadings "$snap"` in  | 
         | 
   105 			100*)	echo "****************** $snap is full!";;  | 
         | 
   106 		esac  | 
         | 
   107 	fi  | 
         | 
   108 	test "$cleanup" && eval $cleanup || true  | 
         | 
   109 done <$snaps  | 
         | 
   110 date  | 
         | 
   111 date  >/var/log/backup.done  | 
         | 
   112   | 
         | 
   113 NAGIOS_MSG="done ($DST)"  | 
         | 
   114 NAGIOS_STATUS=0  | 
         |