-
Notifications
You must be signed in to change notification settings - Fork 1
/
backup.sh
127 lines (110 loc) · 2.3 KB
/
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
#!/bin/sh
usage() {
>&2 echo "Usage: volume-backup <backup|restore> [options] <archive or - for stdin/stdout>"
>&2 echo ""
>&2 echo "Options:"
>&2 echo " -c <algorithm> chooose compression algorithm: bz2 (default), gz, xz and 0 (none)"
>&2 echo " -e <glob> exclude files or directories (only for backup operation)"
>&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
rm -rf /volume/* /volume/..?* /volume/.[!.]*
tar -C /volume/ $TAROPTS -xf $ARCHIVE_PATH
}
# Needed because sometimes pty is not ready when executing docker-compose run
# See https://github.com/docker/compose/pull/4738 for more details
# TODO: remove after above pull request or equivalent is merged
sleep 1
OPERATION=$1
TAROPTS=""
COMPRESSION="bz2"
OPTIND=2
while getopts "h?vc:e:" 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="$TAROPTS --exclude $OPTARG"
;;
v)
TAROPTS="$TAROPTS --checkpoint=.1000"
EOLN=1
;;
esac
done
shift $((OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit 1
fi
case "$COMPRESSION" in
xz)
TAROPTS="$TAROPTS -J"
EXTENSION=.tar.xz
;;
bz2)
TAROPTS="$TAROPTS -j"
EXTENSION=.tar.bz2
;;
gz)
TAROPTS="$TAROPTS -z"
EXTENSION=.tar.gz
;;
none|0)
EXTENSION=.tar
;;
*)
usage
exit 1
;;
esac
if [ "$1" == "-" ]; then
ARCHIVE=$1
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