Removed over zelous vsnames check
[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 # If vservers are configured, check that the ones listed in $vsnames do exist.
39 local usevserver=no
40 if [ $vservers_are_available = yes ]; then
41    if [ "$vsnames" = all ]; then
42       vsnames="$found_vservers"
43    else
44       if ! vservers_exist "$vsnames" ; then
45             fatal "At least one of the vservers listed in vsnames ($vsnames) does not exist."
46       fi
47    fi
48    if [ -n "$vsinclude" ]; then
49       info "Using vservers '$vsnames'"
50       usevserver=yes
51    fi
52 else
53    [ -z "$vsinclude" ] || warning 'vservers support disabled in backupninja.conf, vsincludes configuration lines will be ignored'
54 fi
55
56 ### see if we can login ###
57
58 if [ "$testconnect" == "yes" ]; then
59     debug "ssh $sshoptions -o PasswordAuthentication=no $desthost -l $destuser 'echo -n 1'"
60     if [ ! $test ]; then
61         result=`ssh $sshoptions -o PasswordAuthentication=no $desthost -l $destuser 'echo -n 1'`
62         if [ "$result" != "1" ]; then
63             fatal "Can't connect to $desthost as $destuser."
64         else
65             debug "Connected to $desthost as $destuser successfully"
66         fi
67     fi
68 fi
69
70 ### COMMAND-LINE MANGLING ###
71
72 scpoptions="$sshoptions"
73 [ "$bandwidthlimit" == 0 ] || scpoptions="$scpoptions -l $bandwidthlimit"
74
75 execstr="$options --no-print-statistics --scp-command 'scp $scpoptions' --ssh-command 'ssh $sshoptions' "
76
77 # deal with symmetric or asymmetric (public/private key pair) encryption
78 if [ -n "$encryptkey" ]; then
79     execstr="${execstr}--encrypt-key $encryptkey "
80     debug "Data will be encrypted with the GnuPG key $encryptkey."
81 else
82     [ -n "$password" ] || fatal "The password option must be set when using symmetric encryption."
83     debug "Data will be encrypted using symmetric encryption."
84 fi
85
86 # deal with data signing
87 if [ "$sign" == yes ]; then
88     # duplicity is not able to sign data when using symmetric encryption
89     [ -n "$encryptkey" ] || fatal "The encryptkey option must be set when signing."
90     # if needed, initialize signkey to a value that is not empty (checked above)
91     [ -n "$signkey" ] || signkey="$encryptkey"
92     # check password validity
93     [ -n "$password" ] || fatal "The password option must be set when signing."
94     execstr="${execstr}--sign-key $signkey "
95     debug "Data will be signed will the GnuPG key $signkey."
96 else
97     debug "Data won't be signed."
98 fi
99
100 if [ "$keep" != "yes" ]; then
101     if [ "`echo $keep | tr -d 0-9`" == "" ]; then
102         keep="${keep}D"
103     fi
104     execstr="${execstr}--remove-older-than $keep "
105 fi
106
107 if [ "$incremental" == "no" ]; then
108     execstr="${execstr}--full "
109 fi
110
111 execstr_serverpart="scp://$destuser@$desthost/$destdir"
112 execstr_clientpart="/"
113
114 ### SOURCE ###
115
116 set -o noglob
117
118 # excludes
119 for i in $exclude; do
120         str="${i//__star__/*}"
121         i=`readlink -f ${i#}`
122         execstr="${execstr}--exclude '$str' "
123 done
124         
125 # includes 
126 for i in $include; do
127         str="${i//__star__/*}"
128         i=`readlink -f ${i#}`
129         execstr="${execstr}--include '$str' "
130 done
131
132 # vsincludes
133 if [ $usevserver = yes ]; then
134     for vserver in $vsnames; do
135         for vi in $vsinclude; do
136             i=`readlink -f $VROOTDIR/$vserver$vi`
137             str="${i//__star__/*}"
138             execstr="${execstr}--include '$VROOTDIR/$vserver$str' "
139         done
140     done
141 fi
142
143 set +o noglob
144
145 ### EXECUTE ###
146
147 # exclude everything else, start with root
148 #execstr="${execstr}--exclude '**' / "
149                 
150 # include client-part and server-part
151 #execstr="$execstr $execstr_serverpart"
152
153 execstr=${execstr//\\*/\\\\\\*}
154
155 debug "duplicity $execstr --exclude '**' / $execstr_serverpart"
156 if [ ! $test ]; then
157         export PASSPHRASE=$password
158         output=`nice -n $nicelevel \
159                   su -c \
160                     "duplicity $execstr --exclude '**' / $execstr_serverpart 2>&1"`
161         code=$?
162         if [ $code -eq 0 ]; then
163                 debug $output
164                 info "Duplicity finished successfully."
165         else
166                 debug $output
167                 fatal "Duplicity failed."
168         fi
169 fi      
170
171 return 0