blob: 52422bbeab47762ad05e977b5db79947f36af517 (
plain) (
blame)
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
|
#!/bin/bash
encrypt=
destination=
while (( $# > 0 )); do
case "$1" in
--encrypt)
encrypt="$2"
shift
;;
--destination)
destination="$2"
shift
;;
*)
echo "Unknown option, '$1'"
exit 1
;;
esac
shift
done
if [ "$(whoami)" != "root" ]; then
echo "Must be running as root!"
exit 1
fi
DIR="/tmp/bwlp-backup-$(date +%s)"
if [ -d "$DIR" ]; then
echo "Backup already running!?"
exit 1
fi
mkdir -p "$DIR"
cd "$DIR" || exit 1
trap 'rm -rf -- "$DIR"' EXIT
mysqldump --defaults-extra-file=/etc/mysql/debian.cnf --add-locks --add-drop-database --default-character-set=utf8mb4 --databases openslx > openslx.sql
RET1=$?
mysqldump --defaults-extra-file=/etc/mysql/debian.cnf --add-locks --add-drop-database --default-character-set=utf8mb4 --databases sat > sat.sql
RET2=$?
if (( RET1 != 0 || RET2 != 0 )); then
echo "Database dump failed with exit code $RET1/$RET2"
exit 1
fi
FILELIST=(
"/opt/openslx/configs"
"/etc/lighttpd/server.pem"
"/etc/lighttpd/chain.pem"
"/etc/lighttpd/pub-cert.pem"
)
tar --ignore-failed-read -k -c -p -z -f "files.tgz" "${FILELIST[@]}"
RET=$?
if (( RET != 0 )); then
echo "WARNING: filesystem-tar exited with code $RET - backup might be incomplete!"
fi
ext="tgz"
tmpfile="/tmp/bwlp-${RANDOM}-$(date +%s)-backup.${ext}"
tar -k -c -z -f "backup.tgz" "files.tgz" "openslx.sql" "sat.sql"
RET=$?
if ! [ -f "backup.tgz" ]; then
echo "Creating backup.tgz failed!"
exit 1
fi
if (( RET != 0 )); then
echo "WARNING: final tar exited with code $RET - backup might be incomplete!"
fi
chmod 0600 "backup.tgz"
if ! mv "backup.tgz" "$tmpfile"; then
echo "ERROR: Could not move backup.tgz to $tmpfile"
exit 1
fi
if [ -n "$encrypt" ]; then
if ! openssl enc -aes-256-cbc -pbkdf2 -pass "env:$encrypt" -in "${tmpfile}" -out "${tmpfile}.aes" \
&& ! openssl enc -aes-256-cbc -pass "env:$encrypt" -in "${tmpfile}" -out "${tmpfile}.aes"; then
rm -f -- "$tmpfile"
echo "Error encrypting backup with openssl"
exit 1
fi
rm -f -- "$tmpfile"
ext="${ext}.aes"
tmpfile="${tmpfile}.aes"
fi
if [ -z "$destination" ]; then
# No destination given, as this is for download, give www-data user access to file
FILE="${tmpfile}"
chown www-data "${tmpfile}"
else
FILE="${destination}.${ext}"
dir="${destination%/*}"
for usr in "" "dmsd" "dnbd3" "FAIL"; do
[ "$usr" = "FAIL" ] && break
if [ -z "$usr" ]; then
mkdir -p "$dir"
mv "$tmpfile" "$FILE" && break
else
chown "$usr:$(id -g "$usr")" "$tmpfile"
sudo -n -u "$usr" mkdir -p "$dir"
sudo -n -u "$usr" cp "$tmpfile" "$FILE" && break
fi
done
if [ "$usr" = "FAIL" ] || ! [ -s "$FILE" ]; then
echo "Moving backup to '$FILE' failed."
exit 1
fi
fi
chmod 0600 "$FILE"
echo "Location: $FILE"
exit 0
|