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
--- e-smith-backup-2.2.0/root/etc/e-smith/events/actions/workstation-backup-dar 2010-02-15 20:54:05.000000000 +1100
+++ e-smith-backup-2.2.0.new/root/etc/e-smith/events/actions/workstation-backup-dar 2010-02-15 20:58:18.000000000 +1100
@@ -151,7 +151,7 @@
chomp $vollbl;
chomp $blkdev;
- $vollbl = lc("media/$vollbl");
+ $vollbl = "media/$vollbl";
if ($vollbl eq $smbshare) {
$device = $blkdev;
}
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
--- e-smith-backup-2.2.0/root/etc/e-smith/web/functions/backup 2010-02-15 20:54:05.000000000 +1100
+++ e-smith-backup-2.2.0.new/root/etc/e-smith/web/functions/backup 2010-02-15 20:57:42.000000000 +1100
@@ -1221,7 +1221,7 @@
my $vollbl = qx(hal-get-property --udi $1 --key volume.label);
$vollbl =~ m/^(\S+)/;
if ($vollbl =~ /^\s/) {$vollbl = 'nolabel';}
- push @usbdisks, lc($vollbl);
+ push @usbdisks, $vollbl;
}
unless ($usbdisks[0]){
@@ -3254,7 +3254,7 @@
chomp $vollbl;
chomp $blkdev;
- $vollbl = lc("media/$vollbl");
+ $vollbl = "media/$vollbl";
if ($vollbl eq $share) {
$device = $blkdev;
}
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
--- e-smith-backup-2.2.0/root/etc/e-smith/web/functions/backup.orig 2010-02-15 20:54:05.000000000 +1100
+++ e-smith-backup-2.2.0.new/root/etc/e-smith/web/functions/backup.orig 1970-01-01 10:00:00.000000000 +1000
@@ -1,3271 +0,0 @@
-#!/usr/bin/perl -wT
-#----------------------------------------------------------------------
-# heading : Administration
-# description : Backup or restore
-# navigation : 4000 4200
-# Copyright (C) 2002 Mitel Networks Corporation
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Technical support for this program is available from Mitel Networks
-# Please visit our web site www.mitel.com/sme/ for details.
-#----------------------------------------------------------------------
-use strict;
-use esmith::FormMagick;
-use esmith::ConfigDB;
-use esmith::Backup;
-use esmith::BackupHistoryDB;
-use esmith::AccountsDB;
-use esmith::cgi;
-use esmith::util;
-use esmith::lockfile;
-use File::Find;
-
-$File::Find::dont_use_nlink = 1; # fix for Windows shares
-
-my $fm = esmith::FormMagick->new();
-
-# These statements _must_ come _after_ the FormMagick constructor. It sets
-# POST_MAX and DISABLE_UPLOADS to values that will cause this script to fail
-# on restores and verification of files.
-$CGI::POST_MAX = -1; # allow any size POST
-$CGI::DISABLE_UPLOADS = 0; # need to upload to restore from desktop
-
-$fm->parse_xml();
-
-my $conf = esmith::ConfigDB->open()
- || die $fm->localise('CANNOT_OPEN').'configuration db';
-
-my $restore = esmith::ConfigDB->open('/etc/e-smith/restore')
- || die $fm->localise('CANNOT_OPEN').'/etc/e-smith/restore';
-
-my $es_backup = new esmith::Backup or die "Couldn't create Backup object\n";
-
-my @directories = $es_backup->restore_list;
-@directories = grep { -e "/$_" } @directories;
-
-# Unbuffer standard output so that files and directories are listed as
-# they are restored
-$| = 1;
-
-# Store away current gid of 'www' group.
-my $www_gid = getgrnam("www");
-
-#------------------------------------------------------------
-# examine state parameter and display the appropriate form
-#------------------------------------------------------------
-
-my $q = $fm->{cgi};
-
-if (! grep (/^state$/, $q->param))
-{
- showInitial ($q, '');
-}
-elsif ($q->param ('state') eq "perform")
-{
- performAndShowResult ($q);
-}
-elsif ($q->param ('state') eq "tape-configure")
-{
- updateTapeBackupConfig($q);
-}
-elsif ($q->param ('state') eq "tape-restore")
-{
- performTapeRestore ($q);
-}
-elsif ($q->param ('state') eq "workstn-configure")
-{
- WorkstnBackupConfig1($q);
-}
-elsif ($q->param ('state') eq "workstn-configure1")
-{
- updateWorkstnBackupConfig($q);
-}
-elsif ($q->param ('state') eq "workstn-verify")
-{
- performWorkstnVerify($q);
-}
-elsif ($q->param ('state') eq "workstn-restore")
-{
- performWorkstnRestore ($q);
-}
-elsif ($q->param ('state') eq "workstn-sel-restore")
-{
- performWorkstnSelRestore ($q);
-}
-elsif ($q->param ('state') eq "workstn-sel-restore2")
-{
- performWorkstnSelRestore2 ($q);
-}
-else
-{
- esmith::cgi::genStateError ($q, undef);
-}
-
-exit (0);
-
-#------------------------------------------------------------
-# subroutine to display initial form
-#------------------------------------------------------------
-
-sub showInitial
-{
- my ($q, $msg) = @_;
-
- my $rec = $restore->get('restore');
- if($msg eq '')
- {
- if($rec)
- {
- $msg = $rec->prop('errmsg') || '';
- $rec->delete_prop('errmsg');
- }
- }
-
- if ($msg eq '')
- {
- esmith::cgi::genHeaderNonCacheable ($q, undef,
- $fm->localise('BACKUP_TITLE'));
- }
- else
- {
- esmith::cgi::genHeaderNonCacheable
- ($q, undef, $fm->localise('OPERATION_STATUS_REPORT'));
-
- print $q->div ({-class => "sme-error"}, $msg);
- print $q->hr;
- }
- print $q->div({-class => 'error'},
- $q->h5('Warning: a reboot is required before proceeding!
- Failure to reboot now may leave your system in an unknown
- state!'))
- if $conf->get_prop('bootstrap-console', 'Run') eq 'yes';
-
- my ($tarsize, $dumpsize, undef, undef) = &CalculateSizes();
-
- my $module = $conf->get('backup');
- if ($module)
- {
- $module = $module->prop('Program');
- }
-
- # The default e-smith backup program is flexbackup.
-
- unless (defined $module)
- {
- $module = "flexbackup";
- }
- elsif ($module eq '')
- {
- $module = "flexbackup";
- }
-
- # Hack to evaluate embedded vars
- print eval 'return "'.$fm->localise('BACKUP_DESC_DAR').'\n";';
-
- if ($tarsize =~ /Tb/ or $tarsize =~ /(\d+)Gb/ and $1 >= 2)
- {
- print $fm->localise("BACKUP_DESKTOP_TOO_BIG"), "\n";
- }
-
- print $q->h2($fm->localise("BACKUP_CONFIG_STATUS")),"\n";
-
- my $backup_status = $conf->get('backup');
- if ($backup_status)
- {
- $backup_status = $backup_status->prop('status');
- }
-
- if (defined $backup_status && $backup_status eq "enabled")
- {
- my $backupTime = $conf->get('backup')->prop('backupTime');
- my $reminderTime = $conf->get('backup')->prop('reminderTime');
-
- print $q->p ($fm->localise('TAPE_BACKUPS_ENABLED'),
- $fm->localise('BACKUPS_RUN_AT'),$q->b($backupTime),
- $fm->localise('REMINDER_MESSAGE_AT'),$q->b($reminderTime)),
- "\n";
- }
- else
- {
- print $q->p($fm->localise('TAPE_BACKUPS_DISABLED')),"\n";
- }
-
- my $backupwk_status = $conf->get('backupwk');
- if ($backupwk_status)
- {
- $backupwk_status = $backupwk_status->prop('status');
- }
-
- if (defined $backupwk_status && $backupwk_status eq "enabled")
- {
- my $backupwkTime = $conf->get('backupwk')->prop('BackupTime');
-
- print $q->p ($fm->localise('WORKSTN_BACKUPS_ENABLED'),
- $fm->localise('WKBACKUPS_RUN_AT'),$q->b($backupwkTime));
- }
- else
- {
- print $q->p($fm->localise('WORKSTN_BACKUPS_DISABLED'));
- }
-
- my %labels = (
- "desktop-backup" => $fm->localise('DESKTOP_BACKUP'),
- "tape-configure" => $fm->localise('TAPE_CONFIGURE'),
- "tape-restore" => $fm->localise('TAPE_RESTORE'),
- "workstn-configure" => $fm->localise('WORKSTN_CONFIGURE'),
- "workstn-verify" => $fm->localise('WORKSTN_VERIFY'),
- "workstn-restore" => $fm->localise('WORKSTN_RESTORE'),
- "workstn-sel-restore" => $fm->localise('WORKSTN_SEL_RESTORE'),
- );
-
- my @labels = (
- 'desktop-backup',
- 'tape-configure',
- 'tape-restore',
- 'workstn-configure',
- 'workstn-verify',
- 'workstn-restore',
- 'workstn-sel-restore',
- );
-
- my $default_action = 'desktop-backup';
-
- my $restore_state;
- if($rec)
- {
- $restore_state = $rec->prop('state');
- }
-
- unless (defined $restore_state)
- {
- # Undefined, set it to idle
- if ($rec)
- {
- $rec->reset_props(type=>'status', state=>'idle', finish=>0,
- start=>0);
- }
- else
- {
- $rec = $restore->new_record('restore',
- {type=>'status', state=>'idle', finish=>0, start=>0});
- }
- $restore_state = 'idle';
- }
- elsif ($restore_state eq 'running')
- {
- my $start = $rec->prop('start');
- $start = scalar localtime($start);
-
- print $q->p ($fm->localise('RESTORE_IN_PROGRESS_BEGAN_AT')
- . "$start.\n" );
-
- %labels = (
- "refresh" => $fm->localise('REFRESH_THIS_DISPLAY'),
- "tape-configure" => $fm->localise('CONFIGURE_TAPE_BACKUP'),
- "workstn-configure" => $fm->localise('CONFIGURE_WORKSTN_BACKUP'),
- );
-
- @labels = (
- 'refresh',
- 'tape-configure',
- 'workstn-configure',
- );
-
- $default_action = 'refresh';
- }
- elsif ($restore_state eq 'complete')
- {
- my $start = $rec->prop('start');
- $start = scalar localtime($start);
- my $finish = $rec->prop('finish');
- $finish = scalar localtime($finish);
-
- print $q->p ($fm->localise('RESTORE_COMPLETED'),$q->br(),
- $fm->localise('STARTED_AT'),$q->b($start),$q->br(),
- $fm->localise('FINISHED_AT'),$q->b($finish)),"\n";
-
- print $q->p (
- $q->b ($fm->localise('YOU_MUST_REBOOT')
- )
- ),"\n";
-
- $default_action = 'reboot';
- }
- else
- {
- # Unknown state. Reset it to idle
-
- $rec->set_prop('state', 'idle');
- $restore_state = 'idle';
- }
-
- print $q->startform(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- ),"\n";
-
- print $q->start_table ({-class => "sme-noborders"}),"\n";
-
- if ($default_action eq 'reboot')
- {
- print $q->start_table ({width => "100%", -class => "sme-noborders"}),"\n";
- print esmith::cgi::genButtonRow(
- $q,
- $q->submit (-name => 'action', -value =>
- $fm->localise('REBOOT'))
- );
- # Put in a hidden widget to store the reboot value.
- print $q->hidden(
- -name => 'function',
- -value => 'reboot'
- ),"\n";
- print $q->end_table,"\n";
- }
- else
- {
- print $q->Tr(
- $q->td({-class => "sme-noborders-label"},
- $fm->localise("SELECT_AN_ACTION")),
- $q->td({-class => "sme-noborders-content"},
- $q->popup_menu (
- -name => 'function',
- -values => [ @labels ],
- -default => $default_action,
- -labels => \%labels
- )
- )
- ),"\n";
-
- }
-
- print $q->end_table,"\n";
-
- if ($default_action ne 'reboot')
- {
- print $q->start_table ({width => "100%", -class => "sme-noborders"}),
- "\n";
-
- print esmith::cgi::genButtonRow(
- $q,
- $q->submit (-name => 'action', -value =>
- $fm->localise('PERFORM'))
- );
-
- print $q->end_table,"\n";
- }
-
- print $q->hidden (
- -name => 'state',
- -override => 1,
- -default => 'perform'
- ),"\n";
-
- print $q->endform,"\n";
-
- esmith::cgi::genFooter($fm);
-
- return;
-}
-
-sub performAndShowResult
-{
- my ($q) = @_;
-
- my $function = $q->param ('function');
-
- if ($function eq 'refresh')
- {
- showInitial ($q, '');
- }
- elsif ($function eq 'reboot')
- {
- performReboot();
- }
- elsif ($function eq 'desktop-backup')
- {
- desktopBackup();
- }
- elsif ($function eq 'tape-configure')
- {
- TapeBackupConfig ($q);
- }
- elsif ($function eq 'tape-restore')
- {
- tapeRestore();
- }
- elsif ($function eq 'workstn-configure')
- {
- WorkstnBackupConfig ($q);
- }
- elsif ($function eq 'workstn-verify')
- {
- workstnVerify();
- }
- elsif ($function eq 'workstn-restore')
- {
- workstnRestore();
- }
- elsif ($function eq 'workstn-sel-restore')
- {
- workstnSelRestore();
- }
- else
- {
- # Unknown function - refresh the screen anyway
- showInitial ($q, 'unknown');
- }
-
- return;
-
- esmith::cgi::genHeaderNonCacheable ($q, undef,
- $fm->localise("X_BACKUP_OR_RESTORE"));
- print $q->p ( $function );
- esmith::cgi::genFooter($fm);
-}
-
-sub desktopBackupRecordStatus
-{
- my ($backup, $phase, $status) = @_;
- my $now = time();
-
- warn("Backup terminated: $phase failed - status: $status\n");
- $backup->set_prop('EndEpochTime', "$now");
- $backup->set_prop('Result', "$phase:$status");
-}
-
-sub desktopBackup ()
-{
- # Generate a header that will trigger a download and send data as
- # an octet stream.
-
- my $backups = esmith::BackupHistoryDB->open;
- my $now = time();
- my $backup_rec = $backups->new_record($now, {
- type => 'backup_record',
- BackupType => 'desktop',
- StartEpochTime => $now,
- });
-
- # Dump the current mysql tables so that they are part of the image.
- # The events handle cases where mysqld is not enabled, and/or is
- # not running.
-
- my $status = system("/sbin/e-smith/signal-event", "pre-backup", "desktop");
- if ($status)
- {
- desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
- esmith::cgi::genHeaderNonCacheable(
- $fm->{cgi},
- undef, $fm->localise('OPERATION_STATUS_REPORT'));
- esmith::cgi::genResult(
- $fm->{cgi}, $fm->localise('ERR_PRE_BACKUP'));
- return;
- }
-
- print "Expires: 0\n";
- print "Content-type: application/octet-stream\n";
- print "Content-disposition: attachment; filename=smeserver.tgz\n";
- print "\n";
- setpgrp;
- my $ourpgrp = getpgrp;
- local $SIG{PIPE} = sub
- {
- local $SIG{HUP} = 'IGNORE';
- warn "Got sigpipe - sending HUP to $ourpgrp\n";
- kill HUP => -$ourpgrp;
- desktopBackupRecordStatus($backup_rec,
- 'send2browser', 'Incomplete');
- exit 1;
- };
-
- open(RD,
- "/bin/tar --directory / --create @directories --file=-"
- . " | /usr/bin/gzip |"
- );
-
- while ()
- {
- print;
- }
-
- close RD;
-
- # Remove the dumped tables.
-
- $status = system("/sbin/e-smith/signal-event", "post-backup", "desktop");
- if ($status)
- {
- desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
- die ($fm->localise('ERR_POST_BACKUP'),"\n");
- }
- $now = time();
- $backup_rec->set_prop('EndEpochTime', "$now");
- $backup_rec->set_prop('Result', "0");
-}
-
-sub TapeBackupConfig
-{
- my ($q) = @_;
- my $enabledChk = "";
- my $backupAMPM = 'AM';
- my $backupMin;
- my $backupHour;
- my $reminderAMPM = 'AM';
- my $reminderMin;
- my $reminderHour;
-
- esmith::cgi::genHeaderNonCacheable(
- $q, undef, $fm->localise('ENABLE_DISABLE_TAPE'));
-
- print $q->p ($fm->localise('TAPE_CONFIG_DESC'));
-
- # Obtain time for backup from the backup cron template
- my $rec = $conf->get('backup');
- my $backupTime = "2:00";
- if ($rec)
- {
- $backupTime = $rec->prop('backupTime') || "2:00";
- }
-
- ($backupHour, $backupMin) = split (":", $backupTime, -1);
-
- if ($backupHour > 11)
- {
- if ($backupHour > 12)
- {
- $backupHour -= 12;
- }
- $backupAMPM = 'PM';
- }
-
- # Obtain time for reminder notice from the backup cron template
- my $reminderTime = "14:00";
- if ($rec)
- {
- $reminderTime = $rec->prop('reminderTime') || "14:00";
- }
-
- ($reminderHour, $reminderMin) = split (":", $reminderTime, -1);
-
- if ($reminderHour > 12)
- {
- $reminderHour -= 12;
- $reminderAMPM = 'PM';
- }
-
- print $q->startform(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- );
-
- print $q->start_table ({-class => "sme-noborders"});
-
- my $backup_status;
- if ($rec)
- {
- $backup_status = $rec->prop('status');
- }
-
- if (defined $backup_status && $backup_status eq "enabled")
- {
- $enabledChk = "checked";
- }
-
- print $q->Tr(
- $q->td(
- $fm->localise('ENABLE_TAPE_BACKUP')
- . " "
- )
- );
-
- print $q->Tr(
- esmith::cgi::genCell(
- $q,$fm->localise('TAPE_BACKUP_TIME')
- ),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'backupHour',
- -override => 1,
- -default => $backupHour,
- -size => 2)),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'backupMin',
- -override => 1,
- -default => $backupMin,
- -size => 2)),
-
- esmith::cgi::genCell ($q, "AM/PM:"),
-
- esmith::cgi::genCell ($q, $q->popup_menu (-name => 'backupAMPM',
- -values => ['AM', 'PM'],
- -default => $backupAMPM)));
-
- my %timelabels=('AM' => $fm->localise('AM'),'PM' => $fm->localise('PM'));
- print $q->Tr(
- esmith::cgi::genCell(
- $q, $fm->localise('LOAD_TAPE_REMINDER_TIME')
- ),
-
- esmith::cgi::genCell(
- $q,
- $q->textfield(
- -name => 'reminderHour',
- -override => 1,
- -default => $reminderHour,
- -size => 2
- )
- ),
-
- esmith::cgi::genCell(
- $q,
- $q->textfield(
- -name => 'reminderMin',
- -override => 1,
- -default => $reminderMin,
- -size => 2
- )
- ),
-
- esmith::cgi::genCell($q, $fm->localise("AM/PM").":"),
-
- esmith::cgi::genCell(
- $q,
- $q->popup_menu(
- -name => 'reminderAMPM',
- -values => ['AM', 'PM'],
- -labels => \%timelabels,
- -default => $reminderAMPM
- )
- )
- );
-
- print "\n";
- print $q->start_table ({width => "100%", -class => "sme-noborders"});
- print $q->Tr($q->th({-class => "sme-layout"},
- $q->submit(
- -name => 'action',
- -value => $fm->localise('UPDATE_CONF')
- )
- )
- );
-
- print $q->hidden(
- -name => 'state',
- -override => 1,
- -default => 'tape-configure'
- );
-
- print $q->endform;
- print '';
-
- esmith::cgi::genFooter($fm);
- return;
-}
-
-sub updateTapeBackupConfig
-{
- my ($q) = @_;
-
- my $status = $q->param ('tapebackup');
- my $ampm;
-
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef, $fm->localise('UPDATING_TAPE_CONF')
- );
-
- if (defined $status && $status eq "on")
- {
-
- #--------------------------------------------------
- # Untaint parameters and check for validity
- #--------------------------------------------------
-
- my $backupHour = $q->param ('backupHour');
- if ($backupHour =~ /^(.*)$/) {
- $backupHour = $1;
- } else {
- $backupHour = "12";
- }
- if (($backupHour < 1) || ($backupHour > 12))
- {
- esmith::cgi::genResult(
- $fm->{cgi}, $fm->localise('ERR_INVALID_HOUR').$backupHour.
- $fm->localise('BETWEEN_1_AND_12')
- );
-
- return;
- }
-
- my $backupMin = $q->param ('backupMin');
- if ($backupMin =~ /^(.*)$/) {
- $backupMin = $1;
- } else {
- $backupMin = "0";
- }
- if (($backupMin < 0) || ($backupMin > 59))
- {
- esmith::cgi::genResult(
- $fm->{cgi}, $fm->localise('ERR_INVALID_MINUTE').$backupMin.
- $fm->localise('BETWEEN_0_AND_59')
- );
-
- return;
- }
-
- $backupMin = sprintf("%02d", $backupMin);
-
- $ampm = $q->param ('backupAMPM');
- if ($ampm =~ /^(.*)$/) {
- $ampm = $1;
- } else {
- $ampm = "AM";
- }
-
- # convert to 24 hour time
-
- $backupHour = $backupHour % 12;
- if ($ampm eq "PM")
- {
- $backupHour = $backupHour + 12;
- }
-
- my $reminderHour = $q->param ('reminderHour');
- if ($reminderHour =~ /^(.*)$/) {
- $reminderHour = $1;
- } else {
- $reminderHour = "12";
- }
- if (($reminderHour < 1) || ($reminderHour > 12))
- {
- esmith::cgi::genResult(
- $fm->{cgi},
- $fm->localise('ERR_INVALID_REMINDER_HOUR').$reminderHour
- .$fm->localise('BETWEEN_1_AND_12')
- );
-
- return;
- }
-
- my $reminderMin = $q->param ('reminderMin');
- if ($reminderMin =~ /^(.*)$/) {
- $reminderMin = $1;
- } else {
- $reminderMin = "0";
- }
- if (($reminderMin < 0) || ($reminderMin > 59))
- {
- esmith::cgi::genResult(
- $fm->{cgi}, $fm->localise('ERR_INVALID_REMINDER_MINUTE').
- $reminderMin.$fm->localise('BETWEEN_0_AND_59')
- );
- return;
- }
-
- $reminderMin = sprintf("%02d", $reminderMin);
-
- $ampm = $q->param ('reminderAMPM');
- if ($ampm =~ /^(.*)$/) {
- $ampm = $1;
- } else {
- $ampm = "AM";
- }
-
- # convert to 24 hour time
-
- $reminderHour = $reminderHour % 12;
- if ($ampm eq "PM")
- {
- $reminderHour = $reminderHour + 12;
- }
-
- # variables passed validity checks, set configuration database values
- my $old = $conf->get('UnsavedChanges')->value;
-
- my $rec = $conf->get('backup');
- unless (defined $rec)
- {
- $rec = $conf->new_record('backup', {type=>'service'});
- }
-
- $rec->set_prop('status', 'enabled');
-
- my $module = $rec->prop('Program');
-
- # The default e-smith backup program is flexbackup.
-
- unless (defined $module)
- {
- $module = "flexbackup";
- }
- elsif ($module eq '')
- {
- $module = "flexbackup";
- }
-
- $rec->set_prop('Program', $module);
- $rec->set_prop('backupTime', "$backupHour:$backupMin");
- $rec->set_prop('reminderTime', "$reminderHour:$reminderMin");
-
- $conf->get('UnsavedChanges')->set_value($old);
-
- system("/sbin/e-smith/signal-event", "conf-backup") == 0
- or die($fm->localise('ERR_CONF_BACKUP'),"\n");
-
- esmith::cgi::genResult(
- $fm->{cgi}, $fm->localise('SUCCESSFULLY_ENABLED_TAPE').$q->br().
- $fm->localise('WITH_BACKUP_TIME')."$backupHour:$backupMin".
- $q->br().$fm->localise('WITH_REMINDER_TIME').
- "$reminderHour:$reminderMin");
- }
- else
- {
- # set service to disabled
- my $old = $conf->get('UnsavedChanges')->value;
-
- my $rec = $conf->get('backup');
- unless ($rec)
- {
- $rec = $conf->new_record('backup', {type=>'service'});
- }
-
- $rec->set_prop('status', 'disabled');
- $conf->get('UnsavedChanges')->set_value($old);
-
- system("/sbin/e-smith/signal-event", "conf-backup") == 0
- or die($fm->localise('ERR_CONF_BACKUP')."\n");
-
- esmith::cgi::genResult(
- $fm->{cgi}, $fm->localise('SUCCESSFULLY_DISABLED')
- );
- }
-
- return;
-}
-
-sub tapeRestore ()
-{
- esmith::cgi::genHeaderNonCacheable(
- $q, undef, $fm->localise('RESTORE_CONF_FROM_TAPE'));
-
- print $fm->localise('RESTORE_CONF_FROM_TAPE_DESC');
-
- print $q->start_multipart_form(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- );
-
- print $q->start_table ({width => "100%", -class => "sme-noborders"});
-
- print esmith::cgi::genButtonRow(
- $q,
- $q->submit (-name => 'action',
- -value => $fm->localise('RESTORE_FROM_TAPE'))
- );
- print "\n";
- print $q->hidden(
- -name => 'state',
- -override => 1,
- -default => 'tape-restore'
- );
-
- print $q->endform;
- esmith::cgi::genFooter($fm);
-}
-
-sub performTapeRestore
-{
- my ($q) = @_;
-
- #----------------------------------------
- # restore system from backup tape
- #----------------------------------------
-
- my $lock_file = "/var/lock/subsys/e-smith-restore";
- my $file_handle = &esmith::lockfile::LockFileOrReturn($lock_file);
-
- unless ($file_handle)
- {
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef,
- $fm->localise('UNABLE_TO_RESTORE_CONF')
- );
-
- print $q->p (
- $q->b ($fm->localise('ANOTHER_RESTORE_IN_PROGRESS')
- )
- );
-
- esmith::cgi::genFooter($fm);
- return;
- }
-
- my $rec = $restore->get('restore');
- $rec->set_prop('state', 'running');
- $rec->set_prop('start', time);
-
- my $sec = 10;
- print "Refresh: $sec; URL=/server-manager/cgi-bin/backup\n";
- esmith::cgi::genHeaderNonCacheable(
- $q, undef, $fm->localise()
- );
-
- print $q->p($fm->localise('NOW_RESTORING_FROM_TAPE')
- );
-
- print $q->p (
- $q->b ($fm->localise('MUST_REBOOT_AFTER_RESTORE'))
- );
-
- print $q->p($fm->localise('PAGE_REFRESH_IN', {sec=>$sec}));
-
- my $child;
-
- if ($child = fork)
- {
- # Parent
-
- $SIG{'CHLD'} = 'IGNORE';
- &esmith::lockfile::UnlockFile($file_handle);
-
- esmith::cgi::genFooter($fm);
- return;
- }
- elsif (defined $child)
- {
- # Child
-
- # Re-establish the lock. Wait till it is relinquished by the parent.
-
- $file_handle = &esmith::lockfile::LockFileOrWait($lock_file);
-
- # Close STDOUT so that the web server connection is closed.
-
- close STDOUT;
-
- # Now reopen STDOUT for the child. Redirect it to STDERR.
-
- open(STDOUT, ">&STDERR");
-
- unless(system("/sbin/e-smith/signal-event", "pre-restore") == 0)
- {
- $rec->set_prop('errmsg', $fm->localise('ERR_PRE_RESTORE'));
- $rec->delete_prop('state');
- die ($fm->localise('ERR_PRE_RESTORE'),"\n");
- }
- unless(system("/sbin/e-smith/signal-event", "restore-tape") == 0)
- {
- $rec->set_prop('errmsg', $fm->localise('ERR_RESTORING_FROM_TAPE'));
- $rec->delete_prop('state');
- die ($fm->localise('ERR_RESTORING_FROM_TAPE')."\n");
- }
-
- #----------------------------------------
- # regenerate configuration files
- #----------------------------------------
-
- unless(system("/usr/sbin/groupmod", "-g", "$www_gid", "www") == 0)
- {
- $rec->set_prop('errmsg', $rec->prop('errmsg').'
'.
- $fm->localise('ERR_RESTORING_GID'));
- warn ($fm->localise('ERR_RESTORING_GID')."\n");
- }
- unless(system("/usr/sbin/usermod", "-g", "$www_gid", "www") == 0)
- {
- $rec->set_prop('errmsg', $rec->prop('errmsg').'
'.
- $fm->localise('ERR_RESTORING_INITIAL_GRP'));
- warn ($fm->localise('ERR_RESTORING_INITIAL_GRP')."\n");
- }
- unless(system("/sbin/e-smith/signal-event", "post-upgrade") == 0)
- {
- $rec->set_prop('errmsg', $rec->prop('errmsg').'
'.
- $fm->localise('ERR_UPDATING_CONF_AFTER_TAPE_RESTORE'));
- $rec->delete_prop('state');
- die ($fm->localise('ERR_UPDATING_CONF_AFTER_TAPE_RESTORE'));
- }
-
- my $finish = time;
- $rec->set_prop('state', 'complete');
- $rec->set_prop('finish', $finish);
-
- my $start = $rec->prop('start');
- $start = scalar localtime($start);
- $finish = scalar localtime($finish);
-
- &esmith::lockfile::UnlockFile($file_handle);
-
- exit;
- }
- else
- {
- # Error
-
- $rec->delete_prop('state');
- $rec->set_prop('errmsg', $fm->localise('COULD_NOT_FORK'));
- die ($fm->localise("COULD_NOT_FORK")."$!\n");
- }
-}
-
-sub WorkstnBackupConfig
-{
- my ($q) = @_;
- my $backupwk_status;
- my $enabledIncOnlyTimeout = "";
- my $backupwkLogin = 'backup';
- my $backupwkPassword = 'backup';
- my $backupwkStation = 'host';
- my $backupwkFolder = 'share';
- my $setsNumber;
- my $filesinset;
- my $backupwkTime;
- my $backupwkTimeout;
- my $backupwkIncOnlyTimeout;
- my $compression;
- my $VFSType;
- my $dof;
- my @dlabels = split(' ', $fm->localise('DOW'));
- my @VFST = ('cifs', 'nfs', 'usb');
- my %VFST = ('cifs', 'cifs', 'nfs', 'nfs', 'usb', 'local usb disk');
-
- # Obtain backup informations from configuration
- my $rec = $conf->get('backupwk');
- if ($rec)
- {
- $backupwkTime = $rec->prop('BackupTime') || '2:00';
- $backupwkLogin = $rec->prop('Login') || 'backup';
- $backupwkPassword = $rec->prop('Password') || 'backup';
- $backupwkStation = $rec->prop('SmbHost') || 'host';
- $backupwkFolder = $rec->prop('SmbShare') || 'share';
- $setsNumber = $rec->prop('SetsMax') || '1';
- $filesinset = $rec->prop('DaysInSet') || '1';
- $backupwkTimeout = $rec->prop('Timeout') || '12';
- $backupwkIncOnlyTimeout = $rec->prop('IncOnlyTimeout') || 'yes';
- $compression = $rec->prop('Compression') || '0';
- $dof = (defined $rec->prop('FullDay')) ? $rec->prop('FullDay') : '7';
- $VFSType = $rec->prop('VFSType') || 'cifs';
- $backupwk_status = $rec->prop('status');
- }
-
- esmith::cgi::genHeaderNonCacheable(
- $q, undef, $fm->localise('CONFIGURE_WORKSTN_BACKUP'));
-
- if ($rec) {
- print $fm->localise('WORKSTN_BACKUP_DESC');
- print $fm->localise('WORKSTN_BACKUP_ENABLED'),
- $q->b(' '.$fm->localise(uc($backupwk_status))), '.
';
- if ($VFSType eq 'usb') {
- print $fm->localise('WORKSTN_BACKUP_USB'), '
';
- }
- else {
- print $fm->localise('WORKSTN_BACKUP_HOST'), ' ', $backupwkStation;
- print ' ', $fm->localise('WORKSTN_BACKUP_VFSTYPE'), ' ', $VFSType, '
';
- }
- print $fm->localise('WORKSTN_BACKUP_SHARE'), ' ', $backupwkFolder, '
';
- if ($VFSType eq 'cifs') {
- print $fm->localise('LOGIN'), ' ', $backupwkLogin, '
';
- print $fm->localise('PASSWORD'), ' ********
';
- }
- print $fm->localise('WORKSTN_BACKUP_SETSNUM'), ' ', $setsNumber, '
';
- print $fm->localise('WORKSTN_BACKUP_DAYSINSET'), ' ', $filesinset, '
';
- print $fm->localise('WORKSTN_BACKUP_COMPRESSION'), ' ', $compression, '
';
- print $fm->localise('WORKSTN_BACKUP_TOD'), ' ', $backupwkTime, '
';
- print $fm->localise('WORKSTN_BACKUP_TIMEOUT'), ' ', $backupwkTimeout, ' ', $fm->localise('HOURS');
- if ( $backupwkIncOnlyTimeout eq 'yes' ) {print $fm->localise('WORKSTN_BACKUP_INCONLY_TIMEOUT')}
- print '
';
- if ( $dof eq '7' ) {
- print $fm->localise('WORKSTN_FULL_BACKUP_EVERYDAY', '
');
- }
- else {
- print $fm->localise('WORKSTN_FULL_BACKUP_DAY'), ' ', $dlabels[$dof], '
';
- }
- }
- else { print $fm->localise('WORKSTN_BACKUP_NOT_CONFIGURED'), '
' }
-
- print $q->startform(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- );
-
- print $q->start_table ({-class => "sme-noborders"});
-
- print $q->Tr($q->td($q->h3 ($fm->localise('WORKSTATION_BACKUP_SETCONF'))));
-
-
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('SELECT_VFS_TYPE')
- ),
-
- esmith::cgi::genCell ($q, $q->popup_menu (-name => 'VFSType',
- -values => [ @VFST ],
- -labels => \%VFST,
- -default => $VFSType)));
-
- print "\n";
-
- print $q->start_table ({width => "100%", -class => "sme-noborders"});
- print $q->Tr($q->th({-class => "sme-layout"},
- $q->submit(
- -name => 'action',
- -value => $fm->localise('NEXT')
- )
- )
- );
-
- print $q->hidden(
- -name => 'state',
- -override => 1,
- -default => 'workstn-configure'
- );
- print '';
-
- print $q->endform;
-
- esmith::cgi::genFooter ($q);
- return;
-}
-
-sub WorkstnBackupConfig1
-{
- my ($q) = @_;
- my $enabledChk = "";
- my $enabledIncOnlyTimeout = "";
- my $backupwkAMPM = 'AM';
- my $backupwkMin;
- my $backupwkHour;
- my $backupwkLogin = 'backup';
- my $backupwkPassword = 'backup';
- my $backupwkStation = 'host';
- my $backupwkFolder = 'share';
- my $setsNumber;
- my $filesinset;
- my $backupwkTimeout;
- my $backupwkIncOnlyTimeout;
- my $compression;
- my $VFSType = $q->param ('VFSType');
- my $dof;
- my @usbdisks;
- my %dlabels = ();
- my @dlabels = split(' ', $fm->localise('DOW'));
- my $i = 0;
- foreach (@dlabels) {
- $dlabels{$i} = $_;
- $i++;
- }
-
- # Obtain backup informations from configuration
- my $rec = $conf->get('backupwk');
- my $backupwkTime = '2:00';
- if ($rec)
- {
- $backupwkTime = $rec->prop('BackupTime') || '2:00';
- $backupwkLogin = $rec->prop('Login') || 'backup';
- $backupwkPassword = $rec->prop('Password') || 'backup';
- $backupwkStation = $rec->prop('SmbHost') || 'host';
- $backupwkFolder = $rec->prop('SmbShare') || 'share';
- $setsNumber = $rec->prop('SetsMax') || '1';
- $filesinset = $rec->prop('DaysInSet') || '1';
- $backupwkTimeout = $rec->prop('Timeout') || '12';
- $backupwkIncOnlyTimeout = $rec->prop('IncOnlyTimeout') || 'yes';
- $compression = $rec->prop('Compression') || '0';
- $dof = (defined $rec->prop('FullDay')) ? $rec->prop('FullDay') : '7';
- }
-
- ($backupwkHour, $backupwkMin) = split (':', $backupwkTime, -1);
-
- if ($backupwkHour > 12)
- {
- $backupwkHour -= 12;
- $backupwkAMPM = 'PM';
- }
-
- my $backupwk_status;
- if ($rec)
- {
- $backupwk_status = $rec->prop('status');
- }
-
- if (defined $backupwk_status && $backupwk_status eq 'enabled')
- {
- $enabledChk = 'checked';
- }
-
- if (defined $backupwkIncOnlyTimeout && $backupwkIncOnlyTimeout eq 'yes')
- {
- $enabledIncOnlyTimeout = 'checked';
- }
-
- esmith::cgi::genHeaderNonCacheable(
- $q, undef, $fm->localise('CONFIGURE_WORKSTN_BACKUP'));
-
- if ( $VFSType eq 'usb' ) {
- foreach my $udi (qx(hal-find-by-property --key volume.fsusage --string filesystem)) {
- $udi =~ m/^(\S+)/;
- my $vollbl = qx(hal-get-property --udi $1 --key volume.label);
- $vollbl =~ m/^(\S+)/;
- if ($vollbl =~ /^\s/) {$vollbl = 'nolabel';}
- push @usbdisks, lc($vollbl);
- }
-
- unless ($usbdisks[0]){
- esmith::cgi::genResult(
- $fm->{cgi}, $fm->localise('ERR_NO_USB_DISK'));
- return
- }
- }
-
- print $q->startform(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- );
-
- print $fm->localise('CONFIGURE_WORKSTN_BACKUP_DESC');
-
- print $q->start_table ({-class => "sme-noborders"});
-
- print $q->Tr(
- $q->td(
- $fm->localise('ENABLE_WORKSTN_BACKUP')
- . " "
- )
- );
-
- print $q->Tr($q->td($q->h3 ($fm->localise('WORKSTATION_BACKUP_DEST'))));
-
- if ( $VFSType eq 'usb' ) {
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('WORKSTN_NAME')
- ),
-
- esmith::cgi::genCell ($q, 'localhost'),
- );
- }
- else {
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('WORKSTN_NAME')
- ),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkStation',
- -override => 1,
- -default => $backupwkStation,
- -size => 20)),
- );
- }
-
- if ( $VFSType eq 'usb' ) {
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('SHARED_FOLDER_NAME')
- ),
-
- esmith::cgi::genCell ($q, $q->popup_menu (-name => 'backupwkFolder',
- -values => [ @usbdisks ],
- -default => $backupwkFolder,)),
- );
- }
- else {
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('SHARED_FOLDER_NAME')
- ),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkFolder',
- -override => 1,
- -default => $backupwkFolder,
- -size => 20)),
- );
- }
-
- if ( $VFSType eq 'cifs' ) {
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('WORKSTN_LOGIN')
- ),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkLogin',
- -override => 1,
- -default => $backupwkLogin,
- -size => 12)),
- );
-
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('PASSWORD')
- ),
-
- esmith::cgi::genCell ($q, $q->password_field (-name => 'backupwkPassword',
- -override => 1,
- -default => $backupwkPassword,
- -size => 20)),
- );
- }
-
- print '';
-
- print $q->table ({border => 0, cellspacing => 1, cellpadding => 4});
-
- print $q->Tr($q->td({-colspan=>4},$q->h3 ($fm->localise('WORKSTN_BACKUP_SETTINGS'))));
-
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('NUMBER_OF_SETS')
- ),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'setsNumber',
- -override => 1,
- -default => $setsNumber,
- -size => 3)),
-
- esmith::cgi::genCell ($q, $fm->localise('NUMBER_OF_FILES_IN_SET')),
- esmith::cgi::genCell ($q, $q->textfield (-name => 'filesinset',
- -override => 1,
- -default => $filesinset,
- -size => 3))
- );
-
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('WORKSTN_BACKUP_TIME')
- ),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkHour',
- -override => 1,
- -default => $backupwkHour,
- -size => 2)),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkMin',
- -override => 1,
- -default => $backupwkMin,
- -size => 2)),
-
- esmith::cgi::genCell ($q, $q->popup_menu (-name => 'backupwkAMPM',
- -values => ['AM', 'PM'],
- -default => $backupwkAMPM)));
-
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('WORKSTN_TIMEOUT')
- ),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'backupwkTimeout',
- -override => 1,
- -default => $backupwkTimeout,
- -size => 2)),
-
- esmith::cgi::genCell(
- $q,
- $fm->localise('INC_ONLY_TIMEOUT')
- ),
-
- esmith::cgi::genCell (
- $q,
- " "
- ),
- );
-
- print $q->Tr(
- esmith::cgi::genCell(
- $q,
- $fm->localise('COMPRESSION_LEVEL')
- ),
-
- esmith::cgi::genCell ($q, $q->textfield (-name => 'compression',
- -override => 1,
- -default => $compression,
- -size => 1)),
-
- esmith::cgi::genCell(
- $q,
- $fm->localise('FULL_ONLY_ON')
- ),
-
- esmith::cgi::genCell (
- $q,
- $q->popup_menu (
- -name => 'dof',
- -values => [ '7', '0', '1', '2', '3', '4', '5', '6' ],
- -labels => \%dlabels,
- -default => $dof))
- );
-
- print "\n";
-
- print $q->start_table ({width => "100%", -class => "sme-noborders"});
- print $q->Tr($q->th({-class => "sme-layout"},
- $q->submit(
- -name => 'action',
- -value => $fm->localise('UPDATE_CONF')
- )
- )
- );
-
- print $q->hidden(
- -name => 'state',
- -override => 1,
- -default => 'workstn-configure1'
- );
- print $q->hidden(
- -name => 'VFSType',
- -override => 1,
- -default => $VFSType
- );
- print '';
-
- print $q->endform;
-
- esmith::cgi::genFooter ($q);
- return;
-}
-
-sub updateWorkstnBackupConfig
-{
- my ($q) = @_;
-
- my $status = $q->param ('workstnbackup');
- my $inconly = $q->param ('incOnlyTimeout');
- my $dof = $q->param('dof');
- my $ampm;
- my $incOnlyTimeout;
-
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef, $fm->localise('UPDATING_WORKSTN_CONF')
- );
-
- #--------------------------------------------------
- # Untaint parameters and check for validity
- #--------------------------------------------------
-
- my $VFSType = $q->param ('VFSType');
-
- my $backupwkStation = $q->param ('backupwkStation');
- if ( $VFSType eq 'usb') { $backupwkStation = 'localhost' }
- if ($backupwkStation =~ /^(.*)$/) {
- $backupwkStation = $1;
- } else {
- $backupwkStation = "";
- }
- if ( $backupwkStation eq "" )
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_WORKSTN')
- );
- return;
- }
-
- my $backupwkFolder = $q->param ('backupwkFolder');
- if ( $VFSType eq 'usb' ) {
- $backupwkFolder = 'media/' . $backupwkFolder;
- }
- if ($backupwkFolder =~ /^(.*)$/) {
- $backupwkFolder = $1;
- $backupwkFolder =~ s/^\//; # remove leading /
- } else {
- $backupwkFolder = "";
- }
- if ( $backupwkFolder eq "" )
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_FOLDER')
- );
- return;
- }
-
- my $backupwkLogin = $q->param ('backupwkLogin') || '';
- if ($backupwkLogin =~ /^(.*)$/) {
- $backupwkLogin = $1;
- } else {
- $backupwkLogin = "";
- }
- if ( ( $backupwkLogin eq "" ) && ( $VFSType eq 'cifs' ) )
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_LOGIN')
- );
- return;
- }
-
- my $backupwkPassword = $q->param ('backupwkPassword') || '';
- if ($backupwkPassword =~ /^(.*)$/) {
- $backupwkPassword = $1;
- } else {
- $backupwkPassword = "";
- }
- if ( ( $backupwkPassword eq "" ) && ( $VFSType eq 'cifs' ) )
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_PASSWORD')
- );
- return;
- }
-
- my $setsNumber = $q->param ('setsNumber');
- unless ( $setsNumber > 0 )
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_SETS_NUMBER')
- );
- return;
- }
-
- my $filesinset = $q->param ('filesinset');
- unless ( $filesinset > 0 )
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_FILES_IN_SET_NUMBER')
- );
- return;
- }
-
- my $timeout = $q->param ('backupwkTimeout');
- if (( $timeout eq '') || ( $timeout == 0 )) {$timeout = 24 }
- if (( $timeout < 1 ) || ( $timeout > 24 ))
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_TIMEOUT')
- );
- return;
- }
-
- if (defined $inconly && $inconly eq 'on')
- {
- $incOnlyTimeout = 'yes';
- }
- else
- {
- $incOnlyTimeout = 'no';
- }
-
- my $compression = $q->param ('compression');
- if (( $compression < 0 ) || ( $compression > 9 ))
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_COMPRESSION')
- );
- return;
- }
-
- my $rec = $conf->get('backupwk');
- unless (defined $rec)
- {
- $rec = $conf->new_record('backupwk', {type=>'service'});
- }
-
- $rec->set_prop('SmbHost', $backupwkStation);
- $rec->set_prop('SmbShare', $backupwkFolder);
- $rec->set_prop('Login', $backupwkLogin);
- $rec->set_prop('Password', $backupwkPassword);
- $rec->set_prop('SetsMax', $setsNumber);
- $rec->set_prop('DaysInSet', $filesinset);
- $rec->set_prop('Timeout', $timeout);
- $rec->set_prop('IncOnlyTimeout', $incOnlyTimeout);
- $rec->set_prop('Compression', $compression);
- $rec->set_prop('FullDay', $dof);
- $rec->set_prop('VFSType', $VFSType);
-
- my $module = $rec->prop('Program');
-
- # The default workstation backup program is dar.
-
- unless (defined $module)
- {
- $module = 'dar';
- }
- elsif ($module eq '')
- {
- $module = 'dar';
- }
-
- $rec->set_prop('Program', $module);
-
- if (defined $status && $status eq 'on')
- {
-
- my $backupwkHour = $q->param ('backupwkHour');
- if ($backupwkHour =~ /^(.*)$/) {
- $backupwkHour = $1;
- } else {
- $backupwkHour = '12';
- }
- if (($backupwkHour < 0) || ($backupwkHour > 12))
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_HOUR').$backupwkHour.
- $fm->localise('BETWEEN_0_AND_12')
- );
-
- return;
- }
-
- my $backupwkMin = $q->param ('backupwkMin');
- if ($backupwkMin =~ /^(.*)$/) {
- $backupwkMin = $1;
- } else {
- $backupwkMin = '0';
- }
- if (($backupwkMin < 0) || ($backupwkMin > 59))
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_INVALID_MINUTE').$backupwkMin.
- $fm->localise('BETWEEN_0_AND_59')
- );
-
- return;
- }
-
- $backupwkMin = sprintf("%02d", $backupwkMin);
-
- $ampm = $q->param ('backupwkAMPM');
- if ($ampm =~ /^(.*)$/) {
- $ampm = $1;
- } else {
- $ampm = 'AM';
- }
-
- # convert to 24 hour time
-
- $backupwkHour = $backupwkHour % 12;
- if ($ampm eq 'PM')
- {
- $backupwkHour = $backupwkHour + 12;
- }
-
-
- # variables passed validity checks, set configuration database values
- my $old = $conf->get('UnsavedChanges')->value;
-
- $rec->set_prop('status', 'enabled');
-
- $rec->set_prop('BackupTime', "$backupwkHour:$backupwkMin");
-
- $conf->get('UnsavedChanges')->set_value($old);
-
- system("/sbin/e-smith/signal-event", "conf-backup") == 0
- or die($fm->localise('ERR_CONF_BACKUP'),"\n");
-
- esmith::cgi::genResult(
- $q, $fm->localise('SUCCESSFULLY_ENABLED_WORKSTN').$q->br().
- $fm->localise('WITH_BACKUP_TIME')."$backupwkHour:$backupwkMin");
- }
- else
- {
- # set service to disabled
- my $old = $conf->get('UnsavedChanges')->value;
-
- $rec->set_prop('status', 'disabled');
- $conf->get('UnsavedChanges')->set_value($old);
-
- system("/sbin/e-smith/signal-event", "conf-backup") == 0
- or die($fm->localise('ERR_CONF_BACKUP')."\n");
-
- esmith::cgi::genResult(
- $q, $fm->localise('SUCCESSFULLY_DISABLED_WORKSTN')
- );
- }
-
- return;
-}
-
-sub workstnVerify ()
-{
-
- my $rec = $conf->get('backupwk');
-
- esmith::cgi::genHeaderNonCacheable ($q, undef,
- $fm->localise('VERIFY_WORKSTN_BACKUP_FILE'));
-
- unless ($rec)
- {
- esmith::cgi::genResult(
- $q, $fm->localise('CONFIGURATION_TO_BE_DONE'));
- return;
- }
-
- my %backupfiles = ();
- my $mntdir = $rec->prop('MountDir') || '/mnt/smb';
- my $mntbkdir;
- my $mounted;
- my $key;
- my $id = $rec->prop('Id') || $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
- my $smbhost = $rec->prop('SmbHost');
- my $smbshare = $rec->prop('SmbShare');
- my $VFSType = $rec->prop('VFSType') || 'cifs';
- my $err;
-
- my $setbackuplist = sub {
- if ( $_ =~ /\.dar/ ) {
- my $dir = $File::Find::dir;
- my $backupref;
- $dir =~ s/$mntbkdir\///;
- $_ =~ s/\..*\.dar//;
- $backupref = $_;
- $_ =~ s/.*-//;
- @{$backupfiles{$_}}[0] = $dir;
- @{$backupfiles{$_}}[1] = $backupref;
- }
- };
-
- # Mounting backup shared folder
-
- unless (-d $mntdir)
- {
- mkdir -p $mntdir;
- }
-
- my $login = $rec->prop('Login') || 'backup';
- my $password = $rec->prop('Password') || 'backup';
-
- if ( $err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType) )
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
- );
- return;
- }
- else {$mounted = 1}
-
- # Test if backup subdirectory for our server
-
- $mntbkdir = $mntdir . '/' . $id;
- unless ( -d $mntbkdir)
- {
- if ($mounted) {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_NO_HOST_DIR'), $id
- );
- return;
- }
-
- # Finding existing backups
-
- find { wanted => \&$setbackuplist, untaint => 1 }, $mntbkdir ;
-
- my %blabels = ();
- my @blabels;
- my $backups = 0;
-
- foreach $key (sort keys %backupfiles) {
- my $labkey = $mntbkdir . '/' . $backupfiles{$key}[0] . '/' . $backupfiles{$key}[1];
- $blabels{$labkey} = $backupfiles{$key}[1] . " (" . $backupfiles{$key}[0] . ")";
- $backups = push @blabels, $labkey;
- }
-
- if ($mounted) {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
-
- # Stops here if no backups
-
- if ( $backups == 0 ) {
- esmith::cgi::genResult(
- $q, $fm->localise('NO_BACKUPS_TO_RESTORE'));
- return;
- }
-
- print $q->p ($fm->localise('VERIFY_WORKSTN_BACKUP_DESC') . ' ' . "$smbhost/$smbshare/$id");
- print $q->p;
-
- print $q->start_multipart_form(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- );
-
- print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
-
- esmith::cgi::genWidgetRow(
- $q,
- $fm->localise('SELECT_BACKUP_FILE'),
- $q->popup_menu (
- -name => 'backupset',
- -values => [ @blabels ],
- -labels => \%blabels
- )
- )
- );
-
- print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
-
- esmith::cgi::genWidgetRow(
- $q,
- $fm->localise('CHECK_TO_VERIFY_FULL_RESTORE'),
- $q->checkbox (
- -name => 'verifyall',
- -checked=>0,
- -label=>''
- )
- ),
- $q->Tr(
- esmith::cgi::genTextRow(
- $q,
- $fm->localise('CHECK_INTEGRITY_WARNING')
- )
- )
- ),"\n";
-
- print $q->table ({width => "100%", -class => "sme-noborders"},
- esmith::cgi::genButtonRow(
- $q,
- $q->submit(
- -name => 'action',
- -value => $fm->localise('VERIFY')
- )
- )
- ),"\n";
-
- print $q->hidden(
- -name => 'state',
- -override => 1,
- -default => 'workstn-verify'
- );
-
- print $q->endform;
-
- esmith::cgi::genFooter ($q);
-}
-
-sub performWorkstnVerify
-{
- my ($q) = @_;
-
- my $backupwkrec = $conf->get('backupwk');
- my $smbhost = $backupwkrec->prop('SmbHost');
- my $smbshare = $backupwkrec->prop('SmbShare');
- my $login = $backupwkrec->prop('Login');
- my $password = $backupwkrec->prop('Password');
- my $mntdir = $backupwkrec->prop('MountDir') || '/mnt/smb';
- my $mounted;
- my $key;
- my $id = $backupwkrec->prop('Id') ||
- $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
- my $err;
- my $VFSType = $backupwkrec->prop('VFSType') || 'cifs';
- my $verifyref = $q->param ('backupset');
-
- # Mounting backup shared folder
-
- if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
- );
- return;
- }
- else {$mounted = 1}
-
- # Test if backup subdirectory for our server
-
- my $mntbkdir = $mntdir . "/$id";
- unless (-d $mntbkdir)
- {
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- esmith::cgi::genResult($q, $fm->localise('ERR_NO_HOST_DIR'), $id);
- return;
- }
-
- my $fullverify = $q->param('verifyall');
-
- if ( $fullverify eq "on" )
- {
- # Test all backups needed to full restore
-
- my %backupsetfiles = ();
- my @restorefiles;
- my $set = $verifyref;
- $set =~ s/\/[^\/]*$//;
- my $backupsetlist = sub {
- if ( $_ =~ /\.dar/ )
- {
- my $backupref = $File::Find::name;
- $backupref =~ s/\.[0-9]+\.dar//;
- $_ =~ s/\..*\.dar//;
- $_ =~ s/.*-//;
- $backupsetfiles{$_} = $backupref;
- }
- };
-
- # find list of available backups and verify
- # it contains all backups needed for full restore
-
- find { wanted => \&$backupsetlist, untaint => 1 }, $set ;
-
- my $key;
- my $num = 0;
- foreach $key (sort keys %backupsetfiles)
- {
- push @restorefiles, $backupsetfiles{$key};
- if ( $num == 0 )
- {
- unless ( $backupsetfiles{$key} =~ /\/full-/ )
- {
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef, $fm->localise('VERIFY_WORKSTN_BACKUP_FILE')
- );
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_NO_FULL_BACKUP')
- );
- return;
- }
- }
- else
- {
- my $numf = sprintf("%03d", $num);
- unless ( $backupsetfiles{$key} =~ /\/inc-$numf-/ )
- {
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef, $fm->localise('VERIFY_WORKSTN_BACKUP_FILE')
- );
-
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_NO_INC_BACKUP') . " " . $numf
- );
- return;
- }
-
- }
- $num++;
- last if ( $backupsetfiles{$key} eq $verifyref );
- }
-
- # and test them
-
- $| = 1;
-
- if (open(RD, "-|"))
- {
- esmith::cgi::genHeaderNonCacheable ($q, undef,
- $fm->localise('VERIFY_WORKSTN_BACKUP_FILE'));
-
- print $q->p (
- $q->b ($fm->localise('TESTING_NEEDED_BACKUPS_FOR_RESTORE') )
- );
- print '';
-
- while ()
- {
- print "- $_
\n";
- }
-
- print '
';
- my $message;
- if (!close RD)
- {
- print $q->p ($q->b ( $fm->localise('RESTORE_VERIFY_FAILED') ));
- }
- else
- {
- print $q->p ($q->b ( $fm->localise('VERIFY_COMPLETE') ));
- }
-
- esmith::cgi::genFooter ($q);
- }
- else
- {
- select(STDOUT);
- $| = 1;
-
- my $file;
- foreach $file (@restorefiles)
- {
- if ($file =~ /^(.*)$/)
- {
- $file = $1;
- }
- else
- {
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- die('Unsecure data : ' . $file);
- }
- print $q->p($fm->localise('TESTED_BACKUP') . " " . $file);
- system ("/usr/bin/dar", "-Q", "--test", "$file", "--noconf");
- }
-
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
-
- exit(0);
- }
- return;
-
- }
- else
- {
- # verify selected backup only
- # and display files saved in the backup
-
- my $backupkey = $verifyref;
- if ($backupkey =~ /^(.*)$/)
- {
- $backupkey = $1;
- }
- else
- {
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- die('Unsecure data : ' . $backupkey);
- }
-
- if (open(RD, "-|"))
- {
- esmith::cgi::genHeaderNonCacheable ($q,
- undef, $fm->localise('VERIFY_WORKSTN_BACKUP_FILE'));
- print $q->p($fm->localise('FILES_IN_BACKUP'));
-
- print '';
-
- my $complete = 0;
- while ()
- {
- $complete++ if /etc\/smbpasswd$/;
- $complete++ if /etc\/samba\/smbpasswd$/; # >6.0 base
- print "- $_
\n";
- }
-
- print '
';
- my $status = close RD ?
- ($complete ?
- $fm->localise('VERIFY_COMPLETE') :
- $fm->localise('BACKUP_FILE_INCOMPLETE'))
- : ($fm->localise('ERROR_READING_FILE').' : '.$backupkey);
- print $q->p ($q->b ($status));
-
- esmith::cgi::genFooter ($q);
-
- }
- else
- {
- select(STDOUT);
- $| = 1;
-
- system ("/usr/bin/dar", "-Q", "--list", "$backupkey", "--noconf") == 0
- or die ($fm->localise('ERR_EXTRACT')." : ".$!);
-
- if ($mounted) {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- exit(0);
- }
- }
-
- return;
-}
-
-sub workstnRestore ()
-{
-
- my $rec = $conf->get('backupwk');
-
- esmith::cgi::genHeaderNonCacheable(
- $q, undef, $fm->localise('RESTORE_CONF_FROM_WORKSTN'));
-
- unless ($rec)
- {
- esmith::cgi::genResult(
- $q, $fm->localise('CONFIGURATION_TO_BE_DONE'));
- return;
- }
-
- my $mntdir = $rec->prop('MountDir') || '/mnt/smb';
- my $mntbkdir;
- my $mounted;
- my %backupfiles = ();
- my $key;
- my $id = $rec->prop('Id') ||
- $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
- my $VFSType = $rec->prop('VFSType') || 'cifs';
- my $smbhost = $rec->prop('SmbHost');
- my $smbshare = $rec->prop('SmbShare');
- my $err;
-
- my $setbackupflist = sub {
- if ( $_ =~ /\.dar/ )
- {
- my $dir = $File::Find::dir;
- my $backupref;
- $dir =~ s/$mntbkdir\///;
- $_ =~ s/\..*\.dar//;
- $backupref = $_;
- $_ =~ s/.*-//;
- @{$backupfiles{$_}}[0] = $dir;
- @{$backupfiles{$_}}[1] = $backupref;
- }
- };
-
- # Mounting backup shared folder
- unless (-d $mntdir)
- {
- mkdir -p $mntdir;
- }
-
- my $login = $rec->prop('Login') || 'backup';
- my $password = $rec->prop('Password') || 'backup';
-
- if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
- {
- esmith::cgi::genResult($q,
- $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err);
- return;
- }
- else {$mounted = 1}
-
- # Test if backup subdirectory for our server
-
- $mntbkdir = $mntdir . "/$id";
- unless ( -d $mntbkdir)
- {
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- esmith::cgi::genResult($q, $fm->localise('ERR_NO_HOST_DIR'), $id);
- return;
- }
-
- # Finding existing backups
-
- find { wanted => \&$setbackupflist, untaint => 1 }, $mntbkdir ;
-
- my %blabels = ();
- my @blabels;
- my $backups = 0;
-
- foreach $key (sort keys %backupfiles)
- {
- my $labkey = $mntbkdir . '/' . $backupfiles{$key}[0] . '/' . $backupfiles{$key}[1];
- $blabels{$labkey} = $backupfiles{$key}[1] . ' (' . $backupfiles{$key}[0] . ')';
- $backups = push @blabels, $labkey;
- }
-
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
-
- if ( $backups == 0 )
- {
- esmith::cgi::genResult(
- $q, $fm->localise('NO_BACKUPS_TO_RESTORE'));
- return;
- }
-
- print $q->p ($fm->localise('RESTORE_CONF_FROM_WORKSTN_DESC') . ' ' . "$smbhost/$smbshare/$id");
- print $q->p;
-
- print $q->start_multipart_form(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- );
-
- print $q->table ( {border => 0, cellspacing => 0, cellpadding => 4},
-
- esmith::cgi::genWidgetRow(
- $q,
- $fm->localise('SELECT_BACKUP_FILE'),
- $q->popup_menu (
- -name => 'backuptorestore',
- -values => [ @blabels ],
- -labels => \%blabels
- )
- )
- );
-
- print $q->table ( {width => "100%", -class => "sme-noborders"},
- esmith::cgi::genButtonRow(
- $q,
- $q->submit(
- -name => 'action',
- -value => $fm->localise('RESTORE_FROM_WORKSTN')
- )
- )
- );
-
- print $q->hidden(
- -name => 'state',
- -override => 1,
- -default => 'workstn-restore'
- );
-
- print $q->endform;
-
- esmith::cgi::genFooter ($q);
-}
-
-sub performWorkstnRestore
-{
- my ($q) = @_;
- my $restoreref = $q->param ('backuptorestore');
- my $set = $restoreref;
- $set =~ s/\/[^\/]*$//;
- my %backupsetfiles = ();
- my @restorefiles;
-
- my $backupsetlist = sub {
- if ( $_ =~ /\.dar/ )
- {
- my $backupref = $File::Find::name;
- $backupref =~ s/\.[0-9]+\.dar//;
- $_ =~ s/\..*\.dar//;
- $_ =~ s/.*-//;
- $backupsetfiles{$_} = $backupref;
- }
- };
-
-
- my $lock_file = "/var/lock/subsys/e-smith-restore";
- my $file_handle = &esmith::lockfile::LockFileOrReturn($lock_file);
-
- unless ($file_handle)
- {
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef, $fm->localise('RESTORE_CANNOT_PROCEED')
- );
-
- print $q->p (
- $q->b ($fm->localise('ANOTHER_RESTORE_IN_PROGRESS')
- )
- );
-
- esmith::cgi::genFooter ($q);
- return;
- }
-
- # mounting backup shared folder
-
- my $backupwkrec = $conf->get('backupwk');
- my $login = $backupwkrec->prop('Login');
- my $password = $backupwkrec->prop('Password');
- my $id = $backupwkrec->prop('Id')
- || $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
- my $mntdir = $backupwkrec->prop('MountDir') || '/mnt/smb';
- my $mounted;
- my $VFSType = $backupwkrec->prop('VFSType') || 'cifs';
- my $smbhost = $backupwkrec->prop('SmbHost');
- my $smbshare = $backupwkrec->prop('SmbShare');
- my $err;
-
- if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
- {
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef, $fm->localise('RESTORE_CANNOT_PROCEED')
- );
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
- );
- return;
- }
- else {$mounted = 1}
-
- # Test if backup subdirectory for our server
-
- my $mntbkdir = $mntdir . "/$id";
- unless ( -d $mntbkdir)
- {
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef, $fm->localise('RESTORE_CANNOT_PROCEED')
- );
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_NO_HOST_DIR') . $id
- );
- return;
- }
-
- # finding list of available backups
- # and verifying all needed backup files are available
-
- find { wanted => \&$backupsetlist, untaint => 1 }, $set ;
-
- my $key;
- my $num = 0;
- foreach $key (sort keys %backupsetfiles)
- {
- push @restorefiles, $backupsetfiles{$key};
- if ( $num == 0 )
- {
- unless ( $backupsetfiles{$key} =~ /\/full-/ )
- {
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef, $fm->localise('RESTORE_CANNOT_PROCEED')
- );
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_NO_FULL_BACKUP')
- );
- return;
- }
- }
- else
- {
- my $numf = sprintf("%03d", $num);
- unless ( $backupsetfiles{$key} =~ /\/inc-$numf-/ )
- {
- esmith::cgi::genHeaderNonCacheable(
- $q,
- undef, $fm->localise('RESTORE_CANNOT_PROCEED')
- );
-
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_NO_INC_BACKUP') . $numf
- );
- return;
- }
-
- }
- $num++;
- last if ( $backupsetfiles{$key} eq $restoreref );
- }
-
- # backup is online, restoring now
-
- my $rec = $restore->get('restore');
- $rec->set_prop('state','running');
- $rec->set_prop('start', time);
- $conf->get('bootstrap-console')->set_prop('Run', 'yes');
-
- unless (system("/sbin/e-smith/signal-event", "pre-restore") == 0)
- {
- esmith::cgi::genHeaderNonCacheable(
- $fm->{cgi},
- undef, $fm->localise('OPERATION_STATUS_REPORT'));
- esmith::cgi::genResult(
- $fm->{cgi}, $fm->localise('ERR_PRE_RESTORE'));
- return;
- }
-
- $| = 1;
-
- if (open(RD, "-|"))
- {
-
- #-----------------------------------------------------
- # restore system from uploaded workstation backup file
- #-----------------------------------------------------
-
- esmith::cgi::genHeaderNonCacheable ($q, undef,
- $fm->localise('RESTORE_IN_PROGRESS'));
-
- print $q->p (
- $q->b ($fm->localise('RESTORE_IN_PROGRESS_DESC')
- )
- );
-
- print $q->p($fm->localise('FILES_HAVE_BEEN_RESTORED'));
-
- print '';
- my $complete = 0;
- while ()
- {
- $complete++ if /etc\/smbpasswd$/;
- $complete++ if /etc\/samba\/smbpassword$/;
- print "- $_
\n";
- }
-
- print '
';
- my $message;
- if (!close RD)
- {
- $message = $fm->localise('RESTORE_FAILED_MSG');
- }
- else
- {
- #-----------------------------------------------------
- # if restore completed, regenerate configuration files
- #-----------------------------------------------------
- if ($complete)
- {
-
- $message = $fm->localise('RESTORE_COMPLETE');
- system("/usr/sbin/groupmod", "-g", "$www_gid", "www") == 0
- or warn ($fm->localise('ERR_RESTORING_GID')."\n");
- system("/usr/sbin/usermod", "-g", "$www_gid", "www") == 0
- or warn ($fm->localise('ERR_RESTORING_INITIAL_GRP')."\n");
- system("/sbin/e-smith/signal-event", "post-upgrade") == 0
- or die ($fm->localise('ERROR_UPDATING_CONFIGURATION')."\n");
- }
- else
- {
- $message = $fm->localise('RESTORE_FAILED');
- }
- }
-
- $rec->set_prop('state', 'complete');
- $rec->set_prop('finish', time);
-
- &esmith::lockfile::UnlockFile($file_handle);
-
- print $q->p ($q->b ($message));
-
- print $q->startform(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- );
- print $q->p($q->b ($fm->localise('YOU_MUST_REBOOT'))),"\n";
- print $q->start_table ({width => "100%", -class => "sme-noborders"}),"\n";
- print esmith::cgi::genButtonRow(
- $q,
- $q->submit (-name => 'action', -value =>
- $fm->localise('REBOOT'))
- );
- # Put in a hidden widget to store the reboot value.
- print $q->hidden(
- -name => 'function',
- -value => 'reboot'
- ),"\n";
- print $q->hidden (
- -name => 'state',
- -override => 1,
- -default => 'perform'
- ),"\n";
- print $q->end_table,"\n";
- print $q->endform;
-
- esmith::cgi::genFooter ($q);
- }
- else
- {
- select(STDOUT);
- $| = 1;
-
- my $file;
- foreach $file (@restorefiles)
- {
- if ($file =~ /^(.*)$/)
- {
- $file = $1;
- }
- else
- {
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- die('Unsecure data : ' . $file);
- }
- system ("/usr/bin/dar", "-Q", "-x", "$file", "-v", "-N", "-R", "/", "-wa");
- }
-
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
-
- exit(0);
- }
- return;
-}
-
-sub workstnSelRestore()
-{
- my $rec = $conf->get('backupwk');
-
- esmith::cgi::genHeaderNonCacheable ($q, undef,
- $fm->localise('WORKSTN_SELECTIVE_RESTORE'));
-
- unless ($rec)
- {
- esmith::cgi::genResult(
- $q, $fm->localise('CONFIGURATION_TO_BE_DONE'));
- return;
- }
-
- my %backupfiles = ();
- my $mntdir = $rec->prop('MountDir') || '/mnt/smb';
- my $mntbkdir;
- my $mounted;
- my $key;
- my $id = $rec->prop('Id') ||
- $conf->get('SystemName')->value . '.' . $conf->get('DomainName')->value;
- my %blabels = ();
- my @blabels;
- my $backups = 0;
- my $filterexp;
- my $VFSType = $rec->prop('VFSType') || 'cifs';
- my $smbhost = $rec->prop('SmbHost');
- my $smbshare = $rec->prop('SmbShare');
- my $err;
-
- my $setbackuplist = sub {
- if ( $_ =~ /\.dar/ )
- {
- my $dir = $File::Find::dir;
- my $backupref;
- $dir =~ s/$mntbkdir\///;
- $_ =~ s/\..*\.dar//;
- $backupref = $_;
- $_ =~ s/.*-//;
- @{$backupfiles{$_}}[0] = $dir;
- @{$backupfiles{$_}}[1] = $backupref;
- }
- };
-
- # Mounting backups smb shared folder
-
- unless (-d $mntdir)
- {
- mkdir -p $mntdir;
- }
-
- my $login = $rec->prop('Login') || 'backup';
- my $password = $rec->prop('Password') || 'backup';
-
- if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
- );
- return;
- }
- else {$mounted = 1}
-
- # Test if backup subdirectory for our server
-
- $mntbkdir = $mntdir . '/' . $id;
- unless ( -d $mntbkdir)
- {
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_NO_HOST_DIR'), $id
- );
- return;
- }
-
- my $catalog = "$mntbkdir/dar-catalog";
- unless ( -e $catalog)
- {
- system("/usr/bin/dar_manager", "-C", "$catalog") == 0
- or die($fm->localise('ERR_DAR_CATALOG'),"\n");
- }
-
- # find available backups for the server
-
- find { wanted => \&$setbackuplist, untaint => 1 }, $mntbkdir ;
-
- # find backups in current catalog
-
- my $i = 0;
- my @bknum;
- my @setd;
- my @bkname;
- open(DAR_LIST, "/usr/bin/dar_manager -B $catalog -l |");
- while ()
- {
- next unless ($_ =~ /set/);
- chomp;
- ($bknum[$i], $setd[$i], $bkname[$i]) = split(' ', $_, 3);
- $i++;
- }
- close (DAR_LIST);
-
- # delete from catalog old removed backups
-
- my $j = $i;
- while ($j)
- {
- unless (-e "$setd[$j-1]/$bkname[$j-1]\.1\.dar")
- {
- my $del = $bknum[$j-1];
- if ($del =~ /^(.*)$/)
- {
- $del = $1;
- }
- system("/usr/bin/dar_manager", "-B", "$catalog", "-D", "$del") == 0
- or die($fm->localise('ERR_DAR_CATALOG'),"\n");
- }
- $j--;
- }
-
- # add to catalog new backups
-
- foreach $key (sort keys %backupfiles)
- {
- my $exists = 0;
- my $rf;
- foreach $rf (@bkname)
- {
- $exists = 1 if ($rf eq $backupfiles{$key}[1]);
- last if $exists;
- }
- do
- {
- my $add = "$mntbkdir/$backupfiles{$key}[0]/$backupfiles{$key}[1]";
- if ($add =~ /^(.*)$/)
- {
- $add = $1;
- }
- system("/usr/bin/dar_manager", "-B", "$catalog", "-A", "$add") == 0
- or die($fm->localise('ERR_DAR_CATALOG'),"\n");
- } unless $exists;
- }
-
- # update backups list from current catalog
-
- open(DAR_LIST, "/usr/bin/dar_manager -B $catalog -l |") ;
-
- $i = 0;
- while ()
- {
- next unless m/set/;
- chomp;
- ($bknum[$i], $setd[$i], $bkname[$i]) = split(' ', $_, 3);
- $i++;
- }
- close (DAR_LIST);
-
- # set drop down list of backups
-
- push @blabels, "0";
- $blabels{"0"} = $fm->localise('ALL_BACKUPS');
- $j = 0;
- while ($j < $i)
- {
- push @blabels, $bknum[$j];
- $blabels{$bknum[$j]} = $bkname[$j];
- $j++
- }
-
- print $q->p ($fm->localise('WORKSTN_SEL_REST_DESC') . " $smbhost/$smbshare/$id");
-
- print $q->h2 ($fm->localise('BACKUP_CHOICE'));
-
- print $q->start_multipart_form(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- );
-
-
- print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
-
- esmith::cgi::genWidgetRow(
- $q,
- $q->b($fm->localise('SELECT_BACKUP_FILE')),
- $q->popup_menu (
- -name => 'backupset',
- -values => [ @blabels ],
- -labels => \%blabels)
- ),
-
- esmith::cgi::genNameValueRow(
- $q,
- $fm->localise('FILTER_EXPRESSION'),
- 'filterexp',
- $filterexp
- )
- );
-
-
- print $q->table ({width => "100%", -class => "sme-noborders"},
- esmith::cgi::genButtonRow(
- $q,
- $q->submit(
- -name => 'action',
- -value => $fm->localise('PERFORM')
- )
- )
- ),"\n";
-
- print $q->hidden(
- -name => 'state',
- -override => 1,
- -default => 'workstn-sel-restore'
- );
-
- print $q->endform;
-
-
- esmith::cgi::genFooter ($q);
-
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
-}
-
-sub performWorkstnSelRestore
-{
- my ($q) = @_;
-
- my $rgfilter;
- my $filterexp = $q->param ('filterexp');
- if ($filterexp =~ /^(.*)$/)
- {
- $filterexp = $1;
- $rgfilter = qr/$filterexp/;
- }
- else
- {
- $filterexp = "";
- }
- my $seldatebf;
-
- esmith::cgi::genHeaderNonCacheable ($q,
- undef, $fm->localise('WORKSTN_SELECTIVE_RESTORE'));
-
- my $backupwkrec = $conf->get('backupwk');
- my $smbhost = $backupwkrec->prop('SmbHost');
- my $smbshare = $backupwkrec->prop('SmbShare');
- my $login = $backupwkrec->prop('Login');
- my $password = $backupwkrec->prop('Password');
- my $mntdir = $backupwkrec->prop('MountDir') || '/mnt/smb';
- my $mntbkdir;
- my $mounted;
- my $key;
- my $id = $backupwkrec->prop('Id') ||
- $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
- my @flabels;
- my %flabels = ();
- my $VFSType = $backupwkrec->prop('VFSType') || 'cifs';
- my $err;
-
- my $backupkey = $q->param ('backupset');
- if ($backupkey =~ /^(.*)$/)
- {
- $backupkey = $1;
- }
- else
- {
- die('Unsecure data : ' . $backupkey);
- }
-
- # Mounting backup shared folder
-
- if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
- );
- return;
- }
- else {$mounted = 1}
-
- # Test if backup subdirectory for our server
-
- $mntbkdir = $mntdir . "/$id";
- unless (-d $mntbkdir)
- {
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_NO_HOST_DIR'), $id
- );
- return;
- }
-
- # Read wanted file list from selected backup
-
- if (open(RD, "-|"))
- {
- my $regex = qr/\[.*\] */;
- while ()
- {
- $_ =~ s/$regex//;
- if ($filterexp) {next unless m/$rgfilter/};
- push @flabels, $_;
- }
-
- my $status = close RD ?
- $fm->localise('READ_COMPLETE')
- : ($fm->localise('ERROR_READING_FILE').' : '.$backupkey);
- print $q->p ($status);
-
- }
- else
- {
- select(STDOUT);
- $| = 1;
-
- system ("/usr/bin/dar_manager", "-B", "$mntbkdir/dar-catalog", "-u", "$backupkey") == 0
- or die ($fm->localise('ERR_EXTRACT')." : ".$!);
-
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- exit(0);
- }
-
- print $q->start_multipart_form(
- -method => 'POST',
- -action => $q->url (-absolute => 1)
- );
-
- print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
-
- esmith::cgi::genWidgetRow(
- $q,
- $q->b($fm->localise('SELECT_FILES_TO_RESTORE')),
- $q->scrolling_list (
- -name => 'restorefiles',
- -values => [ @flabels ],
- -size => 15,
- -multiple => 'true')
- ),
-
- esmith::cgi::genNameValueRow(
- $q,
- $fm->localise('SELECT_DATE_BEFORE'),
- 'seldatebefore',
- $seldatebf
- )
- );
-
- print $q->table ({width => "100%", -class => "sme-noborders"},
- esmith::cgi::genButtonRow(
- $q,
- $q->submit(
- -name => 'action',
- -value => $fm->localise('PERFORM')
- )
- )
- ),"\n";
-
- print $q->hidden(
- -name => 'state',
- -override => 1,
- -default => 'workstn-sel-restore2'
- );
-
- print $q->hidden(
- -name => 'when',
- -override => 1,
- -value => $seldatebf
- );
-
- print $q->endform;
-
- esmith::cgi::genFooter ($q);
-
-}
-
-sub performWorkstnSelRestore2
-{
- my ($q) = @_;
-
- esmith::cgi::genHeaderNonCacheable ($q, undef,
- $fm->localise('RESTORE_IN_PROGRESS'));
-
- my @restorelist;
- my $when = $q->param ('seldatebefore');
- if ($when =~ /^(.*)$/)
- {
- $when = $1;
- }
- else
- {
- die('Unsecure data : ' . $when);
- }
- my $tymd =
- qr/((19|20)\d\d\/(?=\d\d\/\d\d-))?((0?[1-9]|1[0-2])\/(?=\d\d-))?((31|[123]0|[012]?[1-9])-)?/;
- my $thms =
- qr/([01]?[0-9]|2[0-3]):([0-5][0-9])(:[0-5][0-9])?/;
-
- unless (($when =~ m/^$tymd$thms$/) || ($when eq ""))
- {
- esmith::cgi::genResult(
- $q, "$when : " . $fm->localise('ERR_INVALID_SELDATE')
- );
- return;
- }
-
- my $f;
- foreach $f ($q->param ('restorefiles'))
- {
- if ($f =~ /^(.*)$/)
- {
- push @restorelist, "\"".$1."\"";
- }
- }
-
- # mounting backup shared folder
-
- my $backupwkrec = $conf->get('backupwk');
- my $login = $backupwkrec->prop('Login');
- my $password = $backupwkrec->prop('Password');
- my $id = $backupwkrec->prop('Id') ||
- $conf->get('SystemName')->value . "." . $conf->get('DomainName')->value;
- my $mntdir = $backupwkrec->prop('MountDir') || '/mnt/smb';
- my $mounted;
- my $VFSType = $backupwkrec->prop('VFSType') || 'cifs';
- my $smbhost = $backupwkrec->prop('SmbHost');
- my $smbshare = $backupwkrec->prop('SmbShare');
- my $err;
-
- if ($err = dmount($smbhost,$smbshare,$mntdir,$login,$password,$VFSType))
- {
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_MOUNTING_SMBSHARE') . "\n" . $err
- );
- return;
- }
- else {$mounted = 1}
-
- # Test if backup subdirectory for our server
-
- my $mntbkdir = $mntdir . "/$id";
- unless (-d $mntbkdir)
- {
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
- esmith::cgi::genResult(
- $q, $fm->localise('ERR_NO_HOST_DIR'), $id
- );
- return;
- }
-
- # backup is online, restoring now
-
- $| = 1;
- my $restorerr;
-
- if (open(RD, "-|"))
- {
-
- #-----------------------------------------------------
- # restore system from uploaded workstation backup file
- #-----------------------------------------------------
-
- print $q->p($fm->localise('FILES_HAVE_BEEN_RESTORED'));
-
- print '';
- while ()
- {
- print "- $_
\n";
- }
-
- print '
';
- my $message;
- if (!close RD)
- {
- $message = $fm->localise('RESTORE_FAILED_MSG');
- }
- else
- {
- if ($restorerr)
- {
- $message = $fm->localise('RESTORE_FAILED');
- }
- else
- {
- $message = $fm->localise('RESTORE_COMPLETE');
- }
- }
-
- print $q->p ($q->b ($message));
-
- esmith::cgi::genFooter ($q);
- }
- else
- {
- select(STDOUT);
- $| = 1;
-
- if ($when)
- {
- $restorerr = system ("/usr/bin/dar_manager -B $mntbkdir/dar-catalog -w $when -e '-N -R / -w' -r @restorelist");
- }
- else
- {
- $restorerr = system ("/usr/bin/dar_manager -B $mntbkdir/dar-catalog -e '-N -R / -w' -r @restorelist");
- }
-
- if ($mounted)
- {
- system("/bin/umount", "$mntdir") == 0
- or die($fm->localise('ERR_WHILE_UNMOUNTING'),"\n");
- }
-
- exit(0);
- }
- return;
-}
-
-sub performReboot ()
-{
- esmith::cgi::genHeaderNonCacheable ($q, undef,
- $fm->localise('SERVER_REBOOT'));
-
- print $q->p (
- $q->b ($fm->localise('SERVER_WILL_REBOOT'))
- );
-
- esmith::cgi::genFooter($fm);
-
- esmith::util::backgroundCommand(
- 5,
- "/sbin/e-smith/signal-event",
- "reboot"
- );
-}
-
-sub CalculateSizes ()
-{
- #------------------------------------------------------------
- # figure out the size of the tar file.
- #------------------------------------------------------------
-
- my $tarsize = 0;
-
- # It takes way too much time to do a du on /home/e-smith. So we'll
- # estimate the current size.
- # We do this by checking the quota used by each user on the system.
-
- use Quota;
- use esmith::AccountsDB;
- my $accounts = esmith::AccountsDB->open;
-
- # Get a $dev value appropriate for use in Quota::query call.
- my $dev = Quota::getqcarg("/home/e-smith/files");
-
- foreach my $user ($accounts->users())
- {
- my $name = $user->key;
- my $uid = getpwnam($name);
- unless ($uid)
- {
- warn ($fm->localise('NO_UID_FOR_NAME').$name."\n");
- # We shouldn't ever get here. If we do, we can't get
- # the quota value for this user, so we just skip to
- # the next one.
- next;
- }
-
- # Get current quota settings.
- my ($blocks) = Quota::query($dev, $uid, 0);
- $tarsize += $blocks;
- }
-
- # We add to this the size of root owned firectories, estimated using du.
- # If this takes too long, then the admin only has his or
- # herself to blame!
-
- # Remove /home/e-smith from backup list, and make paths absolute
- my @list = map { "/$_" } grep { !/home\/e-smith/ } @directories;
- open(DU, "-|")
- or exec '/usr/bin/du', '-s', @list;
-
- while ()
- {
- my ($du) = split(/\s+/);
- $tarsize += $du;
- }
- close DU;
-
- $tarsize = &showSize($tarsize);
-
- #------------------------------------------------------------
- # figure out the size of the dump files
- #------------------------------------------------------------
-
- my $dumpsize = 0;
-
- open(DF, "-|")
- or exec '/bin/df', '-P', '-t', 'ext3';
-
- while ()
- {
- next unless (/^\//);
-
- (undef, undef, my $s, undef) = split(/\s+/, $_);
-
- $dumpsize += $s;
- }
-
- # increase size by 10% to cope with dump overhead.
-
- $dumpsize *= 1.1;
-
- close DF;
-
- $dumpsize = &showSize($dumpsize);
-
- #------------------------------------------------------------
- # how much free space is in /tmp
- #------------------------------------------------------------
-
- my $tmpfree = 0;
- my $halffree = 0;
-
- open(DF, "-|")
- or exec '/bin/df', '-P', '-t', 'ext3', '/tmp';
-
- while ()
- {
- next unless (/^\//);
-
- (undef, undef, undef, my $s) = split(/\s+/, $_);
-
- $tmpfree += $s;
- }
-
- close DF;
-
- $halffree = $tmpfree / 2;
-
- $tmpfree = &showSize($tmpfree);
- $halffree = &showSize($halffree);
-
- return ($tarsize, $dumpsize, $tmpfree, $halffree);
-}
-
-sub showSize
-{
- # convert size to Mb or Gb or Tb :) Remember, df reports in kb.
-
- my $size = shift;
-
- my $Mb = 1024;
- my $Gb = $Mb * $Mb;
- my $Tb = $Mb * $Mb * $Mb;
-
- if ($size >= $Tb)
- {
- $size /= $Tb;
- $size = int($size) . "Tb";
- }
- elsif ($size >= $Gb)
- {
- $size /= $Gb;
- $size = int($size) . "Gb";
- }
- elsif ($size >= $Mb)
- {
- $size /= $Mb;
- $size = int($size) . "Mb";
- }
- else
- {
- $size .= "kb";
- }
-
- return $size;
-}
-
-sub dmount()
-{
- # mount dar unit according to dar-workstation configuration
- # return nothing if mount successfull
-
- my ($host,$share,$mountdir,$login,$password,$VFSType) = @_;
-
- if ($VFSType eq 'cifs')
- {
- return ( qx(/bin/mount -t cifs "$host:$share" $mountdir -o credentials=/etc/dar/CIFScredentials,nounix) );
- }
- elsif ($VFSType eq 'nfs')
- {
- return ( qx(/bin/mount -t nfs -o nolock "$host:/$share" $mountdir 2>&1) );
- }
- elsif ($VFSType eq 'usb')
- {
- $_[2] = "/" . $share;
- my $device = "";
- my $blkdev = "";
- my $vollbl = "";
- foreach my $udi (qx(hal-find-by-property --key volume.fsusage --string filesystem)) {
- $udi =~ m/^(\S+)/;
- my $is_mounted = qx(hal-get-property --udi $1 --key volume.is_mounted);
-
- if ($is_mounted eq "false\n") {
- $blkdev = qx(hal-get-property --udi $1 --key block.device);
- if ($blkdev =~ m/^(\S+)/) {$blkdev = $1;}
- }
- if ($is_mounted eq "false\n") {
- $vollbl = qx(hal-get-property --udi $1 --key volume.label);
- $vollbl =~ m/^(\S+)/;
- if ($vollbl =~ /^\s/) {$vollbl = 'nolabel';}
- }
-
- chomp $vollbl;
- chomp $blkdev;
- $vollbl = lc("media/$vollbl");
- if ($vollbl eq $share) {
- $device = $blkdev;
- }
- }
- return ( qx(/bin/mount $device "/$share" 2>&1) );
- }
- else
- {
- return ("Error while mounting $host/$share : $VFSType not supported.\n");
- }
-}
-
-__DATA__
-