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."
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."
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."
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."
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."
ClientSide.OnComplete="oRunningJobStatus.init_refresh(); oRunningJobStatus.show_loader(false);"
/>
<div class="w3-row">
+ <div id="status_running_job_warning_container" class="w3-panel w3-pale-yellow w3-border" style="display: none">
+ <h3><%[ Warning ]%></h3>
+ <p id="status_running_job_warning_msg"></p>
+ <div id="status_running_job_warning_label_btn" class="w3-section" style="display: none">
+ <com:Application.Web.Portlets.LabelVolume ID="LabelMedia" />
+ </div>
+ </div>
<a href="javascript:void(0)" onclick="W3SubTabs.open('status_running_job_subtab_graphical', 'status_running_job_graphical_output');"<%=!$this->allow_graph_mode ? ' style="display: none"' : ''%>>
<div id="status_running_job_subtab_graphical" class="subtab_btn w3-half w3-bottombar w3-hover-light-grey w3-border-red w3-padding">
<%[ Running job status ]%>
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',
},
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', '<strong>' + data.volume + '</strong>');
+ } 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', '<strong>' + data.storage + '</strong>');
+ msg = msg.replace('%pool', '<strong>' + data.pool + '</strong>');
+ msg = msg.replace('%mediatype', '<strong>' + data.mediatype + '</strong>');
+ var message = document.getElementById(oRunningJobStatus.ids.warning.msg);
+ message.innerHTML = msg;
+ oRunningJobStatus.show_warning(true);
+ } else {
+ oRunningJobStatus.show_warning(false);
+ }
}
}
const JOB_TYPE = 'JobType';
const CLIENTID = 'ClientId';
const JOB_INFO = 'JobInfo';
+ const STORAGE_INFO = 'StorageInfo';
const USE_CACHE = true;
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.
}
$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';
$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<volume>[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<volume>[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+(?P<key>Storage|Pool|Media type):\s*(?P<value>.+)/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<storage>[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);
const SHOW_BUTTON = 'ShowButton';
const BARCODE_LABEL = 'BarcodeLabel';
const STORAGE = 'Storage';
+ const POOL = 'Pool';
public function loadValues() {
$storages = $this->getModule('api')->get(array('storages'));
}
$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();
}
}
$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();
}
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);
+ }
}
?>
<div class="w3-modal-content w3-animate-top w3-card-4">
<header class="w3-container w3-teal">
<span onclick="show_label_volume_window(false);" class="w3-button w3-display-topright">×</span>
- <h2><%[ Label volume(s) ]%></h2>
+ <h2><%[ Label volume(s) ]%> <%=$this->Storage ? Prado::localize('Storage:') . ' ' . $this->Storage : ''%></h2>
</header>
<div class="w3-padding">
<com:TValidationSummary