From: Marcin Haba Date: Sat, 23 Oct 2021 15:45:48 +0000 (+0200) Subject: baculum: Add warning to running job status if job needs media X-Git-Tag: Release-11.3.2~158 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dda05dbe9c147681216f7bed04fcf737d8e9af7a;p=thirdparty%2Fbacula.git baculum: Add warning to running job status if job needs media --- diff --git a/gui/baculum/protected/Web/Lang/en/messages.mo b/gui/baculum/protected/Web/Lang/en/messages.mo index b9b82fc4a..f887bf649 100644 Binary files a/gui/baculum/protected/Web/Lang/en/messages.mo and b/gui/baculum/protected/Web/Lang/en/messages.mo differ diff --git a/gui/baculum/protected/Web/Lang/en/messages.po b/gui/baculum/protected/Web/Lang/en/messages.po index 7f2dee29e..0d430492e 100644 --- a/gui/baculum/protected/Web/Lang/en/messages.po +++ b/gui/baculum/protected/Web/Lang/en/messages.po @@ -3805,3 +3805,15 @@ msgstr "New migrate job" msgid "Please select the criteria that will be used for selecting backup jobs to migrate." msgstr "Please select the criteria that will be used for selecting backup jobs to migrate." + +msgid "The job needs media." +msgstr "The job needs media." + +msgid "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." diff --git a/gui/baculum/protected/Web/Lang/ja/messages.mo b/gui/baculum/protected/Web/Lang/ja/messages.mo index 5193c2fff..fe34e3ece 100644 Binary files a/gui/baculum/protected/Web/Lang/ja/messages.mo and b/gui/baculum/protected/Web/Lang/ja/messages.mo differ diff --git a/gui/baculum/protected/Web/Lang/ja/messages.po b/gui/baculum/protected/Web/Lang/ja/messages.po index c4e518935..d5df33152 100644 --- a/gui/baculum/protected/Web/Lang/ja/messages.po +++ b/gui/baculum/protected/Web/Lang/ja/messages.po @@ -3891,3 +3891,15 @@ msgstr "New migrate job" msgid "Please select the criteria that will be used for selecting backup jobs to migrate." msgstr "Please select the criteria that will be used for selecting backup jobs to migrate." + +msgid "The job needs media." +msgstr "The job needs media." + +msgid "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." diff --git a/gui/baculum/protected/Web/Lang/pl/messages.mo b/gui/baculum/protected/Web/Lang/pl/messages.mo index 6f1432726..525bd0c10 100644 Binary files a/gui/baculum/protected/Web/Lang/pl/messages.mo and b/gui/baculum/protected/Web/Lang/pl/messages.mo differ diff --git a/gui/baculum/protected/Web/Lang/pl/messages.po b/gui/baculum/protected/Web/Lang/pl/messages.po index 769f61178..9aac42976 100644 --- a/gui/baculum/protected/Web/Lang/pl/messages.po +++ b/gui/baculum/protected/Web/Lang/pl/messages.po @@ -3816,3 +3816,15 @@ msgstr "New migrate job" msgid "Please select the criteria that will be used for selecting backup jobs to migrate." msgstr "Please select the criteria that will be used for selecting backup jobs to migrate." + +msgid "The job needs media." +msgstr "The job needs media." + +msgid "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." diff --git a/gui/baculum/protected/Web/Lang/pt/messages.mo b/gui/baculum/protected/Web/Lang/pt/messages.mo index 17fa3db62..62d049175 100644 Binary files a/gui/baculum/protected/Web/Lang/pt/messages.mo and b/gui/baculum/protected/Web/Lang/pt/messages.mo differ diff --git a/gui/baculum/protected/Web/Lang/pt/messages.po b/gui/baculum/protected/Web/Lang/pt/messages.po index 551b9744b..30e182d2a 100644 --- a/gui/baculum/protected/Web/Lang/pt/messages.po +++ b/gui/baculum/protected/Web/Lang/pt/messages.po @@ -3816,3 +3816,15 @@ msgstr "New migrate job" msgid "Please select the criteria that will be used for selecting backup jobs to migrate." msgstr "Please select the criteria that will be used for selecting backup jobs to migrate." + +msgid "The job needs media." +msgstr "The job needs media." + +msgid "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." diff --git a/gui/baculum/protected/Web/Lang/ru/messages.mo b/gui/baculum/protected/Web/Lang/ru/messages.mo index 4fc1dfd01..929ac449d 100644 Binary files a/gui/baculum/protected/Web/Lang/ru/messages.mo and b/gui/baculum/protected/Web/Lang/ru/messages.mo differ diff --git a/gui/baculum/protected/Web/Lang/ru/messages.po b/gui/baculum/protected/Web/Lang/ru/messages.po index 1f2997886..3e3871312 100644 --- a/gui/baculum/protected/Web/Lang/ru/messages.po +++ b/gui/baculum/protected/Web/Lang/ru/messages.po @@ -3816,3 +3816,15 @@ msgstr "New migrate job" msgid "Please select the criteria that will be used for selecting backup jobs to migrate." msgstr "Please select the criteria that will be used for selecting backup jobs to migrate." + +msgid "The job needs media." +msgstr "The job needs media." + +msgid "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype." + +msgid "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." +msgstr "Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype." diff --git a/gui/baculum/protected/Web/Pages/JobHistoryView.page b/gui/baculum/protected/Web/Pages/JobHistoryView.page index cee5aae06..c0c513cea 100644 --- a/gui/baculum/protected/Web/Pages/JobHistoryView.page +++ b/gui/baculum/protected/Web/Pages/JobHistoryView.page @@ -76,6 +76,13 @@ ClientSide.OnComplete="oRunningJobStatus.init_refresh(); oRunningJobStatus.show_loader(false);" />
+ allow_graph_mode ? ' style="display: none"' : ''%>>
<%[ Running job status ]%> @@ -117,6 +124,11 @@ var oRunningJobStatus = { refresh_interval: 'status_running_job_refresh_interval', status_not_supported: 'status_running_job_status_not_supported', graphical_container: 'status_running_job_graphical_container', + warning: { + container: 'status_running_job_warning_container', + msg: 'status_running_job_warning_msg', + label_btn: 'status_running_job_warning_label_btn' + }, header: { version: 'status_client_version', uname: 'status_client_uname', @@ -390,6 +402,37 @@ var oRunningJobStatus = { }, show_loader: function(show) { document.getElementById(this.ids.loader).style.display = (show === true ? '' : 'none'); + }, + show_warning: function(show) { + var warning = document.getElementById(oRunningJobStatus.ids.warning.container); + warning.style.display = show ? 'block' : 'none'; + }, + set_media_request_msg: function(data) { + if (data.waiting) { + var msg; + var label_btn = document.getElementById(oRunningJobStatus.ids.warning.label_btn); + label_btn.style.display = 'none'; + if (data.volume) { + if (data.write) { + msg = '<%[ The job needs media. ]%> <%[ Please mount volume %volume or label a new one for storage: %storage, pool: %pool, media type: %mediatype. ]%>'; + label_btn.style.display = ''; + } else { + msg = '<%[ The job needs media. ]%> <%[ Please mount volume %volume for storage: %storage, pool: %pool, media type: %mediatype. ]%>'; + } + msg = msg.replace('%volume', '' + data.volume + ''); + } else { + msg = '<%[ The job needs media. ]%> <%[ Please create a new volume for storage: %storage, pool: %pool, media type: %mediatype. ]%>'; + label_btn.style.display = ''; + } + msg = msg.replace('%storage', '' + data.storage + ''); + msg = msg.replace('%pool', '' + data.pool + ''); + msg = msg.replace('%mediatype', '' + data.mediatype + ''); + var message = document.getElementById(oRunningJobStatus.ids.warning.msg); + message.innerHTML = msg; + oRunningJobStatus.show_warning(true); + } else { + oRunningJobStatus.show_warning(false); + } } } diff --git a/gui/baculum/protected/Web/Pages/JobHistoryView.php b/gui/baculum/protected/Web/Pages/JobHistoryView.php index bcc6c20ef..0ede0534e 100644 --- a/gui/baculum/protected/Web/Pages/JobHistoryView.php +++ b/gui/baculum/protected/Web/Pages/JobHistoryView.php @@ -43,6 +43,7 @@ class JobHistoryView extends BaculumWebPage { const JOB_TYPE = 'JobType'; const CLIENTID = 'ClientId'; const JOB_INFO = 'JobInfo'; + const STORAGE_INFO = 'StorageInfo'; const USE_CACHE = true; @@ -296,6 +297,31 @@ class JobHistoryView extends BaculumWebPage { return $this->getViewState(self::JOB_INFO, []); } + /** + * Set all storage information. + * + * @return none + */ + public function setStorageInfo() { + $storages_show = $this->getModule('api')->get( + ['storages', 'show', '?output=json'], + null, + true, + false + ); + if ($storages_show->error == 0) { + $this->setViewState(self::STORAGE_INFO, $storages_show->output); + } + } + + /** + * Get storage information. + * + * @return array storage information + */ + public function getStorageInfo() { + return $this->getViewState(self::STORAGE_INFO, []); + } /** * Reload job information. @@ -327,12 +353,23 @@ class JobHistoryView extends BaculumWebPage { } $log = $this->getModule('api')->get($params); + $joblog = []; if (!is_array($log->output) || count($log->output) == 0) { $msg = Prado::localize("Output for selected job is not available yet or you do not have enabled logging job logs to the catalog database.\n\nTo watch job log you need to add to the job Messages resource the following directive:\n\nCatalog = all, !debug, !skipped, !saved"); - $joblog = array($msg); + $joblog = [$msg]; } else { $joblog = $log->output; + + if ($this->is_running) { + // search for media requests to display warning + $this->findLogMediaRequest($joblog); + } else { + $this->getCallbackClient()->callClientFunction( + 'oRunningJobStatus.show_warning', + [false] + ); + } } if ($this->is_running) { $this->RunningIcon->Display = 'Dynamic'; @@ -355,6 +392,77 @@ class JobHistoryView extends BaculumWebPage { $this->JobLog->Text = implode(PHP_EOL, $joblog); } + private function findLogMediaRequest($joblog) { + $waiting = false; + $needed = [ + 'storage' => '', + 'volume' => '', + 'pool' => '', + 'mediatype' => '', + 'write' => true, + 'waiting' => $waiting + ]; + $joblog = array_reverse($joblog); + for ($i = 0; $i < count($joblog); $i++) { + if (preg_match('/Cannot find any appendable volumes/i', $joblog[$i]) === 1) { + $waiting = true; + } elseif (preg_match('/Please mount read Volume "(?P[a-zA-Z0-9:.\-_]+)" for:/i', $joblog[$i], $match) === 1) { + $needed['volume'] = $match['volume']; + $needed['write'] = false; + $waiting = true; + } elseif (preg_match('/Please mount append Volume "(?P[a-zA-Z0-9:.\-_]+)" or label a new one for:/i', $joblog[$i], $match) === 1) { + $needed['volume'] = $match['volume']; + $waiting = true; + } elseif (preg_match('/(New volume "[a-zA-Z0-9:.\-_]+" mounted on device|Ready to append to end of Volume|Ready to read from volume|Recycled volume.+all previous data lost|Wrote label to prelabeled Volume)/i', $joblog[$i]) === 1) { + // stop checking, new volume provided + break; + } + if ($waiting) { + $log = explode(PHP_EOL, $joblog[$i]); + for ($j = 0; $j < count($log); $j++) { + if (preg_match('/\s+(?PStorage|Pool|Media type):\s*(?P.+)/i', $log[$j], $match) === 1) { + $key = strtolower($match['key']); + $key = str_replace(' ', '', $key); + $needed[$key] = $match['value']; + } + } + if ($needed['storage'] && $needed['pool'] && $needed['mediatype']) { + // everything what needed, so stop + break; + } + } + } + if ($waiting && $needed['write']) { + if (!empty($needed['pool'])) { + // Set pool for labeling + $this->LabelMedia->setPool($needed['pool']); + } + if (!empty($needed['storage'])) { + // Set storage for labeling + if (count($this->StorageInfo) == 0) { + $this->setStorageInfo(); + } + $storage = ''; + if (preg_match('/^"(?P[a-zA-Z0-9:.\-_ ]+)"/', $needed['storage'], $match) === 1) { + $storage = $match['storage']; + } + for ($i = 0; $i < count($this->StorageInfo); $i++) { + if ($this->StorageInfo[$i]->devicename == $storage) { + // Set storage for labeling + $this->LabelMedia->setStorage($this->StorageInfo[$i]->name); + break; + } + } + } + } + $needed['waiting'] = $waiting; + + $this->getCallbackClient()->callClientFunction( + 'oRunningJobStatus.set_media_request_msg', + [$needed] + ); + } + private function isShowRestoreBtn() { $type = $this->getJobType(); return in_array($type, $this->show_restore_types); diff --git a/gui/baculum/protected/Web/Portlets/LabelVolume.php b/gui/baculum/protected/Web/Portlets/LabelVolume.php index 27f3d3320..94f78284d 100644 --- a/gui/baculum/protected/Web/Portlets/LabelVolume.php +++ b/gui/baculum/protected/Web/Portlets/LabelVolume.php @@ -39,6 +39,7 @@ class LabelVolume extends Portlets { const SHOW_BUTTON = 'ShowButton'; const BARCODE_LABEL = 'BarcodeLabel'; const STORAGE = 'Storage'; + const POOL = 'Pool'; public function loadValues() { $storages = $this->getModule('api')->get(array('storages')); @@ -50,8 +51,10 @@ class LabelVolume extends Portlets { } $this->StorageLabel->DataSource = $storage_list; if ($this->Storage) { - $storage_list_flip =array_flip($storage_list); - $this->StorageLabel->SelectedValue = $storage_list_flip[$this->Storage]; + $storage_list_flip = array_flip($storage_list); + if (key_exists($this->Storage, $storage_list_flip)) { + $this->StorageLabel->SelectedValue = $storage_list_flip[$this->Storage]; + } } $this->StorageLabel->dataBind(); @@ -63,6 +66,12 @@ class LabelVolume extends Portlets { } } $this->PoolLabel->dataSource = $pool_list; + if ($this->Pool) { + $pool_list_flip = array_flip($pool_list); + if (key_exists($this->Pool, $pool_list_flip)) { + $this->PoolLabel->SelectedValue = $pool_list_flip[$this->Pool]; + } + } $this->PoolLabel->dataBind(); } @@ -194,5 +203,13 @@ class LabelVolume extends Portlets { public function getStorage() { return $this->getViewState(self::STORAGE); } + + public function setPool($pool) { + $this->setViewState(self::POOL, $pool); + } + + public function getPool() { + return $this->getViewState(self::POOL); + } } ?> diff --git a/gui/baculum/protected/Web/Portlets/LabelVolume.tpl b/gui/baculum/protected/Web/Portlets/LabelVolume.tpl index c8ecd2ff9..6da2e6cfa 100644 --- a/gui/baculum/protected/Web/Portlets/LabelVolume.tpl +++ b/gui/baculum/protected/Web/Portlets/LabelVolume.tpl @@ -13,7 +13,7 @@
× -

<%[ Label volume(s) ]%>

+

<%[ Label volume(s) ]%> <%=$this->Storage ? Prado::localize('Storage:') . ' ' . $this->Storage : ''%>