-
-
Notifications
You must be signed in to change notification settings - Fork 151
/
volume-backup.sh
executable file
·150 lines (133 loc) · 2.89 KB
/
volume-backup.sh
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
usage() {
>&2 echo "Usage: volume-backup <backup|restore> [options]. Reads from stdin and writes to stdout. Can also read/write files (deprecated)."
>&2 echo ""
>&2 echo "Options:"
>&2 echo " -c <algorithm> chooose compression algorithm: bz2 (default), gz, xz, pigz, zstd and 0 (none)"
>&2 echo " -e <glob> exclude files or directories (only for backup operation)"
>&2 echo " -f force overwrite even if target volume is not empty during restore"
>&2 echo " -x <args> pass additional arguments to the Tar utility"
>&2 echo " -v verbose"
}
backup() {
if [ -z "$(ls -A /volume)" ]; then
>&2 echo "Volume is empty or missing, check if you specified a correct name"
exit 1
fi
if ! [ "$ARCHIVE" == "-" ]; then
mkdir -p `dirname /backup/$ARCHIVE`
fi
tar -C /volume "${TAROPTS[@]}" -cf $ARCHIVE_PATH ./
}
restore() {
if ! [ "$ARCHIVE" == "-" ]; then
if ! [ -e $ARCHIVE_PATH ]; then
>&2 echo "Archive file $ARCHIVE does not exist"
exit 1
fi
fi
if ! [ -z "$(ls -A /volume)" -o -n "$FORCE" ]; then
>&2 echo "Target volume is not empty, aborting; use -f to override"
exit 1
fi
rm -rf /volume/* /volume/..?* /volume/.[!.]*
tar -C /volume/ "${TAROPTS[@]}" -xf $ARCHIVE_PATH
}
OPERATION=$1
TAROPTS=()
COMPRESSION="bz2"
FORCE=""
OPTIND=2
while getopts "h?vfc:e:x:" OPTION; do
case "$OPTION" in
h|\?)
usage
exit 0
;;
c)
if [ -z "$OPTARG" ]; then
usage
exit 1
fi
COMPRESSION=$OPTARG
;;
e)
if [ -z "$OPTARG" -o "$OPERATION" != "backup" ]; then
usage
exit 1
fi
TAROPTS+=(--exclude $OPTARG)
;;
f)
if [ "$OPERATION" != "restore" ]; then
usage
exit 1
fi
FORCE=1
;;
v)
TAROPTS+=(--checkpoint=.1000)
EOLN=1
;;
x)
if [ -z "$OPTARG" ]; then
usage
exit 1
fi
# Note: it doesn't support nested quotes, e.g. -x '-I "zstd -10"'
OPTARR=($OPTARG)
TAROPTS=(${TAROPTS[@]} ${OPTARR[@]})
;;
esac
done
shift $((OPTIND - 1))
case "$COMPRESSION" in
xz)
TAROPTS+=(-J)
EXTENSION=.tar.xz
;;
bz2)
TAROPTS+=(-j)
EXTENSION=.tar.bz2
;;
gz)
TAROPTS+=(-z)
EXTENSION=.tar.gz
;;
pigz)
TAROPTS+=(-I pigz)
EXTENSION=.tar.gz
;;
zstd)
TAROPTS+=(-I zstd)
EXTENSION=.tar.zstd
;;
none|0)
EXTENSION=.tar
;;
*)
usage
exit 1
;;
esac
if [ -z "$1" ] || [ "$1" == "-" ]; then
ARCHIVE="-"
ARCHIVE_PATH=$ARCHIVE
else
ARCHIVE=${1%%$EXTENSION}$EXTENSION
ARCHIVE_PATH=/backup/$ARCHIVE
fi
case "$OPERATION" in
"backup" )
backup
;;
"restore" )
restore
;;
* )
usage
;;
esac
if ! [ -z "$EOLN" ]; then
>&2 echo
fi