summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2014-10-27 16:17:10 +0100
committerSimon Rettberg2014-10-27 16:17:10 +0100
commitf63f6979532b7a7be20f719bb7028c5f04275e2e (patch)
treedfa1ecb78ff2e77adcb0997336521b1fb53578b0
parentUpdate translations (diff)
downloadslx-admin-f63f6979532b7a7be20f719bb7028c5f04275e2e.tar.gz
slx-admin-f63f6979532b7a7be20f719bb7028c5f04275e2e.tar.xz
slx-admin-f63f6979532b7a7be20f719bb7028c5f04275e2e.zip
Update AD proxy module generation, add config backup
-rw-r--r--inc/event.inc.php4
-rw-r--r--modules/backup.inc.php151
-rw-r--r--modules/sysconfig.inc.php183
-rw-r--r--modules/sysconfig/addmodule_ad.inc.php11
-rw-r--r--modules/sysconfig/addmodule_branding.inc.php3
-rw-r--r--modules/sysconfig/addmodule_custom.inc.php2
6 files changed, 271 insertions, 83 deletions
diff --git a/inc/event.inc.php b/inc/event.inc.php
index 6689e12f..376deb6f 100644
--- a/inc/event.inc.php
+++ b/inc/event.inc.php
@@ -27,6 +27,10 @@ class Event
$autoIp = Trigger::autoUpdateServerIp();
$ldadpId = Trigger::ldadp();
$ipxeId = Trigger::ipxe();
+
+ Taskmanager::submit('DozmodLauncher', array(
+ 'operation' => 'start'
+ ));
// Check status of all tasks
// Mount vm store
diff --git a/modules/backup.inc.php b/modules/backup.inc.php
new file mode 100644
index 00000000..ecdc3565
--- /dev/null
+++ b/modules/backup.inc.php
@@ -0,0 +1,151 @@
+<?php
+
+class Page_Backup extends Page
+{
+
+ private $action = false;
+ private $templateData = array();
+
+ protected function doPreprocess()
+ {
+ User::load();
+ if (!User::hasPermission('superadmin')) {
+ Message::addError('no-permission');
+ Util::redirect('?do=Main');
+ }
+ $this->action = Request::post('action');
+ if ($this->action === 'backup') {
+ $this->backup();
+ } elseif ($this->action === 'restore') {
+ $this->restore();
+ }
+ }
+
+ protected function doRender()
+ {
+ Render::setTitle(Dictionary::translate('lang_titleBackup'));
+ if ($this->action === 'restore') {
+ Render::addTemplate('backup/restore', $this->templateData);
+ } else {
+ Render::addTemplate('backup/_page');
+ }
+ }
+
+ private function backup()
+ {
+ $task = Taskmanager::submit('BackupRestore', array('mode' => 'backup'));
+ if (!isset($task['id'])) {
+ Message::addError('backup-failed');
+ Util::redirect('?do=Backup');
+ }
+ $task = Taskmanager::waitComplete($task, 3000);
+ if (!Taskmanager::isFinished($task) || !isset($task['data']['backupFile'])) {
+ Taskmanager::addErrorMessage($task);
+ Util::redirect('?do=Backup');
+ }
+ while ((@ob_get_level()) > 0)
+ @ob_end_clean();
+ $fh = @fopen($task['data']['backupFile'], 'rb');
+ if ($fh === false) {
+ Message::addError('error-read', $task['data']['backupFile']);
+ Util::redirect('?do=Backup');
+ }
+ Header('Content-Type: application/octet-stream', true);
+ Header('Content-Disposition: attachment; filename=' . 'satellite-backup_v' . Database::getExpectedSchemaVersion() . '_' . date('Y.m.d-H.i.s') . '.tgz');
+ Header('Content-Length: ' . @filesize($task['data']['backupFile']));
+ while (!feof($fh)) {
+ $data = fread($fh, 16000);
+ if ($data === false) {
+ EventLog::failure('Could not stream system backup to browser - backup corrupted!');
+ die("\r\n\nDOWNLOAD INTERRUPTED!\n");
+ }
+ echo $data;
+ @ob_flush();
+ @flush();
+ }
+ @fclose($fh);
+ @unlink($task['data']['backupFile']);
+ die();
+ }
+
+ private function restore()
+ {
+ if (!isset($_FILES['backupfile'])) {
+ Message::addError('missing-file');
+ Util::redirect('?do=Backup');
+ }
+ if ($_FILES['backupfile']['error'] != UPLOAD_ERR_OK) {
+ Message::addError('upload-failed', Util::uploadErrorString($_FILES['backupfile']['error']));
+ Util::redirect('?do=Backup');
+ }
+ $tempfile = '/tmp/bwlp-' . mt_rand(1, 100000) . '-' . crc32($_SERVER['REMOTE_HOST']) . '.tgz';
+ if (!move_uploaded_file($_FILES['backupfile']['tmp_name'], $tempfile)) {
+ Message::addError('error-write', $tempfile);
+ Util::redirect('?do=Backup');
+ }
+ // Got uploaded file, now shut down all the daemons etc.
+ $parent = $this->stopDaemons(null);
+ // Unmount store
+ $task = Taskmanager::submit('MountVmStore', array(
+ 'address' => 'null',
+ 'type' => 'images',
+ 'parentTask' => $parent,
+ 'failOnParentFail' => false
+ ));
+ if (isset($task['id'])) {
+ $this->templateData['mountid'] = $task['id'];
+ $parent = $task['id'];
+ }
+ // Finally run backup
+ $task = Taskmanager::submit('BackupRestore', array(
+ 'mode' => 'restore',
+ 'backupFile' => $tempfile,
+ 'parentTask' => $parent,
+ 'failOnParentFail' => false
+ ));
+ if (isset($task['id'])) {
+ $this->templateData['restoreid'] = $task['id'];
+ $parent = $task['id'];
+ }
+ // Reboot
+ $task = Taskmanager::submit('Reboot', array(
+ 'parentTask' => $parent,
+ 'failOnParentFail' => false
+ ));
+ if (isset($task['id']))
+ $this->templateData['rebootid'] = $task['id'];
+ }
+
+ private function stopDaemons($parent)
+ {
+ $task = Taskmanager::submit('SyncdaemonLauncher', array(
+ 'operation' => 'stop',
+ 'parentTask' => $parent,
+ 'failOnParentFail' => false
+ ));
+ if (isset($task['id'])) {
+ $this->templateData['syncid'] = $task['id'];
+ $parent = $task['id'];
+ }
+ $task = Taskmanager::submit('DozmodLauncher', array(
+ 'operation' => 'stop',
+ 'parentTask' => $parent,
+ 'failOnParentFail' => false
+ ));
+ if (isset($task['id'])) {
+ $this->templateData['dmsdid'] = $task['id'];
+ $parent = $task['id'];
+ }
+ $task = Taskmanager::submit('LdadpLauncher', array(
+ 'ids' => array(),
+ 'parentTask' => $parent,
+ 'failOnParentFail' => false
+ ));
+ if (isset($task['id'])) {
+ $this->templateData['ldadpid'] = $task['id'];
+ $parent = $task['id'];
+ }
+ return $parent;
+ }
+
+}
diff --git a/modules/sysconfig.inc.php b/modules/sysconfig.inc.php
index b27b6a97..dc2458de 100644
--- a/modules/sysconfig.inc.php
+++ b/modules/sysconfig.inc.php
@@ -2,7 +2,7 @@
class Page_SysConfig extends Page
{
-
+
/**
* Holds all the known configuration modules, with title, description, start class for their wizard, etc.
* @var array
@@ -32,7 +32,7 @@ class Page_SysConfig extends Page
'sortOrder' => $sortOrder
);
}
-
+
/**
*
* @return array All registered module types
@@ -45,14 +45,14 @@ class Page_SysConfig extends Page
protected function doPreprocess()
{
User::load();
-
+
if (!User::hasPermission('superadmin')) {
Message::addError('no-permission');
Util::redirect('?do=Main');
}
$action = Request::any('action', 'list');
-
+
// Load all addmodule classes, as they populate the $moduleTypes array
require_once 'modules/sysconfig/addmodule.inc.php';
foreach (glob('modules/sysconfig/addmodule_*.inc.php') as $file) {
@@ -71,7 +71,7 @@ class Page_SysConfig extends Page
$this->delModule();
}
}
-
+
// Action: "addconfig" (compose config from one or more modules)
if ($action === 'addconfig') {
$this->initAddConfig();
@@ -97,25 +97,34 @@ class Page_SysConfig extends Page
protected function doRender()
{
Render::setTitle(Dictionary::translate('lang_location'));
-
+
$action = Request::any('action', 'list');
switch ($action) {
- case 'addmodule':
- AddModule_Base::render();
- break;
- case 'addconfig':
- AddConfig_Base::render();
- break;
- case 'list':
- $this->listConfigs();
- break;
- case 'module':
- $this->listModuleContents();
- break;
- default:
- Message::addError('invalid-action', $action);
- break;
+ case 'addmodule':
+ AddModule_Base::render();
+ return;
+ case 'addconfig':
+ AddConfig_Base::render();
+ return;
+ case 'list':
+ $this->listConfigs();
+ return;
+ case 'module':
+ $listid = Request::post('list');
+ if ($listid !== false) {
+ $this->listModuleContents($listid);
+ return;
+ }
+ break;
+ case 'config':
+ $listid = Request::post('list');
+ if ($listid !== false) {
+ $this->listConfigContents($listid);
+ return;
+ }
+ break;
}
+ Message::addError('invalid-action', $action);
}
/**
@@ -147,63 +156,83 @@ class Page_SysConfig extends Page
'modules' => $modules
));
}
-
- private function listModuleContents()
+
+ private function listModuleContents($moduleid)
{
// fetch the data
- $moduleid = Request::post('list', 'MISSING');
$row = Database::queryFirst("SELECT title, filepath FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid));
- if ($row == false) {
+ if ($row === false) {
Message::addError('config-invalid', $moduleid);
Util::redirect('?do=SysConfig');
}
-
+
// find files in that archive
- $taskStatus = Taskmanager::submit('ListArchive', array(
- 'file' => $row['filepath']
- ));
-
- if (isset($taskStatus['id'])) {
-
- $status = Taskmanager::waitComplete($taskStatus['id']);
- Taskmanager::release($taskStatus['id']);
- if (!isset($status['statusCode'])) {
- //$this->tmError();
- }
- if ($status['statusCode'] != TASK_FINISHED) {
- //$this->taskError($status);
- }
- // Sort files for better display
- $dirs = array();
- foreach ($status['data']['entries'] as $file) {
- if ($file['isdir']) continue;
- $dirs[dirname($file['name'])][] = $file;
- }
- ksort($dirs);
- $list = array();
- foreach ($dirs as $dir => $files) {
- $list[] = array(
- 'name' => $dir,
- 'isdir' => true
- );
- sort($files);
- foreach ($files as $file) {
- $file['size'] = Util::readableFileSize($file['size']);
- $list[] = $file;
- }
+ $status = Taskmanager::submit('ListArchive', array(
+ 'file' => $row['filepath']
+ ));
+ if (isset($status['id']))
+ $status = Taskmanager::waitComplete($status, 4000);
+ if (!Taskmanager::isFinished($status) || Taskmanager::isFailed($status)) {
+ Taskmanager::addErrorMessage($status);
+ Util::redirect('?do=SysConfig');
+ }
+
+ // Sort files for better display
+ $dirs = array();
+ foreach ($status['data']['entries'] as $file) {
+ if ($file['isdir'])
+ continue;
+ $dirs[dirname($file['name'])][] = $file;
+ }
+ ksort($dirs);
+ $list = array();
+ foreach ($dirs as $dir => $files) {
+ $list[] = array(
+ 'name' => $dir,
+ 'isdir' => true
+ );
+ sort($files);
+ foreach ($files as $file) {
+ $file['size'] = Util::readableFileSize($file['size']);
+ $list[] = $file;
}
- } else {
- // task failed, redirect
+ }
+
+ // render the template
+ Render::addDialog(Dictionary::translate('lang_contentOf') . ' ' . $row['title'], false, 'sysconfig/custom-filelist', array(
+ 'files' => $list,
+ ));
+ }
+
+ private function listConfigContents($configid)
+ {
+ // get config name
+ $config = Database::queryFirst("SELECT title FROM configtgz WHERE configid = :configid LIMIT 1", array('configid' => $configid));
+ if ($config === false) {
+ Message::addError('config-invalid', $configid);
Util::redirect('?do=SysConfig');
- }
-
+ }
+ // fetch the data
+ $res = Database::simpleQuery("SELECT module.moduleid, module.title AS moduletitle"
+ . " FROM configtgz_module module"
+ . " INNER JOIN configtgz_x_module USING (moduleid)"
+ . " WHERE configtgz_x_module.configid = :configid"
+ . " ORDER BY module.title ASC", array('configid' => $configid));
+
+ $modules = array();
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ $modules[] = array(
+ 'module' => $row['moduletitle'],
+ 'moduleid' => $row['moduleid']
+ );
+ }
// render the template
- Render::addDialog(Dictionary::translate('lang_contentOf') . $row['title'] . '"', false, 'sysconfig/custom-filelist', array(
- 'files' => $list,
+ Render::addDialog(Dictionary::translate('lang_contentOf') . ' ' . $config['title'], false, 'sysconfig/config-module-list', array(
+ 'modules' => $modules
));
}
-
+
private function activateConfig()
{
$configid = Request::post('activate', 'MISSING');
@@ -213,7 +242,7 @@ class Page_SysConfig extends Page
Util::redirect('?do=SysConfig');
}
$task = Taskmanager::submit('LinkConfigTgz', array(
- 'destination' => $row['filepath']
+ 'destination' => $row['filepath']
));
if (isset($task['statusCode']) && $task['statusCode'] === TASK_WAITING) {
$task = Taskmanager::waitComplete($task['id']);
@@ -226,7 +255,7 @@ class Page_SysConfig extends Page
}
Util::redirect('?do=SysConfig');
}
-
+
private function delModule()
{
$moduleid = Request::post('del', 'MISSING');
@@ -236,14 +265,14 @@ class Page_SysConfig extends Page
Util::redirect('?do=SysConfig');
}
$existing = Database::queryFirst("SELECT title FROM configtgz_x_module"
- . " INNER JOIN configtgz USING (configid)"
- . " WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid));
+ . " INNER JOIN configtgz USING (configid)"
+ . " WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid));
if ($existing !== false) {
Message::addError('module-in-use', $row['title'], $existing['title']);
Util::redirect('?do=SysConfig');
}
$task = Taskmanager::submit('DeleteFile', array(
- 'file' => $row['filepath']
+ 'file' => $row['filepath']
));
if (isset($task['statusCode']) && $task['statusCode'] === TASK_WAITING) {
$task = Taskmanager::waitComplete($task['id']);
@@ -256,7 +285,7 @@ class Page_SysConfig extends Page
Database::exec("DELETE FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid));
Util::redirect('?do=SysConfig');
}
-
+
private function delConfig()
{
$configid = Request::post('del', 'MISSING');
@@ -266,7 +295,7 @@ class Page_SysConfig extends Page
Util::redirect('?do=SysConfig');
}
$task = Taskmanager::submit('DeleteFile', array(
- 'file' => $row['filepath']
+ 'file' => $row['filepath']
));
if (isset($task['statusCode']) && $task['statusCode'] === TASK_WAITING) {
$task = Taskmanager::waitComplete($task['id']);
@@ -279,18 +308,20 @@ class Page_SysConfig extends Page
Database::exec("DELETE FROM configtgz WHERE configid = :configid LIMIT 1", array('configid' => $configid));
Util::redirect('?do=SysConfig');
}
-
+
private function initAddModule()
{
$step = Request::any('step', 0);
- if ($step === 0) $step = 'AddModule_Start';
+ if ($step === 0)
+ $step = 'AddModule_Start';
AddModule_Base::setStep($step);
}
-
+
private function initAddConfig()
{
$step = Request::any('step', 0);
- if ($step === 0) $step = 'AddConfig_Start';
+ if ($step === 0)
+ $step = 'AddConfig_Start';
require_once 'modules/sysconfig/addconfig.inc.php';
foreach (glob('modules/sysconfig/addconfig_*.inc.php') as $file) {
require_once $file;
diff --git a/modules/sysconfig/addmodule_ad.inc.php b/modules/sysconfig/addmodule_ad.inc.php
index 3afe3972..4c529b72 100644
--- a/modules/sysconfig/addmodule_ad.inc.php
+++ b/modules/sysconfig/addmodule_ad.inc.php
@@ -16,6 +16,7 @@ class AdModule_Start extends AddModule_Base
Session::save();
Render::addDialog(Dictionary::translate('lang_adAuthentication'), false, 'sysconfig/ad-start', array(
'step' => 'AdModule_CheckConnection',
+ 'title' => Request::post('title'),
'server' => Request::post('server'),
'searchbase' => Request::post('searchbase'),
'binddn' => Request::post('binddn'),
@@ -82,6 +83,7 @@ class AdModule_CheckConnection extends AddModule_Base
protected function renderInternal()
{
Render::addDialog(Dictionary::translate('lang_adAuthentication'), false, 'sysconfig/ad-checkconnection', array_merge($this->taskIds, array(
+ 'title' => Request::post('title'),
'server' => Request::post('server'),
'searchbase' => Request::post('searchbase'),
'binddn' => Request::post('binddn'),
@@ -117,8 +119,10 @@ class AdModule_Finish extends AddModule_Base
}
$searchbase = mb_substr($binddn, $i + 1);
}
- $config = ConfigModule::insertAdConfig('AD: ' . Request::post('server'), Request::post('server'), $searchbase, $binddn, Request::post('bindpw', ''), Request::post('home', '')
- );
+ $title = Request::post('title');
+ if (empty($title))
+ $title = 'AD: ' . Request::post('server');
+ $config = ConfigModule::insertAdConfig($title, Request::post('server'), $searchbase, $binddn, Request::post('bindpw', ''), Request::post('home', ''));
$config['proxyip'] = Property::getServerIp();
$tgz = Taskmanager::submit('CreateAdConfig', $config);
if (!isset($tgz['id'])) {
@@ -132,8 +136,7 @@ class AdModule_Finish extends AddModule_Base
protected function renderInternal()
{
- Render::addDialog(Dictionary::translate('lang_adAuthentication'), false, 'sysconfig/ad-finish', $this->taskIds
- );
+ Render::addDialog(Dictionary::translate('lang_adAuthentication'), false, 'sysconfig/ad-finish', $this->taskIds);
}
}
diff --git a/modules/sysconfig/addmodule_branding.inc.php b/modules/sysconfig/addmodule_branding.inc.php
index de176230..a6080d06 100644
--- a/modules/sysconfig/addmodule_branding.inc.php
+++ b/modules/sysconfig/addmodule_branding.inc.php
@@ -4,8 +4,7 @@
* Wizard for including a branding logo.
*/
-Page_SysConfig::addModule('BRANDING', 'Branding_Start', Dictionary::translate('lang_institutionLogo'), Dictionary::translate('lang_institutionLogo'), 'Branding', false
-);
+Page_SysConfig::addModule('BRANDING', 'Branding_Start', Dictionary::translate('lang_institutionLogo'), Dictionary::translate('lang_institutionLogo'), 'Branding', true);
class Branding_Start extends AddModule_Base
{
diff --git a/modules/sysconfig/addmodule_custom.inc.php b/modules/sysconfig/addmodule_custom.inc.php
index afe09494..f79313e8 100644
--- a/modules/sysconfig/addmodule_custom.inc.php
+++ b/modules/sysconfig/addmodule_custom.inc.php
@@ -43,7 +43,7 @@ class CustomModule_ProcessUpload extends AddModule_Base
Message::addError('upload-failed', Util::uploadErrorString($_FILES['modulefile']['error']));
Util::redirect('?do=SysConfig');
}
- $tempfile = $_FILES['modulefile']['tmp_name'] . '.tmp';
+ $tempfile = '/tmp/bwlp-' . mt_rand(1, 100000) . '-' . crc32($_SERVER['REMOTE_HOST']) . '.tmp';
if (!move_uploaded_file($_FILES['modulefile']['tmp_name'], $tempfile)) {
Message::addError('error-write', $tempfile);
Util::redirect('?do=SysConfig');