diff options
author | Simon Rettberg | 2014-10-27 16:17:10 +0100 |
---|---|---|
committer | Simon Rettberg | 2014-10-27 16:17:10 +0100 |
commit | f63f6979532b7a7be20f719bb7028c5f04275e2e (patch) | |
tree | dfa1ecb78ff2e77adcb0997336521b1fb53578b0 /modules | |
parent | Update translations (diff) | |
download | slx-admin-f63f6979532b7a7be20f719bb7028c5f04275e2e.tar.gz slx-admin-f63f6979532b7a7be20f719bb7028c5f04275e2e.tar.xz slx-admin-f63f6979532b7a7be20f719bb7028c5f04275e2e.zip |
Update AD proxy module generation, add config backup
Diffstat (limited to 'modules')
-rw-r--r-- | modules/backup.inc.php | 151 | ||||
-rw-r--r-- | modules/sysconfig.inc.php | 183 | ||||
-rw-r--r-- | modules/sysconfig/addmodule_ad.inc.php | 11 | ||||
-rw-r--r-- | modules/sysconfig/addmodule_branding.inc.php | 3 | ||||
-rw-r--r-- | modules/sysconfig/addmodule_custom.inc.php | 2 |
5 files changed, 267 insertions, 83 deletions
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'); |