From 50404f3b23b7fd6aeae4c9d2f6df0ea25e984e66 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 3 May 2016 19:03:09 +0200 Subject: WIP --- .../sysconfig/addmodule_custommodule.inc.php | 163 +++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 modules-available/sysconfig/addmodule_custommodule.inc.php (limited to 'modules-available/sysconfig/addmodule_custommodule.inc.php') diff --git a/modules-available/sysconfig/addmodule_custommodule.inc.php b/modules-available/sysconfig/addmodule_custommodule.inc.php new file mode 100644 index 00000000..023463f7 --- /dev/null +++ b/modules-available/sysconfig/addmodule_custommodule.inc.php @@ -0,0 +1,163 @@ + 'CustomModule_ProcessUpload', + 'edit' => $this->edit ? $this->edit->id() : false + )); + } + +} + +/** + * Some file has just been uploaded. Try to store it, then try to unpack/analyze it. + * If this succeeds, we proceed to the next step where we present the user our findings + * and ask what to do with this. + */ +class CustomModule_ProcessUpload extends AddModule_Base +{ + + private $taskId = false; + + protected function preprocessInternal() + { + if (!isset($_FILES['modulefile'])) { + Message::addError('missing-file'); + Util::redirect('?do=SysConfig'); + } + if ($_FILES['modulefile']['error'] != UPLOAD_ERR_OK) { + Message::addError('upload-failed', Util::uploadErrorString($_FILES['modulefile']['error'])); + Util::redirect('?do=SysConfig'); + } + $tempfile = '/tmp/bwlp-' . mt_rand(1, 100000) . '-' . crc32($_SERVER['REMOTE_ADDR']) . '.tmp'; + if (!move_uploaded_file($_FILES['modulefile']['tmp_name'], $tempfile)) { + Message::addError('error-write', $tempfile); + Util::redirect('?do=SysConfig'); + } + $this->taskId = 'tgzmod' . mt_rand() . '-' . microtime(true); + Taskmanager::submit('ListArchive', array( + 'id' => $this->taskId, + 'file' => $tempfile + ), true); + Session::set('mod_temp', $tempfile); + } + + protected function renderInternal() + { + $status = Taskmanager::waitComplete($this->taskId); + Taskmanager::release($this->taskId); + $tempfile = Session::get('mod_temp'); + if (!isset($status['statusCode'])) { + unlink($tempfile); + $this->tmError(); + } + if ($status['statusCode'] != TASK_FINISHED) { + unlink($tempfile); + $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; + } + } + if ($this->edit !== false) + $title = $this->edit->title(); + elseif (isset($_FILES['modulefile']['name'])) + $title = basename($_FILES['modulefile']['name']); + else + $title = ''; + Render::addDialog(Dictionary::translate('config-module', 'custom_title'), false, 'custom-fileselect', array( + 'step' => 'CustomModule_CompressModule', + 'files' => $list, + 'edit' => $this->edit ? $this->edit->id() : false, + 'title' => $title + )); + Session::save(); + } + +} + +class CustomModule_CompressModule extends AddModule_Base +{ + + private $taskId = false; + + protected function preprocessInternal() + { + $title = Request::post('title'); + $tempfile = Session::get('mod_temp'); + if (empty($title) || empty($tempfile) || !file_exists($tempfile)) { + Message::addError('empty-field'); + Util::redirect('?do=SysConfig&action=addmodule&step=CustomModule_Start'); + } + // Recompress using task manager + $this->taskId = 'tgzmod' . mt_rand() . '-' . microtime(true); + $destFile = tempnam(sys_get_temp_dir(), 'bwlp-') . '.tgz'; + Taskmanager::submit('RecompressArchive', array( + 'id' => $this->taskId, + 'inputFiles' => array($tempfile), + 'outputFile' => $destFile + ), true); + $status = Taskmanager::waitComplete($this->taskId); + unlink($tempfile); + if (!isset($status['statusCode'])) { + $this->tmError(); + } + if ($status['statusCode'] != TASK_FINISHED) { + $this->taskError($status); + } + // Seems ok, create entry + if ($this->edit === false) + $module = ConfigModule::getInstance('CustomModule'); + else + $module = $this->edit; + if ($module === false) { + Message::addError('error-read', 'custommodule.inc.php'); + Util::redirect('?do=SysConfig&action=addmodule&step=CustomModule_Start'); + } + $module->setData('tmpFile', $destFile); + if ($this->edit !== false) + $ret = $module->update($title); + else + $ret = $module->insert($title); + if (!$ret) + Util::redirect('?do=SysConfig&action=addmodule&step=CustomModule_Start'); + elseif (!$module->generate($this->edit === false, NULL, 200)) + Util::redirect('?do=SysConfig&action=addmodule&step=CustomModule_Start'); + Session::set('mod_temp', false); + Session::save(); + // Yay + if ($this->edit !== false) + Message::addSuccess('module-edited'); + else + Message::addSuccess('module-added'); + Util::redirect('?do=SysConfig'); + } + +} -- cgit v1.2.3-55-g7522