duplicity handler: warn if vsnames or vsinclude is enabled while vservers support...
[matthijs/upstream/backupninja.git] / handlers / dup
1 # -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
2 #
3 # duplicity script for backupninja
4 # requires duplicity
5 #
6
7 getconf options
8 getconf testconnect yes
9 getconf nicelevel 0
10
11 setsection gpg
12 getconf password
13 getconf sign no
14 getconf encryptkey
15 getconf signkey
16
17 setsection source
18 getconf include
19 getconf vsnames all
20 getconf vsinclude
21 getconf exclude
22
23 setsection dest
24 getconf incremental yes
25 getconf keep 60
26 getconf sshoptions
27 getconf bandwidthlimit 0
28 getconf desthost
29 getconf destdir
30 getconf destuser
31 destdir=${destdir%/}
32
33 [ "$destdir" != "" ] || fatal "Destination directory not set"
34 [ "$include" != "" ] || fatal "No source includes specified"
35
36 ### vservers stuff ###
37
38 # See if vservers are configured.
39 # If so, check that the ones listed in $vsnames do exist.
40 if [ "$vservers" == "yes" ]; then
41     [ -d "$VROOTDIR" ] || fatal "vservers enabled, but $VROOTDIR does not exist!"
42     if [ "$vsnames" == "all" ]; then
43         vsnames=""
44         for vserver in `ls $VROOTDIR | grep -E -v "lost+found|ARCHIVES"`; do
45             vsnames="$vserver $vsnames"
46         done
47     else
48         for vserver in "$vsnames"; do
49             [ -d "$VROOTDIR/$vserver" ] || fatal "vserver '$vserver' does not exist."
50         done
51     fi
52     if [ -n "$vsnames" ]; then
53         if [ -n "$vsinclude" ]; then
54             info "Using vservers '$vsnames'"
55             usevserver=1
56         fi
57     else
58         [ -z "$vsinclude" ] || warning 'vsnames is empty, vsinclude configuration lines will be ignored'
59     fi
60 else
61    [ -z "$vsinclude" ] || warning 'vservers support disabled in backupninja.conf, vsincludes configuration lines will be ignored'
62    [ -z "$vsnames" ] || warning 'vservers support disabled in backupninja.conf, vsnames configuration line will be ignored'   
63 fi
64
65 ### see if we can login ###
66
67 if [ "$testconnect" == "yes" ]; then
68     debug "ssh $sshoptions -o PasswordAuthentication=no $desthost -l $destuser 'echo -n 1'"
69     if [ ! $test ]; then
70         result=`ssh $sshoptions -o PasswordAuthentication=no $desthost -l $destuser 'echo -n 1'`
71         if [ "$result" != "1" ]; then
72             fatal "Can't connect to $desthost as $destuser."
73         else
74             debug "Connected to $desthost as $destuser successfully"
75         fi
76     fi
77 fi
78
79 ### COMMAND-LINE MANGLING ###
80
81 scpoptions="$sshoptions"
82 [ "$bandwidthlimit" == 0 ] || scpoptions="$scpoptions -l $bandwidthlimit"
83
84 execstr="$options --no-print-statistics --scp-command 'scp $scpoptions' --ssh-command 'ssh $sshoptions' "
85
86 # deal with symmetric or asymmetric (public/private key pair) encryption
87 if [ -n "$encryptkey" ]; then
88     execstr="${execstr}--encrypt-key $encryptkey "
89     debug "Data will be encrypted with the GnuPG key $encryptkey."
90 else
91     [ -n "$password" ] || fatal "The password option must be set when using symmetric encryption."
92     debug "Data will be encrypted using symmetric encryption."
93 fi
94
95 # deal with data signing
96 if [ "$sign" == yes ]; then
97     # duplicity is not able to sign data when using symmetric encryption
98     [ -n "$encryptkey" ] || fatal "The encryptkey option must be set when signing."
99     # if needed, initialize signkey to a value that is not empty (checked above)
100     [ -n "$signkey" ] || signkey="$encryptkey"
101     # check password validity
102     [ -n "$password" ] || fatal "The password option must be set when signing."
103     execstr="${execstr}--sign-key $signkey "
104     debug "Data will be signed will the GnuPG key $signkey."
105 else
106     debug "Data won't be signed."
107 fi
108
109 if [ "$keep" != "yes" ]; then
110     if [ "`echo $keep | tr -d 0-9`" == "" ]; then
111         keep="${keep}D"
112     fi
113     execstr="${execstr}--remove-older-than $keep "
114 fi
115
116 if [ "$incremental" == "no" ]; then
117     execstr="${execstr}--full "
118 fi
119
120 execstr_serverpart="scp://$destuser@$desthost/$destdir"
121 execstr_clientpart="/"
122
123 ### SOURCE ###
124
125 # excludes
126 for i in "$exclude"; do
127         str="${i//__star__/*}"
128         execstr="${execstr}--exclude '$str' "
129 done
130         
131 # includes 
132 for i in "$include"; do
133         str="${i//__star__/*}"
134         execstr="${execstr}--include '$str' "
135 done
136
137 # vsincludes
138 if [ $usevserver ]; then
139     for vserver in $vsnames; do
140         for vi in "$vsinclude"; do
141             str="${vi//__star__/*}"
142             execstr="${execstr}--include '$VROOTDIR/$vserver$str' "
143         done
144     done
145 fi
146
147 ### EXECUTE ###
148
149 # exclude everything else, start with root
150 #execstr="${execstr}--exclude '**' / "
151                 
152 # include client-part and server-part
153 #execstr="$execstr $execstr_serverpart"
154
155 execstr=${execstr//\\*/\\\\\\*}
156
157 debug "duplicity $execstr --exclude '**' / $execstr_serverpart"
158 if [ ! $test ]; then
159         export PASSPHRASE=$password
160         output=`nice -n $nicelevel \
161                   su -c \
162                     "duplicity $execstr --exclude '**' / $execstr_serverpart 2>&1"`
163         code=$?
164         if [ $code -eq 0 ]; then
165                 debug $output
166                 info "Duplicity finished successfully."
167         else
168                 debug $output
169                 fatal "Duplicity failed."
170         fi
171 fi      
172
173 return 0