1 |
mweinber |
1.1 |
--- smeserver-affa-0.9.0/root/sbin/e-smith/affa.createBackupFileOption 2008-03-07 18:41:40.000000000 +0100 |
2 |
|
|
+++ smeserver-affa-0.9.0/root/sbin/e-smith/affa 2008-03-07 18:41:40.000000000 +0100 |
3 |
|
|
@@ -29,6 +29,7 @@ |
4 |
|
|
use esmith::DB::db; |
5 |
|
|
use esmith::templates; |
6 |
|
|
use File::Path; |
7 |
|
|
+use Cwd; |
8 |
|
|
use Filesys::DiskFree; |
9 |
|
|
use Getopt::Long; |
10 |
|
|
use Mail::Send; |
11 |
|
|
@@ -37,11 +38,11 @@ |
12 |
|
|
|
13 |
|
|
$ENV{LANG} = "en_US"; # Filesys::DiskFree only works with english LANG setting |
14 |
|
|
|
15 |
|
|
-my $VERSION='_VERSIONSTRING_'; |
16 |
|
|
+my $VERSION='0.9.0-5'; |
17 |
|
|
|
18 |
|
|
|
19 |
|
|
# sub prototypes |
20 |
|
|
-sub affaErrorExit( $$ ); |
21 |
|
|
+sub affaErrorExit($); |
22 |
|
|
sub affaExit($); |
23 |
|
|
sub checkArchiveExists($$$); |
24 |
|
|
sub checkConnection(); |
25 |
|
|
@@ -50,6 +51,7 @@ |
26 |
|
|
sub cleanup(); |
27 |
|
|
sub compareRPMLists($); |
28 |
|
|
sub countUnit($); |
29 |
|
|
+sub createBackupFile(); |
30 |
|
|
sub cronSetup(); |
31 |
|
|
sub dbg($); |
32 |
|
|
sub deleteJob(); |
33 |
|
|
@@ -115,10 +117,9 @@ |
34 |
|
|
sub unmount($$); |
35 |
|
|
sub updateReportDB(); |
36 |
|
|
|
37 |
|
|
- |
38 |
|
|
+my $cwd=getcwd; |
39 |
|
|
chdir "/tmp"; |
40 |
|
|
|
41 |
|
|
- |
42 |
|
|
my $defaultEmail='admin'; |
43 |
|
|
my $rsyncLocal = '/usr/bin/rsync'; |
44 |
|
|
my $rsyncRemote = '/usr/bin/rsync'; |
45 |
|
|
@@ -181,7 +182,8 @@ |
46 |
|
|
"backup"=>\$opts{'run'}, # same as --run |
47 |
|
|
"version"=>\$opts{'version'}, |
48 |
|
|
"help"=>\$opts{'help'}, |
49 |
|
|
- "jobs"=>\$opts{'jobs'}, |
50 |
|
|
+ "_shorthelp"=>\$opts{'shorthelp'}, |
51 |
|
|
+ "_jobs"=>\$opts{'jobs'}, |
52 |
|
|
"make-cronjobs"=>\$opts{'make-cronjobs'}, |
53 |
|
|
"list-archives"=>\$opts{'list-archives'}, |
54 |
|
|
"csv"=>\$opts{'csv'}, |
55 |
|
|
@@ -191,6 +193,8 @@ |
56 |
|
|
"send-keys"=>\$opts{'send-keys'}, |
57 |
|
|
"revoke-keys"=>\$opts{'revoke-keys'}, |
58 |
|
|
"check-connections"=>\$opts{'check-connections'}, |
59 |
|
|
+ "create-backup-file"=>\$opts{'create-backup-file'}, |
60 |
|
|
+ "outfile=s"=>\$opts{'outfile'}, |
61 |
|
|
"host=s"=>\$opts{'keys-host'}, |
62 |
|
|
"remoteOS=s"=>\$opts{'remoteOS'}, |
63 |
|
|
"port=s"=>\$opts{'keys-port'}, |
64 |
|
|
@@ -211,12 +215,6 @@ |
65 |
|
|
my $remoteOS; |
66 |
|
|
|
67 |
|
|
|
68 |
|
|
-if( not $getRes ) |
69 |
|
|
- { |
70 |
|
|
- showHelp(1); |
71 |
|
|
- affaErrorExit( 117, "Missing arguments"); |
72 |
|
|
- } |
73 |
|
|
- |
74 |
|
|
my %job; |
75 |
|
|
getDefaultConfig(); |
76 |
|
|
|
77 |
|
|
@@ -235,6 +233,11 @@ |
78 |
|
|
listJobs(); |
79 |
|
|
exit 0; |
80 |
|
|
} |
81 |
|
|
+if( $opts{'shorthelp'} ) |
82 |
|
|
+ { |
83 |
|
|
+ showHelp(1); |
84 |
|
|
+ exit 0; |
85 |
|
|
+ } |
86 |
|
|
|
87 |
|
|
lg( $runninglog ); |
88 |
|
|
|
89 |
|
|
@@ -315,6 +318,11 @@ |
90 |
|
|
checkConnectionsAll(); |
91 |
|
|
affaExit('Done.'); |
92 |
|
|
} |
93 |
|
|
+elsif( $opts{'create-backup-file'} ) |
94 |
|
|
+ { |
95 |
|
|
+ createBackupFile(); |
96 |
|
|
+ affaExit('Done.'); |
97 |
|
|
+ } |
98 |
|
|
elsif( $opts{'kill'} ) |
99 |
|
|
{ |
100 |
|
|
$jobname = 'kill'; |
101 |
|
|
@@ -334,14 +342,14 @@ |
102 |
|
|
affaExit('Done.'); |
103 |
|
|
} |
104 |
|
|
|
105 |
|
|
- |
106 |
|
|
if ( not $opts{'run'} or not $ARGV[0] ) |
107 |
|
|
{ |
108 |
|
|
showHelp(1); |
109 |
|
|
- affaErrorExit( 137, "Missing arguments"); |
110 |
|
|
+ affaErrorExit( "Missing arguments"); |
111 |
|
|
} |
112 |
|
|
|
113 |
|
|
|
114 |
|
|
+ |
115 |
|
|
# run job |
116 |
|
|
|
117 |
|
|
$jobname = $ARGV[0]; |
118 |
|
|
@@ -349,14 +357,14 @@ |
119 |
|
|
if( not $affa->get($jobname)||'' ) |
120 |
|
|
{ |
121 |
|
|
my $txt= "Job '$jobname' undefined"; print("$txt\n"); |
122 |
|
|
- affaErrorExit( 140, "$txt" ); |
123 |
|
|
+ affaErrorExit( "$txt" ); |
124 |
|
|
} |
125 |
|
|
|
126 |
|
|
$Command = defined $ARGV[1] ? lc($ARGV[1]) : 'scheduled'; |
127 |
|
|
$Command =~ /([a-z]*)/i; $Command = $1; # untaint |
128 |
|
|
if( not $Command =~ /^(scheduled|daily|weekly|monthly|yearly)$/ ) |
129 |
|
|
{ |
130 |
|
|
- affaErrorExit( 100, "Unkown command '$Command'"); |
131 |
|
|
+ affaErrorExit( "Unkown command '$Command'"); |
132 |
|
|
} |
133 |
|
|
|
134 |
|
|
getJobConfig( $jobname ); |
135 |
|
|
@@ -368,7 +376,7 @@ |
136 |
|
|
|
137 |
|
|
# check if same job already running |
138 |
|
|
$Command eq "scheduled" and getLock($lockfile) |
139 |
|
|
- and affaErrorExit( 101, "Lock found. Another job (pid=" . getLock($lockfile) . ") is still running." ); |
140 |
|
|
+ and affaErrorExit( "Lock found. Another job (pid=" . getLock($lockfile) . ") is still running." ); |
141 |
|
|
|
142 |
|
|
setLock() if $Command eq "scheduled"; |
143 |
|
|
$SIG{'TERM'} = 'SignalHandler'; |
144 |
|
|
@@ -525,7 +533,7 @@ |
145 |
|
|
} |
146 |
|
|
else |
147 |
|
|
{ |
148 |
|
|
- affaErrorExit( 102, "rsync failed with status $status."); |
149 |
|
|
+ affaErrorExit( "rsync failed with status $status."); |
150 |
|
|
} |
151 |
|
|
} |
152 |
|
|
|
153 |
|
|
@@ -614,7 +622,7 @@ |
154 |
|
|
} |
155 |
|
|
else |
156 |
|
|
{ |
157 |
|
|
- affaErrorExit( 103, "Job '$jobname' undefined."); |
158 |
|
|
+ affaErrorExit( "Job '$jobname' undefined."); |
159 |
|
|
} |
160 |
|
|
$job{'sshPort'}=22 if not $job{'sshPort'}; |
161 |
|
|
$job{'EmailAddresses'}=$defaultEmail if not $job{'EmailAddresses'}; |
162 |
|
|
@@ -757,13 +765,13 @@ |
163 |
|
|
{ |
164 |
|
|
lg( "Checking rsyncd connection to " . $job{'remoteHostName'} ); |
165 |
|
|
@cmd=($rsyncLocal, '-dq', ($job{'rsyncdUser'} ? $job{'rsyncdUser'}.'@' : '') . $job{'remoteHostName'} . "::'" . $job{'rsyncdModule'} . "'"); |
166 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 104, "Rsyncd connection to ". $job{'remoteHostName'}. " failed. Did you set the rsyncdUser, rsyncdPassword and rsyncdModule properties correctly?" ); |
167 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "Rsyncd connection to ". $job{'remoteHostName'}. " failed. Did you set the rsyncdUser, rsyncdPassword and rsyncdModule properties correctly?" ); |
168 |
|
|
} |
169 |
|
|
else |
170 |
|
|
{ |
171 |
|
|
lg( "Checking SSH connection to " . $job{'remoteHostName'} ); |
172 |
|
|
@cmd=('/usr/bin/ssh', '-p', $job{'sshPort'}, '-o', 'StrictHostKeyChecking=yes', '-o', "HostKeyAlias=$jobname", '-o', "ConnectTimeout=$job{'ConnectionCheckTimeout'}",'-o','PasswordAuthentication=no', $sshQuiet, $job{'remoteHostName'},'true'); |
173 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 104, "SSH connection to ". $job{'remoteHostName'}. " failed. Did you send the public key?" ); |
174 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "SSH connection to ". $job{'remoteHostName'}. " failed. Did you send the public key?" ); |
175 |
|
|
} |
176 |
|
|
} |
177 |
|
|
|
178 |
|
|
@@ -781,7 +789,7 @@ |
179 |
|
|
lg( "signaling pre-backup event on ". $job{'remoteHostName'} ); |
180 |
|
|
@cmd=('/usr/bin/ssh', '-o', "HostKeyAlias=$jobname", '-p', $job{'sshPort'}, $sshQuiet, $job{'remoteHostName'},"/sbin/e-smith/signal-event pre-backup desktop"); |
181 |
|
|
} |
182 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 105, "signaling pre-backup event failed." ); |
183 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "signaling pre-backup event failed." ); |
184 |
|
|
} |
185 |
|
|
|
186 |
|
|
sub signalPostBackupEvent() |
187 |
|
|
@@ -825,7 +833,7 @@ |
188 |
|
|
"'/sbin/e-smith/affa-rpmlist.sh>$rpmlist'" |
189 |
|
|
); |
190 |
|
|
} |
191 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 107, "writing list of installed RPMs failed." ); |
192 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "writing list of installed RPMs failed." ); |
193 |
|
|
} |
194 |
|
|
|
195 |
|
|
|
196 |
|
|
@@ -837,7 +845,7 @@ |
197 |
|
|
my $RPMPath="home/e-smith/db/affa-rpmlist"; |
198 |
|
|
my %remoteRPM; |
199 |
|
|
dbg( "Reading remote RPM list" ); |
200 |
|
|
- open( RP, "$localRPMList/$RPMPath" ) or affaErrorExit( 108, "Couldn't open $localRPMList/$RPMPath" ); |
201 |
|
|
+ open( RP, "$localRPMList/$RPMPath" ) or affaErrorExit( "Couldn't open $localRPMList/$RPMPath" ); |
202 |
|
|
while( <RP> ) |
203 |
|
|
{ |
204 |
|
|
my @z = split( " ", $_); |
205 |
|
|
@@ -876,7 +884,7 @@ |
206 |
|
|
dbg("MD5Filename=$MD5Filename"); |
207 |
|
|
if( not -f $MD5Filename ) |
208 |
|
|
{ |
209 |
|
|
- open( RP, ">$RPMFilename" ) or affaErrorExit( 109, "Couldn't open $RPMFilename for writing."); |
210 |
|
|
+ open( RP, ">$RPMFilename" ) or affaErrorExit( "Couldn't open $RPMFilename for writing."); |
211 |
|
|
|
212 |
|
|
my $out=''; |
213 |
|
|
foreach my $k (@missing) |
214 |
|
|
@@ -916,7 +924,7 @@ |
215 |
|
|
$msg->to($job{'EmailAddresses'}); |
216 |
|
|
$msg->set("From", "\"Affa Backup Server\" <noreply\@$SystemName.$DomainName>"); |
217 |
|
|
my $fh = $msg->open; |
218 |
|
|
- open( RP, "<$RPMFilename" ) or affaErrorExit( 110, "Couldn't open $RPMFilename."); |
219 |
|
|
+ open( RP, "<$RPMFilename" ) or affaErrorExit( "Couldn't open $RPMFilename."); |
220 |
|
|
while( <RP> ) |
221 |
|
|
{ |
222 |
|
|
print $fh $_; |
223 |
|
|
@@ -927,7 +935,7 @@ |
224 |
|
|
} |
225 |
|
|
|
226 |
|
|
unlink( glob( "$job{'RootDir'}/$jobname/.md5-rpms-missing-*" ) ); |
227 |
|
|
- open( RP, ">$MD5Filename" ) or affaErrorExit( 111, "Couldn't open $MD5Filename for writing."); |
228 |
|
|
+ open( RP, ">$MD5Filename" ) or affaErrorExit( "Couldn't open $MD5Filename for writing."); |
229 |
|
|
print RP "md5sum of content of file $RPMFilename\n"; |
230 |
|
|
close( RP ); |
231 |
|
|
} |
232 |
|
|
@@ -1108,7 +1116,7 @@ |
233 |
|
|
close( WD ); |
234 |
|
|
chmod( 0700, "/usr/lib/affa/$WDName" ); |
235 |
|
|
my @cmd=('/usr/bin/ssh', '-o', "HostKeyAlias=$jobname", '-p', $job{'sshPort'}, $job{'remoteHostName'}, "/bin/rm", "-f", "/etc/cron.hourly/$WDName-reminder" ); |
236 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 118, "Couldn't delete /etc/cron.hourly/$WDName-reminder on remote host." ); |
237 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "Couldn't delete /etc/cron.hourly/$WDName-reminder on remote host." ); |
238 |
|
|
remoteCopy("/usr/lib/affa/$WDName","/etc/cron.hourly/" ); |
239 |
|
|
} |
240 |
|
|
|
241 |
|
|
@@ -1174,19 +1182,19 @@ |
242 |
|
|
{ |
243 |
|
|
return if not $job{'preJobCommand'}; |
244 |
|
|
lg( "Executing preJobCommand $job{'preJobCommand'}"); |
245 |
|
|
- affaErrorExit( 113, "Couldn't execute preJobCommand $job{'preJobCommand'}") if not -x $job{'preJobCommand'}; |
246 |
|
|
+ affaErrorExit( "Couldn't execute preJobCommand $job{'preJobCommand'}") if not -x $job{'preJobCommand'}; |
247 |
|
|
my @cmd = ( $job{'preJobCommand'}, $job{'remoteHostName'}, $jobname, $Command ); |
248 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 114, "Executing preJobCommand $job{'preJobCommand'} failed." ); |
249 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "Executing preJobCommand $job{'preJobCommand'} failed." ); |
250 |
|
|
} |
251 |
|
|
|
252 |
|
|
sub execPostJobCommand($) |
253 |
|
|
{ |
254 |
|
|
return if not $job{'postJobCommand'}; |
255 |
|
|
lg( "Executing postJobCommand $job{'postJobCommand'}"); |
256 |
|
|
- affaErrorExit( 115, "Couldn't execute postJobCommand $job{'postJobCommand'}") if not -x $job{'postJobCommand'}; |
257 |
|
|
+ affaErrorExit( "Couldn't execute postJobCommand $job{'postJobCommand'}") if not -x $job{'postJobCommand'}; |
258 |
|
|
my @cmd = ( $job{'postJobCommand'}, $job{'remoteHostName'}, $jobname, $Command, shift(@_) ); |
259 |
|
|
$job{'postJobCommand'}=''; # don't execute again in affaErrorExit() |
260 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 116, "Executing postJobCommand $job{'postJobCommand'} failed." ); |
261 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "Executing postJobCommand $job{'postJobCommand'} failed." ); |
262 |
|
|
} |
263 |
|
|
|
264 |
|
|
sub listJobs() |
265 |
|
|
@@ -1289,7 +1297,7 @@ |
266 |
|
|
if( not $affa->get($jobname)||'' ) |
267 |
|
|
{ |
268 |
|
|
my $txt= "Error: Job '$jobname' undefined"; print("$txt\n"); |
269 |
|
|
- affaErrorExit( 135, "$txt" ); |
270 |
|
|
+ affaErrorExit( "$txt" ); |
271 |
|
|
} |
272 |
|
|
getJobConfig( $jobname ); |
273 |
|
|
updateReportDB(); |
274 |
|
|
@@ -1525,7 +1533,7 @@ |
275 |
|
|
my $s="Couldn't mount $dev $AutomountPoint"; |
276 |
|
|
if( $Command ) |
277 |
|
|
{ |
278 |
|
|
- affaErrorExit( 130, $s ); |
279 |
|
|
+ affaErrorExit( $s ); |
280 |
|
|
} |
281 |
|
|
else |
282 |
|
|
{ |
283 |
|
|
@@ -1623,7 +1631,7 @@ |
284 |
|
|
my $txt="Error: Archive $archive not found."; print "$txt\n"; lg($txt); |
285 |
|
|
$txt = "Run 'affa --list-archives $jobname' to view available archives.\n"; |
286 |
|
|
print "$txt\n"; |
287 |
|
|
- affaErrorExit( 123, "." ); |
288 |
|
|
+ affaErrorExit( "." ); |
289 |
|
|
} |
290 |
|
|
} |
291 |
|
|
|
292 |
|
|
@@ -1637,7 +1645,7 @@ |
293 |
|
|
if( not $affa->get($jobname)||'' ) |
294 |
|
|
{ |
295 |
|
|
$txt= "Error: Job '$jobname' undefined"; print("$txt\n"); |
296 |
|
|
- affaErrorExit( 136, "$txt" ); |
297 |
|
|
+ affaErrorExit( "$txt" ); |
298 |
|
|
} |
299 |
|
|
getJobConfig( $jobname ); |
300 |
|
|
my $dir = opendir( DIR, "$job{'RootDir'}/$jobname" ); |
301 |
|
|
@@ -1669,7 +1677,7 @@ |
302 |
|
|
chomp( $input ); |
303 |
|
|
if( $input ne 'proceed' ) |
304 |
|
|
{ |
305 |
|
|
- affaErrorExit( 146, "Terminated by user" ) if $input ne 'proceed'; |
306 |
|
|
+ affaErrorExit( "Terminated by user" ) if $input ne 'proceed'; |
307 |
|
|
} |
308 |
|
|
foreach my $k ( reverse sort keys %archives ) |
309 |
|
|
{ |
310 |
|
|
@@ -1688,19 +1696,19 @@ |
311 |
|
|
if( not $affa->get($jobname)||'' ) |
312 |
|
|
{ |
313 |
|
|
$txt= "Error: Job '$jobname' undefined."; print("$txt\n"); |
314 |
|
|
- affaErrorExit( 147, "$txt" ); |
315 |
|
|
+ affaErrorExit( "$txt" ); |
316 |
|
|
} |
317 |
|
|
getJobConfig( $jobname ); |
318 |
|
|
(my $newdir=$ARGV[1])=~s/\/$//; |
319 |
|
|
if( not $newdir ) |
320 |
|
|
{ |
321 |
|
|
$txt= "Error: New RootDir not given."; print("$txt\n"); |
322 |
|
|
- affaErrorExit( 148, "$txt" ); |
323 |
|
|
+ affaErrorExit( "$txt" ); |
324 |
|
|
} |
325 |
|
|
if( not $newdir=~/^\// or $newdir=~/\.\./ ) |
326 |
|
|
{ |
327 |
|
|
$txt= "Error: Full path required for NEWROOTDIR."; print("$txt\n"); |
328 |
|
|
- affaErrorExit( 150, "$txt" ); |
329 |
|
|
+ affaErrorExit( "$txt" ); |
330 |
|
|
} |
331 |
|
|
if( not -d $newdir ) |
332 |
|
|
{ |
333 |
|
|
@@ -1714,7 +1722,7 @@ |
334 |
|
|
if( $input ne 'yes' ) |
335 |
|
|
{ |
336 |
|
|
$interactive=0; |
337 |
|
|
- affaErrorExit( 149, "Terminated by user" ) if $input ne 'proceed'; |
338 |
|
|
+ affaErrorExit( "Terminated by user" ) if $input ne 'proceed'; |
339 |
|
|
} |
340 |
|
|
File::Path::mkpath( $newdir, 0, 0700 ) |
341 |
|
|
} |
342 |
|
|
@@ -1760,7 +1768,7 @@ |
343 |
|
|
if( not $affa->get($jobname)||'' ) |
344 |
|
|
{ |
345 |
|
|
$txt= "Error: Job '$jobname' undefined."; print("$txt\n"); |
346 |
|
|
- affaErrorExit( 141, "$txt" ); |
347 |
|
|
+ affaErrorExit( "$txt" ); |
348 |
|
|
} |
349 |
|
|
getJobConfig( $jobname ); |
350 |
|
|
my $newname=$ARGV[1]||''; |
351 |
|
|
@@ -1768,12 +1776,12 @@ |
352 |
|
|
if( not $newname ) |
353 |
|
|
{ |
354 |
|
|
$txt= "Error: No new jobname given."; print("$txt\n"); |
355 |
|
|
- affaErrorExit( 142, "$txt" ); |
356 |
|
|
+ affaErrorExit( "$txt" ); |
357 |
|
|
} |
358 |
|
|
if( $affa->get($newname) ) |
359 |
|
|
{ |
360 |
|
|
$txt= "Error: A job 'mars' already exists."; print("$txt\n"); |
361 |
|
|
- affaErrorExit( 143, "$txt" ); |
362 |
|
|
+ affaErrorExit( "$txt" ); |
363 |
|
|
} |
364 |
|
|
if( -f "/home/e-smith/db/affa-report/$jobname" ) |
365 |
|
|
{ |
366 |
|
|
@@ -1821,7 +1829,7 @@ |
367 |
|
|
if( not $affa->get($jobname)||'' ) |
368 |
|
|
{ |
369 |
|
|
$txt= "Error: Job '$jobname' undefined."; print("$txt\n"); |
370 |
|
|
- affaErrorExit( 144, "$txt" ); |
371 |
|
|
+ affaErrorExit( "$txt" ); |
372 |
|
|
} |
373 |
|
|
getJobConfig( $jobname ); |
374 |
|
|
my $dir = opendir( DIR, "$job{'RootDir'}/$jobname" ); |
375 |
|
|
@@ -1846,7 +1854,7 @@ |
376 |
|
|
chomp( $input ); |
377 |
|
|
if( $input ne 'proceed' ) |
378 |
|
|
{ |
379 |
|
|
- affaErrorExit( 133, "Terminated by user" ) if $input ne 'proceed'; |
380 |
|
|
+ affaErrorExit( "Terminated by user" ) if $input ne 'proceed'; |
381 |
|
|
} |
382 |
|
|
revokeKeys($jobname) if $opts{'revoke-keys'}; |
383 |
|
|
if( $dir ) |
384 |
|
|
@@ -1883,7 +1891,7 @@ |
385 |
|
|
if( not $affa->get($jobname)||'' ) |
386 |
|
|
{ |
387 |
|
|
$txt= "Error: Job '$jobname' undefined"; print("$txt\n"); |
388 |
|
|
- affaErrorExit( 145, "$txt" ); |
389 |
|
|
+ affaErrorExit( "$txt" ); |
390 |
|
|
} |
391 |
|
|
getJobConfig( $jobname ); |
392 |
|
|
|
393 |
|
|
@@ -1896,7 +1904,7 @@ |
394 |
|
|
if( getLock("$lockdir/$jobname") ) |
395 |
|
|
{ |
396 |
|
|
print "Job '$jobname' is running. Wait for completion. Then run affa --full-restore again.\n"; |
397 |
|
|
- affaErrorExit( 131, "affa job 'jobname' is running." ); |
398 |
|
|
+ affaErrorExit( "affa job 'jobname' is running." ); |
399 |
|
|
} |
400 |
|
|
|
401 |
|
|
# check if archive exists |
402 |
|
|
@@ -1917,7 +1925,7 @@ |
403 |
|
|
if( $input ne 'proceed' ) |
404 |
|
|
{ |
405 |
|
|
$interactive=0; |
406 |
|
|
- affaErrorExit( 132, "Terminated by user" ) if $input ne 'proceed'; |
407 |
|
|
+ affaErrorExit( "Terminated by user" ) if $input ne 'proceed'; |
408 |
|
|
} |
409 |
|
|
|
410 |
|
|
$txt="Signaling pre-restore event on $job{'remoteHostName'}"; lg( $txt ); print "$txt\n"; |
411 |
|
|
@@ -2004,7 +2012,7 @@ |
412 |
|
|
lg( $txt ); print "$txt\n"; |
413 |
|
|
$txt="Try option --full-restore instead."; |
414 |
|
|
lg( $txt ); print "$txt\n"; |
415 |
|
|
- affaErrorExit( 134, "Cannot rise from my own backup." ); |
416 |
|
|
+ affaErrorExit( "Cannot rise from my own backup." ); |
417 |
|
|
} |
418 |
|
|
|
419 |
|
|
|
420 |
|
|
@@ -2036,7 +2044,7 @@ |
421 |
|
|
if( not $interactive ) |
422 |
|
|
{ |
423 |
|
|
print "Wait for completion of the running jobs or kill them. Then run affa --rise again.\n"; |
424 |
|
|
- affaErrorExit( 124, "affa jobs are running." ); |
425 |
|
|
+ affaErrorExit( "affa jobs are running." ); |
426 |
|
|
} |
427 |
|
|
|
428 |
|
|
stopServices(); |
429 |
|
|
@@ -2074,7 +2082,7 @@ |
430 |
|
|
if( $input ne 'proceed' ) |
431 |
|
|
{ |
432 |
|
|
$interactive=0; |
433 |
|
|
- affaErrorExit( 128, "Terminated by user" ) if $input ne 'proceed'; |
434 |
|
|
+ affaErrorExit( "Terminated by user" ) if $input ne 'proceed'; |
435 |
|
|
} |
436 |
|
|
|
437 |
|
|
print "Signaling pre-restore event\n"; |
438 |
|
|
@@ -2097,7 +2105,7 @@ |
439 |
|
|
# This allows us to run the --rise option remotely and connect to the restored server |
440 |
|
|
my $srcconfigPath="/var/affa/$ServerBasename/scheduled.0/home/e-smith/db/configuration"; |
441 |
|
|
my $srcconfig = esmith::ConfigDB->open_ro($srcconfigPath) |
442 |
|
|
- or affaErrorExit( 126, "Couldn't open source config db $srcconfigPath"); |
443 |
|
|
+ or affaErrorExit( "Couldn't open source config db $srcconfigPath"); |
444 |
|
|
$config->set_prop("EthernetDriver1","type", $srcconfig->get("EthernetDriver1")->value); |
445 |
|
|
$config->set_prop("EthernetDriver2","type", $srcconfig->get("EthernetDriver2")->value); |
446 |
|
|
$config->set_prop("InternalInterface","Driver", $srcconfig->get_prop("InternalInterface","Driver")); |
447 |
|
|
@@ -2116,7 +2124,7 @@ |
448 |
|
|
$interactive=1; |
449 |
|
|
# search server base backup |
450 |
|
|
my $dir = opendir( DIR, "/var/affa/" ); |
451 |
|
|
- affaErrorExit( 125, "Couldn't open directory /var/affa/" ) if not $dir; |
452 |
|
|
+ affaErrorExit( "Couldn't open directory /var/affa/" ) if not $dir; |
453 |
|
|
my $archive; |
454 |
|
|
my $a=''; |
455 |
|
|
while( defined ($archive=readdir(DIR)) ) |
456 |
|
|
@@ -2124,7 +2132,7 @@ |
457 |
|
|
next if not $archive =~ /AFFA\.[a-z][a-z0-9\-]*\..*-\d*\.\d*\.\d*\.\d*/; |
458 |
|
|
$a=$archive; |
459 |
|
|
} |
460 |
|
|
- affaErrorExit( 127, "No server base backup found." ) if not $a and not -f "$a/scheduled.0"; |
461 |
|
|
+ affaErrorExit( "No server base backup found." ) if not $a and not -f "$a/scheduled.0"; |
462 |
|
|
stopServices(); |
463 |
|
|
print "\nWARNING: You will loose all data of your current server installation!\n"; |
464 |
|
|
my $input=''; |
465 |
|
|
@@ -2137,7 +2145,7 @@ |
466 |
|
|
if( $input ne 'proceed' ) |
467 |
|
|
{ |
468 |
|
|
$interactive=0; |
469 |
|
|
- affaErrorExit( 122, "Terminated by user" ) if $input ne 'proceed'; |
470 |
|
|
+ affaErrorExit( "Terminated by user" ) if $input ne 'proceed'; |
471 |
|
|
} |
472 |
|
|
|
473 |
|
|
print "Signaling pre-restore event\n"; |
474 |
|
|
@@ -2262,7 +2270,7 @@ |
475 |
|
|
$me->set_prop($p,$v); |
476 |
|
|
} |
477 |
|
|
my @cmd=('/sbin/e-smith/affa','--run', $ServerBasename); |
478 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 121, "Couldn't backup myself" ); |
479 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "Couldn't backup myself" ); |
480 |
|
|
print "Done.\n"; |
481 |
|
|
} |
482 |
|
|
|
483 |
|
|
@@ -2303,7 +2311,7 @@ |
484 |
|
|
if( not $affa->get($jobname)||'' ) |
485 |
|
|
{ |
486 |
|
|
my $txt= "Error: Job '$jobname' undefined"; print("$txt\n"); |
487 |
|
|
- affaErrorExit( 139, "$txt" ); |
488 |
|
|
+ affaErrorExit( "$txt" ); |
489 |
|
|
} |
490 |
|
|
$HostKeyAliasOption="-o HostKeyAlias=$jobname"; |
491 |
|
|
getJobConfig($jobname); |
492 |
|
|
@@ -2318,11 +2326,11 @@ |
493 |
|
|
$s="Generating DSA keys..."; |
494 |
|
|
print "$s\n"; lg($s); |
495 |
|
|
@cmd=("/usr/bin/ssh-keygen",$sshQuiet,"-t","dsa","-N ''","-f", "/root/.ssh/id_dsa" ); |
496 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 119, "Couldn't generate DSA keys" ); |
497 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "Couldn't generate DSA keys" ); |
498 |
|
|
$s="Successfully created DSA key pair."; |
499 |
|
|
print "$s\n"; lg($s); |
500 |
|
|
} |
501 |
|
|
- open( PUBK, $kf ) or affaErrorExit( 156, "Could not open $kf" ); |
502 |
|
|
+ open( PUBK, $kf ) or affaErrorExit( "Could not open $kf" ); |
503 |
|
|
my $pubk=trim(<PUBK>); |
504 |
|
|
close( PUBK ); |
505 |
|
|
my $cmd; |
506 |
|
|
@@ -2365,7 +2373,7 @@ |
507 |
|
|
if( not $affa->get($jobname)||'' ) |
508 |
|
|
{ |
509 |
|
|
my $txt= "Error: Job '$jobname' undefined"; print("$txt\n"); |
510 |
|
|
- affaErrorExit( 153, "$txt" ); |
511 |
|
|
+ affaErrorExit( "$txt" ); |
512 |
|
|
} |
513 |
|
|
$HostKeyAliasOption="-o HostKeyAlias=$jobname"; |
514 |
|
|
getJobConfig($jobname); |
515 |
|
|
@@ -2373,7 +2381,7 @@ |
516 |
|
|
$port = $job{'sshPort'} ? $job{'sshPort'} : 22; |
517 |
|
|
} |
518 |
|
|
|
519 |
|
|
- open( PUBK, $kf ) or affaErrorExit( 154, "Could not open $kf" ); |
520 |
|
|
+ open( PUBK, $kf ) or affaErrorExit( "Could not open $kf" ); |
521 |
|
|
my $pubk=trim(<PUBK>); |
522 |
|
|
close( PUBK ); |
523 |
|
|
|
524 |
|
|
@@ -2397,7 +2405,7 @@ |
525 |
|
|
{ |
526 |
|
|
$s="Deleting public key on $remotehost failed."; |
527 |
|
|
print "$s\n"; |
528 |
|
|
- affaErrorExit( 155, $s ); |
529 |
|
|
+ affaErrorExit( $s ); |
530 |
|
|
} |
531 |
|
|
$s="Public key deleted on $remotehost"; |
532 |
|
|
print "$s\n"; lg($s); |
533 |
|
|
@@ -2433,6 +2441,80 @@ |
534 |
|
|
} |
535 |
|
|
} |
536 |
|
|
|
537 |
|
|
+ |
538 |
|
|
+sub createBackupFile() |
539 |
|
|
+ { |
540 |
|
|
+ my $jobname=$ARGV[0]||''; |
541 |
|
|
+ my $archive=$ARGV[1]||'scheduled.0'; |
542 |
|
|
+ my $txt; |
543 |
|
|
+ |
544 |
|
|
+ if( not $affa->get($jobname)||'' ) |
545 |
|
|
+ { |
546 |
|
|
+ $txt= "Job '$jobname' undefined"; print("Error: $txt\n"); |
547 |
|
|
+ affaErrorExit( "$txt" ); |
548 |
|
|
+ } |
549 |
|
|
+ getJobConfig( $jobname ); |
550 |
|
|
+ |
551 |
|
|
+ if( $job{'AutomountDevice'} and $job{'AutomountPoint'} ) |
552 |
|
|
+ { |
553 |
|
|
+ mount( $job{'AutomountDevice'}, $job{'AutomountPoint'}, $job{'AutomountOptions'} ); |
554 |
|
|
+ } |
555 |
|
|
+ |
556 |
|
|
+ # check if a job is running |
557 |
|
|
+ if( getLock("$lockdir/$jobname") ) |
558 |
|
|
+ { |
559 |
|
|
+ print "Job '$jobname' is running. Wait for completion. Then run affa --create-backup-file again.\n"; |
560 |
|
|
+ affaErrorExit( "affa job 'jobname' is running." ); |
561 |
|
|
+ } |
562 |
|
|
+ |
563 |
|
|
+ # check if archive exists |
564 |
|
|
+ checkArchiveExists($job{'RootDir'},$jobname,$archive); |
565 |
|
|
+ |
566 |
|
|
+ my $outfile=$opts{'outfile'}; |
567 |
|
|
+ $outfile=$cwd if not $outfile; |
568 |
|
|
+ $outfile .= '/smeserver.tgz' if -d $outfile; |
569 |
|
|
+ |
570 |
|
|
+ if( -f $outfile ) |
571 |
|
|
+ { |
572 |
|
|
+ $txt= "File $outfile already exists."; print("Error: $txt\n"); |
573 |
|
|
+ affaErrorExit( "$txt" ); |
574 |
|
|
+ } |
575 |
|
|
+ |
576 |
|
|
+ unless ( open( OUT, ">$outfile" ) ) |
577 |
|
|
+ { |
578 |
|
|
+ $txt= "Could not open $outfile for writing."; print("Error: $txt\n"); |
579 |
|
|
+ affaErrorExit( "$txt" ); |
580 |
|
|
+ } |
581 |
|
|
+ close( OUT ); |
582 |
|
|
+ unlink( $outfile ); |
583 |
|
|
+ |
584 |
|
|
+ my $affastatus = esmith::DB::db->open("/home/e-smith/db/affa-report/$jobname"); |
585 |
|
|
+ my $size=$affastatus->get_prop( $archive, 'TotalFileSize' ) || 0; |
586 |
|
|
+ $size =~ s/(\d*).*/$1/; |
587 |
|
|
+ my $f; |
588 |
|
|
+ my $restore_list=''; |
589 |
|
|
+ my $dir = opendir( DIR, "$job{'RootDir'}/$jobname/$archive" ); |
590 |
|
|
+ while( defined ($f=readdir(DIR)) ) |
591 |
|
|
+ { |
592 |
|
|
+ next if $f =~ /^(.AFFA-REPORT|$jobname-setup.pl|\.|\.\.)$/; |
593 |
|
|
+ $restore_list.="$f "; |
594 |
|
|
+ } |
595 |
|
|
+ close(DIR); |
596 |
|
|
+ my @cmd=('/bin/tar', '-C', "$job{'RootDir'}/$jobname/$archive/", '-cf - ', $restore_list, |
597 |
|
|
+ '|', '/usr/bin/pv -i 0.3', "-s $size", |
598 |
|
|
+ '|', '/bin/gzip', |
599 |
|
|
+ "> $outfile" |
600 |
|
|
+ ); |
601 |
|
|
+ my $status=ExecCmd( @cmd, 0 ); |
602 |
|
|
+ if( $status!=0 ) |
603 |
|
|
+ { |
604 |
|
|
+ unlink( $outfile ); |
605 |
|
|
+ $txt= "Could not create $outfile."; print("Error: $txt\n"); |
606 |
|
|
+ affaErrorExit( "$txt" ); |
607 |
|
|
+ } |
608 |
|
|
+ $txt="Backup file '$outfile' created."; print("$txt\n"); lg( $txt); |
609 |
|
|
+ } |
610 |
|
|
+ |
611 |
|
|
sub showSchedule() |
612 |
|
|
{ |
613 |
|
|
my $res=$opts{15} ? 15 : 30; |
614 |
|
|
@@ -2523,7 +2605,7 @@ |
615 |
|
|
if( not $affa->get($jobname)||'' ) |
616 |
|
|
{ |
617 |
|
|
my $txt= "Error: Job '$jobname' undefined"; print("$txt\n"); |
618 |
|
|
- affaErrorExit( 138, "$txt" ); |
619 |
|
|
+ affaErrorExit( "$txt" ); |
620 |
|
|
} |
621 |
|
|
getJobConfig( $jobname ); |
622 |
|
|
my $msg = new Mail::Send; |
623 |
|
|
@@ -2564,7 +2646,7 @@ |
624 |
|
|
chmod( 0700, "/usr/lib/affa/$WDName" ); |
625 |
|
|
remoteCopy("/usr/lib/affa/$WDName", "/tmp/"); |
626 |
|
|
my @cmd=('/usr/bin/ssh', '-p', $job{'sshPort'}, '-o', "HostKeyAlias=$jobname", $sshQuiet, $job{'remoteHostName'},"/tmp/$WDName"); |
627 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 152, "Couldn't run /usr/lib/affa/$WDName on remote host." ); |
628 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "Couldn't run /usr/lib/affa/$WDName on remote host." ); |
629 |
|
|
} |
630 |
|
|
|
631 |
|
|
sub trim($) |
632 |
|
|
@@ -2764,7 +2846,7 @@ |
633 |
|
|
"--rsync-path='$rsyncRemote'", |
634 |
|
|
"--rsh='/usr/bin/ssh -o HostKeyAlias=$jobname -p $job{'sshPort'}'", |
635 |
|
|
$src, $job{'remoteHostName'}.":$dst" ); |
636 |
|
|
- not ExecCmd( @cmd, 0 ) or affaErrorExit( 151, "Couldn't copy $src to remote host." ); |
637 |
|
|
+ not ExecCmd( @cmd, 0 ) or affaErrorExit( "Couldn't copy $src to remote host." ); |
638 |
|
|
} |
639 |
|
|
|
640 |
|
|
sub showVersion() |
641 |
|
|
@@ -2808,6 +2890,7 @@ |
642 |
|
|
print " or affa --revoke-key JOB\n"; |
643 |
|
|
print " or affa --revoke-key --host=TARGETHOST [--port=PORT] [--remoteOS=cygwin]\n"; |
644 |
|
|
print " or affa --check-connections\n"; |
645 |
|
|
+ print " or affa --create-backup-file JOB [ARCHIVE] [--outfile=FILE]\n"; |
646 |
|
|
print " or affa --kill JOB\n"; |
647 |
|
|
print " or affa --version\n"; |
648 |
|
|
print " or affa --help\n"; |
649 |
|
|
@@ -2831,7 +2914,7 @@ |
650 |
|
|
if( not $affa->get($jobname)||'' ) |
651 |
|
|
{ |
652 |
|
|
my $txt= "Error: Job '$jobname' undefined"; print("$txt\n"); |
653 |
|
|
- affaErrorExit( 157, "$txt" ); |
654 |
|
|
+ affaErrorExit( "$txt" ); |
655 |
|
|
} |
656 |
|
|
my $pid=getLock("$lockdir/$jobname"); |
657 |
|
|
if( $pid ) |
658 |
|
|
@@ -2857,7 +2940,7 @@ |
659 |
|
|
lg("$Command run killed"); |
660 |
|
|
if( $Command eq "scheduled" ) |
661 |
|
|
{ |
662 |
|
|
- affaErrorExit( 1, "Caught interrupt signal $sig"); |
663 |
|
|
+ affaErrorExit( "Caught interrupt signal $sig"); |
664 |
|
|
} |
665 |
|
|
else |
666 |
|
|
{ |
667 |
|
|
@@ -2866,13 +2949,15 @@ |
668 |
|
|
} |
669 |
|
|
} |
670 |
|
|
|
671 |
|
|
-sub affaErrorExit( $$ ) |
672 |
|
|
+sub affaErrorExit($) |
673 |
|
|
{ |
674 |
|
|
- (my $err, my $msg) = @_; |
675 |
|
|
+ (my $msg) = @_; |
676 |
|
|
+ my $err=(caller)[2]; |
677 |
|
|
+ my $sub=(caller(1))[3]||''; |
678 |
|
|
lg( "Error $err: $msg" ); |
679 |
|
|
print "Error $err: $msg\n" if $interactive==1; |
680 |
|
|
emptyTrash() if $Command eq "scheduled"; |
681 |
|
|
- execPostJobCommand($err) if $err != 115; |
682 |
|
|
+ execPostJobCommand($err) if $sub ne 'main::execPostJobCommand'; |
683 |
|
|
unmountAll(); |
684 |
|
|
sendErrorMesssage(); |
685 |
|
|
removeLock(); |
686 |
|
|
--- smeserver-affa-0.9.0/root/etc/profile.d/affa.sh.createBackupFileOption 2008-01-18 16:50:15.000000000 +0100 |
687 |
|
|
+++ smeserver-affa-0.9.0/root/etc/profile.d/affa.sh 2008-03-07 19:40:21.000000000 +0100 |
688 |
|
|
@@ -4,13 +4,13 @@ |
689 |
|
|
case $COMP_CWORD in |
690 |
|
|
# option |
691 |
|
|
1) |
692 |
|
|
- COMPREPLY=( $(/sbin/e-smith/affa | grep " affa $cur"|awk '{print $3}' ) ) |
693 |
|
|
+ COMPREPLY=( $(/sbin/e-smith/affa --_shorthelp | grep " affa $cur"|awk '{print $3}' ) ) |
694 |
|
|
;; |
695 |
|
|
# job |
696 |
|
|
2) |
697 |
|
|
- /sbin/e-smith/affa --help | grep -qs -- "${COMP_WORDS[1]}.*JOB" |
698 |
|
|
+ /sbin/e-smith/affa --_shorthelp | grep -qs -- "${COMP_WORDS[1]}.*JOB" |
699 |
|
|
if [ "$?" == 0 ] ; then |
700 |
|
|
- COMPREPLY=( $(/sbin/e-smith/affa --jobs | grep "^$cur" ) ) |
701 |
|
|
+ COMPREPLY=( $(/sbin/e-smith/affa --_jobs | grep "^$cur" ) ) |
702 |
|
|
fi |
703 |
|
|
;; |
704 |
|
|
esac |