diff -urN smeserver-manager-0.1.2.old/root/etc/e-smith/templates/usr/share/smanager/themes/default/public/css/styles.css/50body smeserver-manager-0.1.2/root/etc/e-smith/templates/usr/share/smanager/themes/default/public/css/styles.css/50body --- smeserver-manager-0.1.2.old/root/etc/e-smith/templates/usr/share/smanager/themes/default/public/css/styles.css/50body 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/etc/e-smith/templates/usr/share/smanager/themes/default/public/css/styles.css/50body 2021-01-25 14:22:59.445000000 +0400 @@ -86,6 +86,19 @@ margin-bottom:0px; } +.sme-warning { + color: orange; + background-color: #ffffff; + border-width: 1px; + border-style: solid; + border-color: orange ; + padding: 4px; + margin-left: 20px; + margin-right: 20px; + margin-top:2px; + margin-bottom:2px; +} + #footer img { float: right; position: fixed; diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/Controller/Backup.pm smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/Controller/Backup.pm --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/Controller/Backup.pm 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/Controller/Backup.pm 2021-01-27 21:37:34.462000000 +0400 @@ -8,9 +8,16 @@ #---------------------------------------------------------------------- # routes : end +# for information - routes +# $if_admin->get('/backup')->to('backup#main')->name('backup'); +# $if_admin->post('/backup')->to('backup#do_display')->name('backupd'); +# $if_admin->get('/backupd')->to('backup#do_display')->name('backupc'); +# $if_admin->post('/backupd')->to('backup#do_update')->name('backupu'); + use strict; use warnings; use Mojo::Base 'Mojolicious::Controller'; +use utf8; use Locale::gettext; use SrvMngr::I18N; @@ -27,26 +34,16 @@ use esmith::Backup; use esmith::BackupHistoryDB; -use esmith::cgi; use esmith::util; use esmith::lockfile; +use constant DEBUG => $ENV{MOJO_SMANAGER_DEBUG} || 0; + our $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; our $rdb = esmith::ConfigDB->open('/etc/e-smith/restore') || die "Couldn't open restore db"; - -#$File::Find::dont_use_nlink = 1; # fix for Windows shares - -# 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 $es_backup = new esmith::Backup or die "Couldn't create Backup object\n"; my @directories = $es_backup->restore_list; @@ -91,12 +88,12 @@ $bac_datas{'module'} = $module; if ($tarsize =~ /Tb/ or $tarsize =~ /(\d+)Gb/ and $1 >= 2) { - $notif = $c->l("bac_BACKUP_DESKTOP_TOO_BIG"); + $notif = $c->l("bac_BACKUP_DESKTOP_TOO_BIG").' : '.$tarsize; } my $rec = $cdb->get('backup'); my ($backup_status, $backupwk_status) = 'disabled'; - + if ($rec) { $backup_status = $rec->prop('status') || 'disabled'; } @@ -113,13 +110,13 @@ if ($backupwk_status eq "enabled") { $bac_datas{'backupwkTime'} = $rec->prop('BackupTime'); - } $bac_datas{'backupStatus'} = $backup_status; $bac_datas{'backupwkStatus'} = $backupwk_status; - $c->stash( title => $title, notif => $notif, bac_datas => \%bac_datas ); + $c->stash( warning => $notif ) if ( $notif ); + $c->stash( title => $title, bac_datas => \%bac_datas ); $c->render(template => 'backup'); }; @@ -144,23 +141,24 @@ $function = undef; } + DEBUG && warn("do_display $function"); + my %bac_datas = (); $bac_datas{'function'} = $function; my $title = $c->l('bac_BACKUP_TITLE'); - my ($notif, $dest) = ''; + my $dest = ''; + if ( $function eq 'desktop_backup' ) { - my $res = desktopBackup(); - $result .= $res unless $res eq 'OK'; - if ( ! $result ) { - $result = $c->l('bac_SUCCESS'); - $c->app->log->info('desktop backup LAUNCHED'); - $c->flash(success => $result); - } else { - $c->stash(error => $result); - } - $c->redirect_to("backup"); + + my $CompressionLevel = $cdb->get_prop("backupconsole", "CompressionLevel") || "-6"; + my @exclude = map (" --exclude=$_",@backup_excludes); + + $c->stash( compressionlevel => $CompressionLevel, exclude => \@exclude, directories => \@directories ); + + # streaming download in template + return $c->render("/backdown"); } @@ -207,13 +205,102 @@ my $rec = $cdb->get('backupwk'); $bac_datas{vfstype} = $rec->prop('VFSType') || 'cifs'; $bac_datas{status} = $rec->prop('status'); + } + + + if ( $function eq 'workstn_configure1' ) { + + $bac_datas{vfstype} = $c->param('VFSType'); + $bac_datas{'status'} = ''; + $bac_datas{ampm} = 'AM'; + $bac_datas{min} = ''; + $bac_datas{hour} = ''; + $bac_datas{login} = 'backup'; + $bac_datas{password} = 'backup'; + $bac_datas{station} = 'host'; + $bac_datas{folder} = 'share'; + $bac_datas{mount} = ''; + $bac_datas{setsNumber} = ''; + $bac_datas{filesinset} = ''; + $bac_datas{timeout} = ''; + $bac_datas{incOnlyTimeout} = ''; + $bac_datas{compression} = ''; + $bac_datas{dof} = ''; + + # Obtain backup informations from configuration + my $rec = $cdb->get('backupwk'); + my $Time = '2:00'; + if ($rec) { + $Time = $rec->prop('BackupTime') || '2:00'; + $bac_datas{login} = $rec->prop('Login') || 'backup'; + $bac_datas{password} = $rec->prop('Password') || 'backup'; + $bac_datas{station} = $rec->prop('SmbHost') || 'host'; + $bac_datas{folder} = $rec->prop('SmbShare') || 'share'; + $bac_datas{mount} = $rec->prop('Mount') || ''; + $bac_datas{setsNumber} = $rec->prop('SetsMax') || '1'; + $bac_datas{filesinset} = $rec->prop('DaysInSet') || '1'; + $bac_datas{timeout} = $rec->prop('Timeout') || '12'; + $bac_datas{incOnlyTimeout} = $rec->prop('IncOnlyTimeout') || 'yes'; + $bac_datas{compression} = $rec->prop('Compression') || '0'; + $bac_datas{dof} = (defined $rec->prop('FullDay')) ? $rec->prop('FullDay') : '7'; + } + + ($bac_datas{hour}, $bac_datas{min}) = split (':', $Time, -1); + if ( $bac_datas{hour} > 12 ) { + $bac_datas{hour} -= 12; + $bac_datas{ampm} = 'PM'; + } + my $backupwk_status; + if ($rec) { + $backupwk_status = $rec->prop('status'); + } + + if (defined $backupwk_status && $backupwk_status eq 'enabled') { + $bac_datas{status} = 'checked'; + } + + if (defined $bac_datas{incOnlyTimeout} && $bac_datas{incOnlyTimeout} eq 'yes') { + $bac_datas{incOnlyTimeout} = 'checked'; + } } - + + + if ( $function eq 'workstn_verify' ) { + + my $rec = $cdb->get('backupwk'); + if ( $rec) { + $bac_datas{status} = $rec->prop('status') || 'disabled'; + } + } + + + if ( $function eq 'workstn_verify1' ) { + + $res = ''; + if ( ! $result ) { + $res = $c->workstnVerify(); # list returned + $bac_datas{function} = $function; + $bac_datas{files_list} = $res; + } + + } + + + if ( $function eq 'workstn_restore' ) { + + my $rec = $cdb->get('backupwk'); + if ( $rec) { + $bac_datas{status} = $rec->prop('status') || 'disabled'; + } + } + $dest = "back_$function"; - $c->stash( title => $title, notif => $result, bac_datas => \%bac_datas ); + $c->stash( error => $result ); + + $c->stash( title => $title, bac_datas => \%bac_datas ); return $c->render( template => $dest ); }; @@ -227,23 +314,18 @@ my $rt = $c->current_route; my $function = $c->param('Function'); + DEBUG && warn("do_update $function"); + my %bac_datas = (); + $bac_datas{function} = $function; my $title = $c->l('bac_BACKUP_TITLE'); my ($dest, $res, $result) = ''; if ( $function eq 'desktop_backup' ) { - # should not happen !! no desktop_backup template !! - - $res = desktopBackup(); - $result .= $res unless $res eq 'OK'; - if ( ! $result ) { - $result = $c->l('bac_SUCCESS'); - $c->stash( notif => $result ); - $c->redirect_to("/backup"); - } + $result .= ' ** Function error for desktop backup ** !'; } @@ -257,8 +339,6 @@ my $reminderMin = $c->param('ReminderMin'); my $rampm = $c->param('ReminderAMPM'); - ## $c->l('bac_UPDATING_TAPE_CONF') - if (defined $status && $status eq "on") { if ($backupHour =~ /^(.*)$/) { @@ -300,9 +380,7 @@ $result .= $c->l('bac_ERR_INVALID_REMINDER_MINUTE').$reminderMin. ' '.$c->l('bac_BETWEEN_0_AND_59').' '; } - } - else - { + } else { # service disabled no controls } @@ -310,7 +388,7 @@ $res = ''; if ( ! $result ) { - $res = $c->updateTapeBackupConfig($status, $backupHour, + $res = $c->tapeBackupConfig($status, $backupHour, $backupMin, $bampm, $reminderHour, $reminderMin, $rampm); $result .= $res unless $res eq 'OK'; @@ -322,6 +400,7 @@ } else { $result .= $c->l('bac_SUCCESSFULLY_DISABLED'); } + $cdb->reload; } } } @@ -334,38 +413,39 @@ unless ($file_handle) { $result .= $c->l('bac_UNABLE_TO_RESTORE_CONF').' '. - $c->l('ANOTHER_RESTORE_IN_PROGRESS'); + $c->l('bac_ANOTHER_RESTORE_IN_PROGRESS'); } - $result .= ' ** Blocked for testing ** ! (HARD TO TEST!)'; + ##$result .= ' ** Blocked for testing ** !'; $res = ''; if ( ! $result ) { $res = $c->tapeRestore( $lock_file, $file_handle ); $result .= $res unless $res eq 'OK'; - if ( ! $result ) { - $result = $c->l('bac_SUCCESS'); - } + #if ( ! $result ) { + #$result = $c->l('bac_SUCCESS'); + #} } } if ( $function eq 'workstn_configure' ) { -# $bac_datas{xxx} = $c->param('XXX'); + # should not happen !! + $result .= ' ** Function error for workstation configure *** !'; + } + - # controls -# $res = $c->zzzz( $c->param('ZZZZ') ); -# $result .= $res . ' DMS ' unless $res eq 'OK'; + if ( $function eq 'workstn_configure1' ) { - $result .= ' ** Blocked for testing ** !'; + #$result .= ' ** Blocked for testing ** !'; $res = ''; if ( ! $result ) { - $res = $c->workstnConfigure(); - $result .= $res unless $res eq 'OK'; - if ( ! $result ) { - $result = $c->l('bac_SUCCESS'); + $res = $c->updateWorkstnBackupConfig(); + if ( ($result = $res) =~ s|^#OK#|| ) { + $res = 'OK'; + $cdb->reload; } } } @@ -373,181 +453,154 @@ if ( $function eq 'workstn_verify' ) { -# $bac_datas{xxx} = $c->param('XXX'); + # should not happen !! + $result .= ' ** Function error for workstation verify *** !'; + } + - # controls -# $res = $c->zzzz( $c->param('ZZZZ') ); -# $result .= $res . ' DMS ' unless $res eq 'OK'; + if ( $function eq 'workstn_verify1' ) { - $result .= ' ** Blocked for testing ** !'; + ##$result .= ' ** Blocked for testing ** !'; - $res = ''; - if ( ! $result ) { - $res = $c->workstnVerify(); - $result .= $res unless $res eq 'OK'; - if ( ! $result ) { - $result = $c->l('bac_SUCCESS'); - } - } + $res = 'OK'; + $result = ''; } if ( $function eq 'workstn_restore' ) { -# $bac_datas{xxx} = $c->param('XXX'); - - # controls -# $res = $c->zzzz( $c->param('ZZZZ') ); -# $result .= $res . ' DMS ' unless $res eq 'OK'; - - $result .= ' ** Blocked for testing ** !'; + ##$result .= ' ** Blocked for testing ** !'; + $res = 'NOK'; if ( ! $result ) { $res = $c->workstnRestore(); - $result .= $res unless $res eq 'OK'; - if ( ! $result ) { - $result = $c->l('bac_SUCCESS'); + if ( ($result = $res) =~ s|^#OK#|| ) { + $bac_datas{restore_log} = $result; + $res = 'OK'; + } else { + $c->stash( error => $result ); } + $bac_datas{function} = 'workstn_restore1'; + $res = 'NEXT'; } } - if ( $function eq 'workstn_sel_restore' ) { - -# $bac_datas{xxx} = $c->param('XXX'); + if ( $function eq 'workstn_restore1' ) { - # controls -# $res = $c->zzzz( $c->param('ZZZZ') ); -# $result .= $res . ' DMS ' unless $res eq 'OK'; + my $state = 'unknown'; + my $rec = $rdb->get('restore'); + if ($rec) { + $state = $rec->prop('state') || 'unknown'; + } - $result .= ' ** Blocked for testing ** !'; + $result .= "Restore state unexpected: $state" if ($state ne 'complete'); - $res = ''; + $res = 'NOK'; if ( ! $result ) { - $res = $c->workstnSelRestore(); - $result .= $res unless $res eq 'OK'; - if ( ! $result ) { - $result = $c->l('bac_SUCCESS'); + $res = $c->performReboot(); + if ( ($result = $res) =~ s|^#OK#|| ) { + $res = 'OK'; + } else { + $c->stash( error => $result ); } } } - # common part for all functions - if ($res ne 'OK') { - $c->stash( error => $result ); - $c->stash( title => $title, bac_datas => \%bac_datas ); - my $dest = "back_$function"; - return $c->render($dest); - } + if ( $function eq 'workstn_sel_restore' ) { - my $message = "'Backup' $function updates DONE"; - $c->app->log->info($message); - $c->flash(success => $result); - - $c->redirect_to('backup'); + my $backupset = $c->param('Backupset'); + my $filterexp = $c->param('Filterexp'); + if ($filterexp =~ /^(.*)$/) { + $filterexp = $1; + } else { + $filterexp = ''; + } -}; + #$result .= ' ** Blocked for testing 1 ** !'; + $res = ''; + if ( ! $result ) { + $bac_datas{function} = 'workstn_sel_restore1'; + $bac_datas{backupset} = $backupset; + $bac_datas{filterexp} = $filterexp; + $res = 'NEXT'; + } + } -sub get_function_options { - my $c = shift; + if ( $function eq 'workstn_sel_restore1' ) { - return [[ $c->l('bac_DESKTOP_BACKUP') => 'desktop_backup' ], - [ $c->l('bac_TAPE_CONFIGURE') => 'tape_configure' ], - [ $c->l('bac_TAPE_RESTORE') => 'tape_restore' ], - [ $c->l('bac_WORKSTN_CONFIGURE') => 'workstn_configure' ], - [ $c->l('bac_WORKSTN_VERIFY') => 'workstn_verify' ], - [ $c->l('bac_WORKSTN_RESTORE') => 'workstn_restore' ], - [ $c->l('bac_WORKSTN_SEL_RESTORE') => 'workstn_sel_restore']]; + $bac_datas{backupset} = $c->param('Backupset'); + $bac_datas{filterexp} = $c->param('Filterexp'); -} + my @restorefiles = @{$c->every_param('Restorefiles')}; + my $seldatebefore = $c->param('Seldatebefore'); + if ($seldatebefore =~ /^(.*)$/) { + $seldatebefore = $1; + } else { + $result .= 'Unsecure data : ' . $seldatebefore; + } -sub desktopBackup { + 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])?/; - my $c = shift; + $result .= " $seldatebefore : " . $c->l('bac_ERR_INVALID_SELDATE') + unless (($seldatebefore =~ m/^$tymd$thms$/) || ($seldatebefore eq "")); - # Generate a header that will trigger a download and send data as - # an octet stream. + ##$result .= ' ** Blocked for testing 2 ** !'; - my $backups = esmith::BackupHistoryDB->open; - my $now = time(); - my $backup_rec = $backups->new_record($now, { - type => 'backup_record', - BackupType => 'desktop', - StartEpochTime => $now, - }); - my $CompressionLevel = $cdb->get_prop("backupconsole", "CompressionLevel") || "-6"; - my @exclude = map (" --exclude=$_",@backup_excludes); - - # 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. + $res = ''; + if ( ! $result ) { + $res = $c->performWorkstnSelRestore( $seldatebefore, \@restorefiles ); # restore log returned + if ( ($result = $res) =~ s|^#OK#|| ) { + $bac_datas{restore_log} = $result; + $res = 'OK'; + } else { + $c->stash( error => $result ); + } + $bac_datas{function} = 'workstn_sel_restore2'; + $res = 'NEXT'; + } + } - my $status = system("/sbin/e-smith/signal-event", "pre-backup", "desktop"); - if ($status) - { - desktopBackupRecordStatus($backup_rec, 'pre-backup', $status); - return ($c->l('bac_OPERATION_STATUS_REPORT'). - $c->l('bac_ERR_PRE_BACKUP')); - } - - 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=-" - . "@exclude | /usr/bin/gzip $CompressionLevel |" - ); - while () - { - print; - } + if ( $function eq 'workstn_sel_restore2' ) { - close RD; + ##$result .= ' ** Blocked for testing 3 ** !'; - # Remove the dumped tables. + $res = 'OK'; + $result = ''; + } - $status = system("/sbin/e-smith/signal-event", "post-backup", "desktop"); - if ($status) - { - desktopBackupRecordStatus($backup_rec, 'post-backup', $status); - die ($c->l('bac_ERR_POST_BACKUP'),"\n"); + + # common part for all functions + if ($res ne 'OK') { + if ($res eq 'NEXT') { + $dest = 'back_' . $bac_datas{"function"}; + } else { + $c->stash( error => $result ); + $dest = "back_$function"; + } + $c->stash( title => $title, bac_datas => \%bac_datas ); + return $c->render($dest); } - $now = time(); - $backup_rec->set_prop('EndEpochTime', "$now"); - $backup_rec->set_prop('Result', "0"); -} -sub desktopBackupRecordStatus { + my $message = "'Backup' $function updates DONE"; + $c->app->log->info($message); + $c->flash(success => $result); - my ($backup, $phase, $status) = @_; - my $now = time(); + $c->redirect_to('backup'); - warn("Backup terminated: $phase failed - status: $status\n"); - $backup->set_prop('EndEpochTime', "$now"); - $backup->set_prop('Result', "$phase:$status"); -} +}; -sub updateTapeBackupConfig { +sub tapeBackupConfig { my ($c, $status, $backupHour, $backupMin, $bampm, $reminderHour, $reminderMin, $rampm) = @_; @@ -584,8 +637,7 @@ my $oldUnsav = $cdb->get('UnsavedChanges')->value; my $rec = $cdb->get('backup'); - unless (defined $rec) - { + unless (defined $rec) { $rec = $cdb->new_record('backup', {type=>'service'}); } @@ -611,15 +663,12 @@ or return ($c->l('bac_ERR_CONF_BACKUP'),"\n"); return 'OK'; - } - else - { + } else { # set service to disabled my $oldUnsav = $cdb->get('UnsavedChanges')->value; my $rec = $cdb->get('backup'); - unless ($rec) - { + unless ($rec) { $rec = $cdb->new_record('backup', {type=>'service'}); } @@ -631,11 +680,1161 @@ return 'OK'; } - return undef; } +sub tapeRestore { + + my ($c, $lock_file, $file_handle) = @_; + + my $rec = $rdb->get('restore'); + $rec->set_prop('state', 'running'); + $rec->set_prop('start', time); + + my $child; + + if ($child = fork) { + # Parent + $SIG{'CHLD'} = 'IGNORE'; + &esmith::lockfile::UnlockFile($file_handle); + return 'OK'; + } 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', $c->l('bac_ERR_PRE_RESTORE')); + $rec->delete_prop('state'); + die ($c->l('bac_ERR_PRE_RESTORE'),"\n"); + } + + unless(system("/sbin/e-smith/signal-event", "restore-tape") == 0) { + $rec->set_prop('errmsg', $c->l('bac_ERR_RESTORING_FROM_TAPE')); + $rec->delete_prop('state'); + die ($c->l('bac_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').', '. + $c->l('bac_ERR_RESTORING_GID')); + warn ($c->l('bac_ERR_RESTORING_GID')."\n"); + } + unless(system("/usr/sbin/usermod", "-g", "$www_gid", "www") == 0) { + $rec->set_prop('errmsg', $rec->prop('errmsg').', '. + $c->l('bac_ERR_RESTORING_INITIAL_GRP')); + warn ($c->l('bac_ERR_RESTORING_INITIAL_GRP')."\n"); + } + esmith::util::backgroundCommand(0, + "/sbin/e-smith/signal-event", "post-upgrade"); + #unless(system("/sbin/e-smith/signal-event", "post-upgrade") == 0) { + # $rec->set_prop('errmsg', $rec->prop('errmsg').', '. + # $c->l('bac_ERR_UPDATING_CONF_AFTER_TAPE_RESTORE')); + # $rec->delete_prop('state'); + # die ($c->l('bac_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', $c->l('bac_COULD_NOT_FORK')); + die ($c->l("bac_COULD_NOT_FORK")." $!\n"); + } +} + + +sub workstnBackupConfig { + + # called by template + my ($c) = @_; + my $out; + + my $backupwk_status; + my $enabledIncOnlyTimeout = ""; + my $backupwkLogin = 'backup'; + my $backupwkPassword = 'backup'; + my $backupwkStation = 'host'; + my $backupwkFolder = 'share'; + my $backupwkMount = '/mnt/smb'; + my $setsNumber; + my $filesinset; + my $backupwkTime; + my $backupwkTimeout; + my $backupwkIncOnlyTimeout; + my $VFSType; + my $compression; + my $dof; + my @dlabels = split(' ', $c->l('bac_DOW')); + + # Obtain backup informations from configuration + my $rec = $cdb->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'; + $backupwkMount = $rec->prop('Mount') || '/mnt/smb'; + $VFSType = $rec->prop('VFSType') || 'cifs'; + $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'; + $backupwk_status = $rec->prop('status'); + } + + if ($rec) { + if ($VFSType eq 'usb') { + $out .= $c->l('bac_WORKSTN_BACKUP_USB').' '.$backupwkFolder.'
'; + } elsif ($VFSType eq 'mnt') { + $out .= $c->l('bac_WORKSTN_BACKUP_MNT').' '.$backupwkMount.'
'; + } else { + $out .= $c->l('bac_WORKSTN_BACKUP_HOST').' '.$backupwkStation.' '; + $out .= $c->l('bac_WORKSTN_BACKUP_VFSTYPE').' '.$VFSType.'
'; + $out .= $c->l('bac_WORKSTN_BACKUP_SHARE').' '.$backupwkFolder.'
'; + } + if ($VFSType eq 'cifs') { + $out .= $c->l('bac_LOGIN').' '.$backupwkLogin.'
'; + $out .= $c->l('PASSWORD').' ********
'; + } + $out .= $c->l('bac_WORKSTN_BACKUP_SETSNUM').' '.$setsNumber.'
'; + $out .= $c->l('bac_WORKSTN_BACKUP_DAYSINSET').' '.$filesinset.'
'; + $out .= $c->l('bac_WORKSTN_BACKUP_COMPRESSION').' '.$compression.'
'; + $out .= $c->l('bac_WORKSTN_BACKUP_TOD').' '.$backupwkTime.'
'; + $out .= $c->l('bac_WORKSTN_BACKUP_TIMEOUT').' '.$backupwkTimeout.' '.$c->l('bac_HOURS'); + + if ( $backupwkIncOnlyTimeout eq 'yes' ) { + $out .= $c->l('bac_WORKSTN_BACKUP_INCONLY_TIMEOUT') + } + $out .= '
'; + + if ( $dof eq '7' ) { + $out .= $c->l('bac_WORKSTN_FULL_BACKUP_EVERYDAY').'
'; + } else { + $out .= $c->l('bac_WORKSTN_FULL_BACKUP_DAY').' '.$dlabels[$dof].'
'; + } + } else { + $out = $c->l('bac_WORKSTN_BACKUP_NOT_CONFIGURED'); + } + return $out; +} + + +sub workstnVerify { + + my ($c) = @_; + my $out; + + my $backupwkrec = $cdb->get('backupwk'); + my $smbhost = $backupwkrec->prop('SmbHost'); + my $smbshare = $backupwkrec->prop('SmbShare'); + my $mntdir = $backupwkrec->prop('Mount') || '/mnt/smb'; + my $key; + my $error_message; + my $id = $backupwkrec->prop('Id') || + $cdb->get('SystemName')->value .'.'. $cdb->get('DomainName')->value; + my $err; + my $VFSType = $backupwkrec->prop('VFSType') || 'cifs'; + my $verifyref = $c->param ('Backupset'); + $mntdir = "/$smbshare" if ( $VFSType eq 'usb' ); + + # Mounting backup shared folder + $error_message = $c->bmount($mntdir,$smbhost,$smbshare,$VFSType); + if ($error_message) { + return $error_message .' '. $id; + } + + # Test if backup subdirectory for our server + my $mntbkdir = $mntdir . "/$id"; + unless (-d $mntbkdir) { + $error_message = $c->l('bac_ERR_NO_HOST_DIR')."\n"; + $error_message .= $c->bunmount($mntdir,$VFSType); + return $error_message .' '. $id; + } + + my $fullverify = $c->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, untaint_pattern => qr|^([-+@\w\s./]+)$| }, $set ; + + my $key; + my $num = 0; + foreach $key (sort keys %backupsetfiles) + { + push @restorefiles, $backupsetfiles{$key}; + if ( $num == 0 ) { + unless ( $backupsetfiles{$key} =~ /\/full-/ ) { + $out .= $c->l('bac_ERR_NO_FULL_BACKUP'); + return $out; + } + } else { + my $numf = sprintf("%03d", $num); + unless ( $backupsetfiles{$key} =~ /\/inc-$numf-/ ) { + $out .= $c->l('bac_ERR_NO_INC_BACKUP') . " " . $numf; + return $out; + } + } + $num++; + last if ( $backupsetfiles{$key} eq $verifyref ); + } + + if (open(RD, "-|")) { + + $out .= ''.$c->l('bac_TESTING_NEEDED_BACKUPS_FOR_RESTORE').''; + + my $message; + $out .= ''; + if (!close RD) { + $out .= $c->l('bac_RESTORE_VERIFY_FAILED'); + } else { + $out .= $c->l('bac_VERIFY_COMPLETE'); + } + $out .= ''; + } else { + select(STDOUT); + $| = 1; + + my $file; + foreach $file (@restorefiles) { + if ($file =~ /^(.*)$/) { + $file = $1; + } else { + $error_message = "Unsecure data : $file\n"; + $error_message .= $c->bunmount($mntdir,$VFSType); + die ($error_message); + } + print $c->l('bac_TESTED_BACKUP') .' '. $file; + system ("/usr/bin/dar", "-Q", "--test", "$file", "--noconf"); + } + + $error_message = $c->bunmount($mntdir,$VFSType); + die($error_message) if $error_message; + + exit(0); + } + #return; + + } else { + + # verify selected backup only + # and display files saved in the backup + + my $backupkey = $verifyref; + if ($backupkey =~ /^(.*)$/) { + $backupkey = $1; + } else { + $error_message = "Unsecure data : $backupkey\n"; + $error_message .= $c->bunmount($mntdir,$VFSType); + die ($error_message); + } + + if (open(RD, "-|")) { + $out .= ''.$c->l('bac_FILES_IN_BACKUP').''; + + my $status = close RD ? + ($complete ? + $c->l('bac_VERIFY_COMPLETE') : + $c->l('bac_BACKUP_FILE_INCOMPLETE')) + : ($c->l('bac_ERROR_READING_FILE').' : '.$backupkey); + $out .= " $status "; + } else { + select(STDOUT); + $| = 1; + + system ("/usr/bin/dar", "-Q", "--list", "$backupkey", "--noconf") == 0 + or die ($c->l('bac_ERR_EXTRACT')." : ".$!); + + $error_message = $c->bunmount($mntdir,$VFSType); + die($error_message) if $error_message; + exit(0); + } + } + return $out; +} + + +sub workstnRestore { + + my ($c) = @_; + + my $out; + my $restoreref = $c->param('Backupset'); + 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) { + return "$c->l('bac_RESTORE_CANNOT_PROCEED')
($c->l('bac_ANOTHER_RESTORE_IN_PROGRESS')"; + } + + my $backupwkrec = $cdb->get('backupwk'); + my $id = $backupwkrec->prop('Id') + || $cdb->get('SystemName')->value . "." . $cdb->get('DomainName')->value; + my $mntdir = $backupwkrec->prop('Mount') || '/mnt/smb'; + my $VFSType = $backupwkrec->prop('VFSType') || 'cifs'; + my $smbhost = $backupwkrec->prop('SmbHost'); + my $smbshare = $backupwkrec->prop('SmbShare'); + $mntdir = "/$smbshare" if ( $VFSType eq 'usb' ); + my $err; + my $error_message; + + # Mounting backup shared folder + $error_message = $c->bmount($mntdir,$smbhost,$smbshare,$VFSType); + if ($error_message) { + return "$c->l('bac_RESTORE_CANNOT_PROCEED') $error_message : $id"; + } + # Test if backup subdirectory for our server + my $mntbkdir = $mntdir . "/$id"; + unless (-d $mntbkdir) { + $error_message = $c->l('bac_ERR_NO_HOST_DIR')."\n"; + $error_message .= $c->bunmount($mntdir,$VFSType); + return "$c->l('bac_RESTORE_CANNOT_PROCEED') $error_message : $id"; + } + # finding list of available backups + # and verifying all needed backup files are available + + find { wanted => \&$backupsetlist, untaint => 1, untaint_pattern => qr|^([-+@\w\s./]+)$| }, $set ; + + my $key; + my $num = 0; + foreach $key (sort keys %backupsetfiles) { + push @restorefiles, $backupsetfiles{$key}; + if ( $num == 0 ) { + unless ( $backupsetfiles{$key} =~ /\/full-/ ) { + return "$c->l('bac_RESTORE_CANNOT_PROCEED') $c->l('bac_ERR_NO_FULL_BACKUP')"; + } + } else { + my $numf = sprintf("%03d", $num); + unless ( $backupsetfiles{$key} =~ /\/inc-$numf-/ ) { + return "$c->l('bac_RESTORE_CANNOT_PROCEED') $c->l('bac_ERR_NO_INC_BACKUP') . $numf"; + } + } + $num++; + last if ( $backupsetfiles{$key} eq $restoreref ); + } + # backup is online, restoring now + + my $rec = $rdb->get('restore'); + $rec->set_prop('state','running'); + $rec->set_prop('start', time); + $cdb->get('bootstrap-console')->set_prop('Run', 'yes'); + + unless (system("/sbin/e-smith/signal-event", "pre-restore") == 0) { + return "$c->l('bac_OPERATION_STATUS_REPORT') $c->l('bac_ERR_PRE_RESTORE')"; + } + + $| = 1; + if (open(RD, "-|")) { + + #----------------------------------------------------- + # restore system from uploaded workstation backup file + #----------------------------------------------------- + $out .= $c->l('bac_FILES_HAVE_BEEN_RESTORED')."\n"; + $out .= ''; + my $message; + + if (!close RD) { + $message = $c->l('bac_RESTORE_FAILED_MSG'); + } else { + #----------------------------------------------------- + # if restore completed, regenerate configuration files + #----------------------------------------------------- + + if ($complete) { + $out .= $c->l('bac_RESTORE_COMPLETE'); + system("/usr/sbin/groupmod", "-g", "$www_gid", "www") == 0 + or warn ($c->l('bac_ERR_RESTORING_GID')."\n"); + system("/usr/sbin/usermod", "-g", "$www_gid", "www") == 0 + or warn ($c->l('bac_ERR_RESTORING_INITIAL_GRP')."\n"); + esmith::util::backgroundCommand(0, + "/sbin/e-smith/signal-event", "post-upgrade"); + # system("/sbin/e-smith/signal-event", "post-upgrade") == 0 + # or die ($c->l('bac_ERROR_UPDATING_CONFIGURATION')."\n"); + } else { + $message = $c->l('bac_RESTORE_FAILED'); + } + } + return $message if $message; + + $rec->set_prop('state', 'complete'); + $rec->set_prop('finish', time); + + &esmith::lockfile::UnlockFile($file_handle); + + } else { + + select(STDOUT); + $| = 1; + + my $file; + foreach $file (@restorefiles) { + if ($file =~ /^(.*)$/) { + $file = $1; + } else { + $error_message = "Unsecure data : $file\n"; + $error_message .= $c->bunmount($mntdir,$VFSType); + die ($error_message); + } + system ("/usr/bin/dar", "-Q", "-x", "$file", "-v", "-N", "-R", "/", "-wa"); + } + $error_message = $c->bunmount($mntdir,$VFSType); + die($error_message) if $error_message; + exit(0); + } + + $rdb->reload; + + return '#OK#' . $out; +} + + +sub workstnSelRestore() { + + my $c = shift; + + my $rec = $cdb->get('backupwk'); + + my %backupfiles = (); + my $mntdir = $rec->prop('Mount') || '/mnt/smb'; + my $mntbkdir; + my $key; + my $id = $rec->prop('Id') || + $cdb->get('SystemName')->value . '.' . $cdb->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'); + $mntdir = "/$smbshare" if ( $VFSType eq 'usb' ); + my $err; + my $error_message; + + 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 + $error_message = $c->bmount($mntdir,$smbhost,$smbshare,$VFSType); + if ($error_message) { + return ($error_message, $id); + } + + # Test if backup subdirectory for our server + $mntbkdir = $mntdir . "/$id"; + unless (-d $mntbkdir) { + $error_message = $c->l('bac_ERR_NO_HOST_DIR')."\n"; + $error_message .= $c->bunmount($mntdir,$VFSType); + return ($error_message, $id); + } + + my $catalog = "$mntbkdir/dar-catalog"; + my $i = 0; + my $j = 0; + my @bknum; + my @setd; + my @bkname; + + + # 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"} = $c->l('ALL_BACKUPS'); + $j = 0; + while ($j < $i) + { + push @blabels, $bknum[$j]; + $blabels{$bknum[$j]} = $bkname[$j]; + $j++ + } + +} + + +sub updateWorkstnBackupConfig { + + my ($c) = @_; + + my $status = $c->param('Workstnbackup') || ""; + my $inconly = $c->param('IncOnlyTimeout'); + my $dof = $c->param('Dof'); + my $ampm; + my $incOnlyTimeout; + + my $rec = $cdb->get('backupwk'); + unless (defined $rec) { + $rec = $cdb->new_record('backupwk', {type=>'service'}); + } + my $backupwkMount = $rec->prop('Mount') || '/mnt/smb'; + + unless ( $status eq 'on') { + # set service to disabled + my $old = $cdb->get('UnsavedChanges')->value; + + $rec->set_prop('status', 'disabled'); + $cdb->get('UnsavedChanges')->set_value($old); + + system("/sbin/e-smith/signal-event", "conf-backup") == 0 + or die($c->l('bac_ERR_CONF_BACKUP')."\n"); + + return '#OK#'.$c->l('bac_SUCCESSFULLY_DISABLED_WORKSTN'); + } + + #-------------------------------------------------- + # Untaint parameters and check for validity + #-------------------------------------------------- + + my $VFSType = $c->param('VFSType'); + if ( $VFSType eq 'nousb') { + return $c->l('bac_ERR_NO_USB_DISK') + } + if ( $VFSType eq 'nomnt') { + return $c->l('bac_ERR_NO_MOUNTED_DISK') + } + + my $backupwkStation = $c->param('BackupwkStation'); + if ( $VFSType =~ m/usb|mnt/s) { $backupwkStation = 'localhost' } + if ($backupwkStation =~ /^\s*(\S+)\s*$/) { + $backupwkStation = $1; + } else { + $backupwkStation = ""; + } + if ( $backupwkStation eq "" ) { + return $c->l('bac_ERR_INVALID_WORKSTN') + } + + my $backupwkFolder = $c->param('BackupwkFolder'); + if ($backupwkFolder =~ /^(.*)$/) { + $backupwkFolder = $1; + } else { + $backupwkFolder = ''; + } + if ( $VFSType eq 'usb' ) { + $backupwkFolder = 'media/' . $backupwkFolder; + } + if ( $VFSType eq 'mnt' ) { + $backupwkMount = $backupwkFolder; + if (checkMount ($backupwkMount)){$backupwkFolder = '';} + } else { + $backupwkFolder =~ s/^\///; # remove leading / + } + if ( $backupwkFolder eq '') { + return $c->l('bac_ERR_INVALID_FOLDER') + } + + my $backupwkLogin = $c->param('BackupwkLogin') || ''; + if ($backupwkLogin =~ /^(.*)$/) { + $backupwkLogin = $1; + } else { + $backupwkLogin = ""; + } + if ( ( $backupwkLogin eq "" ) && ( $VFSType eq 'cifs' ) ) { + return $c->l('bac_ERR_INVALID_LOGIN') + } + + my $backupwkPassword = $c->param('BackupwkPassword') || ''; + if ($backupwkPassword =~ /^(.*)$/) { + $backupwkPassword = $1; + } else { + $backupwkPassword = ""; + } + if ( ( $backupwkPassword eq "" ) && ( $VFSType eq 'cifs' ) ) { + return $c->l('bac_ERR_INVALID_PASSWORD') + } + + my $setsNumber = $c->param('SetsNumber'); + unless ( $setsNumber > 0 ) { + return $c->l('bac_ERR_INVALID_SETS_NUMBERFOLDER') + } + + my $filesinset = $c->param('Filesinset'); + unless ( $filesinset > 0 ) { + return $c->l('bac_ERR_INVALID_FILES_IN_SET_NUMBER') + } + + my $timeout = $c->param('BackupwkTimeout'); + if (( $timeout eq '') || ( $timeout == 0 )) {$timeout = 24 } + if (( $timeout < 1 ) || ( $timeout > 24 )) { + return $c->l('bac_ERR_INVALID_TIMEOUT') + } + + if (defined $inconly && $inconly eq 'on') { + $incOnlyTimeout = 'yes'; + } else { + $incOnlyTimeout = 'no'; + } + + my $compression = $c->param('Compression'); + if (( $compression < 0 ) || ( $compression > 9 )) { + return $c->l('bac_ERR_INVALID_COMPRESSION') + } + + $rec->set_prop('SmbHost', $backupwkStation); + $rec->set_prop('SmbShare', $backupwkFolder); + $rec->set_prop('Mount', $backupwkMount); + $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); + + my $backupwkHour = $c->param('BackupwkHour'); + if ($backupwkHour =~ /^(.*)$/) { + $backupwkHour = $1; + } else { + $backupwkHour = '12'; + } + if (($backupwkHour < 0) || ($backupwkHour > 12)) { + return $c->l('bac_ERR_INVALID_HOUR').$backupwkHour. + $c->l('bac_BETWEEN_0_AND_12') + } + + my $backupwkMin = $c->param('BackupwkMin'); + if ($backupwkMin =~ /^(.*)$/) { + $backupwkMin = $1; + } else { + $backupwkMin = '0'; + } + if (($backupwkMin < 0) || ($backupwkMin > 59)) { + return $c->l('bac_ERR_INVALID_MINUTE').$backupwkMin. + $c->l('bac_BETWEEN_0_AND_59'); + } + + $backupwkMin = sprintf("%02d", $backupwkMin); + + $ampm = $c->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 = $cdb->get('UnsavedChanges')->value; + $rec->set_prop('status', 'enabled'); + $rec->set_prop('BackupTime', "$backupwkHour:$backupwkMin"); + $cdb->get('UnsavedChanges')->set_value($old); + + system("/sbin/e-smith/signal-event", "conf-backup") == 0 + or die($c->l('bac_ERR_CONF_BACKUP'),"\n"); + + # we test if the remote host is reachable, else we simply display a warning + if ( $VFSType =~ m/cifs|nfs/s ) { + my $error_message = vmount($backupwkStation,$backupwkFolder,$backupwkMount,$VFSType); + if (! $error_message) { + $c->bunmount($backupwkMount,$VFSType); + } elsif ($error_message) { + return $c->l('bac_ERROR_WHEN_TESTING_REMOTE_SERVER'). "
$error_message"; + } + } + + return '#OK#'.$c->l('bac_SUCCESSFULLY_ENABLED_WORKSTN'). '
'. + $c->l('bac_WITH_BACKUP_TIME')." $backupwkHour:$backupwkMin"; +} + + +sub performWorkstnSelRestore { + + my ($c, $seldatebefore, $restorefiles) = @_; + + my $out; + my @restorelist; + + foreach ( @{$restorefiles} ) { + push @restorelist, "\"".$1."\"" if ($_ =~ /^(.*)$/); + } + + my $backupwkrec = $cdb->get('backupwk'); + my $id = $backupwkrec->prop('Id') || + $cdb->get('SystemName')->value . "." . $cdb->get('DomainName')->value; + my $mntdir = $backupwkrec->prop('Mount') || '/mnt/smb'; + my $VFSType = $backupwkrec->prop('VFSType') || 'cifs'; + my $smbhost = $backupwkrec->prop('SmbHost'); + my $smbshare = $backupwkrec->prop('SmbShare'); + my $err; + my $error_message; + $mntdir = "/$smbshare" if ( $VFSType eq 'usb' ); + + # Mounting backup shared folder + $error_message = $c->bmount($mntdir,$smbhost,$smbshare,$VFSType); + if ($error_message) { + $error_message .= " : $id"; + return $error_message; + } + + # Test if backup subdirectory for our server + my $mntbkdir = $mntdir . "/$id"; + unless (-d $mntbkdir) { + $error_message = $c->l('bac_ERR_NO_HOST_DIR')."\n"; + $error_message .= $c->bunmount($mntdir,$VFSType); + $error_message .= " : $id"; + return $error_message; + } + + # backup is online, restoring now + $| = 1; + my $restorerr; + + if (open(RD, "-|")) { + #----------------------------------------------------- + # restore system from uploaded workstation backup file + #----------------------------------------------------- + $out .= "". $c->l('bac_FILES_HAVE_BEEN_RESTORED') ." \n"; + $out .= ''; + my $message; + if (!close RD) { + $message = $c->l('bac_RESTORE_FAILED_MSG'); + } else { + if ($restorerr) { + $message = $c->l('bac_RESTORE_FAILED'); + } else { + $message = $c->l('bac_RESTORE_COMPLETE'); + } + } + $out .= "$message \n"; + } else { + select(STDOUT); + $| = 1; + if ($seldatebefore) { + $restorerr = system("/usr/bin/dar_manager -B \"$mntbkdir/dar-catalog\" -Q -w $seldatebefore -e '-v -N -R / -w' -r @restorelist"); + } else { + $restorerr = system("/usr/bin/dar_manager -B \"$mntbkdir/dar-catalog\" -Q -k -e '-v -N -R / -w' -r @restorelist"); + } + $error_message = $c->bunmount($mntdir,$VFSType); + die($error_message) if $error_message; + exit(0); + } + return "#OK#" . $out; +} + + +sub performReboot { + + my ($c) = @_; + + #print "$c->l('bac_SERVER_REBOOT')"; + #print "$c->l('bac_SERVER_WILL_REBOOT')"; + + esmith::util::backgroundCommand( 2, "/sbin/e-smith/signal-event", "reboot" ); + return "#OK#" . $c->l('bac_SERVER_WILL_REBOOT'); +} + + +sub get_VFSType_options { + + my $c = shift; + return [[ $c->l('cifs') => 'cifs' ], [ $c->l('nfs') => 'nfs' ], + [ $c->l('local removable disk') => 'usb' ], [ $c->l('Mounted disk') => 'mnt' ]]; +} + + +sub get_dow_list { + + my $c = shift; + + my @list = (); + my @dlabels = split(' ', $c->l('bac_DOW')); + + my $i = 0; + foreach (@dlabels) { + push @list, [ "$_" => "$i" ]; + $i++; + } + +# put 'everyday' first + my $lastr = pop @list; + unshift @list, $lastr; + + return \@list; +} + + +sub get_BackupwkDest_options { + + my ($c, $VFSType) = @_; + my @usbdisks = (); + + if ( $VFSType eq 'usb' ) { + 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") { + my $vollbl = qx(hal-get-property --udi $1 --key volume.label); + $vollbl =~ m/^(\S+)/; + if ($vollbl =~ /^\s/) {$vollbl = 'nolabel';} + chomp $vollbl; + push @usbdisks, $vollbl; + } + } + # return undef unless ($usbdisks[0]); + } + + if ( $VFSType eq 'mnt' ) { + @usbdisks = findmnt (); + # return undef unless ($usbdisks[0]); + } + return \@usbdisks +} + + +sub get_function_options { + + my $c = shift; + + return [[ $c->l('bac_DESKTOP_BACKUP') => 'desktop_backup' ], + [ $c->l('bac_TAPE_CONFIGURE') => 'tape_configure' ], + [ $c->l('bac_TAPE_RESTORE') => 'tape_restore' ], + [ $c->l('bac_WORKSTN_CONFIGURE') => 'workstn_configure' ], + [ $c->l('bac_WORKSTN_VERIFY') => 'workstn_verify' ], + [ $c->l('bac_WORKSTN_RESTORE') => 'workstn_restore' ], + [ $c->l('bac_WORKSTN_SEL_RESTORE') => 'workstn_sel_restore']]; + +} + + +sub get_shared_folder_to_verify () { + + my ($c) = @_; + + my $rec = $cdb->get('backupwk'); + return undef unless $rec; + + my $id = $rec->prop('Id') || $cdb->get('SystemName')->value . "." . $cdb->get('DomainName')->value; + my $smbhost = $rec->prop('SmbHost'); + my $smbshare = $rec->prop('SmbShare'); + + return "$smbhost/$smbshare/$id"; +} + + +sub get_Backupset_options () { + + my ($c) = @_; + + my $rec = $cdb->get('backupwk'); + return undef unless $rec; + + my %backupfiles = (); + my $mntdir = $rec->prop('Mount') || '/mnt/smb'; + my $id = $rec->prop('Id') || $cdb->get('SystemName')->value . "." . $cdb->get('DomainName')->value; + my $smbhost = $rec->prop('SmbHost'); + my $smbshare = $rec->prop('SmbShare'); + my $mntbkdir; + my $key; + my $VFSType = $rec->prop('VFSType') || 'cifs'; + my $err; + $mntdir = "/$smbshare" if ( $VFSType eq 'usb' ); + + 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 + my $error_message = $c->bmount($mntdir,$smbhost,$smbshare,$VFSType); + return [] if $error_message; + + # Test if backup subdirectory for our server + $mntbkdir = $mntdir . "/$id"; + unless (-d $mntbkdir) { + $error_message .= $c->bunmount($mntdir,$VFSType); + return []; + } + + # Finding existing backups + find { wanted => \&$setbackuplist, untaint => 1, untaint_pattern => qr|^([-+@\w\s./]+)$|}, $mntbkdir ; + + my %blabels = (); + my @list; + + foreach $key (sort keys %backupfiles) { + my $labkey = $mntbkdir . '/' . $backupfiles{$key}[0] . '/' . $backupfiles{$key}[1]; + $blabels{$labkey} = $backupfiles{$key}[1] . " (" . $backupfiles{$key}[0] . ")"; + push @list, [ "$blabels{$labkey}" => "$labkey" ]; + } + + return \@list; +} + + +sub get_Restoreset_options () { + + my ($c) = @_; + + my $rec = $cdb->get('backupwk'); + return [] unless $rec; + + my %backupfiles = (); + my $mntdir = $rec->prop('Mount') || '/mnt/smb'; + my $id = $rec->prop('Id') || $cdb->get('SystemName')->value . "." . $cdb->get('DomainName')->value; + my $smbhost = $rec->prop('SmbHost'); + my $smbshare = $rec->prop('SmbShare'); + my $mntbkdir; + my $key; + my $VFSType = $rec->prop('VFSType') || 'cifs'; + my $err; + $mntdir = "/$smbshare" if ( $VFSType eq 'usb' ); + + 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 + my $error_message = $c->bmount($mntdir,$smbhost,$smbshare,$VFSType); + return [] if $error_message; + + # Test if backup subdirectory for our server + $mntbkdir = $mntdir . "/$id"; + unless (-d $mntbkdir) { + $error_message .= $c->bunmount($mntdir,$VFSType); + return []; + } + + my $catalog = "$mntbkdir/dar-catalog"; + my $i = 0; my $j = 0; + my @bknum; my @setd; my @bkname; + + # 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); + + my @list; + + # set drop down list of backups + push @list, [ $c->l('bac_ALL_BACKUPS') => "0" ]; + $j = 0; + while ($j < $i) { + push @list, [ $bkname[$j] => "$bknum[$j]" ]; + $j++ + } + return \@list; +} + + +sub get_Restorefiles_options { + + my ($c, $filterexp, $backupkey) = @_; + + my $rgfilter; + if ($filterexp =~ /^(.*)$/) { + $filterexp = $1; + $rgfilter = qr/$filterexp/; + } else { + $filterexp = ""; + } + if ($backupkey =~ /^(.*)$/) { + $backupkey = $1; + } else { + die('Unsecure data : ' . $backupkey); + } + my $seldatebf; + + my $backupwkrec = $cdb->get('backupwk'); + my $smbhost = $backupwkrec->prop('SmbHost'); + my $smbshare = $backupwkrec->prop('SmbShare'); + my $mntdir = $backupwkrec->prop('Mount') || '/mnt/smb'; + my $key; + my $id = $backupwkrec->prop('Id') || + $cdb->get('SystemName')->value . "." . $cdb->get('DomainName')->value; + my @flabels; + my %flabels = (); + my $VFSType = $backupwkrec->prop('VFSType') || 'cifs'; + my $err; + my $error_message; + $mntdir = "/$smbshare" if ( $VFSType eq 'usb' ); + + # Mounting backup shared folder + $error_message = $c->bmount($mntdir,$smbhost,$smbshare,$VFSType); + if ($error_message) { + warn "Backup - restore files: $error_message, $id \n"; + return undef; + } + + # Test if backup subdirectory for our server + my $mntbkdir = $mntdir . "/$id"; + unless (-d $mntbkdir) { + $error_message = $c->l('bac_ERR_NO_HOST_DIR')."\n"; + $error_message .= $c->bunmount($mntdir,$VFSType); + warn "Backup - restore files: $error_message, $id \n"; + return undef; + } + + # Read wanted file list from selected backup + if (open(RD, "-|")) { + my $regex = qr/\[.*\] */; + while () { + chomp; + $_ =~ s/$regex//; + if ($filterexp) {next unless m/$rgfilter/}; + push @flabels, $_; + } + my $status = close RD ? + $c->l('bac_READ_COMPLETE') + : ($c->l('bac_ERROR_READING_FILE').' : '.$backupkey); + } else { + select(STDOUT); + $| = 1; + + system("/usr/bin/dar_manager", "-B", "$mntbkdir/dar-catalog", "-u", "$backupkey") == 0 + or die ($c->l('bac_ERR_EXTRACT')." : ".$!); + + $error_message = $c->bunmount($mntdir,$VFSType); + die($error_message) if $error_message; + exit(0); + } + + return \@flabels; +} + + sub CalculateSizes () { my $c = shift; @@ -680,64 +1879,49 @@ open(DU, "-|") or exec '/usr/bin/du', '-s', @list; - while () - { + 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', '-t', 'ext4'; + or exec '/bin/df', '-P', '-t', 'ext4', '-t', 'xfs'; - while () - { + 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', '-t', 'ext4', '/tmp'; + or exec '/bin/df', '-P', '-t', 'ext4', '-t', 'xfs', '/tmp'; - while () - { + while () { next unless (/^\//); - (undef, undef, undef, my $s) = split(/\s+/, $_); - $tmpfree += $s; } close DF; - $halffree = $tmpfree / 2; - $tmpfree = showSize($tmpfree); $halffree = showSize($halffree); @@ -748,7 +1932,6 @@ sub showSize { # convert size to Mb or Gb or Tb :) Remember, df reports in kb. - my $size = shift; my $Mb = 1024; @@ -772,186 +1955,172 @@ } -sub tapeRestore { +sub desktopBackupRecordStatus { - my ($c, $lock_file, $file_handle) = @_; + my ($backup, $phase, $status) = @_; + my $now = time(); - my $rec = $rdb->get('restore'); - $rec->set_prop('state', 'running'); - $rec->set_prop('start', time); + warn("Backup terminated: $phase failed - status: $status\n"); + $backup->set_prop('EndEpochTime', "$now"); + $backup->set_prop('Result', "$phase:$status"); +} - my $sec = 10; - print "Refresh: $sec; URL=/smanager/backup\n"; - print $c->l('bac_NOW_RESTORING_FROM_TAPE'); - print $c->l('bac_MUST_REBOOT_AFTER_RESTORE'); - print $c->l('bac_PAGE_REFRESH_IN', $sec); - my $child; +sub dmount { - if ($child = fork) { - # Parent - $SIG{'CHLD'} = 'IGNORE'; - &esmith::lockfile::UnlockFile($file_handle); - return 'OK'; + # 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 2>&1) ); + } + elsif ($VFSType eq 'nfs') { + return ( qx(/bin/mount -t nfs -o nolock "$host:/$share" $mountdir 2>&1) ); } - elsif (defined $child) { - # Child - # Re-establish the lock. Wait till it is relinquished by the parent. + elsif ($VFSType eq 'usb') { + 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 = "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"); + } +} - $file_handle = &esmith::lockfile::LockFileOrWait($lock_file); - # Close STDOUT so that the web server connection is closed. - close STDOUT; +sub checkMount { - # Now reopen STDOUT for the child. Redirect it to STDERR. - open(STDOUT, ">&STDERR"); + # check if $mountdir is mounted + my $mountdir = shift; + $|=1; # Auto-flush - unless(system("/sbin/e-smith/signal-event", "pre-restore") == 0) - { - $rec->set_prop('errmsg', $c->l('bac_ERR_PRE_RESTORE')); - $rec->delete_prop('state'); - die ($c->l('bac_ERR_PRE_RESTORE'),"\n"); - } + # copy STDOUT to another filehandle + open (my $STDOLD, '>&', STDOUT); - unless(system("/sbin/e-smith/signal-event", "restore-tape") == 0) - { - $rec->set_prop('errmsg', $c->l('bac_ERR_RESTORING_FROM_TAPE')); - $rec->delete_prop('state'); - die ($c->l('bac_ERR_RESTORING_FROM_TAPE')."\n"); - } + open(STDOUT, ">/dev/null"); + if ( open(MOUNTDIR, "|-", "/bin/findmnt", $mountdir)){;} - #---------------------------------------- - # regenerate configuration files - #---------------------------------------- + # restore STDOUT + open (STDOUT, '>&', $STDOLD); - unless(system("/usr/sbin/groupmod", "-g", "$www_gid", "www") == 0) - { - $rec->set_prop('errmsg', $rec->prop('errmsg').'
'. - $c->l('bac_ERR_RESTORING_GID')); - warn ($c->l('bac_ERR_RESTORING_GID')."\n"); - } - unless(system("/usr/sbin/usermod", "-g", "$www_gid", "www") == 0) - { - $rec->set_prop('errmsg', $rec->prop('errmsg').'
'. - $c->l('bac_ERR_RESTORING_INITIAL_GRP')); - warn ($c->l('bac_ERR_RESTORING_INITIAL_GRP')."\n"); - } - unless(system("/sbin/e-smith/signal-event", "post-upgrade") == 0) - { - $rec->set_prop('errmsg', $rec->prop('errmsg').'
'. - $c->l('bac_ERR_UPDATING_CONF_AFTER_TAPE_RESTORE')); - $rec->delete_prop('state'); - die ($c->l('bac_ERR_UPDATING_CONF_AFTER_TAPE_RESTORE')); - } + return (!close(MOUNTDIR)); +} - 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); +sub bmount { - &esmith::lockfile::UnlockFile($file_handle); + my ($c, $mntdir, $host, $share, $VFSType) = @_; + # verify backup directory not already mounted - exit; + if (!checkMount ($mntdir)) { + return if ($VFSType eq 'mnt'); + return ($c->l('bac_ERR_ALREADY_MOUNTED')); + } else { + if ($VFSType eq 'mnt') { + return ($c->l('bac_ERR_NOT_MOUNTED')); + } } - else - { - # Error - $rec->delete_prop('state'); - $rec->set_prop('errmsg', $c->l('bac_COULD_NOT_FORK')); - die ($c->l("bac_COULD_NOT_FORK")." $!\n"); + # create the directory mount point if it does not exist + my $err = createTree ($mntdir); + return ($c->l('bac_ERR_MOUNTING_SMBSHARE') . "\n" . $err) if $err; + + # mount the backup directory + $err = dmount($host,$share,$mntdir,'','',$VFSType); + return ($c->l('bac_ERR_MOUNTING_SMBSHARE') . "\n" . $err) if $err; + + # verify $mntdir is mounted + if (checkMount ($mntdir)) { + # The mount should have suceeded, but sometimes it needs more time, + # so sleep and then check again. + sleep 5; + if (checkMount ($mntdir)) { + return ($c->l('bac_ERR_NOT_MOUNTED')); + } } + return; } -sub get_VFSType_options { +sub bunmount { - my $c = shift; - return [[ $c->l('cifs') => 'cifs' ], [ $c->l('nfs') => 'nfs' ], - [ $c->l('local removable disk') => 'usb' ], [ $c->l('Mounted disk') => 'mnt' ]]; -} + my ($c, $mount, $type) = @_; + return if ($type eq 'mnt'); # Don't unmount for type 'mnt' + if (!checkMount ($mount)) { + system('/bin/umount', '-f', $mount) == 0 + or return ($c->l('bac_ERR_WHILE_UNMOUNTING')); + } + return; +} -sub getWorkstnBackupConfig { - my ($c) = @_; - my $out; +sub findmnt { - my $backupwk_status; - my $enabledIncOnlyTimeout = ""; - my $backupwkLogin = 'backup'; - my $backupwkPassword = 'backup'; - my $backupwkStation = 'host'; - my $backupwkFolder = 'share'; - my $backupwkMount = '/mnt/smb'; - my $setsNumber; - my $filesinset; - my $backupwkTime; - my $backupwkTimeout; - my $backupwkIncOnlyTimeout; - my $VFSType; - my $compression; - my $dof; - my @dlabels = split(' ', $c->l('bac_DOW')); + my @mntin = qx( findmnt -n -l -o TARGET ); + my @mntout; - # Obtain backup informations from configuration - my $rec = $cdb->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'; - $backupwkMount = $rec->prop('Mount') || '/mnt/smb'; - $VFSType = $rec->prop('VFSType') || 'cifs'; - $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'; - $backupwk_status = $rec->prop('status'); + foreach my $mount (@mntin) { + next if ($mount =~ m/^\/proc|^\/dev|^\/sys|^\/boot/s); + chomp $mount; + next if ($mount eq '/'); + push @mntout, $mount; } + return @mntout; +} - if ($rec) { - if ($VFSType eq 'usb') { - $out .= $c->l('bac_WORKSTN_BACKUP_USB').' '.$backupwkFolder.'
'; - } - elsif ($VFSType eq 'mnt') { - $out .= $c->l('bac_WORKSTN_BACKUP_MNT').' '.$backupwkMount.'
'; - } else { - $out .= $c->l('bac_WORKSTN_BACKUP_HOST').' '.$backupwkStation.' '; - $out .= $c->l('bac_WORKSTN_BACKUP_VFSTYPE').' '.$VFSType.'
'; - $out .= $c->l('bac_WORKSTN_BACKUP_SHARE').' '.$backupwkFolder.'
'; - } - if ($VFSType eq 'cifs') { - $out .= $c->l('bac_LOGIN').' '.$backupwkLogin.'
'; - $out .= $c->l('PASSWORD').' ********
'; - } - $out .= $c->l('bac_WORKSTN_BACKUP_SETSNUM').' '.$setsNumber.'
'; - $out .= $c->l('bac_WORKSTN_BACKUP_DAYSINSET').' '.$filesinset.'
'; - $out .= $c->l('bac_WORKSTN_BACKUP_COMPRESSION').' '.$compression.'
'; - $out .= $c->l('bac_WORKSTN_BACKUP_TOD').' '.$backupwkTime.'
'; - $out .= $c->l('bac_WORKSTN_BACKUP_TIMEOUT').' '.$backupwkTimeout.' '.$c->l('bac_HOURS'); - if ( $backupwkIncOnlyTimeout eq 'yes' ) { - $out .= $c->l('bac_WORKSTN_BACKUP_INCONLY_TIMEOUT') - } - $out .= '
'; - if ( $dof eq '7' ) { - $out .= $c->l('bac_WORKSTN_FULL_BACKUP_EVERYDAY').'
'; - } else { - $out .= $c->l('bac_WORKSTN_FULL_BACKUP_DAY').' '.$dlabels[$dof].'
'; - } - } else { - $out = $c->l('bac_WORKSTN_BACKUP_NOT_CONFIGURED'); +sub createTree { + + my $tree = shift; + + if (! -d "$tree") { + eval {make_path("$tree")}; + return ("Error while creating $tree : $@. Maybe insufficient rights directory.\n") if $@; } + return; +} - return $out; + +sub vmount { + + #Used to test if the remote share is mountable when you save settings in database + # mount dar unit according to dar-workstation configuration in order to test the remote host + # return nothing if mount successfull + + my ($host,$share,$mountdir,$VFSType) = @_; + + if ($VFSType eq 'cifs') { + return ( qx(/bin/mount -t cifs "//$host/$share" $mountdir -o credentials=/etc/dar/CIFScredentials,nounix 2>&1) ); + } elsif ($VFSType eq 'nfs') { + return ( qx(/bin/mount -t nfs -o nolock,timeo=30,retrans=1,retry=0 "$host:/$share" $mountdir 2>&1) ); + } } 1; + diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/Controller/Reboot.pm smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/Controller/Reboot.pm --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/Controller/Reboot.pm 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/Controller/Reboot.pm 2021-01-27 00:42:44.000000000 +0400 @@ -44,20 +44,24 @@ my $debug = $c->param('debug'); if ($function eq "reboot") { - $result = $c->l('rbo_REBOOT_SUCCEEDED') . $c->l('rbo_DESC_REBOOT'); + $result = $c->l('rbo_REBOOT_SUCCEEDED') . '
' . $c->l('rbo_DESC_REBOOT'); unless ($debug) { - system( "/sbin/e-smith/signal-event", "reboot" ) == 0 - or die ("Error occurred while rebooting.\n"); + esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "reboot" ); + # system( "/sbin/e-smith/signal-event", "reboot" ) == 0 + # or die ("Error occurred while rebooting.\n"); } } elsif ($function eq 'shutdown') { - $result = $c->l('rbo_SHUTDOWN_SUCCEEDED') . $c->l('rbo_DESC_SHUTDOWN'); + $result = $c->l('rbo_SHUTDOWN_SUCCEEDED') . '
' . $c->l('rbo_DESC_SHUTDOWN'); unless ($debug) { - system( "/sbin/e-smith/signal-event", "halt" ) == 0 - or die ("Error occurred while halting.\n"); + esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "halt" ); + # system( "/sbin/e-smith/signal-event", "halt" ) == 0 + # or die ("Error occurred while halting.\n"); } } elsif ($function eq 'reconfigure') { - $result = $c->l('rbo_RECONFIGURE_SUCCEEDED') . $c->l('rbo_DESC_RECONFIGURE'); + $result = $c->l('rbo_RECONFIGURE_SUCCEEDED') . '
' . $c->l('rbo_DESC_RECONFIGURE'); unless ($debug) { + # esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade", + # "; ", "/sbin/e-smith/signal-event", "reboot" ); system( "/sbin/e-smith/signal-event", "post-upgrade" ) == 0 or die ("Error occurred while running post-upgrade.\n"); system( "/sbin/e-smith/signal-event", "reboot" ) == 0 diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_bg.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_bg.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_bg.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_bg.lex 2021-01-25 00:16:15.000000000 +0400 @@ -83,7 +83,7 @@ 'bac_NO_UID_FOR_NAME' => 'Не може да се вземе uid на потребител с име:', 'bac_PAGE_REFRESH_IN' => ' Тази страница ще се обнови за да покаже състоянието след {$sec} секунди, или щракнете тук. ', 'bac_Backup or restore' => 'Резервно копиране или възстановяване', -'bac_BACKUP_DESKTOP_TOO_BIG' => '
Сървърът съдържа твърде много данни за надеждно копиране на локалния компютър.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Сървърът съдържа твърде много данни за надеждно копиране на локалния компютър.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' Резервните копия върху лента са забранени ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' Резервното копиране върху работна станция е разрешено. ', 'bac_WKBACKUPS_RUN_AT' => 'Редовните резервни копия на лента ще се бъдат създавани в:', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_da.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_da.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_da.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_da.lex 2021-01-25 00:13:43.000000000 +0400 @@ -83,7 +83,7 @@ 'bac_NO_UID_FOR_NAME' => 'Kunne ikke finde brugerID for brugeren:', 'bac_PAGE_REFRESH_IN' => ' Siden vil genopfiske statusvisningen om {$sec} sekunder, ellers klik her. ', 'bac_Backup or restore' => 'Sikkerhedskopi eller gendannelse', -'bac_BACKUP_DESKTOP_TOO_BIG' => '
Din server har for mange data til en pålidelig sikkerhedskopi til arbejdsstation.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Din server har for mange data til en pålidelig sikkerhedskopi til arbejdsstation.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' Sikkerhedskopi til lokalnet er deaktiveret ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' Sikkerhedskopi til lokalnet er aktiveret. ', 'bac_WKBACKUPS_RUN_AT' => 'Sikkerhedskopi til lokalnet vil foregå kl.:', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_de.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_de.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_de.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_de.lex 2021-01-25 22:40:50.226000000 +0400 @@ -83,7 +83,7 @@ 'bac_NO_UID_FOR_NAME' => 'Kann keine UID für den Benutzer mit dem folgenden Namen bekommen:', 'bac_PAGE_REFRESH_IN' => ' Diese Seite wird in {$sec} Sekunden mit der Statusanzeige erneuert, oder drücken Sie hier. ', 'Backup or restore' => 'Sichern oder Wiederherstellen', -'bac_BACKUP_DESKTOP_TOO_BIG' => '
Auf Ihrem Server befinden sich zu viele Daten, um eine verläßliche Sicherung auf den lokalen Arbeitsplatz durchführen zu können.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Auf Ihrem Server befinden sich zu viele Daten, um eine verläßliche Sicherung auf den lokalen Arbeitsplatz durchführen zu können.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' Workstation Backups sind deaktiviert ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' Workstation Backups sind im Moment aktiviert. ', 'bac_WKBACKUPS_RUN_AT' => 'Das normale Workstation Backup wird laufen um:', @@ -98,7 +98,7 @@ 'bac_SUCCESSFULLY_ENABLED_WORKSTN' => 'Workstation Backups wurden erfolgreich aktiviert', 'bac_SUCCESSFULLY_DISABLED_WORKSTN' => 'Workstation Backups erfolgreich deaktiviert', 'bac_VERIFY_WORKSTN_BACKUP_FILE' => 'Workstation Backup überprüfen', -'bac_VERIFY_WORKSTN_BACKUP_DESC' => '

Mit dieser Option werden Ihnen alle Dateinamen in einer erstellten Workstation Sicherung angezeigt. Sie können damit den Inhalt der Sicherung überprüfen. Wählen Sie die Sicherung aus, die Sie prüfen möchten.

Nur Dateien gekennzeichnet mit [Saved] sind in der Sicherung enthalten.


Sicherungsdateien aus folgendem Verzeichnis werden geprüft: ', +'bac_VERIFY_WORKSTN_BACKUP_DESC' => '

Mit dieser Option werden Ihnen alle Dateinamen in einer erstellten Workstation Sicherung angezeigt. Sie können damit den Inhalt der Sicherung überprüfen. Wählen Sie die Sicherung aus, die Sie prüfen möchten.

Nur Dateien gekennzeichnet mit ~[Saved~] sind in der Sicherung enthalten.


Sicherungsdateien aus folgendem Verzeichnis werden geprüft: ', 'bac_RESTORE_CONF_FROM_WORKSTN' => 'Server Einstellungen aus Workstation Backup wiederherstellen', 'bac_RESTORE_CONF_FROM_WORKSTN_DESC' => '

Dieser Prozess stellt die Konfigurations- und Benutzerdaten aus Ihrem Workstation Backup wieder her. Die Wiederherstellung sollte auf einem neu installierten Server durchgeführt werden.

Vergewissern Sie sich, dass das richtige Band eingelegt wurde, bevor Sie beginnen.

Nach der Wiederherstellung muß der Server neu gestartet werden.

Wiederherstellung von: ', 'bac_RESTORE_FROM_WORKSTN' => 'Wiederherstellung aus Workstation Backup', @@ -137,12 +137,12 @@ 'bac_BACKUP_CHOICE' => 'Dateien für Anzeige auswählen', 'bac_SELECT_DATE_BEFORE' => 'Wiederherstellung der letzten Änderungen vor', 'bac_FILTER_EXPRESSION' => 'Namen gefiltert nach', -'bac_READ_COMPLETE' => ' Sie können alle Verzeichnisse und Dateien, die Sie wiederherstellen möchten in der angezeigten Liste auswählen (benutzen Sie Strg oder Shift für Mehrfachselektionen).
Warnung: Wenn Sie ein Verzeichnis selektieren, werden alle enthaltenen Dateien und Verzeichnisse wiederhergestellt.

Standardmäßig wird die neueste Version der ausgewählten Dateien wiederhergestellt, falls Sie aber ein Datum im Format [ [ [yyyy/]mm/]tt-]hh:mm[:ss] angeben, wird der Prozess nur die neueste vor dem gegebenen Datum geänderte Version wiederherstellen. ', -'bac_ERR_INVALID_SELDATE' => 'Das Datumsformat ist ungültig, es muß wie folgt angegeben werden [ [ [yyyy/]mm/]dd-]hh:mm[:ss]. Das bedeutet: 2005/12/31-08:23:32 or 10-08:32 or 08:32', +'bac_READ_COMPLETE' => ' Sie können alle Verzeichnisse und Dateien, die Sie wiederherstellen möchten in der angezeigten Liste auswählen (benutzen Sie Strg oder Shift für Mehrfachselektionen).
Warnung: Wenn Sie ein Verzeichnis selektieren, werden alle enthaltenen Dateien und Verzeichnisse wiederhergestellt.

Standardmäßig wird die neueste Version der ausgewählten Dateien wiederhergestellt, falls Sie aber ein Datum im Format ~[ ~[ ~[yyyy/~]mm/~]tt-~]hh:mm~[:ss~] angeben, wird der Prozess nur die neueste vor dem gegebenen Datum geänderte Version wiederherstellen. ', +'bac_ERR_INVALID_SELDATE' => 'Das Datumsformat ist ungültig, es muß wie folgt angegeben werden ~[ ~[ ~[yyyy/~]mm/~]dd-~]hh:mm~[:ss~]. Das bedeutet: 2005/12/31-08:23:32 or 10-08:32 or 08:32', 'bac_SELECT_FILES_TO_RESTORE' => 'Dateien für Wiederherstellung auswählen', 'bac_ERR_WHILE_UNMOUNTING' => 'Fehler bei der Trennung entfernter Freigaben', 'bac_ERR_DAR_CATALOG' => 'Fehler bei der Nutzung des Dar-Kataloges', -'bac_COMPRESSION_LEVEL' => 'Komprimierungsgrad [0-9] für das Backup', +'bac_COMPRESSION_LEVEL' => 'Komprimierungsgrad ~[0-9~] für das Backup', 'bac_FULL_ONLY_ON' => 'Gesamtsicherung erlaubt auf', 'bac_ERR_INVALID_COMPRESSION' => 'Der Komprimierungsgrad muss zwischen 0 (keine) und 9 (maximale Komprimierung) eingestellt sein', 'bac_DOW' => 'Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag Täglich', @@ -177,8 +177,12 @@ 'bac_TESTED_BACKUP' => 'Überprüfe die Integrität der Sicherung', 'bac_RESTORE_VERIFY_FAILED' => 'Prüfung der Integrität ist fehlgeschlagen', 'bac_CHECK_INTEGRITY_WARNING' => 'Warnung: Bei großen Sicherungen kann die Überprüfung der Integrität eine langwierige Sache werden und sollte bei täglichem Workstation Backup deaktiviert sein.', -'bac_cifs' => 'CIFS', -'bac_nfs' => 'NFS', -'bac_local removable disk' => 'Lokaler Wechseldatenträger', -'bac_Mounted disk' => 'Eingebunder Datenträger', + 'bac_cifs' => + 'CIFS', + 'bac_nfs' => + 'NFS', + 'bac_local removable disk' => + 'Lokaler Wechseldatenträger', + 'bac_Mounted disk' => + 'Eingebunder Datenträger', 'bac_ERROR_WHEN_TESTING_REMOTE_SERVER' => 'Die Parameter wurden gespeichert, aber der entfernte Host ist nicht erreichbar, bitte überprüfen Sie die Einstellungen.', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_en.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_en.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_en.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_en.lex 2021-01-25 22:41:36.778000000 +0400 @@ -230,14 +230,14 @@ (use ctrl or shift for multiple selection).
Warning : If you select a directory, all contained files and directories will be restored.

By default the most recent version of selected files is restored, but if you specify a date -in the format [ [ [yyyy/]mm/]dd-]hh:mm[:ss] the process +in the format ~[~[~[yyyy/~]mm/~]dd-~]hh:mm~[:ss~] the process will restore only the most recent version modified before the given date.', -'bac_ERR_INVALID_SELDATE' => 'Date format is invalid, must be [ [ [yyyy/]mm/]dd-]hh:mm[:ss]. ie: 2005/12/31-08:23:32 or +'bac_ERR_INVALID_SELDATE' => 'Date format is invalid, must be ~[~[~[yyyy/~]mm/~]dd-~]hh:mm~[:ss~]. ie: 2005/12/31-08:23:32 or 10-08:32 or 08:32', 'bac_SELECT_FILES_TO_RESTORE' => 'Select files to restore', 'bac_ERR_WHILE_UNMOUNTING' => 'Error occurs when unmounting distant share', 'bac_ERR_DAR_CATALOG' => 'Error when using Dar catalog', -'bac_COMPRESSION_LEVEL' => 'Backup compression level (0-9)', +'bac_COMPRESSION_LEVEL' => 'Backup compression level ~[0-9~]', 'bac_FULL_ONLY_ON' => 'Full backup is allowed on', 'bac_ERR_INVALID_COMPRESSION' => 'Compression level must be set between 0 (no compression) and 9 (maximum compression)', 'bac_DOW' => 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Everyday', @@ -279,3 +279,4 @@ 'bac_local removable disk' => 'Local removable disk', 'bac_Mounted disk' => 'Mounted disk', 'bac_ERROR_WHEN_TESTING_REMOTE_SERVER' => 'The parameters have been saved, however the remote host is not reachable, please check your settings.', +'bac_ERR_EXTRACT' => 'Error when extracting with Dar', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_es.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_es.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_es.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_es.lex 2021-01-25 22:45:08.371000000 +0400 @@ -83,7 +83,7 @@ 'bac_NO_UID_FOR_NAME' => 'No se pudo obtener el uid para el usuario llamado:', 'bac_PAGE_REFRESH_IN' => ' Esta página se actualizará a la pantalla de estado en {$sec} segundos o haga clic aquí. ', 'Backup or restore' => 'Respaldar o restaurar', -'bac_BACKUP_DESKTOP_TOO_BIG' => '

Su servidor tiene demasiados datos para realizar un respaldo confiable al escritorio.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Su servidor tiene demasiados datos para realizar un respaldo confiable al escritorio.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' Los respaldos en ordenador remoto están deshabilitados ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' Los respaldos en ordenador remoto están habilitados. ', 'bac_WKBACKUPS_RUN_AT' => 'Los respaldos regulares en ordenador remoto se ejecutarán a las:', @@ -138,11 +138,11 @@ 'bac_SELECT_DATE_BEFORE' => 'Restaurar el más reciente antes de', 'bac_FILTER_EXPRESSION' => 'Nombres filtrados por', 'bac_READ_COMPLETE' => ' Puede elegir todos los directorios y archivos que desee restaurar en la lista mostrada (use ctrl o shift para selecciones múltiples).
Advertencia : Si selecciona un directorio, todos los archivos y directorios contenidos serán restaurados.

Por defecto será restaurada la versión más reciente de los archivos seleccionados, pero si usted especifica una fecha en el formato [ [ [yyyy/]mm/]dd-]hh:mm[:ss] el proceso restaurará solamente la versión más recientemente modificada anterior a la fecha suministrada. ', -'bac_ERR_INVALID_SELDATE' => 'El formato de fecha es inválido, debe ser [ [ [yyyy/]mm/]dd-]hh:mm[:ss]. ej: 2005/12/31-08:23:32 o 10-08:32 o 08:32', +'bac_ERR_INVALID_SELDATE' => 'El formato de fecha es inválido, debe ser ~[ ~[ ~[yyyy/~]mm/~]dd-~]hh:mm~[:ss~]. ej: 2005/12/31-08:23:32 o 10-08:32 o 08:32', 'bac_SELECT_FILES_TO_RESTORE' => 'Seleccionar archivos para restaurar', 'bac_ERR_WHILE_UNMOUNTING' => 'Ha ocurrido un error cuando se desmontaba el recurso compartido distante', 'bac_ERR_DAR_CATALOG' => 'Ocurrió un error cuando se estaba utilizando el catálogo Dar', -'bac_COMPRESSION_LEVEL' => 'Nivel de compresión del respaldo [0-9]', +'bac_COMPRESSION_LEVEL' => 'Nivel de compresión del respaldo ~[0-9~]', 'bac_FULL_ONLY_ON' => 'Respaldos completos son permitidos en', 'bac_ERR_INVALID_COMPRESSION' => 'El nivel de compresión debe fijarse entre 0 (sin compresión) y 9 (compresión máxima)', 'bac_DOW' => 'Domingo Lunes Martes Miércoles Jueves Viernes Sábado Diario', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_fr.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_fr.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_fr.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_fr.lex 2021-01-25 19:17:16.000000000 +0400 @@ -1,6 +1,6 @@ 'bac_BACKUP_TITLE' => 'Sauvegarde et restauration des données du serveur', -'bac_BACKUP_DESC' => '

Vous disposez de deux méthodes pour sauvegarder et restaurer votre serveur : à distance sur un ordinateur du réseau local ou sur un lecteur/enregistreur de bande magnétique.

La première méthode crée une archive des fichiers de configuration du serveur et des données des utilisateurs et la télécharge sur un ordinateur de votre réseau local à l\'aide d\'un navigateur Internet. Actuellement, vos fichiers de configuration et de données totalisent environ $tarsize. La taille du fichier de sauvegarde sera quelque peu inférieure à cela, en fonction du degré de compressibilité des données. L\'option \"Vérifier le fichier de sauvegarde de l\'ordinateur\" peut être utilisée pour vérifier l\'intégrité d\'un fichier de sauvegarde stocké sur l\'ordinateur local.

La méthode de sauvegarde sur bande utilise le programme $module pour sauvegarder quotidiennement tout votre disque dur. Ceci nécessite que le lecteur/enregistreur de bande magnétique soit pris en charge et que la bande ne soit pas protégée contre l\'écriture. La sauvegarde est exécutée automatiquement chaque jour à l\'heure sélectionnée, (avec un rappel envoyé à l\'administrateur dans la journée par courriel.
Actuellement, votre disque dur contient $dumpsize de données.

Les deux méthodes de restauration vous permettent de restaurer vos fichiers de configuration et les données des utilisateurs.
Idéalement, la restauration ne devrait se faire que sur un serveur nouvellement installé.

', -'bac_BACKUP_DESC_DAR' => '

Vous disposez de trois méthodes de sauvegarde et de restauration de votre serveur : sur votre ordinateur local, un lecteur/enregistreur de bandes ou un ordinateur distant sur votre réseau local.

La première méthode crée une copie de la configuration du serveur et des données utilisateur puis les transfère sur votre ordinateur local, via votre navigateur Internet. Actuellement, la taille totale de ces données représente approximativement $tarsize. La taille du fichier de sauvegarde sera légèrement inférieure à ceci, en fonction de la compressibilité de ces données. Ce fichier peut être utilisé pour restaurer votre serveur depuis la console si vous le copiez sur un média de stockage tel qu\'un disque amovible.

La méthode de sauvegarde sur bande exploite le programme $module pour sauvegarder quotidiennement l\'intégralité du disque dur du serveur. Ceci nécessite l\'emploi d\'un lecteur/enregistreur de bandes reconnu et d\'une bande non protégée en écriture. La sauvegarde est effectuée automatiquement à l\'heure sélectionnée (un courriel de rappel est aussi envoyé automatiquement à l\'administrateur). Actuellement, la taille totale utilisée sur le disque dur de votre serveur représente approximativement $dumpsize.

La méthode de sauvegarde sur un ordinateur distant exploite le programme dar pour sauvegarder la configuration de votre serveur et les données utilisateur vers un ordinateur sur votre réseau local (ou un disque USB connecté au serveur). Ceci nécessite que vous disposiez d\'un partage accessible en écriture (smbfs, cifs, ou nfs) sur l\'ordinateur distant ou d\'un disque USB sur le serveur. Vous pouvez définir le nombre de jeux de sauvegardes devant être conservés sur le partage, ainsi que la possibilité de créer des jeux de sauvegardes incrémentales sur plusieurs jours. La sauvegarde est effectuée automatiquement à l\'heure sélectionnée. Actuellement, les fichiers de configuration et de données représentent approximativement $tarsize non compressés. Le partage de sauvegarde doit offrir deux fois la taille d\'une sauvegarde non compressée.

Toutes les méthodes de restauration vous permettent de restaurer la configuration du serveur et des données utilisateur. La sauvegarde sur un ordinateur distant permet de restaurer chaque fichier individuellement. Idéalement, une restauration complète devrait être effectuée sur un serveur nouvellement installé.

', +'bac_BACKUP_DESC' => '

Vous disposez de deux méthodes pour sauvegarder et restaurer votre serveur : à distance sur un ordinateur du réseau local ou sur un lecteur/enregistreur de bande magnétique.

La première méthode crée une archive des fichiers de configuration du serveur et des données des utilisateurs et la télécharge sur un ordinateur de votre réseau local à l\'aide d\'un navigateur Internet. Actuellement, vos fichiers de configuration et de données totalisent environ [_2]. La taille du fichier de sauvegarde sera quelque peu inférieure à cela, en fonction du degré de compressibilité des données. L\'option \"Vérifier le fichier de sauvegarde de l\'ordinateur\" peut être utilisée pour vérifier l\'intégrité d\'un fichier de sauvegarde stocké sur l\'ordinateur local.

La méthode de sauvegarde sur bande utilise le programme [_1] pour sauvegarder quotidiennement tout votre disque dur. Ceci nécessite que le lecteur/enregistreur de bande magnétique soit pris en charge et que la bande ne soit pas protégée contre l\'écriture. La sauvegarde est exécutée automatiquement chaque jour à l\'heure sélectionnée, (avec un rappel envoyé à l\'administrateur dans la journée par courriel.
Actuellement, votre disque dur contient [_2] de données.

Les deux méthodes de restauration vous permettent de restaurer vos fichiers de configuration et les données des utilisateurs.
Idéalement, la restauration ne devrait se faire que sur un serveur nouvellement installé.

', +'bac_BACKUP_DESC_DAR' => '

Vous disposez de trois méthodes de sauvegarde et de restauration de votre serveur : sur votre ordinateur local, un lecteur/enregistreur de bandes ou un ordinateur distant sur votre réseau local.

La première méthode crée une copie de la configuration du serveur et des données utilisateur puis les transfère sur votre ordinateur local, via votre navigateur Internet. Actuellement, la taille totale de ces données représente approximativement [_2]. La taille du fichier de sauvegarde sera légèrement inférieure à ceci, en fonction de la compressibilité de ces données. Ce fichier peut être utilisé pour restaurer votre serveur depuis la console si vous le copiez sur un média de stockage tel qu\'un disque amovible.

La méthode de sauvegarde sur bande exploite le programme [_1] pour sauvegarder quotidiennement l\'intégralité du disque dur du serveur. Ceci nécessite l\'emploi d\'un lecteur/enregistreur de bandes reconnu et d\'une bande non protégée en écriture. La sauvegarde est effectuée automatiquement à l\'heure sélectionnée (un courriel de rappel est aussi envoyé automatiquement à l\'administrateur). Actuellement, la taille totale utilisée sur le disque dur de votre serveur représente approximativement [_3].

La méthode de sauvegarde sur un ordinateur distant exploite le programme dar pour sauvegarder la configuration de votre serveur et les données utilisateur vers un ordinateur sur votre réseau local (ou un disque USB connecté au serveur). Ceci nécessite que vous disposiez d\'un partage accessible en écriture (smbfs, cifs, ou nfs) sur l\'ordinateur distant ou d\'un disque USB sur le serveur. Vous pouvez définir le nombre de jeux de sauvegardes devant être conservés sur le partage, ainsi que la possibilité de créer des jeux de sauvegardes incrémentales sur plusieurs jours. La sauvegarde est effectuée automatiquement à l\'heure sélectionnée. Actuellement, les fichiers de configuration et de données représentent approximativement [_3] non compressés. Le partage de sauvegarde doit offrir deux fois la taille d\'une sauvegarde non compressée.

Toutes les méthodes de restauration vous permettent de restaurer la configuration du serveur et des données utilisateur. La sauvegarde sur un ordinateur distant permet de restaurer chaque fichier individuellement. Idéalement, une restauration complète devrait être effectuée sur un serveur nouvellement installé.

', 'bac_BACKUP_CONFIG_STATUS' => 'Configuration et état de la sauvegarde', 'bac_TAPE_BACKUPS_ENABLED' => ' Les sauvegardes sur bande sont actuellement activées. ', 'bac_BACKUPS_RUN_AT' => 'Les sauvegardes régulières sur bande seront exécutées à:', @@ -26,7 +26,7 @@ 'bac_ERR_POST_BACKUP' => 'Une erreur est survenue lors des opérations succédant à la sauvegarde.', 'bac_RESTORE_SERVER_CONFIG' => 'Restaurer la configuration du serveur', 'bac_DESKTOP_RESTORE_DESC' => ' Cette action va vous permettre de télécharger un fichier de sauvegarde depuis votre ordinateur local vers votre serveur. Ceci permettra de restaurer la configuration du serveur et les données des utilisateurs. Cette restauration ne devrait être effectuée que sur un serveur nouvellement installé. ', -'bac_FREE_SPACE' => ' L\'espace libre disponible sur votre serveur est d\'environ $tmpfree. Vérifiez que la taille du fichier de sauvegarde sur votre ordinateur local est inférieure à $halffree avant de commencer la restauration. ', +'bac_FREE_SPACE' => ' L\'espace libre disponible sur votre serveur est d\'environ [_1]. Vérifiez que la taille du fichier de sauvegarde sur votre ordinateur local est inférieure à [_2] avant de commencer la restauration. ', 'bac_MUST_REBOOT_AFTER_RESTORE' => 'À la fin de la restauration, vous devrez redémarrer le serveur.', 'bac_FILE_TO_RESTORE' => 'Sélectionnez le fichier de sauvegarde à restaurer', 'bac_VERIFY_BACKUP_DESC' => '

Cette option va afficher le nom de tous les fichiers contenus dans un fichier de sauvegarde déjà stocké sur l\'ordinateur local. Vous pouvez utiliser cette option pour vérifier le contenu du fichier de sauvegarde.

', @@ -81,9 +81,9 @@ 'bac_SERVER_REBOOT' => 'Redémarrage du serveur', 'bac_SERVER_WILL_REBOOT' => 'Votre serveur va maintenant redémarrer.', 'bac_NO_UID_FOR_NAME' => 'Impossible d\'obtenir l\'UID de l\'utilisateur :', -'bac_PAGE_REFRESH_IN' => ' Cette page s\'actualisera dans {$sec} secondes pour afficher l\'état de l\'opération en cours. Vous pouvez également actualiser la page en cliquant ici. ', +'bac_PAGE_REFRESH_IN' => ' Cette page s\'actualisera dans [_1] secondes pour afficher l\'état de l\'opération en cours. Vous pouvez également actualiser la page en cliquant ici. ', 'Backup or restore' => 'Sauvegarde et restauration', -'bac_BACKUP_DESKTOP_TOO_BIG' => '
Le volume de données stockées sur votre serveur est trop important pour assurer la fiabilité de la sauvegarde sur l\'ordinateur local.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Le volume de données stockées sur votre serveur est trop important pour assurer la fiabilité de la sauvegarde sur l\'ordinateur local.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' Les sauvegardes sur un ordinateur distant sont actuellement désactivées. ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' Les sauvegardes sur un ordinateur distant sont actuellement activées. ', 'bac_WKBACKUPS_RUN_AT' => 'Les sauvegardes quotidiennes sur un ordinateur distant seront exécutées à', @@ -98,7 +98,7 @@ 'bac_SUCCESSFULLY_ENABLED_WORKSTN' => 'Activation réussie des sauvegardes sur un ordinateur distant', 'bac_SUCCESSFULLY_DISABLED_WORKSTN' => 'Désactivation réussie des sauvegardes sur un ordinateur distant', 'bac_VERIFY_WORKSTN_BACKUP_FILE' => 'Vérifier les sauvegardes sur un ordinateur distant', -'bac_VERIFY_WORKSTN_BACKUP_DESC' => '

Cette option va afficher le nom de tous les fichiers inclus dans une précédente sauvegarde quotidienne sur un ordinateur distant. Vous pouvez utiliser cette option pour vérifier le contenu de la sauvegarde.Vous allez choisir la sauvegarde à vérifier.

Seuls les fichiers portant la mention [Saved] sont effectivement inclus dans la sauvegarde sélectionnée.

Les fichiers de sauvegarde sont vérifiés à partir du dossier partagé : ', +'bac_VERIFY_WORKSTN_BACKUP_DESC' => '

Cette option va afficher le nom de tous les fichiers inclus dans une précédente sauvegarde quotidienne sur un ordinateur distant. Vous pouvez utiliser cette option pour vérifier le contenu de la sauvegarde.Vous allez choisir la sauvegarde à vérifier.

Seuls les fichiers portant la mention ~[Saved~] sont effectivement inclus dans la sauvegarde sélectionnée.

Les fichiers de sauvegarde sont vérifiés à partir du dossier partagé : ', 'bac_RESTORE_CONF_FROM_WORKSTN' => 'Restaurer la configuration du serveur à partir d\'une sauvegarde sur un ordinateur distant', 'bac_RESTORE_CONF_FROM_WORKSTN_DESC' => '

Cette action restaurera les fichiers de configuration du serveur et les données des utilisateurs à partir d\'une sauvegarde sur un ordinateur distant.
Cette restauration ne devrait être effectuée que sur un serveur nouvellement installé.

Assurez-vous de sélectionner le bon fichier de sauvegarde avant de poursuivre.

Après la fin de la restauration, vous devrez redémarrer le serveur.

La restauration va être effectuée à partir de : ', 'bac_RESTORE_FROM_WORKSTN' => 'Restaurer à partir d\'un ordinateur distant', @@ -137,12 +137,12 @@ 'bac_BACKUP_CHOICE' => 'Sélectionner les fichiers à afficher', 'bac_SELECT_DATE_BEFORE' => 'Restaurer les plus récents avant cette date', 'bac_FILTER_EXPRESSION' => 'Filtrage des noms par', -'bac_READ_COMPLETE' => ' Vous pouvez choisir tous les dossiers et les fichiers que vous voulez restaurer dans la liste affichée (utiliser ctrl ou shift pour des sélections multiples).
Attention : Si vous sélectionnez un répertoire, tous ses fichiers et sous-dossiers vont être restaurés.

Par défaut, la version la plus récente des fichiers sélectionnés est restaurée mais si vous indiquez une date avec le format [ [ [aaaa/]mm/]jj-]hh:mm[:ss] le processus va uniquement restaurer la plus récente des versions ayant été modifiée avant cette date. ', -'bac_ERR_INVALID_SELDATE' => 'Le format de la date est invalide. Il doit être du style [ [ [aaaa/]mm/]jj-]hh:mm[:ss]. Ex: 2005/12/31-08:23:32, 10-08:32 ou 08:32', +'bac_READ_COMPLETE' => ' Vous pouvez choisir tous les dossiers et les fichiers que vous voulez restaurer dans la liste affichée (utiliser ctrl ou shift pour des sélections multiples).
Attention : Si vous sélectionnez un répertoire, tous ses fichiers et sous-dossiers vont être restaurés.

Par défaut, la version la plus récente des fichiers sélectionnés est restaurée mais si vous indiquez une date avec le format ~[ ~[ ~[aaaa/~]mm/~]jj-~]hh:mm~[:ss~] le processus va uniquement restaurer la plus récente des versions ayant été modifiée avant cette date. ', +'bac_ERR_INVALID_SELDATE' => 'Le format de la date est invalide. Il doit être du style ~[ ~[ ~[aaaa/~]mm/~]jj-~]hh:mm~[:ss~]. Ex: 2005/12/31-08:23:32, 10-08:32 ou 08:32', 'bac_SELECT_FILES_TO_RESTORE' => 'Sélectionnez les fichiers à restaurer', 'bac_ERR_WHILE_UNMOUNTING' => 'Une erreur est survenue pendant le démontage du partage distant', 'bac_ERR_DAR_CATALOG' => 'Erreur durant l\'utilisation du catalogue DAR', -'bac_COMPRESSION_LEVEL' => 'Niveau de compression de la sauvegarde [0-9]', +'bac_COMPRESSION_LEVEL' => 'Niveau de compression de la sauvegarde ~[0-9~]', 'bac_FULL_ONLY_ON' => 'La sauvegarde complète est autorisée sur', 'bac_ERR_INVALID_COMPRESSION' => 'Le niveau de compression doit être réglé entre 0 (aucune compression) et 9 (compression maximale)', 'bac_DOW' => 'Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi Tous les jours', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_it.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_it.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_it.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_it.lex 2021-01-25 22:43:14.266000000 +0400 @@ -83,7 +83,7 @@ 'bac_NO_UID_FOR_NAME' => 'Impossibile ottenere l\'uid per l\'utente:', 'bac_PAGE_REFRESH_IN' => ' Aggiornamento automatico ogni {$sec} secondi, o fare clic qui. ', 'Backup or restore' => 'Backup o ripristino', -'bac_BACKUP_DESKTOP_TOO_BIG' => '

Il server ha una quantità di dati superiore alla capacità del backup su desktop.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Il server ha una quantità di dati superiore alla capacità del backup su desktop.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' I backup su workstation sono disabilitati. ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' I backup su workstation sono attualmente abilitati. ', 'bac_WKBACKUPS_RUN_AT' => 'I backup su workstation inizieranno alle:', @@ -138,11 +138,11 @@ 'bac_SELECT_DATE_BEFORE' => 'Ripristina file aggiornati alla data', 'bac_FILTER_EXPRESSION' => 'Nomi filtrati per', 'bac_READ_COMPLETE' => ' Selezionare i file e le directory da ripristinare elencati nella lista (utilizzare ctrl o shift per selezioni multiple).
Attenzione : Selezionando una directory, tutti i file e le sottodirectory in essa contenuti verranno ripristinati.

Per default sarà ripristinata la versione più recente dei file selezionati, ma indicando una data nel formato [ [ [yyyy/]mm/]dd-]hh:mm[:ss] verrà ripristinata la versione antecedente alla data indicata. ', -'bac_ERR_INVALID_SELDATE' => 'Il formato della data non è valido, deve essere [ [ [yyyy/]mm/]dd-]hh:mm[:ss]. es.: 2005/12/31-08:23:32 oppure 10-08:32 oppure 08:32', +'bac_ERR_INVALID_SELDATE' => 'Il formato della data non è valido, deve essere ~[ ~[ ~[yyyy/~]mm/~]dd-~]hh:mm~[:ss~]. es.: 2005/12/31-08:23:32 oppure 10-08:32 oppure 08:32', 'bac_SELECT_FILES_TO_RESTORE' => 'Selezionare i file da ripristinare', 'bac_ERR_WHILE_UNMOUNTING' => 'Si è verificato un errore nell\'umount della condivisione remota', 'bac_ERR_DAR_CATALOG' => 'Si è verificato un errore usando Dar', -'bac_COMPRESSION_LEVEL' => 'Livello di compressione del backup [0-9]', +'bac_COMPRESSION_LEVEL' => 'Livello di compressione del backup ~[0-9~]', 'bac_FULL_ONLY_ON' => 'È possibile effettuare un backup completo', 'bac_ERR_INVALID_COMPRESSION' => 'Il livello di compressione deve essere impostato tra 0 (nessuna compressione) e 9 (massima compressione)', 'bac_DOW' => 'Domenica Lunedì Martedì Mercoledì Giovedì Venerdì Sabato Sempre', @@ -160,7 +160,7 @@ 'bac_PASSWORD' => 'La password è', 'bac_WORKSTN_BACKUP_SETSNUM' => 'Numero di set di backup', 'bac_WORKSTN_BACKUP_DAYSINSET' => 'Il numero di backup giornalieri contenuti in ogni set è', -'bac_WORKSTN_BACKUP_COMPRESSION' => 'Il livello di compressione del backup (0-9) è', +'bac_WORKSTN_BACKUP_COMPRESSION' => 'Il livello di compressione del backup ~[0-9~] è', 'bac_WORKSTN_BACKUP_TIMEOUT' => 'Ogni sessione di backup giornaliero scade normalmente dopo', 'bac_WORKSTN_BACKUP_INCONLY_TIMEOUT' => ' eccetto i backup full che scadono dopo 24 ore', 'bac_WORKSTN_FULL_BACKUP_EVERYDAY' => 'Le sessioni di full backup (nel caso di nuovo set di backup) sono permesse tutti i giorni', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_nl.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_nl.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_nl.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_nl.lex 2021-01-25 22:44:00.275000000 +0400 @@ -83,7 +83,7 @@ 'bac_NO_UID_FOR_NAME' => 'Kan uid niet vinden voor gebruiker:', 'bac_PAGE_REFRESH_IN' => ' Deze pagina vernieuwt naar het status scherm binnen {$sec} seconden, of klik hier. ', 'Backup or restore' => 'Backup of herstel', -'bac_BACKUP_DESKTOP_TOO_BIG' => '

Uw server heeft te veel data voor een betrouwbare backup naar bureaublad.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Uw server heeft te veel data voor een betrouwbare backup naar bureaublad.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' Werkstation backups zijn niet geactiveerd ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' Werkstation backups zijn geactiveerd. ', 'bac_WKBACKUPS_RUN_AT' => 'Werkstation backups starten om:', @@ -138,11 +138,11 @@ 'bac_SELECT_DATE_BEFORE' => 'Herstel meest recente voor', 'bac_FILTER_EXPRESSION' => 'Namen gefilterd door', 'bac_READ_COMPLETE' => ' U kunt de mappen en bestanden die hersteld moeten worden selecteren in de getoonde lijst (gebruik Ctrl of Shift voor veelvoudige keuze).
Waarschuwing: Als een map worden geselecteerd, worden alle onderliggende mappen en bestanden hersteld.

Als standaard instelling worden de meest recent versies van de geselecteerde bestanden hersteld, maar als een datum in het formaat [ [ [jjjj/]mm/]dd-]uu:mm[:ss] is gespecificeerd word alleen de meest recente versie voor de aangegeven datum herstelt. ', -'bac_ERR_INVALID_SELDATE' => 'Datum formaat is niet correct, gewenst formaat [ [ [jjjj/]mm/]dd-]uu:mm[:ss]. bijvoorbeeld: 2005/12/31-08:23:32 of 10-08:32 of 08:32', +'bac_ERR_INVALID_SELDATE' => 'Datum formaat is niet correct, gewenst formaat ~[ ~[ ~[jjjj/~]mm/~]dd-~]uu:mm~[:ss~]. bijvoorbeeld: 2005/12/31-08:23:32 of 10-08:32 of 08:32', 'bac_SELECT_FILES_TO_RESTORE' => 'Selecteer bestanden om te herstellen', 'bac_ERR_WHILE_UNMOUNTING' => 'Fout opgetreden bij het ontladen van gedeelde map', 'bac_ERR_DAR_CATALOG' => 'Fout bij het gebruiken van Dar cataloog', -'bac_COMPRESSION_LEVEL' => 'Backup compressie level [0-9]', +'bac_COMPRESSION_LEVEL' => 'Backup compressie level ~[0-9~]', 'bac_FULL_ONLY_ON' => 'Volledige backup is toegelaten op', 'bac_ERR_INVALID_COMPRESSION' => 'Compressie level moet zich tussen 0 (geen compressie) en 9 (maximum compressie) bevinden', 'bac_DOW' => 'Zondag Maandag Dinsdag Woensdag Donderdag Vrijdag Zaterdag Alle dagen', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_pt-br.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_pt-br.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_pt-br.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_pt-br.lex 2021-01-25 00:17:07.000000000 +0400 @@ -82,8 +82,7 @@ 'bac_SERVER_WILL_REBOOT' => 'Seu servidor irá reinicializar agora.', 'bac_NO_UID_FOR_NAME' => 'Incapaz de achar uid para usuário chamado:', 'bac_PAGE_REFRESH_IN' => ' Esta página irá recarregar em {$sec} segundos, ou clique aqui. ', -'bac_Backup or restore' => 'Backup ou restauração', -'bac_BACKUP_DESKTOP_TOO_BIG' => '

Seu servidor tem muitos dados para que um backup para desktop seja confiável.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Seu servidor tem muitos dados para que um backup para desktop seja confiável.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' O backup para micro da rede local está desativado ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' O backup para micro da rede local está atualmente habilitado. ', 'bac_WKBACKUPS_RUN_AT' => 'Backup para micro da rede local será executado às:', @@ -182,3 +181,4 @@ 'bac_local removable disk' => 'disco local removível', 'bac_Mounted disk' => 'Montado', 'bac_ERROR_WHEN_TESTING_REMOTE_SERVER' => 'Os parâmetros foram salvos, contudo o servidor remoto não foi encontrado, por favor verifique suas configurações.', +'Backup or restore' => 'Backup ou restauração', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_pt.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_pt.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_pt.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_pt.lex 2021-01-25 22:44:33.035000000 +0400 @@ -83,7 +83,7 @@ 'bac_NO_UID_FOR_NAME' => 'Incapaz de achar uid para usuário chamado:', 'bac_PAGE_REFRESH_IN' => ' Esta página irá recarregar em {$sec} segundos, ou click aqui. ', 'Backup or restore' => 'Backup ou restauração', -'bac_BACKUP_DESKTOP_TOO_BIG' => '
Seu servidor tem muitos dados para que um backup para desktop seja confiável.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Seu servidor tem muitos dados para que um backup para desktop seja confiável.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' O backup para micro da rede local está desativado ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' O backup para micro da rede local está atualmente habilitado. ', 'bac_WKBACKUPS_RUN_AT' => 'Backup para micro da rede local será executado às:', @@ -138,11 +138,11 @@ 'bac_SELECT_DATE_BEFORE' => 'Restaurar arquivos mais recentes que', 'bac_FILTER_EXPRESSION' => 'Nomes filtrados por', 'bac_READ_COMPLETE' => ' Você pode escolher todos os diretórios e arquivos que você não quer restaurar na lista mostrada (use CTRL ou SHIFT para seleção múltipla).
ATENÇÃO : Se você selecionar um diretório, todos arquivos e subdiretórios contidos abaixo dele serão restaurados.

O padrão é que somente a versão mais recente dos arquivos selecionados seja restaurada, mas se você especificar uma data no formato [ [ [yyyy/]mm/]dd-]hh:mm[:ss] o processo restaurará apenas a versão mais recente modificadaANTES da data fornecida. ', -'bac_ERR_INVALID_SELDATE' => 'Formato de data inválido, deve ser[ [ [yyyy/]mm/]dd-]hh:mm[:ss]. ie: 2005/12/31-08:23:32 or 10-08:32 or 08:32', +'bac_ERR_INVALID_SELDATE' => 'Formato de data inválido, deve ser ~[ ~[ ~[yyyy/~]mm/~]dd-~]hh:mm~[:ss~]. ie: 2005/12/31-08:23:32 or 10-08:32 or 08:32', 'bac_SELECT_FILES_TO_RESTORE' => 'Selecione arquivos para restaurar', 'bac_ERR_WHILE_UNMOUNTING' => 'Ocorreu um erro quando desmontando o compartilhamento remoto', 'bac_ERR_DAR_CATALOG' => 'Ocorreu um erro quando usando o catalogo do DAR', -'bac_COMPRESSION_LEVEL' => 'Nivel de compressão do backup [0-9]', +'bac_COMPRESSION_LEVEL' => 'Nivel de compressão do backup ~[0-9~]', 'bac_FULL_ONLY_ON' => 'Backup completo é permitido em', 'bac_ERR_INVALID_COMPRESSION' => 'O nível de compressão deve ser definido entre 0 (sem compressão) e 9 (compressão máxima)', 'bac_DOW' => 'Domingo Segunda Terça Quarta Quinta Sexta Sábado TodosDias', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_ru.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_ru.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_ru.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_ru.lex 2021-01-25 00:17:47.000000000 +0400 @@ -83,7 +83,7 @@ 'bac_NO_UID_FOR_NAME' => 'Не удалось получить uid для пользователя с именем:', 'bac_PAGE_REFRESH_IN' => ' Эта страница обновит отображение состояния в течении {$sec} секунд, или нажимте здесь. ', 'bac_Backup or restore' => 'Резервное копирование или восстановление', -'bac_BACKUP_DESKTOP_TOO_BIG' => '

Your server has too much data for a reliable backup to desktop.
', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Your server has too much data for a reliable backup to desktop.', 'bac_WORKSTN_BACKUPS_DISABLED' => ' Резервные копии рабочей станции отключены ', 'bac_WORKSTN_BACKUPS_ENABLED' => ' Резервные копии рабочей станции в настоящее время включены. ', 'bac_WKBACKUPS_RUN_AT' => 'Regular workstation backups will run at:', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Reboot/reboot_fr.lex smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Reboot/reboot_fr.lex --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Reboot/reboot_fr.lex 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N/Modules/Reboot/reboot_fr.lex 2021-01-27 00:17:02.356000000 +0400 @@ -4,6 +4,7 @@ 'rbo_DESC_REBOOT' => 'Votre serveur a commencé le processus de redémarrage.', 'rbo_RECONFIGURE_SUCCEEDED' => 'Lancement réussi de la requête de reconfiguration.', 'rbo_DESC_RECONFIGURE' => 'Votre serveur a commencé le processus de reconfiguration et de redémarrage.', +'rbo_SHUTDOWN_SUCCEEDED' => 'Lancement réussi de la requête d\'arrêt.', 'rbo_DESC_SHUTDOWN' => 'Votre serveur a commencé le processus d\'arrêt. L\'exécution complète de ce processus pourra durer quelques minutes, après lesquelles vous pourrez couper l\'alimentation.', 'rbo_LABEL_REBOOT' => 'Action', 'rbo_DESCRIPTION' => ' Vous pouvez arrêter, redémarrer ou effectuer une reconfiguration complète de votre serveur à partir de cette page. Vous devez lancer la séquence d\'arrêt avant de couper l\'alimentation. L\'exécution de ces fonctions peut durer quelques minutes. Lorsque vous cliquerez sur "Exécuter" l\'opération se lancera immédiatement, alors soyez prêt ! ', diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N.pm smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N.pm --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr/I18N.pm 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr/I18N.pm 2021-01-25 14:16:26.044000000 +0400 @@ -1,5 +1,3 @@ -#!/usr/bin/perl -wT - package SrvMngr::I18N; use strict; diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr.pm smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr.pm --- smeserver-manager-0.1.2.old/root/usr/share/smanager/lib/SrvMngr.pm 2021-01-25 12:06:11.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/lib/SrvMngr.pm 2021-01-27 21:32:20.934000000 +0400 @@ -23,7 +23,7 @@ use SrvMngr::Model::Main; -our $VERSION = '1.205'; +our $VERSION = '1.206'; $VERSION = eval $VERSION; use Exporter 'import'; @@ -54,6 +54,8 @@ $self->mode( $self->config->{mode} || 'production' ); #'development' + $ENV{'MOJO_SMANAGER_DEBUG'} = $self->config->{debug} || 0; + $self->setup_plugins; $self->setup_helpers; @@ -65,6 +67,10 @@ $self->setup_routing; $self->setup_hooks; + + # no data in cache + $self->renderer->cache->max_keys(0); + } @@ -120,7 +126,7 @@ my $self = shift; my $message = shift || $self->l('acs_NO'); $self->flash( error => $message ); - $self->redirect_to( $self->home_page ); + $self->redirect_to( $self->home_page, status => 403 ); return 0; }); @@ -166,7 +172,7 @@ $self->helper(log_req => sub { my $c = shift; - my $mess = shift; + my $mess = shift || ''; my $method = $c->req->method; my $url = $c->req->url; @@ -613,7 +619,7 @@ # my $lang = (split(/,/, $c->tx->req->headers->accept_language))[0]; ## convert xx_XX lang format to xx-xx + delete .UTFxx + lowercase # $lang =~ s/_(.*)\..*$/-${1}/; # just keep 'en-us' - $lang = lc( substr( $lang,0,2 ) ); # just keep 'en' + ##$lang = lc( substr( $lang,0,2 ) ); # just keep 'en' $panel = '/initial' if ($panel eq '/' or $panel eq ''); diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/script/srvmngr smeserver-manager-0.1.2/root/usr/share/smanager/script/srvmngr --- smeserver-manager-0.1.2.old/root/usr/share/smanager/script/srvmngr 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/script/srvmngr 2021-01-27 21:30:06.774000000 +0400 @@ -25,6 +25,7 @@ #Application $ENV{MOJO_APP} ||= 'SrvMngr'; $ENV{MOJO_REVERSE_PROXY} ||= '/smanager'; +$ENV{MOJO_SMANAGER_DEBUG} ||= 0; $ENV{SRVMNGR_HOME} ||= "$FindBin::Bin/.."; # Start command diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_desktop_backup.html.ep.inac smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_desktop_backup.html.ep.inac --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_desktop_backup.html.ep.inac 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_desktop_backup.html.ep.inac 1970-01-01 04:00:00.000000000 +0400 @@ -1,28 +0,0 @@ -% layout 'default', title => "Sme server 2 - desktop-backup"; - -% content_for 'module' => begin - -
- % if ($config->{debug} == 1) { -

- %= dumper $c->current_route - %= dumper $bac_datas -

- % } - - % if ( stash 'error' ) { -
- %= $c->render_to_string(inline => stash 'error') -
- %} - -

<%= $title%>

- -

- %=l 'bac_DESKTOP_BACKUP' -


- %= hidden_field 'Function' => $bac_datas->{'function'} - -
- -% end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/backdown.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/backdown.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/backdown.html.ep 1970-01-01 04:00:00.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/backdown.html.ep 2021-01-16 23:49:54.000000000 +0400 @@ -0,0 +1,56 @@ +<% + + 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); + return ($c->l('bac_OPERATION_STATUS_REPORT'). + $c->l('bac_ERR_PRE_BACKUP')); + } + + my $clvl = $c->stash('compressionlevel'); + my $cmd = "/bin/tar --directory / --create @{$c->stash('directories')} --file=-" + . "@{$c->stash('exclude')} | /usr/bin/gzip $clvl "; + + my $success = open my $fh, '-|', $cmd; + unless ($success) { return "Error dowload command."; }; + + # Write chunk + $c->res->headers->content_type('application/x-tar'); + $c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/); + + my $cb; + $cb = sub { + my $c = shift; + my $size = 500 * 1024; + my $length = sysread($fh, my $buffer, $size); + unless ($length) { + close $fh; + undef $cb; + $c->finish; + return; + } + $c->write_chunk($buffer, $cb); + }; + $c->$cb; + + # Remove the dumped tables. + $status = system("/sbin/e-smith/signal-event", "post-backup", "desktop"); + if ($status) { + desktopBackupRecordStatus($backup_rec, 'post-backup', $status); + die ($c->l('bac_ERR_POST_BACKUP'),"\n"); + } + + $now = time(); + $backup_rec->set_prop('EndEpochTime', "$now"); + $backup_rec->set_prop('Result', "0"); + +%> diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_tape_configure.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_tape_configure.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_tape_configure.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_tape_configure.html.ep 2021-01-25 22:34:56.434000000 +0400 @@ -71,16 +71,13 @@ % param 'ReminderAMPM' => $bac_datas->{reminderAMPM} unless param 'ReminderAMPM'; %= select_field 'ReminderAMPM' => ['AM', 'PM'], class => 'input' -

- -
+


%= hidden_field 'Function' => $bac_datas->{'function'} - +
%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action' +
% end - - % end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_tape_restore.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_tape_restore.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_tape_restore.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_tape_restore.html.ep 2021-01-25 22:35:24.664000000 +0400 @@ -30,10 +30,10 @@ %= hidden_field 'Function' => $bac_datas->{'function'} +
%= submit_button $c->l('bac_RESTORE_FROM_TAPE'), class => 'action' +
% end - - % end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/backup.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/backup.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/backup.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/backup.html.ep 2021-01-25 00:32:02.000000000 +0400 @@ -10,6 +10,11 @@

% } + % if ( stash 'warning' ) { +
+ %= $c->render_to_string(inline => stash 'warning') +
+ %} % if ( stash 'error' ) {
%= $c->render_to_string(inline => stash 'error') @@ -17,10 +22,9 @@ %}

<%= $title%>

- -
Still incomplete click here for previous version --> + <%= $c->render_to_string(inline => (l 'bac_BACKUP_DESC_DAR', $bac_datas->{module}, $bac_datas->{dumpsize}, $bac_datas->{tarsize})) %> @@ -34,7 +38,7 @@

%=l 'bac_TAPE_BACKUPS', - %= $bac_datas->{'backupStatus'}.'.' + %= $c->l(uc($bac_datas->{'backupStatus'})).'.' % if ( $bac_datas->{'backupStatus'} eq 'enabled' ) { %= $c->l('bac_BACKUPS_RUN_AT') @@ -49,7 +53,7 @@

%=l 'bac_WORKSTN_BACKUPS', - %= $bac_datas->{'backupwkStatus'}.'.' + %= $c->l(uc($bac_datas->{'backupwkStatus'})).'.' % if ( $bac_datas->{'backupwkStatus'} eq 'enabled' ) { %= $c->l('bac_WKBACKUPS_RUN_AT') @@ -66,7 +70,9 @@


+
%= submit_button $c->l('PERFORM'), class => 'action' +
% end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_configure1.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_configure1.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_configure1.html.ep 1970-01-01 04:00:00.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_configure1.html.ep 2021-01-24 17:37:11.000000000 +0400 @@ -0,0 +1,156 @@ +% layout 'default', title => "Sme server 2 - backup - conf"; + +% content_for 'module' => begin + +
+ % if ($config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $bac_datas +

+ % } + + % if ( stash 'error' ) { +
+ %= $c->render_to_string(inline => stash 'error') +
+ %} + +

<%= $title%>

+ +

+ %=l 'bac_CONFIGURE_WORKSTN_BACKUP' +

+ + %= $c->render_to_string(inline => (l 'bac_CONFIGURE_WORKSTN_BACKUP_DESC')) + + %= form_for '/backupd' => (method => 'POST') => begin + +

+ + %=l 'bac_ENABLE_WORKSTN_BACKUP' + + % if ( $bac_datas->{status} eq 'checked' ) { + + %} else { + %= check_box 'Workstnbackup' + %} + + +

+

+ %= l 'bac_WORKSTATION_BACKUP_DEST' +


+ + % if ( $bac_datas->{vfstype} =~ m/cifs|nfs/s ) { + + %=l 'bac_WORKSTN_NAME' + + % param 'BackupwkStation' => $bac_datas->{station} unless param 'BackupwkStation'; + %= text_field 'BackupwkStation', size => 20, class => 'input' +
+ %} + % if ( $bac_datas->{vfstype} eq 'usb' ) { + + %=l 'bac_local removable disk' + + % param 'BackupwkFolder' => $bac_datas->{mount} unless param 'BackupwkFolder'; + %= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => 'input' +
+ % } elsif ( $bac_datas->{vfstype} eq 'mnt') { + + %=l 'bac_Mounted disk' + + % param 'BackupwkFolder' => $bac_datas->{folder} unless param 'BackupwkFolder'; + %= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => 'input' +
+ % } else { + + %=l 'bac_SHARED_FOLDER_NAME' + + % param 'BackupwkFolder' => $bac_datas->{folder} unless param 'BackupwkFolder'; + %= text_field 'BackupwkFolder', size => 20, class => 'input' +
+ %} + % if ( $bac_datas->{vfstype} eq 'cifs' ) { + + %=l 'bac_WORKSTN_LOGIN' + + % param 'BackupwkLogin' => $bac_datas->{login} unless param 'BackupwkLogin'; + %= text_field 'BackupwkLogin', size => 12, class => 'input' +
+ %=l 'bac_PASSWORD' + + % param 'BackupwkPassword' => $bac_datas->{password} unless param 'BackupwkPassword'; + %= password_field 'BackupwkPassword', size => 12, class => 'input' + + %} +


+ %= l 'bac_WORKSTN_BACKUP_SETTINGS' +


+ +

+ %=l 'bac_NUMBER_OF_SETS' + + % param 'SetsNumber' => $bac_datas->{setsNumber} unless param 'SetsNumber'; + %= text_field 'SetsNumber', size => '3' + + %=l 'bac_NUMBER_OF_FILES_IN_SET' + + % param 'Filesinset' => $bac_datas->{filesinset} unless param 'Filesinset'; + %= text_field 'Filesinset', size => '3' +

+ +

+ + %=l 'bac_WORKSTN_BACKUP_TIME' + + % param 'BackupwkHour' => $bac_datas->{hour} unless param 'BackupwkHour'; + %= text_field 'BackupwkHour', size => '2' + % param 'BackupwkMin' => $bac_datas->{min} unless param 'BackupwkMin'; + %= text_field 'BackupwkMin', size => '2' + + %=l 'AM/PM:' + + % param 'BackupwkAMPM' => $bac_datas->{ampm} unless param 'BackupwkAMPM'; + %= select_field 'BackupwkAMPM' => ['AM', 'PM'], class => 'input' + +

+ +

+ %=l 'bac_WORKSTN_TIMEOUT' + + % param 'BackupwkTimeout' => $bac_datas->{timeout} unless param 'BackupwkTimeout'; + %= text_field 'BackupwkTimeout', size => '2' + + %=l 'bac_INC_ONLY_TIMEOUT' + + % if ( $bac_datas->{incOnlyTimeout} eq 'checked' ) { + + %} else { + %= check_box 'IncOnlyTimeout' + %} +

+ +

+ + %=l 'bac_COMPRESSION_LEVEL' + + % param 'Compression' => $bac_datas->{compression} unless param 'Compression'; + %= text_field 'Compression', size => '1' + + %=l 'bac_FULL_ONLY_ON' + + % param 'Dof' => $bac_datas->{dof} unless param 'Dof'; + %= select_field 'Dof' => $c->get_dow_list(), class => 'input' +


+ + + %= hidden_field 'Function' => $bac_datas->{function} + %= hidden_field 'VFSType' => $bac_datas->{vfstype} +
+ %= submit_button $c->l('bac_UPDATE_CONF'), class => 'action' +
+ % end +
+% end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_configure.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_configure.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_configure.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_configure.html.ep 2021-01-24 19:59:07.000000000 +0400 @@ -18,7 +18,7 @@

<%= $title%>

- %= form_for '/backupd' => (method => 'POST') => begin + %= form_for '/backup' => (method => 'POST') => begin

%=l 'bac_CONFIGURE_WORKSTN_BACKUP' @@ -31,7 +31,7 @@ %= $bac_datas->{status}
- %= $c->render_to_string(inline => $c->getWorkstnBackupConfig()) + %= $c->render_to_string(inline => $c->workstnBackupConfig())

%= l 'bac_WORKSTATION_BACKUP_SETCONF' @@ -43,8 +43,10 @@ %= select_field 'VFSType' => $c->get_VFSType_options(), class => 'input'

- %= hidden_field 'Function' => $bac_datas->{'function'} + %= hidden_field 'Function' => $bac_datas->{'function'} . '1' +
%= submit_button $c->l('NEXT'), class => 'action' +
% end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_restore1.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_restore1.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_restore1.html.ep 1970-01-01 04:00:00.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_restore1.html.ep 2021-01-26 21:27:16.000000000 +0400 @@ -0,0 +1,38 @@ +% layout 'default', title => "Sme server 2 - restore"; + +% content_for 'module' => begin + +
+ % if ($config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $bac_datas +

+ % } + + % if ( stash 'error' ) { +
+ %= $c->render_to_string(inline => stash 'error') +
+ %} + +

<%= $title%>

+ + %= form_for '/backupd' => (method => 'POST') => begin + +

+ %=l 'bac_WORKSTN_RESTORE' +

+

+ %= $c->render_to_string(inline => $bac_datas->{restore_log}) +

+ %=l 'bac_YOU_MUST_REBOOT' +

+ %= hidden_field 'Function' => $bac_datas->{'function'} +
+ %= submit_button $c->l('bac_REBOOT'), class => 'action' +
+ % end +
+ +% end \ Pas de fin de ligne à la fin du fichier diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_restore.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_restore.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_restore.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_restore.html.ep 2021-01-25 22:57:21.922000000 +0400 @@ -1,4 +1,4 @@ -% layout 'default', title => "Sme server 2 - backup"; +% layout 'default', title => "Sme server 2 - restore"; % content_for 'module' => begin @@ -21,17 +21,26 @@ %= form_for '/backupd' => (method => 'POST') => begin

- %=l 'bac_RESTORE_CONF_FROM_WORKSTN' + %=l 'bac_WORKSTN_RESTORE'

- %= $c->render_to_string(inline => (l 'bac_RESTORE_CONF_FROM_WORKSTN_DESC')) +

+ % if ($bac_datas->{status} ne 'enabled') { + %= $c->render_to_string(inline => (l 'bac_CONFIGURATION_TO_BE_DONE')) + % } else { + %= $c->render_to_string(inline => (l 'bac_RESTORE_CONF_FROM_WORKSTN_DESC') . ' ' . $c->get_shared_folder_to_verify()) + %} + +

+ %=l 'bac_SELECT_BACKUP_FILE' + + %= select_field 'Backupset' => $c->get_Backupset_options(), class => 'input' +

-
%= hidden_field 'Function' => $bac_datas->{'function'} +
%= submit_button $c->l('bac_RESTORE_FROM_WORKSTN'), class => 'action' - +
% end -
- % end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore1.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore1.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore1.html.ep 1970-01-01 04:00:00.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore1.html.ep 2021-01-25 20:18:40.000000000 +0400 @@ -0,0 +1,51 @@ +% layout 'default', title => "Sme server 2 - backup"; + +% content_for 'module' => begin + +
+ % if ($config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $bac_datas +

+ % } + + % if ( stash 'error' ) { +
+ %= $c->render_to_string(inline => stash 'error') +
+ %} + +

<%= $title%>

+ + +

<%=l 'bac_WORKSTN_SELECTIVE_RESTORE' %>


+ + %= $c->render_to_string(inline => (l 'bac_READ_COMPLETE')) + + %= form_for '/backupd' => (method => 'POST') => begin + +
+ %=l 'bac_SELECT_FILES_TO_RESTORE' + + %= select_field 'Restorefiles' => $c->get_Restorefiles_options($bac_datas->{'filterexp'},$bac_datas->{'backupset'}), class => 'input', multiple => 1, size => 15 +
+ +
+ %=l 'bac_SELECT_DATE_BEFORE' + + %= text_field 'Seldatebefore', size => 32, class => 'input' +
+
+ %= hidden_field 'Function' => $bac_datas->{'function'} + %= hidden_field 'Backupset' => $bac_datas->{'backupset'} + %= hidden_field 'Filterexp' => $bac_datas->{'filterexp'} + +
+ %= submit_button $c->l('PERFORM'), class => 'action' +
+ + % end + +
+% end \ Pas de fin de ligne à la fin du fichier diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore2.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore2.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore2.html.ep 1970-01-01 04:00:00.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore2.html.ep 2021-01-21 16:51:14.000000000 +0400 @@ -0,0 +1,34 @@ +% layout 'default', title => "Sme server 2 - backup"; + +% content_for 'module' => begin + +
+ % if ($config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $bac_datas +

+ % } + + % if ( stash 'error' ) { +
+ %= $c->render_to_string(inline => stash 'error') +
+ %} + +

<%= $title%>

+

<%=l 'bac_WORKSTN_SELECTIVE_RESTORE' %>

+
+ %= $c->render_to_string(inline => $bac_datas->{restore_log}) +
+ + %= form_for '/backupd' => (method => 'POST') => begin + %= hidden_field 'Function' => $bac_datas->{'function'} +
+ %= submit_button $c->l('NEXT'), class => 'action' +
+ + % end + +
+% end \ Pas de fin de ligne à la fin du fichier diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_sel_restore.html.ep 2021-01-20 18:14:49.000000000 +0400 @@ -20,16 +20,28 @@ %= form_for '/backupd' => (method => 'POST') => begin -

- %=l 'bac_WORKSTN_SELECTIVE_RESTORE' -

- +

<%=l 'bac_WORKSTN_SEL_RESTORE' %>

- %= $c->render_to_string(inline => (l 'bac_XXX_DESC')) + %= $c->render_to_string(inline => (l 'bac_WORKSTN_SEL_REST_DESC') . ' ' . $c->get_shared_folder_to_verify()) +

<%=l 'bac_BACKUP_CHOICE' %>

+ +
+ %=l 'bac_SELECT_BACKUP_FILE' + + %= select_field 'Backupset' => $c->get_Restoreset_options(), class => 'input' +
+ +
+ %=l 'bac_FILTER_EXPRESSION' + + %= text_field 'Filterexp', size => 32, class => 'input' +

%= hidden_field 'Function' => $bac_datas->{'function'} - %= submit_button $c->l('bac_RESTORE_FROM_WORKSTN'), class => 'action' +
+ %= submit_button $c->l('PERFORM'), class => 'action' +
% end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_verify1.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_verify1.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_verify1.html.ep 1970-01-01 04:00:00.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_verify1.html.ep 2021-01-19 21:06:59.000000000 +0400 @@ -0,0 +1,37 @@ +% layout 'default', title => "Sme server 2 - backup - verify"; +% content_for 'module' => begin + +
+ % if ($config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $bac_datas->{function} + +

+ % } + + % if ( stash 'error' ) { +
+ %= $c->render_to_string(inline => stash 'error') +
+ %} + +

<%= $title%>

+ +

<%= l 'bac_VERIFY_WORKSTN_BACKUP_FILE' %>

+ +
+ %= $c->render_to_string(inline => $bac_datas->{files_list}) +
+ + %= form_for '/backupd' => (method => 'POST') => begin + + %= hidden_field 'Function' => $bac_datas->{'function'} + +
+ %= submit_button $c->l('NEXT'), class => 'action' +
+ + % end +
+% end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_verify.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_verify.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/back_workstn_verify.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/back_workstn_verify.html.ep 2021-01-19 23:29:32.000000000 +0400 @@ -1,5 +1,4 @@ -% layout 'default', title => "Sme server 2 - backup"; - +% layout 'default', title => "Sme server 2 - backup - verify"; % content_for 'module' => begin
@@ -18,20 +17,37 @@

<%= $title%>

- %= form_for '/backupd' => (method => 'POST') => begin -

%=l 'bac_VERIFY_WORKSTN_BACKUP_FILE'

- %= $c->render_to_string(inline => (l 'bac_CONFIGURATION_TO_BE_DONE')) + %= form_for '/backup' => (method => 'POST') => begin -
- %= hidden_field 'Function' => $bac_datas->{'function'} + % if ($bac_datas->{status} ne 'enabled') { + %= $c->render_to_string(inline => (l 'bac_CONFIGURATION_TO_BE_DONE')) + % } else { + %= $c->render_to_string(inline => (l 'bac_VERIFY_WORKSTN_BACKUP_DESC') . ' ' . $c->get_shared_folder_to_verify()) + %} +

+ %=l 'bac_SELECT_BACKUP_FILE' + + %= select_field 'Backupset' => $c->get_Backupset_options(), class => 'input' +
+ +

+ %=l 'bac_CHECK_TO_VERIFY_FULL_RESTORE' + + %= check_box 'Verifyall' +


+ + %=l 'bac_CHECK_INTEGRITY_WARNING' + +

+ %= hidden_field 'Function' => $bac_datas->{'function'} . '1' +
%= submit_button $c->l('bac_VERIFY'), class => 'action' +
% end -
- % end diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/layouts/default.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/layouts/default.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/layouts/default.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/layouts/default.html.ep 2021-01-24 20:45:38.000000000 +0400 @@ -43,13 +43,16 @@ % }
- % if (flash 'success') {
%= $c->render_to_string(inline => flash 'success')
% } - + % if ( flash 'warning' ) { +
+ %= $c->render_to_string(inline => flash 'warning') +
+ %} % if ( flash 'error' ) {
%= $c->render_to_string(inline => flash 'error') diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/module.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/module.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/module.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/module.html.ep 2021-01-27 00:38:22.000000000 +0400 @@ -5,8 +5,8 @@

%= $title -

- %= $modul +
+ %= $c->render_to_string( inline => stash 'modul' )
%end \ Pas de fin de ligne à la fin du fichier diff -urN smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/reboot.html.ep smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/reboot.html.ep --- smeserver-manager-0.1.2.old/root/usr/share/smanager/themes/default/templates/reboot.html.ep 2020-11-19 11:53:26.000000000 +0400 +++ smeserver-manager-0.1.2/root/usr/share/smanager/themes/default/templates/reboot.html.ep 2021-01-27 00:28:23.000000000 +0400 @@ -17,8 +17,7 @@ <% my $btn = l('PERFORM'); %> - % $modul = $c->render_to_string(inline => $c->l('rbo_DESCRIPTION')); - %= $modul + %= $c->render_to_string(inline => $c->l('rbo_DESCRIPTION'))
%= form_for 'reboot' => (method => 'POST') => begin