/[smeserver]/rpms/e-smith-backup/sme8/e-smith-backup-2.2.0-nolowercase.patch
ViewVC logotype

Annotation of /rpms/e-smith-backup/sme8/e-smith-backup-2.2.0-nolowercase.patch

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Mon Feb 15 10:18:55 2010 UTC (14 years, 8 months ago) by dungog
Branch: MAIN
CVS Tags: e-smith-backup-2_2_0-30_el5_sme, e-smith-backup-2_2_0-40_el5_sme, e-smith-backup-2_2_0-44_el5_sme, e-smith-backup-2_2_0-41_el5_sme, e-smith-backup-2_2_0-52_el5_sme, e-smith-backup-2_2_0-38_el5_sme, e-smith-backup-2_2_0-43_el5_sme, e-smith-backup-2_2_0-48_el5_sme, e-smith-backup-2_2_0-36_el5_sme, e-smith-backup-2_2_0-35_el5_sme, e-smith-backup-2_2_0-34_el5_sme, e-smith-backup-2_2_0-50_el5_sme, e-smith-backup-2_2_0-51_el5_sme, e-smith-backup-2_2_0-39_el5_sme, e-smith-backup-2_2_0-33_el5_sme, e-smith-backup-2_2_0-45_el5_sme, e-smith-backup-2_2_0-32_el5_sme, e-smith-backup-2_2_0-53_el5_sme, e-smith-backup-2_2_0-42_el5_sme, e-smith-backup-2_2_0-37_el5_sme, e-smith-backup-2_2_0-31_el5_sme, e-smith-backup-2_2_0-49_el5_sme, e-smith-backup-2_2_0-47_el5_sme, e-smith-backup-2_2_0-46_el5_sme
* Mon Feb 15 2010 Stephen Noble <support@dungog.net> 2.2.0-30.sme
- Improved upgrade compatibility, remove .orig [SME: 4809]

1 dungog 1.1 diff -urN e-smith-backup-2.2.0/root/etc/e-smith/events/actions/workstation-backup-dar e-smith-backup-2.2.0.new/root/etc/e-smith/events/actions/workstation-backup-dar
2     --- e-smith-backup-2.2.0/root/etc/e-smith/events/actions/workstation-backup-dar 2010-02-15 20:54:05.000000000 +1100
3     +++ e-smith-backup-2.2.0.new/root/etc/e-smith/events/actions/workstation-backup-dar 2010-02-15 20:58:18.000000000 +1100
4     @@ -151,7 +151,7 @@
5    
6     chomp $vollbl;
7     chomp $blkdev;
8     - $vollbl = lc("media/$vollbl");
9     + $vollbl = "media/$vollbl";
10     if ($vollbl eq $smbshare) {
11     $device = $blkdev;
12     }
13     diff -urN e-smith-backup-2.2.0/root/etc/e-smith/web/functions/backup e-smith-backup-2.2.0.new/root/etc/e-smith/web/functions/backup
14     --- e-smith-backup-2.2.0/root/etc/e-smith/web/functions/backup 2010-02-15 20:54:05.000000000 +1100
15     +++ e-smith-backup-2.2.0.new/root/etc/e-smith/web/functions/backup 2010-02-15 20:57:42.000000000 +1100
16     @@ -1221,7 +1221,7 @@
17     my $vollbl = qx(hal-get-property --udi $1 --key volume.label);
18     $vollbl =~ m/^(\S+)/;
19     if ($vollbl =~ /^\s/) {$vollbl = 'nolabel';}
20     - push @usbdisks, lc($vollbl);
21     + push @usbdisks, $vollbl;
22     }
23    
24     unless ($usbdisks[0]){
25     @@ -3254,7 +3254,7 @@
26    
27     chomp $vollbl;
28     chomp $blkdev;
29     - $vollbl = lc("media/$vollbl");
30     + $vollbl = "media/$vollbl";
31     if ($vollbl eq $share) {
32     $device = $blkdev;
33     }
34     diff -urN e-smith-backup-2.2.0/root/etc/e-smith/web/functions/backup.orig e-smith-backup-2.2.0.new/root/etc/e-smith/web/functions/backup.orig
35     --- e-smith-backup-2.2.0/root/etc/e-smith/web/functions/backup.orig 2010-02-15 20:54:05.000000000 +1100
36     +++ e-smith-backup-2.2.0.new/root/etc/e-smith/web/functions/backup.orig 1970-01-01 10:00:00.000000000 +1000
37     @@ -1,3271 +0,0 @@
38     -#!/usr/bin/perl -wT
39     -#----------------------------------------------------------------------
40     -# heading : Administration
41     -# description : Backup or restore
42     -# navigation : 4000 4200
43     -# Copyright (C) 2002 Mitel Networks Corporation
44     -#
45     -# This program is free software; you can redistribute it and/or modify
46     -# it under the terms of the GNU General Public License as published by
47     -# the Free Software Foundation; either version 2 of the License, or
48     -# (at your option) any later version.
49     -#
50     -# This program is distributed in the hope that it will be useful,
51     -# but WITHOUT ANY WARRANTY; without even the implied warranty of
52     -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53     -# GNU General Public License for more details.
54     -#
55     -# You should have received a copy of the GNU General Public License
56     -# along with this program; if not, write to the Free Software
57     -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
58     -#
59     -# Technical support for this program is available from Mitel Networks
60     -# Please visit our web site www.mitel.com/sme/ for details.
61     -#----------------------------------------------------------------------
62     -use strict;
63     -use esmith::FormMagick;
64     -use esmith::ConfigDB;
65     -use esmith::Backup;
66     -use esmith::BackupHistoryDB;
67     -use esmith::AccountsDB;
68     -use esmith::cgi;
69     -use esmith::util;
70     -use esmith::lockfile;
71     -use File::Find;
72     -
73     -$File::Find::dont_use_nlink = 1; # fix for Windows shares
74     -
75     -my $fm = esmith::FormMagick->new();
76     -
77     -# These statements _must_ come _after_ the FormMagick constructor. It sets
78     -# POST_MAX and DISABLE_UPLOADS to values that will cause this script to fail
79     -# on restores and verification of files.
80     -$CGI::POST_MAX = -1; # allow any size POST
81     -$CGI::DISABLE_UPLOADS = 0; # need to upload to restore from desktop
82     -
83     -$fm->parse_xml();
84     -
85     -my $conf = esmith::ConfigDB->open()
86     - || die $fm->localise('CANNOT_OPEN').'configuration db';
87     -
88     -my $restore = esmith::ConfigDB->open('/etc/e-smith/restore')
89     - || die $fm->localise('CANNOT_OPEN').'/etc/e-smith/restore';
90     -
91     -my $es_backup = new esmith::Backup or die "Couldn't create Backup object\n";
92     -
93     -my @directories = $es_backup->restore_list;
94     -@directories = grep { -e "/$_" } @directories;
95     -
96     -# Unbuffer standard output so that files and directories are listed as
97     -# they are restored
98     -$| = 1;
99     -
100     -# Store away current gid of 'www' group.
101     -my $www_gid = getgrnam("www");
102     -
103     -#------------------------------------------------------------
104     -# examine state parameter and display the appropriate form
105     -#------------------------------------------------------------
106     -
107     -my $q = $fm->{cgi};
108     -
109     -if (! grep (/^state$/, $q->param))
110     -{
111     - showInitial ($q, '');
112     -}
113     -elsif ($q->param ('state') eq "perform")
114     -{
115     - performAndShowResult ($q);
116     -}
117     -elsif ($q->param ('state') eq "tape-configure")
118     -{
119     - updateTapeBackupConfig($q);
120     -}
121     -elsif ($q->param ('state') eq "tape-restore")
122     -{
123     - performTapeRestore ($q);
124     -}
125     -elsif ($q->param ('state') eq "workstn-configure")
126     -{
127     - WorkstnBackupConfig1($q);
128     -}
129     -elsif ($q->param ('state') eq "workstn-configure1")
130     -{
131     - updateWorkstnBackupConfig($q);
132     -}
133     -elsif ($q->param ('state') eq "workstn-verify")
134     -{
135     - performWorkstnVerify($q);
136     -}
137     -elsif ($q->param ('state') eq "workstn-restore")
138     -{
139     - performWorkstnRestore ($q);
140     -}
141     -elsif ($q->param ('state') eq "workstn-sel-restore")
142     -{
143     - performWorkstnSelRestore ($q);
144     -}
145     -elsif ($q->param ('state') eq "workstn-sel-restore2")
146     -{
147     - performWorkstnSelRestore2 ($q);
148     -}
149     -else
150     -{
151     - esmith::cgi::genStateError ($q, undef);
152     -}
153     -
154     -exit (0);
155     -
156     -#------------------------------------------------------------
157     -# subroutine to display initial form
158     -#------------------------------------------------------------
159     -
160     -sub showInitial
161     -{
162     - my ($q, $msg) = @_;
163     -
164     - my $rec = $restore->get('restore');
165     - if($msg eq '')
166     - {
167     - if($rec)
168     - {
169     - $msg = $rec->prop('errmsg') || '';
170     - $rec->delete_prop('errmsg');
171     - }
172     - }
173     -
174     - if ($msg eq '')
175     - {
176     - esmith::cgi::genHeaderNonCacheable ($q, undef,
177     - $fm->localise('BACKUP_TITLE'));
178     - }
179     - else
180     - {
181     - esmith::cgi::genHeaderNonCacheable
182     - ($q, undef, $fm->localise('OPERATION_STATUS_REPORT'));
183     -
184     - print $q->div ({-class => "sme-error"}, $msg);
185     - print $q->hr;
186     - }
187     - print $q->div({-class => 'error'},
188     - $q->h5('Warning: a reboot is required before proceeding!
189     - Failure to reboot now may leave your system in an unknown
190     - state!'))
191     - if $conf->get_prop('bootstrap-console', 'Run') eq 'yes';
192     -
193     - my ($tarsize, $dumpsize, undef, undef) = &CalculateSizes();
194     -
195     - my $module = $conf->get('backup');
196     - if ($module)
197     - {
198     - $module = $module->prop('Program');
199     - }
200     -
201     - # The default e-smith backup program is flexbackup.
202     -
203     - unless (defined $module)
204     - {
205     - $module = "flexbackup";
206     - }
207     - elsif ($module eq '')
208     - {
209     - $module = "flexbackup";
210     - }
211     -
212     - # Hack to evaluate embedded vars
213     - print eval 'return "'.$fm->localise('BACKUP_DESC_DAR').'\n";';
214     -
215     - if ($tarsize =~ /Tb/ or $tarsize =~ /(\d+)Gb/ and $1 >= 2)
216     - {
217     - print $fm->localise("BACKUP_DESKTOP_TOO_BIG"), "\n";
218     - }
219     -
220     - print $q->h2($fm->localise("BACKUP_CONFIG_STATUS")),"\n";
221     -
222     - my $backup_status = $conf->get('backup');
223     - if ($backup_status)
224     - {
225     - $backup_status = $backup_status->prop('status');
226     - }
227     -
228     - if (defined $backup_status && $backup_status eq "enabled")
229     - {
230     - my $backupTime = $conf->get('backup')->prop('backupTime');
231     - my $reminderTime = $conf->get('backup')->prop('reminderTime');
232     -
233     - print $q->p ($fm->localise('TAPE_BACKUPS_ENABLED'),
234     - $fm->localise('BACKUPS_RUN_AT'),$q->b($backupTime),
235     - $fm->localise('REMINDER_MESSAGE_AT'),$q->b($reminderTime)),
236     - "\n";
237     - }
238     - else
239     - {
240     - print $q->p($fm->localise('TAPE_BACKUPS_DISABLED')),"\n";
241     - }
242     -
243     - my $backupwk_status = $conf->get('backupwk');
244     - if ($backupwk_status)
245     - {
246     - $backupwk_status = $backupwk_status->prop('status');
247     - }
248     -
249     - if (defined $backupwk_status && $backupwk_status eq "enabled")
250     - {
251     - my $backupwkTime = $conf->get('backupwk')->prop('BackupTime');
252     -
253     - print $q->p ($fm->localise('WORKSTN_BACKUPS_ENABLED'),
254     - $fm->localise('WKBACKUPS_RUN_AT'),$q->b($backupwkTime));
255     - }
256     - else
257     - {
258     - print $q->p($fm->localise('WORKSTN_BACKUPS_DISABLED'));
259     - }
260     -
261     - my %labels = (
262     - "desktop-backup" => $fm->localise('DESKTOP_BACKUP'),
263     - "tape-configure" => $fm->localise('TAPE_CONFIGURE'),
264     - "tape-restore" => $fm->localise('TAPE_RESTORE'),
265     - "workstn-configure" => $fm->localise('WORKSTN_CONFIGURE'),
266     - "workstn-verify" => $fm->localise('WORKSTN_VERIFY'),
267     - "workstn-restore" => $fm->localise('WORKSTN_RESTORE'),
268     - "workstn-sel-restore" => $fm->localise('WORKSTN_SEL_RESTORE'),
269     - );
270     -
271     - my @labels = (
272     - 'desktop-backup',
273     - 'tape-configure',
274     - 'tape-restore',
275     - 'workstn-configure',
276     - 'workstn-verify',
277     - 'workstn-restore',
278     - 'workstn-sel-restore',
279     - );
280     -
281     - my $default_action = 'desktop-backup';
282     -
283     - my $restore_state;
284     - if($rec)
285     - {
286     - $restore_state = $rec->prop('state');
287     - }
288     -
289     - unless (defined $restore_state)
290     - {
291     - # Undefined, set it to idle
292     - if ($rec)
293     - {
294     - $rec->reset_props(type=>'status', state=>'idle', finish=>0,
295     - start=>0);
296     - }
297     - else
298     - {
299     - $rec = $restore->new_record('restore',
300     - {type=>'status', state=>'idle', finish=>0, start=>0});
301     - }
302     - $restore_state = 'idle';
303     - }
304     - elsif ($restore_state eq 'running')
305     - {
306     - my $start = $rec->prop('start');
307     - $start = scalar localtime($start);
308     -
309     - print $q->p ($fm->localise('RESTORE_IN_PROGRESS_BEGAN_AT')
310     - . "<b>$start</b>.\n" );
311     -
312     - %labels = (
313     - "refresh" => $fm->localise('REFRESH_THIS_DISPLAY'),
314     - "tape-configure" => $fm->localise('CONFIGURE_TAPE_BACKUP'),
315     - "workstn-configure" => $fm->localise('CONFIGURE_WORKSTN_BACKUP'),
316     - );
317     -
318     - @labels = (
319     - 'refresh',
320     - 'tape-configure',
321     - 'workstn-configure',
322     - );
323     -
324     - $default_action = 'refresh';
325     - }
326     - elsif ($restore_state eq 'complete')
327     - {
328     - my $start = $rec->prop('start');
329     - $start = scalar localtime($start);
330     - my $finish = $rec->prop('finish');
331     - $finish = scalar localtime($finish);
332     -
333     - print $q->p ($fm->localise('RESTORE_COMPLETED'),$q->br(),
334     - $fm->localise('STARTED_AT'),$q->b($start),$q->br(),
335     - $fm->localise('FINISHED_AT'),$q->b($finish)),"\n";
336     -
337     - print $q->p (
338     - $q->b ($fm->localise('YOU_MUST_REBOOT')
339     - )
340     - ),"\n";
341     -
342     - $default_action = 'reboot';
343     - }
344     - else
345     - {
346     - # Unknown state. Reset it to idle
347     -
348     - $rec->set_prop('state', 'idle');
349     - $restore_state = 'idle';
350     - }
351     -
352     - print $q->startform(
353     - -method => 'POST',
354     - -action => $q->url (-absolute => 1)
355     - ),"\n";
356     -
357     - print $q->start_table ({-class => "sme-noborders"}),"\n";
358     -
359     - if ($default_action eq 'reboot')
360     - {
361     - print $q->start_table ({width => "100%", -class => "sme-noborders"}),"\n";
362     - print esmith::cgi::genButtonRow(
363     - $q,
364     - $q->submit (-name => 'action', -value =>
365     - $fm->localise('REBOOT'))
366     - );
367     - # Put in a hidden widget to store the reboot value.
368     - print $q->hidden(
369     - -name => 'function',
370     - -value => 'reboot'
371     - ),"\n";
372     - print $q->end_table,"\n";
373     - }
374     - else
375     - {
376     - print $q->Tr(
377     - $q->td({-class => "sme-noborders-label"},
378     - $fm->localise("SELECT_AN_ACTION")),
379     - $q->td({-class => "sme-noborders-content"},
380     - $q->popup_menu (
381     - -name => 'function',
382     - -values => [ @labels ],
383     - -default => $default_action,
384     - -labels => \%labels
385     - )
386     - )
387     - ),"\n";
388     -
389     - }
390     -
391     - print $q->end_table,"\n";
392     -
393     - if ($default_action ne 'reboot')
394     - {
395     - print $q->start_table ({width => "100%", -class => "sme-noborders"}),
396     - "\n";
397     -
398     - print esmith::cgi::genButtonRow(
399     - $q,
400     - $q->submit (-name => 'action', -value =>
401     - $fm->localise('PERFORM'))
402     - );
403     -
404     - print $q->end_table,"\n";
405     - }
406     -
407     - print $q->hidden (
408     - -name => 'state',
409     - -override => 1,
410     - -default => 'perform'
411     - ),"\n";
412     -
413     - print $q->endform,"\n";
414     -
415     - esmith::cgi::genFooter($fm);
416     -
417     - return;
418     -}
419     -
420     -sub performAndShowResult
421     -{
422     - my ($q) = @_;
423     -
424     - my $function = $q->param ('function');
425     -
426     - if ($function eq 'refresh')
427     - {
428     - showInitial ($q, '');
429     - }
430     - elsif ($function eq 'reboot')
431     - {
432     - performReboot();
433     - }
434     - elsif ($function eq 'desktop-backup')
435     - {
436     - desktopBackup();
437     - }
438     - elsif ($function eq 'tape-configure')
439     - {
440     - TapeBackupConfig ($q);
441     - }
442     - elsif ($function eq 'tape-restore')
443     - {
444     - tapeRestore();
445     - }
446     - elsif ($function eq 'workstn-configure')
447     - {
448     - WorkstnBackupConfig ($q);
449     - }
450     - elsif ($function eq 'workstn-verify')
451     - {
452     - workstnVerify();
453     - }
454     - elsif ($function eq 'workstn-restore')
455     - {
456     - workstnRestore();
457     - }
458     - elsif ($function eq 'workstn-sel-restore')
459     - {
460     - workstnSelRestore();
461     - }
462     - else
463     - {
464     - # Unknown function - refresh the screen anyway
465     - showInitial ($q, 'unknown');
466     - }
467     -
468     - return;
469     -
470     - esmith::cgi::genHeaderNonCacheable ($q, undef,
471     - $fm->localise("X_BACKUP_OR_RESTORE"));
472     - print $q->p ( $function );
473     - esmith::cgi::genFooter($fm);
474     -}
475     -
476     -sub desktopBackupRecordStatus
477     -{
478     - my ($backup, $phase, $status) = @_;
479     - my $now = time();
480     -
481     - warn("Backup terminated: $phase failed - status: $status\n");
482     - $backup->set_prop('EndEpochTime', "$now");
483     - $backup->set_prop('Result', "$phase:$status");
484     -}
485     -
486     -sub desktopBackup ()
487     -{
488     - # Generate a header that will trigger a download and send data as
489     - # an octet stream.
490     -
491     - my $backups = esmith::BackupHistoryDB->open;
492     - my $now = time();
493     - my $backup_rec = $backups->new_record($now, {
494     - type => 'backup_record',
495     - BackupType => 'desktop',
496     - StartEpochTime => $now,
497     - });
498     -
499     - # Dump the current mysql tables so that they are part of the image.
500     - # The events handle cases where mysqld is not enabled, and/or is
501     - # not running.
502     -
503     - my $status = system("/sbin/e-smith/signal-event", "pre-backup", "desktop");
504     - if ($status)
505     - {
506     - desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
507     - esmith::cgi::genHeaderNonCacheable(
508     - $fm->{cgi},
509     - undef, $fm->localise('OPERATION_STATUS_REPORT'));
510     - esmith::cgi::genResult(
511     - $fm->{cgi}, $fm->localise('ERR_PRE_BACKUP'));
512     - return;
513     - }
514     -
515     - print "Expires: 0\n";
516     - print "Content-type: application/octet-stream\n";
517     - print "Content-disposition: attachment; filename=smeserver.tgz\n";
518     - print "\n";
519     - setpgrp;
520     - my $ourpgrp = getpgrp;
521     - local $SIG{PIPE} = sub
522     - {
523     - local $SIG{HUP} = 'IGNORE';
524     - warn "Got sigpipe - sending HUP to $ourpgrp\n";
525     - kill HUP => -$ourpgrp;
526     - desktopBackupRecordStatus($backup_rec,
527     - 'send2browser', 'Incomplete');
528     - exit 1;
529     - };
530     -
531     - open(RD,
532     - "/bin/tar --directory / --create @directories --file=-"
533     - . " | /usr/bin/gzip |"
534     - );
535     -
536     - while (<RD>)
537     - {
538     - print;
539     - }
540     -
541     - close RD;
542     -
543     - # Remove the dumped tables.
544     -
545     - $status = system("/sbin/e-smith/signal-event", "post-backup", "desktop");
546     - if ($status)
547     - {
548     - desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
549     - die ($fm->localise('ERR_POST_BACKUP'),"\n");
550     - }
551     - $now = time();
552     - $backup_rec->set_prop('EndEpochTime', "$now");
553     - $backup_rec->set_prop('Result', "0");
554     -}
555     -
556     -sub TapeBackupConfig
557     -{
558     - my ($q) = @_;
559     - my $enabledChk = "";
560     - my $backupAMPM = 'AM';
561     - my $backupMin;
562     - my $backupHour;
563     - my $reminderAMPM = 'AM';
564     - my $reminderMin;
565     - my $reminderHour;
566     -
567     - esmith::cgi::genHeaderNonCacheable(
568     - $q, undef, $fm->localise('ENABLE_DISABLE_TAPE'));
569     -
570     - print $q->p ($fm->localise('TAPE_CONFIG_DESC'));
571     -
572     - # Obtain time for backup from the backup cron template
573     - my $rec = $conf->get('backup');
574     - my $backupTime = "2:00";
575     - if ($rec)
576     - {
577     - $backupTime = $rec->prop('backupTime') || "2:00";
578     - }
579     -
580     - ($backupHour, $backupMin) = split (":", $backupTime, -1);
581     -
582     - if ($backupHour > 11)
583     - {
584     - if ($backupHour > 12)
585     - {
586     - $backupHour -= 12;
587     - }
588     - $backupAMPM = 'PM';
589     - }
590     -
591     - # Obtain time for reminder notice from the backup cron template
592     - my $reminderTime = "14:00";
593     - if ($rec)
594     - {
595     - $reminderTime = $rec->prop('reminderTime') || "14:00";
596     - }
597     -
598     - ($reminderHour, $reminderMin) = split (":", $reminderTime, -1);
599     -
600     - if ($reminderHour > 12)
601     - {
602     - $reminderHour -= 12;
603     - $reminderAMPM = 'PM';
604     - }
605     -
606     - print $q->startform(
607     - -method => 'POST',
608     - -action => $q->url (-absolute => 1)
609     - );
610     -
611     - print $q->start_table ({-class => "sme-noborders"});
612     -
613     - my $backup_status;
614     - if ($rec)
615     - {
616     - $backup_status = $rec->prop('status');
617     - }
618     -
619     - if (defined $backup_status && $backup_status eq "enabled")
620     - {
621     - $enabledChk = "checked";
622     - }
623     -
624     - print $q->Tr(
625     - $q->td(
626     - $fm->localise('ENABLE_TAPE_BACKUP')
627     - . " <input type=\"checkbox\""
628     - . " name=\"tapebackup\""
629     - . " $enabledChk"
630     - . " value=\"on\">"
631     - )
632     - );
633     -
634     - print $q->Tr(
635     - esmith::cgi::genCell(
636     - $q,$fm->localise('TAPE_BACKUP_TIME')
637     - ),
638     -
639     - esmith::cgi::genCell ($q, $q->textfield (-name => 'backupHour',
640     - -override => 1,
641     - -default => $backupHour,
642     - -size => 2)),
643     -
644     - esmith::cgi::genCell ($q, $q->textfield (-name => 'backupMin',
645     - -override => 1,
646     - -default => $backupMin,
647     - -size => 2)),
648     -
649     - esmith::cgi::genCell ($q, "AM/PM:"),
650     -
651     - esmith::cgi::genCell ($q, $q->popup_menu (-name => 'backupAMPM',
652     - -values => ['AM', 'PM'],
653     - -default => $backupAMPM)));
654     -
655     - my %timelabels=('AM' => $fm->localise('AM'),'PM' => $fm->localise('PM'));
656     - print $q->Tr(
657     - esmith::cgi::genCell(
658     - $q, $fm->localise('LOAD_TAPE_REMINDER_TIME')
659     - ),
660     -
661     - esmith::cgi::genCell(
662     - $q,
663     - $q->textfield(
664     - -name => 'reminderHour',
665     - -override => 1,
666     - -default => $reminderHour,
667     - -size => 2
668     - )
669     - ),
670     -
671     - esmith::cgi::genCell(
672     - $q,
673     - $q->textfield(
674     - -name => 'reminderMin',
675     - -override => 1,
676     - -default => $reminderMin,
677     - -size => 2
678     - )
679     - ),
680     -
681     - esmith::cgi::genCell($q, $fm->localise("AM/PM").":"),
682     -
683     - esmith::cgi::genCell(
684     - $q,
685     - $q->popup_menu(
686     - -name => 'reminderAMPM',
687     - -values => ['AM', 'PM'],
688     - -labels => \%timelabels,
689     - -default => $reminderAMPM
690     - )
691     - )
692     - );
693     -
694     - print "</table>\n";
695     - print $q->start_table ({width => "100%", -class => "sme-noborders"});
696     - print $q->Tr($q->th({-class => "sme-layout"},
697     - $q->submit(
698     - -name => 'action',
699     - -value => $fm->localise('UPDATE_CONF')
700     - )
701     - )
702     - );
703     -
704     - print $q->hidden(
705     - -name => 'state',
706     - -override => 1,
707     - -default => 'tape-configure'
708     - );
709     -
710     - print $q->endform;
711     - print '</table>';
712     -
713     - esmith::cgi::genFooter($fm);
714     - return;
715     -}
716     -
717     -sub updateTapeBackupConfig
718     -{
719     - my ($q) = @_;
720     -
721     - my $status = $q->param ('tapebackup');
722     - my $ampm;
723     -
724     - esmith::cgi::genHeaderNonCacheable(
725     - $q,
726     - undef, $fm->localise('UPDATING_TAPE_CONF')
727     - );
728     -
729     - if (defined $status && $status eq "on")
730     - {
731     -
732     - #--------------------------------------------------
733     - # Untaint parameters and check for validity
734     - #--------------------------------------------------
735     -
736     - my $backupHour = $q->param ('backupHour');
737     - if ($backupHour =~ /^(.*)$/) {
738     - $backupHour = $1;
739     - } else {
740     - $backupHour = "12";
741     - }
742     - if (($backupHour < 1) || ($backupHour > 12))
743     - {
744     - esmith::cgi::genResult(
745     - $fm->{cgi}, $fm->localise('ERR_INVALID_HOUR').$backupHour.
746     - $fm->localise('BETWEEN_1_AND_12')
747     - );
748     -
749     - return;
750     - }
751     -
752     - my $backupMin = $q->param ('backupMin');
753     - if ($backupMin =~ /^(.*)$/) {
754     - $backupMin = $1;
755     - } else {
756     - $backupMin = "0";
757     - }
758     - if (($backupMin < 0) || ($backupMin > 59))
759     - {
760     - esmith::cgi::genResult(
761     - $fm->{cgi}, $fm->localise('ERR_INVALID_MINUTE').$backupMin.
762     - $fm->localise('BETWEEN_0_AND_59')
763     - );
764     -
765     - return;
766     - }
767     -
768     - $backupMin = sprintf("%02d", $backupMin);
769     -
770     - $ampm = $q->param ('backupAMPM');
771     - if ($ampm =~ /^(.*)$/) {
772     - $ampm = $1;
773     - } else {
774     - $ampm = "AM";
775     - }
776     -
777     - # convert to 24 hour time
778     -
779     - $backupHour = $backupHour % 12;
780     - if ($ampm eq "PM")
781     - {
782     - $backupHour = $backupHour + 12;
783     - }
784     -
785     - my $reminderHour = $q->param ('reminderHour');
786     - if ($reminderHour =~ /^(.*)$/) {
787     - $reminderHour = $1;
788     - } else {
789     - $reminderHour = "12";
790     - }
791     - if (($reminderHour < 1) || ($reminderHour > 12))
792     - {
793     - esmith::cgi::genResult(
794     - $fm->{cgi},
795     - $fm->localise('ERR_INVALID_REMINDER_HOUR').$reminderHour
796     - .$fm->localise('BETWEEN_1_AND_12')
797     - );
798     -
799     - return;
800     - }
801     -
802     - my $reminderMin = $q->param ('reminderMin');
803     - if ($reminderMin =~ /^(.*)$/) {
804     - $reminderMin = $1;
805     - } else {
806     - $reminderMin = "0";
807     - }
808     - if (($reminderMin < 0) || ($reminderMin > 59))
809     - {
810     - esmith::cgi::genResult(
811     - $fm->{cgi}, $fm->localise('ERR_INVALID_REMINDER_MINUTE').
812     - $reminderMin.$fm->localise('BETWEEN_0_AND_59')
813     - );
814     - return;
815     - }
816     -
817     - $reminderMin = sprintf("%02d", $reminderMin);
818     -
819     - $ampm = $q->param ('reminderAMPM');
820     - if ($ampm =~ /^(.*)$/) {
821     - $ampm = $1;
822     - } else {
823     - $ampm = "AM";
824     - }
825     -
826     - # convert to 24 hour time
827     -
828     - $reminderHour = $reminderHour % 12;
829     - if ($ampm eq "PM")
830     - {
831     - $reminderHour = $reminderHour + 12;
832     - }
833     -
834     - # variables passed validity checks, set configuration database values
835     - my $old = $conf->get('UnsavedChanges')->value;
836     -
837     - my $rec = $conf->get('backup');
838     - unless (defined $rec)
839     - {
840     - $rec = $conf->new_record('backup', {type=>'service'});
841     - }
842     -
843     - $rec->set_prop('status', 'enabled');
844     -
845     - my $module = $rec->prop('Program');
846     -
847     - # The default e-smith backup program is flexbackup.
848     -
849     - unless (defined $module)
850     - {
851     - $module = "flexbackup";
852     - }
853     - elsif ($module eq '')
854     - {
855     - $module = "flexbackup";
856     - }
857     -
858     - $rec->set_prop('Program', $module);
859     - $rec->set_prop('backupTime', "$backupHour:$backupMin");
860     - $rec->set_prop('reminderTime', "$reminderHour:$reminderMin");
861     -
862     - $conf->get('UnsavedChanges')->set_value($old);
863     -
864     - system("/sbin/e-smith/signal-event", "conf-backup") == 0
865     - or die($fm->localise('ERR_CONF_BACKUP'),"\n");
866     -
867     - esmith::cgi::genResult(
868     - $fm->{cgi}, $fm->localise('SUCCESSFULLY_ENABLED_TAPE').$q->br().
869     - $fm->localise('WITH_BACKUP_TIME')."$backupHour:$backupMin".
870     - $q->br().$fm->localise('WITH_REMINDER_TIME').
871     - "$reminderHour:$reminderMin");
872     - }
873     - else
874     - {
875     - # set service to disabled
876     - my $old = $conf->get('UnsavedChanges')->value;
877     -
878     - my $rec = $conf->get('backup');
879     - unless ($rec)
880     - {
881     - $rec = $conf->new_record('backup', {type=>'service'});
882     - }
883     -
884     - $rec->set_prop('status', 'disabled');
885     - $conf->get('UnsavedChanges')->set_value($old);
886     -
887     - system("/sbin/e-smith/signal-event", "conf-backup") == 0
888     - or die($fm->localise('ERR_CONF_BACKUP')."\n");
889     -
890     - esmith::cgi::genResult(
891     - $fm->{cgi}, $fm->localise('SUCCESSFULLY_DISABLED')
892     - );
893     - }
894     -
895     - return;
896     -}
897     -
898     -sub tapeRestore ()
899     -{
900     - esmith::cgi::genHeaderNonCacheable(
901     - $q, undef, $fm->localise('RESTORE_CONF_FROM_TAPE'));
902     -
903     - print $fm->localise('RESTORE_CONF_FROM_TAPE_DESC');
904     -
905     - print $q->start_multipart_form(
906     - -method => 'POST',
907     - -action => $q->url (-absolute => 1)
908     - );
909     -
910     - print $q->start_table ({width => "100%", -class => "sme-noborders"});
911     -
912     - print esmith::cgi::genButtonRow(
913     - $q,
914     - $q->submit (-name => 'action',
915     - -value => $fm->localise('RESTORE_FROM_TAPE'))
916     - );
917     - print "</table>\n";
918     - print $q->hidden(
919     - -name => 'state',
920     - -override => 1,
921     - -default => 'tape-restore'
922     - );
923     -
924     - print $q->endform;
925     - esmith::cgi::genFooter($fm);
926     -}
927     -
928     -sub performTapeRestore
929     -{
930     - my ($q) = @_;
931     -
932     - #----------------------------------------
933     - # restore system from backup tape
934     - #----------------------------------------
935     -
936     - my $lock_file = "/var/lock/subsys/e-smith-restore";
937     - my $file_handle = &esmith::lockfile::LockFileOrReturn($lock_file);
938     -
939     - unless ($file_handle)
940     - {
941     - esmith::cgi::genHeaderNonCacheable(
942     - $q,
943     - undef,
944     - $fm->localise('UNABLE_TO_RESTORE_CONF')
945     - );
946     -
947     - print $q->p (
948     - $q->b ($fm->localise('ANOTHER_RESTORE_IN_PROGRESS')
949     - )
950     - );
951     -
952     - esmith::cgi::genFooter($fm);
953     - return;
954     - }
955     -
956     - my $rec = $restore->get('restore');
957     - $rec->set_prop('state', 'running');
958     - $rec->set_prop('start', time);
959     -
960     - my $sec = 10;
961     - print "Refresh: $sec; URL=/server-manager/cgi-bin/backup\n";
962     - esmith::cgi::genHeaderNonCacheable(
963     - $q, undef, $fm->localise()
964     - );
965     -
966     - print $q->p($fm->localise('NOW_RESTORING_FROM_TAPE')
967     - );
968     -
969     - print $q->p (
970     - $q->b ($fm->localise('MUST_REBOOT_AFTER_RESTORE'))
971     - );
972     -
973     - print $q->p($fm->localise('PAGE_REFRESH_IN', {sec=>$sec}));
974     -
975     - my $child;
976     -
977     - if ($child = fork)
978     - {
979     - # Parent
980     -
981     - $SIG{'CHLD'} = 'IGNORE';
982     - &esmith::lockfile::UnlockFile($file_handle);
983     -
984     - esmith::cgi::genFooter($fm);
985     - return;
986     - }
987     - elsif (defined $child)
988     - {
989     - # Child
990     -
991     - # Re-establish the lock. Wait till it is relinquished by the parent.
992     -
993     - $file_handle = &esmith::lockfile::LockFileOrWait($lock_file);
994     -
995     - # Close STDOUT so that the web server connection is closed.
996     -
997     - close STDOUT;
998     -
999     - # Now reopen STDOUT for the child. Redirect it to STDERR.
1000     -
1001     - open(STDOUT, ">&STDERR");
1002     -
1003     - unless(system("/sbin/e-smith/signal-event", "pre-restore") == 0)
1004     - {
1005     - $rec->set_prop('errmsg', $fm->localise('ERR_PRE_RESTORE'));
1006     - $rec->delete_prop('state');
1007     - die ($fm->localise('ERR_PRE_RESTORE'),"\n");
1008     - }
1009     - unless(system("/sbin/e-smith/signal-event", "restore-tape") == 0)
1010     - {
1011     - $rec->set_prop('errmsg', $fm->localise('ERR_RESTORING_FROM_TAPE'));
1012     - $rec->delete_prop('state');
1013     - die ($fm->localise('ERR_RESTORING_FROM_TAPE')."\n");
1014     - }
1015     -
1016     - #----------------------------------------
1017     - # regenerate configuration files
1018     - #----------------------------------------
1019     -
1020     - unless(system("/usr/sbin/groupmod", "-g", "$www_gid", "www") == 0)
1021     - {
1022     - $rec->set_prop('errmsg', $rec->prop('errmsg').'<br>'.
1023     - $fm->localise('ERR_RESTORING_GID'));
1024     - warn ($fm->localise('ERR_RESTORING_GID')."\n");
1025     - }
1026     - unless(system("/usr/sbin/usermod", "-g", "$www_gid", "www") == 0)
1027     - {
1028     - $rec->set_prop('errmsg', $rec->prop('errmsg').'<br>'.
1029     - $fm->localise('ERR_RESTORING_INITIAL_GRP'));
1030     - warn ($fm->localise('ERR_RESTORING_INITIAL_GRP')."\n");
1031     - }
1032     - unless(system("/sbin/e-smith/signal-event", "post-upgrade") == 0)
1033     - {
1034     - $rec->set_prop('errmsg', $rec->prop('errmsg').'<br>'.
1035     - $fm->localise('ERR_UPDATING_CONF_AFTER_TAPE_RESTORE'));
1036     - $rec->delete_prop('state');
1037     - die ($fm->localise('ERR_UPDATING_CONF_AFTER_TAPE_RESTORE'));
1038     - }
1039     -
1040     - my $finish = time;
1041     - $rec->set_prop('state', 'complete');
1042     - $rec->set_prop('finish', $finish);
1043     -
1044     - my $start = $rec->prop('start');
1045     - $start = scalar localtime($start);
1046     - $finish = scalar localtime($finish);
1047     -
1048     - &esmith::lockfile::UnlockFile($file_handle);
1049     -
1050     - exit;
1051     - }
1052     - else
1053     - {
1054     - # Error
1055     -
1056     - $rec->delete_prop('state');
1057     - $rec->set_prop('errmsg', $fm->localise('COULD_NOT_FORK'));
1058     - die ($fm->localise("COULD_NOT_FORK")."$!\n");
1059     - }
1060     -}
1061     -
1062     -sub WorkstnBackupConfig
1063     -{
1064     - my ($q) = @_;
1065     - my $backupwk_status;
1066     - my $enabledIncOnlyTimeout = "";
1067     - my $backupwkLogin = 'backup';
1068     - my $backupwkPassword = 'backup';
1069     - my $backupwkStation = 'host';
1070     - my $backupwkFolder = 'share';
1071     - my $setsNumber;
1072     - my $filesinset;
1073     - my $backupwkTime;
1074     - my $backupwkTimeout;
1075     - my $backupwkIncOnlyTimeout;
1076     - my $compression;
1077     - my $VFSType;
1078     - my $dof;
1079     - my @dlabels = split(' ', $fm->localise('DOW'));
1080     - my @VFST = ('cifs', 'nfs', 'usb');
1081     - my %VFST = ('cifs', 'cifs', 'nfs', 'nfs', 'usb', 'local usb disk');
1082     -
1083     - # Obtain backup informations from configuration
1084     - my $rec = $conf->get('backupwk');
1085     - if ($rec)
1086     - {
1087     - $backupwkTime = $rec->prop('BackupTime') || '2:00';
1088     - $backupwkLogin = $rec->prop('Login') || 'backup';
1089     - $backupwkPassword = $rec->prop('Password') || 'backup';
1090     - $backupwkStation = $rec->prop('SmbHost') || 'host';
1091     - $backupwkFolder = $rec->prop('SmbShare') || 'share';
1092     - $setsNumber = $rec->prop('SetsMax') || '1';
1093     - $filesinset = $rec->prop('DaysInSet') || '1';
1094     - $backupwkTimeout = $rec->prop('Timeout') || '12';
1095     - $backupwkIncOnlyTimeout = $rec->prop('IncOnlyTimeout') || 'yes';
1096     - $compression = $rec->prop('Compression') || '0';
1097     - $dof = (defined $rec->prop('FullDay')) ? $rec->prop('FullDay') : '7';
1098     - $VFSType = $rec->prop('VFSType') || 'cifs';
1099     - $backupwk_status = $rec->prop('status');
1100     - }
1101     -
1102     - esmith::cgi::genHeaderNonCacheable(
1103     - $q, undef, $fm->localise('CONFIGURE_WORKSTN_BACKUP'));
1104     -
1105     - if ($rec) {
1106     - print $fm->localise('WORKSTN_BACKUP_DESC');
1107     - print $fm->localise('WORKSTN_BACKUP_ENABLED'),
1108     - $q->b(' '.$fm->localise(uc($backupwk_status))), '.<br/>';
1109     - if ($VFSType eq 'usb') {
1110     - print $fm->localise('WORKSTN_BACKUP_USB'), '<br/>';
1111     - }
1112     - else {
1113     - print $fm->localise('WORKSTN_BACKUP_HOST'), ' ', $backupwkStation;
1114     - print ' ', $fm->localise('WORKSTN_BACKUP_VFSTYPE'), ' ', $VFSType, '<br/>';
1115     - }
1116     - print $fm->localise('WORKSTN_BACKUP_SHARE'), ' ', $backupwkFolder, '<br/>';
1117     - if ($VFSType eq 'cifs') {
1118     - print $fm->localise('LOGIN'), ' ', $backupwkLogin, '<br/>';
1119     - print $fm->localise('PASSWORD'), ' ********<br/>';
1120     - }
1121     - print $fm->localise('WORKSTN_BACKUP_SETSNUM'), ' ', $setsNumber, '<br/>';
1122     - print $fm->localise('WORKSTN_BACKUP_DAYSINSET'), ' ', $filesinset, '<br/>';
1123     - print $fm->localise('WORKSTN_BACKUP_COMPRESSION'), ' ', $compression, '<br/>';
1124     - print $fm->localise('WORKSTN_BACKUP_TOD'), ' ', $backupwkTime, '<br/>';
1125     - print $fm->localise('WORKSTN_BACKUP_TIMEOUT'), ' ', $backupwkTimeout, ' ', $fm->localise('HOURS');
1126     - if ( $backupwkIncOnlyTimeout eq 'yes' ) {print $fm->localise('WORKSTN_BACKUP_INCONLY_TIMEOUT')}
1127     - print '<br/>';
1128     - if ( $dof eq '7' ) {
1129     - print $fm->localise('WORKSTN_FULL_BACKUP_EVERYDAY', '<br/>');
1130     - }
1131     - else {
1132     - print $fm->localise('WORKSTN_FULL_BACKUP_DAY'), ' ', $dlabels[$dof], '<br/>';
1133     - }
1134     - }
1135     - else { print $fm->localise('WORKSTN_BACKUP_NOT_CONFIGURED'), '<br/>' }
1136     -
1137     - print $q->startform(
1138     - -method => 'POST',
1139     - -action => $q->url (-absolute => 1)
1140     - );
1141     -
1142     - print $q->start_table ({-class => "sme-noborders"});
1143     -
1144     - print $q->Tr($q->td($q->h3 ($fm->localise('WORKSTATION_BACKUP_SETCONF'))));
1145     -
1146     -
1147     - print $q->Tr(
1148     - esmith::cgi::genCell(
1149     - $q,
1150     - $fm->localise('SELECT_VFS_TYPE')
1151     - ),
1152     -
1153     - esmith::cgi::genCell ($q, $q->popup_menu (-name => 'VFSType',
1154     - -values => [ @VFST ],
1155     - -labels => \%VFST,
1156     - -default => $VFSType)));
1157     -
1158     - print "</table>\n";
1159     -
1160     - print $q->start_table ({width => "100%", -class => "sme-noborders"});
1161     - print $q->Tr($q->th({-class => "sme-layout"},
1162     - $q->submit(
1163     - -name => 'action',
1164     - -value => $fm->localise('NEXT')
1165     - )
1166     - )
1167     - );
1168     -
1169     - print $q->hidden(
1170     - -name => 'state',
1171     - -override => 1,
1172     - -default => 'workstn-configure'
1173     - );
1174     - print '</table>';
1175     -
1176     - print $q->endform;
1177     -
1178     - esmith::cgi::genFooter ($q);
1179     - return;
1180     -}
1181     -
1182     -sub WorkstnBackupConfig1
1183     -{
1184     - my ($q) = @_;
1185     - my $enabledChk = "";
1186     - my $enabledIncOnlyTimeout = "";
1187     - my $backupwkAMPM = 'AM';
1188     - my $backupwkMin;
1189     - my $backupwkHour;
1190     - my $backupwkLogin = 'backup';
1191     - my $backupwkPassword = 'backup';
1192     - my $backupwkStation = 'host';
1193     - my $backupwkFolder = 'share';
1194     - my $setsNumber;
1195     - my $filesinset;
1196     - my $backupwkTimeout;
1197     - my $backupwkIncOnlyTimeout;
1198     - my $compression;
1199     - my $VFSType = $q->param ('VFSType');
1200     - my $dof;
1201     - my @usbdisks;
1202     - my %dlabels = ();
1203     - my @dlabels = split(' ', $fm->localise('DOW'));
1204     - my $i = 0;
1205     - foreach (@dlabels) {
1206     - $dlabels{$i} = $_;
1207     - $i++;
1208     - }
1209     -
1210     - # Obtain backup informations from configuration
1211     - my $rec = $conf->get('backupwk');
1212     - my $backupwkTime = '2:00';
1213     - if ($rec)
1214     - {
1215     - $backupwkTime = $rec->prop('BackupTime') || '2:00';
1216     - $backupwkLogin = $rec->prop('Login') || 'backup';
1217     - $backupwkPassword = $rec->prop('Password') || 'backup';
1218     - $backupwkStation = $rec->prop('SmbHost') || 'host';
1219     - $backupwkFolder = $rec->prop('SmbShare') || 'share';
1220     - $setsNumber = $rec->prop('SetsMax') || '1';
1221     - $filesinset = $rec->prop('DaysInSet') || '1';
1222     - $backupwkTimeout = $rec->prop('Timeout') || '12';
1223     - $backupwkIncOnlyTimeout = $rec->prop('IncOnlyTimeout') || 'yes';
1224     - $compression = $rec->prop('Compression') || '0';
1225     - $dof = (defined $rec->prop('FullDay')) ? $rec->prop('FullDay') : '7';
1226     - }
1227     -
1228     - ($backupwkHour, $backupwkMin) = split (':', $backupwkTime, -1);
1229     -
1230     - if ($backupwkHour > 12)
1231     - {
1232     - $backupwkHour -= 12;
1233     - $backupwkAMPM = 'PM';
1234     - }
1235     -
1236     - my $backupwk_status;
1237     - if ($rec)
1238     - {
1239     - $backupwk_status = $rec->prop('status');
1240     - }
1241     -
1242     - if (defined $backupwk_status && $backupwk_status eq 'enabled')
1243     - {
1244     - $enabledChk = 'checked';
1245     - }
1246     -
1247     - if (defined $backupwkIncOnlyTimeout && $backupwkIncOnlyTimeout eq 'yes')
1248     - {
1249     - $enabledIncOnlyTimeout = 'checked';
1250     - }
1251     -
1252     - esmith::cgi::genHeaderNonCacheable(
1253     - $q, undef, $fm->localise('CONFIGURE_WORKSTN_BACKUP'));
1254     -
1255     - if ( $VFSType eq 'usb' ) {
1256     - foreach my $udi (qx(hal-find-by-property --key volume.fsusage --string filesystem)) {
1257     - $udi =~ m/^(\S+)/;
1258     - my $vollbl = qx(hal-get-property --udi $1 --key volume.label);
1259     - $vollbl =~ m/^(\S+)/;
1260     - if ($vollbl =~ /^\s/) {$vollbl = 'nolabel';}
1261     - push @usbdisks, lc($vollbl);
1262     - }
1263     -
1264     - unless ($usbdisks[0]){
1265     - esmith::cgi::genResult(
1266     - $fm->{cgi}, $fm->localise('ERR_NO_USB_DISK'));
1267     - return
1268     - }
1269     - }
1270     -
1271     - print $q->startform(
1272     - -method => 'POST',
1273     - -action => $q->url (-absolute => 1)
1274     - );
1275     -
1276     - print $fm->localise('CONFIGURE_WORKSTN_BACKUP_DESC');
1277     -
1278     - print $q->start_table ({-class => "sme-noborders"});
1279     -
1280     - print $q->Tr(
1281     - $q->td(
1282     - $fm->localise('ENABLE_WORKSTN_BACKUP')
1283     - . " <input type=\"checkbox\""
1284     - . " name=\"workstnbackup\""
1285     - . " $enabledChk"
1286     - . " value=\"on\">"
1287     - )
1288     - );
1289     -
1290     - print $q->Tr($q->td($q->h3 ($fm->localise('WORKSTATION_BACKUP_DEST'))));
1291     -
1292     - if ( $VFSType eq 'usb' ) {
1293     - print $q->Tr(
1294     - esmith::cgi::genCell(
1295     - $q,
1296     - $fm->localise('WORKSTN_NAME')
1297     - ),
1298     -
1299     - esmith::cgi::genCell ($q, 'localhost'),
1300     - );
1301     - }
1302     - else {
1303     - print $q->Tr(
1304     - esmith::cgi::genCell(
1305     - $q,
1306     - $fm->localise('WORKSTN_NAME')
1307     - ),
1308     -
1309     - esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkStation',
1310     - -override => 1,
1311     - -default => $backupwkStation,
1312     - -size => 20)),
1313     - );
1314     - }
1315     -
1316     - if ( $VFSType eq 'usb' ) {
1317     - print $q->Tr(
1318     - esmith::cgi::genCell(
1319     - $q,
1320     - $fm->localise('SHARED_FOLDER_NAME')
1321     - ),
1322     -
1323     - esmith::cgi::genCell ($q, $q->popup_menu (-name => 'backupwkFolder',
1324     - -values => [ @usbdisks ],
1325     - -default => $backupwkFolder,)),
1326     - );
1327     - }
1328     - else {
1329     - print $q->Tr(
1330     - esmith::cgi::genCell(
1331     - $q,
1332     - $fm->localise('SHARED_FOLDER_NAME')
1333     - ),
1334     -
1335     - esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkFolder',
1336     - -override => 1,
1337     - -default => $backupwkFolder,
1338     - -size => 20)),
1339     - );
1340     - }
1341     -
1342     - if ( $VFSType eq 'cifs' ) {
1343     - print $q->Tr(
1344     - esmith::cgi::genCell(
1345     - $q,
1346     - $fm->localise('WORKSTN_LOGIN')
1347     - ),
1348     -
1349     - esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkLogin',
1350     - -override => 1,
1351     - -default => $backupwkLogin,
1352     - -size => 12)),
1353     - );
1354     -
1355     - print $q->Tr(
1356     - esmith::cgi::genCell(
1357     - $q,
1358     - $fm->localise('PASSWORD')
1359     - ),
1360     -
1361     - esmith::cgi::genCell ($q, $q->password_field (-name => 'backupwkPassword',
1362     - -override => 1,
1363     - -default => $backupwkPassword,
1364     - -size => 20)),
1365     - );
1366     - }
1367     -
1368     - print '</table>';
1369     -
1370     - print $q->table ({border => 0, cellspacing => 1, cellpadding => 4});
1371     -
1372     - print $q->Tr($q->td({-colspan=>4},$q->h3 ($fm->localise('WORKSTN_BACKUP_SETTINGS'))));
1373     -
1374     - print $q->Tr(
1375     - esmith::cgi::genCell(
1376     - $q,
1377     - $fm->localise('NUMBER_OF_SETS')
1378     - ),
1379     -
1380     - esmith::cgi::genCell ($q, $q->textfield (-name => 'setsNumber',
1381     - -override => 1,
1382     - -default => $setsNumber,
1383     - -size => 3)),
1384     -
1385     - esmith::cgi::genCell ($q, $fm->localise('NUMBER_OF_FILES_IN_SET')),
1386     - esmith::cgi::genCell ($q, $q->textfield (-name => 'filesinset',
1387     - -override => 1,
1388     - -default => $filesinset,
1389     - -size => 3))
1390     - );
1391     -
1392     - print $q->Tr(
1393     - esmith::cgi::genCell(
1394     - $q,
1395     - $fm->localise('WORKSTN_BACKUP_TIME')
1396     - ),
1397     -
1398     - esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkHour',
1399     - -override => 1,
1400     - -default => $backupwkHour,
1401     - -size => 2)),
1402     -
1403     - esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkMin',
1404     - -override => 1,
1405     - -default => $backupwkMin,
1406     - -size => 2)),
1407     -
1408     - esmith::cgi::genCell ($q, $q->popup_menu (-name => 'backupwkAMPM',
1409     - -values => ['AM', 'PM'],
1410     - -default => $backupwkAMPM)));
1411     -
1412     - print $q->Tr(
1413     - esmith::cgi::genCell(
1414     - $q,
1415     - $fm->localise('WORKSTN_TIMEOUT')
1416     - ),
1417     -
1418     - esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkTimeout',
1419     - -override => 1,
1420     - -default => $backupwkTimeout,
1421     - -size => 2)),
1422     -
1423     - esmith::cgi::genCell(
1424     - $q,
1425     - $fm->localise('INC_ONLY_TIMEOUT')
1426     - ),
1427     -
1428     - esmith::cgi::genCell (
1429     - $q,
1430     - " <input type=\"checkbox\""
1431     - . " name=\"incOnlyTimeout\""
1432     - . " $enabledIncOnlyTimeout"
1433     - . " value=\"on\">"
1434     - ),
1435     - );
1436     -
1437     - print $q->Tr(
1438     - esmith::cgi::genCell(
1439     - $q,
1440     - $fm->localise('COMPRESSION_LEVEL')
1441     - ),
1442     -
1443     - esmith::cgi::genCell ($q, $q->textfield (-name => 'compression',
1444     - -override => 1,
1445     - -default => $compression,
1446     - -size => 1)),
1447     -
1448     - esmith::cgi::genCell(
1449     - $q,
1450     - $fm->localise('FULL_ONLY_ON')
1451     - ),
1452     -
1453     - esmith::cgi::genCell (
1454     - $q,
1455     - $q->popup_menu (
1456     - -name => 'dof',
1457     - -values => [ '7', '0', '1', '2', '3', '4', '5', '6' ],
1458     - -labels => \%dlabels,
1459     - -default => $dof))
1460     - );
1461     -
1462     - print "</table>\n";
1463     -
1464     - print $q->start_table ({width => "100%", -class => "sme-noborders"});
1465     - print $q->Tr($q->th({-class => "sme-layout"},
1466     - $q->submit(
1467     - -name => 'action',
1468     - -value => $fm->localise('UPDATE_CONF')
1469     - )
1470     - )
1471     - );
1472     -
1473     - print $q->hidden(
1474     - -name => 'state',
1475     - -override => 1,
1476     - -default => 'workstn-configure1'
1477     - );
1478     - print $q->hidden(
1479     - -name => 'VFSType',
1480     - -override => 1,
1481     - -default => $VFSType
1482     - );
1483     - print '</table>';
1484     -
1485     - print $q->endform;
1486     -
1487     - esmith::cgi::genFooter ($q);
1488     - return;
1489     -}
1490     -
1491     -sub updateWorkstnBackupConfig
1492     -{
1493     - my ($q) = @_;
1494     -
1495     - my $status = $q->param ('workstnbackup');
1496     - my $inconly = $q->param ('incOnlyTimeout');
1497     - my $dof = $q->param('dof');
1498     - my $ampm;
1499     - my $incOnlyTimeout;
1500     -
1501     - esmith::cgi::genHeaderNonCacheable(
1502     - $q,
1503     - undef, $fm->localise('UPDATING_WORKSTN_CONF')
1504     - );
1505     -
1506     - #--------------------------------------------------
1507     - # Untaint parameters and check for validity
1508     - #--------------------------------------------------
1509     -
1510     - my $VFSType = $q->param ('VFSType');
1511     -
1512     - my $backupwkStation = $q->param ('backupwkStation');
1513     - if ( $VFSType eq 'usb') { $backupwkStation = 'localhost' }
1514     - if ($backupwkStation =~ /^(.*)$/) {
1515     - $backupwkStation = $1;
1516     - } else {
1517     - $backupwkStation = "";
1518     - }
1519     - if ( $backupwkStation eq "" )
1520     - {
1521     - esmith::cgi::genResult(
1522     - $q, $fm->localise('ERR_INVALID_WORKSTN')
1523     - );
1524     - return;
1525     - }
1526     -
1527     - my $backupwkFolder = $q->param ('backupwkFolder');
1528     - if ( $VFSType eq 'usb' ) {
1529     - $backupwkFolder = 'media/' . $backupwkFolder;
1530     - }
1531     - if ($backupwkFolder =~ /^(.*)$/) {
1532     - $backupwkFolder = $1;
1533     - $backupwkFolder =~ s/^\//; # remove leading /
1534     - } else {
1535     - $backupwkFolder = "";
1536     - }
1537     - if ( $backupwkFolder eq "" )
1538     - {
1539     - esmith::cgi::genResult(
1540     - $q, $fm->localise('ERR_INVALID_FOLDER')
1541     - );
1542     - return;
1543     - }
1544     -
1545     - my $backupwkLogin = $q->param ('backupwkLogin') || '';
1546     - if ($backupwkLogin =~ /^(.*)$/) {
1547     - $backupwkLogin = $1;
1548     - } else {
1549     - $backupwkLogin = "";
1550     - }
1551     - if ( ( $backupwkLogin eq "" ) && ( $VFSType eq 'cifs' ) )
1552     - {
1553     - esmith::cgi::genResult(
1554     - $q, $fm->localise('ERR_INVALID_LOGIN')
1555     - );
1556     - return;
1557     - }
1558     -
1559     - my $backupwkPassword = $q->param ('backupwkPassword') || '';
1560     - if ($backupwkPassword =~ /^(.*)$/) {
1561     - $backupwkPassword = $1;
1562     - } else {
1563     - $backupwkPassword = "";
1564     - }
1565     - if ( ( $backupwkPassword eq "" ) && ( $VFSType eq 'cifs' ) )
1566     - {
1567     - esmith::cgi::genResult(
1568     - $q, $fm->localise('ERR_INVALID_PASSWORD')
1569     - );
1570     - return;
1571     - }
1572     -
1573     - my $setsNumber = $q->param ('setsNumber');
1574     - unless ( $setsNumber > 0 )
1575     - {
1576     - esmith::cgi::genResult(
1577     - $q, $fm->localise('ERR_INVALID_SETS_NUMBER')
1578     - );
1579     - return;
1580     - }
1581     -
1582     - my $filesinset = $q->param ('filesinset');
1583     - unless ( $filesinset > 0 )
1584     - {
1585     - esmith::cgi::genResult(
1586     - $q, $fm->localise('ERR_INVALID_FILES_IN_SET_NUMBER')
1587     - );
1588     - return;
1589     - }
1590     -
1591     - my $timeout = $q->param ('backupwkTimeout');
1592     - if (( $timeout eq '') || ( $timeout == 0 )) {$timeout = 24 }
1593     - if (( $timeout < 1 ) || ( $timeout > 24 ))
1594     - {
1595     - esmith::cgi::genResult(
1596     - $q, $fm->localise('ERR_INVALID_TIMEOUT')
1597     - );
1598     - return;
1599     - }
1600     -
1601     - if (defined $inconly && $inconly eq 'on')
1602     - {
1603     - $incOnlyTimeout = 'yes';
1604     - }
1605     - else
1606     - {
1607     - $incOnlyTimeout = 'no';
1608     - }
1609     -
1610     - my $compression = $q->param ('compression');
1611     - if (( $compression < 0 ) || ( $compression > 9 ))
1612     - {
1613     - esmith::cgi::genResult(
1614     - $q, $fm->localise('ERR_INVALID_COMPRESSION')
1615     - );
1616     - return;
1617     - }
1618     -
1619     - my $rec = $conf->get('backupwk');
1620     - unless (defined $rec)
1621     - {
1622     - $rec = $conf->new_record('backupwk', {type=>'service'});
1623     - }
1624     -
1625     - $rec->set_prop('SmbHost', $backupwkStation);
1626     - $rec->set_prop('SmbShare', $backupwkFolder);
1627     - $rec->set_prop('Login', $backupwkLogin);
1628     - $rec->set_prop('Password', $backupwkPassword);
1629     - $rec->set_prop('SetsMax', $setsNumber);
1630     - $rec->set_prop('DaysInSet', $filesinset);
1631     - $rec->set_prop('Timeout', $timeout);
1632     - $rec->set_prop('IncOnlyTimeout', $incOnlyTimeout);
1633     - $rec->set_prop('Compression', $compression);
1634     - $rec->set_prop('FullDay', $dof);
1635     - $rec->set_prop('VFSType', $VFSType);
1636     -
1637     - my $module = $rec->prop('Program');
1638     -
1639     - # The default workstation backup program is dar.
1640     -
1641     - unless (defined $module)
1642     - {
1643     - $module = 'dar';
1644     - }
1645     - elsif ($module eq '')
1646     - {
1647     - $module = 'dar';
1648     - }
1649     -
1650     - $rec->set_prop('Program', $module);
1651     -
1652     - if (defined $status && $status eq 'on')
1653     - {
1654     -
1655     - my $backupwkHour = $q->param ('backupwkHour');
1656     - if ($backupwkHour =~ /^(.*)$/) {
1657     - $backupwkHour = $1;
1658     - } else {
1659     - $backupwkHour = '12';
1660     - }
1661     - if (($backupwkHour < 0) || ($backupwkHour > 12))
1662     - {
1663     - esmith::cgi::genResult(
1664     - $q, $fm->localise('ERR_INVALID_HOUR').$backupwkHour.
1665     - $fm->localise('BETWEEN_0_AND_12')
1666     - );
1667     -
1668     - return;
1669     - }
1670     -
1671     - my $backupwkMin = $q->param ('backupwkMin');
1672     - if ($backupwkMin =~ /^(.*)$/) {
1673     - $backupwkMin = $1;
1674     - } else {
1675     - $backupwkMin = '0';
1676     - }
1677     - if (($backupwkMin < 0) || ($backupwkMin > 59))
1678     - {
1679     - esmith::cgi::genResult(
1680     - $q, $fm->localise('ERR_INVALID_MINUTE').$backupwkMin.
1681     - $fm->localise('BETWEEN_0_AND_59')
1682     - );
1683     -
1684     - return;
1685     - }
1686     -
1687     - $backupwkMin = sprintf("%02d", $backupwkMin);
1688     -
1689     - $ampm = $q->param ('backupwkAMPM');
1690     - if ($ampm =~ /^(.*)$/) {
1691     - $ampm = $1;
1692     - } else {
1693     - $ampm = 'AM';
1694     - }
1695     -
1696     - # convert to 24 hour time
1697     -
1698     - $backupwkHour = $backupwkHour % 12;
1699     - if ($ampm eq 'PM')
1700     - {
1701     - $backupwkHour = $backupwkHour + 12;
1702     - }
1703     -
1704     -
1705     - # variables passed validity checks, set configuration database values
1706     - my $old = $conf->get('UnsavedChanges')->value;
1707     -
1708     - $rec->set_prop('status', 'enabled');
1709     -
1710     - $rec->set_prop('BackupTime', "$backupwkHour:$backupwkMin");
1711     -
1712     - $conf->get('UnsavedChanges')->set_value($old);
1713     -
1714     - system("/sbin/e-smith/signal-event", "conf-backup") == 0
1715     - or die($fm->localise('ERR_CONF_BACKUP'),"\n");
1716     -
1717     - esmith::cgi::genResult(
1718     - $q, $fm->localise('SUCCESSFULLY_ENABLED_WORKSTN').$q->br().
1719     - $fm->localise('WITH_BACKUP_TIME')."$backupwkHour:$backupwkMin");
1720     - }
1721     - else
1722     - {
1723     - # set service to disabled
1724     - my $old = $conf->get('UnsavedChanges')->value;
1725     -
1726     - $rec->set_prop('status', 'disabled');
1727     - $conf->get('UnsavedChanges')->set_value($old);
1728     -
1729     - system("/sbin/e-smith/signal-event", "conf-backup") == 0
1730     - or die($fm->localise('ERR_CONF_BACKUP')."\n");
1731     -
1732     - esmith::cgi::genResult(
1733     - $q, $fm->localise('SUCCESSFULLY_DISABLED_WORKSTN')
1734     - );
1735     - }
1736     -
1737     - return;
1738     -}
1739     -
1740     -sub workstnVerify ()
1741     -{
1742     -
1743     - my $rec = $conf->get('backupwk');
1744     -
1745     - esmith::cgi::genHeaderNonCacheable ($q, undef,
1746     - $fm->localise('VERIFY_WORKSTN_BACKUP_FILE'));
1747     -
1748     - unless ($rec)
1749     - {
1750     - esmith::cgi::genResult(
1751     - $q, $fm->localise('CONFIGURATION_TO_BE_DONE'));
1752     - return;
1753     - }
1754     -
1755     - my %backupfiles = ();
1756     - my $mntdir = $rec->prop('MountDir') || '/mnt/smb';
1757     - my $mntbkdir;
1758     - my $mounted;
1759     - my $key;
1760     - my $id = $rec->prop('Id') || $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
1761     - my $smbhost = $rec->prop('SmbHost');
1762     - my $smbshare = $rec->prop('SmbShare');
1763     - my $VFSType = $rec->prop('VFSType') || 'cifs';
1764     - my $err;
1765     -
1766     - my $setbackuplist = sub {
1767     - if ( $_ =~ /\.dar/ ) {
1768     - my $dir = $File::Find::dir;
1769     - my $backupref;
1770     - $dir =~ s/$mntbkdir\///;
1771     - $_ =~ s/\..*\.dar//;
1772     - $backupref = $_;
1773     - $_ =~ s/.*-//;
1774     - @{$backupfiles{$_}}[0] = $dir;
1775     - @{$backupfiles{$_}}[1] = $backupref;
1776     - }
1777     - };
1778     -
1779     - # Mounting backup shared folder
1780     -
1781     - unless (-d $mntdir)
1782     - {
1783     - mkdir -p $mntdir;
1784     - }
1785     -
1786     - my $login = $rec->prop('Login') || 'backup';
1787     - my $password = $rec->prop('Password') || 'backup';
1788     -
1789     - if ( $err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType) )
1790     - {
1791     - esmith::cgi::genResult(
1792     - $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
1793     - );
1794     - return;
1795     - }
1796     - else {$mounted = 1}
1797     -
1798     - # Test if backup subdirectory for our server
1799     -
1800     - $mntbkdir = $mntdir . '/' . $id;
1801     - unless ( -d $mntbkdir)
1802     - {
1803     - if ($mounted) {
1804     - system("/bin/umount", "$mntdir") == 0
1805     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
1806     - }
1807     - esmith::cgi::genResult(
1808     - $q, $fm->localise('ERR_NO_HOST_DIR'), $id
1809     - );
1810     - return;
1811     - }
1812     -
1813     - # Finding existing backups
1814     -
1815     - find { wanted => \&$setbackuplist, untaint => 1 }, $mntbkdir ;
1816     -
1817     - my %blabels = ();
1818     - my @blabels;
1819     - my $backups = 0;
1820     -
1821     - foreach $key (sort keys %backupfiles) {
1822     - my $labkey = $mntbkdir . '/' . $backupfiles{$key}[0] . '/' . $backupfiles{$key}[1];
1823     - $blabels{$labkey} = $backupfiles{$key}[1] . " (" . $backupfiles{$key}[0] . ")";
1824     - $backups = push @blabels, $labkey;
1825     - }
1826     -
1827     - if ($mounted) {
1828     - system("/bin/umount", "$mntdir") == 0
1829     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
1830     - }
1831     -
1832     - # Stops here if no backups
1833     -
1834     - if ( $backups == 0 ) {
1835     - esmith::cgi::genResult(
1836     - $q, $fm->localise('NO_BACKUPS_TO_RESTORE'));
1837     - return;
1838     - }
1839     -
1840     - print $q->p ($fm->localise('VERIFY_WORKSTN_BACKUP_DESC') . ' ' . "$smbhost/$smbshare/$id");
1841     - print $q->p;
1842     -
1843     - print $q->start_multipart_form(
1844     - -method => 'POST',
1845     - -action => $q->url (-absolute => 1)
1846     - );
1847     -
1848     - print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
1849     -
1850     - esmith::cgi::genWidgetRow(
1851     - $q,
1852     - $fm->localise('SELECT_BACKUP_FILE'),
1853     - $q->popup_menu (
1854     - -name => 'backupset',
1855     - -values => [ @blabels ],
1856     - -labels => \%blabels
1857     - )
1858     - )
1859     - );
1860     -
1861     - print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
1862     -
1863     - esmith::cgi::genWidgetRow(
1864     - $q,
1865     - $fm->localise('CHECK_TO_VERIFY_FULL_RESTORE'),
1866     - $q->checkbox (
1867     - -name => 'verifyall',
1868     - -checked=>0,
1869     - -label=>''
1870     - )
1871     - ),
1872     - $q->Tr(
1873     - esmith::cgi::genTextRow(
1874     - $q,
1875     - $fm->localise('CHECK_INTEGRITY_WARNING')
1876     - )
1877     - )
1878     - ),"\n";
1879     -
1880     - print $q->table ({width => "100%", -class => "sme-noborders"},
1881     - esmith::cgi::genButtonRow(
1882     - $q,
1883     - $q->submit(
1884     - -name => 'action',
1885     - -value => $fm->localise('VERIFY')
1886     - )
1887     - )
1888     - ),"\n";
1889     -
1890     - print $q->hidden(
1891     - -name => 'state',
1892     - -override => 1,
1893     - -default => 'workstn-verify'
1894     - );
1895     -
1896     - print $q->endform;
1897     -
1898     - esmith::cgi::genFooter ($q);
1899     -}
1900     -
1901     -sub performWorkstnVerify
1902     -{
1903     - my ($q) = @_;
1904     -
1905     - my $backupwkrec = $conf->get('backupwk');
1906     - my $smbhost = $backupwkrec->prop('SmbHost');
1907     - my $smbshare = $backupwkrec->prop('SmbShare');
1908     - my $login = $backupwkrec->prop('Login');
1909     - my $password = $backupwkrec->prop('Password');
1910     - my $mntdir = $backupwkrec->prop('MountDir') || '/mnt/smb';
1911     - my $mounted;
1912     - my $key;
1913     - my $id = $backupwkrec->prop('Id') ||
1914     - $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
1915     - my $err;
1916     - my $VFSType = $backupwkrec->prop('VFSType') || 'cifs';
1917     - my $verifyref = $q->param ('backupset');
1918     -
1919     - # Mounting backup shared folder
1920     -
1921     - if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
1922     - {
1923     - esmith::cgi::genResult(
1924     - $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
1925     - );
1926     - return;
1927     - }
1928     - else {$mounted = 1}
1929     -
1930     - # Test if backup subdirectory for our server
1931     -
1932     - my $mntbkdir = $mntdir . "/$id";
1933     - unless (-d $mntbkdir)
1934     - {
1935     - if ($mounted)
1936     - {
1937     - system("/bin/umount", "$mntdir") == 0
1938     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
1939     - }
1940     - esmith::cgi::genResult($q, $fm->localise('ERR_NO_HOST_DIR'), $id);
1941     - return;
1942     - }
1943     -
1944     - my $fullverify = $q->param('verifyall');
1945     -
1946     - if ( $fullverify eq "on" )
1947     - {
1948     - # Test all backups needed to full restore
1949     -
1950     - my %backupsetfiles = ();
1951     - my @restorefiles;
1952     - my $set = $verifyref;
1953     - $set =~ s/\/[^\/]*$//;
1954     - my $backupsetlist = sub {
1955     - if ( $_ =~ /\.dar/ )
1956     - {
1957     - my $backupref = $File::Find::name;
1958     - $backupref =~ s/\.[0-9]+\.dar//;
1959     - $_ =~ s/\..*\.dar//;
1960     - $_ =~ s/.*-//;
1961     - $backupsetfiles{$_} = $backupref;
1962     - }
1963     - };
1964     -
1965     - # find list of available backups and verify
1966     - # it contains all backups needed for full restore
1967     -
1968     - find { wanted => \&$backupsetlist, untaint => 1 }, $set ;
1969     -
1970     - my $key;
1971     - my $num = 0;
1972     - foreach $key (sort keys %backupsetfiles)
1973     - {
1974     - push @restorefiles, $backupsetfiles{$key};
1975     - if ( $num == 0 )
1976     - {
1977     - unless ( $backupsetfiles{$key} =~ /\/full-/ )
1978     - {
1979     - esmith::cgi::genHeaderNonCacheable(
1980     - $q,
1981     - undef, $fm->localise('VERIFY_WORKSTN_BACKUP_FILE')
1982     - );
1983     - esmith::cgi::genResult(
1984     - $q, $fm->localise('ERR_NO_FULL_BACKUP')
1985     - );
1986     - return;
1987     - }
1988     - }
1989     - else
1990     - {
1991     - my $numf = sprintf("%03d", $num);
1992     - unless ( $backupsetfiles{$key} =~ /\/inc-$numf-/ )
1993     - {
1994     - esmith::cgi::genHeaderNonCacheable(
1995     - $q,
1996     - undef, $fm->localise('VERIFY_WORKSTN_BACKUP_FILE')
1997     - );
1998     -
1999     - esmith::cgi::genResult(
2000     - $q, $fm->localise('ERR_NO_INC_BACKUP') . " " . $numf
2001     - );
2002     - return;
2003     - }
2004     -
2005     - }
2006     - $num++;
2007     - last if ( $backupsetfiles{$key} eq $verifyref );
2008     - }
2009     -
2010     - # and test them
2011     -
2012     - $| = 1;
2013     -
2014     - if (open(RD, "-|"))
2015     - {
2016     - esmith::cgi::genHeaderNonCacheable ($q, undef,
2017     - $fm->localise('VERIFY_WORKSTN_BACKUP_FILE'));
2018     -
2019     - print $q->p (
2020     - $q->b ($fm->localise('TESTING_NEEDED_BACKUPS_FOR_RESTORE') )
2021     - );
2022     - print '<UL>';
2023     -
2024     - while (<RD>)
2025     - {
2026     - print "<li>$_</li>\n";
2027     - }
2028     -
2029     - print '</UL>';
2030     - my $message;
2031     - if (!close RD)
2032     - {
2033     - print $q->p ($q->b ( $fm->localise('RESTORE_VERIFY_FAILED') ));
2034     - }
2035     - else
2036     - {
2037     - print $q->p ($q->b ( $fm->localise('VERIFY_COMPLETE') ));
2038     - }
2039     -
2040     - esmith::cgi::genFooter ($q);
2041     - }
2042     - else
2043     - {
2044     - select(STDOUT);
2045     - $| = 1;
2046     -
2047     - my $file;
2048     - foreach $file (@restorefiles)
2049     - {
2050     - if ($file =~ /^(.*)$/)
2051     - {
2052     - $file = $1;
2053     - }
2054     - else
2055     - {
2056     - if ($mounted)
2057     - {
2058     - system("/bin/umount", "$mntdir") == 0
2059     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2060     - }
2061     - die('Unsecure data : ' . $file);
2062     - }
2063     - print $q->p($fm->localise('TESTED_BACKUP') . " " . $file);
2064     - system ("/usr/bin/dar", "-Q", "--test", "$file", "--noconf");
2065     - }
2066     -
2067     - if ($mounted)
2068     - {
2069     - system("/bin/umount", "$mntdir") == 0
2070     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2071     - }
2072     -
2073     - exit(0);
2074     - }
2075     - return;
2076     -
2077     - }
2078     - else
2079     - {
2080     - # verify selected backup only
2081     - # and display files saved in the backup
2082     -
2083     - my $backupkey = $verifyref;
2084     - if ($backupkey =~ /^(.*)$/)
2085     - {
2086     - $backupkey = $1;
2087     - }
2088     - else
2089     - {
2090     - if ($mounted)
2091     - {
2092     - system("/bin/umount", "$mntdir") == 0
2093     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2094     - }
2095     - die('Unsecure data : ' . $backupkey);
2096     - }
2097     -
2098     - if (open(RD, "-|"))
2099     - {
2100     - esmith::cgi::genHeaderNonCacheable ($q,
2101     - undef, $fm->localise('VERIFY_WORKSTN_BACKUP_FILE'));
2102     - print $q->p($fm->localise('FILES_IN_BACKUP'));
2103     -
2104     - print '<UL>';
2105     -
2106     - my $complete = 0;
2107     - while (<RD>)
2108     - {
2109     - $complete++ if /etc\/smbpasswd$/;
2110     - $complete++ if /etc\/samba\/smbpasswd$/; # >6.0 base
2111     - print "<li>$_</li>\n";
2112     - }
2113     -
2114     - print '</UL>';
2115     - my $status = close RD ?
2116     - ($complete ?
2117     - $fm->localise('VERIFY_COMPLETE') :
2118     - $fm->localise('BACKUP_FILE_INCOMPLETE'))
2119     - : ($fm->localise('ERROR_READING_FILE').' : '.$backupkey);
2120     - print $q->p ($q->b ($status));
2121     -
2122     - esmith::cgi::genFooter ($q);
2123     -
2124     - }
2125     - else
2126     - {
2127     - select(STDOUT);
2128     - $| = 1;
2129     -
2130     - system ("/usr/bin/dar", "-Q", "--list", "$backupkey", "--noconf") == 0
2131     - or die ($fm->localise('ERR_EXTRACT')." : ".$!);
2132     -
2133     - if ($mounted) {
2134     - system("/bin/umount", "$mntdir") == 0
2135     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2136     - }
2137     - exit(0);
2138     - }
2139     - }
2140     -
2141     - return;
2142     -}
2143     -
2144     -sub workstnRestore ()
2145     -{
2146     -
2147     - my $rec = $conf->get('backupwk');
2148     -
2149     - esmith::cgi::genHeaderNonCacheable(
2150     - $q, undef, $fm->localise('RESTORE_CONF_FROM_WORKSTN'));
2151     -
2152     - unless ($rec)
2153     - {
2154     - esmith::cgi::genResult(
2155     - $q, $fm->localise('CONFIGURATION_TO_BE_DONE'));
2156     - return;
2157     - }
2158     -
2159     - my $mntdir = $rec->prop('MountDir') || '/mnt/smb';
2160     - my $mntbkdir;
2161     - my $mounted;
2162     - my %backupfiles = ();
2163     - my $key;
2164     - my $id = $rec->prop('Id') ||
2165     - $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
2166     - my $VFSType = $rec->prop('VFSType') || 'cifs';
2167     - my $smbhost = $rec->prop('SmbHost');
2168     - my $smbshare = $rec->prop('SmbShare');
2169     - my $err;
2170     -
2171     - my $setbackupflist = sub {
2172     - if ( $_ =~ /\.dar/ )
2173     - {
2174     - my $dir = $File::Find::dir;
2175     - my $backupref;
2176     - $dir =~ s/$mntbkdir\///;
2177     - $_ =~ s/\..*\.dar//;
2178     - $backupref = $_;
2179     - $_ =~ s/.*-//;
2180     - @{$backupfiles{$_}}[0] = $dir;
2181     - @{$backupfiles{$_}}[1] = $backupref;
2182     - }
2183     - };
2184     -
2185     - # Mounting backup shared folder
2186     - unless (-d $mntdir)
2187     - {
2188     - mkdir -p $mntdir;
2189     - }
2190     -
2191     - my $login = $rec->prop('Login') || 'backup';
2192     - my $password = $rec->prop('Password') || 'backup';
2193     -
2194     - if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
2195     - {
2196     - esmith::cgi::genResult($q,
2197     - $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err);
2198     - return;
2199     - }
2200     - else {$mounted = 1}
2201     -
2202     - # Test if backup subdirectory for our server
2203     -
2204     - $mntbkdir = $mntdir . "/$id";
2205     - unless ( -d $mntbkdir)
2206     - {
2207     - if ($mounted)
2208     - {
2209     - system("/bin/umount", "$mntdir") == 0
2210     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2211     - }
2212     - esmith::cgi::genResult($q, $fm->localise('ERR_NO_HOST_DIR'), $id);
2213     - return;
2214     - }
2215     -
2216     - # Finding existing backups
2217     -
2218     - find { wanted => \&$setbackupflist, untaint => 1 }, $mntbkdir ;
2219     -
2220     - my %blabels = ();
2221     - my @blabels;
2222     - my $backups = 0;
2223     -
2224     - foreach $key (sort keys %backupfiles)
2225     - {
2226     - my $labkey = $mntbkdir . '/' . $backupfiles{$key}[0] . '/' . $backupfiles{$key}[1];
2227     - $blabels{$labkey} = $backupfiles{$key}[1] . ' (' . $backupfiles{$key}[0] . ')';
2228     - $backups = push @blabels, $labkey;
2229     - }
2230     -
2231     - if ($mounted)
2232     - {
2233     - system("/bin/umount", "$mntdir") == 0
2234     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2235     - }
2236     -
2237     - if ( $backups == 0 )
2238     - {
2239     - esmith::cgi::genResult(
2240     - $q, $fm->localise('NO_BACKUPS_TO_RESTORE'));
2241     - return;
2242     - }
2243     -
2244     - print $q->p ($fm->localise('RESTORE_CONF_FROM_WORKSTN_DESC') . ' ' . "$smbhost/$smbshare/$id");
2245     - print $q->p;
2246     -
2247     - print $q->start_multipart_form(
2248     - -method => 'POST',
2249     - -action => $q->url (-absolute => 1)
2250     - );
2251     -
2252     - print $q->table ( {border => 0, cellspacing => 0, cellpadding => 4},
2253     -
2254     - esmith::cgi::genWidgetRow(
2255     - $q,
2256     - $fm->localise('SELECT_BACKUP_FILE'),
2257     - $q->popup_menu (
2258     - -name => 'backuptorestore',
2259     - -values => [ @blabels ],
2260     - -labels => \%blabels
2261     - )
2262     - )
2263     - );
2264     -
2265     - print $q->table ( {width => "100%", -class => "sme-noborders"},
2266     - esmith::cgi::genButtonRow(
2267     - $q,
2268     - $q->submit(
2269     - -name => 'action',
2270     - -value => $fm->localise('RESTORE_FROM_WORKSTN')
2271     - )
2272     - )
2273     - );
2274     -
2275     - print $q->hidden(
2276     - -name => 'state',
2277     - -override => 1,
2278     - -default => 'workstn-restore'
2279     - );
2280     -
2281     - print $q->endform;
2282     -
2283     - esmith::cgi::genFooter ($q);
2284     -}
2285     -
2286     -sub performWorkstnRestore
2287     -{
2288     - my ($q) = @_;
2289     - my $restoreref = $q->param ('backuptorestore');
2290     - my $set = $restoreref;
2291     - $set =~ s/\/[^\/]*$//;
2292     - my %backupsetfiles = ();
2293     - my @restorefiles;
2294     -
2295     - my $backupsetlist = sub {
2296     - if ( $_ =~ /\.dar/ )
2297     - {
2298     - my $backupref = $File::Find::name;
2299     - $backupref =~ s/\.[0-9]+\.dar//;
2300     - $_ =~ s/\..*\.dar//;
2301     - $_ =~ s/.*-//;
2302     - $backupsetfiles{$_} = $backupref;
2303     - }
2304     - };
2305     -
2306     -
2307     - my $lock_file = "/var/lock/subsys/e-smith-restore";
2308     - my $file_handle = &esmith::lockfile::LockFileOrReturn($lock_file);
2309     -
2310     - unless ($file_handle)
2311     - {
2312     - esmith::cgi::genHeaderNonCacheable(
2313     - $q,
2314     - undef, $fm->localise('RESTORE_CANNOT_PROCEED')
2315     - );
2316     -
2317     - print $q->p (
2318     - $q->b ($fm->localise('ANOTHER_RESTORE_IN_PROGRESS')
2319     - )
2320     - );
2321     -
2322     - esmith::cgi::genFooter ($q);
2323     - return;
2324     - }
2325     -
2326     - # mounting backup shared folder
2327     -
2328     - my $backupwkrec = $conf->get('backupwk');
2329     - my $login = $backupwkrec->prop('Login');
2330     - my $password = $backupwkrec->prop('Password');
2331     - my $id = $backupwkrec->prop('Id')
2332     - || $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
2333     - my $mntdir = $backupwkrec->prop('MountDir') || '/mnt/smb';
2334     - my $mounted;
2335     - my $VFSType = $backupwkrec->prop('VFSType') || 'cifs';
2336     - my $smbhost = $backupwkrec->prop('SmbHost');
2337     - my $smbshare = $backupwkrec->prop('SmbShare');
2338     - my $err;
2339     -
2340     - if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
2341     - {
2342     - esmith::cgi::genHeaderNonCacheable(
2343     - $q,
2344     - undef, $fm->localise('RESTORE_CANNOT_PROCEED')
2345     - );
2346     - esmith::cgi::genResult(
2347     - $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
2348     - );
2349     - return;
2350     - }
2351     - else {$mounted = 1}
2352     -
2353     - # Test if backup subdirectory for our server
2354     -
2355     - my $mntbkdir = $mntdir . "/$id";
2356     - unless ( -d $mntbkdir)
2357     - {
2358     - if ($mounted)
2359     - {
2360     - system("/bin/umount", "$mntdir") == 0
2361     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2362     - }
2363     - esmith::cgi::genHeaderNonCacheable(
2364     - $q,
2365     - undef, $fm->localise('RESTORE_CANNOT_PROCEED')
2366     - );
2367     - esmith::cgi::genResult(
2368     - $q, $fm->localise('ERR_NO_HOST_DIR') . $id
2369     - );
2370     - return;
2371     - }
2372     -
2373     - # finding list of available backups
2374     - # and verifying all needed backup files are available
2375     -
2376     - find { wanted => \&$backupsetlist, untaint => 1 }, $set ;
2377     -
2378     - my $key;
2379     - my $num = 0;
2380     - foreach $key (sort keys %backupsetfiles)
2381     - {
2382     - push @restorefiles, $backupsetfiles{$key};
2383     - if ( $num == 0 )
2384     - {
2385     - unless ( $backupsetfiles{$key} =~ /\/full-/ )
2386     - {
2387     - esmith::cgi::genHeaderNonCacheable(
2388     - $q,
2389     - undef, $fm->localise('RESTORE_CANNOT_PROCEED')
2390     - );
2391     - esmith::cgi::genResult(
2392     - $q, $fm->localise('ERR_NO_FULL_BACKUP')
2393     - );
2394     - return;
2395     - }
2396     - }
2397     - else
2398     - {
2399     - my $numf = sprintf("%03d", $num);
2400     - unless ( $backupsetfiles{$key} =~ /\/inc-$numf-/ )
2401     - {
2402     - esmith::cgi::genHeaderNonCacheable(
2403     - $q,
2404     - undef, $fm->localise('RESTORE_CANNOT_PROCEED')
2405     - );
2406     -
2407     - esmith::cgi::genResult(
2408     - $q, $fm->localise('ERR_NO_INC_BACKUP') . $numf
2409     - );
2410     - return;
2411     - }
2412     -
2413     - }
2414     - $num++;
2415     - last if ( $backupsetfiles{$key} eq $restoreref );
2416     - }
2417     -
2418     - # backup is online, restoring now
2419     -
2420     - my $rec = $restore->get('restore');
2421     - $rec->set_prop('state','running');
2422     - $rec->set_prop('start', time);
2423     - $conf->get('bootstrap-console')->set_prop('Run', 'yes');
2424     -
2425     - unless (system("/sbin/e-smith/signal-event", "pre-restore") == 0)
2426     - {
2427     - esmith::cgi::genHeaderNonCacheable(
2428     - $fm->{cgi},
2429     - undef, $fm->localise('OPERATION_STATUS_REPORT'));
2430     - esmith::cgi::genResult(
2431     - $fm->{cgi}, $fm->localise('ERR_PRE_RESTORE'));
2432     - return;
2433     - }
2434     -
2435     - $| = 1;
2436     -
2437     - if (open(RD, "-|"))
2438     - {
2439     -
2440     - #-----------------------------------------------------
2441     - # restore system from uploaded workstation backup file
2442     - #-----------------------------------------------------
2443     -
2444     - esmith::cgi::genHeaderNonCacheable ($q, undef,
2445     - $fm->localise('RESTORE_IN_PROGRESS'));
2446     -
2447     - print $q->p (
2448     - $q->b ($fm->localise('RESTORE_IN_PROGRESS_DESC')
2449     - )
2450     - );
2451     -
2452     - print $q->p($fm->localise('FILES_HAVE_BEEN_RESTORED'));
2453     -
2454     - print '<UL>';
2455     - my $complete = 0;
2456     - while (<RD>)
2457     - {
2458     - $complete++ if /etc\/smbpasswd$/;
2459     - $complete++ if /etc\/samba\/smbpassword$/;
2460     - print "<li>$_</li>\n";
2461     - }
2462     -
2463     - print '</UL>';
2464     - my $message;
2465     - if (!close RD)
2466     - {
2467     - $message = $fm->localise('RESTORE_FAILED_MSG');
2468     - }
2469     - else
2470     - {
2471     - #-----------------------------------------------------
2472     - # if restore completed, regenerate configuration files
2473     - #-----------------------------------------------------
2474     - if ($complete)
2475     - {
2476     -
2477     - $message = $fm->localise('RESTORE_COMPLETE');
2478     - system("/usr/sbin/groupmod", "-g", "$www_gid", "www") == 0
2479     - or warn ($fm->localise('ERR_RESTORING_GID')."\n");
2480     - system("/usr/sbin/usermod", "-g", "$www_gid", "www") == 0
2481     - or warn ($fm->localise('ERR_RESTORING_INITIAL_GRP')."\n");
2482     - system("/sbin/e-smith/signal-event", "post-upgrade") == 0
2483     - or die ($fm->localise('ERROR_UPDATING_CONFIGURATION')."\n");
2484     - }
2485     - else
2486     - {
2487     - $message = $fm->localise('RESTORE_FAILED');
2488     - }
2489     - }
2490     -
2491     - $rec->set_prop('state', 'complete');
2492     - $rec->set_prop('finish', time);
2493     -
2494     - &esmith::lockfile::UnlockFile($file_handle);
2495     -
2496     - print $q->p ($q->b ($message));
2497     -
2498     - print $q->startform(
2499     - -method => 'POST',
2500     - -action => $q->url (-absolute => 1)
2501     - );
2502     - print $q->p($q->b ($fm->localise('YOU_MUST_REBOOT'))),"\n";
2503     - print $q->start_table ({width => "100%", -class => "sme-noborders"}),"\n";
2504     - print esmith::cgi::genButtonRow(
2505     - $q,
2506     - $q->submit (-name => 'action', -value =>
2507     - $fm->localise('REBOOT'))
2508     - );
2509     - # Put in a hidden widget to store the reboot value.
2510     - print $q->hidden(
2511     - -name => 'function',
2512     - -value => 'reboot'
2513     - ),"\n";
2514     - print $q->hidden (
2515     - -name => 'state',
2516     - -override => 1,
2517     - -default => 'perform'
2518     - ),"\n";
2519     - print $q->end_table,"\n";
2520     - print $q->endform;
2521     -
2522     - esmith::cgi::genFooter ($q);
2523     - }
2524     - else
2525     - {
2526     - select(STDOUT);
2527     - $| = 1;
2528     -
2529     - my $file;
2530     - foreach $file (@restorefiles)
2531     - {
2532     - if ($file =~ /^(.*)$/)
2533     - {
2534     - $file = $1;
2535     - }
2536     - else
2537     - {
2538     - if ($mounted)
2539     - {
2540     - system("/bin/umount", "$mntdir") == 0
2541     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2542     - }
2543     - die('Unsecure data : ' . $file);
2544     - }
2545     - system ("/usr/bin/dar", "-Q", "-x", "$file", "-v", "-N", "-R", "/", "-wa");
2546     - }
2547     -
2548     - if ($mounted)
2549     - {
2550     - system("/bin/umount", "$mntdir") == 0
2551     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2552     - }
2553     -
2554     - exit(0);
2555     - }
2556     - return;
2557     -}
2558     -
2559     -sub workstnSelRestore()
2560     -{
2561     - my $rec = $conf->get('backupwk');
2562     -
2563     - esmith::cgi::genHeaderNonCacheable ($q, undef,
2564     - $fm->localise('WORKSTN_SELECTIVE_RESTORE'));
2565     -
2566     - unless ($rec)
2567     - {
2568     - esmith::cgi::genResult(
2569     - $q, $fm->localise('CONFIGURATION_TO_BE_DONE'));
2570     - return;
2571     - }
2572     -
2573     - my %backupfiles = ();
2574     - my $mntdir = $rec->prop('MountDir') || '/mnt/smb';
2575     - my $mntbkdir;
2576     - my $mounted;
2577     - my $key;
2578     - my $id = $rec->prop('Id') ||
2579     - $conf->get('SystemName')->value . '.' . $conf->get('DomainName')->value;
2580     - my %blabels = ();
2581     - my @blabels;
2582     - my $backups = 0;
2583     - my $filterexp;
2584     - my $VFSType = $rec->prop('VFSType') || 'cifs';
2585     - my $smbhost = $rec->prop('SmbHost');
2586     - my $smbshare = $rec->prop('SmbShare');
2587     - my $err;
2588     -
2589     - my $setbackuplist = sub {
2590     - if ( $_ =~ /\.dar/ )
2591     - {
2592     - my $dir = $File::Find::dir;
2593     - my $backupref;
2594     - $dir =~ s/$mntbkdir\///;
2595     - $_ =~ s/\..*\.dar//;
2596     - $backupref = $_;
2597     - $_ =~ s/.*-//;
2598     - @{$backupfiles{$_}}[0] = $dir;
2599     - @{$backupfiles{$_}}[1] = $backupref;
2600     - }
2601     - };
2602     -
2603     - # Mounting backups smb shared folder
2604     -
2605     - unless (-d $mntdir)
2606     - {
2607     - mkdir -p $mntdir;
2608     - }
2609     -
2610     - my $login = $rec->prop('Login') || 'backup';
2611     - my $password = $rec->prop('Password') || 'backup';
2612     -
2613     - if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
2614     - {
2615     - esmith::cgi::genResult(
2616     - $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
2617     - );
2618     - return;
2619     - }
2620     - else {$mounted = 1}
2621     -
2622     - # Test if backup subdirectory for our server
2623     -
2624     - $mntbkdir = $mntdir . '/' . $id;
2625     - unless ( -d $mntbkdir)
2626     - {
2627     - if ($mounted)
2628     - {
2629     - system("/bin/umount", "$mntdir") == 0
2630     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2631     - }
2632     - esmith::cgi::genResult(
2633     - $q, $fm->localise('ERR_NO_HOST_DIR'), $id
2634     - );
2635     - return;
2636     - }
2637     -
2638     - my $catalog = "$mntbkdir/dar-catalog";
2639     - unless ( -e $catalog)
2640     - {
2641     - system("/usr/bin/dar_manager", "-C", "$catalog") == 0
2642     - or die($fm->localise('ERR_DAR_CATALOG'),"\n");
2643     - }
2644     -
2645     - # find available backups for the server
2646     -
2647     - find { wanted => \&$setbackuplist, untaint => 1 }, $mntbkdir ;
2648     -
2649     - # find backups in current catalog
2650     -
2651     - my $i = 0;
2652     - my @bknum;
2653     - my @setd;
2654     - my @bkname;
2655     - open(DAR_LIST, "/usr/bin/dar_manager -B $catalog -l |");
2656     - while (<DAR_LIST>)
2657     - {
2658     - next unless ($_ =~ /set/);
2659     - chomp;
2660     - ($bknum[$i], $setd[$i], $bkname[$i]) = split(' ', $_, 3);
2661     - $i++;
2662     - }
2663     - close (DAR_LIST);
2664     -
2665     - # delete from catalog old removed backups
2666     -
2667     - my $j = $i;
2668     - while ($j)
2669     - {
2670     - unless (-e "$setd[$j-1]/$bkname[$j-1]\.1\.dar")
2671     - {
2672     - my $del = $bknum[$j-1];
2673     - if ($del =~ /^(.*)$/)
2674     - {
2675     - $del = $1;
2676     - }
2677     - system("/usr/bin/dar_manager", "-B", "$catalog", "-D", "$del") == 0
2678     - or die($fm->localise('ERR_DAR_CATALOG'),"\n");
2679     - }
2680     - $j--;
2681     - }
2682     -
2683     - # add to catalog new backups
2684     -
2685     - foreach $key (sort keys %backupfiles)
2686     - {
2687     - my $exists = 0;
2688     - my $rf;
2689     - foreach $rf (@bkname)
2690     - {
2691     - $exists = 1 if ($rf eq $backupfiles{$key}[1]);
2692     - last if $exists;
2693     - }
2694     - do
2695     - {
2696     - my $add = "$mntbkdir/$backupfiles{$key}[0]/$backupfiles{$key}[1]";
2697     - if ($add =~ /^(.*)$/)
2698     - {
2699     - $add = $1;
2700     - }
2701     - system("/usr/bin/dar_manager", "-B", "$catalog", "-A", "$add") == 0
2702     - or die($fm->localise('ERR_DAR_CATALOG'),"\n");
2703     - } unless $exists;
2704     - }
2705     -
2706     - # update backups list from current catalog
2707     -
2708     - open(DAR_LIST, "/usr/bin/dar_manager -B $catalog -l |") ;
2709     -
2710     - $i = 0;
2711     - while (<DAR_LIST>)
2712     - {
2713     - next unless m/set/;
2714     - chomp;
2715     - ($bknum[$i], $setd[$i], $bkname[$i]) = split(' ', $_, 3);
2716     - $i++;
2717     - }
2718     - close (DAR_LIST);
2719     -
2720     - # set drop down list of backups
2721     -
2722     - push @blabels, "0";
2723     - $blabels{"0"} = $fm->localise('ALL_BACKUPS');
2724     - $j = 0;
2725     - while ($j < $i)
2726     - {
2727     - push @blabels, $bknum[$j];
2728     - $blabels{$bknum[$j]} = $bkname[$j];
2729     - $j++
2730     - }
2731     -
2732     - print $q->p ($fm->localise('WORKSTN_SEL_REST_DESC') . " $smbhost/$smbshare/$id");
2733     -
2734     - print $q->h2 ($fm->localise('BACKUP_CHOICE'));
2735     -
2736     - print $q->start_multipart_form(
2737     - -method => 'POST',
2738     - -action => $q->url (-absolute => 1)
2739     - );
2740     -
2741     -
2742     - print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
2743     -
2744     - esmith::cgi::genWidgetRow(
2745     - $q,
2746     - $q->b($fm->localise('SELECT_BACKUP_FILE')),
2747     - $q->popup_menu (
2748     - -name => 'backupset',
2749     - -values => [ @blabels ],
2750     - -labels => \%blabels)
2751     - ),
2752     -
2753     - esmith::cgi::genNameValueRow(
2754     - $q,
2755     - $fm->localise('FILTER_EXPRESSION'),
2756     - 'filterexp',
2757     - $filterexp
2758     - )
2759     - );
2760     -
2761     -
2762     - print $q->table ({width => "100%", -class => "sme-noborders"},
2763     - esmith::cgi::genButtonRow(
2764     - $q,
2765     - $q->submit(
2766     - -name => 'action',
2767     - -value => $fm->localise('PERFORM')
2768     - )
2769     - )
2770     - ),"\n";
2771     -
2772     - print $q->hidden(
2773     - -name => 'state',
2774     - -override => 1,
2775     - -default => 'workstn-sel-restore'
2776     - );
2777     -
2778     - print $q->endform;
2779     -
2780     -
2781     - esmith::cgi::genFooter ($q);
2782     -
2783     - if ($mounted)
2784     - {
2785     - system("/bin/umount", "$mntdir") == 0
2786     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2787     - }
2788     -}
2789     -
2790     -sub performWorkstnSelRestore
2791     -{
2792     - my ($q) = @_;
2793     -
2794     - my $rgfilter;
2795     - my $filterexp = $q->param ('filterexp');
2796     - if ($filterexp =~ /^(.*)$/)
2797     - {
2798     - $filterexp = $1;
2799     - $rgfilter = qr/$filterexp/;
2800     - }
2801     - else
2802     - {
2803     - $filterexp = "";
2804     - }
2805     - my $seldatebf;
2806     -
2807     - esmith::cgi::genHeaderNonCacheable ($q,
2808     - undef, $fm->localise('WORKSTN_SELECTIVE_RESTORE'));
2809     -
2810     - my $backupwkrec = $conf->get('backupwk');
2811     - my $smbhost = $backupwkrec->prop('SmbHost');
2812     - my $smbshare = $backupwkrec->prop('SmbShare');
2813     - my $login = $backupwkrec->prop('Login');
2814     - my $password = $backupwkrec->prop('Password');
2815     - my $mntdir = $backupwkrec->prop('MountDir') || '/mnt/smb';
2816     - my $mntbkdir;
2817     - my $mounted;
2818     - my $key;
2819     - my $id = $backupwkrec->prop('Id') ||
2820     - $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
2821     - my @flabels;
2822     - my %flabels = ();
2823     - my $VFSType = $backupwkrec->prop('VFSType') || 'cifs';
2824     - my $err;
2825     -
2826     - my $backupkey = $q->param ('backupset');
2827     - if ($backupkey =~ /^(.*)$/)
2828     - {
2829     - $backupkey = $1;
2830     - }
2831     - else
2832     - {
2833     - die('Unsecure data : ' . $backupkey);
2834     - }
2835     -
2836     - # Mounting backup shared folder
2837     -
2838     - if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
2839     - {
2840     - esmith::cgi::genResult(
2841     - $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
2842     - );
2843     - return;
2844     - }
2845     - else {$mounted = 1}
2846     -
2847     - # Test if backup subdirectory for our server
2848     -
2849     - $mntbkdir = $mntdir . "/$id";
2850     - unless (-d $mntbkdir)
2851     - {
2852     - if ($mounted)
2853     - {
2854     - system("/bin/umount", "$mntdir") == 0
2855     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2856     - }
2857     - esmith::cgi::genResult(
2858     - $q, $fm->localise('ERR_NO_HOST_DIR'), $id
2859     - );
2860     - return;
2861     - }
2862     -
2863     - # Read wanted file list from selected backup
2864     -
2865     - if (open(RD, "-|"))
2866     - {
2867     - my $regex = qr/\[.*\] */;
2868     - while (<RD>)
2869     - {
2870     - $_ =~ s/$regex//;
2871     - if ($filterexp) {next unless m/$rgfilter/};
2872     - push @flabels, $_;
2873     - }
2874     -
2875     - my $status = close RD ?
2876     - $fm->localise('READ_COMPLETE')
2877     - : ($fm->localise('ERROR_READING_FILE').' : '.$backupkey);
2878     - print $q->p ($status);
2879     -
2880     - }
2881     - else
2882     - {
2883     - select(STDOUT);
2884     - $| = 1;
2885     -
2886     - system ("/usr/bin/dar_manager", "-B", "$mntbkdir/dar-catalog", "-u", "$backupkey") == 0
2887     - or die ($fm->localise('ERR_EXTRACT')." : ".$!);
2888     -
2889     - if ($mounted)
2890     - {
2891     - system("/bin/umount", "$mntdir") == 0
2892     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
2893     - }
2894     - exit(0);
2895     - }
2896     -
2897     - print $q->start_multipart_form(
2898     - -method => 'POST',
2899     - -action => $q->url (-absolute => 1)
2900     - );
2901     -
2902     - print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
2903     -
2904     - esmith::cgi::genWidgetRow(
2905     - $q,
2906     - $q->b($fm->localise('SELECT_FILES_TO_RESTORE')),
2907     - $q->scrolling_list (
2908     - -name => 'restorefiles',
2909     - -values => [ @flabels ],
2910     - -size => 15,
2911     - -multiple => 'true')
2912     - ),
2913     -
2914     - esmith::cgi::genNameValueRow(
2915     - $q,
2916     - $fm->localise('SELECT_DATE_BEFORE'),
2917     - 'seldatebefore',
2918     - $seldatebf
2919     - )
2920     - );
2921     -
2922     - print $q->table ({width => "100%", -class => "sme-noborders"},
2923     - esmith::cgi::genButtonRow(
2924     - $q,
2925     - $q->submit(
2926     - -name => 'action',
2927     - -value => $fm->localise('PERFORM')
2928     - )
2929     - )
2930     - ),"\n";
2931     -
2932     - print $q->hidden(
2933     - -name => 'state',
2934     - -override => 1,
2935     - -default => 'workstn-sel-restore2'
2936     - );
2937     -
2938     - print $q->hidden(
2939     - -name => 'when',
2940     - -override => 1,
2941     - -value => $seldatebf
2942     - );
2943     -
2944     - print $q->endform;
2945     -
2946     - esmith::cgi::genFooter ($q);
2947     -
2948     -}
2949     -
2950     -sub performWorkstnSelRestore2
2951     -{
2952     - my ($q) = @_;
2953     -
2954     - esmith::cgi::genHeaderNonCacheable ($q, undef,
2955     - $fm->localise('RESTORE_IN_PROGRESS'));
2956     -
2957     - my @restorelist;
2958     - my $when = $q->param ('seldatebefore');
2959     - if ($when =~ /^(.*)$/)
2960     - {
2961     - $when = $1;
2962     - }
2963     - else
2964     - {
2965     - die('Unsecure data : ' . $when);
2966     - }
2967     - my $tymd =
2968     - qr/((19|20)\d\d\/(?=\d\d\/\d\d-))?((0?[1-9]|1[0-2])\/(?=\d\d-))?((31|[123]0|[012]?[1-9])-)?/;
2969     - my $thms =
2970     - qr/([01]?[0-9]|2[0-3]):([0-5][0-9])(:[0-5][0-9])?/;
2971     -
2972     - unless (($when =~ m/^$tymd$thms$/) || ($when eq ""))
2973     - {
2974     - esmith::cgi::genResult(
2975     - $q, "$when : " . $fm->localise('ERR_INVALID_SELDATE')
2976     - );
2977     - return;
2978     - }
2979     -
2980     - my $f;
2981     - foreach $f ($q->param ('restorefiles'))
2982     - {
2983     - if ($f =~ /^(.*)$/)
2984     - {
2985     - push @restorelist, "\"".$1."\"";
2986     - }
2987     - }
2988     -
2989     - # mounting backup shared folder
2990     -
2991     - my $backupwkrec = $conf->get('backupwk');
2992     - my $login = $backupwkrec->prop('Login');
2993     - my $password = $backupwkrec->prop('Password');
2994     - my $id = $backupwkrec->prop('Id') ||
2995     - $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
2996     - my $mntdir = $backupwkrec->prop('MountDir') || '/mnt/smb';
2997     - my $mounted;
2998     - my $VFSType = $backupwkrec->prop('VFSType') || 'cifs';
2999     - my $smbhost = $backupwkrec->prop('SmbHost');
3000     - my $smbshare = $backupwkrec->prop('SmbShare');
3001     - my $err;
3002     -
3003     - if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
3004     - {
3005     - esmith::cgi::genResult(
3006     - $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
3007     - );
3008     - return;
3009     - }
3010     - else {$mounted = 1}
3011     -
3012     - # Test if backup subdirectory for our server
3013     -
3014     - my $mntbkdir = $mntdir . "/$id";
3015     - unless (-d $mntbkdir)
3016     - {
3017     - if ($mounted)
3018     - {
3019     - system("/bin/umount", "$mntdir") == 0
3020     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
3021     - }
3022     - esmith::cgi::genResult(
3023     - $q, $fm->localise('ERR_NO_HOST_DIR'), $id
3024     - );
3025     - return;
3026     - }
3027     -
3028     - # backup is online, restoring now
3029     -
3030     - $| = 1;
3031     - my $restorerr;
3032     -
3033     - if (open(RD, "-|"))
3034     - {
3035     -
3036     - #-----------------------------------------------------
3037     - # restore system from uploaded workstation backup file
3038     - #-----------------------------------------------------
3039     -
3040     - print $q->p($fm->localise('FILES_HAVE_BEEN_RESTORED'));
3041     -
3042     - print '<UL>';
3043     - while (<RD>)
3044     - {
3045     - print "<li>$_</li>\n";
3046     - }
3047     -
3048     - print '</UL>';
3049     - my $message;
3050     - if (!close RD)
3051     - {
3052     - $message = $fm->localise('RESTORE_FAILED_MSG');
3053     - }
3054     - else
3055     - {
3056     - if ($restorerr)
3057     - {
3058     - $message = $fm->localise('RESTORE_FAILED');
3059     - }
3060     - else
3061     - {
3062     - $message = $fm->localise('RESTORE_COMPLETE');
3063     - }
3064     - }
3065     -
3066     - print $q->p ($q->b ($message));
3067     -
3068     - esmith::cgi::genFooter ($q);
3069     - }
3070     - else
3071     - {
3072     - select(STDOUT);
3073     - $| = 1;
3074     -
3075     - if ($when)
3076     - {
3077     - $restorerr = system ("/usr/bin/dar_manager -B $mntbkdir/dar-catalog -w $when -e '-N -R / -w' -r @restorelist");
3078     - }
3079     - else
3080     - {
3081     - $restorerr = system ("/usr/bin/dar_manager -B $mntbkdir/dar-catalog -e '-N -R / -w' -r @restorelist");
3082     - }
3083     -
3084     - if ($mounted)
3085     - {
3086     - system("/bin/umount", "$mntdir") == 0
3087     - or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
3088     - }
3089     -
3090     - exit(0);
3091     - }
3092     - return;
3093     -}
3094     -
3095     -sub performReboot ()
3096     -{
3097     - esmith::cgi::genHeaderNonCacheable ($q, undef,
3098     - $fm->localise('SERVER_REBOOT'));
3099     -
3100     - print $q->p (
3101     - $q->b ($fm->localise('SERVER_WILL_REBOOT'))
3102     - );
3103     -
3104     - esmith::cgi::genFooter($fm);
3105     -
3106     - esmith::util::backgroundCommand(
3107     - 5,
3108     - "/sbin/e-smith/signal-event",
3109     - "reboot"
3110     - );
3111     -}
3112     -
3113     -sub CalculateSizes ()
3114     -{
3115     - #------------------------------------------------------------
3116     - # figure out the size of the tar file.
3117     - #------------------------------------------------------------
3118     -
3119     - my $tarsize = 0;
3120     -
3121     - # It takes way too much time to do a du on /home/e-smith. So we'll
3122     - # estimate the current size.
3123     - # We do this by checking the quota used by each user on the system.
3124     -
3125     - use Quota;
3126     - use esmith::AccountsDB;
3127     - my $accounts = esmith::AccountsDB->open;
3128     -
3129     - # Get a $dev value appropriate for use in Quota::query call.
3130     - my $dev = Quota::getqcarg("/home/e-smith/files");
3131     -
3132     - foreach my $user ($accounts->users())
3133     - {
3134     - my $name = $user->key;
3135     - my $uid = getpwnam($name);
3136     - unless ($uid)
3137     - {
3138     - warn ($fm->localise('NO_UID_FOR_NAME').$name."\n");
3139     - # We shouldn't ever get here. If we do, we can't get
3140     - # the quota value for this user, so we just skip to
3141     - # the next one.
3142     - next;
3143     - }
3144     -
3145     - # Get current quota settings.
3146     - my ($blocks) = Quota::query($dev, $uid, 0);
3147     - $tarsize += $blocks;
3148     - }
3149     -
3150     - # We add to this the size of root owned firectories, estimated using du.
3151     - # If this takes too long, then the admin only has his or
3152     - # herself to blame!
3153     -
3154     - # Remove /home/e-smith from backup list, and make paths absolute
3155     - my @list = map { "/$_" } grep { !/home\/e-smith/ } @directories;
3156     - open(DU, "-|")
3157     - or exec '/usr/bin/du', '-s', @list;
3158     -
3159     - while (<DU>)
3160     - {
3161     - my ($du) = split(/\s+/);
3162     - $tarsize += $du;
3163     - }
3164     - close DU;
3165     -
3166     - $tarsize = &showSize($tarsize);
3167     -
3168     - #------------------------------------------------------------
3169     - # figure out the size of the dump files
3170     - #------------------------------------------------------------
3171     -
3172     - my $dumpsize = 0;
3173     -
3174     - open(DF, "-|")
3175     - or exec '/bin/df', '-P', '-t', 'ext3';
3176     -
3177     - while (<DF>)
3178     - {
3179     - next unless (/^\//);
3180     -
3181     - (undef, undef, my $s, undef) = split(/\s+/, $_);
3182     -
3183     - $dumpsize += $s;
3184     - }
3185     -
3186     - # increase size by 10% to cope with dump overhead.
3187     -
3188     - $dumpsize *= 1.1;
3189     -
3190     - close DF;
3191     -
3192     - $dumpsize = &showSize($dumpsize);
3193     -
3194     - #------------------------------------------------------------
3195     - # how much free space is in /tmp
3196     - #------------------------------------------------------------
3197     -
3198     - my $tmpfree = 0;
3199     - my $halffree = 0;
3200     -
3201     - open(DF, "-|")
3202     - or exec '/bin/df', '-P', '-t', 'ext3', '/tmp';
3203     -
3204     - while (<DF>)
3205     - {
3206     - next unless (/^\//);
3207     -
3208     - (undef, undef, undef, my $s) = split(/\s+/, $_);
3209     -
3210     - $tmpfree += $s;
3211     - }
3212     -
3213     - close DF;
3214     -
3215     - $halffree = $tmpfree / 2;
3216     -
3217     - $tmpfree = &showSize($tmpfree);
3218     - $halffree = &showSize($halffree);
3219     -
3220     - return ($tarsize, $dumpsize, $tmpfree, $halffree);
3221     -}
3222     -
3223     -sub showSize
3224     -{
3225     - # convert size to Mb or Gb or Tb :) Remember, df reports in kb.
3226     -
3227     - my $size = shift;
3228     -
3229     - my $Mb = 1024;
3230     - my $Gb = $Mb * $Mb;
3231     - my $Tb = $Mb * $Mb * $Mb;
3232     -
3233     - if ($size >= $Tb)
3234     - {
3235     - $size /= $Tb;
3236     - $size = int($size) . "Tb";
3237     - }
3238     - elsif ($size >= $Gb)
3239     - {
3240     - $size /= $Gb;
3241     - $size = int($size) . "Gb";
3242     - }
3243     - elsif ($size >= $Mb)
3244     - {
3245     - $size /= $Mb;
3246     - $size = int($size) . "Mb";
3247     - }
3248     - else
3249     - {
3250     - $size .= "kb";
3251     - }
3252     -
3253     - return $size;
3254     -}
3255     -
3256     -sub dmount()
3257     -{
3258     - # mount dar unit according to dar-workstation configuration
3259     - # return nothing if mount successfull
3260     -
3261     - my ($host,$share,$mountdir,$login,$password,$VFSType) = @_;
3262     -
3263     - if ($VFSType eq 'cifs')
3264     - {
3265     - return ( qx(/bin/mount -t cifs "$host:$share" $mountdir -o credentials=/etc/dar/CIFScredentials,nounix) );
3266     - }
3267     - elsif ($VFSType eq 'nfs')
3268     - {
3269     - return ( qx(/bin/mount -t nfs -o nolock "$host:/$share" $mountdir 2>&1) );
3270     - }
3271     - elsif ($VFSType eq 'usb')
3272     - {
3273     - $_[2] = "/" . $share;
3274     - my $device = "";
3275     - my $blkdev = "";
3276     - my $vollbl = "";
3277     - foreach my $udi (qx(hal-find-by-property --key volume.fsusage --string filesystem)) {
3278     - $udi =~ m/^(\S+)/;
3279     - my $is_mounted = qx(hal-get-property --udi $1 --key volume.is_mounted);
3280     -
3281     - if ($is_mounted eq "false\n") {
3282     - $blkdev = qx(hal-get-property --udi $1 --key block.device);
3283     - if ($blkdev =~ m/^(\S+)/) {$blkdev = $1;}
3284     - }
3285     - if ($is_mounted eq "false\n") {
3286     - $vollbl = qx(hal-get-property --udi $1 --key volume.label);
3287     - $vollbl =~ m/^(\S+)/;
3288     - if ($vollbl =~ /^\s/) {$vollbl = 'nolabel';}
3289     - }
3290     -
3291     - chomp $vollbl;
3292     - chomp $blkdev;
3293     - $vollbl = lc("media/$vollbl");
3294     - if ($vollbl eq $share) {
3295     - $device = $blkdev;
3296     - }
3297     - }
3298     - return ( qx(/bin/mount $device "/$share" 2>&1) );
3299     - }
3300     - else
3301     - {
3302     - return ("Error while mounting $host/$share : $VFSType not supported.\n");
3303     - }
3304     -}
3305     -
3306     -__DATA__
3307     -<form>
3308     -</form>

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed