1 |
slords |
1.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 |
|
|
+} |