/[smeserver]/rpms/e-smith-backup/sme8/e-smith-backup-1.15.0-DarWorkstation.patch
ViewVC logotype

Contents of /rpms/e-smith-backup/sme8/e-smith-backup-1.15.0-DarWorkstation.patch

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


Revision 1.2 - (show annotations) (download)
Tue Oct 7 19:27:49 2008 UTC (15 years, 7 months ago) by slords
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +0 -0 lines
FILE REMOVED
New streams

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

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