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 |
|