From: Marcin Haba Date: Fri, 23 Sep 2022 13:14:03 +0000 (+0200) Subject: baculum: Add restore plugin options endpoint X-Git-Tag: Release-13.0.2~62 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe0ede6027e70655e3c77c713831cbe40c73eee1;p=thirdparty%2Fbacula.git baculum: Add restore plugin options endpoint --- diff --git a/gui/baculum/protected/API/Modules/Bconsole.php b/gui/baculum/protected/API/Modules/Bconsole.php index c16e56f9d..dc380e149 100644 --- a/gui/baculum/protected/API/Modules/Bconsole.php +++ b/gui/baculum/protected/API/Modules/Bconsole.php @@ -64,6 +64,7 @@ class Bconsole extends APIModule { 'version', 'status', 'list', + 'llist', 'messages', 'show', 'mount', diff --git a/gui/baculum/protected/API/Modules/ConsoleOutputLlistPage.php b/gui/baculum/protected/API/Modules/ConsoleOutputLlistPage.php new file mode 100644 index 000000000..eda9d212f --- /dev/null +++ b/gui/baculum/protected/API/Modules/ConsoleOutputLlistPage.php @@ -0,0 +1,54 @@ + + * @category API + * @package Baculum API + */ +abstract class ConsoleOutputLlistPage extends ConsoleOutputPage { + + /** + * Parse 'llist' type command output in "key: value" form. + * + * @param array $output command output + * @return array parsed output + */ + protected function parseOutput(array $output) { + $ret = $vals = []; + $out_len = count($output); + for ($i = 0; $i < $out_len; $i++) { + if (preg_match('/^\s*(?P\w+)\s*:\s*(?P.*?)$/i', $output[$i], $matches) === 1) { + $vals[$matches['key']] = $matches['value']; + } + if ((empty($output[$i]) || ($i == ($out_len - 1))) && count($vals) > 0) { + $ret[] = $vals; + $vals = []; + } + } + return $ret; + } +} diff --git a/gui/baculum/protected/API/Pages/API/LlistPluginRestoreConf.php b/gui/baculum/protected/API/Pages/API/LlistPluginRestoreConf.php new file mode 100644 index 000000000..235d5ce35 --- /dev/null +++ b/gui/baculum/protected/API/Pages/API/LlistPluginRestoreConf.php @@ -0,0 +1,92 @@ + + * @category API + * @package Baculum API + */ +class LlistPluginRestoreConf extends ConsoleOutputLlistPage { + + public function get() { + $misc = $this->getModule('misc'); + $jobids = $this->Request->contains('jobids') && $misc->isValidIdsList($this->Request['jobids']) ? $this->Request['jobids'] : 0; + $out_format = $this->Request->contains('output') && $this->isOutputFormatValid($this->Request['output']) ? $this->Request['output'] : ConsoleOutputPage::OUTPUT_FORMAT_RAW; + + if ($jobids === 0) { + $this->output = JobError::MSG_ERROR_JOB_DOES_NOT_EXISTS; + $this->error = JobError::ERROR_JOB_DOES_NOT_EXISTS; + return; + } + + if ($out_format === ConsoleOutputPage::OUTPUT_FORMAT_RAW) { + $out = $this->getRawOutput(['jobids' => $jobids]); + } elseif($out_format === ConsoleOutputPage::OUTPUT_FORMAT_JSON) { + $out = $this->getJSONOutput(['jobids' => $jobids]); + } + $this->output = $out->output; + $this->error = $out->exitcode; + } + + /** + * Get llist output from console in raw format. + * + * @param array $params command parameters + * @return StdClass object with output and exitcode + */ + protected function getRawOutput($params = []) { + return $this->getModule('bconsole')->bconsoleCommand( + $this->director, + [ + 'llist', + 'pluginrestoreconf', + 'jobid="' . $params['jobids'] . '"' + ] + ); + } + + /** + * Get llist output in JSON format. + * + * @param array $params command parameters + * @return StdClass object with output and exitcode + */ + protected function getJSONOutput($params = []) { + $result = (object)[ + 'output' => [], + 'exitcode' => 0 + ]; + $output = $this->getRawOutput($params); + if ($output->exitcode === 0) { + array_shift($output->output); + $result->output = $this->parseOutput($output->output); + } + $result->exitcode = $output->exitcode; + return $result; + } +} diff --git a/gui/baculum/protected/API/Pages/API/endpoints.xml b/gui/baculum/protected/API/Pages/API/endpoints.xml index f0bdf9f61..83cb532c1 100644 --- a/gui/baculum/protected/API/Pages/API/endpoints.xml +++ b/gui/baculum/protected/API/Pages/API/endpoints.xml @@ -77,6 +77,7 @@ + diff --git a/gui/baculum/protected/API/openapi_baculum.json b/gui/baculum/protected/API/openapi_baculum.json index 3c5af0a56..f0a3dd73d 100644 --- a/gui/baculum/protected/API/openapi_baculum.json +++ b/gui/baculum/protected/API/openapi_baculum.json @@ -1991,6 +1991,81 @@ "schema": { "type": "string" } + }, + { + "name": "plugin_options", + "in": "body", + "description": "Pluging options in JSON form: {objectid1: {option1: value1, option2: value2}, objectid2: {option3: value3}...}", + "required": false, + "schema": { + "type": "object" + } + } + ] + } + }, + "/api/v2/jobs/restore/plugin/config": { + "get": { + "tags": ["jobs"], + "summary": "Plugin configuration used for restore", + "consumes": [ "application/json" ], + "description": "Backup job plugin configuration used to restore.", + "responses": { + "200": { + "description": "Plugin configuration", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "output": { + "type": "array", + "items": { + "type": "object", + "properties": { + "jobid": { + "type": "string", + "description": "Job identifier" + }, + "restoreobjectid": { + "type": "string", + "description": "Restore object identifier" + }, + "objectname": { + "type": "string", + "description": "Object name" + }, + "pluginname": { + "type": "string", + "description": "Plugin line with the plugin definition" + }, + "objecttype": { + "type": "string", + "description": "Object type" + } + } + } + }, + "error": { + "type": "integer", + "description": "Error code", + "enum": [0, 1, 4, 5, 6, 7, 11, 50, 1000] + } + } + } + } + } + } + }, + "parameters": [ + { + "name": "jobids", + "in": "query", + "description": "Job identifiers", + "required": true, + "schema": { + "type": "string" + } } ] }