%= $title -
- %= $modul ++ %= $c->render_to_string( inline => stash 'modul' )
%= form_for 'reboot' => (method => 'POST') => begin
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 ( 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. 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. 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. 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. Les deux méthodes de restauration vous permettent de restaurer vos fichiers de configuration et les données des utilisateurs. 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é. 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. Les deux méthodes de restauration vous permettent de restaurer vos fichiers de configuration et les données des utilisateurs. 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é. 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. 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. 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. Cette action restaurera les fichiers de configuration du serveur et les données des utilisateurs à partir d\'une sauvegarde sur un ordinateur distant. 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.
- %= dumper $c->current_route
- %= dumper $bac_datas
-
';
+ } 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').'';
+ while (
';
+
+ 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 $complete = 0;
+ while (
';
+
+ 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 $complete = 0;
+ while (
';
+ 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 (
$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 .= '';
+ while (
';
+ 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 (
'.
- $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') . "/$host/$share>\n" . $err) if $err;
+
+ # mount the backup directory
+ $err = dmount($host,$share,$mntdir,'','',$VFSType);
+ return ($c->l('bac_ERR_MOUNTING_SMBSHARE') . "/$host/$share>\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' => '
Sicherungsdateien aus folgendem Verzeichnis werden geprüft: ',
+'bac_VERIFY_WORKSTN_BACKUP_DESC' => '
Sicherungsdateien aus folgendem Verzeichnis werden geprüft: ',
'bac_RESTORE_CONF_FROM_WORKSTN' => 'Server Einstellungen aus Workstation Backup wiederherstellen',
'bac_RESTORE_CONF_FROM_WORKSTN_DESC' => '
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' => '
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' => '
Actuellement, votre disque dur contient $dumpsize de données.
Idéalement, la restauration ne devrait se faire que sur un serveur nouvellement installé.
Actuellement, votre disque dur contient [_2] de données.
Idéalement, la restauration ne devrait se faire que sur un serveur nouvellement installé.
Cette restauration ne devrait être effectuée que sur un serveur nouvellement installé.
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' => '
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' => '
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' => '
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' => ' <%= $title%>
-
-
- %=l 'bac_DESKTOP_BACKUP'
-
- %= hidden_field 'Function' => $bac_datas->{'function'}
-
-
%=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 @@
+ %= dumper $c->current_route + %= dumper $bac_datas +
+ % } + + % if ( stash 'error' ) { ++ + %=l 'bac_ENABLE_WORKSTN_BACKUP' + + % if ( $bac_datas->{status} eq 'checked' ) { + + %} else { + %= check_box 'Workstnbackup' + %} + + +
++ %=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' +
+ %= dumper $c->current_route + %= dumper $bac_datas +
+ % } + + % if ( stash 'error' ) { ++ %= $c->render_to_string(inline => $bac_datas->{restore_log}) +
+ %=l 'bac_YOU_MUST_REBOOT' +
+ %= hidden_field 'Function' => $bac_datas->{'function'} ++ %= dumper $c->current_route + %= dumper $bac_datas +
+ % } + + % if ( stash 'error' ) { ++ %= dumper $c->current_route + %= dumper $bac_datas +
+ % } + + % if ( stash 'error' ) { ++ %= dumper $c->current_route + %= dumper $bac_datas->{function} + +
+ % } + + % if ( stash 'error' ) { ++ %=l 'bac_CHECK_TO_VERIFY_FULL_RESTORE' + + %= check_box 'Verifyall' +