From 37ac8d8da316d06d960eed934085f8fefed516f2 Mon Sep 17 00:00:00 2001 From: Marcin Haba Date: Fri, 25 Dec 2015 20:51:24 +0100 Subject: [PATCH] baculum: Add dashboard panel --- gui/baculum/protected/Class/Bconsole.php | 1 + gui/baculum/protected/Class/Database.php | 35 +++- gui/baculum/protected/Class/JobManager.php | 14 ++ gui/baculum/protected/Class/Miscellaneous.php | 34 ++++ gui/baculum/protected/JavaScript/graph.js | 61 +++++++ gui/baculum/protected/JavaScript/misc.js | 163 ++++++++++++++++++ .../protected/JavaScript/panel-window.js | 29 +++- .../protected/JavaScript/slide-window.js | 9 + .../protected/JavaScript/statistics.js | 75 ++++++++ gui/baculum/protected/Lang/en/messages.mo | Bin 26201 -> 27407 bytes gui/baculum/protected/Lang/en/messages.po | 72 ++++++++ gui/baculum/protected/Lang/pl/messages.mo | Bin 28289 -> 29645 bytes gui/baculum/protected/Lang/pl/messages.po | 72 ++++++++ gui/baculum/protected/Layouts/Main.tpl | 3 +- gui/baculum/protected/Pages/API/DbSize.php | 30 ++++ gui/baculum/protected/Pages/API/JobTotals.php | 30 ++++ gui/baculum/protected/Pages/Home.page | 86 ++++++++- gui/baculum/protected/Pages/Home.php | 32 +++- gui/baculum/protected/Pages/Monitor.php | 14 +- gui/baculum/protected/Portlets/TrayBar.tpl | 15 +- gui/baculum/protected/application.xml | 2 + gui/baculum/themes/Baculum-v1/client.png | Bin 0 -> 5095 bytes gui/baculum/themes/Baculum-v1/clients.png | Bin 0 -> 7093 bytes gui/baculum/themes/Baculum-v1/dashboard.png | Bin 0 -> 1123 bytes gui/baculum/themes/Baculum-v1/database.png | Bin 0 -> 6846 bytes .../themes/Baculum-v1/finished-jobs.png | Bin 0 -> 3730 bytes gui/baculum/themes/Baculum-v1/graphs.png | Bin 0 -> 859 bytes gui/baculum/themes/Baculum-v1/jobrun.png | Bin 0 -> 6281 bytes gui/baculum/themes/Baculum-v1/jobs.png | Bin 0 -> 3457 bytes gui/baculum/themes/Baculum-v1/jobtotals.png | Bin 0 -> 3804 bytes gui/baculum/themes/Baculum-v1/pools.png | Bin 0 -> 7655 bytes .../themes/Baculum-v1/quick-access.png | Bin 0 -> 4318 bytes gui/baculum/themes/Baculum-v1/restore.png | Bin 0 -> 5203 bytes gui/baculum/themes/Baculum-v1/setting.png | Bin 0 -> 5554 bytes gui/baculum/themes/Baculum-v1/storages.png | Bin 0 -> 4066 bytes gui/baculum/themes/Baculum-v1/style.css | 95 ++++++++-- gui/baculum/themes/Baculum-v1/tapes.png | Bin 0 -> 3392 bytes gui/baculum/themes/Baculum-v1/volumes.png | Bin 0 -> 5059 bytes gui/baculum/themes/Baculum-v1/workspace.png | Bin 0 -> 1541 bytes 39 files changed, 837 insertions(+), 35 deletions(-) create mode 100644 gui/baculum/protected/JavaScript/statistics.js create mode 100644 gui/baculum/protected/Pages/API/DbSize.php create mode 100644 gui/baculum/protected/Pages/API/JobTotals.php create mode 100644 gui/baculum/themes/Baculum-v1/client.png create mode 100644 gui/baculum/themes/Baculum-v1/clients.png create mode 100644 gui/baculum/themes/Baculum-v1/dashboard.png create mode 100644 gui/baculum/themes/Baculum-v1/database.png create mode 100644 gui/baculum/themes/Baculum-v1/finished-jobs.png create mode 100644 gui/baculum/themes/Baculum-v1/graphs.png create mode 100644 gui/baculum/themes/Baculum-v1/jobrun.png create mode 100644 gui/baculum/themes/Baculum-v1/jobs.png create mode 100644 gui/baculum/themes/Baculum-v1/jobtotals.png create mode 100644 gui/baculum/themes/Baculum-v1/pools.png create mode 100644 gui/baculum/themes/Baculum-v1/quick-access.png create mode 100644 gui/baculum/themes/Baculum-v1/restore.png create mode 100644 gui/baculum/themes/Baculum-v1/setting.png create mode 100644 gui/baculum/themes/Baculum-v1/storages.png create mode 100644 gui/baculum/themes/Baculum-v1/tapes.png create mode 100644 gui/baculum/themes/Baculum-v1/volumes.png create mode 100644 gui/baculum/themes/Baculum-v1/workspace.png diff --git a/gui/baculum/protected/Class/Bconsole.php b/gui/baculum/protected/Class/Bconsole.php index a3f27202bc..9dc27690df 100644 --- a/gui/baculum/protected/Class/Bconsole.php +++ b/gui/baculum/protected/Class/Bconsole.php @@ -91,6 +91,7 @@ class Bconsole extends TModule { } private function execCommand($director, array $command, $user) { + $cmd = ''; if(!is_null($director) && $this->isValidDirector($director) === false) { $output = array(BconsoleError::MSG_ERROR_INVALID_DIRECTOR, ''); $exitcode = BconsoleError::ERROR_INVALID_DIRECTOR; diff --git a/gui/baculum/protected/Class/Database.php b/gui/baculum/protected/Class/Database.php index 0d6a9b356a..a2fdfd71a9 100644 --- a/gui/baculum/protected/Class/Database.php +++ b/gui/baculum/protected/Class/Database.php @@ -119,5 +119,38 @@ class Database extends TModule { $ret = (array_key_exists('versionid', $result) === true) ? $result['versionid'] : false; return $ret; } + + public function getDatabaseSize() { + $configuration = $this->Application->getModule('configuration'); + $db_params = $this->getDBParams(); + $dbtype = $db_params['type']; + $dbname = $db_params['name']; + + $db = new ActiveRecord(); + $connection = $db->getDbConnection(); + $connection->setActive(true); + $pdo = $connection->getPdoInstance(); + + $dbsize = 0; + if ($configuration->isPostgreSQLType($dbtype)) { + $sql = "SELECT pg_database_size('$dbname') AS dbsize"; + $result = $pdo->query($sql); + $dbsize = $result->fetch(); + } else if ($configuration->isMySQLType($dbtype)) { + $sql = "SELECT Sum(data_length + index_length) AS dbsize FROM information_schema.tables"; + $result = $pdo->query($sql); + $dbsize = $result->fetch(); + } else if ($configuration->isSQLiteType($dbtype)) { + $sql = "PRAGMA page_count"; + $result = $pdo->query($sql); + $page_count = $result->fetch(); + $sql = "PRAGMA page_size"; + $result = $pdo->query($sql); + $page_size = $result->fetch(); + $dbsize = array('dbsize' => ($page_count['page_count'] * $page_size['page_size'])); + } + $pdo = null; + return $dbsize['dbsize']; + } } -?> \ No newline at end of file +?> diff --git a/gui/baculum/protected/Class/JobManager.php b/gui/baculum/protected/Class/JobManager.php index d4d5fc4ae4..cf53733d6b 100644 --- a/gui/baculum/protected/Class/JobManager.php +++ b/gui/baculum/protected/Class/JobManager.php @@ -71,5 +71,19 @@ class JobManager extends TModule { } return $jobids; } + + public function getJobTotals() { + $jobtotals = array('bytes' => 0, 'files' => 0); + $connection = JobRecord::finder()->getDbConnection(); + $connection->setActive(true); + $sql = "SELECT sum(JobFiles) AS files, sum(JobBytes) AS bytes FROM Job"; + $pdo = $connection->getPdoInstance(); + $result = $pdo->query($sql); + $ret = $result->fetch(); + $jobtotals['bytes'] = $ret['bytes']; + $jobtotals['files'] = $ret['files']; + $pdo = null; + return $jobtotals; + } } ?> diff --git a/gui/baculum/protected/Class/Miscellaneous.php b/gui/baculum/protected/Class/Miscellaneous.php index f1e33a03be..1767f1ebb3 100644 --- a/gui/baculum/protected/Class/Miscellaneous.php +++ b/gui/baculum/protected/Class/Miscellaneous.php @@ -75,6 +75,12 @@ class Miscellaneous extends TModule { 'L' => array('value' => 'Commiting data', 'description' =>'Committing data (last despool)') ); + private $jobStatesOK = array('T', 'D'); + private $jobStatesWarning = array('W'); + private $jobStatesError = array('E', 'e', 'f', 'I'); + private $jobStatesCancel = array('A'); + private $jobStatesRunning = array('C', 'R', 'B', 'F', 'S', 'm', 'M', 's', 'j', 'c', 'd','t', 'p', 'i', 'a', 'l', 'L'); + private $runningJobStates = array('C', 'R'); /** @@ -117,6 +123,34 @@ class Miscellaneous extends TModule { } + public function getJobStatesByType($type) { + $statesByType = array(); + $states = array(); + switch($type) { + case 'ok': + $states = $this->jobStatesOK; + break; + case 'warning': + $states = $this->jobStatesWarning; + break; + case 'error': + $states = $this->jobStatesError; + break; + case 'cancel': + $states = $this->jobStatesCancel; + break; + case 'running': + $states = $this->jobStatesRunning; + break; + } + + for ($i = 0; $i < count($states); $i++) { + $statesByType[$states[$i]] = $this->getJobState($states[$i]); + } + + return $statesByType; + } + public function isValidJobLevel($jobLevel) { return array_key_exists($jobLevel, $this->getJobLevels()); } diff --git a/gui/baculum/protected/JavaScript/graph.js b/gui/baculum/protected/JavaScript/graph.js index c8c92c765c..ed3f90949f 100644 --- a/gui/baculum/protected/JavaScript/graph.js +++ b/gui/baculum/protected/JavaScript/graph.js @@ -411,6 +411,67 @@ var GraphClass = Class.create({ } }); +var GraphPieClass = Class.create({ + jobs: [], + container: null, + series: null, + pie: null, + graph_options: { + colors: ['#63c422', '#d70808', '#FFFF66', 'orange', 'blue'], + HtmlText: false, + fontColor: '#ffffff', + grid: { + verticalLines : false, + horizontalLines : false, + outlineWidth: 0, + }, + xaxis: { showLabels : false,}, + yaxis: { showLabels : false }, + pie: { + show : true, + explode : 5, + labelFormatter: PieGraph.pie_label_formatter, + shadowSize: 4, + fillOpacity: 1, + sizeRatio: 0.6 + }, + mouse: { + track : true, + trackFormatter: PieGraph.pie_track_formatter, + relative: true + }, + legend: { + position : 'se', + backgroundColor : '#D2E8FF', + margin: 0 + } + }, + initialize: function(jobs, container_id) { + this.jobs = jobs; + this.container = document.getElementById(container_id); + this.series = this.prepare_series(); + this.draw_grah(); + }, + prepare_series: function() { + var series = []; + var label, serie; + var job_types = Object.keys(this.jobs); + var jobs_count; + for (var i = 0; i < job_types.length; i++) { + label = job_types[i]; + jobs_count = this.jobs[label].length; + serie = { + data: [[0, jobs_count]], + label: label + ' (' + jobs_count.toString() + ')' + } + series.push(serie); + } + return series; + }, + draw_grah: function() { + this.pie = Flotr.draw(this.container, this.series, this.graph_options); + } +}); var iso_date_to_timestamp = function(iso_date) { var date_split = iso_date.split(' '); diff --git a/gui/baculum/protected/JavaScript/misc.js b/gui/baculum/protected/JavaScript/misc.js index 34f93eba0e..9500c03026 100644 --- a/gui/baculum/protected/JavaScript/misc.js +++ b/gui/baculum/protected/JavaScript/misc.js @@ -1,5 +1,9 @@ var Units = { get_decimal_size: function(size) { + if (size === null) { + size = 0; + } + size = parseInt(size, 10); var size_unit = 'B'; var units = ['K', 'M', 'G', 'T', 'P']; @@ -17,6 +21,35 @@ var Units = { } } +var Strings = { + limits: { + label: 15 + }, + get_short_label: function(txt) { + var short_txt = txt; + var cut = ((this.limits.label - 2) / 2); + if (txt.length > this.limits.label) { + short_txt = txt.substr(0, cut) + '..' + txt.substr(-cut); + } + return short_txt; + } +} + +var PieGraph = { + pie_label_formatter: function (total, value) { + var percents = (100 * value / total).toFixed(1); + if (percents >= 1) { + percents = percents.toString() + '%'; + } else { + percents = ''; + } + return percents; + }, + pie_track_formatter: function(e) { + return e.series.label; + } +} + var Formatters = { formatter: [ {css_class: 'size', format_func: Units.get_decimal_size} @@ -62,3 +95,133 @@ var Cookies = { return cookie_val; } } + +var Dashboard = { + stats: null, + txt: null, + pie: null, + noval: '-', + ids: { + clients: { + no: 'clients_no', + most: 'clients_most', + jobs: 'clients_jobs' + }, + jobs: { + to_view: 'jobs_to_view', + most: 'jobs_most', + most_count: 'jobs_most_count' + }, + jobtotals: { + total_bytes: 'jobs_total_bytes', + total_files: 'jobs_total_files' + }, + database: { + size: 'database_size' + }, + pools: { + no: 'pools_no', + most: 'pools_most', + jobs: 'pools_jobs' + }, + pie_summary: 'jobs_summary_graph' + }, + update_all: function(statistics, txt) { + this.stats = statistics; + this.txt = txt; + this.update_pie_jobstatus(); + this.update_clients(); + this.update_job_access(); + this.update_jobs(); + this.update_jobtotals(); + this.update_database(); + this.update_pools(); + }, + update_clients: function() { + var clients = this.stats.clients_occupancy; + var most_occuped_client = this.noval; + var occupancy = -1; + for (client in clients) { + if (occupancy < clients[client]) { + most_occuped_client = client; + occupancy = clients[client]; + } + } + + if (occupancy === -1) { + occupancy = 0; + } + + document.getElementById(this.ids.clients.no).textContent = Object.keys(this.stats.clients).length; + document.getElementById(this.ids.clients.most).setAttribute('title', most_occuped_client); + document.getElementById(this.ids.clients.most).textContent = Strings.get_short_label(most_occuped_client); + document.getElementById(this.ids.clients.jobs).textContent = occupancy; + }, + update_job_access: function() { + var jobs_combobox= document.getElementById(this.ids.jobs.to_view); + jobs_combobox.innerHTML = ''; + var last_jobs = this.stats.jobs.slice(0, 100); + for (var i = 0; i < last_jobs.length; i++) { + var opt = document.createElement('OPTION'); + var txt = '[' + last_jobs[i].jobid + '] ' + last_jobs[i].name + ' (' + this.txt.level + ': ' + last_jobs[i].level + ' ' + this.txt.status + ': ' + last_jobs[i].jobstatus + ' ' + this.txt.starttime + ': ' + last_jobs[i].starttime + ')'; + var label = document.createTextNode(txt); + opt.value = last_jobs[i].jobid; + opt.appendChild(label); + jobs_combobox.appendChild(opt); + } + }, + update_jobs: function() { + var jobs = this.stats.jobs_occupancy; + var most_occuped_job = this.noval; + var occupancy = -1; + for (job in jobs) { + if (occupancy < jobs[job]) { + most_occuped_job = job; + occupancy = jobs[job]; + } + } + + if (occupancy === -1) { + occupancy = 0; + } + + document.getElementById(this.ids.jobs.most).setAttribute('title',most_occuped_job); + document.getElementById(this.ids.jobs.most).textContent = Strings.get_short_label(most_occuped_job); + document.getElementById(this.ids.jobs.most_count).textContent = occupancy; + }, + update_jobtotals: function() { + document.getElementById(this.ids.jobtotals.total_bytes).textContent = Units.get_decimal_size(this.stats.jobtotals.bytes); + document.getElementById(this.ids.jobtotals.total_files).textContent = this.stats.jobtotals.files || 0; + }, + update_database: function() { + document.getElementById(this.ids.database.size).textContent = Units.get_decimal_size(this.stats.dbsize); + }, + update_pools: function() { + var pools = this.stats.pools_occupancy; + var most_occuped_pool = this.noval; + var occupancy = -1; + for (pool in pools) { + if (occupancy < pools[pool]) { + most_occuped_pool = pool; + occupancy = pools[pool]; + } + } + + if (occupancy === -1) { + occupancy = 0; + } + + document.getElementById(this.ids.pools.no).textContent = Object.keys(this.stats.pools).length; + document.getElementById(this.ids.pools.most).setAttribute('title', most_occuped_pool); + document.getElementById(this.ids.pools.most).textContent = Strings.get_short_label(most_occuped_pool); + document.getElementById(this.ids.pools.jobs).textContent = occupancy; + }, + update_pie_jobstatus: function() { + if (PanelWindow.currentWindowId === 'dashboard') { + if (this.pie != null) { + this.pie.pie.destroy(); + } + this.pie = new GraphPieClass(this.stats.jobs_summary, this.ids.pie_summary); + } + } +} diff --git a/gui/baculum/protected/JavaScript/panel-window.js b/gui/baculum/protected/JavaScript/panel-window.js index 77bd1a11eb..82881cb1dc 100644 --- a/gui/baculum/protected/JavaScript/panel-window.js +++ b/gui/baculum/protected/JavaScript/panel-window.js @@ -1,18 +1,28 @@ var PanelWindowClass = Class.create({ - currentWindow: null, - windowElements: ['container', 'graphs'], + currentWindowId: null, + windowIds: ['dashboard', 'container', 'graphs'], onShow: null, + initialize: function() { + this.currentWindowId = this.windowIds[0]; + }, + hideOthers: function() { - this.windowElements.each(function(element) { - if(element != this.currentWindow) { - Effect.toggle(element, 'slide', {duration: 0.3, afterFinish : function() { - $(element).hide(); - }.bind(element) + var hide_panel_by_id = function(id) { + var el = $(id); + if(el.visible() === true && id != this.currentWindowId) { + Effect.toggle(el, 'slide', { + duration: 0.3, + afterFinish: function() { + el.hide(); + }.bind(el) }); } - }.bind(this)); + } + for (var i = 0, j = 1; i < this.windowIds.length; i++, j++) { + hide_panel_by_id(this.windowIds[i]); + } }, show: function(id) { @@ -20,7 +30,7 @@ var PanelWindowClass = Class.create({ return; } - this.currentWindow = id; + this.currentWindowId = id; Effect.toggle(id, 'slide', { duration: 0.3, beforeStart: function() { @@ -30,6 +40,7 @@ var PanelWindowClass = Class.create({ if (this.onShow) { this.onShow(); } + setContentWidth(); }.bind(this) }); } diff --git a/gui/baculum/protected/JavaScript/slide-window.js b/gui/baculum/protected/JavaScript/slide-window.js index 202ee88845..557b6e826d 100644 --- a/gui/baculum/protected/JavaScript/slide-window.js +++ b/gui/baculum/protected/JavaScript/slide-window.js @@ -596,6 +596,15 @@ var SlideWindowClass = Class.create({ }, setInitElementId: function(id) { this.initElementId = id; + }, + quickJumpToElement: function(id, btn_id, panel_obj) { + this.setInitElementId(id); + panel_obj.show('container'); + if (this.isWindowOpen() === true) { + this.openConfigurationById(id); + } else { + $(btn_id).click(); + } } }); diff --git a/gui/baculum/protected/JavaScript/statistics.js b/gui/baculum/protected/JavaScript/statistics.js new file mode 100644 index 0000000000..b211691fa3 --- /dev/null +++ b/gui/baculum/protected/JavaScript/statistics.js @@ -0,0 +1,75 @@ +var Statistics = { + jobs: null, + clients: null, + pools: null, + jobtotals: null, + dbsize: null, + clients_occupancy: {}, + pools_occupancy: {}, + jobs_summary: [], + grab_statistics: function(data, jobstates) { + this.jobs = data.jobs; + this.clients = data.clients; + this.pools = data.pools; + this.jobtotals = data.jobtotals; + this.dbsize = data.dbsize; + var jobs_count = this.jobs.length; + var clients_occupancy = {}; + var pools_occupancy = {}; + var jobs_occupancy = {}; + var jobs_summary = { + ok: [], + error: [], + warning: [], + cancel: [], + running: [] + }; + var status_type; + for (var i = 0; i < jobs_count; i++) { + if (typeof(clients_occupancy[this.jobs[i].clientid]) === 'undefined') { + clients_occupancy[this.jobs[i].clientid] = 1; + } else { + clients_occupancy[this.jobs[i].clientid] += 1; + } + + if (typeof(pools_occupancy[this.jobs[i].poolid]) === 'undefined') { + pools_occupancy[this.jobs[i].poolid] = 1; + } else { + pools_occupancy[this.jobs[i].poolid] += 1; + } + + if (typeof(jobs_occupancy[this.jobs[i].name]) === 'undefined') { + jobs_occupancy[this.jobs[i].name] = 1; + } else { + jobs_occupancy[this.jobs[i].name] += 1; + } + if (jobstates.hasOwnProperty(this.jobs[i].jobstatus)) { + status_type = jobstates[this.jobs[i].jobstatus].type; + if (status_type == 'ok' && this.jobs[i].joberrors > 0) { + status_type = 'warning'; + } + jobs_summary[status_type].push(this.jobs[i]); + } + } + var clients_ids = Object.keys(clients_occupancy); + for (var i = 0; i < clients_ids.length; i++) { + for (var j = 0; j < this.clients.length; j++) { + if (clients_ids[i] == this.clients[j].clientid) { + this.clients_occupancy[this.clients[j].name] = clients_occupancy[clients_ids[i]]; + } + } + } + + var pools_ids = Object.keys(pools_occupancy); + for (var i = 0; i < pools_ids.length; i++) { + for (var j = 0; j < this.pools.length; j++) { + if (pools_ids[i] == this.pools[j].poolid) { + this.pools_occupancy[this.pools[j].name] = pools_occupancy[pools_ids[i]]; + } + } + } + + this.jobs_occupancy = jobs_occupancy; + this.jobs_summary = jobs_summary; + } +} diff --git a/gui/baculum/protected/Lang/en/messages.mo b/gui/baculum/protected/Lang/en/messages.mo index 14202632c6ef9dd69c127a1b5481ef74c382a50b..bf230e4dea11bf56352fd4a9cb92eadef0095287 100644 GIT binary patch literal 27407 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 VZXGZ6Cx1hi-OOK8?eL$H{WsaaDxd%W delta 7548 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 diff --git a/gui/baculum/protected/Lang/en/messages.po b/gui/baculum/protected/Lang/en/messages.po index 790af8a41f..b4dcf0f6f4 100644 --- a/gui/baculum/protected/Lang/en/messages.po +++ b/gui/baculum/protected/Lang/en/messages.po @@ -1022,6 +1022,78 @@ msgstr "Job:" msgid "Media Type" msgstr "Media Type" +msgid "Dashboard" +msgstr "Dashboard" + msgid "Go to started job after start:" msgstr "Go to started job after start:" +msgid "Jobs status summary" +msgstr "Jobs status summary" + +msgid "Quick job access" +msgstr "Quick job access" + +msgid "Finished jobs" +msgstr "Finished jobs" + +msgid "Most often used:" +msgstr "Most often used:" + +msgid "Number of clients:" +msgstr "Number of clients:" + +msgid "jobs" +msgstr "jobs" + +msgid "Jobs count on most used:" +msgstr "Jobs count on most used:" + +msgid "level" +msgstr "level" + +msgid "status" +msgstr "status" + +msgid "Jump to job (last 100):" +msgstr "Jump to job (last 100):" + +msgid "View" +msgstr "View" + +msgid "Total bytes:" +msgstr "Total bytes:" + +msgid "Total files:" +msgstr "Total files:" + +msgid "Database size:" +msgstr "Database size:" + +msgid "Number of pools:" +msgstr "Number of pools:" + +msgid "times" +msgstr "times" + +msgid "Execution count most used:" +msgstr "Execution count most used:" + +msgid "Job Totals" +msgstr "Job Totals" + +msgid "Restore Wizard" +msgstr "Restore Wizard" + +msgid "Perform Restore" +msgstr "Perform Restore" + +msgid "Configuration Wizard" +msgstr "Configuration Wizard" + +msgid "Baculum Settings" +msgstr "Baculum Settings" + +msgid "start time" +msgstr "start time" + diff --git a/gui/baculum/protected/Lang/pl/messages.mo b/gui/baculum/protected/Lang/pl/messages.mo index 953bc6e95a16a4efa61f341f6e1eb895e721d993..ba936762c4e5e1bd52f7b3c3fab154869bb01372 100644 GIT binary patch delta 8771 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 diff --git a/gui/baculum/protected/Lang/pl/messages.po b/gui/baculum/protected/Lang/pl/messages.po index 8292ffd2b8..eb0f93f57c 100644 --- a/gui/baculum/protected/Lang/pl/messages.po +++ b/gui/baculum/protected/Lang/pl/messages.po @@ -1023,6 +1023,78 @@ msgstr "Zadanie:" msgid "Media Type" msgstr "Media Type" +msgid "Dashboard" +msgstr "Start" + msgid "Go to started job after start:" msgstr "Przejdź do uruchomionego zadania po starcie:" +msgid "Jobs status summary" +msgstr "Podsumowanie statusu zadań" + +msgid "Quick job access" +msgstr "Quick job access" + +msgid "Finished jobs" +msgstr "Zakończone zadania" + +msgid "Most often used:" +msgstr "Najczęściej używany:" + +msgid "Number of clients:" +msgstr "Ilość klientów:" + +msgid "jobs" +msgstr "zadań" + +msgid "Jobs count on most used:" +msgstr "Ilość zadań na najczęściej używanym:" + +msgid "level" +msgstr "poziom" + +msgid "status" +msgstr "status" + +msgid "Jump to job (last 100):" +msgstr "Skocz do zadania (ostatnie 100):" + +msgid "View" +msgstr "Zobacz" + +msgid "Total bytes:" +msgstr "Całkowita ilość danych:" + +msgid "Total files:" +msgstr "Całkowita ilość plików:" + +msgid "Database size:" +msgstr "Rozmiar bazy danych:" + +msgid "Number of pools:" +msgstr "Ilość puli wolumenów:" + +msgid "times" +msgstr "razy" + +msgid "Execution count most used:" +msgstr "Ilość wykonań najczęściej używanego:" + +msgid "Job Totals" +msgstr "Podsumowanie zadań" + +msgid "Restore Wizard" +msgstr "Kreator przywracania danych" + +msgid "Perform Restore" +msgstr "Wykonaj przywracanie danych" + +msgid "Configuration Wizard" +msgstr "Kreator Konfiguracji" + +msgid "Baculum Settings" +msgstr "Ustawienia Baculum" + +msgid "start time" +msgstr "czas rozpoczęcia" + diff --git a/gui/baculum/protected/Layouts/Main.tpl b/gui/baculum/protected/Layouts/Main.tpl index 74fbdaca87..ed3bc171ce 100644 --- a/gui/baculum/protected/Layouts/Main.tpl +++ b/gui/baculum/protected/Layouts/Main.tpl @@ -7,12 +7,13 @@ /> /> /> + /> /> /> /> /> /> - /> + /> diff --git a/gui/baculum/protected/Pages/API/DbSize.php b/gui/baculum/protected/Pages/API/DbSize.php new file mode 100644 index 0000000000..6d0c2e4757 --- /dev/null +++ b/gui/baculum/protected/Pages/API/DbSize.php @@ -0,0 +1,30 @@ +getModule('db')->getDatabaseSize(); + $this->output = $dbsize; + $this->error = JobError::ERROR_NO_ERRORS; + } +} +?> diff --git a/gui/baculum/protected/Pages/API/JobTotals.php b/gui/baculum/protected/Pages/API/JobTotals.php new file mode 100644 index 0000000000..18e04cac9e --- /dev/null +++ b/gui/baculum/protected/Pages/API/JobTotals.php @@ -0,0 +1,30 @@ +getModule('job')->getJobTotals(); + $this->output = $jobtotals; + $this->error = JobError::ERROR_NO_ERRORS; + } +} +?> diff --git a/gui/baculum/protected/Pages/Home.page b/gui/baculum/protected/Pages/Home.page index cadfe132f7..068f060e00 100644 --- a/gui/baculum/protected/Pages/Home.page +++ b/gui/baculum/protected/Pages/Home.page @@ -1,17 +1,82 @@ <%@ MasterClass="Application.Layouts.Main" Theme="Baculum-v1"%>
- Baculum +
- - + + + + + +
-
+
+
+
+
+ +
+ <%[ Jobs status summary ]%> +
+
+
+ <%[ Clients ]%> + +

<%[ Number of clients: ]%>

+

<%[ Most often used: ]%>

+

<%[ Jobs count on most used: ]%> <%[ jobs ]%>

+
+
+ <%[ Quick job access ]%> + +

<%[ Jump to job (last 100): ]%>

+

<%[ View ]%>

+
+
+ <%[ Finished jobs ]%> + +

<%[ Most often used: ]%>

+

<%[ Execution count most used: ]%> <%[ times ]%>

+
+
+ <%[ Database ]%> + +

<%[ Database type: ]%><%=$this->dbtype%>

+

<%[ Database size: ]%>

+
+
+ <%[ Pools ]%> + +

<%[ Number of pools: ]%>

+

<%[ Most often used: ]%>

+

<%[ Jobs count on most used: ]%> <%[ jobs ]%>

+
+
+ <%[ Job Totals ]%> + +

<%[ Total bytes: ]%>

+

<%[ Total files: ]%>

+
+
+ <%[ Restore Wizard ]%> + <%[ Perform Restore ]%> +
+
+ <%[ Configuration Wizard ]%> + <%[ Baculum Settings ]%> +
+
+
+
+
+