--- rpms/e-smith-backup/sme8/e-smith-backup-2.2.0-nolowercase.patch 2010/02/15 10:18:55 1.1 +++ rpms/e-smith-backup/sme8/e-smith-backup-2.2.0-nolowercase.patch 2011/06/14 18:28:35 1.2 @@ -31,3278 +31,3 @@ diff -urN e-smith-backup-2.2.0/root/etc/ 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 ''; -- 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 $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 $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__ --
--