From fe6ac16498b05d0f0c8ed7fda394273815d3d6da Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 23 May 2014 20:49:02 +0200 Subject: Stuff (WIP) --- modules/sysconfig.inc.php | 173 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 135 insertions(+), 38 deletions(-) (limited to 'modules/sysconfig.inc.php') diff --git a/modules/sysconfig.inc.php b/modules/sysconfig.inc.php index f177f0f1..7c23ce56 100644 --- a/modules/sysconfig.inc.php +++ b/modules/sysconfig.inc.php @@ -6,6 +6,11 @@ class Page_SysConfig extends Page protected function doPreprocess() { User::load(); + + if (!User::hasPermission('superadmin')) { + Message::addError('no-permission'); + Util::redirect('?do=SysConfig'); + } $action = Request::any('action', 'list'); @@ -15,29 +20,28 @@ class Page_SysConfig extends Page AddModule_Base::preprocess(); } - // Action "activate" (set sysconfig as active) - if ($action === 'activate') { - if (!User::hasPermission('superadmin')) { - Message::addError('no-permission'); - Util::redirect('?do=SysConfig'); + if ($action === 'module') { + // Action: "delmodule" (delete module) + if (Request::post('del', 'no') !== 'no') { + $this->delModule(); } - if (!isset($_REQUEST['file'])) { - Message::addError('missing-file'); - Util::redirect('?do=SysConfig'); + } + + // Action: "addconfig" (compose config from one or more modules) + if ($action === 'addconfig') { + $this->initAddConfig(); + AddConfig_Base::preprocess(); + } + + if ($action === 'config') { + // Action: "delconfig" (delete config) + if (Request::post('del', 'no') !== 'no') { + $this->delConfig(); } - $file = preg_replace('/[^a-z0-9\-_\.]/', '', $_REQUEST['file']); - $path = CONFIG_TGZ_LIST_DIR . '/' . $file; - if (!file_exists($path)) { - Message::addError('invalid-file', $file); - Util::redirect('?do=SysConfig'); + // Action "activate" (set sysconfig as active) + if (Request::post('activate', 'no') !== 'no') { + $this->activateConfig(); } - mkdir(CONFIG_HTTP_DIR . '/default', 0755, true); - $linkname = CONFIG_HTTP_DIR . '/default/config.tgz'; - @unlink($linkname); - if (file_exists($linkname)) Util::traceError('Could not delete old config.tgz link!'); - if (!symlink($path, $linkname)) Util::traceError("Could not symlink to $path at $linkname!"); - Message::addSuccess('config-activated'); - Util::redirect('?do=SysConfig'); } } @@ -52,40 +56,122 @@ class Page_SysConfig extends Page case 'addmodule': AddModule_Base::render(); break; + case 'addconfig': + AddConfig_Base::render(); + break; case 'list': - $this->rr_list_configs(); + $this->listConfigs(); break; default: Message::addError('invalid-action', $action); break; } } - - protected function doAjax() - { - $action = Request::any('action', 'list'); - // Action: "addmodule" (upload new module) - if ($action === 'addmodule') { - $this->initAddModule(); - AddModule_Base::ajax(); - } - } - - private function rr_list_configs() + /** + * List all configurations and configuration modules. + */ + private function listConfigs() { - if (!User::hasPermission('superadmin')) { - Message::addError('no-permission'); - return; + // Configs + $res = Database::simpleQuery("SELECT configid, title, filepath FROM configtgz ORDER BY title ASC"); + $configs = array(); + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + $configs[] = array( + 'configid' => $row['configid'], + 'config' => $row['title'], + 'current' => readlink('/srv/openslx/www/boot/default/config.tgz') === $row['filepath'] + ); } - $res = Database::simpleQuery("SELECT title FROM configtgz_module ORDER BY title ASC"); + // Config modules + $res = Database::simpleQuery("SELECT moduleid, title FROM configtgz_module ORDER BY title ASC"); $modules = array(); while ($row = $res->fetch(PDO::FETCH_ASSOC)) { $modules[] = array( + 'moduleid' => $row['moduleid'], 'module' => $row['title'] ); } - Render::addTemplate('page-sysconfig-main', array('modules' => $modules, 'token' => Session::get('token'))); + Render::addTemplate('page-sysconfig-main', array( + 'configs' => $configs, + 'modules' => $modules, + 'token' => Session::get('token') + )); + } + + private function activateConfig() + { + $configid = Request::post('activate', 'MISSING'); + $row = Database::queryFirst("SELECT title, filepath FROM configtgz WHERE configid = :configid LIMIT 1", array('configid' => $configid)); + if ($row === false) { + Message::addError('config-invalid', $configid); + Util::redirect('?do=SysConfig'); + } + $task = Taskmanager::submit('LinkConfigTgz', array( + 'destination' => $row['filepath'] + )); + if (isset($task['statusCode']) && $task['statusCode'] === TASK_WAITING) { + $task = Taskmanager::waitComplete($task['id']); + } + if (!isset($task['statusCode']) || $task['statusCode'] === TASK_ERROR) { + Message::addError('task-error', $task['data']['error']); + } elseif ($task['statusCode'] === TASK_FINISHED) { + Message::addSuccess('config-activated', $row['title']); + } + Util::redirect('?do=SysConfig'); + } + + private function delModule() + { + $moduleid = Request::post('del', 'MISSING'); + $row = Database::queryFirst("SELECT title, filepath FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid)); + if ($row === false) { + Message::addError('config-invalid', $moduleid); + 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)); + if ($existing !== false) { + Message::addError('module-in-use', $row['title'], $existing['title']); + Util::redirect('?do=SysConfig'); + } + $task = Taskmanager::submit('DeleteFile', array( + 'file' => $row['filepath'] + )); + if (isset($task['statusCode']) && $task['statusCode'] === TASK_WAITING) { + $task = Taskmanager::waitComplete($task['id']); + } + if (!isset($task['statusCode']) || $task['statusCode'] === TASK_ERROR) { + Message::addWarning('task-error', $task['data']['error']); + } elseif ($task['statusCode'] === TASK_FINISHED) { + Message::addSuccess('module-deleted', $row['title']); + } + 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'); + $row = Database::queryFirst("SELECT title, filepath FROM configtgz WHERE configid = :configid LIMIT 1", array('configid' => $configid)); + if ($row === false) { + Message::addError('config-invalid', $configid); + Util::redirect('?do=SysConfig'); + } + $task = Taskmanager::submit('DeleteFile', array( + 'file' => $row['filepath'] + )); + if (isset($task['statusCode']) && $task['statusCode'] === TASK_WAITING) { + $task = Taskmanager::waitComplete($task['id']); + } + if (!isset($task['statusCode']) || $task['statusCode'] === TASK_ERROR) { + Message::addWarning('task-error', $task['data']['error']); + } elseif ($task['statusCode'] === TASK_FINISHED) { + Message::addSuccess('module-deleted', $row['title']); + } + Database::exec("DELETE FROM configtgz WHERE configid = :configid LIMIT 1", array('configid' => $configid)); + Util::redirect('?do=SysConfig'); } private function initAddModule() @@ -98,5 +184,16 @@ class Page_SysConfig extends Page } AddModule_Base::setStep($step); } + + private function initAddConfig() + { + $step = Request::any('step', 0); + 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; + } + AddConfig_Base::setStep($step); + } } -- cgit v1.2.3-55-g7522