]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
baculum: Add cancel jobs running on storage endpoint
authorMarcin Haba <marcin.haba@bacula.pl>
Mon, 15 Jan 2024 08:48:20 +0000 (09:48 +0100)
committerMarcin Haba <marcin.haba@bacula.pl>
Thu, 18 Jan 2024 09:22:38 +0000 (10:22 +0100)
gui/baculum/protected/API/Modules/Bconsole.php
gui/baculum/protected/API/Pages/API/StorageJobsCancel.php [new file with mode: 0644]
gui/baculum/protected/API/Pages/API/endpoints.xml
gui/baculum/protected/API/openapi_baculum.json

index a1b6c80daefdcfe0038060a9469e3525a407f24c..0f32e0400630e529d1653c452e11bc6aecee35f1 100644 (file)
@@ -170,7 +170,10 @@ class Bconsole extends APIModule {
        }
 
        private function prepareResult(array $output, $exitcode, $bconsole_command) {
-               array_pop($output); // deleted 'quit' bconsole command
+               $out_len = count($output);
+               if  ($out_len > 0 && strpos($output[$out_len - 1], 'quit') !== false) {
+                       array_pop($output); // deleted 'quit' bconsole command
+               }
                $out = $output;
                if (strpos($bconsole_command, PHP_EOL) !== false) {
                        // for multiline commands take the first command line
diff --git a/gui/baculum/protected/API/Pages/API/StorageJobsCancel.php b/gui/baculum/protected/API/Pages/API/StorageJobsCancel.php
new file mode 100644 (file)
index 0000000..f77edb7
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+/*
+ * Bacula(R) - The Network Backup Solution
+ * Baculum   - Bacula web interface
+ *
+ * Copyright (C) 2013-2024 Kern Sibbald
+ *
+ * The main author of Baculum is Marcin Haba.
+ * The original author of Bacula is Kern Sibbald, with contributions
+ * from many others, a complete list can be found in the file AUTHORS.
+ *
+ * You may use this file and others of this release according to the
+ * license defined in the LICENSE file, which includes the Affero General
+ * Public License, v3.0 ("AGPLv3") and some additional permissions and
+ * terms pursuant to its AGPLv3 Section 7.
+ *
+ * This notice must be preserved when any source code is
+ * conveyed and/or propagated.
+ *
+ * Bacula(R) is a registered trademark of Kern Sibbald.
+ */
+
+use Baculum\API\Modules\BaculumAPIServer;
+use Baculum\API\Modules\StatusStorage;
+use Baculum\Common\Modules\Errors\StorageError;
+
+/**
+ * Cancel all jobs executed by given storage.
+ *
+ * @author Marcin Haba <marcin.haba@bacula.pl>
+ * @category API
+ * @package Baculum API
+ */
+class StorageJobsCancel extends BaculumAPIServer {
+
+       public function set($storageid, $params) {
+               $storage = null;
+               if ($storageid > 0) {
+                       $storage = $this->getModule('storage')->getStorageById($storageid);
+               }
+               $result = $this->getModule('bconsole')->bconsoleCommand(
+                       $this->director,
+                       ['.storage'],
+                       null,
+                       true
+               );
+               if ($result->exitcode === 0) {
+                       if (is_object($storage) && in_array($storage->name, $result->output)) {
+                               $result = $this->getModule('status_sd')->getStatus(
+                                       $this->director,
+                                       $storage->name,
+                                       StatusStorage::OUTPUT_TYPE_RUNNING
+                               );
+                               if ($result['error'] === 0) {
+                                       $cb = function($job) {
+                                               return $job['jobid'];
+                                       };
+                                       $jobids = array_map($cb, $result['output']);
+                                       $result = (object)[
+                                               'output' => [],
+                                               'exitcode' => StorageError::ERROR_NO_ERRORS
+                                       ];
+                                       if (count($jobids) > 0) {
+                                               $result = $this->getModule('bconsole')->bconsoleCommand(
+                                                       $this->director,
+                                                       [
+                                                               'cancel',
+                                                               'jobid="' . implode(',', $jobids) . '"'
+                                                       ]
+                                               );
+                                       }
+                                       $this->output = $result->output;
+                                       $this->error =  $result->exitcode;
+                               } else {
+                                       $this->output = $result['output'];
+                                       $this->error =  $result['error'];
+                               }
+                       } else {
+                               $this->output = StorageError::MSG_ERROR_STORAGE_DOES_NOT_EXISTS;
+                               $this->error = StorageError::ERROR_STORAGE_DOES_NOT_EXISTS;
+                       }
+               } else {
+                       $this->output = $result->output;
+                       $this->error = $result->exitcode;
+               }
+       }
+}
index f3cef97c81ec10d21bbf0d6eabd8f759e47849a0..e655991330cf86d2d10c75459869dee89d789ad8 100644 (file)
@@ -37,6 +37,7 @@
        <url ServiceParameter="StorageMount" pattern="api/v2/storages/{id}/mount/" parameters.id="\d+" />
        <url ServiceParameter="StorageUmount" pattern="api/v2/storages/{id}/umount/" parameters.id="\d+" />
        <url ServiceParameter="StorageRelease" pattern="api/v2/storages/{id}/release/" parameters.id="\d+" />
+       <url ServiceParameter="StorageJobsCancel" pattern="api/v2/storages/{id}/jobs/cancel/" parameters.id="\d+" />
        <url ServiceParameter="StorageCloudTruncate" pattern="api/v2/storages/{id}/cloud/truncate/" parameters.id="\d+" />
        <url ServiceParameter="StorageCloudPrune" pattern="api/v2/storages/{id}/cloud/prune/" parameters.id="\d+" />
        <url ServiceParameter="StorageCloudUpload" pattern="api/v2/storages/{id}/cloud/upload/" parameters.id="\d+" />
index 01dfd9499391a2f14e2a4fce68e527f46aa0b0a5..32a75a718bec16e95e7b9242b92c316a51d0b7e4 100644 (file)
                                ]
                        }
                },
+               "/api/v2/storages/{storageid}/jobs/cancel": {
+                       "put": {
+                               "tags": ["storages"],
+                               "summary": "Cancel all jobs for given storage.",
+                               "description": "Cancel all jobs for given storage.",
+                               "responses": {
+                                       "200": {
+                                               "description": "Output from cancelling all jobs for given storage.",
+                                               "content": {
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "type": "object",
+                                                                       "properties": {
+                                                                               "output": {
+                                                                                       "type": "array",
+                                                                                       "items": {
+                                                                                               "type": "string",
+                                                                                               "description": "Cancel all jobs for storage output."
+                                                                                       }
+                                                                               },
+                                                                               "error": {
+                                                                                       "type": "integer",
+                                                                                       "description": "Error code",
+                                                                                       "enum": [0, 1, 2, 3, 4, 5, 6, 7, 11, 20, 600, 601, 603, 1000]
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               },
+                               "parameters": [
+                                       {
+                                       "$ref": "#/components/parameters/StorageId"
+                                       }
+                               ]
+                       }
+               },
                "/api/v2/storages/{storageid}/release": {
                        "get": {
                                "tags": ["storages"],