diff options
author | Simon Rettberg | 2014-05-23 20:49:02 +0200 |
---|---|---|
committer | Simon Rettberg | 2014-05-23 20:49:02 +0200 |
commit | fe6ac16498b05d0f0c8ed7fda394273815d3d6da (patch) | |
tree | cadf5f103ef3db7ba1b40d59d85937c998aad22f /modules/sysconfig/addconfig.inc.php | |
parent | Server Setup page (diff) | |
download | slx-admin-fe6ac16498b05d0f0c8ed7fda394273815d3d6da.tar.gz slx-admin-fe6ac16498b05d0f0c8ed7fda394273815d3d6da.tar.xz slx-admin-fe6ac16498b05d0f0c8ed7fda394273815d3d6da.zip |
Stuff (WIP)
Diffstat (limited to 'modules/sysconfig/addconfig.inc.php')
-rw-r--r-- | modules/sysconfig/addconfig.inc.php | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/modules/sysconfig/addconfig.inc.php b/modules/sysconfig/addconfig.inc.php new file mode 100644 index 00000000..6f076a12 --- /dev/null +++ b/modules/sysconfig/addconfig.inc.php @@ -0,0 +1,220 @@ +<?php + +/** + * Addconfig subpage base - makes sure + * we have the two required methods preprocess and render + */ +abstract class AddConfig_Base +{ + + /** + * + * @var array Known module types + */ + protected static $types = array( + 'AD_AUTH' => array( + 'unique' => true, + 'group' => 'Authentifizierung' + ), + 'custom' => array( + 'unique' => false, + 'group' => 'Generisch' + ) + ); + + /** + * Holds the instance for the currently executing step + * @var \AddConfig_Base + */ + private static $instance = false; + + /** + * + * @param type $step + * @return \AddConfig_Base + */ + public static function setStep($step) + { + if (empty($step) || !class_exists($step) || get_parent_class($step) !== 'AddConfig_Base') { + Message::addError('invalid-action', $step); + Util::redirect('?do=SysConfig'); + } + self::$instance = new $step(); + } + + protected function tmError() + { + Message::addError('taskmanager-error'); + Util::redirect('?do=SysConfig'); + } + + protected function taskError($status) + { + if (isset($status['data']['error'])) { + $error = $status['data']['error']; + } elseif (isset($status['statusCode'])) { + $error = $status['statusCode']; + } else { + $error = 'Unbekannter Taskmanager-Fehler'; // TODO: No text + } + Message::addError('task-error', $error); + Util::redirect('?do=SysConfig'); + } + + /** + * Called before any HTML rendering happens, so you can + * pepare stuff, validate input, and optionally redirect + * early if something is wrong, or you received post + * data etc. + */ + protected function preprocessInternal() + { + // void + } + + /** + * Do page rendering. + */ + protected function renderInternal() + { + // void + } + + /** + * Handle ajax stuff + */ + protected function ajaxInternal() + { + // void + } + + public static function preprocess() + { + if (self::$instance === false) { + Util::traceError('No step instance yet'); + } + self::$instance->preprocessInternal(); + } + + public static function render() + { + if (self::$instance === false) { + Util::traceError('No step instance yet'); + } + self::$instance->renderInternal(); + } + + public static function ajax() + { + if (self::$instance === false) { + Util::traceError('No step instance yet'); + } + self::$instance->ajaxInternal(); + } + +} + +/** + * Start dialog for adding config. Ask for title, + * show selection of modules. + */ +class AddConfig_Start extends AddConfig_Base +{ + + protected function renderInternal() + { + $res = Database::simpleQuery("SELECT moduleid, title, moduletype, filepath FROM configtgz_module" + . " ORDER BY title ASC"); + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + if (!isset(self::$types[$row['moduletype']])) { + self::$types[$row['moduletype']] = array( + 'unique' => false, + 'group' => 'Undefined moduletype in addconfig.inc.php' + ); + } + if (!isset(self::$types[$row['moduletype']]['modules'])) { + self::$types[$row['moduletype']]['modules'] = array(); + self::$types[$row['moduletype']]['groupid'] = $row['moduletype']; + } + if (empty($row['filepath']) || !file_exists($row['filepath'])) $row['missing'] = true; + self::$types[$row['moduletype']]['modules'][] = $row; + } + Render::addDialog('Konfiguration zusammenstellen', false, 'sysconfig/cfg-start', array( + 'token' => Session::get('token'), + 'step' => 'AddConfig_Finish', + 'groups' => array_values(self::$types) + )); + } + +} + +/** + * Start dialog for adding config. Ask for title, + * show selection of modules. + */ +class AddConfig_Finish extends AddConfig_Base +{ + private $task = false; + private $destFile = false; + private $title = false; + private $moduleids = array(); + + protected function preprocessInternal() + { + $modules = Request::post('module'); + $this->title = Request::post('title'); + if (!is_array($modules)) { + Message::addError('missing-file'); + Util::redirect('?do=SysConfig&action=addconfig'); + } + if (empty($this->title)) { + Message::addError('empty-field'); + Util::redirect('?do=SysConfig&action=addconfig'); + } + // Get all input modules + $moduleids = '0'; // Passed directly in query. Make sure no SQL injection is possible + foreach ($modules as $module) { + $moduleids .= ',' . (int)$module; // Casting to int should make it safe + } + $res = Database::simpleQuery("SELECT moduleid, filepath FROM configtgz_module WHERE moduleid IN ($moduleids)"); + $files = array(); + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + $files[] = $row['filepath']; + $this->moduleids[] = $row['moduleid']; + } + // Create output file name (config.tgz) + do { + $this->destFile = CONFIG_TGZ_LIST_DIR . '/config-' . Util::sanitizeFilename($this->title) . '-' . mt_rand() . '.tgz'; + } while (file_exists($this->destFile)); + // Hand over to tm + $this->task = Taskmanager::submit('RecompressArchive', array( + 'inputFiles' => $files, + 'outputFile' => $this->destFile + )); + } + + protected function renderInternal() + { + if (isset($this->task['statusCode']) && $this->task['statusCode'] === TASK_WAITING) { + $this->task = Taskmanager::waitComplete($this->task['id']); + } + if ($this->task === false) $this->tmError(); + if (!isset($this->task['statusCode']) || $this->task['statusCode'] !== TASK_FINISHED) $this->taskError($this->task); + Database::exec("INSERT INTO configtgz (title, filepath) VALUES (:title, :filepath)", array( + 'title' => $this->title, + 'filepath' => $this->destFile + )); + $confid = Database::lastInsertId(); + foreach ($this->moduleids as $moduleid) { + Database::exec("INSERT INTO configtgz_x_module (configid, moduleid) VALUES (:configid, :moduleid)", array( + 'configid' => $confid, + 'moduleid' => $moduleid + )); + } + Render::addDialog('Konfiguration zusammenstellen', false, 'sysconfig/cfg-finish', array( + 'token' => Session::get('token'), + 'configid' => $confid + )); + } + +} |