1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
<?php
User::load();
if (!User::hasPermission('superadmin')) die('No permission');
require_once('inc/render.inc.php');
error_log('**URI: '. $_SERVER['REQUEST_URI']);
if (!isset($_REQUEST['id'])) die('No id');
$id = $_REQUEST['id'];
// Progress update only
if (isset($_REQUEST['progress'])) {
$progress = preg_replace('/[^a-z0-9\-]/', '', $_REQUEST['progress']);
$pid = (isset($_REQUEST['pid']) ? (int)$_REQUEST['pid'] : 0);
$log = '/tmp/' . $progress . '.log';
if (!file_exists($log)) {
echo Render::parse('exec-error');
exit(0);
}
$lastLines = array();
$fh = fopen($log, 'r');
while (!feof($fh)) {
$line = fgets($fh);
$lastLines[] = $line;
if (count($lastLines) > 10) array_shift($lastLines);
}
fclose($fh);
$running = ($pid == 0 || posix_kill($pid, 0));
echo Render::parse('exec-progress', array('progress' => $progress, 'id' => $id, 'pid' => $pid, 'running' => $running, 'text' => implode('', $lastLines)));
if (!$running) unlink($log);
exit(0);
}
// Actual download request
// type ip id
if (!isset($_REQUEST['type'])) die('No type');
$type = $_REQUEST['type'];
switch ($type) {
case 'ipxe':
if (!isset($_REQUEST['ip'])) die('No IP given');
$ip = preg_replace('/[^0-9\.]/', '', $_REQUEST['ip']);
$default = $_REQUEST['default'];
if (!preg_match('/openslx|hddboot/', $default)) $default = 'openslx';
$command = '/opt/openslx/build_ipxe.sh "' . CONFIG_IPXE_DIR . '/last-ip" "' . $ip . '"';
$conf = Render::parse('txt-ipxeconfig', array(
'SERVER' => $ip
));
if (false === file_put_contents('/opt/openslx/ipxe/ipxelinux.ipxe', $conf)) die('Error writing iPXE Config');
$conf = Render::parse('txt-pxeconfig', array(
'SERVER' => $ip,
'DEFAULT' => $default,
$default => 'MENU DEFAULT'
));
if (false === file_put_contents(CONFIG_TFTP_DIR . '/pxelinux.cfg/default', $conf)) die('Error writing PXE Menu');
Database::exec("INSERT IGNORE INTO setting_global (setting, value) VALUES ('SLX_VM_NFS', :value)", array(':value' => "$ip:/srv/openslx/nfs"));
Database::exec("UPDATE setting_global SET value = :value WHERE setting = 'SLX_VM_NFS' AND value LIKE '%:/srv/openslx/nfs' LIMIT 1", array(':value' => "$ip:/srv/openslx/nfs"));
break;
default:
die('Invalid exec type');
}
$logfile = 'slx-' . mt_rand() . '-' . time();
error_log('**EXEC: ' . "$command '/tmp/${logfile}.log'");
exec("$command '/tmp/${logfile}.log'", $retstr, $retval);
if ($retval != 0) {
echo Render::parse('exec-error', array('error' => implode(' // ', $retstr) . ' - ' . $retval));
exit(0);
}
$pid = 0;
foreach ($retstr as $line) if (preg_match('/PID: (\d+)\./', $line, $out)) $pid = $out[1];
echo Render::parse('exec-progress', array('progress' => $logfile, 'id' => $id, 'pid' => $pid, 'running' => true));
|