1 |
diff -up smeserver-thinclient-2.1/root/etc/e-smith/web/functions/thinclient.archive smeserver-thinclient-2.1/root/etc/e-smith/web/functions/thinclient |
2 |
--- smeserver-thinclient-2.1/root/etc/e-smith/web/functions/thinclient.archive 2016-04-03 21:25:05.000000000 +1000 |
3 |
+++ smeserver-thinclient-2.1/root/etc/e-smith/web/functions/thinclient 2016-04-25 12:45:56.818272258 +1000 |
4 |
@@ -27,6 +27,8 @@ use esmith::cgi; |
5 |
use esmith::ConfigDB; |
6 |
use esmith::util; |
7 |
use FileHandle; |
8 |
+use File::Basename; |
9 |
+use File::Path qw(make_path remove_tree); |
10 |
|
11 |
sub showInitial ($$$$); |
12 |
sub showStatusReport ($$$$); |
13 |
@@ -40,7 +42,8 @@ sub saveDistribution ($); |
14 |
sub saveConfiguration ($); |
15 |
sub showDistributionPanel ($$$); |
16 |
sub showWorkstationPanel ($$$); |
17 |
- |
18 |
+sub checkarchive ($); |
19 |
+sub readini($); |
20 |
|
21 |
BEGIN |
22 |
{ |
23 |
@@ -61,8 +64,8 @@ my $pxeclients = esmith::ConfigDB->open( |
24 |
my $hosts = esmith::ConfigDB->open_ro('hosts'); |
25 |
|
26 |
|
27 |
-my $version = '2.1-2'; |
28 |
+my $version = '2.1-3'; |
29 |
my $email = 'trevorbatley@users.sourceforge.net'; |
30 |
my $title = 'Thin Client Configuration'; |
31 |
my $copyright = 'copyright (c) 2004, Trevor Batley, <a href=mailto:'.$email.'>'.$email.'</a>'; |
32 |
my $sendreports = 'Please raise Bugs and Feature Requests in <a target=_blank href=http://bugs.contribs.org/>Bugzilla</a> (SMEContribs => smeserver-thinclient)'; |
33 |
@@ -384,12 +387,12 @@ sub showPXEGlobals($) |
34 |
sub showPXEDists($) |
35 |
{ |
36 |
my ($q) = @_; |
37 |
- my $tftproot = "/tftproot/"; |
38 |
+ my $tftproot = "/tftpboot/"; |
39 |
if ($config->get('tftpd')) |
40 |
{ |
41 |
if ($config->get('tftpd')->prop('status') eq 'enabled') |
42 |
{ |
43 |
- $tftproot = $config->get('tftpd')->prop('tftproot') |
44 |
+ $tftproot = $config->get('tftpd')->prop('tftproot') || "/tftpboot/"; |
45 |
} |
46 |
} |
47 |
|
48 |
@@ -430,30 +433,30 @@ sub showPXEDists($) |
49 |
foreach my $dist (sort @distkeys) |
50 |
{ |
51 |
my $distrec = $pxeclients->get($dist); |
52 |
- my $dtype = $distrec->prop('install') || "Manual"; |
53 |
- if ($dtype ne "Manual") |
54 |
+ my $install = $distrec->prop('install') || "Manual"; |
55 |
+ if ($install eq "Manual" || $install eq 'Archive') |
56 |
{ |
57 |
print $q->Tr (esmith::cgi::genSmallCell ($q, $dist, 'normal'), |
58 |
- esmith::cgi::genSmallCell ($q, $tftproot . ($distrec->prop('dir') || ""), 'normal'), |
59 |
- esmith::cgi::genSmallCell ($q, "RPM", 'normal'), |
60 |
- esmith::cgi::genSmallCell ($q, |
61 |
+ esmith::cgi::genSmallCell ($q, $tftproot.($distrec->prop('dir') || ""), 'normal'), |
62 |
+ esmith::cgi::genSmallCell ($q, $install, 'normal'), |
63 |
+ esmith::cgi::genCell ($q, |
64 |
$q->a ({href => $q->url (-absolute => 1) |
65 |
. "?state=showDist&acct=Delete&dist=" |
66 |
- . $dist}, 'Remove...'), 'normal')); |
67 |
+ . $dist}, 'Remove...'), 'normal'), |
68 |
+ esmith::cgi::genCell ($q, |
69 |
+ $q->a ({href => $q->url (-absolute => 1) |
70 |
+ . "?state=showDist&acct=Change&dist=" |
71 |
+ . $dist}, 'Modify...'), 'normal')); |
72 |
} |
73 |
else |
74 |
{ |
75 |
print $q->Tr (esmith::cgi::genSmallCell ($q, $dist, 'normal'), |
76 |
esmith::cgi::genSmallCell ($q, $tftproot . ($distrec->prop('dir') || ""), 'normal'), |
77 |
- esmith::cgi::genSmallCell ($q, $dtype, 'normal'), |
78 |
- esmith::cgi::genSmallCell ($q, |
79 |
+ esmith::cgi::genSmallCell ($q, $install, 'normal'), |
80 |
+ esmith::cgi::genCell ($q, |
81 |
$q->a ({href => $q->url (-absolute => 1) |
82 |
. "?state=showDist&acct=Delete&dist=" |
83 |
- . $dist}, 'Remove...'), 'normal'), |
84 |
- esmith::cgi::genSmallCell ($q, |
85 |
- $q->a ({href => $q->url (-absolute => 1) |
86 |
- . "?state=showDist&acct=Change&dist=" |
87 |
- . $dist}, 'Modify...'), 'normal')); |
88 |
+ . $dist}, 'Remove...'), 'normal')); |
89 |
} |
90 |
} |
91 |
print $q->end_table; |
92 |
@@ -541,15 +544,18 @@ sub showDistributionPanel($$$) |
93 |
|
94 |
my $action = $q->param ('acct'); |
95 |
my $dist = $q->param ('dist') || ""; |
96 |
- my $dir = ""; |
97 |
- my $prog = "pxelinux.0"; |
98 |
- my $tftproot = "/tftproot/"; |
99 |
+ my $dir = $q->param ('dir') || ""; |
100 |
+ my $prog = $q->param ('prog') || "pxelinux.0"; |
101 |
+ my $ini = $q->param('ini') || ""; |
102 |
+ my $origdir = $q->param('origdir') || ""; |
103 |
+ my $install = $q->param('install') || "Manual"; |
104 |
+ my $tftproot = "/tftpboot/"; |
105 |
if ($config->get('tftpd')) |
106 |
{ |
107 |
- if ($config->get('tftpd')->prop('status') eq 'enabled') |
108 |
- { |
109 |
- $tftproot = $config->get('tftpd')->prop('tftproot') |
110 |
- } |
111 |
+ if ($config->get('tftpd')->prop('status') eq 'enabled') |
112 |
+ { |
113 |
+ $tftproot = $config->get('tftpd')->prop('tftproot') || "/tftpboot/"; |
114 |
+ } |
115 |
} |
116 |
|
117 |
esmith::cgi::genHeaderNonCacheable ($q, $config, $action . " Distribution"); |
118 |
@@ -558,18 +564,18 @@ sub showDistributionPanel($$$) |
119 |
|
120 |
if ($err ne '') {showStatusReport ($q, 'error', $err, $log)}; |
121 |
|
122 |
- print $q->start_table ({-class => "sme-noborders"}); |
123 |
- |
124 |
# --- Distribution Name |
125 |
if ($action eq 'Add') |
126 |
{ |
127 |
- print $q->p ('You can add a Distribution via a prebuilt rpm.<BR><BR>', |
128 |
- 'Select the rpm file to load from your local workstation. No checking is done on this file!', |
129 |
+ print $q->p ('You can add a Distribution via a prebuilt archive.<BR><BR>', |
130 |
+ 'Select the file to load from your local workstation. Minimal checking is done on this file!', |
131 |
); |
132 |
+ print $q->p ; |
133 |
+ print $q->start_table ({-class => "sme-noborders"}); |
134 |
print $q->Tr ( |
135 |
- $q->td ({-class => "sme-noborders-label"}, "Distribution .rpm:"), |
136 |
+ $q->td ({-class => "sme-noborders-label"}, "Archive:"), |
137 |
$q->td ({-class => "sme-noborders-content"}, |
138 |
- $q->filefield(-name => 'rpmfile', |
139 |
+ $q->filefield(-name => 'archive', |
140 |
-default => "smeserver-thinclient-<dist>-<version>.noarch.rpm", |
141 |
-size => 32))); |
142 |
|
143 |
@@ -581,67 +587,163 @@ sub showDistributionPanel($$$) |
144 |
); |
145 |
|
146 |
$dist = ""; |
147 |
+ print $q->p ; |
148 |
print $q->Tr ( |
149 |
- esmith::cgi::genNameValueRow ($q, "Name", "dist", $dist), |
150 |
- ); |
151 |
+ $q->td ({-class => "sme-noborders-label"}, "Distribution:"), |
152 |
+ $q->td ({-class => "sme-noborders-content"}, $q->textfield (-name => "dist", -override => 1, -default => $dist, -size => 32))); |
153 |
+ print $q->Tr ( |
154 |
+ $q->td ({-class => "sme-noborders-label"}, "Directory:".$tftproot), |
155 |
+ $q->td ({-class => "sme-noborders-content"}, $q->textfield (-name => "dir", -override => 1, -default => $dir, -size => 32))); |
156 |
+ print $q->Tr ( |
157 |
+ $q->td ({-class => "sme-noborders-label"}, "Executable:"), |
158 |
+ $q->td ({-class => "sme-noborders-content"}, $q->textfield (-name => "prog", -override => 1, -default => $prog, -size => 32))); |
159 |
+ print $q->end_table; |
160 |
} |
161 |
- else |
162 |
+ elsif ($action eq 'Confirm') |
163 |
+ # Confirm ONLY applies to Distributions from an archive or if they have entered the name of an existing Distribution |
164 |
{ |
165 |
- my $install = $pxeclients->get_prop($dist, 'install') || "Manual"; |
166 |
- if ($install eq "Manual") |
167 |
+ if ($pxeclients->get($dist)) |
168 |
{ |
169 |
- print $q->p ('This ONLY alters the parameters within dhcp, so any changes required to directories or ', |
170 |
- 'files associated with your Distribution must be manually performed by you.'); |
171 |
+ print $q->p ('<B>'.$dist.'</B> already exists. Do you really want to do this? Or do you want to define a new name and directory below?'); |
172 |
} |
173 |
- # --- Warning messages |
174 |
else |
175 |
{ |
176 |
- if ($action eq 'Delete') |
177 |
- { |
178 |
- print $q->p ('This Distribution was installed as an rpm, it will be removed via rpm -e!'); |
179 |
- } |
180 |
- else |
181 |
- { |
182 |
- print $q->p ('This Distribution was installed as an rpm, we should not be able to do this!'); |
183 |
- } |
184 |
+ if ( $dir && -e "$tftproot$dir" ) |
185 |
+ { |
186 |
+ print $q->p ($tftproot.$dir.' already exists. Do you really want to put this here? Or do you want to define a new directory below?'); |
187 |
+ } |
188 |
+ } |
189 |
+ if ($ini) |
190 |
+ { |
191 |
+ print $q->p ('These values came from your uploaded archive, you can change them if you want.<BR>', |
192 |
+ 'We will move the content to the new directory, if you change it.' |
193 |
+ ); |
194 |
+ } |
195 |
+ else |
196 |
+ { |
197 |
+ my $message = "Please enter the values you want for this distribution.<BR>"; |
198 |
+ if ($install eq "Manual") |
199 |
+ { |
200 |
+ $message .= "This will just store these parameters in the database."; |
201 |
+ } |
202 |
+ else |
203 |
+ { |
204 |
+ $message .= "Files from the archive will be installed into the directory you define."; |
205 |
+ } |
206 |
+ print $q->p ($message); |
207 |
+ } |
208 |
+ print $q->p ; |
209 |
+ print $q->start_table ({-class => "sme-noborders"}); |
210 |
+ print $q->Tr ($q->td ({-class => "sme-noborders-label"}, "Distribution:"), |
211 |
+ $q->td ({-class => "sme-noborders-content"}, |
212 |
+ $q->textfield (-name => "dist", -override => 1, -default => $dist, -size => 32))); |
213 |
+ print $q->Tr ($q->td ({-class => "sme-noborders-label"}, "Directory:".$tftproot), |
214 |
+ $q->td ({-class => "sme-noborders-content"}, |
215 |
+ $q->textfield (-name => "dir", -override => 1, -default => $dir, -size => 32))); |
216 |
+ print $q->Tr ( |
217 |
+ $q->td ({-class => "sme-noborders-label"}, "Executable:"), |
218 |
+ $q->td ({-class => "sme-noborders-content"}, $q->textfield (-name => "prog", -override => 1, -default => $prog, -size => 32))); |
219 |
+ print $q->end_table; |
220 |
+ print $q->p ('Press Confirm to install this distribution in the directory defined.'); |
221 |
+ print $q->p ; |
222 |
+ print $q->hidden (-name=>'install', -value=>'archive'); |
223 |
+ } |
224 |
+ elsif ($action eq 'Delete') |
225 |
+ { |
226 |
+ my $record = $pxeclients->get($dist); |
227 |
+ $dir = $record->prop('dir') || ""; |
228 |
+ $prog = $record->prop('prog') || "pxelinux.0"; |
229 |
+ my $install = $record->prop('install') || "Manual"; |
230 |
+ print $q->p ('This will delete the '.$dist.' Distribution from the database'); |
231 |
+ if ($install eq 'Manual' || $install eq 'Archive') |
232 |
+ { |
233 |
+ if ($dir) |
234 |
+# Don't try to delete the tftp root directory :) |
235 |
+ { |
236 |
+ print $q->p ('If you want to remove the '.$tftproot.$dir.' directory, and all files, please tick "Delete the '.$tftproot.$dir.' directory and all contents?"'); |
237 |
+ } |
238 |
+ else |
239 |
+ { |
240 |
+ print $q->p ("You can't delete the $tftproot$dir directory, so you'll have to manipulate the files yourself"); |
241 |
+ } |
242 |
} |
243 |
+ else |
244 |
+ { |
245 |
+ print $q->p ('This Distribution was installed as an rpm, it will be removed via rpm -e!<BR>', |
246 |
+ 'Which will remove all associated files and database entries.', |
247 |
+ ); |
248 |
+ } |
249 |
+ print $q->p ; |
250 |
+ print $q->start_table ({-class => "sme-noborders"}); |
251 |
print $q->Tr( |
252 |
$q->td ({-class => "sme-noborders-label"}, "Name: "), |
253 |
$q->td({-class => "sme-noborders-content"}, $dist), |
254 |
); |
255 |
- |
256 |
- my $record = $pxeclients->get($dist); |
257 |
- $dir = $record->prop('dir') || ""; |
258 |
- $prog = $record->prop('prog') || "pxelinux.0"; |
259 |
+ print $q->Tr( |
260 |
+ $q->td ({-class => "sme-noborders-label"}, "Directory: "), |
261 |
+ $q->td ({-class => "sme-noborders-content"}, $tftproot.$dir), |
262 |
+ ); |
263 |
+ print $q->Tr( |
264 |
+ $q->td ({-class => "sme-noborders-label"}, "Executable: "), |
265 |
+ $q->td ({-class => "sme-noborders-content"}, $prog), |
266 |
+ ); |
267 |
+ print $q->end_table; |
268 |
+ if ($install eq 'Manual' || $install eq 'Archive') |
269 |
+ { |
270 |
+ if ($dir) |
271 |
+# Don't try to delete the tftp root directory :) |
272 |
+ { |
273 |
+ print $q->p ("<input type=\"checkbox\" name=\"deldir\" value=\"yes\" />Delete the $tftproot$dir directory and all contents?"); |
274 |
+ print $q->p ; |
275 |
+ } |
276 |
+ print $q->hidden (-name=>'dir', -value=>$dir); |
277 |
+ } |
278 |
print $q->hidden (-name=>'dist', -value=>$dist); |
279 |
print $q->hidden (-name=>'install', -value=>$install); |
280 |
} |
281 |
- |
282 |
- # --- Default Distribution |
283 |
- if ($action eq 'Delete') |
284 |
+ elsif ($action eq 'Change') |
285 |
{ |
286 |
+ my $record = $pxeclients->get($dist); |
287 |
+ $dir = $record->prop('dir') || ""; |
288 |
+ $prog = $record->prop('prog') || "pxelinux.0"; |
289 |
+ print $q->p ('You can alter the '.$dist.' Distribution parameters in the database'); |
290 |
+ if ($dir) |
291 |
+# Don't try to move the tftp root directory :) |
292 |
+ { |
293 |
+ print $q->p ('If you want to move the '.$tftproot.$dir.' directory, and all files,<BR>', |
294 |
+ '- please enter the new directory name in the Directory box, and<BR>', |
295 |
+ '- tick "Move '.$tftproot.$dir.' and contents?"' |
296 |
+ ); |
297 |
+ } |
298 |
+ else |
299 |
+ { |
300 |
+ print $q->p ("You can't move the $tftproot$dir directory, so you'll have to manipulate the files yourself"); |
301 |
+ } |
302 |
+ print $q->p ; |
303 |
+ print $q->start_table ({-class => "sme-noborders"}); |
304 |
+ print $q->Tr ( |
305 |
+ esmith::cgi::genNameValueRow ($q, "Name", "dist", $dist), |
306 |
+ ); |
307 |
print $q->Tr( |
308 |
- $q->td ({-class => "sme-noborders-label"}, "Directory: " . $tftproot), |
309 |
- $q->td ({-class => "sme-noborders-content"}, $dir), |
310 |
- ); |
311 |
+ $q->td ({-class => "sme-noborders-label"}, "Directory: "), |
312 |
+ $q->td ({-class => "sme-borders-content"}, "$tftproot<input type=\"text\" name=\"dir\" value=\"$dir\">"), |
313 |
+ ); |
314 |
print $q->Tr( |
315 |
- $q->td ({-class => "sme-noborders-label"}, "Executable: "), |
316 |
- $q->td ({-class => "sme-noborders-content"}, $prog), |
317 |
- ); |
318 |
- print $q->hidden (-name=>'dir', -value=>$dir); |
319 |
- print $q->hidden (-name=>'prog', -value=>$prog); |
320 |
+ $q->td ({-class => "sme-noborders-label"}, "Executable: "), |
321 |
+ $q->td ({-class => "sme-borders-content"}, "<input type=\"text\" name=\"prog\" value=\"$prog\">"), |
322 |
+ ); |
323 |
+ print $q->end_table; |
324 |
+ if ($dir) |
325 |
+# Don't try to move the tftp root directory :) |
326 |
+ { |
327 |
+ print $q->p ({-class => "sme-noborders-content"}, "<input type=\"checkbox\" name=\"movedir\" value=\"yes\">Move $tftproot$dir and contents?"); |
328 |
+ print $q->p ; |
329 |
+ } |
330 |
} |
331 |
else |
332 |
{ |
333 |
- print $q->Tr ( |
334 |
- esmith::cgi::genNameValueRow ($q, "Directory \(/tftpboot/\)", 'dir', $dir), |
335 |
- ); |
336 |
- print $q->Tr ( |
337 |
- esmith::cgi::genNameValueRow ($q, "Executable", 'prog', $prog), |
338 |
- ); |
339 |
+ showStatusReport ($q, 'error', "We should never get here (Action=$action)", $log) |
340 |
} |
341 |
- |
342 |
- print $q->end_table,"\n"; |
343 |
|
344 |
print $q->submit (-name=>'acct', -value=>$action); |
345 |
if ($action ne 'Delete') |
346 |
@@ -649,6 +751,7 @@ sub showDistributionPanel($$$) |
347 |
print $q->submit (-name=>'reset', -value=>'Reset'); |
348 |
print $q->hidden (-name=>'origacct', -value=>$action); |
349 |
print $q->hidden (-name=>'origdist', -value=>$dist); |
350 |
+ print $q->hidden (-name=>'origdir', -value=>$dir); |
351 |
} |
352 |
print $q->defaults (-name=>'Cancel'); |
353 |
|
354 |
@@ -677,12 +780,12 @@ sub showWorkstationPanel($$$) |
355 |
my $base = ""; |
356 |
my $status = ""; |
357 |
my $distdir = ""; |
358 |
- my $tftproot = "/tftproot/"; |
359 |
+ my $tftproot = "/tftpboot/"; |
360 |
if ($config->get('tftpd')) |
361 |
{ |
362 |
if ($config->get('tftpd')->prop('status') eq 'enabled') |
363 |
{ |
364 |
- $tftproot = $config->get('tftpd')->prop('tftproot') |
365 |
+ $tftproot = $config->get('tftpd')->prop('tftproot') || "/tftpboot/"; |
366 |
} |
367 |
} |
368 |
|
369 |
@@ -1031,96 +1134,227 @@ sub saveClient ($) |
370 |
sub saveDistribution ($) |
371 |
{ |
372 |
my ($q) = @_; |
373 |
+ my $action = $q->param('acct'); |
374 |
+ my $dist = $q->param('dist'); |
375 |
+ my $dir = $q->param('dir'); |
376 |
+ my $prog = $q->param('prog'); |
377 |
+ my $archive = $q->param('archive'); |
378 |
+ my $ext = $q->param('ext') || ""; |
379 |
+ my $deldir = $q->param('deldir'); |
380 |
+ my $movedir = $q->param('movedir'); |
381 |
+ my $install = $q->param('install') || "Manual"; |
382 |
+ my $origacct = $q->param('origacct'); |
383 |
+ my $origdist = $q->param('origdist'); |
384 |
+ my $origdir = $q->param('origdir'); |
385 |
+ my $origprog = $q->param('origprog'); |
386 |
+ my $safe_filename_characters = "a-zA-Z0-9_.-"; |
387 |
+ my $tftproot = $config->get('tftpd')->prop('tftproot') || "/tftpboot/"; |
388 |
+ my $ini = "";; |
389 |
|
390 |
if ($q->param('reset')) |
391 |
{ |
392 |
- my $origacct = $q->param('origacct'); |
393 |
- my $origdist = $q->param('origdist'); |
394 |
$q = new CGI(""); |
395 |
$q->param(-name=>'acct', -value=>$origacct); |
396 |
$q->param(-name=>'dist', -value=>$origdist); |
397 |
+ $q->param(-name=>'dir', -value=>$origdir); |
398 |
+ $q->param(-name=>'prog', -value=>$origprog); |
399 |
showDistributionPanel ($q, '', ''); |
400 |
return; |
401 |
} |
402 |
|
403 |
- my $action = $q->param('acct'); |
404 |
- my $dist = $q->param('dist'); |
405 |
- my $dir = $q->param('dir'); |
406 |
- my $prog = $q->param('prog'); |
407 |
- |
408 |
- if ($action eq "Add") |
409 |
+ if ($action eq 'Add') |
410 |
{ |
411 |
- my $rpmfile = $q->param('rpmfile'); |
412 |
- if ("$rpmfile" ne "") |
413 |
+ if ($archive) |
414 |
{ |
415 |
- unlink ("/tmp/thinclient.rpm"); |
416 |
- open (WR,">/tmp/thinclient.rpm") || die ("Error while opening temporally file.\n"); |
417 |
- while (<$rpmfile>) |
418 |
- { |
419 |
- print WR; |
420 |
- } |
421 |
- close WR; |
422 |
- if (system ("/bin/rpm -Uvh /tmp/thinclient.rpm > /var/log/thinclient.log 2>&1")) |
423 |
- { |
424 |
- showDistributionPanel($q, "Error occurred during rpm install.", "/var/log/thinclient.log"); |
425 |
- return; |
426 |
- } |
427 |
- $dist = "via .rpm"; |
428 |
+# If we are adding via an archive: |
429 |
+# - upload the archive |
430 |
+# - extract the archive |
431 |
+# - check if it has a thinclient.ini file and load defaults if it does |
432 |
+ $install = "Archive"; |
433 |
+ # Untaint the filename |
434 |
+ if ( $archive =~ /^([$safe_filename_characters]+)$/ ) |
435 |
+ { |
436 |
+ $archive = $1; |
437 |
+ } |
438 |
+ else |
439 |
+ { |
440 |
+ die "Filename contains invalid characters"; |
441 |
+ } |
442 |
+ # Upload the file |
443 |
+ my $fharchive = $q->param('archive'); |
444 |
+ remove_tree ("/tmp/$archive"); |
445 |
+ open (WR,">/tmp/$archive") || die ("Error while opening temporally file.\n"); |
446 |
+ binmode WR; |
447 |
+ while ( <$fharchive> ) |
448 |
+ { |
449 |
+ print WR; |
450 |
+ } |
451 |
+ close WR; |
452 |
+ # Extract the archive |
453 |
+ my ( $name, $path, $ext ) = fileparse ( $archive, qr/\.[^.]*/ ); |
454 |
+ my $unzip = "/bin/tar -xf /tmp/$archive -C /tmp/thinclient"; |
455 |
+ if ($ext eq ".rpm") |
456 |
+ { |
457 |
+ $unzip = "/bin/rpm -Uvh /tmp/$archive"; |
458 |
+ $install = $archive; |
459 |
+ } |
460 |
+ elsif ($ext eq ".zip") |
461 |
+ { |
462 |
+ $unzip = "/usr/bin/unzip /tmp/$archive -d /tmp/thinclient"; |
463 |
+ } |
464 |
+ else |
465 |
+ { |
466 |
+ $unzip = "/bin/tar -xf /tmp/$archive -C /tmp/thinclient"; |
467 |
+ } |
468 |
+ remove_tree ("/tmp/thinclient"); |
469 |
+ mkdir "/tmp/thinclient"; |
470 |
+ if (system ($unzip." > /var/log/thinclient.log 2>&1")) |
471 |
+ { |
472 |
+ showDistributionPanel($q, "Error occurred during archive extract.(ext=$ext)", "/var/log/thinclient.log"); |
473 |
+ return; |
474 |
+ } |
475 |
+ # Now that we have unpacked it, delete the uploaded archive |
476 |
+ unlink "/tmp/$archive"; |
477 |
+ # If there is a thinclient.ini within the archive, use the parameters in it |
478 |
+ if (-e "/tmp/thinclient/thinclient.ini") |
479 |
+ { |
480 |
+ my $cfg = readini( "/tmp/thinclient/thinclient.ini" ); |
481 |
+ unlink "/tmp/thinclient/thinclient.ini"; |
482 |
+ $dist = $cfg->{"params"}->{"dist"}; |
483 |
+ $dir = $cfg->{"params"}->{"dir"}; |
484 |
+ $prog = $cfg->{"params"}->{"prog"} || "pxelinux.0"; |
485 |
+ $ini = "yes"; |
486 |
+ } |
487 |
+ if ($ext ne ".rpm") |
488 |
+# rpms do everything themselves (db params & install) |
489 |
+# We ask for confirmation of parameters for all other archive types |
490 |
+ { |
491 |
+ $q = new CGI(""); |
492 |
+ $q->param(-name=>'acct', -value=>"Confirm"); |
493 |
+ $q->param(-name=>'dist', -value=>$dist); |
494 |
+ $q->param(-name=>'dir', -value=>$dir); |
495 |
+ $q->param(-name=>'prog', -value=>$prog); |
496 |
+ $q->param(-name=>'install', -value=>$install); |
497 |
+ $q->param(-name=>'ini', -value=>$ini); |
498 |
+ showDistributionPanel ($q, '', ''); |
499 |
+ return; |
500 |
+ } |
501 |
} |
502 |
else |
503 |
{ |
504 |
- if ($dist eq "") |
505 |
- { |
506 |
- showDistributionPanel ($q, "You must either, enter a Name, or select an rpm to load. $action unsuccessfull", ''); |
507 |
+# It must be a Manual entry |
508 |
+ if ($pxeclients->get($dist)) |
509 |
+ { |
510 |
+ $q = new CGI(""); |
511 |
+ $q->param(-name=>'acct', -value=>"Confirm"); |
512 |
+ $q->param(-name=>'dist', -value=>$dist); |
513 |
+ $q->param(-name=>'dir', -value=>$dir); |
514 |
+ $q->param(-name=>'prog', -value=>$prog); |
515 |
+ $q->param(-name=>'install', -value=>"Manual"); |
516 |
+ showDistributionPanel ($q, '', ''); |
517 |
+ return; |
518 |
+ } |
519 |
+ my %newvalues = ('type' => 'dist', |
520 |
+ 'dir' => $dir, |
521 |
+ 'prog' => $prog, |
522 |
+ 'install' => 'Manual'); |
523 |
+ my $distrecord = $pxeclients->new_record($dist, \%newvalues); |
524 |
+ } |
525 |
+ } |
526 |
+ elsif ($action eq 'Confirm') |
527 |
+ { |
528 |
+# We ONLY get to Confirm, if it's an archive install (non rpm) |
529 |
+# Move the contents of the archive into the specified directory |
530 |
+# and update the config |
531 |
+ if ( $dist eq "" ) |
532 |
+ { |
533 |
+ showDistributionPanel ($q, "You MUST define a Distribution name.", ''); |
534 |
return; |
535 |
- } |
536 |
- my %newvalues = ('type' => 'dist', |
537 |
- 'dir' => $dir, |
538 |
- 'prog' => $prog, |
539 |
- 'install' => 'Manual'); |
540 |
- my $distrecord = $pxeclients->new_record($dist, \%newvalues); |
541 |
+ } |
542 |
+ if ( $dir =~ /^([$safe_filename_characters]+)$/ ) |
543 |
+ { |
544 |
+ $dir = $1; |
545 |
+ } |
546 |
+ else |
547 |
+ { |
548 |
+ die "Directory contains invalid characters\n"; |
549 |
} |
550 |
+ rename ("/tmp/thinclient", "$tftproot$dir"); |
551 |
+ my %newvalues = ('type' => 'dist', |
552 |
+ 'dir' => $dir, |
553 |
+ 'prog' => $prog, |
554 |
+ 'install' => 'Archive'); |
555 |
+ my $distrecord = $pxeclients->new_record($dist, \%newvalues); |
556 |
} |
557 |
- else |
558 |
+ elsif ($action eq "Delete") |
559 |
{ |
560 |
- my $install = $q->param('install'); |
561 |
- |
562 |
- if ($action eq "Delete") |
563 |
+ if ($install eq "Manual" || $install eq "Archive") |
564 |
{ |
565 |
- if ($install eq "Manual") |
566 |
- { |
567 |
my $distrecord = $pxeclients->get($dist); |
568 |
$distrecord->delete; |
569 |
- } |
570 |
- else |
571 |
- { |
572 |
+ # If they ticked the delete directory box, delete it |
573 |
+ if ( $dir =~ /^([$safe_filename_characters]+)$/ ) |
574 |
+ { |
575 |
+ $dir = $1; |
576 |
+ } |
577 |
+ else |
578 |
+ { |
579 |
+ die "Filename contains invalid characters"; |
580 |
+ } |
581 |
+ if ($deldir eq 'yes') |
582 |
+ { |
583 |
+ remove_tree ("$tftproot$dir"); |
584 |
+ } |
585 |
+ } |
586 |
+ else |
587 |
+ # We have to assume it's via rpm |
588 |
+ { |
589 |
my $rpm = $pxeclients->get_prop($dist, 'install'); |
590 |
if (system ("/bin/rpm -e $rpm > /var/log/thinclient.log 2>&1")) |
591 |
{ |
592 |
showDistributionPanel($q, "Error occurred during rpm uninstall.", "/var/log/thinclient.log"); |
593 |
return; |
594 |
} |
595 |
- } |
596 |
} |
597 |
- elsif ($action eq "Change") |
598 |
+ } |
599 |
+ elsif ($action eq "Change") |
600 |
+ { |
601 |
+ if ($install eq "Manual" || $install eq "Archive") |
602 |
{ |
603 |
- if ($install eq "Manual") |
604 |
- { |
605 |
my $distrecord = $pxeclients->get($dist); |
606 |
$distrecord->set_prop('dir' => $dir); |
607 |
$distrecord->set_prop('prog' => $prog); |
608 |
- } |
609 |
- else |
610 |
- { |
611 |
- showDistributionPanel ($q, "This Distribution was installed via rpm. You can\'t modify these settings.", ''); |
612 |
- return; |
613 |
- } |
614 |
+ if ($dir ne $origdir && $movedir eq 'yes') |
615 |
+ { |
616 |
+ if ( $origdir =~ /^([$safe_filename_characters]+)$/ ) |
617 |
+ { |
618 |
+ $origdir = $1; |
619 |
+ } |
620 |
+ else |
621 |
+ { |
622 |
+ die "Filename contains invalid characters"; |
623 |
+ } |
624 |
+ if ( $dir =~ /^([$safe_filename_characters]+)$/ ) |
625 |
+ { |
626 |
+ $dir = $1; |
627 |
+ } |
628 |
+ else |
629 |
+ { |
630 |
+ die "Filename contains invalid characters"; |
631 |
+ } |
632 |
+ rename ("$tftproot$origdir", "$tftproot$dir"); |
633 |
+ } |
634 |
} |
635 |
else |
636 |
{ |
637 |
+ showDistributionPanel ($q, "This Distribution was installed via rpm. You can\'t modify these settings.", ''); |
638 |
+ return; |
639 |
+ } |
640 |
+ } |
641 |
+ else |
642 |
+ { |
643 |
showDistributionPanel ($q, "$action, Oops!", ''); |
644 |
return; |
645 |
- } |
646 |
} |
647 |
|
648 |
if (system ("/sbin/e-smith/signal-event thinclient-conf > /var/log/thinclient.log 2>&1")) |
649 |
@@ -1129,9 +1363,9 @@ sub saveDistribution ($) |
650 |
return; |
651 |
} |
652 |
|
653 |
- showInitial ($q, "success", "$action of Distribution [$dist], successfull", ""); |
654 |
- |
655 |
+ showInitial ($q, "success", "$action of Distribution $dist, successfull", ""); |
656 |
return; |
657 |
+ |
658 |
} |
659 |
|
660 |
# ---------------------------------------------------------------------------- |
661 |
@@ -1197,3 +1431,64 @@ sub checkip($) |
662 |
return 'OK'; |
663 |
} |
664 |
|
665 |
+# ---------------------------------------------------------------------------- |
666 |
+# --- |
667 |
+# --- subroutine checkarchive |
668 |
+# --- check the archive type and determine appropriate command to extract |
669 |
+# --- |
670 |
+# ---------------------------------------------------------------------------- |
671 |
+ |
672 |
+sub checkarchive($) |
673 |
+ { |
674 |
+ my ($archive) = @_; |
675 |
+ |
676 |
+ return undef unless defined $archive; |
677 |
+ |
678 |
+ my ($ext) = $archive =~ /((\.[^.\s]+)+)$/; |
679 |
+ if ($ext eq "tar.gz" || $ext eq "tgz" || $ext eq "tar.bz2" || $ext eq "tbz2" ) |
680 |
+ { |
681 |
+ return "/bin/tar -xf /tmp/$archive -C /tmp/thinclient/", $ext; |
682 |
+ |
683 |
+ } |
684 |
+ elsif ($ext eq "zip") |
685 |
+ { |
686 |
+ return "/usr/bin/unzip /tmp/$archive -d /tmp/thinclient/", $ext; |
687 |
+ } |
688 |
+ elsif ($ext eq "rpm") |
689 |
+ { |
690 |
+ return "/bin/rpm -Uvh /tmp/$archive", $ext; |
691 |
+ } |
692 |
+ else |
693 |
+ { |
694 |
+ # We'll try tar and hope it understands the extension..... |
695 |
+ return "/bin/tar -xf /tmp/$archive -C /tmp/thinclient/", $ext; |
696 |
+ } |
697 |
+ } |
698 |
+ |
699 |
+# ---------------------------------------------------------------------------- |
700 |
+# --- |
701 |
+# --- subroutine read an ini file |
702 |
+# --- |
703 |
+# ---------------------------------------------------------------------------- |
704 |
+ |
705 |
+sub readini($) |
706 |
+ { |
707 |
+ my ($ini) = @_; |
708 |
+ my $cfg; |
709 |
+ my $section; |
710 |
+ open (INI, "$ini") || die "Can't open $ini: $!\n"; |
711 |
+ while (<INI>) { |
712 |
+ chomp; |
713 |
+ if ( /^\s*\[\s*(.+?)\s*\]\s*$/ ) |
714 |
+ { |
715 |
+ $section = $1; |
716 |
+ } |
717 |
+ if ( /^\s*([^=]+?)\s*=\s*(.*?)\s*$/ ) |
718 |
+ { |
719 |
+ $cfg->{$section}->{$1} = $2; |
720 |
+ } |
721 |
+ } |
722 |
+ close (INI); |
723 |
+ return $cfg; |
724 |
+ } |
725 |
+ |
726 |
\ No newline at end of file |