blob: 672369932526078e294ea9f53dd666743ee9bdde (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
#!/bin/bash
rsyncOptions='-6vxcaHAXF'
rsync --help | \
grep -q -- --may-modify-others && \
rsyncOptions="${rsyncOptions} --may-modify-others"
[ -r "#ETCDIR#/backup.conf" ] && \
. "#ETCDIR#/backup.conf"
usage()
{
>&2 echo \
'Usage: backup /tmp/pidFile /path/to/destination/ user@source:path [proxy_user@ssh_host]
Backup files from remote with rsync, possibly via SSH-tunnel.
With no arguments, information is expected to be in array $backups in #ETCDIR#/backup.conf with name of executable (e.g. a symlink) as key.
Options:
/tmp/pidFile location of file to store PID in
/path/to/destination location to store backups in
user@source:path remote data to back up
proxy_user@ssh_host ssh login to proxy node (optional)
#HELPTEXT# #'
[ -z "$1" ] && exit 1
exit $1
}
if [ $# -eq 1 ]; then
if [ "$1" == "--help" ]; then
usage 0
elif [ "$1" == "--version" ]; then
echo '#VERSION#'
exit
fi
fi
seldom=false
if [ $# -eq 0 ]; then
backupID="$(basename $0)"
[ -z "${backups[${backupID}]}" ] && usage
set /tmp/${backupID}.pid ${backups[${backupID}]}
if printf '%s\n' "${seldomBackups[@]}" | \
grep -qxF "${backupID}"; then
seldom=true
fi
fi
Basis="$2"
pidFile="$1"
QuellIP=$(echo "$3" | sed "s|^[a-zA-Z]*://||; s|^[a-zA-Z]*@||; s|:\?/.*$||")
if [ "$#" -eq 3 ]; then
Quelle="$3"
elif [ "$#" -eq 4 ]; then
sshHopp="$4"
lokPort=$[$RANDOM/2+8000]
rsyncShell="-e ssh -6 -p${lokPort} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
tunnelBefehl="ssh -6 -t -t -L[::1]:${lokPort}:${QuellIP}:22 ${sshHopp}"
HoppIP="${sshHopp#*@}"
Quelle="$(echo "$3" | sed "s|${QuellIP}|[::1]|")"
else
usage
fi
if [ -n "${QuellIP}" ]; then
ping -c1 ${QuellIP} > /dev/null || exit 11
fi
if [ -n "${HoppIP}" ]; then
ping -c1 ${HoppIP} > /dev/null || exit 11
fi
if [ ! -d ${Basis} ]; then
[ $(mount | grep -c "\S\+\s\+\S\+\s\+/var/ftp\s") -eq 0 ] && exit 11
exit 2
fi
neues_Datum="${Basis}/$(date "+%Y_%m_%d")"
neues="${Basis}/aktuell"
linkdests=""
for s in $(ls -1 "${Basis}" | sort -r | grep -vxF -m 20 aktuell ); do
linkdests="${linkdests} --link-dest ${Basis}/${s}"
done
if [ ! "$(whoami)" == "root" ]; then
echo "I need to be root."
exit 3
fi
[ -w "${Basis}" ] || exit 11
[ -e "${neues_Datum}" ] && exit 4
if ${seldom}; then
for date_diff in $(seq ${seldomness}); do
if [ -e "${Basis}/$(date '+%Y_%m_%d' -d@$(($(date '+%s')-24*60*60*date_diff)))" ]; then
exit 4
fi
done
fi
[ -e "${pidFile}" ] && exit 5
echo $$ > "${pidFile}"
if [ -n "${tunnelBefehl}" ]; then
${tunnelBefehl} &
backgroundPid=$!
sleep 4
fi
for toExclude in "${excludes[@]}"; do
excludeArgs="${excludeArgs} --exclude ${toExclude}"
done
if [ ! -e "${neues}/wip" ]; then
mkdir -p "${neues}/wip"
fi
chmod 750 "${neues}"{,/wip}
chown root:root "${neues}"{,/wip}
if [ -z "${rsyncShell}" ]; then
rsync ${rsyncOptions} \
${linkdests} \
${excludeArgs} \
${Quelle} "${neues}/wip/"
sleep 1
rsync ${Quelle}
else
rsync "${rsyncShell}" \
${rsyncOptions} \
${linkdests} \
${excludeArgs} \
${Quelle} "${neues}/wip/"
sleep 1
rsync "${rsyncShell}" ${Quelle}
fi
erg=$?
[ -n "${backgroundPid}" ] && kill "${backgroundPid}"
if [ ${erg} -eq 0 ] || [ ${erg} -eq 24 ]; then
chmod o-rwx "${neues}/wip"
neueres_Datum="${Basis}/$(date "+%Y_%m_%d")"
if [ ! -e "${neueres_Datum}" ]; then
neues_Datum="${neueres_Datum}"
fi
mv "${neues}/wip" "${neues_Datum}"
rmdir "${neues}"
rm "${pidFile}"
else
rm "${pidFile}"
exit 11
fi
|