From 60f9483e79bdbf13fb3857511716db36b24b23eb Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 19 Nov 2018 11:54:35 +0100 Subject: [PATCH 001/460] mandatory public_url if is set --- pandora_console/include/functions_ui.php | 45 ++++++++++++++---------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 7d02e1ac11..76ce70f59b 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2407,29 +2407,38 @@ function ui_get_full_url ($url = '', $no_proxy = false, $add_name_php_file = fal $port = $_SERVER['SERVER_PORT']; } } - - if (!$no_proxy) { - //Check if the PandoraFMS runs across the proxy like as - //mod_proxy of Apache - //and check if public_url is setted - if (!empty($config['public_url']) - && (!empty($_SERVER['HTTP_X_FORWARDED_HOST']))) { - $fullurl = $config['public_url']; - $proxy = true; + + if (!empty($config['public_url'])) { + $fullurl = $config['public_url']; + // if user had specify a custom public_url, disable internal homeurl & homeurl_static + $config['homeurl'] = ''; + $config['homeurl_static'] = ''; + + } else { + + if (!$no_proxy) { + //Check if the PandoraFMS runs across the proxy like as + //mod_proxy of Apache + //and check if public_url is set + if (!empty($config['public_url']) + && (!empty($_SERVER['HTTP_X_FORWARDED_HOST']))) { + $fullurl = $config['public_url']; + $proxy = true; + } + else { + $fullurl = $protocol.'://' . $_SERVER['SERVER_NAME']; + } } else { $fullurl = $protocol.'://' . $_SERVER['SERVER_NAME']; } - } - else { - $fullurl = $protocol.'://' . $_SERVER['SERVER_NAME']; - } - - // using a different port than the standard - if (!$proxy) { + // using a different port than the standard - if ( $port != null ) { - $fullurl .= ":" . $port; + if (!$proxy) { + // using a different port than the standard + if ( $port != null ) { + $fullurl .= ":" . $port; + } } } From b90da54c8621eec98d991ccbf5499eddaeffe57c Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 19 Nov 2018 13:16:53 +0100 Subject: [PATCH 002/460] fixed public_url mandatory in MC environments --- pandora_console/include/functions_ui.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 76ce70f59b..40236629f2 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2410,9 +2410,7 @@ function ui_get_full_url ($url = '', $no_proxy = false, $add_name_php_file = fal if (!empty($config['public_url'])) { $fullurl = $config['public_url']; - // if user had specify a custom public_url, disable internal homeurl & homeurl_static - $config['homeurl'] = ''; - $config['homeurl_static'] = ''; + $proxy = true; } else { From 08ea1b22837c95e4ee1aa53a3e4bb9db55c93b05 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 19 Nov 2018 14:15:34 +0100 Subject: [PATCH 003/460] minor fix ui_get_full_url --- pandora_console/include/functions_ui.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 40236629f2..cba6670e4c 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2411,7 +2411,7 @@ function ui_get_full_url ($url = '', $no_proxy = false, $add_name_php_file = fal if (!empty($config['public_url'])) { $fullurl = $config['public_url']; $proxy = true; - + $fullurl .= '/'; } else { if (!$no_proxy) { From f9d123603b2154c158d25a28b4620917cdf753b0 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Mon, 11 Mar 2019 18:03:05 +0100 Subject: [PATCH 004/460] Resolved Former-commit-id: f5628a1fd34771329b2b06664b552beaacf4c369 --- pandora_console/include/functions_events.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index fa8287f406..c5669d808a 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -431,7 +431,7 @@ function events_change_status( $ack_user = $config['id_user']; } else { $acl_utimestamp = 0; - $ack_user = ''; + $ack_user = $config['id_user']; } switch ($new_status) { From aba2ef509a2da8a16862a7f6bb1530ca06170131 Mon Sep 17 00:00:00 2001 From: samucarc Date: Wed, 13 Mar 2019 11:58:21 +0100 Subject: [PATCH 005/460] Fixed messages count Former-commit-id: df7b230fe009e6f73d836cf2290f33deb8a743d9 --- pandora_console/include/functions_messages.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_messages.php b/pandora_console/include/functions_messages.php index 5374fb7b1e..63c12d019d 100644 --- a/pandora_console/include/functions_messages.php +++ b/pandora_console/include/functions_messages.php @@ -383,7 +383,7 @@ function messages_get_count( } $sql = sprintf( - 'SELECT count(*) as "n" FROM ( + 'SELECT count(distinct id_mensaje) as "n" FROM ( SELECT tm.*, utimestamp_read > 0 as "read" From faee7b7b14ab699b5e9674d7fb17515c37d8f60a Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 13 Mar 2019 16:32:58 +0100 Subject: [PATCH 006/460] Pending Q&A Former-commit-id: f41aafc6077f1b725cf7c9f360974ba62609eedd --- pandora_console/godmode/agentes/modificar_agente.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index 4673bf2f46..dfaf6bcba8 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -162,7 +162,7 @@ echo ''; echo __('Group').' '; $own_info = get_user_info($config['id_user']); -if (!$own_info['is_admin'] && !check_acl($config['id_user'], 0, 'AW')) { +if (!$own_info['is_admin'] && !check_acl($config['id_user'], 0, 'AR')) { $return_all_group = false; } else { $return_all_group = true; From 97df41245e4b77efedd6659faa6b249b1698a3d9 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 13 Mar 2019 16:36:30 +0100 Subject: [PATCH 007/460] Para revision Former-commit-id: 5823cfd9976382ad8074d2ed8cf0340e24181693 --- pandora_console/godmode/agentes/modificar_agente.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index dfaf6bcba8..3094c2fdc8 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -162,7 +162,7 @@ echo ''; echo __('Group').' '; $own_info = get_user_info($config['id_user']); -if (!$own_info['is_admin'] && !check_acl($config['id_user'], 0, 'AR')) { +if (!$own_info['is_admin'] && check_acl($config['id_user'], 0, 'AW')) { $return_all_group = false; } else { $return_all_group = true; From 0863c2ffd64c3d8338dcd7eda6153eb6750b36e5 Mon Sep 17 00:00:00 2001 From: samucarc Date: Fri, 15 Mar 2019 11:51:39 +0100 Subject: [PATCH 008/460] Hidden buttons template and wizard in the open visual console Former-commit-id: 42796373226cf112f1abda8b54a780b1546f46c3 --- pandora_console/godmode/reporting/map_builder.php | 2 +- pandora_console/godmode/reporting/visual_console_favorite.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/reporting/map_builder.php b/pandora_console/godmode/reporting/map_builder.php index 6a20eeb30d..4471f8cbd8 100644 --- a/pandora_console/godmode/reporting/map_builder.php +++ b/pandora_console/godmode/reporting/map_builder.php @@ -61,7 +61,7 @@ $buttons['visual_console_favorite'] = [ 'text' => ''.html_print_image('images/list.png', true, ['title' => __('Visual Favourite Console')]).'', ]; -if ($is_enterprise && $vconsoles_manage) { +if ($is_enterprise !== ENTERPRISE_NOT_HOOK && $vconsoles_manage) { $buttons['visual_console_template'] = [ 'active' => false, 'text' => ''.html_print_image('images/templates.png', true, ['title' => __('Visual Console Template')]).'', diff --git a/pandora_console/godmode/reporting/visual_console_favorite.php b/pandora_console/godmode/reporting/visual_console_favorite.php index df13291539..d6fb18de15 100644 --- a/pandora_console/godmode/reporting/visual_console_favorite.php +++ b/pandora_console/godmode/reporting/visual_console_favorite.php @@ -54,7 +54,7 @@ $buttons['visual_console_favorite'] = [ 'text' => ''.html_print_image('images/list.png', true, ['title' => __('Visual Favourite Console')]).'', ]; -if ($is_enterprise && $vconsoles_manage) { +if ($is_enterprise !== ENTERPRISE_NOT_HOOK && $vconsoles_manage) { $buttons['visual_console_template'] = [ 'active' => false, 'text' => ''.html_print_image('images/templates.png', true, ['title' => __('Visual Console Template')]).'', From 1a01c311d6e0d208a98177371d3fb65a8a7fd88e Mon Sep 17 00:00:00 2001 From: samucarc Date: Wed, 20 Mar 2019 18:30:52 +0100 Subject: [PATCH 009/460] Fixed down paginations in manage agents Former-commit-id: 28f7546b2d0cc8f4e1d13763e9c92ac99c2de2f9 --- pandora_console/godmode/agentes/modificar_agente.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index 4673bf2f46..82078fc109 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -670,7 +670,7 @@ if ($agents !== false) { } echo ''; - ui_pagination($total_agents, "index.php?sec=gagente&sec2=godmode/agentes/modificar_agente&group_id=$ag_group&search=$search&sort_field=$sortField&sort=$sort&disabled=$disabled&os=$os", $offset); + ui_pagination($total_agents, "index.php?sec=gagente&sec2=godmode/agentes/modificar_agente&group_id=$ag_group&recursion=$recursion&search=$search&sort_field=$sortField&sort=$sort&disabled=$disabled&os=$os", $offset); echo "'; // Left column @@ -210,7 +214,14 @@ $out = '
"; } else { ui_print_info_message(['no_close' => true, 'message' => __('There are no defined agents') ]); From 8d8b856864d5291bef6421dbc7eae37e06ac5725 Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Fri, 22 Mar 2019 14:03:38 +0100 Subject: [PATCH 010/460] Fixed create from bug: added action with refresh url Former-commit-id: b63f6e6f9169a35d9dcb9cfd078c35fd4deafdac --- pandora_console/godmode/modules/manage_nc_groups.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/modules/manage_nc_groups.php b/pandora_console/godmode/modules/manage_nc_groups.php index 5fddce35f4..6ef4eb0cd9 100644 --- a/pandora_console/godmode/modules/manage_nc_groups.php +++ b/pandora_console/godmode/modules/manage_nc_groups.php @@ -265,7 +265,7 @@ if (isset($data)) { } -echo '
'; +echo ''; echo '
'; html_print_input_hidden('new', 1); html_print_submit_button(__('Create'), 'crt', false, 'class="sub next"'); From 932802acb49e326e0c73ba4bb0a53b465b7735d0 Mon Sep 17 00:00:00 2001 From: fermin831 Date: Thu, 28 Mar 2019 15:16:09 +0100 Subject: [PATCH 011/460] Fixed netflow reports resolution Former-commit-id: f49404e7c1129344df026a81e4059e9276acf9eb --- pandora_console/include/functions_netflow.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/functions_netflow.php b/pandora_console/include/functions_netflow.php index 69aa0a1608..f1febb5c41 100644 --- a/pandora_console/include/functions_netflow.php +++ b/pandora_console/include/functions_netflow.php @@ -35,8 +35,8 @@ define('NETFLOW_RES_LOWD', 6); define('NETFLOW_RES_MEDD', 12); define('NETFLOW_RES_HID', 24); define('NETFLOW_RES_ULTRAD', 30); -define('NETFLOW_RES_HOURLY', 'hourly'); -define('NETFLOW_RES_DAILY', 'daily'); +define('NETFLOW_RES_HOURLY', -1); +define('NETFLOW_RES_DAILY', -2); define('NETFLOW_MAX_DATA_CIRCULAR_MESH', 10000); @@ -473,7 +473,7 @@ function netflow_get_data( // Put all points into an array. $intervals = [($start_date - $multiplier_time)]; - while ((end($intervals) < $end_date) === true) { + while (($next = (end($intervals) + $multiplier_time) < $end_date) === true) { $intervals[] = (end($intervals) + $multiplier_time); } From 4c95a160defd8039fa345c36e361537b29c867bf Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Mon, 1 Apr 2019 17:57:22 +0200 Subject: [PATCH 012/460] Changed Jquery .text for .html for html conversion Former-commit-id: 9dd9c63e637e504ff51e38165687bacfae59ed38 --- pandora_console/godmode/alerts/configure_alert_action.php | 4 ++-- pandora_console/include/javascript/pandora_alerts.js | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pandora_console/godmode/alerts/configure_alert_action.php b/pandora_console/godmode/alerts/configure_alert_action.php index c29cda623b..e7927a2a3a 100644 --- a/pandora_console/godmode/alerts/configure_alert_action.php +++ b/pandora_console/godmode/alerts/configure_alert_action.php @@ -318,9 +318,9 @@ $(document).ready (function () { jQuery.post (, values, function (data, status) { - original_command = js_html_entity_decode (data["command"]); + original_command = data["command"]; render_command_preview (original_command); - command_description = js_html_entity_decode (data["description"]); + command_description = data["description"]; render_command_description(command_description); var max_fields = parseInt(''); diff --git a/pandora_console/include/javascript/pandora_alerts.js b/pandora_console/include/javascript/pandora_alerts.js index 41f8d20ad8..668950ce9c 100644 --- a/pandora_console/include/javascript/pandora_alerts.js +++ b/pandora_console/include/javascript/pandora_alerts.js @@ -1,5 +1,4 @@ var original_command = ""; - function parse_alert_command(command, classs) { if (classs == "recovery") { classs = "fields_recovery"; @@ -28,13 +27,13 @@ function parse_alert_command(command, classs) { } function render_command_preview(original_command) { - $("#textarea_command_preview").text( + $("#textarea_command_preview").html( parse_alert_command(original_command, "") ); } function render_command_recovery_preview(original_command) { - $("#textarea_command_recovery_preview").text( + $("#textarea_command_recovery_preview").html( parse_alert_command(original_command, "recovery") ); } From 9c3d26f12030f683f8e7e32a13fe3aafd819ec22 Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Wed, 3 Apr 2019 11:22:20 +0200 Subject: [PATCH 013/460] Deleted Servers menu option for operator(read) Former-commit-id: 89723d23cb2199152cfc9f3d72997ddcd7b31796 --- pandora_console/godmode/menu.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index ac3154b657..6224d361c9 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -208,7 +208,7 @@ if (!empty($sub)) { } -if (check_acl($config['id_user'], 0, 'AW') || check_acl($config['id_user'], 0, 'PM') || check_acl($config['id_user'], 0, 'RR')) { +if (check_acl($config['id_user'], 0, 'AW') || check_acl($config['id_user'], 0, 'PM')) { // Servers $menu_godmode['gservers']['text'] = __('Servers'); $menu_godmode['gservers']['sec2'] = 'godmode/servers/modificar_server'; From 9df4cb86dc496c8aecd56be96f785695da16b25d Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Thu, 4 Apr 2019 09:45:29 +0200 Subject: [PATCH 014/460] Added inline-block and fixed size to label Former-commit-id: 40c1ca6d5c06fb771eb7e8d1ac81dde6e7012cfb --- pandora_console/include/styles/login.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandora_console/include/styles/login.css b/pandora_console/include/styles/login.css index bffcda19d5..648eadb503 100644 --- a/pandora_console/include/styles/login.css +++ b/pandora_console/include/styles/login.css @@ -407,6 +407,8 @@ div.form_message_alert ul li input { } div.form_message_alert ul li label { + display: inline-block; + width: 145px; font-size: 10pt; padding-right: 20px; } From 1b6a01cfd5ac0f97266abd35471788ef32cca8fb Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Thu, 4 Apr 2019 14:11:44 +0200 Subject: [PATCH 015/460] Changed modal size to fit err. msg Former-commit-id: 2676ac1d217cc5245ce09277b8b76d1d562cdf5f --- .../include/javascript/jquery.pandora.js | 697 +++++++++--------- 1 file changed, 358 insertions(+), 339 deletions(-) diff --git a/pandora_console/include/javascript/jquery.pandora.js b/pandora_console/include/javascript/jquery.pandora.js index 9e0b3447af..ed75400386 100644 --- a/pandora_console/include/javascript/jquery.pandora.js +++ b/pandora_console/include/javascript/jquery.pandora.js @@ -1,386 +1,405 @@ (function($) { - $.fn.check = function () { - return this.each (function () { - this.checked = true; - });}; + $.fn.check = function() { + return this.each(function() { + this.checked = true; + }); + }; - $.fn.uncheck = function () { - return this.each (function () { - this.checked = false; - });}; + $.fn.uncheck = function() { + return this.each(function() { + this.checked = false; + }); + }; - $.fn.enable = function () { - return $(this).removeAttr ("disabled"); - }; + $.fn.enable = function() { + return $(this).removeAttr("disabled"); + }; - $.fn.disable = function () { - return $(this).attr ("disabled", "disabled"); - }; + $.fn.disable = function() { + return $(this).attr("disabled", "disabled"); + }; - $.fn.pulsate = function () { - var i = 0; - for (i = 0; i <= 2; i++) { - $(this).fadeOut ("slow").fadeIn ("slow"); - } - }; + $.fn.pulsate = function() { + var i = 0; + for (i = 0; i <= 2; i++) { + $(this) + .fadeOut("slow") + .fadeIn("slow"); + } + }; - $.fn.showMessage = function (msg) { - return $(this).hide ().empty () - // here, previously .text (msg) - .html (msg) - .slideDown (); - }; -}) (jQuery); + $.fn.showMessage = function(msg) { + return ( + $(this) + .hide() + .empty() + // here, previously .text (msg) + .html(msg) + .slideDown() + ); + }; +})(jQuery); -$(document).ready (function () { - $("a#show_messages_dialog").click (function () { - jQuery.post ("ajax.php", - { - "page": "operation/messages/message_list" - }, - function (data, status) { - $("#dialog_messages").hide () - .empty () - .append (data) - .dialog ({ - title: $("a#show_messages_dialog").attr ("title"), - resizable: false, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 700, - height: 300 - }).show (); - }, - "html" - ); +$(document).ready(function() { + $("a#show_messages_dialog").click(function() { + jQuery.post( + "ajax.php", + { + page: "operation/messages/message_list" + }, + function(data, status) { + $("#dialog_messages") + .hide() + .empty() + .append(data) + .dialog({ + title: $("a#show_messages_dialog").attr("title"), + resizable: false, + modal: true, + overlay: { + opacity: 0.5, + background: "black" + }, + width: 700, + height: 300 + }) + .show(); + }, + "html" + ); - return false; - }); + return false; + }); - $("a.show_systemalert_dialog").click (function () { - $('body').append( "
" ); - $("#opacidad").css('opacity', 0.5); + $("a.show_systemalert_dialog").click(function() { + $("body").append( + "
" + ); + $("#opacidad").css("opacity", 0.5); - jQuery.post ("ajax.php", - { - "page": "operation/system_alert"}, - function (data, status) { - $("#alert_messages").show(); - $("#alert_messages").empty ().append (data); - $("#alert_messages").css('opacity', 1); + jQuery.post( + "ajax.php", + { + page: "operation/system_alert" + }, + function(data, status) { + $("#alert_messages").show(); + $("#alert_messages") + .empty() + .append(data); + $("#alert_messages").css("opacity", 1); + }, + "html" + ); + }); - }, - "html" - ); - }); - - $("a.modalpopup").click (function () { - var elem = $(this).attr("id"); - $('body').append( "
" ); - $("#opacidad").css('opacity', 0.5); + $("a.modalpopup").click(function() { + var elem = $(this).attr("id"); + $("body").append( + "
" + ); + $("#opacidad").css("opacity", 0.5); - jQuery.post ("ajax.php", - { - "page": "general/alert_enterprise", - "message": elem - }, - function (data, status) { - $("#alert_messages").show(); - $("#alert_messages").empty ().append (data); - $("#alert_messages").css('opacity', 1); - }, - "html" - ); - return false; - }); + jQuery.post( + "ajax.php", + { + page: "general/alert_enterprise", + message: elem + }, + function(data, status) { + $("#alert_messages").show(); + $("#alert_messages") + .empty() + .append(data); + $("#alert_messages").css("opacity", 1); + }, + "html" + ); + return false; + }); - // Creacion de ventana modal y botones - $(".publienterprise").click (function () { - var elem = $(this).attr("id"); - $('body').append( "
" ); - $("#opacidad").css('opacity', 0.5); + // Creacion de ventana modal y botones + $(".publienterprise").click(function() { + var elem = $(this).attr("id"); + $("body").append( + "
" + ); + $("#opacidad").css("opacity", 0.5); - jQuery.post ("ajax.php", - { - "page": "general/alert_enterprise", - "message": elem - }, - function (data, status) { - $("#alert_messages").show(); - $("#alert_messages").empty ().append (data); - $("#alert_messages").css('opacity', 1); - }, - "html" - ); - return false; - }); - - - $(".publienterprisehide").click (function () { - var elem = $(this).attr("id"); - $('body').append( "
" ); - $("#opacidad").css('opacity', 0.5); + jQuery.post( + "ajax.php", + { + page: "general/alert_enterprise", + message: elem + }, + function(data, status) { + $("#alert_messages").show(); + $("#alert_messages") + .empty() + .append(data); + $("#alert_messages").css("opacity", 1); + }, + "html" + ); + return false; + }); - jQuery.post ("ajax.php", - { - "page": "general/alert_enterprise", - "message": elem - }, - function (data, status) { - $("#alert_messages").show(); - $("#alert_messages").empty ().append (data); - $("#alert_messages").css('opacity', 1); - }, - "html" - ); - return false; - }); + $(".publienterprisehide").click(function() { + var elem = $(this).attr("id"); + $("body").append( + "
" + ); + $("#opacidad").css("opacity", 0.5); + jQuery.post( + "ajax.php", + { + page: "general/alert_enterprise", + message: elem + }, + function(data, status) { + $("#alert_messages").show(); + $("#alert_messages") + .empty() + .append(data); + $("#alert_messages").css("opacity", 1); + }, + "html" + ); + return false; + }); + if ($("#license_error_msg_dialog").length) { + if (typeof process_login_ok == "undefined") process_login_ok = 0; - if ($('#license_error_msg_dialog').length) { - if (typeof(process_login_ok) == "undefined") - process_login_ok = 0; + if (typeof show_error_license == "undefined") show_error_license = 0; - if (typeof(show_error_license) == "undefined") - show_error_license = 0; + if (process_login_ok || show_error_license) { + $("#license_error_msg_dialog").dialog({ + dialogClass: "no-close", + closeOnEscape: false, + resizable: false, + draggable: true, + modal: true, + height: 470, + width: 850, + overlay: { + opacity: 0.5, + background: "black" + }, + open: function() { + var remaining = 30; - if (process_login_ok || show_error_license) { + // Timeout counter. + var count = function() { + if (remaining > 0) { + $("#license_error_remaining").text(remaining); + remaining -= 1; + } else { + $("#license_error_remaining").hide(); + $("#ok_buttom").show(); + clearInterval(count); + } + }; - $( "#license_error_msg_dialog" ).dialog({ - dialogClass: "no-close", - closeOnEscape: false, - resizable: false, - draggable: true, - modal: true, - height: 450, - width: 850, - overlay: { - opacity: 0.5, - background: "black" - }, - open: function() { - var remaining = 30; + setInterval(count, 1000); + } + }); - // Timeout counter. - var count = function() { - if (remaining > 0) { - $("#license_error_remaining").text(remaining); - remaining -= 1; - } else { - $("#license_error_remaining").hide(); - $("#ok_buttom").show(); - clearInterval(count); - } - } + $("#submit-hide-license-error-msg").click(function() { + $("#license_error_msg_dialog").dialog("close"); + }); + } + } - setInterval(count, 1000); - } - }); + if ($("#msg_change_password").length) { + $("#msg_change_password").dialog({ + resizable: false, + draggable: true, + modal: true, + height: 450, + width: 620, + overlay: { + opacity: 0.5, + background: "black" + } + }); + } - $("#submit-hide-license-error-msg").click (function () { - $("#license_error_msg_dialog" ).dialog('close') - }); + if ($("#login_blocked").length) { + $("#login_blocked").dialog({ + resizable: true, + draggable: true, + modal: true, + height: 200, + width: 520, + overlay: { + opacity: 0.5, + background: "black" + } + }); + } - } - } + if ($("#login_correct_pass").length) { + $("#login_correct_pass").dialog({ + resizable: true, + draggable: true, + modal: true, + height: 200, + width: 520, + overlay: { + opacity: 0.5, + background: "black" + } + }); + } + forced_title_callback(); - if ($('#msg_change_password').length) { + $(document).on("scroll", function() { + if ( + document.documentElement.scrollTop != 0 || + document.body.scrollTop != 0 + ) { + if ($("#head").css("position") == "fixed") { + if ($("#menu").css("position") == "fixed") { + $("#menu").css("top", "80px"); + } else { + $("#menu").css("top", "60px"); + } + } else { + if ($("#menu").css("position") == "fixed") { + $("#menu").css("top", "20px"); + } else { + $("#menu").css("top", "80px"); + } + } + } else { + if ($("#head").css("position") == "fixed") { + if ($("#menu").css("position") == "fixed") { + $("#menu").css("top", "80px"); + } else { + $("#menu").css("top", "60px"); + } + } else { + if ($("#menu").css("position") == "fixed") { + $("#menu").css("top", "80px"); + } else { + $("#menu").css("top", "80px"); + } + } + } - $( "#msg_change_password" ).dialog({ - resizable: false, - draggable: true, - modal: true, - height: 350, - width: 620, - overlay: { - opacity: 0.5, - background: "black" - } - }); + // if((document.documentElement.scrollTop != 0 || document.body.scrollTop != 0) && $('#menu').css('position') =='fixed'){ + // if($('#head').css('position') =='fixed'){ + // $('#menu').css('top','80px'); + // } + // else{ + // $('#menu').css('top','20px'); + // } + // } + // else{ + // if($('#head').css('position') =='fixed'){ + // if(document.documentElement.scrollTop != 0 || document.body.scrollTop != 0){ + // $('#menu').css('top','60px'); + // }else{ + // $('#menu').css('top','80px'); + // } + // + // } + // else{ + // $('#menu').css('top','60px'); + // } + // } + }); - } - - if ($('#login_blocked').length) { - - $( "#login_blocked" ).dialog({ - resizable: true, - draggable: true, - modal: true, - height: 200, - width: 520, - overlay: { - opacity: 0.5, - background: "black" - } - }); - - } - - if ($('#login_correct_pass').length) { - - $( "#login_correct_pass" ).dialog({ - resizable: true, - draggable: true, - modal: true, - height: 200, - width: 520, - overlay: { - opacity: 0.5, - background: "black" - } - }); - - } - - forced_title_callback(); - - - $(document).on("scroll", function(){ - - if(document.documentElement.scrollTop != 0 || document.body.scrollTop != 0){ - if($('#head').css('position') =='fixed'){ - if($('#menu').css('position') =='fixed'){ - $('#menu').css('top','80px'); - } else { - $('#menu').css('top','60px'); - } - } else { - if($('#menu').css('position') =='fixed'){ - $('#menu').css('top','20px'); - } else { - $('#menu').css('top','80px'); - } - } - } else { - if($('#head').css('position') =='fixed'){ - if($('#menu').css('position') =='fixed'){ - $('#menu').css('top','80px'); - } else { - $('#menu').css('top','60px'); - } - } else { - if($('#menu').css('position') =='fixed'){ - $('#menu').css('top','80px'); - } else { - $('#menu').css('top','80px'); - } - } - } - - // if((document.documentElement.scrollTop != 0 || document.body.scrollTop != 0) && $('#menu').css('position') =='fixed'){ - // if($('#head').css('position') =='fixed'){ - // $('#menu').css('top','80px'); - // } - // else{ - // $('#menu').css('top','20px'); - // } - // } - // else{ - // if($('#head').css('position') =='fixed'){ - // if(document.documentElement.scrollTop != 0 || document.body.scrollTop != 0){ - // $('#menu').css('top','60px'); - // }else{ - // $('#menu').css('top','80px'); - // } - // - // } - // else{ - // $('#menu').css('top','60px'); - // } - // } - }); - - $("#alert_messages").draggable(); - $("#alert_messages").css({'left':+parseInt(screen.width/2)-parseInt($("#alert_messages").css('width'))/2+'px'}); - + $("#alert_messages").draggable(); + $("#alert_messages").css({ + left: + +parseInt(screen.width / 2) - + parseInt($("#alert_messages").css("width")) / 2 + + "px" + }); }); - - - function forced_title_callback() { - // Forced title code - $('body').on('mouseenter', '.forced_title', function() { - /////////////////////////////////////////// - // Put the layer in the left-top corner to fill it - /////////////////////////////////////////// - $('#forced_title_layer').css('left', 0); - $('#forced_title_layer').css('top', 0); + // Forced title code + $("body").on("mouseenter", ".forced_title", function() { + /////////////////////////////////////////// + // Put the layer in the left-top corner to fill it + /////////////////////////////////////////// + $("#forced_title_layer").css("left", 0); + $("#forced_title_layer").css("top", 0); - /////////////////////////////////////////// - // Get info of the image - /////////////////////////////////////////// + /////////////////////////////////////////// + // Get info of the image + /////////////////////////////////////////// - var img_top = $(this).offset().top; - var img_width = $(this).width(); - var img_height = $(this).height(); - var img_id = $(this).attr('id'); - var img_left_mid = $(this).offset().left + (img_width / 2); + var img_top = $(this).offset().top; + var img_width = $(this).width(); + var img_height = $(this).height(); + var img_id = $(this).attr("id"); + var img_left_mid = $(this).offset().left + img_width / 2; - /////////////////////////////////////////// - // Put title in the layer - /////////////////////////////////////////// + /////////////////////////////////////////// + // Put title in the layer + /////////////////////////////////////////// - // If the '.forced_title' element has 'use_title_for_force_title' = 1 - // into their 'data' prop, the element title will be used for the - // content. - if ($(this).data("use_title_for_force_title")) { - var title = $(this).data("title"); - } - else { - var title = $('#forced_title_'+img_id).html(); - } + // If the '.forced_title' element has 'use_title_for_force_title' = 1 + // into their 'data' prop, the element title will be used for the + // content. + if ($(this).data("use_title_for_force_title")) { + var title = $(this).data("title"); + } else { + var title = $("#forced_title_" + img_id).html(); + } - $('#forced_title_layer').html(title); + $("#forced_title_layer").html(title); - /////////////////////////////////////////// - // Get info of the layer - /////////////////////////////////////////// + /////////////////////////////////////////// + // Get info of the layer + /////////////////////////////////////////// - var layer_width = $('#forced_title_layer').width(); - var layer_height = $('#forced_title_layer').height(); + var layer_width = $("#forced_title_layer").width(); + var layer_height = $("#forced_title_layer").height(); - /////////////////////////////////////////// - // Obtain the new position of the layer - /////////////////////////////////////////// + /////////////////////////////////////////// + // Obtain the new position of the layer + /////////////////////////////////////////// - // Jquery doesnt know the padding of the layer - var layer_padding = 4; + // Jquery doesnt know the padding of the layer + var layer_padding = 4; - // Deduct padding of both sides - var layer_top = img_top - layer_height - (layer_padding * 2) - 5; - if (layer_top < 0) { - layer_top = img_top + img_height + (layer_padding * 2); - } + // Deduct padding of both sides + var layer_top = img_top - layer_height - layer_padding * 2 - 5; + if (layer_top < 0) { + layer_top = img_top + img_height + layer_padding * 2; + } - // Deduct padding of one side - var layer_left = img_left_mid - (layer_width / 2) - layer_padding; - if (layer_left < 0) { - layer_left = 0; - } + // Deduct padding of one side + var layer_left = img_left_mid - layer_width / 2 - layer_padding; + if (layer_left < 0) { + layer_left = 0; + } - var real_layer_width = layer_width + (layer_padding * 2) + 5; - var layer_right = layer_left + real_layer_width; - var screen_width = $(window).width(); - if (screen_width < layer_right) { - layer_left = screen_width - real_layer_width; - } + var real_layer_width = layer_width + layer_padding * 2 + 5; + var layer_right = layer_left + real_layer_width; + var screen_width = $(window).width(); + if (screen_width < layer_right) { + layer_left = screen_width - real_layer_width; + } - /////////////////////////////////////////// - // Set the layer position and show - /////////////////////////////////////////// + /////////////////////////////////////////// + // Set the layer position and show + /////////////////////////////////////////// - $('#forced_title_layer').css('left', layer_left); - $('#forced_title_layer').css('top', layer_top); - $('#forced_title_layer').show(); - }); - $('body').on('mouseout', '.forced_title', function () { - $('#forced_title_layer').hide().empty(); - }); + $("#forced_title_layer").css("left", layer_left); + $("#forced_title_layer").css("top", layer_top); + $("#forced_title_layer").show(); + }); + $("body").on("mouseout", ".forced_title", function() { + $("#forced_title_layer") + .hide() + .empty(); + }); } - From 74d64db497abc980379c2efbdee884c2cb56ef30 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Mon, 8 Apr 2019 15:29:02 +0200 Subject: [PATCH 016/460] change name label from functions_visual_map_editor.php Former-commit-id: 9dd7f0c86268d9657b6054fca109aefb18020962 --- pandora_console/include/functions_visual_map_editor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_visual_map_editor.php b/pandora_console/include/functions_visual_map_editor.php index 151014cd01..3cb5c215ba 100755 --- a/pandora_console/include/functions_visual_map_editor.php +++ b/pandora_console/include/functions_visual_map_editor.php @@ -1245,7 +1245,7 @@ function visual_map_editor_print_toolbox() } echo '
'; - visual_map_print_button_editor('static_graph', __('Static Graph'), 'left', false, 'camera_min', true); + visual_map_print_button_editor('static_graph', __('Static Image'), 'left', false, 'camera_min', true); visual_map_print_button_editor('percentile_item', __('Percentile Item'), 'left', false, 'percentile_item_min', true); visual_map_print_button_editor('module_graph', __('Module Graph'), 'left', false, 'graph_min', true); visual_map_print_button_editor('donut_graph', __('Serialized pie graph'), 'left', false, 'donut_graph_min', true); From 550eb3cd3e8fd9699b0cb35eccb3ff0fd0768952 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Mon, 8 Apr 2019 15:30:07 +0200 Subject: [PATCH 017/460] change name label from visual_console_builder.elements.php Former-commit-id: 71201d54200624452c4dd75231894d4cd4e29031 --- .../godmode/reporting/visual_console_builder.elements.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/visual_console_builder.elements.php b/pandora_console/godmode/reporting/visual_console_builder.elements.php index d2849ce5e0..720bb57a1c 100755 --- a/pandora_console/godmode/reporting/visual_console_builder.elements.php +++ b/pandora_console/godmode/reporting/visual_console_builder.elements.php @@ -171,7 +171,7 @@ foreach ($layoutDatas as $layoutData) { $table->data[($i + 1)]['icon'] = html_print_image( 'images/camera.png', true, - ['title' => __('Static Graph')] + ['title' => __('Static Image')] ); break; From 4d98db86e711eb13baeb9767f1fa60c5a7dc7682 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Mon, 8 Apr 2019 15:30:48 +0200 Subject: [PATCH 018/460] change name label from functions_visual_map.php Former-commit-id: c6bf206301662993be9f41f1d1259e1373060776 --- pandora_console/include/functions_visual_map.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_visual_map.php b/pandora_console/include/functions_visual_map.php index 5344eb15ee..0d3180fcf3 100755 --- a/pandora_console/include/functions_visual_map.php +++ b/pandora_console/include/functions_visual_map.php @@ -4241,7 +4241,7 @@ function visual_map_create_internal_name_item($label=null, $type, $image, $agent case 'static_graph': case STATIC_GRAPH: - $text = __('Static graph').' - '.$image; + $text = __('Static Image').' - '.$image; break; case 'simple_value': From 5998b30a161d95cac697f43084e17f405ea2d7b3 Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Wed, 10 Apr 2019 17:30:35 +0200 Subject: [PATCH 019/460] Added css hint to discovery tasks when task list is empty Former-commit-id: 1da71cda1b1ed376bb6bae0281b0dd882dbfbeff --- pandora_console/general/firts_task/recon_view.php | 1 + pandora_console/godmode/servers/discovery.php | 5 +++++ pandora_console/include/styles/discovery-hint.css | 10 ++++++++++ 3 files changed, 16 insertions(+) create mode 100644 pandora_console/include/styles/discovery-hint.css diff --git a/pandora_console/general/firts_task/recon_view.php b/pandora_console/general/firts_task/recon_view.php index 282a6b75be..8c59b23f64 100755 --- a/pandora_console/general/firts_task/recon_view.php +++ b/pandora_console/general/firts_task/recon_view.php @@ -35,6 +35,7 @@ ui_require_css_file('firts_task');

+
diff --git a/pandora_console/godmode/servers/discovery.php b/pandora_console/godmode/servers/discovery.php index d9e19abdff..e20588b97d 100755 --- a/pandora_console/godmode/servers/discovery.php +++ b/pandora_console/godmode/servers/discovery.php @@ -130,5 +130,10 @@ if ($classname_selected === null) { } } + // Show hints if there is no task + if (get_parameter('discovery_hint', 0)) { + ui_require_css_file('discovery-hint'); + } + Wizard::printBigButtonsList($wiz_data); } diff --git a/pandora_console/include/styles/discovery-hint.css b/pandora_console/include/styles/discovery-hint.css new file mode 100644 index 0000000000..8247b26c96 --- /dev/null +++ b/pandora_console/include/styles/discovery-hint.css @@ -0,0 +1,10 @@ +/* + * Discovery show help css + */ +li.discovery:not(:first-child) > a:hover { + color: #000; +} + +li.discovery:not(:first-child) div.data_container:not(:hover) { + box-shadow: 2px 2px 10px #80ba27; +} From 6276936e1d30fffe29cb4e2e0fa1122e0d7d247e Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Wed, 10 Apr 2019 17:51:50 +0200 Subject: [PATCH 020/460] Added info message Former-commit-id: 11f4c9c8b52f6ef3bed2236534010f2caa3bb8e0 --- pandora_console/godmode/servers/discovery.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/godmode/servers/discovery.php b/pandora_console/godmode/servers/discovery.php index e20588b97d..a2c0abd5d6 100755 --- a/pandora_console/godmode/servers/discovery.php +++ b/pandora_console/godmode/servers/discovery.php @@ -133,6 +133,7 @@ if ($classname_selected === null) { // Show hints if there is no task if (get_parameter('discovery_hint', 0)) { ui_require_css_file('discovery-hint'); + ui_print_info_message(__('You must create a task first')); } Wizard::printBigButtonsList($wiz_data); From 7a1a6822489ba03907c11119869d330d0a778a87 Mon Sep 17 00:00:00 2001 From: fermin831 Date: Fri, 12 Apr 2019 13:09:26 +0200 Subject: [PATCH 021/460] Added advice when a primary group will be selected when is currentl a secondary group Former-commit-id: ca23bc1f24b901c2300385ee6d3468dc5059d51d --- pandora_console/godmode/agentes/agent_manager.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index a7fc1f156a..9996d0946e 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -999,6 +999,19 @@ ui_require_jquery_file('bgiframe'); } $(document).ready (function() { + + var previous_primary_group_select; + $("#grupo").on('focus', function () { + previous_primary_group_select = this.value; + }).change(function() { + if ($("#secondary_groups_selected option[value="+$("#grupo").val()+"]").length) { + alert(""); + $("#grupo").val(previous_primary_group_select); + } else { + previous_primary_group_select = this.value; + } + }); + $("select#id_os").pandoraSelectOS (); var checked = $("#checkbox-cascade_protection").is(":checked"); From 553ec48f5451a331f33e292ee37ff14bbe88bc57 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Mon, 15 Apr 2019 15:21:07 +0200 Subject: [PATCH 022/460] changed title plugin creation to plugin registration Former-commit-id: bd5ee299d91c52d3064eafa85b092b525b70381a --- pandora_console/godmode/servers/plugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php index b04643e1c3..5ff8022afa 100644 --- a/pandora_console/godmode/servers/plugin.php +++ b/pandora_console/godmode/servers/plugin.php @@ -281,7 +281,7 @@ if (($create != '') || ($view != '')) { } else { if ($create != '') { ui_print_page_header( - __('Plugin creation'), + __('Plugin registration'), 'images/gm_servers.png', false, 'plugin_definition', From 43d8a25c39ef229fca313af22bbd600ec11c3cc8 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 24 Apr 2019 16:49:04 +0200 Subject: [PATCH 023/460] Add remaning attemps Former-commit-id: 07960eaa4b3281ee13f14b0fc5249b94ac0626fa --- pandora_console/general/login_page.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index d8e28223c6..84df350d3c 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -376,6 +376,9 @@ if (isset($correct_reset_pass_process)) { } if (isset($login_failed)) { + $nick = get_parameter_post('nick'); + $fails = db_get_value('failed_attempt', 'tusuario', 'id_user', $nick); + $attemps = ($config['number_attempts'] - $fails); echo '
'; echo '
'; echo '
'; @@ -386,6 +389,9 @@ if (isset($login_failed)) { echo '

'.__('ERROR').'

'; echo '

'.$config['auth_error'].'

'; echo '
'; + echo '
'; + echo '

Remaining attempts: '.$attemps.'

'; + echo '
'; echo '
'; html_print_submit_button('Ok', 'hide-login-error', false); echo '
'; From d7ca0f11340d6b5c3f2cf5f9095ef837d0338f7a Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 24 Apr 2019 16:51:41 +0200 Subject: [PATCH 024/460] Add strong Former-commit-id: 68b08a3a6f7dbdd4365b88faf9bfb678e506a5ac --- pandora_console/general/login_page.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index 84df350d3c..3e0acb3576 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -390,7 +390,7 @@ if (isset($login_failed)) { echo '

'.$config['auth_error'].'

'; echo '
'; echo '
'; - echo '

Remaining attempts: '.$attemps.'

'; + echo '

Remaining attempts: '.$attemps.'

'; echo '
'; echo '
'; html_print_submit_button('Ok', 'hide-login-error', false); From de4ea8434aebba5070205972bc9965d335a811e7 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 24 Apr 2019 17:11:02 +0200 Subject: [PATCH 025/460] Se ajusta la ventana de usuario bloqueado Former-commit-id: dca9700142a5f4b539892f8727d8e5c83222312b --- pandora_console/general/login_page.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index 3e0acb3576..193a0d2d15 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -685,5 +685,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' $("#final_process_correct").dialog('close'); }); }); + /* ]]> */ From dcfb9c9b61da306d3f530e3d3f1a0635db328c1d Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 24 Apr 2019 17:45:01 +0200 Subject: [PATCH 026/460] se actualiza en mensaje en la meta Former-commit-id: b20edf93845577c1fdd551211907a25888c6543a --- pandora_console/general/login_page.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index 193a0d2d15..42e6568890 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -391,7 +391,7 @@ if (isset($login_failed)) { echo '
'; echo '
'; echo '

Remaining attempts: '.$attemps.'

'; - echo '
'; + echo '
'; echo '
'; html_print_submit_button('Ok', 'hide-login-error', false); echo '
'; From e9e24505fe43057d3d44ca36ebcfd37e405f145f Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Tue, 30 Apr 2019 10:29:42 +0200 Subject: [PATCH 027/460] Added option in massive delete alerts to show alerts on disabled modules Former-commit-id: 2ee8db665f9e3ae657887e61e4b99dccd2e6e3a9 --- .../godmode/massive/massive_delete_alerts.php | 19 ++++++++++++++++++- pandora_console/include/functions_alerts.php | 1 - 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/massive/massive_delete_alerts.php b/pandora_console/godmode/massive/massive_delete_alerts.php index 862d54bbbc..d7f316fd4d 100755 --- a/pandora_console/godmode/massive/massive_delete_alerts.php +++ b/pandora_console/godmode/massive/massive_delete_alerts.php @@ -31,6 +31,7 @@ require_once $config['homedir'].'/include/functions_users.php'; if (is_ajax()) { $get_agents = (bool) get_parameter('get_agents'); $recursion = (int) get_parameter('recursion'); + $disabled_modules = (int) get_parameter('disabled_modules'); if ($get_agents) { $id_group = (int) get_parameter('id_group'); @@ -44,12 +45,18 @@ if (is_ajax()) { $groups = [$id_group]; } + if ($disabled_modules == 0) { + $filter['tagente_modulo.disabled'] = '<> 1'; + } else { + unset($filter['tagente_modulo.disabled']); + } + $agents_alerts = []; foreach ($groups as $group) { $agents_alerts_one_group = alerts_get_agents_with_alert_template( $id_alert_template, $group, - false, + $filter, [ 'tagente.alias', 'tagente.id_agente', @@ -253,6 +260,11 @@ $table->data[1][1] = html_print_select_groups( '', $id_alert_template == 0 ); + +$table->data[0][2] = __('Show alerts on disabled modules'); +$table->data[0][3] = html_print_checkbox('disabled_modules', 1, false, true, false); + + $table->data[1][2] = __('Group recursion'); $table->data[1][3] = html_print_checkbox('recursion', 1, false, true, false); @@ -360,6 +372,7 @@ $(document).ready (function () { "get_agents" : 1, "id_group" : this.value, "recursion" : $("#checkbox-recursion").is(":checked") ? 1 : 0, + "disabled_modules" : $("#checkbox-disabled_modules").is(":checked") ? 1 : 0, "id_alert_template" : $("#id_alert_template").val(), // Add a key prefix to avoid auto sorting in js object conversion "keys_prefix" : "_" @@ -387,6 +400,10 @@ $(document).ready (function () { $("#modules_selection_mode").change (function() { $("#id_agents").trigger('change'); }); + + $("#checkbox-disabled_modules").click(function () { + $("#id_group").trigger("change"); + }); }); /* ]]> */ diff --git a/pandora_console/include/functions_alerts.php b/pandora_console/include/functions_alerts.php index 6bfe709c32..e1cc6286d4 100644 --- a/pandora_console/include/functions_alerts.php +++ b/pandora_console/include/functions_alerts.php @@ -1913,7 +1913,6 @@ function alerts_get_agents_with_alert_template($id_alert_template, $id_group, $f $filter[] = 'tagente_modulo.id_agente_modulo = talert_template_modules.id_agent_module'; $filter[] = 'tagente_modulo.id_agente = tagente.id_agente'; $filter['id_alert_template'] = $id_alert_template; - $filter['tagente_modulo.disabled'] = '<> 1'; $filter['delete_pending'] = '<> 1'; if (empty($id_agents)) { From 105695f1bd039abe2ef0f8aeb43037a531e784c1 Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Fri, 17 May 2019 18:29:38 +0200 Subject: [PATCH 028/460] Added notification for serialize_precicion value --- .../include/class/ConsoleSupervisor.php | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index 7259287d68..d9bea3ffbe 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -1233,6 +1233,7 @@ class ConsoleSupervisor $PHPdisable_functions = ini_get('disable_functions'); $PHPupload_max_filesize_min = config_return_in_bytes('800M'); $PHPmemory_limit_min = config_return_in_bytes('500M'); + $PHPSerialize_precision = ini_get('serialize_precision'); // PhantomJS status. $result_ejecution = exec($config['phantomjs_bin'].'/phantomjs --version'); @@ -1408,6 +1409,30 @@ class ConsoleSupervisor } else { $this->cleanNotifications('NOTIF.PHP.VERSION'); } + + if ($PHPSerialize_precision != -1) { + $url = 'https://www.php.net/manual/en/ini.core.php#ini.serialize-precision'; + if ($config['language'] == 'es') { + $url = 'https://www.php.net/manual/es/ini.core.php#ini.serialize-precision'; + } + + $this->notify( + [ + 'type' => 'NOTIF.PHP.SERIALIZE_PRECISION', + 'title' => sprintf( + __("Not recommended '%s' value in PHP configuration"), + 'serialze_precision' + ), 'message' => sprintf( + __('Recommended value is: %s'), + sprintf('-1') + ).'

'.__('Please, change it on your PHP configuration file (php.ini) or contact with administrator'), + 'url' => $url, + ] + ); + } else { + $this->cleanNotifications('NOTIF.PHP.VERSION'); + } + } From d5ac57064bf3deceef1c99cdcc229afe7029c480 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 29 May 2019 11:34:23 +0200 Subject: [PATCH 029/460] Condition is added to keep the selection color in the main menu --- pandora_console/include/functions_menu.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 0dbe1049bc..e26acd5cac 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -50,6 +50,12 @@ function menu_print_menu(&$menu) $sec = (string) get_parameter('sec'); $sec2 = (string) get_parameter('sec2'); + if ($sec2 == 'operation/agentes/ver_agente') { + $sec2 = 'godmode/agentes/configurar_agente'; + } else { + $sec2 = (string) get_parameter('sec2'); + } + $menu_selected = false; $allsec2 = explode('sec2=', $_SERVER['REQUEST_URI']); From e37d120115978b159d0cd29291fdb438129ccee0 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 30 May 2019 13:58:57 +0200 Subject: [PATCH 030/460] Review 1 --- pandora_console/include/styles/pandora.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index b4fa370521..44ac0d09f4 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -567,7 +567,6 @@ input.sub { font-weight: normal; -moz-border-radius: 2px; -webkit-border-radius: 2px; - height: auto !important; border-radius: 2px; font-size: 1.2em; background-color: #fff; @@ -843,7 +842,6 @@ input.filter, input.pdf, input.spinn { padding-right: 30px; - height: 23px; } input.next { From 40cca5e1e3c01e746ff3e5b2dbf7ae1552fa5f57 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 30 May 2019 18:21:13 +0200 Subject: [PATCH 031/460] BIG style change, erased all important flags --- .../realtime_graphs/realtime_graphs.css | 2 +- pandora_console/general/footer.php | 14 +- pandora_console/general/main_menu.php | 6 - .../visual_console_builder.editor.php | 2 + .../godmode/update_manager/update_manager.css | 44 +- pandora_console/include/functions_menu.php | 6 +- pandora_console/include/functions_ui.php | 4 +- .../include/styles/agent_manager.css | 8 +- pandora_console/include/styles/agent_view.css | 8 +- pandora_console/include/styles/common.css | 8 +- pandora_console/include/styles/dialog.css | 164 ++-- pandora_console/include/styles/discovery.css | 22 +- pandora_console/include/styles/firts_task.css | 2 +- pandora_console/include/styles/footer.css | 33 + pandora_console/include/styles/ie.css | 4 +- pandora_console/include/styles/install.css | 8 +- .../include/styles/jquery-ui.min.css | 7 + .../js/images/ui-bg_flat_0_aaaaaa_40x100.png | 844 +++++++++++++++++ .../js/images/ui-icons_444444_256x240.png | 850 ++++++++++++++++++ .../js/images/ui-icons_555555_256x240.png | 850 ++++++++++++++++++ .../js/images/ui-icons_777620_256x240.png | 850 ++++++++++++++++++ .../js/images/ui-icons_777777_256x240.png | 850 ++++++++++++++++++ .../js/images/ui-icons_cc0000_256x240.png | 850 ++++++++++++++++++ .../js/images/ui-icons_ffffff_256x240.png | 850 ++++++++++++++++++ pandora_console/include/styles/js/introjs.css | 8 +- .../include/styles/js/jquery-ui_custom.css | 142 +-- pandora_console/include/styles/login.css | 47 +- pandora_console/include/styles/menu.css | 156 ++-- pandora_console/include/styles/pandora.css | 762 ++++++---------- .../include/styles/pandora_black.css | 420 ++++----- .../include/styles/pandora_forms.css | 4 +- .../include/styles/pandora_green_old.css | 438 ++++----- .../include/styles/pandora_minimal.css | 16 +- pandora_console/include/styles/register.css | 38 +- .../include/styles/visual_maps.css | 172 ++++ pandora_console/index.php | 5 +- pandora_console/mobile/include/style/main.css | 320 +++---- 37 files changed, 7395 insertions(+), 1419 deletions(-) create mode 100644 pandora_console/include/styles/footer.css create mode 100644 pandora_console/include/styles/jquery-ui.min.css create mode 100644 pandora_console/include/styles/js/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 pandora_console/include/styles/js/images/ui-icons_444444_256x240.png create mode 100644 pandora_console/include/styles/js/images/ui-icons_555555_256x240.png create mode 100644 pandora_console/include/styles/js/images/ui-icons_777620_256x240.png create mode 100644 pandora_console/include/styles/js/images/ui-icons_777777_256x240.png create mode 100644 pandora_console/include/styles/js/images/ui-icons_cc0000_256x240.png create mode 100644 pandora_console/include/styles/js/images/ui-icons_ffffff_256x240.png create mode 100644 pandora_console/include/styles/visual_maps.css diff --git a/pandora_console/extensions/realtime_graphs/realtime_graphs.css b/pandora_console/extensions/realtime_graphs/realtime_graphs.css index ab6c94e238..2219c6152a 100644 --- a/pandora_console/extensions/realtime_graphs/realtime_graphs.css +++ b/pandora_console/extensions/realtime_graphs/realtime_graphs.css @@ -11,5 +11,5 @@ #graph_container { width: 800px; - margin: 20px auto !important; + margin: 20px auto; } diff --git a/pandora_console/general/footer.php b/pandora_console/general/footer.php index b35123b5d3..dcc894989b 100644 --- a/pandora_console/general/footer.php +++ b/pandora_console/general/footer.php @@ -20,6 +20,8 @@ if (isset($_SERVER['REQUEST_TIME'])) { $time = get_system_time(); } +ui_require_css_file('footer'); + $license_file = 'general/license/pandora_info_'.$config['language'].'.html'; if (! file_exists($config['homedir'].$license_file)) { $license_file = 'general/license/pandora_info_en.html'; @@ -41,9 +43,17 @@ if ($current_package == 0) { $build_package_version = $current_package; } -echo sprintf(__('%s %s - Build %s - MR %s', get_product_name(), $pandora_version, $build_package_version, $config['MR'])); +echo __( + '%s %s - Build %s - MR %s', + get_product_name(), + $pandora_version, + $build_package_version, + $config['MR'] +); +echo '
'; +echo ''.__('Page generated on %s', date('Y-m-d H:i:s')).''; + -echo ' '; if (isset($config['debug'])) { $cache_info = []; diff --git a/pandora_console/general/main_menu.php b/pandora_console/general/main_menu.php index 877f171090..ca6c0fd473 100644 --- a/pandora_console/general/main_menu.php +++ b/pandora_console/general/main_menu.php @@ -30,12 +30,6 @@ $(document).ready(function(){ } }); - -// Set the height of the menu. -$(window).on('load', function (){ - $("#menu_full").height($("#container").height()); -}); - button.ui-button.ui-corner-all.ui-widget { - background-color: #cecece !important; - border: none !important; - border-radius: 2px !important; - text-transform: uppercase !important; - font-weight: bold !important; + background-color: #cecece; + border: none; + border-radius: 2px; + text-transform: uppercase; + font-weight: bold; } .ui-dialog-buttonset > button.success_button.ui-button.ui-corner-all.ui-widget, .update_manager_button { - background-color: #82b92e !important; - color: #fff !important; - border-radius: 2px !important; - text-transform: uppercase !important; - font-weight: bold !important; + background-color: #82b92e; + color: #fff; + border-radius: 2px; + text-transform: uppercase; + font-weight: bold; } a.update_manager_button { @@ -214,8 +214,8 @@ a.update_manager_button { margin-top: 10px; display: inline-flex; align-items: center; - font-size: 16px !important; - border-radius: 4px !important; + font-size: 16px; + border-radius: 4px; text-decoration: none; font-family: "Open Sans", sans-serif; } @@ -231,7 +231,7 @@ a.update_manager_button:after { .ui-draggable, .ui-draggable .ui-dialog-titlebar { - cursor: default !important; + cursor: default; } #box_online #pkg_version { @@ -242,10 +242,10 @@ a.update_manager_button:after { /* METACONSOLE */ .box_online_meta { - background: none !important; - min-height: 400px !important; + background: none; + min-height: 400px; text-align: center; - border: none !important; + border: none; } div#box_online.box_online_meta * { @@ -277,7 +277,7 @@ div#box_online.box_online_meta * { } .update_manager_warning p { - font-size: 10pt !important; + font-size: 10pt; } .update_manager_warning img { @@ -287,8 +287,8 @@ div#box_online.box_online_meta * { a.update_manager_button_open { padding: 5px 10px; - font-size: 16px !important; - border-radius: 4px !important; + font-size: 16px; + border-radius: 4px; text-decoration: none; border: 1px solid #82b92e; color: #82b92e; diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 0dbe1049bc..3bf8a3448b 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -87,7 +87,7 @@ function menu_print_menu(&$menu) // ~ if (enterprise_hook ('enterprise_acl', array ($config['id_user'], $mainsec)) == false) // ~ continue; if (! isset($main['id'])) { - $id = 'menu_'.++$idcounter; + $id = 'menu_'.(++$idcounter); } else { $id = $main['id']; } @@ -405,9 +405,9 @@ function menu_print_menu(&$menu) $padding_top = ( $length >= 18) ? 6 : 12; if ($config['menu_type'] == 'classic') { - $output .= ''; + $output .= '
'.$main['text'].'
'; } else { - $output .= ''; + $output .= '
'.$main['text'].'
'; } // Add the notification ball if defined diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 59b76ba00f..2ecc7bc96d 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3295,11 +3295,11 @@ function ui_print_page_header( if ($godmode == true) { $type = 'view'; - $type2 = (empty($breadcrumbs)) ? 'menu_tab_frame_view' : 'menu_tab_frame_view_bc'; + $type2 = 'menu_tab_frame_view'; $separator_class = 'separator'; } else { $type = 'view'; - $type2 = (empty($breadcrumbs)) ? 'menu_tab_frame_view' : 'menu_tab_frame_view_bc'; + $type2 = 'menu_tab_frame_view'; $separator_class = 'separator_view'; } diff --git a/pandora_console/include/styles/agent_manager.css b/pandora_console/include/styles/agent_manager.css index fc648aefba..6df9c0f6eb 100644 --- a/pandora_console/include/styles/agent_manager.css +++ b/pandora_console/include/styles/agent_manager.css @@ -100,8 +100,8 @@ a#qr_code_agent_view { } .custom_fields_table .custom_field_row_opened td { - border-bottom-left-radius: 0px !important; - border-bottom-right-radius: 0px !important; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; } .secondary_groups_select { @@ -147,12 +147,12 @@ a#qr_code_agent_view { } .agent_description { - min-height: 4.8em !important; + min-height: 4.8em; } .agent_custom_id { padding-bottom: 0.7em; padding-top: 0.5em; display: inline-block; - border-radius: 5px !important; + border-radius: 5px; border: 1px solid #ccc; } diff --git a/pandora_console/include/styles/agent_view.css b/pandora_console/include/styles/agent_view.css index fca8aaa4fc..3ea40c15f8 100644 --- a/pandora_console/include/styles/agent_view.css +++ b/pandora_console/include/styles/agent_view.css @@ -1,13 +1,13 @@ text.text-tooltip { - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-family: "lato-bolder", "Open Sans", sans-serif; } div#bullets_modules span { - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-family: "lato-bolder", "Open Sans", sans-serif; } table#agent_interface_info .noresizevc.graph { - width: 500px !important; + width: 500px; } div.agent_details_agent_alias { @@ -15,5 +15,5 @@ div.agent_details_agent_alias { } div.agent_details_agent_alias * { - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-family: "lato-bolder", "Open Sans", sans-serif; } diff --git a/pandora_console/include/styles/common.css b/pandora_console/include/styles/common.css index 09c7abb566..c09bc06b4e 100644 --- a/pandora_console/include/styles/common.css +++ b/pandora_console/include/styles/common.css @@ -1,7 +1,7 @@ /* Debug styles */ pre.debug, div.backtrace { - font-family: monospace !important; + font-family: monospace; text-align: left; padding: 10px; margin: 5px; @@ -66,9 +66,9 @@ img.right { text-align: right; } .noshadow { - -moz-box-shadow: 0px !important; - -webkit-box-shadow: 0px !important; - box-shadow: 0px !important; + -moz-box-shadow: 0px; + -webkit-box-shadow: 0px; + box-shadow: 0px; } .center_align { text-align: center; diff --git a/pandora_console/include/styles/dialog.css b/pandora_console/include/styles/dialog.css index ecb4ab61f9..7346e62fdb 100644 --- a/pandora_console/include/styles/dialog.css +++ b/pandora_console/include/styles/dialog.css @@ -1,38 +1,38 @@ /* This file skins dialog */ .ui-dialog { - background: none repeat scroll 0 0 #3f3f3f !important; - border: 1px solid #3f3f3f !important; - color: #333333 !important; - padding: 0.2em !important; - overflow: hidden !important; + background: none repeat scroll 0 0 #3f3f3f; + border: 1px solid #3f3f3f; + color: #333333; + padding: 0.2em; + overflow: hidden; - -moz-border-radius: 6px !important; - -webkit-border-radius: 6px !important; - border-radius: 6px !important; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; - -moz-box-shadow: 0px 5px 5px #010e1b !important; - -webkit-box-shadow: 0px 5px 5px #010e1b !important; - box-shadow: 0px 5px 5px #010e1b !important; + -moz-box-shadow: 0px 5px 5px #010e1b; + -webkit-box-shadow: 0px 5px 5px #010e1b; + box-shadow: 0px 5px 5px #010e1b; } .ui-widget-header { - background: #3f3f3f !important; + background: #3f3f3f; } .ui-dialog .ui-dialog-titlebar { background-color: #ececec; - height: 24px !important; - padding: 0.3em 1em !important; + height: 24px; + padding: 0.3em 1em; position: relative; - margin: 0px auto 0 auto !important; - font-weight: bold !important; - border-bottom: none !important; - border-top: none !important; - border-left: none !important; - border-right: none !important; - color: #ffffff !important; - #padding: 0.1em 1em !important; + margin: 0px auto 0 auto; + font-weight: bold; + border-bottom: none; + border-top: none; + border-left: none; + border-right: none; + color: #ffffff; + #padding: 0.1em 1em; -moz-border-radius: 4px 4px 0 0; -webkit-border-radius: 4px 4px 0 0; @@ -40,114 +40,114 @@ } .ui-dialog .ui-dialog-title { - margin-left: 5px !important; - color: white !important; - font-weight: bold !important; - position: relative !important; + margin-left: 5px; + color: white; + font-weight: bold; + position: relative; top: 3px; font-size: 10pt; - left: 4px !important; - float: none !important; + left: 4px; + float: none; } .ui-dialog.ui-draggable .ui-dialog-titlebar { - cursor: move !important; + cursor: move; } .ui-dialog .ui-dialog-titlebar-close { - width: 23px !important; - height: 23px !important; - background: url(images/dialog-titlebar-close.png) no-repeat !important; - position: absolute !important; + width: 23px; + height: 23px; + background: url(images/dialog-titlebar-close.png) no-repeat; + position: absolute; top: 6px; - right: 3px !important; - cursor: pointer !important; + right: 3px; + cursor: pointer; } .ui-dialog .ui-dialog-titlebar-close span { - display: none !important; + display: none; } .ui-dialog .ui-dialog-titlebar-close-hover { - color: #000000 !important; + color: #000000; } .ui-dialog .ui-dialog-titlebar-close:hover span { - display: none !important; + display: none; } .ui-dialog .ui-dialog-titlebar-close:hover { - color: #000000 !important; + color: #000000; } .ui-dialog .ui-dialog-content { - margin: 12px !important; - #padding: 0.5em 1em !important; - overflow: auto !important; + margin: 12px; + #padding: 0.5em 1em; + overflow: auto; - -moz-border-left: 1px solid #a9a9a9 !important; - -moz-border-right: 1px solid #a9a9a9 !important; - -moz-border-bottom: 1px solid #a9a9a9 !important; - -moz-border-radius: 8px 8px 8px 8px !important; + -moz-border-left: 1px solid #a9a9a9; + -moz-border-right: 1px solid #a9a9a9; + -moz-border-bottom: 1px solid #a9a9a9; + -moz-border-radius: 8px 8px 8px 8px; - -webkit-border-left: 1px solid #a9a9a9 !important; - -webkit-border-right: 1px solid #a9a9a9 !important; - -webkit-border-bottom: 1px solid #a9a9a9 !important; - -webkit-border-radius: 8px 8px 8px 8px !important; + -webkit-border-left: 1px solid #a9a9a9; + -webkit-border-right: 1px solid #a9a9a9; + -webkit-border-bottom: 1px solid #a9a9a9; + -webkit-border-radius: 8px 8px 8px 8px; - border-left: 1px solid #a9a9a9 !important; - border-right: 1px solid #a9a9a9 !important; - border-bottom: 1px solid #a9a9a9 !important; - border-radius: 8px 8px 8px 8px !important; + border-left: 1px solid #a9a9a9; + border-right: 1px solid #a9a9a9; + border-bottom: 1px solid #a9a9a9; + border-radius: 8px 8px 8px 8px; - background: #ffffff !important; - position: relative !important; + background: #ffffff; + position: relative; } .ui-tabs .ui-tabs-nav { - background-color: white !important; + background-color: white; } .ui-tabs-panel { - background: #ececec !important; - -moz-border-radius: 8px !important; - -webkit-border-radius: 8px !important; - border-radius: 8px !important; - -moz-border-top-left-radius: 0px !important; - -webkit-border-top-left-radius: 0px !important; - border-top-left-radius: 0px !important; + background: #ececec; + -moz-border-radius: 8px; + -webkit-border-radius: 8px; + border-radius: 8px; + -moz-border-top-left-radius: 0px; + -webkit-border-top-left-radius: 0px; + border-top-left-radius: 0px; -moz-box-shadow: -1px 1px 6px #aaa; -webkit-box-shadow: -1px 1px 6px #aaa; box-shadow: 1px 1px 6px #aaa; } .ui-widget .ui-widget { - border: 0px !important; + border: 0px; } .ui-state-default:first-child { - margin-left: -3px !important; + margin-left: -3px; } .ui-state-default { - background: #fff !important; - border: 2px solid #ececec !important; - -moz-border-top-left-radius: 10px !important; - -webkit-top-left-border-radius: 10px !important; - border-top-left-radius: 10px !important; - -moz-border-top-right-radius: 10px !important; - -webkit-top-right-border-radius: 10px !important; - border-top-right-radius: 10px !important; - margin-left: 2px !important; + background: #fff; + border: 2px solid #ececec; + -moz-border-top-left-radius: 10px; + -webkit-top-left-border-radius: 10px; + border-top-left-radius: 10px; + -moz-border-top-right-radius: 10px; + -webkit-top-right-border-radius: 10px; + border-top-right-radius: 10px; + margin-left: 2px; } .ui-state-active { - background: #ececec !important; + background: #ececec; } .ui-dialog-content { - overflow: auto !important; - width: auto !important; - #height: auto !important; + overflow: auto; + width: auto; + #height: auto; } .ui-dialog .ui-dialog-buttonpane { @@ -185,8 +185,8 @@ font-weight: bold; outline: medium none; cursor: pointer; - margin: 0.5em 0.4em 0.5em 0 !important; - border-radius: 4px 4px 4px 4px !important; + margin: 0.5em 0.4em 0.5em 0; + border-radius: 4px 4px 4px 4px; } .ui-dialog .ui-button-dialog:hover { @@ -199,5 +199,5 @@ .ui-dialog-overlay { background: url("images/ui-bg_diagonals-thick_20_666666_40x40.png") repeat - scroll 50% 50% #666666 !important; + scroll 50% 50% #666666; } diff --git a/pandora_console/include/styles/discovery.css b/pandora_console/include/styles/discovery.css index 0209a43a8e..e935657d42 100644 --- a/pandora_console/include/styles/discovery.css +++ b/pandora_console/include/styles/discovery.css @@ -28,7 +28,7 @@ li.discovery > a label { } div.data_container > label { - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-family: "lato-bolder", "Open Sans", sans-serif; font-weight: lighter; } @@ -117,7 +117,7 @@ div.arrow_box:before { min-height: 55px; width: 100%; padding-right: 0px; - margin-left: 0px !important; + margin-left: 0px; margin-bottom: 20px; height: 55px; box-sizing: border-box; @@ -139,14 +139,14 @@ div.arrow_box:before { .breadcrumb_link { color: #848484; - font-size: 10pt !important; - font-family: "lato-bolder", "Open Sans", sans-serif !important; - text-decoration: none !important; + font-size: 10pt; + font-family: "lato-bolder", "Open Sans", sans-serif; + text-decoration: none; } span.breadcrumb_link { color: #d0d0d0; - font-size: 12pt !important; + font-size: 12pt; } .breadcrumb_link.selected { @@ -188,7 +188,7 @@ form.discovery * { } label { - color: #343434 !important; + color: #343434; font-weight: bold; } @@ -201,11 +201,11 @@ li > input[type="password"], .discovery_text_input > input[type="password"], .discovery_text_input > input[type="text"], #interval_manual > input[type="text"] { - background-color: transparent !important; + background-color: transparent; border: none; - border-radius: 0 !important; + border-radius: 0; border-bottom: 1px solid #ccc; - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-family: "lato-bolder", "Open Sans", sans-serif; font-weight: lighter; padding: 0px 0px 2px 0px; box-sizing: border-box; @@ -234,7 +234,7 @@ li > input[type="password"], } .discovery_textarea_input { - background-color: #fbfbfb !important; + background-color: #fbfbfb; padding-left: 10px; width: 100%; height: 100px; diff --git a/pandora_console/include/styles/firts_task.css b/pandora_console/include/styles/firts_task.css index 1b26b2bfbe..c3650d2a8e 100755 --- a/pandora_console/include/styles/firts_task.css +++ b/pandora_console/include/styles/firts_task.css @@ -64,7 +64,7 @@ div.new_task_cluster > div { .button_task { margin-top: 10px; - background-color: #3f3f3f !important; + background-color: #3f3f3f; padding: 10px 10px 10px 10px; font-weight: bold; color: #82b92e; diff --git a/pandora_console/include/styles/footer.css b/pandora_console/include/styles/footer.css new file mode 100644 index 0000000000..84dff3e551 --- /dev/null +++ b/pandora_console/include/styles/footer.css @@ -0,0 +1,33 @@ +/* + * --------------------------------------------------------------------- + * - FOOTER - + * --------------------------------------------------------------------- + */ +a.footer, +a.footer span { + font-size: 9px; + color: white; +} + +div#foot { + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + background: #343434; + clear: both; + width: auto; + height: 38px; + margin-top: auto; + box-sizing: border-box; +} + +div#foot a, +div#foot span { + font-family: "Open Sans", sans-serif; + font-size: 8pt; + color: #9ca4a6; +} + +div#foot small span { + font-size: 0.8em; +} diff --git a/pandora_console/include/styles/ie.css b/pandora_console/include/styles/ie.css index b8077309a8..01ded178be 100644 --- a/pandora_console/include/styles/ie.css +++ b/pandora_console/include/styles/ie.css @@ -20,7 +20,7 @@ background: none; } .title .toggle { - background: transparent url(images/toggle.png) no-repeat scroll !important; + background: transparent url(images/toggle.png) no-repeat scroll; } .title a { @@ -70,7 +70,7 @@ div#foot { box-shadow: 0px 0px 15px #000000; } div#foot a { - color: #333 !important; + color: #333; } div#foot a.white:after { diff --git a/pandora_console/include/styles/install.css b/pandora_console/include/styles/install.css index 51197b9da7..9ccf2a05bd 100644 --- a/pandora_console/include/styles/install.css +++ b/pandora_console/include/styles/install.css @@ -259,16 +259,16 @@ div.installation_step { } .popup-button-green span { - color: #fff !important; + color: #fff; } .popup-button-green:hover { - background-color: transparent !important; + background-color: transparent; border: 1px solid #82b92e; - color: #82b92e !important; + color: #82b92e; } .popup-button-green:hover span { - color: #82b92e !important; + color: #82b92e; } /* POPUP -END */ diff --git a/pandora_console/include/styles/jquery-ui.min.css b/pandora_console/include/styles/jquery-ui.min.css new file mode 100644 index 0000000000..776e2595ad --- /dev/null +++ b/pandora_console/include/styles/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6 +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.003;filter:Alpha(Opacity=.3)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/pandora_console/include/styles/js/images/ui-bg_flat_0_aaaaaa_40x100.png b/pandora_console/include/styles/js/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000..5157978749 --- /dev/null +++ b/pandora_console/include/styles/js/images/ui-bg_flat_0_aaaaaa_40x100.png @@ -0,0 +1,844 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png at master · jquery/jquery-ui · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content +
+ + + + + + + + +
+ +
+ + +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + Permalink + + + + + +
+ + +
+ + Branch: + master + + + + + + + +
+ +
+ + Find file + + + Copy path + +
+
+ + +
+ + Find file + + + Copy path + +
+
+ + + + +
+ + +
+
+ + 2 contributors + + +
+ +

+ Users who have contributed to this file +

+
+ +
+
+ + + @TravisCarden + + @PeterDaveHello + + + +
+
+ + + + + + +
+ +
+ +
+ 86 Bytes +
+ +
+ + + + +
+ +
+ +
+
+
+ + + +
+
+ ui-bg_flat_0_aaaaaa_40x100.png +
+
+ +
+ + + +
+ + +
+ + +
+
+ + + +
+ +
+ +
+
+ + +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + + + +
+ + + + diff --git a/pandora_console/include/styles/js/images/ui-icons_444444_256x240.png b/pandora_console/include/styles/js/images/ui-icons_444444_256x240.png new file mode 100644 index 0000000000..b5edd1f893 --- /dev/null +++ b/pandora_console/include/styles/js/images/ui-icons_444444_256x240.png @@ -0,0 +1,850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jquery-ui/ui-icons_444444_256x240.png at master · jquery/jquery-ui · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content +
+ + + + + + + + +
+ +
+ + +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + Permalink + + + + + +
+ + +
+ + Branch: + master + + + + + + + +
+ +
+ + Find file + + + Copy path + +
+
+ + +
+ + Find file + + + Copy path + +
+
+ + + + +
+
+ + @joliss + joliss + + Themes: Optimize PNG files with zopflipng + + + + cc37fe7 + Nov 29, 2016 + +
+ +
+
+ + 5 contributors + + +
+ +

+ Users who have contributed to this file +

+
+ +
+
+ + + @scottgonzalez + + @peritpatrio + + @jaspermdegroot + + @joliss + + @PeterDaveHello + + + +
+
+ + + + + + +
+ +
+ +
+ 3.19 KB +
+ +
+ + + + +
+ +
+ +
+
+
+ + + +
+
+ ui-icons_444444_256x240.png +
+
+ +
+ + + +
+ + +
+ + +
+
+ + + +
+ +
+ +
+
+ + +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + + + +
+ + + + diff --git a/pandora_console/include/styles/js/images/ui-icons_555555_256x240.png b/pandora_console/include/styles/js/images/ui-icons_555555_256x240.png new file mode 100644 index 0000000000..daa09aa2f5 --- /dev/null +++ b/pandora_console/include/styles/js/images/ui-icons_555555_256x240.png @@ -0,0 +1,850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jquery-ui/ui-icons_555555_256x240.png at master · jquery/jquery-ui · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content +
+ + + + + + + + +
+ +
+ + +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + Permalink + + + + + +
+ + +
+ + Branch: + master + + + + + + + +
+ +
+ + Find file + + + Copy path + +
+
+ + +
+ + Find file + + + Copy path + +
+
+ + + + +
+
+ + @joliss + joliss + + Themes: Optimize PNG files with zopflipng + + + + cc37fe7 + Nov 29, 2016 + +
+ +
+
+ + 5 contributors + + +
+ +

+ Users who have contributed to this file +

+
+ +
+
+ + + @scottgonzalez + + @peritpatrio + + @jaspermdegroot + + @joliss + + @PeterDaveHello + + + +
+
+ + + + + + +
+ +
+ +
+ 3.2 KB +
+ +
+ + + + +
+ +
+ +
+
+
+ + + +
+
+ ui-icons_555555_256x240.png +
+
+ +
+ + + +
+ + +
+ + +
+
+ + + +
+ +
+ +
+
+ + +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + + + +
+ + + + diff --git a/pandora_console/include/styles/js/images/ui-icons_777620_256x240.png b/pandora_console/include/styles/js/images/ui-icons_777620_256x240.png new file mode 100644 index 0000000000..e26a7ad1d7 --- /dev/null +++ b/pandora_console/include/styles/js/images/ui-icons_777620_256x240.png @@ -0,0 +1,850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jquery-ui/ui-icons_777620_256x240.png at master · jquery/jquery-ui · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content +
+ + + + + + + + +
+ +
+ + +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + Permalink + + + + + +
+ + +
+ + Branch: + master + + + + + + + +
+ +
+ + Find file + + + Copy path + +
+
+ + +
+ + Find file + + + Copy path + +
+
+ + + + +
+
+ + @joliss + joliss + + Themes: Optimize PNG files with zopflipng + + + + cc37fe7 + Nov 29, 2016 + +
+ +
+
+ + 5 contributors + + +
+ +

+ Users who have contributed to this file +

+
+ +
+
+ + + @scottgonzalez + + @peritpatrio + + @jaspermdegroot + + @joliss + + @PeterDaveHello + + + +
+
+ + + + + + +
+ +
+ +
+ 3.19 KB +
+ +
+ + + + +
+ +
+ +
+
+
+ + + +
+
+ ui-icons_777620_256x240.png +
+
+ +
+ + + +
+ + +
+ + +
+
+ + + +
+ +
+ +
+
+ + +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + + + +
+ + + + diff --git a/pandora_console/include/styles/js/images/ui-icons_777777_256x240.png b/pandora_console/include/styles/js/images/ui-icons_777777_256x240.png new file mode 100644 index 0000000000..2002c8c96d --- /dev/null +++ b/pandora_console/include/styles/js/images/ui-icons_777777_256x240.png @@ -0,0 +1,850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jquery-ui/ui-icons_777777_256x240.png at master · jquery/jquery-ui · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content +
+ + + + + + + + +
+ +
+ + +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + Permalink + + + + + +
+ + +
+ + Branch: + master + + + + + + + +
+ +
+ + Find file + + + Copy path + +
+
+ + +
+ + Find file + + + Copy path + +
+
+ + + + +
+
+ + @joliss + joliss + + Themes: Optimize PNG files with zopflipng + + + + cc37fe7 + Nov 29, 2016 + +
+ +
+
+ + 5 contributors + + +
+ +

+ Users who have contributed to this file +

+
+ +
+
+ + + @scottgonzalez + + @peritpatrio + + @jaspermdegroot + + @joliss + + @PeterDaveHello + + + +
+
+ + + + + + +
+ +
+ +
+ 3.19 KB +
+ +
+ + + + +
+ +
+ +
+
+
+ + + +
+
+ ui-icons_777777_256x240.png +
+
+ +
+ + + +
+ + +
+ + +
+
+ + + +
+ +
+ +
+
+ + +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + + + +
+ + + + diff --git a/pandora_console/include/styles/js/images/ui-icons_cc0000_256x240.png b/pandora_console/include/styles/js/images/ui-icons_cc0000_256x240.png new file mode 100644 index 0000000000..65587cb507 --- /dev/null +++ b/pandora_console/include/styles/js/images/ui-icons_cc0000_256x240.png @@ -0,0 +1,850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jquery-ui/ui-icons_cc0000_256x240.png at master · jquery/jquery-ui · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content +
+ + + + + + + + +
+ +
+ + +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + Permalink + + + + + +
+ + +
+ + Branch: + master + + + + + + + +
+ +
+ + Find file + + + Copy path + +
+
+ + +
+ + Find file + + + Copy path + +
+
+ + + + +
+
+ + @joliss + joliss + + Themes: Optimize PNG files with zopflipng + + + + cc37fe7 + Nov 29, 2016 + +
+ +
+
+ + 5 contributors + + +
+ +

+ Users who have contributed to this file +

+
+ +
+
+ + + @scottgonzalez + + @peritpatrio + + @jaspermdegroot + + @joliss + + @PeterDaveHello + + + +
+
+ + + + + + +
+ +
+ +
+ 3.19 KB +
+ +
+ + + + +
+ +
+ +
+
+
+ + + +
+
+ ui-icons_cc0000_256x240.png +
+
+ +
+ + + +
+ + +
+ + +
+
+ + + +
+ +
+ +
+
+ + +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + + + +
+ + + + diff --git a/pandora_console/include/styles/js/images/ui-icons_ffffff_256x240.png b/pandora_console/include/styles/js/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000000..61962b53d2 --- /dev/null +++ b/pandora_console/include/styles/js/images/ui-icons_ffffff_256x240.png @@ -0,0 +1,850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jquery-ui/ui-icons_ffffff_256x240.png at master · jquery/jquery-ui · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content +
+ + + + + + + + +
+ +
+ + +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + Permalink + + + + + +
+ + +
+ + Branch: + master + + + + + + + +
+ +
+ + Find file + + + Copy path + +
+
+ + +
+ + Find file + + + Copy path + +
+
+ + + + +
+
+ + @joliss + joliss + + Themes: Optimize PNG files with zopflipng + + + + cc37fe7 + Nov 29, 2016 + +
+ +
+
+ + 5 contributors + + +
+ +

+ Users who have contributed to this file +

+
+ +
+
+ + + @scottgonzalez + + @peritpatrio + + @jaspermdegroot + + @joliss + + @PeterDaveHello + + + +
+
+ + + + + + +
+ +
+ +
+ 3.19 KB +
+ +
+ + + + +
+ +
+ +
+
+
+ + + +
+
+ ui-icons_ffffff_256x240.png +
+
+ +
+ + + +
+ + +
+ + +
+
+ + + +
+ +
+ +
+
+ + +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + + + +
+ + + + diff --git a/pandora_console/include/styles/js/introjs.css b/pandora_console/include/styles/js/introjs.css index 03db182404..8ca0f3fbf9 100644 --- a/pandora_console/include/styles/js/introjs.css +++ b/pandora_console/include/styles/js/introjs.css @@ -53,14 +53,14 @@ } .introjs-fixParent { - z-index: auto !important; - opacity: 1 !important; + z-index: auto; + opacity: 1; } .introjs-showElement, tr.introjs-showElement > td, tr.introjs-showElement > th { - z-index: 9999999 !important; + z-index: 9999999; } .introjs-relativePosition, @@ -89,7 +89,7 @@ tr.introjs-showElement > th { position: absolute; top: -16px; left: -16px; - z-index: 9999999999 !important; + z-index: 9999999999; padding: 2px; font-family: Arial, verdana, tahoma; font-size: 13px; diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css index f5bd560d69..0dde42f6a8 100644 --- a/pandora_console/include/styles/js/jquery-ui_custom.css +++ b/pandora_console/include/styles/js/jquery-ui_custom.css @@ -2,12 +2,12 @@ /* --- JQUERY-UI --- */ .ui-dialog .ui-dialog-titlebar { - background-color: #82b92e !important; + background-color: #82b92e; } /*center ui dialog center*/ .ui-dialog-titlebar .ui-icon-closethick { - margin-top: -5px !important; + margin-top: -5px; } .ui-button-text-only .ui-button-text { font-family: nunito; @@ -20,7 +20,7 @@ } .ui-datepicker .ui-datepicker-title select, .ui-datepicker .ui-datepicker-title option { - color: #111 !important; + color: #111; } .ui-dialog .ui-dialog-titlebar { display: inherit; @@ -31,32 +31,32 @@ } .ui-dialog .ui-dialog-title { font-family: Nunito, sans-serif; - margin: 0.1em 0 !important; - white-space: nowrap !important; - width: 100% !important; - overflow: hidden !important; - text-overflow: ellipsis !important; + margin: 0.1em 0; + white-space: nowrap; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; font-size: 11pt; position: relative; top: 5px; - float: none !important; + float: none; } .ui-dialog .ui-dialog-titlebar-close { - position: absolute !important; - right: 1em !important; - width: 21px !important; - margin: 0px 0 0 0 !important; - padding: 1px !important; - height: 20px !important; - bottom: 30% !important; - top: 20% !important; + position: absolute; + right: 1em; + width: 21px; + margin: 0px 0 0 0; + padding: 1px; + height: 20px; + bottom: 30%; + top: 20%; } .ui-dialog .ui-dialog-content { - position: relative !important; + position: relative; border: 0; - padding: 0.5em 1em !important; - background: none !important; - overflow: auto !important; + padding: 0.5em 1em; + background: none; + overflow: auto; margin-bottom: 1em; } .ui-dialog .ui-dialog-buttonpane { @@ -79,11 +79,11 @@ width: 90px; } .ui-widget-header .ui-icon { - background-image: url(../images/ui-icons_444444_256x240.png) !important; + background-image: url(../images/ui-icons_444444_256x240.png); } .ui-icon, .ui-widget-content .ui-icon { - background-image: url(../images/ui-icons_444444_256x240.png) !important; + background-image: url(../images/ui-icons_444444_256x240.png); } .ui-widget-content { background: #ffffff url(../images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% @@ -93,44 +93,44 @@ .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { margin-top: 3px; - border: 1px solid #d3d3d3 !important; - border-bottom: 0 !important; + border: 1px solid #d3d3d3; + border-bottom: 0; background: #e6e6e6 url(../images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% - repeat-x !important; - font-weight: normal !important; - color: #555555 !important; + repeat-x; + font-weight: normal; + color: #555555; } .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { - border-top-left-radius: 0 !important; + border-top-left-radius: 0; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { - border-top-right-radius: 0 !important; + border-top-right-radius: 0; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { - border-bottom-left-radius: 0 !important; + border-bottom-left-radius: 0; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { - border-bottom-right-radius: 0 !important; + border-bottom-right-radius: 0; } #ui-datepicker-div { border-color: #b1b1b1; background: #ffffff; } .ui-widget-header { - background: #b1b1b1 !important; - color: #ffffff !important; + background: #b1b1b1; + color: #ffffff; } .ui-datepicker-calendar th { background-color: #3f3f3f; @@ -142,7 +142,7 @@ .ui_tpicker_minute, .ui_tpicker_second, .ui-slider-handle { - border: 1px solid #aaaaaa !important; + border: 1px solid #aaaaaa; } .ui-timepicker-div dd { margin: 0px 15px 0px 15px; @@ -151,21 +151,21 @@ color: white; } .ui-datepicker-buttonpane button { - border-color: #b1b1b1 !important; + border-color: #b1b1b1; } .ui-datepicker-buttonpane .ui-datepicker-current { - margin-left: 0.2em !important; + margin-left: 0.2em; } .ui-dialog .ui-widget-content { - border: 0px !important; + border: 0px; } .ui-dialog { box-shadow: 5px 5px 19px #4e4e4e; - border: 0px !important; - padding: 0 !important; + border: 0px; + padding: 0; } .ui-dialog-titlebar { - border: 0px !important; + border: 0px; } .ui-dialog-titlebar .ui-icon-closethick, .ui-dialog-titlebar .ui-state-default, @@ -175,7 +175,7 @@ border: 0px; } .ui-dialog-titlebar .ui-icon-closethick { - background-image: url("../../../images/icono_cerrar.png") !important; + background-image: url("../../../images/icono_cerrar.png"); } .ui-dialog-title { color: #ffffff; @@ -185,7 +185,7 @@ .ui-widget select, .ui-widget textarea, .ui-widget button { - font-family: Verdana, Arial, sans-serif !important; + font-family: Verdana, Arial, sans-serif; } a.ui-button:active, @@ -195,69 +195,69 @@ a.ui-button:active, .ui-state-focus .ui-widget-header, .ui-state-focus .ui-button:hover, .ui-button:focus { - background: transparent !important; - border: none !important; + background: transparent; + border: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover { - border: 1px solid #999999 !important; - border-bottom: 0 !important; + border: 1px solid #999999; + border-bottom: 0; background: #dadada url(../images/ui-bg_glass_75_dadada_1x400.png) 50% 50% - repeat-x !important; + repeat-x; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { - border: 1px solid #aaaaaa !important; - border-bottom: 0 !important; + border: 1px solid #aaaaaa; + border-bottom: 0; background: #ffffff url(../images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% - repeat-x !important; - font-weight: normal !important; - color: #212121 !important; + repeat-x; + font-weight: normal; + color: #212121; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { - color: #212121 !important; + color: #212121; } ul.ui-front { - z-index: 1000000 !important; - padding-right: 0px !important; + z-index: 1000000; + padding-right: 0px; } ul.ui-front li { - padding: 3px !important; + padding: 3px; } ul.ui-front li:hover { - background-color: #e1e3e1 !important; + background-color: #e1e3e1; } ul.ui-front li a.ui-menu-item-wrapper { - background: transparent !important; - border: none !important; + background: transparent; + border: none; } ul.ui-front li a.ui-menu-item-wrapper span { - padding-left: 5px !important; + padding-left: 5px; } ul.ui-front li a.ui-menu-item-wrapper:hover { - text-decoration: none !important; + text-decoration: none; } input[type="submit"].ui-button-dialog { - margin: 0.5em 1em 0.5em 0 !important; - cursor: pointer !important; - background: white !important; - background-color: white !important; - color: #82b92e !important; - text-align: center !important; - border: 1px solid #82b92e !important; - height: 30px !important; - width: 90px !important; + margin: 0.5em 1em 0.5em 0; + cursor: pointer; + background: white; + background-color: white; + color: #82b92e; + text-align: center; + border: 1px solid #82b92e; + height: 30px; + width: 90px; } diff --git a/pandora_console/include/styles/login.css b/pandora_console/include/styles/login.css index bffcda19d5..68fbb52122 100644 --- a/pandora_console/include/styles/login.css +++ b/pandora_console/include/styles/login.css @@ -6,7 +6,7 @@ h1#log_title { font-size: 18px; margin-bottom: 0px; - color: #fff !important; + color: #fff; width: 300px; } @@ -27,7 +27,6 @@ div#error_buttons a { min-height: 100%; min-width: 1200px; width: 100%; - z-index: -9999; position: absolute; background: linear-gradient(74deg, #02020255 36%, transparent 36%), url("../../images/backgrounds/background_pandora_console_keys.jpg"); @@ -35,7 +34,7 @@ div#error_buttons a { } p.log_in { - color: #fff !important; + color: #fff; padding: 0px 10px; width: 300px; } @@ -167,13 +166,13 @@ div.login_pass input { div.login_nick input, div.login_pass input { - border: 0px !important; + border: 0px; color: #343434; border-radius: 3px; width: 100%; height: 40px; font-size: 10pt; - padding: 0px 0px 0px 35px !important; + padding: 0px 0px 0px 35px; background-repeat: no-repeat; background-size: 27px; background-position: left center; @@ -195,8 +194,8 @@ div.login_pass input:-webkit-autofill:hover, div.login_pass input:-webkit-autofill:focus, div.login_pass input:-webkit-autofill:active { transition: background-color 10000s ease-in-out 0s; - -webkit-box-shadow: 0 0 0px 0px transparent inset !important; - -webkit-text-fill-color: #343434 !important; + -webkit-box-shadow: 0 0 0px 0px transparent inset; + -webkit-text-fill-color: #343434; border: 0px; width: 89%; } @@ -217,55 +216,55 @@ div.login_button_saml { div.login_button input { width: 100%; - background-color: #82b92e !important; + background-color: #82b92e; text-align: center; height: 40px; padding: 0px; font-size: 11pt; - color: #fff !important; + color: #fff; border: 1px solid #82b92e; border-radius: 3px; } div.login_button_saml input { border: 1px solid #fff; - background-color: #fff !important; - color: #000 !important; + background-color: #fff; + color: #000; background-image: url("../../images/saml_login.png"); background-repeat: no-repeat; background-position: right 5% center; } div.login_button input:hover { - background-color: #fff !important; - color: #000 !important; - border: 1px solid #fff !important; + background-color: #fff; + color: #000; + border: 1px solid #fff; } div.login_button_saml input:hover { background-image: url("../../images/saml_login_hover.png"); - background-color: transparent !important; - color: #fff !important; - border: 1px solid #fff !important; + background-color: transparent; + color: #fff; + border: 1px solid #fff; } #remove_button input { - background-image: url("../../images/user_login.png") !important; + background-image: url("../../images/user_login.png"); background-repeat: no-repeat; background-position: right 5% center; } #remove_button input:hover { - background-image: url("../../images/user_login_hover.png") !important; + background-image: url("../../images/user_login_hover.png"); } .login_back input { - background-image: url("../../images/back_login.png") !important; - background-position: left 5% center !important; + background-image: url("../../images/back_login.png"); + background-position: left 5% center; } .login_back input:hover { - background-image: url("../../images/back_login_hover.png") !important; + background-image: url("../../images/back_login_hover.png"); } div.login_data { @@ -319,7 +318,7 @@ div.img_banner_login img { } .reset_password a { - color: #ddd !important; + color: #ddd; font-family: "Open Sans", sans-serif; font-size: 8.5pt; } @@ -399,7 +398,7 @@ div.form_message_alert ul li { div.form_message_alert ul li input { border: none; - background-color: #dadada !important; + background-color: #dadada; border-radius: 0px; height: 17px; width: 145px; diff --git a/pandora_console/include/styles/menu.css b/pandora_console/include/styles/menu.css index 7846a3f9a6..c428062537 100644 --- a/pandora_console/include/styles/menu.css +++ b/pandora_console/include/styles/menu.css @@ -18,7 +18,7 @@ .operation li, .godmode li { - display: flex !important; + display: flex; justify-content: flex-start; align-items: center; } @@ -81,13 +81,13 @@ li:hover ul { } .sub_subMenu { - font-weight: normal !important; + font-weight: normal; background-color: #202020; padding-left: 1.5em; } .sub_subMenu.selected { - font-weight: 600 !important; + font-weight: 600; } .submenu2 li a { @@ -109,29 +109,28 @@ li:hover ul { .menu li.submenu_not_selected a, .menu li.submenu2_not_selected a { - font-weight: normal !important; + font-weight: normal; } .submenu_selected { - margin-bottom: 0px !important; - box-shadow: inset 4px 0 #80ba27 !important; + margin-bottom: 0px; + box-shadow: inset 4px 0 #80ba27; } .selected.submenu_selected { - background-color: #202020 !important; + background-color: #202020; } li.submenu_selected.selected { - background-color: #202020 !important; + background-color: #202020; font-weight: 600; } li.sub_subMenu.selected { - background-color: #161616 !important; + background-color: #161616; } .menu .menu_icon, .menu li.links { - background-position: 4px 4px; background-repeat: no-repeat; cursor: pointer; } @@ -143,73 +142,73 @@ li.sub_subMenu.selected { /* Icons specified here */ #icon_oper-networkconsole { - background: url(../../images/op_network.menu_gray.png) no-repeat; + background-image: url(../../images/op_network.menu_gray.png); } #icon_oper-agents { - background: url(../../images/op_monitoring.menu_gray.png) no-repeat; + background-image: url(../../images/op_monitoring.menu_gray.png); } #icon_oper-events { - background: url(../../images/op_events.menu_gray.png) no-repeat; + background-image: url(../../images/op_events.menu_gray.png); } /* users */ #icon_oper-users { - background: url(../../images/op_workspace.menu_gray.png) no-repeat; + background-image: url(../../images/op_workspace.menu_gray.png); } /* trap console */ #icon_oper-snmpc, #icon_god-snmpc { - background: url(../../images/op_snmp.menu.png) no-repeat 50% 50%; + background-image: url(../../images/op_snmp.menu.png); } #icon_oper-reporting { - background: url(../../images/op_reporting.menu_gray.png) no-repeat; + background-image: url(../../images/op_reporting.menu_gray.png); } #icon_oper-gismaps { - background: url(../../images/op_gis.menu.png) no-repeat 50% 50%; + background-image: url(../../images/op_gis.menu.png); } #icon_oper-netflow { - background: url(../../images/op_netflow.menu.png) no-repeat 50% 50%; + background-image: url(../../images/op_netflow.menu.png); } #icon_oper-extensions { - background: url(../../images/extensions.menu_gray.png) no-repeat; + background-image: url(../../images/extensions.menu_gray.png); } /* Godmode images */ #icon_god-discovery { - background: url(../../images/gm_discovery.menu.png) no-repeat; + background-image: url(../../images/gm_discovery.menu.png); } #icon_god-resources { - background: url(../../images/gm_resources.menu_gray.png) no-repeat; + background-image: url(../../images/gm_resources.menu_gray.png); } #icon_god-configuration { - background: url(../../images/gm_configuration.menu_gray.png) no-repeat; + background-image: url(../../images/gm_configuration.menu_gray.png); } #icon_god-alerts { - background: url(../../images/gm_alerts.menu_gray.png) no-repeat; + background-image: url(../../images/gm_alerts.menu_gray.png); } #icon_god-users { - background: url(../../images/gm_users.menu_gray.png) no-repeat; + background-image: url(../../images/gm_users.menu_gray.png); } #icon_god-reporting { - background: url(../../images/reporting_edit.menu.png) no-repeat 50% 50%; + background-image: url(../../images/reporting_edit.menu.png); } #icon_god-servers { - background: url(../../images/gm_servers.menu_gray.png) no-repeat; + background-image: url(../../images/gm_servers.menu_gray.png); } #icon_god-setup { - background: url(../../images/gm_setup.menu_gray.png) no-repeat; + background-image: url(../../images/gm_setup.menu_gray.png); } #icon_god-events { - background: url(../../images/gm_events.menu_gray.png) no-repeat; + background-image: url(../../images/gm_events.menu_gray.png); } #icon_god-extensions { - background: url(../../images/builder.menu_gray.png) no-repeat; + background-image: url(../../images/builder.menu_gray.png); } #icon_god-links { - background: url(../../images/links.menu_gray.png) no-repeat; + background-image: url(../../images/links.menu_gray.png); } #icon_god-um_messages { - background: url(../../images/um_messages.menu_gray.png) no-repeat; + background-image: url(../../images/um_messages.menu_gray.png); } #menu_container { @@ -267,16 +266,16 @@ ul li { */ .menu_icon:hover { - background-color: #282828 !important; + background-color: #282828; } .submenu_not_selected:hover { - background-color: #202020 !important; + background-color: #202020; } .submenu_selected:hover { - background-color: #202020 !important; + background-color: #202020; } .sub_subMenu:hover { - background-color: #161616 !important; + background-color: #161616; } .menu li.selected { @@ -284,21 +283,25 @@ ul li { } .operation { - background-color: #3d3d3d !important; - padding-top: 20px !important; + background-color: #3d3d3d; + padding-top: 20px; } .operation .selected, .godmode .selected { - background-color: #282828 !important; + background-color: #282828; } .operation .selected #title_menu, .godmode .selected #title_menu { - color: #fff !important; + color: #fff; font-weight: 600; } +.menu > .operation { + padding-top: 2em; +} + .menu li, .menu li a, .menu li div { @@ -312,65 +315,67 @@ ul li { } .godmode { - padding-bottom: 4px !important; + padding-bottom: 4px; background-color: #343434; } /* Menu icons active */ .selected#icon_oper-networkconsole { - background: url(../../images/op_network.menu_white.png) no-repeat; + background-image: url(../../images/op_network.menu_white.png); } .selected#icon_oper-agents { - background: url(../../images/op_monitoring.menu_white.png) no-repeat; + background-image: url(../../images/op_monitoring.menu_white.png); } .selected#icon_oper-events { - background: url(../../images/op_events.menu_white.png) no-repeat; + background-image: url(../../images/op_events.menu_white.png); } .selected#icon_oper-users { - background: url(../../images/op_workspace.menu_white.png) no-repeat; + background-image: url(../../images/op_workspace.menu_white.png); } .selected#icon_oper-reporting { - background: url(../../images/op_reporting.menu_white.png) no-repeat; + background-image: url(../../images/op_reporting.menu_white.png); } .selected#icon_oper-extensions { - background: url(../../images/extensions.menu_white.png) no-repeat; + background-image: url(../../images/extensions.menu_white.png); } .selected#icon_god-discovery { - background: url(../../images/gm_discovery.menu_white.png) no-repeat; + background-image: url(../../images/gm_discovery.menu_white.png); } .selected#icon_god-resources { - background: url(../../images/gm_resources.menu_white.png) no-repeat; + background-image: url(../../images/gm_resources.menu_white.png); } .selected#icon_god-configuration { - background: url(../../images/gm_configuration.menu_white.png) no-repeat; + background-image: url(../../images/gm_configuration.menu_white.png); } .selected#icon_god-alerts { - background: url(../../images/gm_alerts.menu_white.png) no-repeat; + background-image: url(../../images/gm_alerts.menu_white.png); } .selected#icon_god-users { - background: url(../../images/gm_users.menu_white.png) no-repeat; + background-image: url(../../images/gm_users.menu_white.png); } .selected#icon_god-servers { - background: url(../../images/gm_servers.menu_white.png) no-repeat; + background-image: url(../../images/gm_servers.menu_white.png); } .selected#icon_god-setup { - background: url(../../images/gm_setup.menu_white.png) no-repeat; + background-image: url(../../images/gm_setup.menu_white.png); } .selected#icon_god-events { - background: url(../../images/gm_events.menu_white.png) no-repeat; + background-image: url(../../images/gm_events.menu_white.png); } .selected#icon_god-extensions { - background: url(../../images/builder.menu_white.png) no-repeat; + background-image: url(../../images/builder.menu_white.png); } .selected#icon_god-links { - background: url(../../images/links.menu_white.png) no-repeat; + background-image: url(../../images/links.menu_white.png); } .selected#icon_god-um_messages { - background: url(../../images/um_messages.menu_white.png) no-repeat; + background-image: url(../../images/um_messages.menu_white.png); } #menu_full { - width: 60px; /* This is overwritten by the classic menu (215px) */ + height: 100%; + display: flex; + flex-direction: column; position: fixed; z-index: 1; top: 0; @@ -381,15 +386,14 @@ ul li { } .button_collapse { + margin-top: auto; height: 38px; background-color: #505050; - width: 60px; /* This is overwritten by the classic menu (215px) */ text-align: center; color: #fff; cursor: pointer; background-repeat: no-repeat; background-position: center; - margin-top: 15px; } .logo_green { @@ -408,16 +412,24 @@ ul li { .menu_full_classic, .button_classic { - width: 215px !important; + width: 215px; } .menu_full_collapsed, .button_collapsed { - width: 60px !important; + width: 60px; +} + +.menu_full_classic .title_menu_classic { + display: flex; +} + +.menu_full_collapsed .title_menu_collapsed { + display: none; } .button_classic { - width: 215px !important; + width: 215px; background-image: url(../../images/button_collapse_menu.png); background-repeat: no-repeat; background-position: center; @@ -434,13 +446,13 @@ ul li { .menu li, .menu li a, .menu li div { - min-height: 28px !important; + min-height: 28px; } } @media screen and (max-height: 735px) { .operation { - padding-top: 10px !important; + padding-top: 10px; } .button_collapse { margin-top: 10px; @@ -453,29 +465,29 @@ ul li { * --------------------------------------------------------------------- */ .page_classic { - padding-left: 215px !important; + padding-left: 215px; } .page_collapsed { - padding-left: 60px !important; + padding-left: 60px; } .header_table_classic { - padding-left: 235px !important; /* 215 + 35 */ + padding-left: 235px; /* 215 + 35 */ } .header_table_collapsed { - padding-left: 80px !important; /* 60 + 35 */ + padding-left: 80px; /* 60 + 35 */ } .title_menu_classic { - display: flex !important; + display: flex; } .title_menu_collapsed { - display: none !important; + display: none; } .menu_icon_collapsed { - background-position: 50% 50% !important; + background-position: 50% 50%; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 44ac0d09f4..d47ab1c9a4 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -123,9 +123,15 @@ svg * { font-size: 11pt; } +html { + height: 100%; +} body { background-color: #fff; margin: 0 auto; + display: flex; + flex-direction: column; + min-height: 100%; } input, textarea { @@ -142,7 +148,7 @@ input { } input[type="checkbox"] { - display: inline !important; + display: inline; } select { padding: 2px 3px 3px 3px; @@ -210,13 +216,13 @@ th > label { padding-top: 7px; } input:disabled { - background-color: #ddd !important; + background-color: #ddd; } textarea:disabled { - background-color: #ddd !important; + background-color: #ddd; } select:disabled { - background-color: #ddd !important; + background-color: #ddd; } ul { list-style-type: none; @@ -247,7 +253,7 @@ td input[type="checkbox"] { } input[type="image"] { border: 0px; - background-color: transparent !important; + background-color: transparent; } table, img { @@ -274,18 +280,18 @@ textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus, select:-webkit-autofill, select:-webkit-autofill:hover, select:-webkit-autofill:focus { - -webkit-box-shadow: 0 0 0px 1000px #ffffff inset !important; + -webkit-box-shadow: 0 0 0px 1000px #ffffff inset; } /* All select type multiple */ select[multiple] option:checked { background: #82b92e linear-gradient(0deg, #82b92e 0%, #82b92e 100%); - color: #fff !important; + color: #fff; } select option:checked { background-color: #82b92e; - color: #fff !important; + color: #fff; } select > option:hover { @@ -457,7 +463,7 @@ select:-internal-list-box { padding: 0; } .no-padding-imp { - padding: 0 !important; + padding: 0; } .no-margin { margin: 0; @@ -469,10 +475,10 @@ select:-internal-list-box { vertical-align: top; } .no-td-borders td { - border: none !important; + border: none; } .no-td-padding td { - padding: 0 !important; + padding: 0; } div#page { @@ -480,10 +486,10 @@ div#page { background-image: none; clear: both; width: auto; - padding-top: 5px !important; - padding-left: 60px; /* This is overwritten by the classic menu (215px)*/ - padding-right: 35px; - margin-left: 20px; + padding-top: 5px; + padding-right: 6em; + display: flex; + flex-direction: column; } body.pure { @@ -500,12 +506,11 @@ div#container { } div#main { - width: auto; + width: 100%; margin: 0 auto; + margin-left: 3em; position: relative; min-height: 850px; - max-width: 100%; - min-width: 93%; } textarea.conf_editor { @@ -577,12 +582,12 @@ input.sub { padding-top: 10px; padding-left: 15px; border-color: #888; - font-family: "lato", "Open Sans", sans-serif !important; + font-family: "lato", "Open Sans", sans-serif; } input.sub[disabled] { - color: #b4b4b4 !important; - background-color: #f3f3f3 !important; + color: #b4b4b4; + background-color: #f3f3f3; border-color: #b6b6b6; cursor: default; } @@ -714,33 +719,6 @@ div#main_help div.databox p { text-align: justify; } -/* - * --------------------------------------------------------------------- - * - FOOTER - - * --------------------------------------------------------------------- - */ -a.footer, -a.footer span { - font-size: 9px; - color: white; -} - -div#foot { - padding-top: 10px; - padding-bottom: 10px; - text-align: center; - background: #343434; - clear: both; - width: auto; -} - -div#foot a, -div#foot span { - font-family: "Open Sans", sans-serif; - font-size: 8pt; - color: #9ca4a6; -} - /* * --------------------------------------------------------------------- * - HEADER AND LEFT MENU STYLES - @@ -788,9 +766,9 @@ div#head { } /*.databox_error { - width: 657px !important; + width: 657px; height: 400px; - border: none !important; + border: none; background-color: #fafafa; background: url(../../images/splash_error.png) no-repeat; } @@ -807,275 +785,6 @@ input.datos { background-color: #050505; }*/ -/* - * --------------------------------------------------------------------- - * - VISUAL MAPS - - * --------------------------------------------------------------------- - */ -input.vs_button_ghost { - background-color: transparent !important; - border: 1px solid #82b92e; - color: #82b92e !important; - text-align: center; - padding: 4px 12px; - font-weight: bold; -} - -input.next, -input.upd, -input.ok, -input.wand, -input.delete, -input.cog, -input.target, -input.search, -input.copy, -input.add, -input.graph, -input.percentile, -input.binary, -input.camera, -input.config, -input.cancel, -input.default, -input.filter, -input.pdf, -input.spinn { - padding-right: 30px; -} - -input.next { - background-image: url(../../images/input_go.png) !important; -} -input.upd { - background-image: url(../../images/input_update.png) !important; -} -input.wand { - background-image: url(../../images/input_wand.png) !important; -} -input.wand:disabled { - background-image: url(../../images/input_wand.disabled.png) !important; -} -input.search { - background-image: url(../../images/input_zoom.png) !important; -} -input.search:disabled { - background-image: url(../../images/input_zoom.disabled.png) !important; -} -input.ok { - background-image: url(../../images/input_tick.png) !important; -} -input.ok:disabled { - background-image: url(../../images/input_tick.disabled.png) !important; -} -input.add { - background-image: url(../../images/input_add.png) !important; -} -input.add:disabled { - background-image: url(../../images/input_add.disabled.png) !important; -} -input.cancel { - background-image: url(../../images/input_cross.png) !important; -} -input.cancel:disabled { - background-image: url(../../images/input_cross.disabled.png) !important; -} -input.delete { - background-image: url(../../images/input_delete.png) !important; -} -input.delete:disabled { - background-image: url(../../images/input_delete.disabled.png) !important; -} -input.cog { - background-image: url(../../images/input_cog.png) !important; -} -input.cog:disabled { - background-image: url(../../images/input_cog.disabled.png) !important; -} -input.config { - background-image: url(../../images/input_config.png) !important; -} -input.config:disabled { - background-image: url(../../images/input_config.disabled.png) !important; -} -input.filter { - background-image: url(../../images/input_filter.png) !important; -} -input.filter:disabled { - background-image: url(../../images/input_filter.disabled.png) !important; -} -input.pdf { - background-image: url(../../images/input_pdf.png) !important; -} -input.pdf:disabled { - background-image: url(../../images/input_pdf.disabled.png) !important; -} -input.camera { - background-image: url(../../images/input_camera.png) !important; -} -input.spinn { - background-image: url(../../images/spinner_green.gif) !important; -} - -#toolbox #auto_save { - padding-top: 5px; -} - -#toolbox { - margin-top: 13px; -} -input.visual_editor_button_toolbox { - padding-right: 15px; - padding-top: 10px; - margin-top: 5px; -} -input.delete_min { - background: #fefefe url(../../images/cross.png) no-repeat center !important; -} -input.delete_min[disabled] { - background: #fefefe url(../../images/cross.disabled.png) no-repeat center !important; -} -input.graph_min { - background: #fefefe url(../../images/chart_curve.png) no-repeat center !important; -} -input.graph_min[disabled] { - background: #fefefe url(../../images/chart_curve.disabled.png) no-repeat - center !important; -} -input.bars_graph_min { - background: #fefefe url(../../images/icono-barras-arriba.png) no-repeat center !important; -} -input.bars_graph_min[disabled] { - background: #fefefe url(../../images/icono-barras-arriba.disabled.png) - no-repeat center !important; -} -input.percentile_min { - background: #fefefe url(../../images/chart_bar.png) no-repeat center !important; -} -input.percentile_min[disabled] { - background: #fefefe url(../../images/chart_bar.disabled.png) no-repeat center !important; -} -input.percentile_item_min { - background: #fefefe url(../../images/percentile_item.png) no-repeat center !important; -} -input.percentile_item_min[disabled] { - background: #fefefe url(../../images/percentile_item.disabled.png) no-repeat - center !important; -} -input.auto_sla_graph_min { - background: #fefefe url(../../images/auto_sla_graph.png) no-repeat center !important; -} -input.auto_sla_graph_min[disabled] { - background: #fefefe url(../../images/auto_sla_graph.disabled.png) no-repeat - center !important; -} -input.donut_graph_min { - background: #fefefe url(../../images/icono-quesito.png) no-repeat center !important; -} -input.donut_graph_min[disabled] { - background: #fefefe url(../../images/icono-quesito.disabled.png) no-repeat - center !important; -} -input.binary_min { - background: #fefefe url(../../images/binary.png) no-repeat center !important; -} -input.binary_min[disabled] { - background: #fefefe url(../../images/binary.disabled.png) no-repeat center !important; -} -input.camera_min { - background: #fefefe url(../../images/camera.png) no-repeat center !important; -} -input.camera_min[disabled] { - background: #fefefe url(../../images/camera.disabled.png) no-repeat center !important; -} -input.config_min { - background: #fefefe url(../../images/config.png) no-repeat center !important; -} -input.config_min[disabled] { - background: #fefefe url(../../images/config.disabled.png) no-repeat center !important; -} -input.label_min { - background: #fefefe url(../../images/tag_red.png) no-repeat center !important; -} -input.label_min[disabled] { - background: #fefefe url(../../images/tag_red.disabled.png) no-repeat center !important; -} -input.icon_min { - background: #fefefe url(../../images/photo.png) no-repeat center !important; -} -input.icon_min[disabled] { - background: #fefefe url(../../images/photo.disabled.png) no-repeat center !important; -} -input.clock_min { - background: #fefefe url(../../images/clock-tab.png) no-repeat center !important; -} -input.clock_min[disabled] { - background: #fefefe url(../../images/clock-tab.disabled.png) no-repeat center !important; -} -input.box_item { - background: #fefefe url(../../images/box_item.png) no-repeat center !important; -} -input.box_item[disabled] { - background: #fefefe url(../../images/box_item.disabled.png) no-repeat center !important; -} -input.line_item { - background: #fefefe url(../../images/line_item.png) no-repeat center !important; -} -input.line_item[disabled] { - background: #fefefe url(../../images/line_item.disabled.png) no-repeat center !important; -} -input.copy_item { - background: #fefefe url(../../images/copy_visualmap.png) no-repeat center !important; -} -input.copy_item[disabled] { - background: #fefefe url(../../images/copy_visualmap.disabled.png) no-repeat - center !important; -} -input.grid_min { - background: #fefefe url(../../images/grid.png) no-repeat center !important; -} -input.grid_min[disabled] { - background: #fefefe url(../../images/grid.disabled.png) no-repeat center !important; -} -input.save_min { - background: #fefefe url(../../images/file.png) no-repeat center !important; -} -input.save_min[disabled] { - background: #fefefe url(../../images/file.disabled.png) no-repeat center !important; -} -input.service_min { - background: #fefefe url(../../images/box.png) no-repeat center !important; -} -input.service_min[disabled] { - background: #fefefe url(../../images/box.disabled.png) no-repeat center !important; -} - -input.group_item_min { - background: #fefefe url(../../images/group_green.png) no-repeat center !important; -} -input.group_item_min[disabled] { - background: #fefefe url(../../images/group_green.disabled.png) no-repeat - center !important; -} -input.color_cloud_min { - background: #fefefe url(../../images/color_cloud_item.png) no-repeat center !important; -} -input.color_cloud_min[disabled] { - background: #fefefe url(../../images/color_cloud_item.disabled.png) no-repeat - center !important; -} - -div#cont { - position: fixed; - max-height: 320px; - overflow-y: auto; - overflow-x: hidden; -} - -/*.termframe{ - background-color: #80BA27 !important; -}*/ - /* * --------------------------------------------------------------------- * - REPORTS - @@ -1094,18 +803,18 @@ div#cont { td.datos3, td.datos4 { background-color: #fff; - color: #000 !important; - border-bottom: 2px solid #82b92e !important; - border-left: none !important; - border-right: none !important; + color: #000; + border-bottom: 2px solid #82b92e; + border-left: none; + border-right: none; height: 30px; font-size: 8.6pt; font-weight: normal; } td.datos4 { - /*Add !important because in php the function html_print_table write style in cell and this is style head.*/ - text-align: center !important; + /*Add because in php the function html_print_table write style in cell and this is style head.*/ + text-align: center; } td.datos3 *, @@ -1331,9 +1040,8 @@ div.title_line { justify-content: space-between; border-bottom: 2px solid #82b92e; min-height: 50px; - width: 100%; + width: calc(100% + 3em); padding-right: 0px; - margin-left: 0px !important; margin-bottom: 20px; height: 50px; box-sizing: border-box; @@ -1341,6 +1049,7 @@ div.title_line { border-top-right-radius: 7px; border-top-left-radius: 7px; box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.1); + margin-left: -3em; } /* Breadcrum */ @@ -1366,14 +1075,14 @@ div.title_line { padding-top: 4px; text-indent: 0.25em; color: #848484; - font-size: 10pt !important; - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-size: 10pt; + font-family: "lato-bolder", "Open Sans", sans-serif; } .breadcrumb_active { color: #82b92e; - font-size: 10pt !important; - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-size: 10pt; + font-family: "lato-bolder", "Open Sans", sans-serif; } /* End - Breadcrum */ @@ -1447,11 +1156,11 @@ ul.subsubmenu li a { float: right; z-index: 9999; display: none; - margin-top: 5px !important ; - left: 0px !important; + margin-top: 5px; + left: 0px; } .subsubmenu li { - margin-top: 0px !important ; + margin-top: 0px; } div#agent_wizard_subtabs { @@ -1496,7 +1205,7 @@ div#agent_wizard_subtabs { } #menu_tab_left li.view { - margin-left: 0px !important; + margin-left: 0px; padding-left: 10px; padding-bottom: 4px; white-space: nowrap; @@ -1510,7 +1219,7 @@ div#agent_wizard_subtabs { #menu_tab_left li a, #menu_tab_left li span { color: #343434; - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-family: "lato-bolder", "Open Sans", sans-serif; font-size: 18pt; line-height: 18pt; } @@ -1624,9 +1333,9 @@ span.rmess, span.nrmess { table.databox { background-color: #f9faf9; border-spacing: 0px; - -moz-box-shadow: 0px 0px 0px #ddd !important; - -webkit-box-shadow: 0px 0px 0px #ddd !important; - box-shadow: 0px 0px 0px #ddd !important; + -moz-box-shadow: 0px 0px 0px #ddd; + -webkit-box-shadow: 0px 0px 0px #ddd; + box-shadow: 0px 0px 0px #ddd; } .databox > tbody > tr > td { @@ -1656,7 +1365,7 @@ table.databox { .databox > th > textarea, .databox > th > select, .databox > th > select > option { - color: #222 !important; + color: #222; } .databox.data > tbody > tr > td:first-child { @@ -1722,9 +1431,9 @@ table.alternate tr:nth-child(even) td { table.rounded_cells td { padding: 4px 4px 4px 10px; - -moz-border-radius: 6px !important; - -webkit-border-radius: 6px !important; - border-radius: 6px !important; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; } /*#head_l { @@ -1774,6 +1483,103 @@ div#logo_text3 { .action-buttons { text-align: right; } + +input.next, +input.upd, +input.ok, +input.wand, +input.delete, +input.cog, +input.target, +input.search, +input.copy, +input.add, +input.graph, +input.percentile, +input.binary, +input.camera, +input.config, +input.cancel, +input.default, +input.filter, +input.pdf, +input.spinn { + padding-right: 30px; +} + +input.next { + background-image: url(../../images/input_go.png); +} +input.upd { + background-image: url(../../images/input_update.png); +} +input.wand { + background-image: url(../../images/input_wand.png); +} +input.wand:disabled { + background-image: url(../../images/input_wand.disabled.png); +} +input.search { + background-image: url(../../images/input_zoom.png); +} +input.search:disabled { + background-image: url(../../images/input_zoom.disabled.png); +} +input.ok { + background-image: url(../../images/input_tick.png); +} +input.ok:disabled { + background-image: url(../../images/input_tick.disabled.png); +} +input.add { + background-image: url(../../images/input_add.png); +} +input.add:disabled { + background-image: url(../../images/input_add.disabled.png); +} +input.cancel { + background-image: url(../../images/input_cross.png); +} +input.cancel:disabled { + background-image: url(../../images/input_cross.disabled.png); +} +input.delete { + background-image: url(../../images/input_delete.png); +} +input.delete:disabled { + background-image: url(../../images/input_delete.disabled.png); +} +input.cog { + background-image: url(../../images/input_cog.png); +} +input.cog:disabled { + background-image: url(../../images/input_cog.disabled.png); +} +input.config { + background-image: url(../../images/input_config.png); +} +input.config:disabled { + background-image: url(../../images/input_config.disabled.png); +} +input.filter { + background-image: url(../../images/input_filter.png); +} +input.filter:disabled { + background-image: url(../../images/input_filter.disabled.png); +} +input.pdf { + background-image: url(../../images/input_pdf.png); +} +input.pdf:disabled { + background-image: url(../../images/input_pdf.disabled.png); +} +input.camera { + background-image: url(../../images/input_camera.png); +} +input.spinn { + background-image: url(../../images/spinner_green.gif); +} + /*#table-add-item select, #table-add-sla select { width: 180px; }*/ @@ -1812,7 +1618,7 @@ div#main_pure { /* IE 7 Hack */ #editor { - *margin-top: 10px !important; + *margin-top: 10px; } /* big_data is used in tactical and logon_ok */ .big_data { @@ -1832,7 +1638,7 @@ div#main_pure { text-align: center; font-weight: bold; padding: 8px; - margin: 0px 0px 0px 0px !important; + margin: 0px 0px 0px 0px; z-index: -1; } @@ -1852,7 +1658,7 @@ span.actions { margin-left: 30px; } .actions { - min-width: 200px !important; + min-width: 200px; } select#template, select#action { @@ -1993,7 +1799,7 @@ ol.steps li.current { background-color: #e9f3d2; } ol.steps li.visited { - color: #999 !important; + color: #999; } fieldset .databox { @@ -2001,7 +1807,7 @@ fieldset .databox { } fieldset.databox { - padding: 14px !important; + padding: 14px; } fieldset legend span, @@ -2114,10 +1920,6 @@ div#pandora_logo_header { * --------------------------------------------------------------------- */ #header_table { - margin: 0px; - padding: 0px; - margin-top: 0px; - padding-left: 95px; /* This is overwritten by the classic menu */ padding-right: 35px; } @@ -2133,12 +1935,12 @@ div#pandora_logo_header { .header_title { font-weight: 600; font-size: 10.5pt; - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-family: "lato-bolder", "Open Sans", sans-serif; } .header_subtitle { font-size: 10pt; - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-family: "lato-bolder", "Open Sans", sans-serif; } #header_table_inner a, @@ -2204,7 +2006,7 @@ div#header_autorefresh_counter { } .autorefresh_disabled { - cursor: not-allowed !important; + cursor: not-allowed; } a.autorefresh_txt, @@ -2241,8 +2043,8 @@ div.warn { .submenu_not_selected, .submenu_selected, .submenu2 { - border: 0px !important; - min-height: 35px !important; + border: 0px; + min-height: 35px; } div#steps_clean { @@ -2274,8 +2076,8 @@ div#logo_text3 { padding-top: 0px; }*/ .pagination * { - margin-left: 0px !important; - margin-right: 0px !important; + margin-left: 0px; + margin-right: 0px; vertical-align: middle; } @@ -2338,25 +2140,25 @@ td.cellBig { .info_box { background: #f9faf9; - margin-top: 10px !important; - margin-bottom: 10px !important; + margin-top: 10px; + margin-bottom: 10px; padding: 0px 5px 5px 10px; border-color: #e2e2e2; border-style: solid; border-width: 1px; - width: 100% !important; + width: 100%; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } .info_box .title * { - font-size: 10pt !important; + font-size: 10pt; font-weight: bolder; } .info_box .icon { - width: 30px !important; + width: 30px; text-align: center; } @@ -2389,7 +2191,7 @@ tr.group_view_ok, tr.group_view_not_init, .group_view_not_init { background-color: #5bb6e5; - color: #fff !important; + color: #fff; } tr.group_view_warn, @@ -2398,24 +2200,24 @@ tr.group_view_warn.a, a.group_view_warn, tr.a.group_view_warn { background-color: #fad403; - color: #fff !important; + color: #fff; } a.group_view_warn { - color: #fad403 !important; - color: #fff !important; + color: #fad403; + color: #fff; } tr.group_view_alrm, .group_view_alrm { background-color: #ffa631; - color: #fff !important; + color: #fff; } tr.group_view_unk, .group_view_unk { background-color: #b2b2b2; - color: #fff !important; + color: #fff; } /* classes for event priorities. Sits now in functions.php */ @@ -2433,7 +2235,7 @@ tr.group_view_unk, .datos_redf9 a, .datos_red * { background-color: #fc4444; - color: #fff !important; + color: #fff; } .datos_yellow, @@ -2448,7 +2250,7 @@ a.datos_blue, .datos_blue, .datos_blue * { background-color: #4ca8e0; - color: #fff !important; + color: #fff; } .datos_grey, @@ -2495,7 +2297,7 @@ input#text-id_parent.ac_input, input, textarea, select { - background-color: #ffffff !important; + background-color: #ffffff; border: 1px solid #cbcbcb; -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -2527,7 +2329,7 @@ span#plugin_description { .visual_font_size_4pt > em > strong, .visual_font_size_4pt em span, .visual_font_size_4pt span em { - font-size: 4pt !important; + font-size: 4pt; line-height: 4pt; } .visual_font_size_6pt, @@ -2539,7 +2341,7 @@ span#plugin_description { .visual_font_size_6pt > em > strong, .visual_font_size_6pt em span, .visual_font_size_6pt span em { - font-size: 6pt !important; + font-size: 6pt; line-height: 6pt; } .visual_font_size_8pt, @@ -2551,7 +2353,7 @@ span#plugin_description { .visual_font_size_8pt > em > strong, .visual_font_size_8pt em span, .visual_font_size_8pt span em { - font-size: 8pt !important; + font-size: 8pt; line-height: 8pt; } .visual_font_size_10pt, @@ -2563,7 +2365,7 @@ span#plugin_description { .visual_font_size_10pt > em > strong, .visual_font_size_10pt em span, .visual_font_size_10pt span em { - font-size: 10pt !important; + font-size: 10pt; line-height: 10pt; } .visual_font_size_12pt, @@ -2575,7 +2377,7 @@ span#plugin_description { .visual_font_size_12pt > em > strong, .visual_font_size_12pt em span, .visual_font_size_12pt span em { - font-size: 12pt !important; + font-size: 12pt; line-height: 12pt; } .visual_font_size_14pt, @@ -2587,7 +2389,7 @@ span#plugin_description { .visual_font_size_14pt > em > strong, .visual_font_size_14pt em span, .visual_font_size_14pt span em { - font-size: 14pt !important; + font-size: 14pt; line-height: 14pt; } .visual_font_size_18pt, @@ -2599,7 +2401,7 @@ span#plugin_description { .visual_font_size_18pt > em > strong, .visual_font_size_18pt em span, .visual_font_size_18pt span em { - font-size: 18pt !important; + font-size: 18pt; line-height: 18pt; } @@ -2612,7 +2414,7 @@ span#plugin_description { .visual_font_size_24pt > em > strong, .visual_font_size_24pt em span, .visual_font_size_24pt span em { - font-size: 24pt !important; + font-size: 24pt; line-height: 24pt; } .visual_font_size_28pt, @@ -2624,7 +2426,7 @@ span#plugin_description { .visual_font_size_28pt > em > strong, .visual_font_size_28pt em span, .visual_font_size_28pt span em { - font-size: 28pt !important; + font-size: 28pt; line-height: 28pt; } .visual_font_size_36pt, @@ -2636,7 +2438,7 @@ span#plugin_description { .visual_font_size_36pt > em > strong, .visual_font_size_36pt em span, .visual_font_size_36pt span em { - font-size: 36pt !important; + font-size: 36pt; line-height: 36pt; } .visual_font_size_48pt, @@ -2648,7 +2450,7 @@ span#plugin_description { .visual_font_size_48pt > em > strong, .visual_font_size_48pt em span, .visual_font_size_48pt span em { - font-size: 48pt !important; + font-size: 48pt; line-height: 48pt; } .visual_font_size_60pt, @@ -2660,7 +2462,7 @@ span#plugin_description { .visual_font_size_60pt > em > strong, .visual_font_size_60pt em span, .visual_font_size_60pt span em { - font-size: 60pt !important; + font-size: 60pt; line-height: 60pt; } .visual_font_size_72pt, @@ -2672,7 +2474,7 @@ span#plugin_description { .visual_font_size_72pt > em > strong, .visual_font_size_72pt em span, .visual_font_size_72pt span em { - font-size: 72pt !important; + font-size: 72pt; line-height: 72pt; } @@ -2685,7 +2487,7 @@ span#plugin_description { .visual_font_size_84pt > em > strong, .visual_font_size_84pt em span, .visual_font_size_84pt span em { - font-size: 84pt !important; + font-size: 84pt; line-height: 84pt; } @@ -2698,7 +2500,7 @@ span#plugin_description { .visual_font_size_96pt > em > strong, .visual_font_size_96pt em span, .visual_font_size_96pt span em { - font-size: 96pt !important; + font-size: 96pt; line-height: 96pt; } @@ -2711,7 +2513,7 @@ span#plugin_description { .visual_font_size_116pt > em > strong, .visual_font_size_116pt em span, .visual_font_size_116pt span em { - font-size: 116pt !important; + font-size: 116pt; line-height: 116pt; } @@ -2724,7 +2526,7 @@ span#plugin_description { .visual_font_size_128pt > em > strong, .visual_font_size_128pt em span, .visual_font_size_128pt span em { - font-size: 128pt !important; + font-size: 128pt; line-height: 128pt; } @@ -2737,7 +2539,7 @@ span#plugin_description { .visual_font_size_140pt > em > strong, .visual_font_size_140pt em span, .visual_font_size_140pt span em { - font-size: 140pt !important; + font-size: 140pt; line-height: 140pt; } @@ -2750,7 +2552,7 @@ span#plugin_description { .visual_font_size_154pt > em > strong, .visual_font_size_154pt em span, .visual_font_size_154pt span em { - font-size: 154pt !important; + font-size: 154pt; line-height: 154pt; } @@ -2763,7 +2565,7 @@ span#plugin_description { .visual_font_size_196pt > em > strong, .visual_font_size_196pt em span, .visual_font_size_196pt span em { - font-size: 196pt !important; + font-size: 196pt; line-height: 196pt; } @@ -2776,7 +2578,7 @@ span#plugin_description { .resize_visual_font_size_8pt > em > strong, .visual_font_size_8pt em span, .visual_font_size_8pt span em { - font-size: 4pt !important; + font-size: 4pt; line-height: 4pt; } .resize_visual_font_size_14pt, @@ -2788,7 +2590,7 @@ span#plugin_description { .resize_visual_font_size_14pt > em > strong, .visual_font_size_14pt em span, .visual_font_size_14pt span em { - font-size: 7pt !important; + font-size: 7pt; line-height: 7pt; } .resize_visual_font_size_24pt, @@ -2800,7 +2602,7 @@ span#plugin_description { .resize_visual_font_size_24pt > em > strong, .visual_font_size_14pt em span, .visual_font_size_14pt span em { - font-size: 12pt !important; + font-size: 12pt; line-height: 12pt; } .resize_visual_font_size_36pt, @@ -2812,7 +2614,7 @@ span#plugin_description { .resize_visual_font_size_36pt > em > strong, .visual_font_size_36pt em span, .visual_font_size_36pt span em { - font-size: 18pt !important; + font-size: 18pt; line-height: 18pt; } .resize_visual_font_size_72pt, @@ -2824,7 +2626,7 @@ span#plugin_description { .resize_visual_font_size_72pt > em > strong, .visual_font_size_72pt em span, .visual_font_size_72pt span em { - font-size: 36pt !important; + font-size: 36pt; line-height: 36pt; } @@ -2849,9 +2651,9 @@ span#plugin_description { width: 400px; height: 260px; - -moz-box-shadow: 0px 4px 4px #010e1b !important; - -webkit-box-shadow: 0px 4px 4px #010e1b !important; - box-shadow: 0px 4px 4px #010e1b !important; + -moz-box-shadow: 0px 4px 4px #010e1b; + -webkit-box-shadow: 0px 4px 4px #010e1b; + box-shadow: 0px 4px 4px #010e1b; filter: alpha(opacity=97); -moz-opacity: 0.97; @@ -2933,7 +2735,7 @@ span#plugin_description { * --------------------------------------------------------------------- */ a.tip { - display: inline !important; + display: inline; cursor: help; } @@ -2958,7 +2760,7 @@ input.search_input { background-position: center right 10px; background-repeat: no-repeat; background-size: 17px; - background-color: #f2f6f7 !important; + background-color: #f2f6f7; padding: 0px; margin: 0; width: 250px; @@ -2977,7 +2779,7 @@ input.search_input { } /*.vertical_fields td input, .vertical_fields td select { - margin-top: 8px !important; + margin-top: 8px; }*/ a[id^="tgl_ctrl_"] > img, @@ -3013,7 +2815,7 @@ div.forced_title_layer { div.legend > div { pointer-events: none; /* Allow to click the graphs below */ - opacity: 0.65 !important; + opacity: 0.65; } /* Recover the padding of the legend elements under a databox parent */ @@ -3160,7 +2962,7 @@ div.nodata_container { .menu_graph, .timestamp_graph { - position: absolute !important; + position: absolute; } .menu_graph { @@ -3181,13 +2983,13 @@ div.nodata_container { .legendColorBox * { font-size: 0px; padding: 0px 4px; - overflow: visible !important; + overflow: visible; } /* GIS CSS */ .olLayerDiv { - z-index: 102 !important; + z-index: 102; } /* Alert view */ @@ -3203,7 +3005,7 @@ table.alert_escalation th img { } td.used_field { - background: #6eb432 !important; + background: #6eb432; color: #ffffff; font-weight: bold; } @@ -3287,7 +3089,7 @@ table#policy_modules td * { width: 100%; margin-left: auto; margin-right: auto; - background-color: #fff !important; + background-color: #fff; padding: 10px; border: 1px solid #e2e2e2; margin-top: 5%; @@ -3344,7 +3146,7 @@ div.div_groups_status { } .databox.pies fieldset.tactical_set { - width: 70% !important; + width: 70%; height: 285px; } @@ -3363,12 +3165,12 @@ div.div_groups_status { letter-spacing: 0pt; font-size: 10pt; white-space: pre-wrap; - padding-top: 0 !important; + padding-top: 0; font-family: "Open Sans", sans-serif; } .no_hidden_menu { - background-position: 11% 50% !important; + background-position: 11% 50%; } #menu_tab li.nomn, @@ -3408,7 +3210,7 @@ div.div_groups_status { #menu_tab li.tab_operation a, #menu_tab a.tab_operation { - background: none !important ; + background: none; } .agents_modules_table { @@ -3460,12 +3262,12 @@ div.div_groups_status { } .databox.agente > tbody > tr > td > div > canvas { - width: 100% !important; - text-align: left !important; + width: 100%; + text-align: left; } .databox.agente > tbody > tr > td > div.graph { - width: 100% !important; - text-align: left !important; + width: 100%; + text-align: left; } .green_title { @@ -3479,7 +3281,7 @@ div.div_groups_status { } .dashboard li a { - width: 158px !important; + width: 158px; } .text_subDashboard { @@ -3566,8 +3368,8 @@ div.div_groups_status { width: 200px; height: 20px; position: relative; - background: transparent !important; - border: 0px !important; + background: transparent; + border: 0px; left: -92px; top: 93px; @@ -3703,7 +3505,7 @@ div.simple_value > span.text > p, div.simple_value > span.text > p > span > strong, div.simple_value > span.text > p > strong, div.simple_value > a > span.text p { - font-family: monospace !important; + font-family: monospace; white-space: pre; } @@ -3746,36 +3548,36 @@ table.table_modal_alternate tr td:first-child { } ul.events_tabs { - background: #ffffff !important; + background: #ffffff; border: 0px; display: flex; justify-content: space-between; - padding: 0px !important; + padding: 0px; } ul.events_tabs:before, ul.events_tabs:after { - content: none !important; + content: none; } ul.events_tabs > li { - margin: 0 !important; + margin: 0; width: 100%; text-align: center; - float: none !important; + float: none; outline-width: 0; } ul.events_tabs > li.ui-state-default { - background: #fff !important; - border: none !important; - border-bottom: 2px solid #cacaca !important; + background: #fff; + border: none; + border-bottom: 2px solid #cacaca; } ul.events_tabs > li a { text-align: center; - float: none !important; - padding: 8px !important; + float: none; + padding: 8px; display: block; } @@ -3787,8 +3589,8 @@ ul.events_tabs > li span { } ul.events_tabs > li.ui-tabs-active { - border-bottom: 2px solid #82b92e !important; - border-top: 2px solid #82b92e !important; + border-bottom: 2px solid #82b92e; + border-top: 2px solid #82b92e; } /* @@ -4097,7 +3899,7 @@ span.log_zone_line_error { } .readonly { - background-color: #dedede !important; + background-color: #dedede; } .input_error { @@ -4131,7 +3933,7 @@ span.log_zone_line_error { background-color: #eee; } .checkselected { - background-color: #eee !important; + background-color: #eee; } .tag-wrapper { padding: 0 10px 0 0; @@ -4231,15 +4033,15 @@ div#footer_help { * --------------------------------------------------------------------- */ .graph_conteiner_inside > .parent_graph { - width: 100% !important; + width: 100%; } .graph_conteiner_inside > .parent_graph > .menu_graph { - left: 90% !important; + left: 90%; } .graph_conteiner_inside > .parent_graph > .graph { - width: 90% !important; + width: 90%; } .graph_conteiner_inside > div > .nodata_container > .nodata_text { @@ -4247,7 +4049,7 @@ div#footer_help { } .graph_conteiner_inside > div > .nodata_container { - background-size: 120px 80px !important; + background-size: 120px 80px; } /* @@ -4473,8 +4275,8 @@ form ul.form_flex li ul li { /* library for graphs */ .yAxis.y1Axis > .tickLabel { white-space: nowrap; - line-height: 1.05em !important; - width: auto !important; + line-height: 1.05em; + width: auto; } /* dialog */ @@ -4482,7 +4284,7 @@ form ul.form_flex li ul li { display: flex; width: 100%; margin-left: 10px; - float: none !important; + float: none; } .pandora_confirm_dialog .ui-dialog-buttonset button { @@ -4512,11 +4314,11 @@ form ul.form_flex li ul li { } .dialog-grayed { - background: #373737 !important; + background: #373737; } .dialog-grayed .ui-dialog-buttonpane { - background: #373737 !important; + background: #373737; } /* GIS MAP */ @@ -4560,7 +4362,7 @@ tr:first-child > td > a.up_arrow { /* extensions -> module groups */ .tooltip_counters h3 { font-size: 12pt; - padding-bottom: 10px !important; + padding-bottom: 10px; text-align: center; } @@ -4579,9 +4381,9 @@ tr:first-child > td > a.up_arrow { .button-as-link { text-decoration: underline; - background: none !important; + background: none; border: none; - padding: 0 !important; + padding: 0; } /* @@ -4968,7 +4770,7 @@ input:checked + .p-slider:before { } #edit_user_profiles table { - margin-bottom: 0 !important; + margin-bottom: 0; } .user_edit_first_row { @@ -5006,9 +4808,9 @@ input:checked + .p-slider:before { } .edit_user_info_right input { - background-color: transparent !important; + background-color: transparent; border: none; - border-radius: 0 !important; + border-radius: 0; border-bottom: 1px solid #343434; padding: 10px 0px 2px 35px; box-sizing: border-box; @@ -5049,9 +4851,9 @@ input:checked + .p-slider:before { } .edit_user_options #text-block_size { - background-color: transparent !important; + background-color: transparent; border: none; - border-radius: 0 !important; + border-radius: 0; border-bottom: 1px solid #343434; padding: 0px 0px 0px 10px; } @@ -5070,12 +4872,12 @@ input:checked + .p-slider:before { } .edit_user_comments #textarea_comments { - background-color: #fbfbfb !important; + background-color: #fbfbfb; padding-left: 10px; } .edit_user_labels { - color: #343434 !important; + color: #343434; font-weight: bold; padding-right: 10px; margin: 0px 0px 5px 0px; @@ -5105,7 +4907,7 @@ input:checked + .p-slider:before { .user_edit_first_row .edit_user_info_left > div:last-child, .user_edit_first_row .edit_user_info_right > div:last-child, .user_edit_second_row .edit_user_options > div:last-child { - margin-bottom: 0px !important; + margin-bottom: 0px; } .user_avatar { @@ -5278,7 +5080,7 @@ table.info_table > tbody > tr > td > form > a > img { } table.info_table > tbody > tr:hover { - background-color: #eee !important; + background-color: #eee; } .info_table.profile_list > thead > tr > th > a.tip { @@ -5290,11 +5092,11 @@ table.info_table > tbody > tr:hover { .action_buttons input[type="image"], .action_button_img { border-radius: 4px; - border: 1px solid #dcdcdc !important; + border: 1px solid #dcdcdc; padding: 1px; box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); max-width: 21px; - background-color: transparent !important; /*BORRAR*/ + background-color: transparent; /*BORRAR*/ } /* This class is for only one icon to be a button type. */ @@ -5319,7 +5121,7 @@ table.info_table > tbody > tr:hover { } .action_buttons input[type="image"]:hover { - background-color: #fff !important; + background-color: #fff; } /* Tables to upload files */ @@ -5358,7 +5160,7 @@ table.info_table > tbody > tr:hover { .file_table_buttons a:last-child img, #file_table_modal .upload_file { - margin-right: 0px !important; + margin-right: 0px; } #file_table_modal li a { @@ -5404,7 +5206,7 @@ table.info_table > tbody > tr:hover { } .file_table_modal_active { - background-color: #fff !important; + background-color: #fff; border: 1px solid #e6e6e6; border-bottom: none; } @@ -5451,7 +5253,7 @@ table.info_table.agent_info_table { margin-bottom: 20px; } table.agent_info_table tr { - background-color: #fff !important; + background-color: #fff; } table.agent_info_table > tbody > tr > td { @@ -5491,20 +5293,20 @@ table.info_table.agent_info_table table.info_table { } .agent_info_table_opened { - background-color: #82b92e !important; - color: #fff !important; - border-color: #82b92e !important; + background-color: #82b92e; + color: #fff; + border-color: #82b92e; } .agent_info_table_closed { - background-color: #fff !important; - color: #000 !important; + background-color: #fff; + color: #000; border-radius: 4px; } /* Tag view */ table.info_table.policy_table tr { - background-color: #fff !important; + background-color: #fff; } table.info_table.policy_sub_table thead > tr:first-child th { @@ -5522,7 +5324,7 @@ table.info_table.policy_sub_table { vertical-align: middle; } .sort_arrow a { - padding: 0 0 0 5px !important; + padding: 0 0 0 5px; } .sort_arrow img { width: 0.8em; @@ -5566,7 +5368,7 @@ table.info_table.policy_sub_table { .pagination .total_number > *:last-child { border-top-right-radius: 2px; border-bottom-right-radius: 2px; - border-right: 1px solid #cacaca !important; + border-right: 1px solid #cacaca; } .pagination .page_number_active { @@ -5586,7 +5388,7 @@ table.info_table.policy_sub_table { } .pagination a { - margin: 0 !important; + margin: 0; } .pagination .pagination-arrows { @@ -5626,7 +5428,7 @@ table.info_table.policy_sub_table { } .input_label { - color: #343434 !important; + color: #343434; font-weight: bold; padding-right: 10px; margin: 0px 0px 5px 0px; @@ -5664,11 +5466,11 @@ table.info_table.policy_sub_table { /* Inputs type text shown as a black line */ .agent_options input[type="text"] { - background-color: transparent !important; + background-color: transparent; border: none; - border-radius: 0 !important; + border-radius: 0; border-bottom: 1px solid #ccc; - font-family: "lato-bolder", "Open Sans", sans-serif !important; + font-family: "lato-bolder", "Open Sans", sans-serif; font-size: 10pt; padding: 2px 5px; box-sizing: border-box; @@ -5712,7 +5514,7 @@ table.info_table.policy_sub_table { } .switch_radio_button input { - position: absolute !important; + position: absolute; clip: rect(0, 0, 0, 0); height: 1px; width: 1px; @@ -5905,7 +5707,7 @@ div#bullets_modules div { /* Agent details in agent view */ div#status_pie path { - stroke-width: 8px !important; + stroke-width: 8px; } div#status_pie { margin-bottom: 2em; @@ -6021,7 +5823,7 @@ div#status_pie { } .white_table_graph_content.no-padding-imp .info_box { - margin: 0 !important; + margin: 0; } .white_table_graph_content.min-height-100 { @@ -6092,5 +5894,5 @@ div#status_pie { } .white_table_no_border { - border: none !important; + border: none; } diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css index 169f078cea..c84824ccae 100644 --- a/pandora_console/include/styles/pandora_black.css +++ b/pandora_console/include/styles/pandora_black.css @@ -72,7 +72,7 @@ input { } input[type="checkbox"] { - display: inline !important; + display: inline; } select { @@ -149,7 +149,7 @@ p.center { h1#log_title { font-size: 18px; margin-bottom: 0px; - color: #fff !important; + color: #fff; width: 300px; } div#log_msg { @@ -350,7 +350,7 @@ div#head { } div#foot { - font-size: 6pt !important; + font-size: 6pt; border-top: solid 2px #222; padding-top: 8px; padding-bottom: 5px; @@ -445,7 +445,7 @@ div#foot { } p.log_in { - color: #fff !important; + color: #fff; padding: 0px 10px; width: 300px; } @@ -458,7 +458,7 @@ div#login { border-width: 2px 2px 2px 2px; border-style: solid; border-color: #000; - font-size: 12px !important; + font-size: 12px; } div#login_in, #login_f { @@ -477,13 +477,13 @@ div#login_in, height: 100%; border-radius: 5px; /* Browser without multibackground support */ - background-color: #373737 !important; + background-color: #373737; } #login_outer { border-radius: 11px; background-color: #000; - width: 500px !important; - color: #fff !important; + width: 500px; + color: #fff; margin: 0px auto; } @@ -569,10 +569,10 @@ DIV.login_button{ } DIV.login_button>input{ - background-color: #373737 !important; + background-color: #373737; border: 0px none; - background-image: url("../../images/input_go.png") !important; - padding-right: 25px !important; + background-image: url("../../images/input_go.png"); + padding-right: 25px; } .login_page{ @@ -584,14 +584,14 @@ DIV.login_button>input{ } input.next_login { - padding-right: 12px !important; - padding-left: 12px !important; + padding-right: 12px; + padding-left: 12px; height: 23px; text-align: center; - font-weight: 600 !important; + font-weight: 600; letter-spacing: 0.5pt; - font-size: 12px !important; - border-radius: 3px !important; + font-size: 12px; + border-radius: 3px; } DIV.login_nick, DIV.login_pass { @@ -656,14 +656,14 @@ input.login { margin: 0px 0px; width: 135px; height: 18px; - font-weight: 100 !important; + font-weight: 100; letter-spacing: 0.3pt; } input.login_user { - color: #373737 !important; + color: #373737; padding-left: 8px; width: 179px; color: #222; @@ -680,9 +680,9 @@ input.login_password { */ .databox_error { - width: 657px !important; + width: 657px; height: 400px; - border: none !important; + border: none; background-color: #fafafa; background: url(../../images/splash_error.png) no-repeat; } @@ -727,19 +727,19 @@ input.sub { font-size: 8pt; - background-color: #333 !important; - background-repeat: no-repeat !important; - background-position: 92% 3px !important; + background-color: #333; + background-repeat: no-repeat; + background-position: 92% 3px; - color: white !important; + color: white; padding: 3px 3px 5px 12px; border-color: #333; } input.sub[disabled] { - color: #b4b4b4 !important; - background-color: #f3f3f3 !important; + color: #b4b4b4; + background-color: #f3f3f3; border-color: #b6b6b6; cursor: default; } @@ -768,73 +768,73 @@ input.pdf { } input.next { - background-image: url(../../images/input_go.png) !important; + background-image: url(../../images/input_go.png); } input.upd { - background-image: url(../../images/input_update.png) !important; + background-image: url(../../images/input_update.png); } input.wand { - background-image: url(../../images/input_wand.png) !important; + background-image: url(../../images/input_wand.png); } input.wand:disabled { - background-image: url(../../images/input_wand.disabled.png) !important; + background-image: url(../../images/input_wand.disabled.png); } input.search { - background-image: url(../../images/input_zoom.png) !important; + background-image: url(../../images/input_zoom.png); } input.search:disabled { - background-image: url(../../images/input_zoom.disabled.png) !important; + background-image: url(../../images/input_zoom.disabled.png); } input.ok { - background-image: url(../../images/input_tick.png) !important; + background-image: url(../../images/input_tick.png); } input.ok:disabled { - background-image: url(../../images/input_tick.disabled.png) !important; + background-image: url(../../images/input_tick.disabled.png); } input.add { - background-image: url(../../images/input_add.png) !important; + background-image: url(../../images/input_add.png); } input.add:disabled { - background-image: url(../../images/input_add.disabled.png) !important; + background-image: url(../../images/input_add.disabled.png); } input.cancel { - background-image: url(../../images/input_cross.png) !important; + background-image: url(../../images/input_cross.png); } input.cancel:disabled { - background-image: url(../../images/input_cross.disabled.png) !important; + background-image: url(../../images/input_cross.disabled.png); } input.delete { - background-image: url(../../images/input_delete.png) !important; + background-image: url(../../images/input_delete.png); } input.delete:disabled { - background-image: url(../../images/input_delete.disabled.png) !important; + background-image: url(../../images/input_delete.disabled.png); } input.cog { - background-image: url(../../images/input_cog.png) !important; + background-image: url(../../images/input_cog.png); } input.cog:disabled { - background-image: url(../../images/input_cog.disabled.png) !important; + background-image: url(../../images/input_cog.disabled.png); } input.config { - background-image: url(../../images/input_config.png) !important; + background-image: url(../../images/input_config.png); } input.config:disabled { - background-image: url(../../images/input_config.disabled.png) !important; + background-image: url(../../images/input_config.disabled.png); } input.filter { - background-image: url(../../images/input_filter.png) !important; + background-image: url(../../images/input_filter.png); } input.filter:disabled { - background-image: url(../../images/input_filter.disabled.png) !important; + background-image: url(../../images/input_filter.disabled.png); } input.pdf { - background-image: url(../../images/input_pdf.png) !important; + background-image: url(../../images/input_pdf.png); } input.pdf:disabled { - background-image: url(../../images/input_pdf.disabled.png) !important; + background-image: url(../../images/input_pdf.disabled.png); } input.camera { - background-image: url(../../images/input_camera.png) !important; + background-image: url(../../images/input_camera.png); } #toolbox #auto_save { @@ -850,105 +850,105 @@ input.visual_editor_button_toolbox { margin-top: 5px; } input.delete_min { - background: #fefefe url(../../images/cross.png) no-repeat center !important; + background: #fefefe url(../../images/cross.png) no-repeat center; } input.delete_min[disabled] { - background: #fefefe url(../../images/cross.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/cross.disabled.png) no-repeat center; } input.graph_min { - background: #fefefe url(../../images/chart_curve.png) no-repeat center !important; + background: #fefefe url(../../images/chart_curve.png) no-repeat center; } input.graph_min[disabled] { background: #fefefe url(../../images/chart_curve.disabled.png) no-repeat - center !important; + center; } input.percentile_min { - background: #fefefe url(../../images/chart_bar.png) no-repeat center !important; + background: #fefefe url(../../images/chart_bar.png) no-repeat center; } input.percentile_min[disabled] { - background: #fefefe url(../../images/chart_bar.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/chart_bar.disabled.png) no-repeat center; } input.percentile_item_min { - background: #fefefe url(../../images/percentile_item.png) no-repeat center !important; + background: #fefefe url(../../images/percentile_item.png) no-repeat center; } input.percentile_item_min[disabled] { background: #fefefe url(../../images/percentile_item.disabled.png) no-repeat - center !important; + center; } input.binary_min { - background: #fefefe url(../../images/binary.png) no-repeat center !important; + background: #fefefe url(../../images/binary.png) no-repeat center; } input.binary_min[disabled] { - background: #fefefe url(../../images/binary.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/binary.disabled.png) no-repeat center; } input.camera_min { - background: #fefefe url(../../images/camera.png) no-repeat center !important; + background: #fefefe url(../../images/camera.png) no-repeat center; } input.camera_min[disabled] { - background: #fefefe url(../../images/camera.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/camera.disabled.png) no-repeat center; } input.config_min { - background: #fefefe url(../../images/config.png) no-repeat center !important; + background: #fefefe url(../../images/config.png) no-repeat center; } input.config_min[disabled] { - background: #fefefe url(../../images/config.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/config.disabled.png) no-repeat center; } input.label_min { - background: #fefefe url(../../images/tag_red.png) no-repeat center !important; + background: #fefefe url(../../images/tag_red.png) no-repeat center; } input.label_min[disabled] { - background: #fefefe url(../../images/tag_red.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/tag_red.disabled.png) no-repeat center; } input.icon_min { - background: #fefefe url(../../images/photo.png) no-repeat center !important; + background: #fefefe url(../../images/photo.png) no-repeat center; } input.icon_min[disabled] { - background: #fefefe url(../../images/photo.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/photo.disabled.png) no-repeat center; } input.box_item { - background: #fefefe url(../../images/box_item.png) no-repeat center !important; + background: #fefefe url(../../images/box_item.png) no-repeat center; } input.box_item[disabled] { - background: #fefefe url(../../images/box_item.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/box_item.disabled.png) no-repeat center; } input.line_item { - background: #fefefe url(../../images/line_item.png) no-repeat center !important; + background: #fefefe url(../../images/line_item.png) no-repeat center; } input.line_item[disabled] { - background: #fefefe url(../../images/line_item.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/line_item.disabled.png) no-repeat center; } input.copy_item { - background: #fefefe url(../../images/copy_visualmap.png) no-repeat center !important; + background: #fefefe url(../../images/copy_visualmap.png) no-repeat center; } input.copy_item[disabled] { background: #fefefe url(../../images/copy_visualmap.disabled.png) no-repeat - center !important; + center; } input.grid_min { - background: #fefefe url(../../images/grid.png) no-repeat center !important; + background: #fefefe url(../../images/grid.png) no-repeat center; } input.grid_min[disabled] { - background: #fefefe url(../../images/grid.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/grid.disabled.png) no-repeat center; } input.save_min { - background: #fefefe url(../../images/file.png) no-repeat center !important; + background: #fefefe url(../../images/file.png) no-repeat center; } input.save_min[disabled] { - background: #fefefe url(../../images/file.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/file.disabled.png) no-repeat center; } input.service_min { - background: #fefefe url(../../images/box.png) no-repeat center !important; + background: #fefefe url(../../images/box.png) no-repeat center; } input.service_min[disabled] { - background: #fefefe url(../../images/box.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/box.disabled.png) no-repeat center; } input.group_item_min { - background: #fefefe url(../../images/group_green.png) no-repeat center !important; + background: #fefefe url(../../images/group_green.png) no-repeat center; } input.group_item_min[disabled] { background: #fefefe url(../../images/group_green.disabled.png) no-repeat - center !important; + center; } div#cont { @@ -959,7 +959,7 @@ div#cont { } .termframe { - background-color: #82b92e !important; + background-color: #82b92e; } table, @@ -1021,15 +1021,15 @@ td input[type="checkbox"] { td.datos3, td.datos3 * { background-color: #666; - color: white !important; + color: white; } td.datos4, td.datos4 * { - /*Add !important because in php the function html_print_table write style in cell and this is style head.*/ - text-align: center !important; + /*Add because in php the function html_print_table write style in cell and this is style head.*/ + text-align: center; background-color: #666; - color: white !important; + color: white; } td.datos_id { @@ -1239,10 +1239,10 @@ div.title_line { #menu_tab_frame, #menu_tab_frame_view { - display: block !important; + display: block; border-bottom: 1px solid #82b92e; /* float:left; */ - margin-left: 0px !important; + margin-left: 0px; max-height: 31px; min-height: 31px; padding-right: 28px; @@ -1250,7 +1250,7 @@ div.title_line { } #menu_tab { - margin: 0px 0px 0px 0px !important; + margin: 0px 0px 0px 0px; } #menu_tab .mn, @@ -1327,7 +1327,7 @@ div.title_line { } /* TAB TITLE */ #menu_tab_left { - margin-left: 0px !important; + margin-left: 0px; } #menu_tab_left .mn, @@ -1380,7 +1380,7 @@ div.title_line { -moz-border-top-left-radius: 3px; -webkit-border-top-left-radius: 3px; border-top-left-radius: 3px; - margin-left: 0px !important; + margin-left: 0px; overflow-y: hidden; } @@ -1391,7 +1391,7 @@ div.title_line { #menu_tab_frame *, #menu_tab_frame_view * { - #margin: 0px 0px 0px 0px !important; + #margin: 0px 0px 0px 0px; } span.users { @@ -1510,9 +1510,9 @@ span.nrmess { table.databox { background-color: #5b5b5b; border-spacing: 0px; - -moz-box-shadow: 0px 0px 0px #ddd !important; - -webkit-box-shadow: 0px 0px 0px #ddd !important; - box-shadow: 0px 0px 0px #ddd !important; + -moz-box-shadow: 0px 0px 0px #ddd; + -webkit-box-shadow: 0px 0px 0px #ddd; + box-shadow: 0px 0px 0px #ddd; } .databox td { @@ -1539,7 +1539,7 @@ table.databox { .databox th textarea, .databox th select, .databox th select option { - color: #222 !important; + color: #222; } .tabletitle { @@ -1585,9 +1585,9 @@ table.alternate tr:nth-child(even) td { table.rounded_cells td { padding: 4px 4px 4px 10px; - -moz-border-radius: 6px !important; - -webkit-border-radius: 6px !important; - border-radius: 6px !important; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; } .databox_color { @@ -1698,7 +1698,7 @@ div#main_pure { } /* IE 7 Hack */ #editor { - *margin-top: 10px !important; + *margin-top: 10px; } /* big_data is used in tactical and logon_ok */ .big_data { @@ -1716,7 +1716,7 @@ div#main_pure { text-align: center; font-weight: bold; padding: 8px; - margin: 0px 0px 0px 0px !important; + margin: 0px 0px 0px 0px; z-index: -1; } @@ -1741,7 +1741,7 @@ span.actions { margin-left: 30px; } .actions { - min-width: 200px !important; + min-width: 200px; } code, pre { @@ -1759,7 +1759,7 @@ select#action { } input[type="image"] { border: 0px; - background-color: transparent !important; + background-color: transparent; } table#simple select#id_module_type, table#alert_search select#id_agent, @@ -1887,7 +1887,7 @@ ol.steps li.current { background-color: #e9f3d2; } ol.steps li.visited { - color: #999 !important; + color: #999; } fieldset { @@ -1911,7 +1911,7 @@ fieldset .databox { } fieldset.databox { - padding: 14px !important; + padding: 14px; } fieldset legend span, @@ -2026,7 +2026,7 @@ div#pandora_logo_header { } .autorefresh_disabled { - cursor: not-allowed !important; + cursor: not-allowed; } a.autorefresh { @@ -2063,15 +2063,15 @@ div.warn { -o-transition-property: background-color; -o-transition-duration: 0.5s; -o-transition-timing-function: ease-out; - font-weight: normal !important; + font-weight: normal; } /* Submenus havent borders */ .submenu_not_selected, .submenu_selected, .submenu2 { - border: 0px !important; - min-height: 35px !important; + border: 0px; + min-height: 35px; } /* Pandora width style theme */ @@ -2098,7 +2098,7 @@ div#steps_clean { #menu_tab_frame_view { width: 100%; padding-right: 0px; - margin-left: 0px !important; + margin-left: 0px; margin-bottom: 20px; height: 31px; } @@ -2131,8 +2131,8 @@ div#logo_text3 { margin-bottom: 5px; } .pagination * { - margin-left: 0px !important; - margin-right: 0px !important; + margin-left: 0px; + margin-right: 0px; vertical-align: middle; } @@ -2141,7 +2141,7 @@ div#logo_text3 { /* Calendar background */ table.scw { background-color: #82b92e; - border: 0 !important; + border: 0; border-radius: 4px; } @@ -2151,7 +2151,7 @@ td.scwWeekNumberHead { } td.scwWeek { - color: #111 !important; + color: #111; } Today selector td.scwFoot { @@ -2169,39 +2169,39 @@ tfoot.scwFoot { } .scwFoot :hover { - color: #3f3f3f !important; + color: #3f3f3f; } table.scwCells { - background-color: #5b5b5b !important; - color: #3c3c3c !important; + background-color: #5b5b5b; + color: #3c3c3c; } table.scwCells:hover { - background-color: #5b5b5b !important; + background-color: #5b5b5b; } td.scwCellsExMonth { - background-color: #eee !important; - color: #3c3c3c !important; + background-color: #eee; + color: #3c3c3c; } td.scwCellsWeekend { - background-color: #3c3c3c !important; - color: #fff !important; - border: 0 !important; + background-color: #3c3c3c; + color: #fff; + border: 0; } td.scwInputDate { - background-color: #777 !important; - color: #ffffff !important; - border: 0 !important; + background-color: #777; + color: #ffffff; + border: 0; } td.scwFoot { - background-color: #5b5b5b !important; - color: #3c3c3c !important; - border: 0 !important; + background-color: #5b5b5b; + color: #3c3c3c; + border: 0; } /* Cells divs to set individual styles with the table objects */ @@ -2286,25 +2286,25 @@ div.cellBig { .info_box { background: #5b5b5b; - margin-top: 10px !important; - margin-bottom: 10px !important; + margin-top: 10px; + margin-bottom: 10px; padding: 0px 5px 5px 10px; border-color: #e2e2e2; border-style: solid; border-width: 1px; - width: 100% !important; + width: 100%; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } .info_box .title * { - font-size: 10pt !important; + font-size: 10pt; font-weight: bolder; } .info_box .icon { - width: 30px !important; + width: 30px; text-align: center; } @@ -2345,7 +2345,7 @@ tr.group_view_not_init, tr.group_view_not_init, .group_view_not_init { background-color: #5bb6e5; - color: #fff !important; + color: #fff; } tr.group_view_warn, @@ -2354,11 +2354,11 @@ tr.group_view_warn.a, a.group_view_warn, tr.a.group_view_warn { background-color: #fad403; - color: #3f3f3f !important; + color: #3f3f3f; } a.group_view_warn { - color: #fad403 !important; + color: #fad403; } tr.group_view_alrm, @@ -2388,7 +2388,7 @@ tr.group_view_unk, .datos_redf9 a, .datos_red * { background-color: #fc4444; - color: #fff !important; + color: #fff; } .datos_yellow, @@ -2403,7 +2403,7 @@ a.datos_blue, .datos_blue, .datos_blue * { background-color: #4ca8e0; - color: #fff !important; + color: #fff; } .datos_grey, @@ -2481,7 +2481,7 @@ ul.operation li a:hover { -o-transition-property: background-color; -o-transition-duration: 0.5s; -o-transition-timing-function: ease-out; - background-color: #b1b1b1 !important; + background-color: #b1b1b1; } .submenu_not_selected:hover { transition-property: background-color; @@ -2496,11 +2496,11 @@ ul.operation li a:hover { -o-transition-property: background-color; -o-transition-duration: 0.5s; -o-transition-timing-function: ease-out; - background-color: #b1b1b1 !important; + background-color: #b1b1b1; } .submenu_selected:hover { - background-color: #b1b1b1 !important; + background-color: #b1b1b1; } .sub_subMenu { @@ -2528,7 +2528,7 @@ ul.operation li a:hover { -moz-transition-timing-function: ease-out; -o-transition-property: background-color; -o-transition-duration: 0.5s; - background-color: #b1b1b1 !important; + background-color: #b1b1b1; } .submenu_text { @@ -2548,15 +2548,15 @@ li.links a:hover { } .is_submenu2 { - background-color: #222222 !important; + background-color: #222222; } .operation { - background-color: #333 !important; + background-color: #333; } .operation .selected { - background-color: #b1b1b1 !important; + background-color: #b1b1b1; } .menu li, @@ -2582,7 +2582,7 @@ input#text-id_parent.ac_input, input, textarea, select { - background-color: #5b5b5b !important; + background-color: #5b5b5b; border: 1px solid #cbcbcb; -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -2606,7 +2606,7 @@ span#plugin_description { .visual_font_size_4pt > em > strong, .visual_font_size_4pt em span, .visual_font_size_4pt span em { - font-size: 4pt !important; + font-size: 4pt; line-height: 4pt; } .visual_font_size_6pt, @@ -2618,7 +2618,7 @@ span#plugin_description { .visual_font_size_6pt > em > strong, .visual_font_size_6pt em span, .visual_font_size_6pt span em { - font-size: 6pt !important; + font-size: 6pt; line-height: 6pt; } .visual_font_size_8pt, @@ -2630,7 +2630,7 @@ span#plugin_description { .visual_font_size_8pt > em > strong, .visual_font_size_8pt em span, .visual_font_size_8pt span em { - font-size: 8pt !important; + font-size: 8pt; line-height: 8pt; } .visual_font_size_10pt, @@ -2640,7 +2640,7 @@ span#plugin_description { .visual_font_size_10pt > em > strong, .visual_font_size_10pt em span, .visual_font_size_10pt span em { - font-size: 10pt !important; + font-size: 10pt; line-height: 10pt; } .visual_font_size_12pt, @@ -2650,7 +2650,7 @@ span#plugin_description { .visual_font_size_12pt > em > strong, .visual_font_size_12pt em span, .visual_font_size_12pt span em { - font-size: 12pt !important; + font-size: 12pt; line-height: 12pt; } .visual_font_size_14pt, @@ -2662,7 +2662,7 @@ span#plugin_description { .visual_font_size_14pt > em > strong, .visual_font_size_14pt em span, .visual_font_size_14pt span em { - font-size: 14pt !important; + font-size: 14pt; line-height: 14pt; } .visual_font_size_18pt, @@ -2674,7 +2674,7 @@ span#plugin_description { .visual_font_size_18pt > em > strong, .visual_font_size_18pt em span, .visual_font_size_18pt span em { - font-size: 18pt !important; + font-size: 18pt; line-height: 18pt; } .visual_font_size_24pt, @@ -2686,7 +2686,7 @@ span#plugin_description { .visual_font_size_24pt > em > strong, .visual_font_size_24pt em span, .visual_font_size_24pt span em { - font-size: 24pt !important; + font-size: 24pt; line-height: 24pt; } .visual_font_size_28pt, @@ -2698,7 +2698,7 @@ span#plugin_description { .visual_font_size_28pt > em > strong, .visual_font_size_28pt em span, .visual_font_size_28pt span em { - font-size: 28pt !important; + font-size: 28pt; line-height: 28pt; } .visual_font_size_36pt, @@ -2710,7 +2710,7 @@ span#plugin_description { .visual_font_size_36pt > em > strong, .visual_font_size_36pt em span, .visual_font_size_36pt span em { - font-size: 36pt !important; + font-size: 36pt; line-height: 36pt; } .visual_font_size_48pt, @@ -2722,7 +2722,7 @@ span#plugin_description { .visual_font_size_48pt > em > strong, .visual_font_size_48pt em span, .visual_font_size_48pt span em { - font-size: 48pt !important; + font-size: 48pt; line-height: 48pt; } .visual_font_size_60pt, @@ -2734,7 +2734,7 @@ span#plugin_description { .visual_font_size_60pt > em > strong, .visual_font_size_60pt em span, .visual_font_size_60pt span em { - font-size: 60pt !important; + font-size: 60pt; line-height: 60pt; } .visual_font_size_72pt, @@ -2746,7 +2746,7 @@ span#plugin_description { .visual_font_size_72pt > em > strong, .visual_font_size_72pt em span, .visual_font_size_72pt span em { - font-size: 72pt !important; + font-size: 72pt; line-height: 72pt; } .visual_font_size_84pt, @@ -2758,7 +2758,7 @@ span#plugin_description { .visual_font_size_84pt > em > strong, .visual_font_size_84pt em span, .visual_font_size_84pt span em { - font-size: 84pt !important; + font-size: 84pt; line-height: 84pt; } @@ -2771,7 +2771,7 @@ span#plugin_description { .visual_font_size_96pt > em > strong, .visual_font_size_96pt em span, .visual_font_size_96pt span em { - font-size: 96pt !important; + font-size: 96pt; line-height: 96pt; } @@ -2784,7 +2784,7 @@ span#plugin_description { .visual_font_size_116pt > em > strong, .visual_font_size_116pt em span, .visual_font_size_116pt span em { - font-size: 116pt !important; + font-size: 116pt; line-height: 116pt; } @@ -2797,7 +2797,7 @@ span#plugin_description { .visual_font_size_128pt > em > strong, .visual_font_size_128pt em span, .visual_font_size_128pt span em { - font-size: 128pt !important; + font-size: 128pt; line-height: 128pt; } @@ -2810,7 +2810,7 @@ span#plugin_description { .visual_font_size_140pt > em > strong, .visual_font_size_140pt em span, .visual_font_size_140pt span em { - font-size: 140pt !important; + font-size: 140pt; line-height: 140pt; } @@ -2823,7 +2823,7 @@ span#plugin_description { .visual_font_size_154pt > em > strong, .visual_font_size_154pt em span, .visual_font_size_154pt span em { - font-size: 154pt !important; + font-size: 154pt; line-height: 154pt; } @@ -2836,7 +2836,7 @@ span#plugin_description { .visual_font_size_196pt > em > strong, .visual_font_size_196pt em span, .visual_font_size_196pt span em { - font-size: 196pt !important; + font-size: 196pt; line-height: 196pt; } @@ -2849,7 +2849,7 @@ span#plugin_description { .resize_visual_font_size_8pt > em > strong, .visual_font_size_8pt em span, .visual_font_size_8pt span em { - font-size: 4pt !important; + font-size: 4pt; line-height: 4pt; } .resize_visual_font_size_14pt, @@ -2861,7 +2861,7 @@ span#plugin_description { .resize_visual_font_size_14pt > em > strong, .visual_font_size_14pt em span, .visual_font_size_14pt span em { - font-size: 7pt !important; + font-size: 7pt; line-height: 7pt; } .resize_visual_font_size_24pt, @@ -2873,7 +2873,7 @@ span#plugin_description { .resize_visual_font_size_24pt > em > strong, .visual_font_size_14pt em span, .visual_font_size_14pt span em { - font-size: 12pt !important; + font-size: 12pt; line-height: 12pt; } .resize_visual_font_size_36pt, @@ -2885,7 +2885,7 @@ span#plugin_description { .resize_visual_font_size_36pt > em > strong, .visual_font_size_36pt em span, .visual_font_size_36pt span em { - font-size: 18pt !important; + font-size: 18pt; line-height: 18pt; } .resize_visual_font_size_72pt, @@ -2897,7 +2897,7 @@ span#plugin_description { .resize_visual_font_size_72pt > em > strong, .visual_font_size_72pt em span, .visual_font_size_72pt span em { - font-size: 36pt !important; + font-size: 36pt; line-height: 36pt; } @@ -2919,9 +2919,9 @@ span#plugin_description { width: 400px; height: 260px; - -moz-box-shadow: 0px 4px 4px #010e1b !important; - -webkit-box-shadow: 0px 4px 4px #010e1b !important; - box-shadow: 0px 4px 4px #010e1b !important; + -moz-box-shadow: 0px 4px 4px #010e1b; + -webkit-box-shadow: 0px 4px 4px #010e1b; + box-shadow: 0px 4px 4px #010e1b; filter: alpha(opacity=97); -moz-opacity: 0.97; @@ -2997,7 +2997,7 @@ span#plugin_description { } a.tip { - display: inline !important; + display: inline; cursor: help; } @@ -3021,7 +3021,7 @@ input.search_input { .vertical_fields td input, .vertical_fields td select { - margin-top: 8px !important; + margin-top: 8px; } a[id^="tgl_ctrl_"] > img, @@ -3030,9 +3030,9 @@ a[id^="tgl_ctrl_"] > b > img { } .noshadow { - -moz-box-shadow: 0px !important; - -webkit-box-shadow: 0px !important; - box-shadow: 0px !important; + -moz-box-shadow: 0px; + -webkit-box-shadow: 0px; + box-shadow: 0px; } /* Images forced title */ @@ -3063,7 +3063,7 @@ div.forced_title_layer { div.legend > div { pointer-events: none; /* Allow to click the graphs below */ - opacity: 0.65 !important; + opacity: 0.65; } div.nodata_text { @@ -3117,7 +3117,7 @@ ul.subsubmenu { -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px; - background: #ececec !important; + background: #ececec; } ul.subsubmenu li { @@ -3241,7 +3241,7 @@ div#agent_wizard_subtabs { .menu_graph, .timestamp_graph { - position: absolute !important; + position: absolute; } .menu_graph { @@ -3262,13 +3262,13 @@ div#agent_wizard_subtabs { .legendColorBox * { font-size: 0px; padding: 0px 4px; - overflow: visible !important; + overflow: visible; } /* GIS CSS */ .olLayerDiv { - z-index: 102 !important; + z-index: 102; } /* Alert view */ @@ -3285,7 +3285,7 @@ table.alert_escalation th img { td.used_field { #border: solid #6eb432; - background: #6eb432 !important; + background: #6eb432; color: #ffffff; font-weight: bold; } @@ -3370,7 +3370,7 @@ table#policy_modules td * { width: 100%; margin-left: auto; margin-right: auto; - background-color: #5b5b5b !important; + background-color: #5b5b5b; padding: 10px; border: 1px solid #e2e2e2; margin-top: 5%; @@ -3413,7 +3413,7 @@ table#policy_modules td * { padding-bottom: 7px; } .databox.pies fieldset.tactical_set { - width: 70% !important; + width: 70%; height: 285px; } @@ -3435,7 +3435,7 @@ table#policy_modules td * { } .no_hidden_menu { - background-position: 11% 50% !important; + background-position: 11% 50%; } #menu_tab li.nomn, @@ -3466,7 +3466,7 @@ table#policy_modules td * { #menu_tab li.tab_operation a, #menu_tab a.tab_operation { - background: none !important ; + background: none; } .subsubmenu { @@ -3474,11 +3474,11 @@ table#policy_modules td * { float: right; z-index: 9999; display: none; - margin-top: 6px !important ; - left: 0px !important; + margin-top: 6px; + left: 0px; } .subsubmenu li { - margin-top: 0px !important ; + margin-top: 0px; } .agents_modules_table { @@ -3542,12 +3542,12 @@ table#policy_modules td * { } .databox.agente td > div > canvas { - width: 100% !important; - text-align: left !important; + width: 100%; + text-align: left; } .databox.agente td > div.graph { - width: 100% !important; - text-align: left !important; + width: 100%; + text-align: left; } .godmode, @@ -3559,8 +3559,8 @@ table#policy_modules td * { } .godmode { - border-top: 4px solid !important; - padding-bottom: 4px !important; + border-top: 4px solid; + padding-bottom: 4px; border-bottom-right-radius: 5px; border-right-style: solid; border-right-width: 0px; @@ -3577,7 +3577,7 @@ table#policy_modules td * { } .dashboard li a { - width: 158px !important; + width: 158px; } .text_subDashboard { @@ -4003,7 +4003,7 @@ div.form_message_alert ul li { div.form_message_alert ul li input { border: none; - background-color: #dadada !important; + background-color: #dadada; border-radius: 0px; height: 17px; width: 145px; @@ -4032,7 +4032,7 @@ div.button_message_alert_form input { } .ui-dialog .ui-dialog-titlebar { - background-color: #82b92e !important; + background-color: #82b92e; } /* @@ -4111,7 +4111,7 @@ div.login_pass { margin: 0 auto; width: 70%; height: 40px; - background-color: rgba(255, 255, 255, 0.2) !important; + background-color: rgba(255, 255, 255, 0.2); margin-bottom: 25px; min-width: 260px; } @@ -4124,14 +4124,14 @@ div.login_pass img { div.login_nick input, div.login_pass input { - background-color: rgba(255, 255, 255, 0) !important; - border: 0px !important; - color: white !important; + background-color: rgba(255, 255, 255, 0); + border: 0px; + color: white; border-radius: 0px; width: 89%; height: 40px; font-size: 9pt; - padding: 0px !important; + padding: 0px; } div.login_nick input:focus, @@ -4148,8 +4148,8 @@ div.login_pass input:-webkit-autofill:hover, div.login_pass input:-webkit-autofill:focus, div.login_pass input:-webkit-autofill:active { transition: background-color 10000s ease-in-out 0s; - -webkit-box-shadow: 0 0 0px 0px transparent inset !important; - -webkit-text-fill-color: white !important; + -webkit-box-shadow: 0 0 0px 0px transparent inset; + -webkit-text-fill-color: white; border: 0px; width: 89%; } @@ -4181,7 +4181,7 @@ div.login_button { div.login_button input { width: 100%; - background-color: rgb(25, 25, 25) !important; + background-color: rgb(25, 25, 25); text-align: center; border: 0px; border-radius: 0px; diff --git a/pandora_console/include/styles/pandora_forms.css b/pandora_console/include/styles/pandora_forms.css index e104a22fca..845f0a954a 100644 --- a/pandora_console/include/styles/pandora_forms.css +++ b/pandora_console/include/styles/pandora_forms.css @@ -71,7 +71,7 @@ td.scwWeekNumberHead { } td.scwWeek { - color: #000 !important; + color: #000; } /* Today selector */ @@ -90,5 +90,5 @@ tfoot.scwFoot { } .scwFoot :hover { - color: #ffa500 !important; + color: #ffa500; } diff --git a/pandora_console/include/styles/pandora_green_old.css b/pandora_console/include/styles/pandora_green_old.css index c27229aeb2..069cbbe9c0 100644 --- a/pandora_console/include/styles/pandora_green_old.css +++ b/pandora_console/include/styles/pandora_green_old.css @@ -72,7 +72,7 @@ input { } input[type="checkbox"] { - display: inline !important; + display: inline; } select { @@ -149,7 +149,7 @@ p.center { h1#log_title { font-size: 18px; margin-bottom: 0px; - color: #fff !important; + color: #fff; width: 300px; } div#log_msg { @@ -350,7 +350,7 @@ div#head { } div#foot { - font-size: 6pt !important; + font-size: 6pt; border-top: solid 2px #222; padding-top: 8px; padding-bottom: 5px; @@ -445,7 +445,7 @@ div#foot { } p.log_in { - color: #fff !important; + color: #fff; padding: 0px 10px; width: 300px; } @@ -458,7 +458,7 @@ div#login { border-width: 2px 2px 2px 2px; border-style: solid; border-color: #000; - font-size: 12px !important; + font-size: 12px; } div#login_in, #login_f { @@ -477,13 +477,13 @@ div#login_in, height: 100%; border-radius: 5px; /* Browser without multibackground support */ - background-color: #373737 !important; + background-color: #373737; } #login_outer { border-radius: 11px; background-color: #000; - width: 500px !important; - color: #fff !important; + width: 500px; + color: #fff; margin: 0px auto; } @@ -569,10 +569,10 @@ div.login_button { } div.login_button > input { - background-color: #373737 !important; + background-color: #373737; border: 0px none; - background-image: url("../../images/input_go.png") !important; - padding-right: 25px !important; + background-image: url("../../images/input_go.png"); + padding-right: 25px; } .login_page { @@ -584,14 +584,14 @@ div.login_button > input { } input.next_login { - padding-right: 12px !important; - padding-left: 12px !important; + padding-right: 12px; + padding-left: 12px; height: 23px; text-align: center; - font-weight: 600 !important; + font-weight: 600; letter-spacing: 0.5pt; - font-size: 12px !important; - border-radius: 3px !important; + font-size: 12px; + border-radius: 3px; } div.login_nick, @@ -660,14 +660,14 @@ input.login { margin: 0px 0px; width: 135px; height: 18px; - font-weight: 100 !important; + font-weight: 100; letter-spacing: 0.3pt; } input.login_user { /* Browser without multibackground support */ - color: #373737 !important; + color: #373737; padding-left: 8px; width: 179px; color: #222; @@ -682,9 +682,9 @@ input.login_password { height: 20px; } .databox_error { - width: 657px !important; + width: 657px; height: 400px; - border: none !important; + border: none; background-color: #fafafa; background: url(../../images/splash_error.png) no-repeat; } @@ -729,19 +729,19 @@ input.sub { font-size: 8pt; - background-color: #333 !important; - background-repeat: no-repeat !important; - background-position: 92% 3px !important; + background-color: #333; + background-repeat: no-repeat; + background-position: 92% 3px; - color: white !important; + color: white; padding: 3px 3px 5px 12px; border-color: #333; } input.sub[disabled] { - color: #b4b4b4 !important; - background-color: #f3f3f3 !important; + color: #b4b4b4; + background-color: #f3f3f3; border-color: #b6b6b6; cursor: default; } @@ -770,73 +770,73 @@ input.pdf { } input.next { - background-image: url(../../images/input_go.png) !important; + background-image: url(../../images/input_go.png); } input.upd { - background-image: url(../../images/input_update.png) !important; + background-image: url(../../images/input_update.png); } input.wand { - background-image: url(../../images/input_wand.png) !important; + background-image: url(../../images/input_wand.png); } input.wand:disabled { - background-image: url(../../images/input_wand.disabled.png) !important; + background-image: url(../../images/input_wand.disabled.png); } input.search { - background-image: url(../../images/input_zoom.png) !important; + background-image: url(../../images/input_zoom.png); } input.search:disabled { - background-image: url(../../images/input_zoom.disabled.png) !important; + background-image: url(../../images/input_zoom.disabled.png); } input.ok { - background-image: url(../../images/input_tick.png) !important; + background-image: url(../../images/input_tick.png); } input.ok:disabled { - background-image: url(../../images/input_tick.disabled.png) !important; + background-image: url(../../images/input_tick.disabled.png); } input.add { - background-image: url(../../images/input_add.png) !important; + background-image: url(../../images/input_add.png); } input.add:disabled { - background-image: url(../../images/input_add.disabled.png) !important; + background-image: url(../../images/input_add.disabled.png); } input.cancel { - background-image: url(../../images/input_cross.png) !important; + background-image: url(../../images/input_cross.png); } input.cancel:disabled { - background-image: url(../../images/input_cross.disabled.png) !important; + background-image: url(../../images/input_cross.disabled.png); } input.delete { - background-image: url(../../images/input_delete.png) !important; + background-image: url(../../images/input_delete.png); } input.delete:disabled { - background-image: url(../../images/input_delete.disabled.png) !important; + background-image: url(../../images/input_delete.disabled.png); } input.cog { - background-image: url(../../images/input_cog.png) !important; + background-image: url(../../images/input_cog.png); } input.cog:disabled { - background-image: url(../../images/input_cog.disabled.png) !important; + background-image: url(../../images/input_cog.disabled.png); } input.config { - background-image: url(../../images/input_config.png) !important; + background-image: url(../../images/input_config.png); } input.config:disabled { - background-image: url(../../images/input_config.disabled.png) !important; + background-image: url(../../images/input_config.disabled.png); } input.filter { - background-image: url(../../images/input_filter.png) !important; + background-image: url(../../images/input_filter.png); } input.filter:disabled { - background-image: url(../../images/input_filter.disabled.png) !important; + background-image: url(../../images/input_filter.disabled.png); } input.pdf { - background-image: url(../../images/input_pdf.png) !important; + background-image: url(../../images/input_pdf.png); } input.pdf:disabled { - background-image: url(../../images/input_pdf.disabled.png) !important; + background-image: url(../../images/input_pdf.disabled.png); } input.camera { - background-image: url(../../images/input_camera.png) !important; + background-image: url(../../images/input_camera.png); } #toolbox #auto_save { @@ -852,105 +852,105 @@ input.visual_editor_button_toolbox { margin-top: 5px; } input.delete_min { - background: #fefefe url(../../images/cross.png) no-repeat center !important; + background: #fefefe url(../../images/cross.png) no-repeat center; } input.delete_min[disabled] { - background: #fefefe url(../../images/cross.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/cross.disabled.png) no-repeat center; } input.graph_min { - background: #fefefe url(../../images/chart_curve.png) no-repeat center !important; + background: #fefefe url(../../images/chart_curve.png) no-repeat center; } input.graph_min[disabled] { background: #fefefe url(../../images/chart_curve.disabled.png) no-repeat - center !important; + center; } input.percentile_min { - background: #fefefe url(../../images/chart_bar.png) no-repeat center !important; + background: #fefefe url(../../images/chart_bar.png) no-repeat center; } input.percentile_min[disabled] { - background: #fefefe url(../../images/chart_bar.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/chart_bar.disabled.png) no-repeat center; } input.percentile_item_min { - background: #fefefe url(../../images/percentile_item.png) no-repeat center !important; + background: #fefefe url(../../images/percentile_item.png) no-repeat center; } input.percentile_item_min[disabled] { background: #fefefe url(../../images/percentile_item.disabled.png) no-repeat - center !important; + center; } input.binary_min { - background: #fefefe url(../../images/binary.png) no-repeat center !important; + background: #fefefe url(../../images/binary.png) no-repeat center; } input.binary_min[disabled] { - background: #fefefe url(../../images/binary.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/binary.disabled.png) no-repeat center; } input.camera_min { - background: #fefefe url(../../images/camera.png) no-repeat center !important; + background: #fefefe url(../../images/camera.png) no-repeat center; } input.camera_min[disabled] { - background: #fefefe url(../../images/camera.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/camera.disabled.png) no-repeat center; } input.config_min { - background: #fefefe url(../../images/config.png) no-repeat center !important; + background: #fefefe url(../../images/config.png) no-repeat center; } input.config_min[disabled] { - background: #fefefe url(../../images/config.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/config.disabled.png) no-repeat center; } input.label_min { - background: #fefefe url(../../images/tag_red.png) no-repeat center !important; + background: #fefefe url(../../images/tag_red.png) no-repeat center; } input.label_min[disabled] { - background: #fefefe url(../../images/tag_red.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/tag_red.disabled.png) no-repeat center; } input.icon_min { - background: #fefefe url(../../images/photo.png) no-repeat center !important; + background: #fefefe url(../../images/photo.png) no-repeat center; } input.icon_min[disabled] { - background: #fefefe url(../../images/photo.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/photo.disabled.png) no-repeat center; } input.box_item { - background: #fefefe url(../../images/box_item.png) no-repeat center !important; + background: #fefefe url(../../images/box_item.png) no-repeat center; } input.box_item[disabled] { - background: #fefefe url(../../images/box_item.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/box_item.disabled.png) no-repeat center; } input.line_item { - background: #fefefe url(../../images/line_item.png) no-repeat center !important; + background: #fefefe url(../../images/line_item.png) no-repeat center; } input.line_item[disabled] { - background: #fefefe url(../../images/line_item.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/line_item.disabled.png) no-repeat center; } input.copy_item { - background: #fefefe url(../../images/copy_visualmap.png) no-repeat center !important; + background: #fefefe url(../../images/copy_visualmap.png) no-repeat center; } input.copy_item[disabled] { background: #fefefe url(../../images/copy_visualmap.disabled.png) no-repeat - center !important; + center; } input.grid_min { - background: #fefefe url(../../images/grid.png) no-repeat center !important; + background: #fefefe url(../../images/grid.png) no-repeat center; } input.grid_min[disabled] { - background: #fefefe url(../../images/grid.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/grid.disabled.png) no-repeat center; } input.save_min { - background: #fefefe url(../../images/file.png) no-repeat center !important; + background: #fefefe url(../../images/file.png) no-repeat center; } input.save_min[disabled] { - background: #fefefe url(../../images/file.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/file.disabled.png) no-repeat center; } input.service_min { - background: #fefefe url(../../images/box.png) no-repeat center !important; + background: #fefefe url(../../images/box.png) no-repeat center; } input.service_min[disabled] { - background: #fefefe url(../../images/box.disabled.png) no-repeat center !important; + background: #fefefe url(../../images/box.disabled.png) no-repeat center; } input.group_item_min { - background: #fefefe url(../../images/group_green.png) no-repeat center !important; + background: #fefefe url(../../images/group_green.png) no-repeat center; } input.group_item_min[disabled] { background: #fefefe url(../../images/group_green.disabled.png) no-repeat - center !important; + center; } div#cont { @@ -961,7 +961,7 @@ div#cont { } .termframe { - background-color: #80ba27 !important; + background-color: #80ba27; } table, @@ -1023,15 +1023,15 @@ td input[type="checkbox"] { td.datos3, td.datos3 * { background-color: #666; - color: white !important; + color: white; } td.datos4, td.datos4 * { - /*Add !important because in php the function html_print_table write style in cell and this is style head.*/ - text-align: center !important; + /*Add because in php the function html_print_table write style in cell and this is style head.*/ + text-align: center; background-color: #666; - color: white !important; + color: white; } td.datos_id { @@ -1241,10 +1241,10 @@ div.title_line { #menu_tab_frame, #menu_tab_frame_view { - display: block !important; + display: block; border-bottom: 1px solid #80ba27; /* float:left; */ - margin-left: 0px !important; + margin-left: 0px; max-height: 42px; min-height: 42px; padding-right: 28px; @@ -1252,7 +1252,7 @@ div.title_line { } #menu_tab { - margin: 0px 0px 0px 0px !important; + margin: 0px 0px 0px 0px; position: absolute; right: 0px; top: 10px; @@ -1332,7 +1332,7 @@ div.title_line { } /* TAB TITLE */ #menu_tab_left { - margin-left: 0px !important; + margin-left: 0px; } #menu_tab_left .mn, @@ -1385,7 +1385,7 @@ div.title_line { -moz-border-top-left-radius: 3px; -webkit-border-top-left-radius: 3px; border-top-left-radius: 3px; - margin-left: 0px !important; + margin-left: 0px; overflow-y: hidden; } @@ -1396,7 +1396,7 @@ div.title_line { #menu_tab_frame *, #menu_tab_frame_view * { - #margin: 0px 0px 0px 0px !important; + #margin: 0px 0px 0px 0px; } span.users { @@ -1515,9 +1515,9 @@ span.nrmess { table.databox { background-color: #f9faf9; border-spacing: 0px; - -moz-box-shadow: 0px 0px 0px #ddd !important; - -webkit-box-shadow: 0px 0px 0px #ddd !important; - box-shadow: 0px 0px 0px #ddd !important; + -moz-box-shadow: 0px 0px 0px #ddd; + -webkit-box-shadow: 0px 0px 0px #ddd; + box-shadow: 0px 0px 0px #ddd; } .databox td { @@ -1544,7 +1544,7 @@ table.databox { .databox th textarea, .databox th select, .databox th select option { - color: #222 !important; + color: #222; } .tabletitle { @@ -1590,9 +1590,9 @@ table.alternate tr:nth-child(even) td { table.rounded_cells td { padding: 4px 4px 4px 10px; - -moz-border-radius: 6px !important; - -webkit-border-radius: 6px !important; - border-radius: 6px !important; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; } .databox_color { @@ -1703,7 +1703,7 @@ div#main_pure { } /* IE 7 Hack */ #editor { - *margin-top: 10px !important; + *margin-top: 10px; } /* big_data is used in tactical and logon_ok */ .big_data { @@ -1721,7 +1721,7 @@ div#main_pure { text-align: center; font-weight: bold; padding: 8px; - margin: 0px 0px 0px 0px !important; + margin: 0px 0px 0px 0px; z-index: -1; } @@ -1746,7 +1746,7 @@ span.actions { margin-left: 30px; } .actions { - min-width: 200px !important; + min-width: 200px; } code, pre { @@ -1764,7 +1764,7 @@ select#action { } input[type="image"] { border: 0px; - background-color: transparent !important; + background-color: transparent; } table#simple select#id_module_type, table#alert_search select#id_agent, @@ -1892,7 +1892,7 @@ ol.steps li.current { background-color: #e9f3d2; } ol.steps li.visited { - color: #999 !important; + color: #999; } fieldset { @@ -1916,7 +1916,7 @@ fieldset .databox { } fieldset.databox { - padding: 14px !important; + padding: 14px; } fieldset legend span, @@ -2031,7 +2031,7 @@ div#pandora_logo_header { } .autorefresh_disabled { - cursor: not-allowed !important; + cursor: not-allowed; } a.autorefresh { @@ -2056,15 +2056,15 @@ div.warn { } .submenu_not_selected { - font-weight: normal !important; + font-weight: normal; } /* Submenus havent borders */ .submenu_not_selected, .submenu_selected, .submenu2 { - border: 0px !important; - min-height: 35px !important; + border: 0px; + min-height: 35px; } /* Pandora width style theme */ @@ -2091,7 +2091,7 @@ div#steps_clean { #menu_tab_frame_view { width: 100%; padding-right: 0px; - margin-left: 0px !important; + margin-left: 0px; margin-bottom: 20px; height: 31px; } @@ -2124,8 +2124,8 @@ div#logo_text3 { margin-bottom: 5px; } .pagination * { - margin-left: 0px !important; - margin-right: 0px !important; + margin-left: 0px; + margin-right: 0px; vertical-align: middle; } @@ -2134,7 +2134,7 @@ div#logo_text3 { /* Calendar background */ table.scw { background-color: #80ab51; - border: 0 !important; + border: 0; border-radius: 4px; } @@ -2144,7 +2144,7 @@ td.scwWeekNumberHead { } td.scwWeek { - color: #111 !important; + color: #111; } Today selector td.scwFoot { @@ -2162,39 +2162,39 @@ tfoot.scwFoot { } .scwFoot :hover { - color: #3f3f3f !important; + color: #3f3f3f; } table.scwCells { - background-color: #fff !important; - color: #3c3c3c !important; + background-color: #fff; + color: #3c3c3c; } table.scwCells:hover { - background-color: #fff !important; + background-color: #fff; } td.scwCellsExMonth { - background-color: #eee !important; - color: #3c3c3c !important; + background-color: #eee; + color: #3c3c3c; } td.scwCellsWeekend { - background-color: #3c3c3c !important; - color: #fff !important; - border: 0 !important; + background-color: #3c3c3c; + color: #fff; + border: 0; } td.scwInputDate { - background-color: #777 !important; - color: #ffffff !important; - border: 0 !important; + background-color: #777; + color: #ffffff; + border: 0; } td.scwFoot { - background-color: #fff !important; - color: #3c3c3c !important; - border: 0 !important; + background-color: #fff; + color: #3c3c3c; + border: 0; } /* Cells divs to set individual styles with the table objects */ @@ -2279,25 +2279,25 @@ div.cellBig { .info_box { background: #f9faf9; - margin-top: 10px !important; - margin-bottom: 10px !important; + margin-top: 10px; + margin-bottom: 10px; padding: 0px 5px 5px 10px; border-color: #e2e2e2; border-style: solid; border-width: 1px; - width: 100% !important; + width: 100%; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } .info_box .title * { - font-size: 10pt !important; + font-size: 10pt; font-weight: bolder; } .info_box .icon { - width: 30px !important; + width: 30px; text-align: center; } @@ -2338,7 +2338,7 @@ tr.group_view_not_init, tr.group_view_not_init, .group_view_not_init { background-color: #5bb6e5; - color: #fff !important; + color: #fff; } tr.group_view_warn, @@ -2347,11 +2347,11 @@ tr.group_view_warn.a, a.group_view_warn, tr.a.group_view_warn { background-color: #fad403; - color: #3f3f3f !important; + color: #3f3f3f; } a.group_view_warn { - color: #fad403 !important; + color: #fad403; } tr.group_view_alrm, @@ -2381,7 +2381,7 @@ tr.group_view_unk, .datos_redf9 a, .datos_red * { background-color: #fc4444; - color: #fff !important; + color: #fff; } .datos_yellow, @@ -2396,7 +2396,7 @@ a.datos_blue, .datos_blue, .datos_blue * { background-color: #4ca8e0; - color: #fff !important; + color: #fff; } .datos_grey, @@ -2451,39 +2451,39 @@ ul.operation li a:hover { } .submenu_not_selected { - color: #fff !important; + color: #fff; } .operation .menu_icon:hover { - background-color: #d9fb86 !important; + background-color: #d9fb86; } .operation .submenu_text:hover { - color: #585858 !important; + color: #585858; } .operation .submenu_not_selected:hover { - background-color: #d9fb86 !important; - color: #585858 !important; + background-color: #d9fb86; + color: #585858; } .operation .submenu_selected:hover { - background-color: #d9fb86 !important; - color: #585858 !important; + background-color: #d9fb86; + color: #585858; } .operation .sub_subMenu:hover { - background-color: #d9fb86 !important; - color: #585858 !important; + background-color: #d9fb86; + color: #585858; } .operation .selected .submenu_not_selected * { - color: #fff !important; + color: #fff; } .operation .selected .submenu_not_selected *:hover { - color: #585858 !important; + color: #585858; } .operation { - background-color: #80ab51 !important; + background-color: #80ab51; } .operation .selected { - background-color: #d9fb86 !important; + background-color: #d9fb86; } .operation li.selected { box-shadow: inset 4px 0 #80ab51; @@ -2499,35 +2499,35 @@ ul.operation li a:hover { } .godmode .menu_icon:hover { - background-color: #a77853 !important; + background-color: #a77853; } .godmode .submenu_text:hover { - color: #3f3f3f !important; + color: #3f3f3f; } .godmode .submenu_not_selected:hover { - background-color: #a77853 !important; - color: #2f2f2f !important; + background-color: #a77853; + color: #2f2f2f; } .godmode .submenu_selected:hover { - background-color: #a77853 !important; - color: #2f2f2f !important; + background-color: #a77853; + color: #2f2f2f; } .godmode .sub_subMenu:hover { - background-color: #a77853 !important; - color: #2f2f2f !important; + background-color: #a77853; + color: #2f2f2f; } .godmode .selected .submenu_not_selected * { - color: #fff !important; + color: #fff; } .godmode .selected .submenu_not_selected *:hover { - color: #2f2f2f !important; + color: #2f2f2f; } .godmode { - background-color: #e79b5d !important; + background-color: #e79b5d; } .godmode .selected { - background-color: #a77853 !important; + background-color: #a77853; } .godmode li.selected { box-shadow: inset 4px 0 #e79b5d; @@ -2551,7 +2551,7 @@ li.links a:hover { } .is_submenu2 { - background-color: #222222 !important; + background-color: #222222; } .menu li, @@ -2577,7 +2577,7 @@ input#text-id_parent.ac_input, input, textarea, select { - background-color: #ffffff !important; + background-color: #ffffff; border: 1px solid #cbcbcb; -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -2602,7 +2602,7 @@ span#plugin_description { .visual_font_size_4pt > em > strong, .visual_font_size_4pt em span, .visual_font_size_4pt span em { - font-size: 4pt !important; + font-size: 4pt; line-height: 4pt; } @@ -2615,7 +2615,7 @@ span#plugin_description { .visual_font_size_6pt > em > strong, .visual_font_size_6pt em span, .visual_font_size_6pt span em { - font-size: 6pt !important; + font-size: 6pt; line-height: 6pt; } @@ -2628,7 +2628,7 @@ span#plugin_description { .visual_font_size_8pt > em > strong, .visual_font_size_8pt em span, .visual_font_size_8pt span em { - font-size: 8pt !important; + font-size: 8pt; line-height: 8pt; } @@ -2639,7 +2639,7 @@ span#plugin_description { .visual_font_size_10pt > em > strong, .visual_font_size_10pt em span, .visual_font_size_10pt span em { - font-size: 10pt !important; + font-size: 10pt; line-height: 10pt; } @@ -2650,7 +2650,7 @@ span#plugin_description { .visual_font_size_12pt > em > strong, .visual_font_size_12pt em span, .visual_font_size_12pt span em { - font-size: 12pt !important; + font-size: 12pt; line-height: 12pt; } @@ -2663,7 +2663,7 @@ span#plugin_description { .visual_font_size_14pt > em > strong, .visual_font_size_14pt em span, .visual_font_size_14pt span em { - font-size: 14pt !important; + font-size: 14pt; line-height: 14pt; } @@ -2676,7 +2676,7 @@ span#plugin_description { .visual_font_size_18pt > em > strong, .visual_font_size_18pt em span, .visual_font_size_18pt span em { - font-size: 18pt !important; + font-size: 18pt; line-height: 18pt; } @@ -2689,7 +2689,7 @@ span#plugin_description { .visual_font_size_24pt > em > strong, .visual_font_size_24pt em span, .visual_font_size_24pt span em { - font-size: 24pt !important; + font-size: 24pt; line-height: 24pt; } @@ -2702,7 +2702,7 @@ span#plugin_description { .visual_font_size_28pt > em > strong, .visual_font_size_28pt em span, .visual_font_size_28pt span em { - font-size: 28pt !important; + font-size: 28pt; line-height: 28pt; } @@ -2715,7 +2715,7 @@ span#plugin_description { .visual_font_size_36pt > em > strong, .visual_font_size_36pt em span, .visual_font_size_36pt span em { - font-size: 36pt !important; + font-size: 36pt; line-height: 36pt; } @@ -2728,7 +2728,7 @@ span#plugin_description { .visual_font_size_48pt > em > strong, .visual_font_size_48pt em span, .visual_font_size_48pt span em { - font-size: 48pt !important; + font-size: 48pt; line-height: 48pt; } @@ -2741,7 +2741,7 @@ span#plugin_description { .visual_font_size_60pt > em > strong, .visual_font_size_60pt em span, .visual_font_size_60pt span em { - font-size: 60pt !important; + font-size: 60pt; line-height: 60pt; } @@ -2754,7 +2754,7 @@ span#plugin_description { .visual_font_size_72pt > em > strong, .visual_font_size_72pt em span, .visual_font_size_72pt span em { - font-size: 72pt !important; + font-size: 72pt; line-height: 72pt; } @@ -2767,7 +2767,7 @@ span#plugin_description { .visual_font_size_84pt > em > strong, .visual_font_size_84pt em span, .visual_font_size_84pt span em { - font-size: 84pt !important; + font-size: 84pt; line-height: 84pt; } @@ -2780,7 +2780,7 @@ span#plugin_description { .visual_font_size_96pt > em > strong, .visual_font_size_96pt em span, .visual_font_size_96pt span em { - font-size: 96pt !important; + font-size: 96pt; line-height: 96pt; } @@ -2793,7 +2793,7 @@ span#plugin_description { .visual_font_size_116pt > em > strong, .visual_font_size_116pt em span, .visual_font_size_116pt span em { - font-size: 116pt !important; + font-size: 116pt; line-height: 116pt; } @@ -2806,7 +2806,7 @@ span#plugin_description { .visual_font_size_128pt > em > strong, .visual_font_size_128pt em span, .visual_font_size_128pt span em { - font-size: 128pt !important; + font-size: 128pt; line-height: 128pt; } @@ -2819,7 +2819,7 @@ span#plugin_description { .visual_font_size_140pt > em > strong, .visual_font_size_140pt em span, .visual_font_size_140pt span em { - font-size: 140pt !important; + font-size: 140pt; line-height: 140pt; } @@ -2832,7 +2832,7 @@ span#plugin_description { .visual_font_size_154pt > em > strong, .visual_font_size_154pt em span, .visual_font_size_154pt span em { - font-size: 154pt !important; + font-size: 154pt; line-height: 154pt; } @@ -2845,7 +2845,7 @@ span#plugin_description { .visual_font_size_196pt > em > strong, .visual_font_size_196pt em span, .visual_font_size_196pt span em { - font-size: 196pt !important; + font-size: 196pt; line-height: 196pt; } @@ -2858,7 +2858,7 @@ span#plugin_description { .resize_visual_font_size_8pt > em > strong, .visual_font_size_8pt em span, .visual_font_size_8pt span em { - font-size: 4pt !important; + font-size: 4pt; line-height: 4pt; } .resize_visual_font_size_14pt, @@ -2870,7 +2870,7 @@ span#plugin_description { .resize_visual_font_size_14pt > em > strong, .visual_font_size_14pt em span, .visual_font_size_14pt span em { - font-size: 7pt !important; + font-size: 7pt; line-height: 7pt; } .resize_visual_font_size_24pt, @@ -2882,7 +2882,7 @@ span#plugin_description { .resize_visual_font_size_24pt > em > strong, .visual_font_size_14pt em span, .visual_font_size_14pt span em { - font-size: 12pt !important; + font-size: 12pt; line-height: 12pt; } .resize_visual_font_size_36pt, @@ -2894,7 +2894,7 @@ span#plugin_description { .resize_visual_font_size_36pt > em > strong, .visual_font_size_36pt em span, .visual_font_size_36pt span em { - font-size: 18pt !important; + font-size: 18pt; line-height: 18pt; } .resize_visual_font_size_72pt, @@ -2906,7 +2906,7 @@ span#plugin_description { .resize_visual_font_size_72pt > em > strong, .visual_font_size_72pt em span, .visual_font_size_72pt span em { - font-size: 36pt !important; + font-size: 36pt; line-height: 36pt; } /*SIDEBAR*/ @@ -2927,9 +2927,9 @@ span#plugin_description { width: 400px; height: 260px; - -moz-box-shadow: 0px 4px 4px #010e1b !important; - -webkit-box-shadow: 0px 4px 4px #010e1b !important; - box-shadow: 0px 4px 4px #010e1b !important; + -moz-box-shadow: 0px 4px 4px #010e1b; + -webkit-box-shadow: 0px 4px 4px #010e1b; + box-shadow: 0px 4px 4px #010e1b; filter: alpha(opacity=97); -moz-opacity: 0.97; @@ -3005,7 +3005,7 @@ span#plugin_description { } a.tip { - display: inline !important; + display: inline; cursor: help; } @@ -3029,7 +3029,7 @@ input.search_input { .vertical_fields td input, .vertical_fields td select { - margin-top: 8px !important; + margin-top: 8px; } a[id^="tgl_ctrl_"] > img, @@ -3038,9 +3038,9 @@ a[id^="tgl_ctrl_"] > b > img { } .noshadow { - -moz-box-shadow: 0px !important; - -webkit-box-shadow: 0px !important; - box-shadow: 0px !important; + -moz-box-shadow: 0px; + -webkit-box-shadow: 0px; + box-shadow: 0px; } /* Images forced title */ @@ -3071,7 +3071,7 @@ div.forced_title_layer { div.legend > div { pointer-events: none; /* Allow to click the graphs below */ - opacity: 0.65 !important; + opacity: 0.65; } div.nodata_text { @@ -3125,7 +3125,7 @@ ul.subsubmenu { -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px; - background: #ececec !important; + background: #ececec; } ul.subsubmenu li { @@ -3249,7 +3249,7 @@ div#agent_wizard_subtabs { .menu_graph, .timestamp_graph { - position: absolute !important; + position: absolute; } .menu_graph { @@ -3270,13 +3270,13 @@ div#agent_wizard_subtabs { .legendColorBox * { font-size: 0px; padding: 0px 4px; - overflow: visible !important; + overflow: visible; } /* GIS CSS */ .olLayerDiv { - z-index: 102 !important; + z-index: 102; } /* Alert view */ @@ -3293,7 +3293,7 @@ table.alert_escalation th img { td.used_field { #border: solid #6eb432; - background: #6eb432 !important; + background: #6eb432; color: #ffffff; font-weight: bold; } @@ -3374,7 +3374,7 @@ table#policy_modules td * { width: 100%; margin-left: auto; margin-right: auto; - background-color: #fff !important; + background-color: #fff; padding: 10px; border: 1px solid #e2e2e2; margin-top: 5%; @@ -3417,7 +3417,7 @@ table#policy_modules td * { padding-bottom: 7px; } .databox.pies fieldset.tactical_set { - width: 70% !important; + width: 70%; height: 285px; } @@ -3439,7 +3439,7 @@ table#policy_modules td * { } .no_hidden_menu { - background-position: 11% 50% !important; + background-position: 11% 50%; } #menu_tab li.nomn, @@ -3470,7 +3470,7 @@ table#policy_modules td * { #menu_tab li.tab_operation a, #menu_tab a.tab_operation { - background: none !important ; + background: none; } .subsubmenu { @@ -3478,11 +3478,11 @@ table#policy_modules td * { float: right; z-index: 9999; display: none; - margin-top: 6px !important ; - left: 0px !important; + margin-top: 6px; + left: 0px; } .subsubmenu li { - margin-top: 0px !important ; + margin-top: 0px; } .agents_modules_table { @@ -3546,12 +3546,12 @@ table#policy_modules td * { } .databox.agente td > div > canvas { - width: 100% !important; - text-align: left !important; + width: 100%; + text-align: left; } .databox.agente td > div.graph { - width: 100% !important; - text-align: left !important; + width: 100%; + text-align: left; } .godmode, @@ -3563,8 +3563,8 @@ table#policy_modules td * { } .godmode { - border-top: 4px solid !important; - padding-bottom: 4px !important; + border-top: 4px solid; + padding-bottom: 4px; border-bottom-right-radius: 5px; border-right-style: solid; border-right-width: 0px; @@ -3581,7 +3581,7 @@ table#policy_modules td * { } .dashboard li a { - width: 158px !important; + width: 158px; } .text_subDashboard { diff --git a/pandora_console/include/styles/pandora_minimal.css b/pandora_console/include/styles/pandora_minimal.css index 8c9649888d..d9d6bbdc60 100644 --- a/pandora_console/include/styles/pandora_minimal.css +++ b/pandora_console/include/styles/pandora_minimal.css @@ -129,7 +129,7 @@ td.scwWeekNumberHead { } td.scwWeek { - color: #000 !important; + color: #000; } /* Today selector */ @@ -148,7 +148,7 @@ tfoot.scwFoot { } .scwFoot :hover { - color: #ffa500 !important; + color: #ffa500; } input.next { @@ -164,18 +164,18 @@ input.next { margin: 10px auto; padding: 5px; border: 1px solid #a8a8a8; - width: 85% !important; - -moz-box-shadow: 0px 2px 2px #010e1b !important; - -webkit-box-shadow: 0px 2px 2px #010e1b !important; - box-shadow: 0px 2px 2px #010e1b !important; + width: 85%; + -moz-box-shadow: 0px 2px 2px #010e1b; + -webkit-box-shadow: 0px 2px 2px #010e1b; + box-shadow: 0px 2px 2px #010e1b; } .info_box .title * { - font-size: 10pt !important; + font-size: 10pt; font-weight: bolder; } .info_box .icon { - width: 30px !important; + width: 30px; text-align: center; } diff --git a/pandora_console/include/styles/register.css b/pandora_console/include/styles/register.css index d2589a3f01..798ef5e66e 100644 --- a/pandora_console/include/styles/register.css +++ b/pandora_console/include/styles/register.css @@ -1,42 +1,42 @@ input[type="submit"].submit-cancel, button.submit-cancel { - color: #fb4444 !important; - border: 1px solid #fb4444 !important; - background: #fff !important; + color: #fb4444; + border: 1px solid #fb4444; + background: #fff; padding: 5px; font-size: 1.3em; - margin: 0.5em 1em 0.5em 0 !important; - cursor: pointer !important; - text-align: center !important; - height: 30px !important; - width: 90px !important; + margin: 0.5em 1em 0.5em 0; + cursor: pointer; + text-align: center; + height: 30px; + width: 90px; } input[type="submit"].submit-cancel:hover, button.submit-cancel:hover { - color: #fff !important; - background: #fb4444 !important; + color: #fff; + background: #fb4444; } input[type="submit"].submit-next, button.submit-next, input[type="button"].submit-next { - color: #82b92e !important; - border: 1px solid #82b92e !important; - background: #fff !important; + color: #82b92e; + border: 1px solid #82b92e; + background: #fff; padding: 5px; font-size: 1.3em; - margin: 0.5em 1em 0.5em 0 !important; - cursor: pointer !important; - text-align: center !important; - height: 30px !important; + margin: 0.5em 1em 0.5em 0; + cursor: pointer; + text-align: center; + height: 30px; } input[type="submit"].submit-next:hover, button.submit-next:hover, input[type="button"].submit-next:hover { - color: #fff !important; - background: #82b92e !important; + color: #fff; + background: #82b92e; } div.submit_buttons_container { diff --git a/pandora_console/include/styles/visual_maps.css b/pandora_console/include/styles/visual_maps.css new file mode 100644 index 0000000000..4dfd06354d --- /dev/null +++ b/pandora_console/include/styles/visual_maps.css @@ -0,0 +1,172 @@ +/* + * --------------------------------------------------------------------- + * - VISUAL MAPS - + * --------------------------------------------------------------------- + */ +input.vs_button_ghost { + background-color: transparent; + border: 1px solid #82b92e; + color: #82b92e; + text-align: center; + padding: 4px 12px; + font-weight: bold; +} + +#toolbox #auto_save { + padding-top: 5px; +} + +#toolbox { + margin-top: 13px; +} +input.visual_editor_button_toolbox { + padding-right: 15px; + padding-top: 10px; + margin-top: 5px; +} +input.delete_min { + background: #fefefe url(../../images/cross.png) no-repeat center; +} +input.delete_min[disabled] { + background: #fefefe url(../../images/cross.disabled.png) no-repeat center; +} +input.graph_min { + background: #fefefe url(../../images/chart_curve.png) no-repeat center; +} +input.graph_min[disabled] { + background: #fefefe url(../../images/chart_curve.disabled.png) no-repeat + center; +} +input.bars_graph_min { + background: #fefefe url(../../images/icono-barras-arriba.png) no-repeat center; +} +input.bars_graph_min[disabled] { + background: #fefefe url(../../images/icono-barras-arriba.disabled.png) + no-repeat center; +} +input.percentile_min { + background: #fefefe url(../../images/chart_bar.png) no-repeat center; +} +input.percentile_min[disabled] { + background: #fefefe url(../../images/chart_bar.disabled.png) no-repeat center; +} +input.percentile_item_min { + background: #fefefe url(../../images/percentile_item.png) no-repeat center; +} +input.percentile_item_min[disabled] { + background: #fefefe url(../../images/percentile_item.disabled.png) no-repeat + center; +} +input.auto_sla_graph_min { + background: #fefefe url(../../images/auto_sla_graph.png) no-repeat center; +} +input.auto_sla_graph_min[disabled] { + background: #fefefe url(../../images/auto_sla_graph.disabled.png) no-repeat + center; +} +input.donut_graph_min { + background: #fefefe url(../../images/icono-quesito.png) no-repeat center; +} +input.donut_graph_min[disabled] { + background: #fefefe url(../../images/icono-quesito.disabled.png) no-repeat + center; +} +input.binary_min { + background: #fefefe url(../../images/binary.png) no-repeat center; +} +input.binary_min[disabled] { + background: #fefefe url(../../images/binary.disabled.png) no-repeat center; +} +input.camera_min { + background: #fefefe url(../../images/camera.png) no-repeat center; +} +input.camera_min[disabled] { + background: #fefefe url(../../images/camera.disabled.png) no-repeat center; +} +input.config_min { + background: #fefefe url(../../images/config.png) no-repeat center; +} +input.config_min[disabled] { + background: #fefefe url(../../images/config.disabled.png) no-repeat center; +} +input.label_min { + background: #fefefe url(../../images/tag_red.png) no-repeat center; +} +input.label_min[disabled] { + background: #fefefe url(../../images/tag_red.disabled.png) no-repeat center; +} +input.icon_min { + background: #fefefe url(../../images/photo.png) no-repeat center; +} +input.icon_min[disabled] { + background: #fefefe url(../../images/photo.disabled.png) no-repeat center; +} +input.clock_min { + background: #fefefe url(../../images/clock-tab.png) no-repeat center; +} +input.clock_min[disabled] { + background: #fefefe url(../../images/clock-tab.disabled.png) no-repeat center; +} +input.box_item { + background: #fefefe url(../../images/box_item.png) no-repeat center; +} +input.box_item[disabled] { + background: #fefefe url(../../images/box_item.disabled.png) no-repeat center; +} +input.line_item { + background: #fefefe url(../../images/line_item.png) no-repeat center; +} +input.line_item[disabled] { + background: #fefefe url(../../images/line_item.disabled.png) no-repeat center; +} +input.copy_item { + background: #fefefe url(../../images/copy_visualmap.png) no-repeat center; +} +input.copy_item[disabled] { + background: #fefefe url(../../images/copy_visualmap.disabled.png) no-repeat + center; +} +input.grid_min { + background: #fefefe url(../../images/grid.png) no-repeat center; +} +input.grid_min[disabled] { + background: #fefefe url(../../images/grid.disabled.png) no-repeat center; +} +input.save_min { + background: #fefefe url(../../images/file.png) no-repeat center; +} +input.save_min[disabled] { + background: #fefefe url(../../images/file.disabled.png) no-repeat center; +} +input.service_min { + background: #fefefe url(../../images/box.png) no-repeat center; +} +input.service_min[disabled] { + background: #fefefe url(../../images/box.disabled.png) no-repeat center; +} + +input.group_item_min { + background: #fefefe url(../../images/group_green.png) no-repeat center; +} +input.group_item_min[disabled] { + background: #fefefe url(../../images/group_green.disabled.png) no-repeat + center; +} +input.color_cloud_min { + background: #fefefe url(../../images/color_cloud_item.png) no-repeat center; +} +input.color_cloud_min[disabled] { + background: #fefefe url(../../images/color_cloud_item.disabled.png) no-repeat + center; +} + +div#cont { + position: fixed; + max-height: 320px; + overflow-y: auto; + overflow-x: hidden; +} + +/*.termframe{ + background-color: #80BA27; +}*/ diff --git a/pandora_console/index.php b/pandora_console/index.php index 730e404a20..d013336139 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1200,11 +1200,12 @@ echo ''; if ($config['pure'] == 0) { echo ''; - // container div + // Container div. + echo ''; echo '
'; + echo ''; } // Clippy function diff --git a/pandora_console/mobile/include/style/main.css b/pandora_console/mobile/include/style/main.css index b3e066c893..1ee656e43e 100755 --- a/pandora_console/mobile/include/style/main.css +++ b/pandora_console/mobile/include/style/main.css @@ -1,5 +1,5 @@ * { - text-decoration: none !important; + text-decoration: none; font-size: 12px; } @@ -15,11 +15,11 @@ body { } .small { - font-size: 10px !important; + font-size: 10px; } .ui-header .ui-title { - font-size: 14px !important; + font-size: 14px; } .ui-btn-inner { @@ -57,8 +57,8 @@ legend { } .ui-btn-up-c { - font-weight: normal !important; - text-shadow: none !important; + font-weight: normal; + text-shadow: none; } /* For mobiles */ @@ -76,7 +76,7 @@ legend { @media screen and (min-width: 750px) { #tactical1 a, #tactical2 a { - font-size: 25px !important; + font-size: 25px; } } /*END-----------Tactical styles-----------------------------------------*/ @@ -93,16 +93,16 @@ legend { /*INIT----------Groups styles-----------------------------------------*/ .group_view tr { - border-bottom: 3px solid white !important; + border-bottom: 3px solid white; } tr.group_view_crit, .group_view_crit { background-color: #fa3030; - color: #000000 !important; + color: #000000; } .group_view_crit * { - color: #000000 !important; + color: #000000; } .ui-btn-up-group_view_crit, .ui-btn-hover-group_view_crit { @@ -118,16 +118,16 @@ tr.group_view_crit, .group_view_norm, .group_view_norm * { background-color: #ffffff; - color: #000000 !important; + color: #000000; } .group_view_norm * { - color: #000000 !important; + color: #000000; } .group_view_not_init, .group_view_not_init * { background-color: #5ab7e5; - color: #fff !important; + color: #fff; } .ui-btn-up-group_view_normal, @@ -144,10 +144,10 @@ tr.group_view_crit, .group_view_ok, .group_view_ok * { background-color: #00c000; - color: #000000 !important; + color: #000000; } .group_view_ok * { - color: #000000 !important; + color: #000000; } .ui-btn-up-group_view_ok, .ui-btn-hover-group_view_ok { @@ -166,7 +166,7 @@ tr.a.group_view_warn { background-color: #f5e535; } a.group_view_warn { - color: #000000 !important; + color: #000000; } .ui-btn-up-group_view_warn, .ui-btn-hover-group_view_warn { @@ -182,7 +182,7 @@ tr.group_view_alrm, background-color: #ed8701; } .group_view_alrm * { - color: #000000 !important; + color: #000000; } .ui-btn-up-group_view_alrm, .ui-btn-hover-group_view_alrm { @@ -198,7 +198,7 @@ tr.group_view_unk, background-color: #c4c4c4; } .group_view_unk * { - color: #000000 !important; + color: #000000; } .ui-btn-up-group_view_unk, .ui-btn-hover-group_view_unk { @@ -212,37 +212,37 @@ tr.group_view_unk, .ui-btn-active:visited, .ui-btn-active:hover, .ui-btn-active a.ui-link-inherit { - color: #888 !important; - text-shadow: none !important; + color: #888; + text-shadow: none; } tr.group_view_data, .group_view_data { - color: #000000 !important; + color: #000000; } .group_view_data_unk * { - color: #303030 !important; + color: #303030; } .group_view_data_ok * { - color: #00c000 !important; + color: #00c000; } .group_view_data_crit * { - color: #5c0000 !important; + color: #5c0000; } .group_view_data_alrm * { - color: #5c1d00 !important; + color: #5c1d00; } .group_view_data_warn * { - color: #5c5900 !important; + color: #5c5900; } .group_view * { - text-shadow: none !important; - font-size: 12px !important; + text-shadow: none; + font-size: 12px; } .list_groups .link_count { - display: inline !important; + display: inline; } .list_groups .number_count, @@ -285,16 +285,16 @@ tr.group_view_data, .datos_green a, .datos_greenf9 a { background-color: #52a000; - color: #ffffff !important; - text-shadow: none !important; + color: #ffffff; + text-shadow: none; } .datos_red, .datos_redf9, .datos_red a, .datos_redf9 a { background-color: #ff3e41; - color: #ffffff !important; - text-shadow: none !important; + color: #ffffff; + text-shadow: none; } .datos_yellow, @@ -302,50 +302,50 @@ tr.group_view_data, .datos_yellow a, .datos_yellowf9 a { background-color: #f5e535; - color: #000000 !important; - text-shadow: none !important; + color: #000000; + text-shadow: none; } .datos_blue, .datos_bluef9, .datos_blue a, .datos_bluef9 a { background-color: #77e2f2; - color: #000000 !important; - text-shadow: none !important; + color: #000000; + text-shadow: none; } .datos_grey, .datos_greyf9, .datos_grey a, .datos_greyf9 a { background-color: #e4e4e4; - color: #000000 !important; - text-shadow: none !important; + color: #000000; + text-shadow: none; } .datos_pink, .datos_pinkf9, .datos_pink a, .datos_pinkf9 a { background-color: #ff92e9; - color: #000000 !important; - text-shadow: none !important; + color: #000000; + text-shadow: none; } .datos_brown, .datos_brownf9, .datos_brown a, .datos_brownf9 a { background-color: #c97a4a; - color: #000000 !important; - text-shadow: none !important; + color: #000000; + text-shadow: none; } tr.events { - border-bottom: 6px solid #f7f7f7 !important; - font-size: 12px !important; + border-bottom: 6px solid #f7f7f7; + font-size: 12px; } table#list_events th { - font-size: 12px !important; - font-weight: bolder !important; + font-size: 12px; + font-weight: bolder; border: 0px; } @@ -527,23 +527,23 @@ table.event_details td.cell_event_name { .redb, .redi, .error { - background: #f85858 !important; + background: #f85858; } .green { - background: #6eb432 !important; + background: #6eb432; } .orange { - background: #ff8800 !important; + background: #ff8800; } .yellow { - background: #ffea59 !important; + background: #ffea59; } .grey { - background: #aaaaaa !important; + background: #aaaaaa; font-weight: bold; } @@ -554,7 +554,7 @@ table.event_details td.cell_event_name { .grey, .agents_tiny_stats span { text-shadow: none; - color: white !important; + color: white; padding: 1px 3px; border-radius: 2px; } @@ -630,9 +630,9 @@ table.event_details td.cell_event_name { display: table-cell; clear: none; float: none; - padding-left: 0px !important; - padding-right: 0px !important; - width: auto !important; + padding-left: 0px; + padding-right: 0px; + width: auto; } #list_agents td.cell_0 { @@ -651,7 +651,7 @@ table.event_details td.cell_event_name { #list_agents .cell_4 .ui-table-cell-label, #list_agents .cell_5 .ui-table-cell-label, #list_agents .cell_8 .ui-table-cell-label { - min-width: auto !important; + min-width: auto; } #list_agents .cell_3 .ui-table-cell-label, @@ -663,19 +663,19 @@ table.event_details td.cell_event_name { #list_agents .cell_2, #list_agents .cell_3, #list_agents .cell_7 { - display: inline !important; - float: none !important; + display: inline; + float: none; } #list_agents .cell_4, #list_agents .cell_8 { - display: inline !important; - float: none !important; + display: inline; + float: none; } #list_agents .cell_8 { - display: inline !important; - float: none !important; + display: inline; + float: none; } #list_agents b.ui-table-cell-label { @@ -683,14 +683,14 @@ table.event_details td.cell_event_name { } #list_agents .show_collapside { - display: none !important; + display: none; } #list_agents .cell_1, #list_agents .cell_2, #list_agents .cell_3, #list_agents .cell_4 { - display: none !important; + display: none; } #list_agents .cell_0 .ui-link { @@ -698,15 +698,15 @@ table.event_details td.cell_event_name { } #list_agents .cell_6 .show_collapside { - display: none !important; + display: none; } .agents_tiny_stats * { - font-size: 12px !important; + font-size: 12px; } #list_agent_Modules td { - padding-top: 7px !important; + padding-top: 7px; } .agents_tiny_stats { @@ -717,13 +717,13 @@ table.event_details td.cell_event_name { /* For mobiles */ @media screen and (max-width: 750px) { .agents_tiny_stats * { - font-size: 12px !important; + font-size: 12px; } } /* For tablets */ @media screen and (min-width: 750px) { .agents_tiny_stats * { - font-size: 17px !important; + font-size: 17px; } } /*END-----------Agents styles-----------------------------------------*/ @@ -755,7 +755,7 @@ table.event_details td.cell_event_name { #rendered_visual_map div { color: #003a3a; - text-shadow: none !important; + text-shadow: none; } #rendered_visual_map { @@ -765,62 +765,62 @@ table.event_details td.cell_event_name { /* For mobiles */ @media screen and (max-width: 750px) { #rendered_visual_map div { - font-size: 6pt !important; + font-size: 6pt; } } /* For tablets */ @media screen and (min-width: 750px) { #rendered_visual_map div { - font-size: 8pt !important; + font-size: 8pt; } } /* For mobiles */ @media screen and (max-width: 750px) { .resize_visual_font_size_4pt * { - font-size: 2pt !important; + font-size: 2pt; } .resize_visual_font_size_6pt * { - font-size: 3pt !important; + font-size: 3pt; } .resize_visual_font_size_8pt * { - font-size: 4pt !important; + font-size: 4pt; } .resize_visual_font_size_14pt * { - font-size: 6pt !important; + font-size: 6pt; } .resize_visual_font_size_24pt * { - font-size: 10pt !important; + font-size: 10pt; } .resize_visual_font_size_36pt * { - font-size: 14pt !important; + font-size: 14pt; } .resize_visual_font_size_72pt * { - font-size: 27pt !important; + font-size: 27pt; } } /* For tablets */ @media screen and (min-width: 750px) { .resize_visual_font_size_4pt * { - font-size: 2pt !important; + font-size: 2pt; } .resize_visual_font_size_6pt * { - font-size: 3pt !important; + font-size: 3pt; } .resize_visual_font_size_8pt * { - font-size: 4pt !important; + font-size: 4pt; } .resize_visual_font_size_14pt * { - font-size: 7pt !important; + font-size: 7pt; } .resize_visual_font_size_24pt * { - font-size: 12pt !important; + font-size: 12pt; } .resize_visual_font_size_36pt * { - font-size: 18pt !important; + font-size: 18pt; } .resize_visual_font_size_72pt * { - font-size: 36pt !important; + font-size: 36pt; } } @@ -831,7 +831,7 @@ table.event_details td.cell_event_name { #list_Modules .cell_1 .ui-table-cell-label, #list_Modules .cell_5 .ui-table-cell-label, #list_Modules .cell_6 .ui-table-cell-label { - min-width: auto !important; + min-width: auto; } #list_Modules .cell_5 .ui-table-cell-label, @@ -844,7 +844,7 @@ table.event_details td.cell_event_name { #list_Modules .cell_3 .ui-table-cell-label, #list_Modules .cell_4 .ui-table-cell-label, #list_Modules .cell_5 .ui-table-cell-label { - display: none !important; + display: none; } #list_Modules td { @@ -853,12 +853,12 @@ table.event_details td.cell_event_name { display: table-cell; clear: none; float: none; - padding-left: 0px !important; - padding-right: 0px !important; + padding-left: 0px; + padding-right: 0px; } #list_Modules .show_collapside { - display: inline !important; + display: inline; } #list_Modules .data { @@ -868,14 +868,14 @@ table.event_details td.cell_event_name { #list_Modules .cell_1, #list_Modules .cell_2, #list_Modules .cell_3 { - display: none !important; + display: none; } #list_Modules .cell_0 .show_collapside, #list_Modules .cell_1 .show_collapside, #list_Modules .cell_4 .show_collapside, #list_Modules .cell_5 .show_collapside { - display: none !important; + display: none; } #list_Modules .cell_0 .ui-link { @@ -901,12 +901,12 @@ table.event_details td.cell_event_name { float: left; } #list_Modules .module_name { - font-size: 12px !important; + font-size: 12px; } } #list_Modules .cell_5 a { - color: #000000 !important; + color: #000000; } #list_Modules .module_name { @@ -930,7 +930,7 @@ table.event_details td.cell_event_name { #user_logged { position: absolute; - font-size: 11px !important; + font-size: 11px; right: 10px; top: 8px; background: url(../../../images/header_user.png) no-repeat right; @@ -950,11 +950,11 @@ table.event_details td.cell_event_name { /*INIT---------Fix the square border in search input------------------*/ .ui-input-search { - border-radius: 0.6em 0.6em 0.6em 0.6em !important; + border-radius: 0.6em 0.6em 0.6em 0.6em; } .ui-select { - width: 100% !important; + width: 100%; } /*END----------Fix the square border in search input------------------*/ @@ -964,26 +964,26 @@ ul.ui-listview li.ui-btn div.ui-btn-inner div.ui-btn-text a { } .ui-btn-inner { - border: 0px solid #000 !important; + border: 0px solid #000; } li.ui-btn { - margin-bottom: 4px !important; - margin-top: 4px !important; + margin-bottom: 4px; + margin-top: 4px; } /*INIT---------Fix the tons of air between the rows in small table----*/ .head_vertical { - margin-top: 0px !important; + margin-top: 0px; border-top: 1px solid grey; } .head_horizontal { - border-bottom: 1px solid grey !important; + border-bottom: 1px solid grey; } #list_events .head_horizontal { - border-bottom: 0px solid white !important; + border-bottom: 0px solid white; } .cell_0 { @@ -1003,30 +1003,30 @@ li.ui-btn { @media screen and (max-width: 34.99em) { .ui-table th, .ui-table td { - padding: 8px !important; + padding: 8px; padding-left: 3px; } .head_vertical { - display: none !important; + display: none; } } /*END----------Fix the tons of air between the rows in small table----*/ /*INIT---------Fix to avoid clicks under loading message--------------*/ .ui-loader-background { - width: 100% !important; - height: 100% !important; - top: 0 !important; - margin: 0 !important; - background: rgba(0, 0, 0, 0.3) !important; - display: none !important; - position: fixed !important; - z-index: 100 !important; + width: 100%; + height: 100%; + top: 0; + margin: 0; + background: rgba(0, 0, 0, 0.3); + display: none; + position: fixed; + z-index: 100; } .ui-loading .ui-loader-background { - display: block !important; + display: block; } /*END----------Fix to avoid clicks under loading message--------------*/ @@ -1038,8 +1038,8 @@ li.ui-btn { } .ui-icon-big { - width: 28px !important; - height: 28px !important; + width: 28px; + height: 28px; } @media screen and (max-width: 35em) { @@ -1097,12 +1097,12 @@ li.ui-btn { label, input, .ui-btn-inner { - font-size: 12px !important; + font-size: 12px; } .list_groups .ui-btn-inner { - padding-top: 15px !important; - height: 20px !important; + padding-top: 15px; + height: 20px; } .login_logo img { @@ -1128,25 +1128,25 @@ li.ui-btn { label, input, .ui-btn-inner { - font-size: 16px !important; - padding-top: 6px !important; + font-size: 16px; + padding-top: 6px; } .list_groups .ui-btn-inner { - padding-top: 20px !important; - height: 35px !important; + padding-top: 20px; + height: 35px; } .ui-header .ui-title { - font-size: 18px !important; + font-size: 18px; } * { - font-size: 18px !important; + font-size: 18px; } .event_name { - font-size: 15px !important; + font-size: 15px; } .login_logo img { @@ -1178,7 +1178,7 @@ li.ui-btn { #login_container input, #login_container .ui-btn-text { - font-size: 16px !important; + font-size: 16px; } table.tactical_bars { @@ -1211,39 +1211,39 @@ table.tactical_bars { /*INIT-----------Icons styles---------------------------------------*/ .ui-icon-tactical_view { - background-image: url(../../../images/op_monitoring.menu.png) !important; + background-image: url(../../../images/op_monitoring.menu.png); } .ui-icon-events { - background-image: url(../../../images/op_events.menu.png) !important; + background-image: url(../../../images/op_events.menu.png); } .ui-icon-groups { - background-image: url(../../../images/group.menu.png) !important; + background-image: url(../../../images/group.menu.png); } .ui-icon-alerts { - background-image: url(../../../images/op_alerts.menu.png) !important; + background-image: url(../../../images/op_alerts.menu.png); } .ui-icon-agents { - background-image: url(../../../images/agent_mc.menu.png) !important; + background-image: url(../../../images/agent_mc.menu.png); } .ui-icon-modules { - background-image: url(../../../images/brick.menu.png) !important; + background-image: url(../../../images/brick.menu.png); } .ui-icon-network_maps { - background-image: url(../../../images/op_network.menu.png) !important; + background-image: url(../../../images/op_network.menu.png); } .ui-icon-visual_console { - background-image: url(../../../images/visual_console.menu.png) !important; + background-image: url(../../../images/visual_console.menu.png); } .ui-icon-dashboard { - background-image: url(../../../images/dashboard.menu.png) !important; + background-image: url(../../../images/dashboard.menu.png); } .ui-icon-tactical_view, @@ -1255,16 +1255,16 @@ table.tactical_bars { .ui-icon-network_maps, .ui-icon-visual_console, .ui-icon-dashboard { - background-color: #333 !important; + background-color: #333; background-position: center; - border-radius: 15px !important; - -webkit-border-radius: 15px !important; + border-radius: 15px; + -webkit-border-radius: 15px; } #login_btn-container .ui-icon { - background-color: #333 !important; - border-radius: 15px !important; - -webkit-border-radius: 15px !important; + background-color: #333; + border-radius: 15px; + -webkit-border-radius: 15px; } /* For mobiles */ @@ -1278,9 +1278,9 @@ table.tactical_bars { .ui-icon-network_maps, .ui-icon-visual_console, .ui-icon-dashboard { - width: 22px !important; - height: 22px !important; - margin-top: -13px !important; + width: 22px; + height: 22px; + margin-top: -13px; background-size: 16px 16px; } } @@ -1295,9 +1295,9 @@ table.tactical_bars { .ui-icon-network_maps, .ui-icon-visual_console, .ui-icon-dashboard { - width: 32px !important; - height: 32px !important; - margin-top: -17px !important; + width: 32px; + height: 32px; + margin-top: -17px; } } @@ -1310,11 +1310,11 @@ table.tactical_bars { } .ui-btn-active * { - color: #fff !important; + color: #fff; } .ui-btn-active { - background: #82b92e !important; + background: #82b92e; } span.nobold * { @@ -1338,7 +1338,7 @@ span.nobold * { } .events_agent b.ui-table-cell-label { - display: block !important; + display: block; } #list_Modules *, @@ -1351,8 +1351,8 @@ span.nobold * { } div.legend > div { - width: 100% !important; - opacity: 0.65 !important; + width: 100%; + opacity: 0.65; } div.nodata_text { @@ -1363,7 +1363,7 @@ div.nodata_text { display: table-cell; vertical-align: middle; text-align: left; - font-size: 14px !important; + font-size: 14px; } div.nodata_container { @@ -1385,17 +1385,17 @@ div.nodata_container { } .ui-icon-delete { - margin-top: -3px !important; + margin-top: -3px; } .empty_advice { color: #ff0000; - margin-top: 5px !important; + margin-top: 5px; } /* JQuery Mobile responsive hack to tables with */ .ui-table-reflow.ui-responsive { - display: table !important; + display: table; } .widget_agent_module > th { @@ -1411,10 +1411,10 @@ div.nodata_container { } .legend_graph td.legendLabel > div { - font-size: 12px !important; + font-size: 12px; } .legend_graph td.legendLabel { - font-size: 12px !important; + font-size: 12px; } .ui-popup-hidden { From 69054571ab2590edd77b2496fce174b67c80a02d Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 31 May 2019 09:50:59 +0200 Subject: [PATCH 032/460] Style review --- .../godmode/agentes/agent_manager.php | 30 +++++++---- pandora_console/include/graphs/pandora.d3.js | 1 - pandora_console/include/styles/discovery.css | 1 - pandora_console/include/styles/footer.css | 2 +- pandora_console/include/styles/pandora.css | 52 ++++++++++++------- .../operation/agentes/tactical.php | 19 +++++-- 6 files changed, 68 insertions(+), 37 deletions(-) diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index dfdd7390c3..f19d2b0e60 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -245,7 +245,7 @@ if (!$new_agent && $alias != '') { $table_agent_name .= ''; // QR code div. - $table_qr_code = '
'; + $table_qr_code = '
'; $table_qr_code .= '

'.__('QR Code Agent view').':

'; $table_qr_code .= '
'; if ($id_agente) { @@ -401,7 +401,7 @@ $table_description .= html_print_textarea( // QR code. echo '
-
+
'.$table_agent_name.$table_alias.$table_ip.$table_primary_group.'
'.$table_interval.$table_os.$table_server.$table_description.'
'; @@ -777,7 +777,15 @@ $table_adv_options .= $table_adv_gis.'
'; echo '
'; - ui_toggle($table_adv_options, __('Advanced options'), '', true, false, 'white_box white_box_opened'); +ui_toggle( + $table_adv_options, + __('Advanced options'), + '', + true, + false, + '', + 'padding-4' +); echo '
'; @@ -895,14 +903,14 @@ foreach ($fields as $field) { if (!empty($fields)) { echo '
'; - ui_toggle( - html_print_table($table, true), - __('Custom fields'), - '', - true, - false, - 'white_box white_box_opened' - ); + ui_toggle( + html_print_table($table, true), + __('Custom fields'), + '', + true, + false, + 'white_box white_box_opened' + ); echo '
'; } diff --git a/pandora_console/include/graphs/pandora.d3.js b/pandora_console/include/graphs/pandora.d3.js index 427de827e3..375c4d328f 100644 --- a/pandora_console/include/graphs/pandora.d3.js +++ b/pandora_console/include/graphs/pandora.d3.js @@ -2849,7 +2849,6 @@ function donutNarrowGraph(colores, width, height, total) { }) .attr("d", arc) .attr("stroke", "white") - .style("stroke-width", 2) .style("fill", function(d) { return color(d.data.key); }); diff --git a/pandora_console/include/styles/discovery.css b/pandora_console/include/styles/discovery.css index e935657d42..7eb14460ce 100644 --- a/pandora_console/include/styles/discovery.css +++ b/pandora_console/include/styles/discovery.css @@ -6,7 +6,6 @@ li.discovery { display: inline-block; float: left; width: 250px; - height: 120px; margin: 15px; padding-bottom: 50px; } diff --git a/pandora_console/include/styles/footer.css b/pandora_console/include/styles/footer.css index 84dff3e551..b215497f35 100644 --- a/pandora_console/include/styles/footer.css +++ b/pandora_console/include/styles/footer.css @@ -16,7 +16,7 @@ div#foot { background: #343434; clear: both; width: auto; - height: 38px; + height: 4em; margin-top: auto; box-sizing: border-box; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index d47ab1c9a4..f8cb6dcdd8 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -119,6 +119,7 @@ font-family: verdana, sans-serif; letter-spacing: 0.03pt; font-size: 8pt; + box-sizing: border-box; } svg * { font-size: 11pt; @@ -459,6 +460,16 @@ select:-internal-list-box { max-width: 100%; } +.padding-2 { + padding: 2em; +} +.padding-4 { + padding: 4em; +} +.padding-6 { + padding: 6em; +} + .no-padding { padding: 0; } @@ -480,6 +491,9 @@ select:-internal-list-box { .no-td-padding td { padding: 0; } +.td-bg-white td { + background: #fff; +} div#page { background: #fbfbfb; @@ -1186,9 +1200,12 @@ div#agent_wizard_subtabs { margin-right: 20px; } +#menu_tab_left span { + padding-left: 1em; +} + #menu_tab_left .mn, -#menu_tab_left ul, -#menu_tab_left .mn ul { +#menu_tab_left ul { color: #343434; padding: 0px 0px 0px 0px; list-style: none; @@ -1943,15 +1960,6 @@ div#pandora_logo_header { font-family: "lato-bolder", "Open Sans", sans-serif; } -#header_table_inner a, -#header_table_inner span { - font-family: "Open Sans", sans-serif; -} - -#header_table_inner a:hover { - text-decoration: none; -} - .header_left { display: flex; flex-direction: column; @@ -3146,8 +3154,8 @@ div.div_groups_status { } .databox.pies fieldset.tactical_set { - width: 70%; - height: 285px; + width: 100%; + min-height: 285px; } .difference { @@ -5045,13 +5053,11 @@ table.info_table > tbody > tr:last-child > td:last-child { table.info_table > thead > tr > th, table.info_table > tbody > tr > th, table.info_table > thead > tr > th a { - padding-left: 9px; - padding-right: 9px; - padding-top: 9px; - padding-bottom: 9px; + padding: 0.1em; font-weight: normal; color: #000; - font-size: 8.6pt; + font-size: 1.2em; + margin-left: 0.5em; } table.info_table > tbody > tr { @@ -5806,6 +5812,8 @@ div#status_pie { width: 100%; height: 100%; background-color: #fff; + box-sizing: border-box; + border: 1px solid #e2e2e2; display: flex; align-items: center; flex-wrap: wrap; @@ -5815,7 +5823,7 @@ div#status_pie { border: 1px solid #e2e2e2; border-top: none; background-color: #fff; - padding: 20px; + padding: 5px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; align-items: center; @@ -5846,6 +5854,12 @@ div#status_pie { padding: 10px; } +.white-box-content form { + width: 100%; + margin-bottom: 2em; + padding: 2em; +} + /* White tables */ .white_table, .white_table tr:first-child > th { diff --git a/pandora_console/operation/agentes/tactical.php b/pandora_console/operation/agentes/tactical.php index 10e4ff5736..40fc911352 100755 --- a/pandora_console/operation/agentes/tactical.php +++ b/pandora_console/operation/agentes/tactical.php @@ -122,7 +122,7 @@ echo '
'; foreach ($stats as $stat) { @@ -166,7 +165,12 @@ if ($is_admin) { $table->rowclass[] = ''; } -html_print_table($table); +ui_toggle( + html_print_table($table, true), + __('Report of State'), + true, + false +); echo '
'.__('Event graph by agent').''.html_print_image('images/spinner.gif', true, ['id' => 'spinner_graphic_event_group']).''; $out .= '
'; -echo $out; + + +ui_toggle( + $out, + __('Event graphs'), + true, + false +); echo ''; echo ''; From 88b0802472b198c04384f00730c61c4d057dd6ed Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 3 Jun 2019 10:46:52 +0200 Subject: [PATCH 033/460] style review --- .../godmode/alerts/alert_list.builder.php | 24 ++- .../godmode/alerts/alert_list.list.php | 25 ++- .../godmode/reporting/reporting_builder.php | 29 ++-- pandora_console/include/functions_events.php | 8 +- pandora_console/include/functions_ui.php | 1 + pandora_console/include/styles/discovery.css | 7 +- pandora_console/include/styles/pandora.css | 155 +----------------- pandora_console/include/styles/tables.css | 150 +++++++++++++++++ .../operation/agentes/alerts_status.php | 2 +- .../operation/reporting/custom_reporting.php | 2 +- pandora_console/operation/search_reports.php | 2 +- 11 files changed, 200 insertions(+), 205 deletions(-) create mode 100644 pandora_console/include/styles/tables.css diff --git a/pandora_console/godmode/alerts/alert_list.builder.php b/pandora_console/godmode/alerts/alert_list.builder.php index ca3a099bf3..c97fe2feff 100644 --- a/pandora_console/godmode/alerts/alert_list.builder.php +++ b/pandora_console/godmode/alerts/alert_list.builder.php @@ -37,14 +37,10 @@ $table->head = []; $table->data = []; $table->size = []; $table->size = []; -$table->size[0] = '5%'; -$table->size[1] = '25%'; -$table->size[2] = '5%'; -$table->size[3] = '20%'; -$table->style[0] = 'font-weight: bold; '; -$table->style[1] = 'font-weight: bold; '; -$table->style[2] = 'font-weight: bold; '; -$table->style[3] = 'font-weight: bold; '; +$table->style[0] = 'font-weight: bold;'; +$table->style[1] = 'font-weight: bold;display: flex;align-items: baseline;'; +$table->style[2] = 'font-weight: bold;'; +$table->style[3] = 'font-weight: bold;'; // This is because if this view is reused after list alert view then // styles in the previous view can affect this table. @@ -89,7 +85,7 @@ $table->data[0][1] = html_print_select( true, '', ($id_agente == 0), - 'width: 250px;' + 'min-width: 250px;margin-right: 0.5em;' ); $table->data[0][1] .= ' '; @@ -117,7 +113,7 @@ $table->data[1][1] = html_print_select( true, '', false, - 'width: 250px;' + 'min-width: 250px;' ); $table->data[1][1] .= ''; if (check_acl($config['id_user'], 0, 'LM')) { - $table->data[1][1] .= ''; + $table->data[1][1] .= ''; $table->data[1][1] .= html_print_image('images/add.png', true); - $table->data[1][1] .= ''.__('Create Action').''; + $table->data[1][1] .= ''.__('Create Action').''; $table->data[1][1] .= ''; } @@ -162,13 +158,13 @@ if ($own_info['is_admin'] || check_acl($config['id_user'], 0, 'PM')) { if (check_acl($config['id_user'], 0, 'LM')) { $table->data[2][1] .= ''; $table->data[2][1] .= html_print_image('images/add.png', true); - $table->data[2][1] .= ''.__('Create Template').''; + $table->data[2][1] .= ''.__('Create Template').''; $table->data[2][1] .= ''; } $table->data[3][0] = __('Threshold'); $table->data[3][1] = html_print_input_text('module_action_threshold', '0', '', 5, 7, true); - $table->data[3][1] .= ' '.__('seconds'); + $table->data[3][1] .= ''.__('seconds').''; if (!isset($step)) { echo '
'; diff --git a/pandora_console/godmode/alerts/alert_list.list.php b/pandora_console/godmode/alerts/alert_list.list.php index 4b3a3395cf..f830f47dbd 100644 --- a/pandora_console/godmode/alerts/alert_list.list.php +++ b/pandora_console/godmode/alerts/alert_list.list.php @@ -438,11 +438,11 @@ if (! $id_agente) { $table->style = []; $table->style[0] = 'font-weight: bold;'; $table->head[0] = __('Agent').ui_get_sorting_arrows($url_up_agente, $url_down_agente, $selectAgentUp, $selectAgentDown); - $table->size[0] = '4%'; - $table->size[1] = '8%'; - $table->size[2] = '8%'; - $table->size[3] = '4%'; - $table->size[4] = '4%'; + $table->headstyle[0] = 'width: 100%; min-width: 12em;'; + $table->headstyle[1] = 'min-width: 15em;'; + $table->headstyle[2] = 'min-width: 20em;'; + $table->headstyle[3] = 'min-width: 1em;'; + $table->headstyle[4] = 'min-width: 15em;'; /* if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK) { @@ -450,16 +450,11 @@ if (! $id_agente) { }*/ } else { $table->head[0] = __('Module').ui_get_sorting_arrows($url_up_module, $url_down_module, $selectModuleUp, $selectModuleDown); - // Different sizes or the layout screws up - $table->size[0] = '0%'; - $table->size[1] = '10%'; - $table->size[2] = '30%'; - /* - if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK) { - $table->size[4] = '25%'; - } */ - $table->size[3] = '1%'; - $table->size[4] = '1%'; + $table->headstyle[0] = 'width: 100%; min-width: 15em;'; + $table->headstyle[1] = 'min-width: 15em;'; + $table->headstyle[2] = 'min-width: 20em;'; + $table->headstyle[3] = 'min-width: 1em;'; + $table->headstyle[4] = 'min-width: 15em;'; } $table->head[1] = __('Template').ui_get_sorting_arrows($url_up_template, $url_down_template, $selectTemplateUp, $selectTemplateDown); diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 44e616977d..f872b6357e 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -771,31 +771,28 @@ switch ($action) { $table->head[1] = __('Description'); $table->head[2] = __('HTML'); $table->head[3] = __('XML'); - $table->size[0] = '20%'; - $table->size[1] = '30%'; + $table->size[0] = '60%'; + $table->size[1] = '20%'; $table->size[2] = '2%'; - $table->headstyle[2] = 'min-width: 35px;'; + $table->headstyle[2] = 'min-width: 35px;text-align: center;'; $table->size[3] = '2%'; - $table->headstyle[3] = 'min-width: 35px;'; + $table->headstyle[3] = 'min-width: 35px;text-align: center;'; $table->size[4] = '2%'; - $table->headstyle[4] = 'min-width: 35px;'; - $table->size[5] = '2%'; - $table->headstyle[5] = 'min-width: 35px;'; - $table->size[6] = '2%'; - $table->headstyle[6] = 'min-width: 35px;'; - $table->size[7] = '5%'; - $table->headstyle['csv'] = 'min-width: 65px;'; - $table->style[7] = 'text-align: center;'; - - $table->headstyle[9] = 'min-width: 100px;'; - $table->style[9] = 'text-align: center;'; + $table->headstyle[4] = 'min-width: 35px;text-align: center;'; $next = 4; // Calculate dinamically the number of the column. - if (enterprise_hook('load_custom_reporting_1') !== ENTERPRISE_NOT_HOOK) { + if (enterprise_hook('load_custom_reporting_1', [$table]) !== ENTERPRISE_NOT_HOOK) { $next = 7; } + $table->size[$next] = '2%'; + $table->style[$next] = 'text-align: center;'; + + $table->headstyle[($next + 2)] = 'min-width: 100px;'; + $table->style[($next + 2)] = 'text-align: center;'; + + // Admin options only for RM flag. if (check_acl($config['id_user'], 0, 'RM')) { $table->head[$next] = __('Private'); diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 7f1118ce3f..a282efa300 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -1130,10 +1130,10 @@ function events_print_event_table( } $events_table = html_print_table($table, true); - $out = '
'; - $out .= $events_table; + $out = $events_table; if (!$tactical_view) { + $out .= '
'; if ($agent_id != 0) { $out .= ''; $out .= '
'; @@ -1149,9 +1149,9 @@ function events_print_event_table( '.__('Event graph by agent').''.grafico_eventos_grupo(180, 60).''; $out .= '
'; } - } - $out .= '
'; + $out .= '
'; + } unset($table); diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 2ecc7bc96d..e2d5450759 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -1756,6 +1756,7 @@ function ui_process_page_head($string, $bitfield) [ 'common' => 'include/styles/common.css', 'menu' => 'include/styles/menu.css', + 'tables' => 'include/styles/tables.css', $config['style'] => 'include/styles/'.$config['style'].'.css', ], $config['css'] diff --git a/pandora_console/include/styles/discovery.css b/pandora_console/include/styles/discovery.css index 7eb14460ce..b8da30aede 100644 --- a/pandora_console/include/styles/discovery.css +++ b/pandora_console/include/styles/discovery.css @@ -131,9 +131,9 @@ div.arrow_box:before { } .breadcrumbs_container { - padding-left: 10px; padding-top: 4px; text-indent: 0.25em; + padding-left: 2.5em; } .breadcrumb_link { @@ -167,6 +167,11 @@ form.discovery * { font-size: 10pt; } +form.discovery .label_select b { + font-family: "lato", "Open Sans", sans-serif; + font-weight: bolder; +} + .edit_discovery_info { display: flex; align-items: flex-start; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index f8cb6dcdd8..cc1f3c48f4 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -814,38 +814,6 @@ input.datos { border: #ccc outset 3px; } -td.datos3, -td.datos4 { - background-color: #fff; - color: #000; - border-bottom: 2px solid #82b92e; - border-left: none; - border-right: none; - height: 30px; - font-size: 8.6pt; - font-weight: normal; -} - -td.datos4 { - /*Add because in php the function html_print_table write style in cell and this is style head.*/ - text-align: center; -} - -td.datos3 *, -td.datos4 * { - font-size: 8.6pt; - font-weight: normal; -} - -/*td.datos_id { - color: #1a313a; -}*/ - -/* user list php */ -tr.disabled_row_user * { - color: grey; -} - /* global syles */ .bg { /* op menu */ @@ -1085,7 +1053,7 @@ div.title_line { } .breadcrumbs_container { - padding-left: 10px; + padding-left: 2.5em; padding-top: 4px; text-indent: 0.25em; color: #848484; @@ -4893,6 +4861,7 @@ input:checked + .p-slider:before { .label_select, .label_select_simple { + font-family: "lato-bolder", "Open Sans", sans-serif; margin-bottom: 15px; } @@ -4974,125 +4943,6 @@ input:checked + .p-slider:before { color: #4d4d4d; } -/* This is to use divs like tables */ -.table_div { - display: table; -} -.table_thead, -.table_tbody { - display: table-row; -} -.table_th { - font-weight: bold; -} -.table_th, -.table_td { - display: table-cell; - vertical-align: middle; - padding: 10px; -} -/* Tables with 3 columns */ -.table_three_columns .table_th, -.table_three_columns .table_td { - width: 33%; -} - -/* - * --------------------------------------------------------------------- - * - TABLES TO SHOW INFORMATION - * --------------------------------------------------------------------- - */ - -table.info_table { - background-color: #fff; - margin-bottom: 10px; - border-spacing: 0; - border-collapse: collapse; - overflow: hidden; - border-radius: 5px; -} - -table.info_table > tbody > tr:nth-child(even) { - background-color: #f5f5f5; -} - -table.info_table tr:first-child > th { - background-color: #fff; - color: #000; - text-align: left; - vertical-align: middle; -} - -table.info_table th { - font-size: 7.5pt; - letter-spacing: 0.3pt; - color: #000; - background-color: #fff; -} - -table.info_table tr th { - border-bottom: 1px solid #e2e2e2; -} - -/* Radius top */ -table.info_table > thead > tr:first-child > th:first-child { - border-top-left-radius: 4px; -} -table.info_table > thead > tr:first-child > th:last-child { - border-top-right-radius: 4px; -} - -/* Radius bottom */ -table.info_table > tbody > tr:last-child > td:first-child { - border-top-left-radius: 4px; -} -table.info_table > tbody > tr:last-child > td:last-child { - border-top-right-radius: 4px; -} - -table.info_table > thead > tr > th, -table.info_table > tbody > tr > th, -table.info_table > thead > tr > th a { - padding: 0.1em; - font-weight: normal; - color: #000; - font-size: 1.2em; - margin-left: 0.5em; -} - -table.info_table > tbody > tr { - border-bottom: 1px solid #e2e2e2; -} - -table.info_table > tbody > tr > td { - -moz-border-radius: 0px; - -webkit-border-radius: 0px; - border-radius: 0px; - border: none; - padding-left: 9px; - padding-right: 9px; - padding-top: 7px; - padding-bottom: 7px; -} - -table.info_table > tbody > tr > td > img, -table.info_table > thead > tr > th > img, -table.info_table > tbody > tr > td > div > a > img, -table.info_table > tbody > tr > td > span > img, -table.info_table > tbody > tr > td > span > a > img, -table.info_table > tbody > tr > td > a > img, -table.info_table > tbody > tr > td > form > a > img { - vertical-align: middle; -} - -table.info_table > tbody > tr:hover { - background-color: #eee; -} - -.info_table.profile_list > thead > tr > th > a.tip { - padding: 0px; -} - /* This class is for the icons of actions and operations in the tables. */ .action_buttons a[href] img, .action_buttons input[type="image"], @@ -5817,6 +5667,7 @@ div#status_pie { display: flex; align-items: center; flex-wrap: wrap; + padding: 0 1em 0; } .white_table_graph_content { diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css new file mode 100644 index 0000000000..ac2cdcc951 --- /dev/null +++ b/pandora_console/include/styles/tables.css @@ -0,0 +1,150 @@ +/* + * --------------------------------------------------------------------- + * - TABLES + * --------------------------------------------------------------------- + */ +/* This is to use divs like tables */ +.table_div { + display: table; +} +.table_thead, +.table_tbody { + display: table-row; +} +.table_th { + font-weight: bold; +} +.table_th, +.table_td { + display: table-cell; + vertical-align: middle; + padding: 10px; +} +/* Tables with 3 columns */ +.table_three_columns .table_th, +.table_three_columns .table_td { + width: 33%; +} + +table.info_table { + background-color: #fff; + margin-bottom: 10px; + border-spacing: 0; + border-collapse: collapse; + overflow: hidden; + border-radius: 5px; +} + +table.info_table > tbody > tr:nth-child(even) { + background-color: #f5f5f5; +} + +table.info_table tr:first-child > th { + background-color: #fff; + color: #000; + text-align: left; + vertical-align: middle; +} + +table.info_table th { + font-size: 7.5pt; + letter-spacing: 0.3pt; + color: #000; + background-color: #fff; +} + +table.info_table tr th { + border-bottom: 1px solid #e2e2e2; +} + +/* Radius top */ +table.info_table > thead > tr:first-child > th:first-child { + border-top-left-radius: 4px; +} +table.info_table > thead > tr:first-child > th:last-child { + border-top-right-radius: 4px; +} + +/* Radius bottom */ +table.info_table > tbody > tr:last-child > td:first-child { + border-top-left-radius: 4px; +} +table.info_table > tbody > tr:last-child > td:last-child { + border-top-right-radius: 4px; +} + +table.info_table > thead > tr > th, +table.info_table > tbody > tr > th, +table.info_table > thead > tr > th a, +table.info_table > thead > tr > th > span { + padding: 0.1em; + font-weight: normal; + color: #000; + font-size: 1.2em; + margin-left: 0.5em; +} + +table.info_table > tbody > tr { + border-bottom: 1px solid #e2e2e2; +} + +table.info_table > tbody > tr > td { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + border: none; + padding-left: 9px; + padding-right: 9px; + padding-top: 7px; + padding-bottom: 7px; +} + +table.info_table > tbody > tr > td > img, +table.info_table > thead > tr > th > img, +table.info_table > tbody > tr > td > div > a > img, +table.info_table > tbody > tr > td > span > img, +table.info_table > tbody > tr > td > span > a > img, +table.info_table > tbody > tr > td > a > img, +table.info_table > tbody > tr > td > form > a > img { + vertical-align: middle; +} + +table.info_table > tbody > tr:hover { + background-color: #eee; +} + +.info_table.profile_list > thead > tr > th > a.tip { + padding: 0px; +} + +td.datos3, +td.datos4 { + background-color: #fff; + color: #000; + border-bottom: 2px solid #82b92e; + border-left: none; + border-right: none; + height: 30px; + font-size: 8.6pt; + font-weight: normal; +} + +td.datos4 { + /*Add because in php the function html_print_table write style in cell and this is style head.*/ + text-align: center; +} + +td.datos3 *, +td.datos4 * { + font-size: 8.6pt; + font-weight: normal; +} + +/*td.datos_id { + color: #1a313a; +}*/ + +/* user list php */ +tr.disabled_row_user * { + color: grey; +} diff --git a/pandora_console/operation/agentes/alerts_status.php b/pandora_console/operation/agentes/alerts_status.php index e231266667..92937a22e3 100755 --- a/pandora_console/operation/agentes/alerts_status.php +++ b/pandora_console/operation/agentes/alerts_status.php @@ -614,7 +614,7 @@ foreach ($alerts['alerts_simple'] as $alert) { if (!empty($table->data)) { $class = ''; if ($agent_view_page === true) { - $class = 'white_table_graph_content w100p no-padding-imp'; + $class = 'w100p no-padding-imp'; } echo ''; diff --git a/pandora_console/operation/reporting/custom_reporting.php b/pandora_console/operation/reporting/custom_reporting.php index a5267a21bd..68ff8c80c0 100644 --- a/pandora_console/operation/reporting/custom_reporting.php +++ b/pandora_console/operation/reporting/custom_reporting.php @@ -36,7 +36,7 @@ $table->head[1] = __('Description'); $table->head[2] = __('HTML'); $table->head[3] = __('XML'); -enterprise_hook('load_custom_reporting_1'); +enterprise_hook('load_custom_reporting_1', [$table]); $table->align = []; $table->align[2] = 'center'; diff --git a/pandora_console/operation/search_reports.php b/pandora_console/operation/search_reports.php index 668f6f717b..a3b95357a3 100755 --- a/pandora_console/operation/search_reports.php +++ b/pandora_console/operation/search_reports.php @@ -35,7 +35,7 @@ if ($reports === false || !$searchReports) { $table->head[1] = __('Description'); $table->head[2] = __('HTML'); $table->head[3] = __('XML'); - enterprise_hook('load_custom_reporting_1'); + enterprise_hook('load_custom_reporting_1', [$table]); $table->align = []; $table->align[2] = 'center'; From 9de5dadbf22999bc3e1f0662761e85029313bc8e Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 3 Jun 2019 11:16:51 +0200 Subject: [PATCH 034/460] style review --- pandora_console/general/logon_ok.php | 5 ++++- .../godmode/servers/servers.build_table.php | 4 ++-- pandora_console/godmode/snmpconsole/snmp_alert.php | 2 +- .../operation/reporting/reporting_viewer.php | 12 ++++++------ pandora_console/operation/snmpconsole/snmp_view.php | 2 +- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/pandora_console/general/logon_ok.php b/pandora_console/general/logon_ok.php index 649a2d2f68..a84bd263af 100644 --- a/pandora_console/general/logon_ok.php +++ b/pandora_console/general/logon_ok.php @@ -235,9 +235,12 @@ if (!empty($all_data)) { // Don't specify px. $table->data = []; $table->size = []; + $table->headstyle = []; $table->size[0] = '5%'; $table->size[1] = '15%'; - $table->size[2] = '15%'; + $table->headstyle[1] = 'min-width: 12em;'; + $table->size[2] = '5%'; + $table->headstyle[2] = 'min-width: 65px;'; $table->size[3] = '10%'; $table->size[4] = '25%'; $table->head = []; diff --git a/pandora_console/godmode/servers/servers.build_table.php b/pandora_console/godmode/servers/servers.build_table.php index 1b5486b570..581cb2541f 100644 --- a/pandora_console/godmode/servers/servers.build_table.php +++ b/pandora_console/godmode/servers/servers.build_table.php @@ -51,11 +51,11 @@ $table->style[0] = 'font-weight: bold'; $table->align = []; $table->align[1] = 'center'; $table->align[3] = 'center'; -$table->align[8] = 'center'; +$table->align[8] = 'right'; $table->headstyle[1] = 'text-align:center'; $table->headstyle[3] = 'text-align:center'; -$table->headstyle[8] = 'text-align:center'; +$table->headstyle[8] = 'text-align:right'; // $table->title = __('Tactical server information'); $table->titleclass = 'tabletitle'; diff --git a/pandora_console/godmode/snmpconsole/snmp_alert.php b/pandora_console/godmode/snmpconsole/snmp_alert.php index a2a1b8b811..66651d6522 100755 --- a/pandora_console/godmode/snmpconsole/snmp_alert.php +++ b/pandora_console/godmode/snmpconsole/snmp_alert.php @@ -1275,7 +1275,7 @@ if ($create_alert || $update_alert) { $table->align[7] = 'left'; $table->head[8] = __('Action'); - $table->size[8] = '90px'; + $table->size[8] = '120px'; $table->align[8] = 'left'; $table->head[9] = html_print_checkbox('all_delete_box', '1', false, true); diff --git a/pandora_console/operation/reporting/reporting_viewer.php b/pandora_console/operation/reporting/reporting_viewer.php index 5e9dda1e57..e8431ddeb2 100755 --- a/pandora_console/operation/reporting/reporting_viewer.php +++ b/pandora_console/operation/reporting/reporting_viewer.php @@ -169,12 +169,12 @@ $table->rowspan[0][0] = 2; // Set initial conditions for these controls, later will be modified by javascript if (!$enable_init_date) { $table->style[1] = 'display: none'; - $table->style[2] = 'display: ""'; + $table->style[2] = 'display: flex;align-items: baseline;'; $display_to = 'none'; $display_item = ''; } else { - $table->style[1] = 'display: ""'; - $table->style[2] = 'display: ""'; + $table->style[1] = 'display: "block"'; + $table->style[2] = 'display: flex;align-items: baseline;'; $display_to = ''; $display_item = 'none'; } @@ -210,11 +210,11 @@ if ($html_enterprise !== ENTERPRISE_NOT_HOOK) { $table->data[0][1] .= ''; -$table->data[1][1] = '
'.__('From').':
'; +$table->data[1][1] = '
'.__('From').':
'; $table->data[1][1] .= html_print_input_text('date_init', $date_init, '', 12, 10, true).' '; $table->data[1][1] .= html_print_input_text('time_init', $time_init, '', 10, 7, true).' '; -$table->data[1][2] = '
'.__('Items period before').':
'; -$table->data[1][2] .= '
'.__('to').':
'; +$table->data[1][2] = '
'.__('Items period before').':
'; +$table->data[1][2] .= '
'.__('to').':
'; $table->data[1][2] .= html_print_input_text('date', $date, '', 12, 10, true).' '; $table->data[1][2] .= html_print_input_text('time', $time, '', 10, 7, true).' '; $table->data[1][2] .= html_print_submit_button(__('Update'), 'date_submit', false, 'class="sub next"', true); diff --git a/pandora_console/operation/snmpconsole/snmp_view.php b/pandora_console/operation/snmpconsole/snmp_view.php index cb72a91ecd..c7f69b4109 100755 --- a/pandora_console/operation/snmpconsole/snmp_view.php +++ b/pandora_console/operation/snmpconsole/snmp_view.php @@ -778,7 +778,7 @@ $table->headstyle[7] = 'text-align: center'; $table->head[8] = __('Action'); $table->align[8] = 'center'; $table->size[8] = '10%'; -$table->headstyle[8] = 'text-align: center'; +$table->headstyle[8] = 'min-width: 125px;text-align: center'; $table->head[9] = html_print_checkbox_extended( 'allbox', From ddf3b7a2588459f6a796d1490f4e7b362cd15a2a Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 3 Jun 2019 11:21:44 +0200 Subject: [PATCH 035/460] Review 1 --- pandora_console/godmode/servers/servers.build_table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/servers/servers.build_table.php b/pandora_console/godmode/servers/servers.build_table.php index 581cb2541f..77f6da7315 100644 --- a/pandora_console/godmode/servers/servers.build_table.php +++ b/pandora_console/godmode/servers/servers.build_table.php @@ -55,7 +55,7 @@ $table->align[8] = 'right'; $table->headstyle[1] = 'text-align:center'; $table->headstyle[3] = 'text-align:center'; -$table->headstyle[8] = 'text-align:right'; +$table->headstyle[8] = 'text-align:right;width: 120px;'; // $table->title = __('Tactical server information'); $table->titleclass = 'tabletitle'; From b4dcf4a6f118165e3a1d1b236b09608796c9921c Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 3 Jun 2019 11:55:56 +0200 Subject: [PATCH 036/460] style review --- pandora_console/general/login_page.php | 1 + .../reporting/visual_console_builder.editor.php | 1 + .../godmode/update_manager/update_manager.css | 17 ----------------- pandora_console/include/chart_generator.php | 1 + pandora_console/include/functions_ui.php | 1 + .../include/functions_update_manager.php | 2 +- .../include/styles/js/jquery-ui_custom.css | 12 +++++++++++- pandora_console/include/styles/register.css | 6 ++++-- pandora_console/operation/agentes/stat_win.php | 1 + 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index 880f1531a1..541efa96f4 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -518,6 +518,7 @@ if ($login_screen == 'error_authconfig' || $login_screen == 'error_emptyconfig' ui_require_css_file('dialog'); ui_require_css_file('jquery-ui.min', 'include/styles/js/'); ui_require_jquery_file('jquery-ui.min'); +ui_require_jquery_file('jquery-ui_custom'); ?> button.ui-button.ui-corner-all.ui-widget { - background-color: #cecece; - border: none; - border-radius: 2px; - text-transform: uppercase; - font-weight: bold; -} - -.ui-dialog-buttonset > button.success_button.ui-button.ui-corner-all.ui-widget, -.update_manager_button { - background-color: #82b92e; - color: #fff; - border-radius: 2px; - text-transform: uppercase; - font-weight: bold; -} - a.update_manager_button { padding: 10px 12px; margin-top: 10px; diff --git a/pandora_console/include/chart_generator.php b/pandora_console/include/chart_generator.php index e7133fd79e..2ae768d4fe 100644 --- a/pandora_console/include/chart_generator.php +++ b/pandora_console/include/chart_generator.php @@ -62,6 +62,7 @@ if (file_exists('languages/'.$user_language.'.mo')) { + diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index e2d5450759..066c9f947b 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -1738,6 +1738,7 @@ function ui_process_page_head($string, $bitfield) // Add the jquery UI styles CSS. $config['css']['jquery-UI'] = 'include/styles/js/jquery-ui.min.css'; + $config['css']['jquery-UI-custom'] = 'include/styles/js/jquery-ui_custom.css'; // Add the dialog styles CSS. $config['css']['dialog'] = 'include/styles/dialog.css'; // Add the dialog styles CSS. diff --git a/pandora_console/include/functions_update_manager.php b/pandora_console/include/functions_update_manager.php index cc148be7b9..73a654a50d 100755 --- a/pandora_console/include/functions_update_manager.php +++ b/pandora_console/include/functions_update_manager.php @@ -468,7 +468,7 @@ function registration_wiz_modal( __('Cancel'), 'cancel_registration', false, - 'class="ui-widget ui-state-default ui-corner-all ui-button-text-only sub upd submit-cancel" style="color: red; width:100px;"', + 'class="ui-widget ui-state-default ui-corner-all ui-button-text-only sub upd submit-cancel"', true ); $output .= ''; diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css index 0dde42f6a8..a01f721aca 100644 --- a/pandora_console/include/styles/js/jquery-ui_custom.css +++ b/pandora_console/include/styles/js/jquery-ui_custom.css @@ -1,8 +1,19 @@ @import url(calendar.css); /* --- JQUERY-UI --- */ + +.ui-dialog .ui-corner-all .ui-widget { + border-radius: 0; + margin: 0; + padding: 0; + border: none; +} + .ui-dialog .ui-dialog-titlebar { background-color: #82b92e; + border-radius: 0; + margin: 0; + padding: 0; } /*center ui dialog center*/ @@ -38,7 +49,6 @@ text-overflow: ellipsis; font-size: 11pt; position: relative; - top: 5px; float: none; } .ui-dialog .ui-dialog-titlebar-close { diff --git a/pandora_console/include/styles/register.css b/pandora_console/include/styles/register.css index 798ef5e66e..ef0fdc6e1b 100644 --- a/pandora_console/include/styles/register.css +++ b/pandora_console/include/styles/register.css @@ -1,4 +1,5 @@ input[type="submit"].submit-cancel, +button.submit-cancel.ui-button.ui-corner-all.ui-widget, button.submit-cancel { color: #fb4444; border: 1px solid #fb4444; @@ -13,13 +14,14 @@ button.submit-cancel { } input[type="submit"].submit-cancel:hover, +button.submit-cancel.ui-button.ui-corner-all.ui-widget:hover, button.submit-cancel:hover { color: #fff; background: #fb4444; } input[type="submit"].submit-next, -button.submit-next, +button.submit-next.ui-button.ui-corner-all.ui-widget, input[type="button"].submit-next { color: #82b92e; border: 1px solid #82b92e; @@ -33,7 +35,7 @@ input[type="button"].submit-next { } input[type="submit"].submit-next:hover, -button.submit-next:hover, +button.submit-next.ui-button.ui-corner-all.ui-widget:hover, input[type="button"].submit-next:hover { color: #fff; background: #82b92e; diff --git a/pandora_console/operation/agentes/stat_win.php b/pandora_console/operation/agentes/stat_win.php index 70af429f6d..8a063f940c 100644 --- a/pandora_console/operation/agentes/stat_win.php +++ b/pandora_console/operation/agentes/stat_win.php @@ -72,6 +72,7 @@ $alias = db_get_value('alias', 'tagente', 'id_agente', $id_agent); <?php echo __('%s Graph', get_product_name()).' ('.$alias.' - '.$label; ?>) + From 13086b596ce345d33400bff04e8ac710380882fe Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 3 Jun 2019 13:04:49 +0200 Subject: [PATCH 037/460] Next contact --- .../agentes/estado_generalagente.php | 35 +++++++++++++++++++ .../operation/agentes/ver_agente.php | 25 +++++++++++++ 2 files changed, 60 insertions(+) diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index 360a7fd332..3632b6d2d7 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -739,6 +739,41 @@ if (!empty($network_interfaces)) { ?> '."\n\t"; - } - - /* - * End load JS - */ - /* * Load jQuery */ @@ -1883,6 +1842,47 @@ function ui_process_page_head($string, $bitfield) * End load JQuery */ + /* + * Load JS + */ + + if (empty($config['js'])) { + $config['js'] = []; + // If it's empty, false or not init set array to empty just in case. + } + + // Pandora specific JavaScript should go first. + $config['js'] = array_merge(['pandora' => 'include/javascript/pandora.js'], $config['js']); + // Load base64 javascript library. + $config['js']['base64'] = 'include/javascript/encode_decode_base64.js'; + // Load webchat javascript library. + $config['js']['webchat'] = 'include/javascript/webchat.js'; + // Load qrcode library. + $config['js']['qrcode'] = 'include/javascript/qrcode.js'; + // Load intro.js library (for bubbles and clippy). + $config['js']['intro'] = 'include/javascript/intro.js'; + $config['js']['clippy'] = 'include/javascript/clippy.js'; + // Load Underscore.js library. + $config['js']['underscore'] = 'include/javascript/underscore-min.js'; + + // Load other javascript. + // We can't load empty. + $loaded = ['']; + foreach ($config['js'] as $name => $filename) { + if (in_array($name, $loaded)) { + continue; + } + + array_push($loaded, $name); + + $url_js = ui_get_full_url($filename); + $output .= ''."\n\t"; + } + + /* + * End load JS + */ + include_once __DIR__.'/graphs/functions_flot.php'; $output .= include_javascript_dependencies_flot_graph(true); @@ -2760,6 +2760,346 @@ function ui_progress( } +/** + * Generate needed code to print a datatables jquery plugin. + * + * @param array $parameters All desired data using following format: + * [ + * 'print' => true (by default printed) + * 'id' => datatable id. + * 'class' => datatable class. + * 'style' => datatable style. + * 'order' => '9, "desc"'. Column index (starting by 1) and sort direction. + * 'ajax_url' => 'include/ajax.php' ajax_url. + * 'ajax_postprocess' => a javscript function to postprocess data received + * by ajax call. It is applied foreach row and must + * use following format: + * * [code] + * * function (item) { + * * // Process received item, for instance, name: + * * tmp = '' + item.name + ''; + * * item.name = tmp; + * * } + * * [/code] + * 'columns' => [ + * 'column1' :: Used as th text. Direct text entry. It could be array: + * OR + * [ + * 'id' => th id. + * 'class' => th class. + * 'style' => th style. + * 'text' => 'column1'. + * ] + * ], + * 'datacolumns' => [ + * 'column1', + * 'column2', + * ... + * ], + * 'form' => [ + * 'html' => 'html code' a directly defined inputs in HTML. + * 'search_button_class' => search button class. + * 'class' => form class. + * 'id' => form id. + * 'style' => form style. + * 'js' => optional extra actions onsubmit. + * 'inputs' => [ + * 'label' => Input label. + * 'type' => Input type. + * 'value' => Input value. + * 'name' => Input name. + * 'id' => Input id. + * 'options' => [ + * 'option1' + * 'option2' + * ... + * ] + * ] + * ], + * ] + * End. + * + * @return string HTML code with datatable. + * @throws Exception On error. + */ +function ui_print_datatable(array $parameters) +{ + if (isset($parameters['id'])) { + $table_id = $parameters['id']; + } else { + $table_id = uniqid('datatable_'); + } + + if (!isset($parameters['order'])) { + $parameters['order'] = '0, "asc"'; + } + + if (!isset($parameters['ajax_url'])) { + throw new Exception('Parameter ajax_url is required'); + } + + if (!isset($parameters['ajax_data'])) { + $parameters['ajax_data'] = ''; + } + + $search_button_class = 'sub search'; + if (isset($parameters['search_button_class'])) { + $search_button_class = $parameters['search_button_class']; + } + + if (isset($parameters['pagination_options'])) { + $pagination_options = $parameters['pagination_options']; + } else { + $pagination_options = [ + [ + 10, + 25, + 100, + 200, + 500, + 1000, + -1, + ], + [ + 10, + 25, + 100, + 200, + 500, + 1000, + 'All', + ], + ]; + } + + if (!is_array($parameters['datacolumns'])) { + $parameters['datacolumns'] = $parameters['columns']; + } + + // Datatable filter. + if (isset($parameters['form']) && is_array($parameters['form'])) { + if (isset($parameters['form']['id'])) { + $form_id = $parameters['form']['id']; + } else { + $form_id = uniqid('datatable_filter_'); + } + + if (isset($parameters['form']['class'])) { + $form_class = $parameters['form']['class']; + } else { + $form_class = ''; + } + + if (isset($parameters['form']['style'])) { + $form_style = $parameters['form']['style']; + } else { + $form_style = ''; + } + + if (isset($parameters['form']['js'])) { + $form_js = $parameters['form']['js']; + } else { + $form_js = ''; + } + + $filter = ''; + + if (isset($parameters['form']['html'])) { + $filter .= $parameters['form']['html']; + } + + $filter .= '
    '; + + foreach ($parameters['form']['inputs'] as $input) { + $filter .= '
  • '; + $filter .= ''; + if ($input['type'] != 'select') { + $filter .= ''; + } else { + // Select. + $filter .= ''; + } + + $filter .= '
  • '; + } + + // Search button. + $filter .= '
  • '; + $filter .= ''; + $filter .= '
  • '; + + $filter .= '
'; + $filter = ui_toggle( + $filter, + __('Filter'), + '', + '', + true, + false, + 'white_box white_box_opened', + 'no-border' + ); + } else if (isset($parameters['form_html'])) { + $filter = ui_toggle( + $parameters['form_html'], + __('Filter'), + '', + '', + true, + false, + 'white_box white_box_opened', + 'no-border' + ); + } + + if (!isset($parameters['columns']) || !is_array($parameters['columns'])) { + throw new Exception('[ui_print_datatable]: You must define columns for datatable'); + } + + // Base table. + $table = ''; + $table .= ''; + if (!is_array($parameters['columns'])) { + throw new Exception('[ui_print_datatable]: Parameter columns is required.'); + } + + foreach ($parameters['columns'] as $column) { + if (is_array($column)) { + $table .= ''; + } else { + $table .= ''; + } + } + + $table .= ''; + $table .= '
'.__($column['text']); + $table .= ''.__($column).'
'; + + // Javascript controller. + $js = ''; + + $output = $filter.$table.$js; + + ui_require_css_file('datatables.min', 'include/styles/js/'); + ui_require_javascript_file('datatables.min'); + ui_require_javascript_file('buttons.dataTables.min'); + ui_require_javascript_file('dataTables.buttons.min'); + ui_require_javascript_file('buttons.html5.min'); + ui_require_javascript_file('buttons.print.min'); + + $output = $include.$output; + + // Print datatable if needed. + if (!(isset($parameters['print']) && $parameters['print'] === false)) { + echo $output; + } + + return $output; +} + + /** * Returns a div wich represents the type received. * diff --git a/pandora_console/include/javascript/buttons.dataTables.min.js b/pandora_console/include/javascript/buttons.dataTables.min.js new file mode 100644 index 0000000000..90389767ac --- /dev/null +++ b/pandora_console/include/javascript/buttons.dataTables.min.js @@ -0,0 +1,5 @@ +/*! + DataTables styling wrapper for Buttons + ©2018 SpryMedia Ltd - datatables.net/license +*/ +(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-dt","datatables.net-buttons"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);b&&b.fn.dataTable||(b=require("datatables.net-dt")(a,b).$);b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c,a,b,d){return c.fn.dataTable}); diff --git a/pandora_console/include/javascript/buttons.html5.min.js b/pandora_console/include/javascript/buttons.html5.min.js new file mode 100644 index 0000000000..deee7fee68 --- /dev/null +++ b/pandora_console/include/javascript/buttons.html5.min.js @@ -0,0 +1,35 @@ +/*! + HTML5 export buttons for Buttons and DataTables. + 2016 SpryMedia Ltd - datatables.net/license + + FileSaver.js (1.3.3) - MIT license + Copyright © 2016 Eli Grey - http://eligrey.com +*/ +(function(f){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(g){return f(g,window,document)}):"object"===typeof exports?module.exports=function(g,p,z,t){g||(g=window);p&&p.fn.dataTable||(p=require("datatables.net")(g,p).$);p.fn.dataTable.Buttons||require("datatables.net-buttons")(g,p);return f(p,g,g.document,z,t)}:f(jQuery,window,document)})(function(f,g,p,z,t,w){function A(a){for(var b="";0<=a;)b=String.fromCharCode(a%26+65)+b,a=Math.floor(a/ +26)-1;return b}function E(a,b){y===w&&(y=-1===C.serializeToString(f.parseXML(F["xl/worksheets/sheet1.xml"])).indexOf("xmlns:r"));f.each(b,function(b,c){if(f.isPlainObject(c))b=a.folder(b),E(b,c);else{if(y){var d=c.childNodes[0],e,h=[];for(e=d.attributes.length-1;0<=e;e--){var m=d.attributes[e].nodeName;var k=d.attributes[e].nodeValue;-1!==m.indexOf(":")&&(h.push({name:m,value:k}),d.removeAttribute(m))}e=0;for(m=h.length;e'+c),c=c.replace(/_dt_b_namespace_token_/g,":"),c=c.replace(/xmlns:NS[\d]+="" NS[\d]+:/g,""));c=c.replace(/<([^<>]*?) xmlns=""([^<>]*?)>/g,"<$1 $2>");a.file(b,c)}})}function r(a,b,d){var c=a.createElement(b);d&&(d.attr&&f(c).attr(d.attr),d.children&&f.each(d.children,function(a,b){c.appendChild(b)}),null!==d.text&&d.text!==w&&c.appendChild(a.createTextNode(d.text))); +return c}function L(a,b){var d=a.header[b].length;a.footer&&a.footer[b].length>d&&(d=a.footer[b].length);for(var c=0,f=a.body.length;cd&&(d=e);if(401*a[1]?!0:!1};try{var C=new XMLSerializer,y}catch(a){}var F={"_rels/.rels":'', +"xl/_rels/workbook.xml.rels":'',"[Content_Types].xml":'', +"xl/workbook.xml":'', +"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''}, +K=[{match:/^\-?\d+\.\d%$/,style:60,fmt:function(a){return a/100}},{match:/^\-?\d+\.?\d*%$/,style:56,fmt:function(a){return a/100}},{match:/^\-?\$[\d,]+.?\d*$/,style:57},{match:/^\-?£[\d,]+.?\d*$/,style:58},{match:/^\-?€[\d,]+.?\d*$/,style:59},{match:/^\-?\d+$/,style:65},{match:/^\-?\d+\.\d{2}$/,style:66},{match:/^\([\d,]+\)$/,style:61,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\([\d,]+\.\d{2}\)$/,style:62,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\-?[\d,]+$/,style:63}, +{match:/^\-?[\d,]+\.\d{2}$/,style:64}];v.ext.buttons.copyHtml5={className:"buttons-copy buttons-html5",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,d,c){this.processing(!0);var g=this;a=I(b,c);var e=b.buttons.exportInfo(c),h=H(c),m=a.str;d=f("
").css({height:1,width:1,overflow:"hidden",position:"fixed",top:0,left:0});e.title&&(m=e.title+h+h+m);e.messageTop&&(m=e.messageTop+h+h+m);e.messageBottom&&(m=m+h+h+e.messageBottom);c.customize&&(m=c.customize(m,c,b));c=f("",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" '; - - echo ''; - - echo '
'; - // Floating menu - End. - ui_require_jquery_file('countdown'); } // Error div for ajax messages. @@ -627,570 +355,293 @@ echo "
"; echo '
'; -if (($section == 'validate') && ($ids[0] == -1)) { - $section = 'list'; - ui_print_error_message(__('No events selected')); +// Controls. +if (is_metaconsole() !== true) { + if (isset($config['event_replication']) + && $config['event_replication'] == 1 + ) { + if ($config['show_events_in_local'] == 0) { + db_pandora_audit( + 'ACL Violation', + 'Trying to access event viewer. View disabled due event replication.' + ); + ui_print_info_message( + [ + 'message' => __( + 'Event viewer is disabled due event replication. For more information, please contact with the administrator' + ), + 'no_close' => true, + ] + ); + return; + } else { + $readonly = true; + } + } } -// Process validation (pass array or single value). -if ($validate) { - $ids = get_parameter('eventid', -1); - $comment = get_parameter('comment', ''); - $new_status = get_parameter('select_validate', 1); - $ids = explode(',', $ids); - $standby_alert = (bool) get_parameter('standby-alert'); +// Load filter form. +// Group. +$user_groups_array = users_get_groups_for_select( + $config['id_user'], + $access, + true, + true, + false +); +$data = html_print_select( + $user_groups_array, + 'id_group_filter', + $id_group_filter, + '', + '', + 0, + true, + false, + false, + 'w130' +); +$in = '
'; +$in .= $data.'
'; +$inputs[] = $in; + +// Event type. +$types = get_event_types(); +$types['not_normal'] = __('Not normal'); +$data = html_print_select( + $types, + 'event_type', + $event_type, + '', + __('All'), + '', + true +); +$in = '
'; +$in .= $data.'
'; +$inputs[] = $in; + +// Criticity - severity. +$severity_select .= html_print_select( + get_priorities(), + 'severity', + $severity, + '', + __('All'), + '-1', + true, + false, + false +); +$in = '
'; +$in .= $severity_select.'
'; +$inputs[] = $in; + +// Event status. +$data = html_print_select( + events_get_all_status(), + 'status', + $status, + '', + '', + '', + true +); +$in = '
'; +$in .= $data.'
'; +$inputs[] = $in; + +// Max hours old. +$data = html_print_input_text( + 'event_view_hr', + $event_view_hr, + '', + 5, + 255, + true +); +$in = '
'; +$in .= $data.'
'; +$inputs[] = $in; + +// Duplicates group { events | agents }. +$data = html_print_select( + [ + __('All events'), + __('Group events'), + __('Group agents'), + ], + 'group_rep', + $group_rep, + '', + '', + 0, + true +); +$in = '
'; +$in .= $data.'
'; +$inputs[] = $in; + +// Source. +$data = html_print_input_text('source', $source, '', 35, 255, true); +$in = '
'; +$in .= $data.'
'; +$inputs[] = $in; + + +// Extra ID. +$data = html_print_input_text('id_extra', $id_extra, '', 11, 255, true); +$in = '
'; +$in .= $data.'
'; +$inputs[] = $in; + +// Comment. +$data = html_print_input_text( + 'user_comment', + $user_comment, + '', + 35, + 255, + true +); +$in = '
'; +$in .= $data.'
'; +$inputs[] = $in; + + +// Advanced filter. +$adv_filter = ''; + +// Load view. +$filter = join('', $inputs); +$filter .= ui_toggle( + $adv_filter, + __('Advanced options'), + '', + '', + true, + true, + 'white_box white_box_opened', + 'no-border' +); + +try { + ui_print_datatable( + [ + 'id' => 'events', + 'class' => 'info_table', + 'style' => 'width: 100%;', + 'ajax_url' => 'operation/events/events', + 'ajax_data' => ['get_events' => 1], + 'pagination_options' => [ + [ + $config['block_size'], + 10, + 25, + 100, + 200, + 500, + 1000, + -1, + ], + [ + $config['block_size'], + 10, + 25, + 100, + 200, + 500, + 1000, + 'All', + ], + ], + 'form' => [ + 'class' => 'flex-row', + 'html' => $filter, + 'inputs' => [], + ], + 'columns' => [ + 'id_evento', + 'id_agente', + // 'id_usuario', + // 'id_grupo', + // 'estado', + 'evento', + 'agent_name', + 'timestamp', + // 'utimestamp', + // 'event_type', + // 'id_agentmodule', + // 'id_alert_am', + 'criticity', + 'user_comment', + 'tags', + // 'source', + // 'id_extra', + // 'critical_instructions', + // 'warning_instructions', + // 'unknown_instructions', + // 'owner_user', + // 'ack_utimestamp', + // 'custom_data', + // 'data', + // 'module_status', + // 'similar_ids', + // 'event_rep', + // 'timestamp_rep', + // 'timestamp_rep_min', + // 'module_name', + ], + 'ajax_postprocess' => ' + function (item) { + item.id_evento = "#"+item.id_evento; + var color = "'.COL_UNKNOWN.'"; + var text = "UNKNOWN"; + switch (item.criticity) { + case "'.EVENT_CRIT_CRITICAL.'": + text = "CRITICAL"; + color = "'.COL_CRITICAL.'"; + break; + + case "'.EVENT_CRIT_MAINTENANCE.'": + text = "MAINTENANCE"; + color = "'.COL_MAINTENANCE.'"; + break; + + case "'.EVENT_CRIT_INFORMATIONAL.'": + text = "INFORMATIONAL"; + color = "'.COL_INFORMATIONAL.'"; + break; + + case "'.EVENT_CRIT_MAJOR.'": + text = "MAJOR"; + color = "'.COL_MAJOR.'"; + break; + + case "'.EVENT_CRIT_MINOR.'": + text = "MINOR"; + color = "'.COL_MINOR.'"; + break; + + case "'.EVENT_CRIT_NORMAL.'": + text = "NORMAL"; + color = "'.COL_NORMAL.'"; + break; + + case "'.EVENT_CRIT_WARNING.'": + text = "WARNING"; + color = "'.COL_WARNING.'"; + break; - // Avoid to re-set inprocess events. - if ($new_status == 2) { - foreach ($ids as $key => $id) { - $event = events_get_event($id); - if ($event['estado'] == 2) { - unset($ids[$key]); } - } - } - - if (isset($ids[0]) && $ids[0] != -1) { - $return = events_change_status($ids, $new_status, $meta); - - if ($new_status == 1) { - ui_print_result_message( - $return, - __('Successfully validated'), - __('Could not be validated') - ); - } else if ($new_status == 2) { - ui_print_result_message( - $return, - __('Successfully set in process'), - __('Could not be set in process') - ); - } - } -} - -// Process deletion (pass array or single value). -if ($delete) { - $ids = (array) get_parameter('validate_ids', -1); - - // Discard deleting in progress events. - $in_process_status = db_get_all_rows_sql( - ' - SELECT id_evento - FROM tevento - WHERE estado=2' + item.criticity = \'
\' + text + "
"; + }', + ] ); - - foreach ($in_process_status as $val) { - if (($key = array_search($val['id_evento'], $ids)) !== false) { - unset($ids[$key]); - } - } - - if ($ids[0] != -1) { - $return = events_delete_event($ids, ($group_rep == 1), $meta); - ui_print_result_message( - $return, - __('Successfully deleted'), - __('Could not be deleted') - ); - } - - include_once $config['homedir'].'/operation/events/events_list.php'; -} else { - switch ($section) { - case 'list': - case 'history': - include_once $config['homedir'].'/operation/events/events_list.php'; - break; - } +} catch (Exception $e) { + ui_print_error_message($e->getMessage()); } -echo "
"; -echo "
"; -echo "
"; - -ui_require_jquery_file('bgiframe'); -ui_require_javascript_file('pandora_events'); +// Close viewer. enterprise_hook('close_meta_frame'); -ui_require_javascript_file('wz_jsgraphics'); -ui_require_javascript_file('pandora_visual_console'); - -$ignored_params['refresh'] = ''; -?> - \ No newline at end of file From 419a90d69c3f5615b70c11981968ab496a0e0b4d Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 7 Jun 2019 17:35:13 +0200 Subject: [PATCH 056/460] wip event list --- pandora_console/include/functions.php | 41 ++ pandora_console/include/functions_events.php | 27 +- pandora_console/include/functions_html.php | 45 +- pandora_console/include/functions_ui.php | 63 +- pandora_console/include/styles/events.css | 104 +++- pandora_console/include/styles/pandora.css | 4 + pandora_console/operation/events/events.php | 610 +++++++++++++++++-- 7 files changed, 808 insertions(+), 86 deletions(-) diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index f299153da6..991f5ccfcc 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -902,6 +902,47 @@ function set_cookie($name, $value) } +/** + * Returns database ORDER clause from datatables AJAX call. + * + * @param boolean $as_array Return as array or as string. + * + * @return string Order or empty. + */ +function get_datatable_order($as_array=false) +{ + $order = get_parameter('order'); + + if (is_array($order)) { + $column = $order[0]['column']; + $direction = $order[0]['dir']; + } + + if (!isset($column) || !isset($direction)) { + return ''; + } + + $columns = get_parameter('columns'); + + if (is_array($columns)) { + $column_name = $columns[$column]['data']; + } + + if (!isset($column_name)) { + return ''; + } + + if ($as_array) { + return [ + 'direction' => $direction, + 'field' => $column_name, + ]; + } + + return $column_name.' '.$direction; +} + + /** * Get a parameter from a request. * diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 411267aa2c..f082f8611a 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -69,6 +69,22 @@ function events_get_all_fields() } +/** + * Creates SQL from filter (array) options. + * + * @param array $filter Filters. + * + * @return string DB sql filter for where clause. + */ +function events_sql_db_filter($filter) +{ + if (!isset($filter) || is_array($filter)) { + return ''; + } + +} + + /** * Get all rows of events from the database, that * pass the filter, and can get only some fields. @@ -251,7 +267,8 @@ function events_get_events_grouped( (SELECT criticity FROM %s WHERE id_evento = MAX(te.id_evento)) AS criticity, (SELECT ack_utimestamp FROM %s WHERE id_evento = MAX(te.id_evento)) AS ack_utimestamp, (SELECT nombre FROM tagente_modulo WHERE id_agente_modulo = te.id_agentmodule) AS module_name, - (SELECT alias FROM tagente WHERE id_agente = te.id_agente) agent_name + (SELECT alias FROM tagente WHERE id_agente = te.id_agente) agent_name, + te.id_agente FROM %s te %s WHERE 1=1 %s GROUP BY estado, evento, id_agente, id_agentmodule %s ', @@ -5321,11 +5338,15 @@ function events_get_sql_order($sort_field='timestamp', $sort='DESC', $group_rep= break; default: - // Ignore. + $sort_field_translated = $sort_field; break; } - $dir = ($sort == 'up') ? 'ASC' : 'DESC'; + if (strtolower($sort) != 'asc' && strtolower($sort) != 'desc') { + $dir = ($sort == 'up') ? 'ASC' : 'DESC'; + } else { + $dir = $sort; + } return 'ORDER BY '.$sort_field_translated.' '.$dir; } diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index c63ce23d3a..6fe4e7a043 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -1241,7 +1241,9 @@ function html_print_input_text_extended($name, $value, $id, $alt, $size, $maxlen $maxlength = 255; } - if ($size == 0) { + if ($size === false) { + $size = ''; + } else if ($size == 0) { $size = 10; } @@ -1441,7 +1443,9 @@ function html_print_input_password( $maxlength = 255; } - if ($size == 0) { + if ($size === false) { + $size = false; + } else if ($size == 0) { $size = 10; } @@ -1479,7 +1483,9 @@ function html_print_input_text($name, $value, $alt='', $size=50, $maxlength=255, $maxlength = 255; } - if ($size == 0) { + if ($size === false) { + $size = false; + } else if ($size == 0) { $size = 10; } @@ -2730,20 +2736,22 @@ function html_html2rgb($htmlcolor) /** * Print a magic-ajax control to select the module. * - * @param string $name The name of ajax control, by default is "module". - * @param string $default The default value to show in the ajax control. - * @param array $id_agents The array list of id agents as array(1,2,3), by default is false and the function use all agents (if the ACL desactive). - * @param boolean $ACL Filter the agents by the ACL list of user. - * @param string $scriptResult The source code of script to call, by default is - * empty. And the example is: - * function (e, data, formatted) { - * ... - * } + * @param string $name The name of ajax control, by default is "module". + * @param string $default The default value to show in the ajax control. + * @param array $id_agents The array list of id agents as array(1,2,3), by default is false and the function use all agents (if the ACL desactive). + * @param boolean $ACL Filter the agents by the ACL list of user. + * @param string $scriptResult The source code of script to call, by default is + * empty. And the example is: + * function (e, data, formatted) { + * ... + * } * - * And the formatted is the select item as string. + * And the formatted is the select item as string. * - * @param array $filter Other filter of modules. - * @param boolean $return If it is true return a string with the output instead to echo the output. + * @param array $filter Other filter of modules. + * @param boolean $return If it is true return a string with the output instead to echo the output. + * @param integer $id_agent_module Id agent module. + * @param string $size Size. * * @return mixed If the $return is true, return the output as string. */ @@ -2755,7 +2763,8 @@ function html_print_autocomplete_modules( $scriptResult='', $filter=[], $return=false, - $id_agent_module=0 + $id_agent_module=0, + $size='30' ) { global $config; @@ -2796,7 +2805,7 @@ function html_print_autocomplete_modules( $default, 'text-'.$name, '', - 30, + $size, 100, false, '', @@ -3055,4 +3064,4 @@ function html_print_link_with_params($text, $params=[], $type='text', $style='') $html .= ''; return $html; -} \ No newline at end of file +} diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 17519d8eed..827a432b1a 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2769,8 +2769,13 @@ function ui_progress( * 'id' => datatable id. * 'class' => datatable class. * 'style' => datatable style. - * 'order' => '9, "desc"'. Column index (starting by 1) and sort direction. + * 'order' => [ + * 'field' => column name + * 'direction' => asc or desc + * ], + * 'default_pagination' => integer, default pagination is set to block_size * 'ajax_url' => 'include/ajax.php' ajax_url. + * 'ajax_data' => [ operation => 1 ] extra info to be sent. * 'ajax_postprocess' => a javscript function to postprocess data received * by ajax call. It is applied foreach row and must * use following format: @@ -2781,7 +2786,7 @@ function ui_progress( * * item.name = tmp; * * } * * [/code] - * 'columns' => [ + * 'columns_names' => [ * 'column1' :: Used as th text. Direct text entry. It could be array: * OR * [ @@ -2791,7 +2796,7 @@ function ui_progress( * 'text' => 'column1'. * ] * ], - * 'datacolumns' => [ + * 'columns' => [ * 'column1', * 'column2', * ... @@ -2824,18 +2829,43 @@ function ui_progress( */ function ui_print_datatable(array $parameters) { + global $config; + if (isset($parameters['id'])) { $table_id = $parameters['id']; } else { $table_id = uniqid('datatable_'); } - if (!isset($parameters['order'])) { - $parameters['order'] = '0, "asc"'; + if (!isset($parameters['columns']) || !is_array($parameters['columns'])) { + throw new Exception('[ui_print_datatable]: You must define columns for datatable'); } if (!isset($parameters['ajax_url'])) { - throw new Exception('Parameter ajax_url is required'); + throw new Exception('[ui_print_datatable]: Parameter ajax_url is required'); + } + + if (!isset($parameters['default_pagination'])) { + $parameters['default_pagination'] = $config['block_size']; + } + + if (!is_array($parameters['order'])) { + $order = '0, "asc"'; + } else { + if (!isset($parameters['order']['direction'])) { + $direction = 'asc'; + } + + if (!isset($parameters['order']['field'])) { + $order = 1; + } else { + $order = array_search( + $parameters['order']['field'], + $parameters['columns'] + ); + } + + $order .= ', "'.$parameters['order']['direction'].'"'; } if (!isset($parameters['ajax_data'])) { @@ -2852,6 +2882,7 @@ function ui_print_datatable(array $parameters) } else { $pagination_options = [ [ + $parameters['default_pagination'], 10, 25, 100, @@ -2861,6 +2892,7 @@ function ui_print_datatable(array $parameters) -1, ], [ + $parameters['default_pagination'], 10, 25, 100, @@ -2970,20 +3002,21 @@ function ui_print_datatable(array $parameters) ); } - if (!isset($parameters['columns']) || !is_array($parameters['columns'])) { - throw new Exception('[ui_print_datatable]: You must define columns for datatable'); - } - // Base table. $table = ''; $table .= ''; - if (!is_array($parameters['columns'])) { - throw new Exception('[ui_print_datatable]: Parameter columns is required.'); + + if (isset($parameters['column_names']) + && is_array($parameters['column_names']) + ) { + $names = $parameters['column_names']; + } else { + $names = $parameters['columns']; } - foreach ($parameters['columns'] as $column) { + foreach ($names as $column) { if (is_array($column)) { $table .= ''; $table .= '
'.__($column['text']); @@ -3004,7 +3037,7 @@ function ui_print_datatable(array $parameters) processing: true, serverSide: true, paging: true, - pageLength: 10, + pageLength: '.$parameters['default_pagination'].', searching: false, responsive: true, dom: "lBfrtip", @@ -3071,7 +3104,7 @@ function ui_print_datatable(array $parameters) $js .= ' ], - order: [[ '.$parameters['order'].' ]] + order: [[ '.$order.' ]] }); $("#'.$form_id.'_search_bt").click(function (){ diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index 61379d2641..648f8a706e 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -19,8 +19,16 @@ div.mini-criticity { display: inline-block; } -form.flex-row > div.filter_input, -form.flex-row > ul { +div.mini-criticity.h100p { + height: 100%; +} + +.flex-row.event { + align-items: center; +} + +form.flex-row div.filter_input, +form.flex-row ul { width: 30%; min-width: 300px; display: flex; @@ -28,16 +36,40 @@ form.flex-row > ul { align-items: baseline; flex-wrap: wrap; align-content: center; + justify-content: space-between; flex: 1; - - margin: 1em 0.3em; + margin: 0.5em 3em 0.5em 0; } + +div.filter_input_little { + flex: 1; + display: flex; + flex-direction: row; + align-items: baseline; + flex-wrap: nowrap; + margin: 0.5em 0 0.5em 1em; +} + +form.flex-row div.filter_input.large { + flex: 1; + min-width: 650px; +} + +div.filter_input > label, +div.filter_input_little > label { + width: 10em; +} + form.flex-row > ul, form.flex-row > ul > li, form.flex-row > .box-shadow.white_table_graph { width: 100%; } +form.flex-row > .box-shadow.white_table_graph { + margin-top: 2em; +} + form.flex-row > ul input[type="submit"] { float: right; } @@ -45,3 +77,67 @@ form.flex-row > ul input[type="submit"] { form.flex-row > div > label { margin-right: 1em; } + +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} + +.info_table.events tr > th { + padding-left: 1em; + font-size: 1.3em; + font-weight: 400; + border-bottom: 2px solid #878787; + cursor: pointer; +} + +.info_table.events tr > td { + height: 2.5em; +} + +.sorting_desc { + background: url(http://localhost/pandora_console/images/sort_down_green.png) + no-repeat; + background-position-x: left; + background-position-y: center; +} +.sorting_asc { + background: url(http://localhost/pandora_console/images/sort_up_green.png) + no-repeat; + background-position-x: left; + background-position-y: center; +} + +.info_table.events > tbody > tr > td { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + border: none; + padding-left: 0px; + padding-right: 9px; + padding-top: 7px; + padding-bottom: 7px; + border-bottom: 2px solid #dedede; +} + +.info_table.events tr > td:first-child { + padding-left: 5px; + padding-top: 0; + vertical-align: middle; + padding-bottom: 0; +} + +.filter_input { + align-items: center; +} + +.filter_input_little > select, +.filter_input_little > input, +.filter_input > select, +.filter_input > input { + flex: 1; +} + +fieldset { + margin: 0 auto; +} diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 88122fbe94..5034d60069 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -504,6 +504,10 @@ select:-internal-list-box { align-content: center; } +.nowrap { + flex-wrap: nowrap; +} + .padding-2 { padding: 2em; } diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 59f5c0bebb..606eab7804 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -80,10 +80,7 @@ $event_view_hr = get_parameter('filter[event_view_hr]', 8); $id_user_ack = get_parameter('filter[id_user_ack]'); $group_rep = get_parameter('filter[group_rep]'); $tag_with = get_parameter('filter[tag_with]', io_json_mb_encode([])); -$tag_without = get_parameter( - 'filter[tag_without]', - io_json_mb_encode([]) -); +$tag_without = get_parameter('filter[tag_without]', io_json_mb_encode([])); $filter_only_alert = get_parameter('filter[filter_only_alert]'); $id_group_filter = get_parameter('filter[id_group_filter]'); $date_from = get_parameter('filter[date_from]'); @@ -92,6 +89,182 @@ $source = get_parameter('filter[source]'); $id_extra = get_parameter('filter[id_extra]'); $user_comment = get_parameter('filter[user_comment]'); + +// TAGS. +$tags_select_with = []; +$tags_select_without = []; +$tag_with_temp = []; +$tag_without_temp = []; +foreach ($tags as $id_tag => $tag) { + if ((array_search($id_tag, $tag_with) === false) + || (array_search($id_tag, $tag_with) === null) + ) { + $tags_select_with[$id_tag] = ui_print_truncate_text($tag, 50, true); + } else { + $tag_with_temp[$id_tag] = ui_print_truncate_text($tag, 50, true); + } + + if ((array_search($id_tag, $tag_without) === false) + || (array_search($id_tag, $tag_without) === null) + ) { + $tags_select_without[$id_tag] = ui_print_truncate_text($tag, 50, true); + } else { + $tag_without_temp[$id_tag] = ui_print_truncate_text($tag, 50, true); + } +} + +$add_with_tag_disabled = empty($tags_select_with); +$remove_with_tag_disabled = empty($tag_with_temp); +$add_without_tag_disabled = empty($tags_select_without); +$remove_without_tag_disabled = empty($tag_without_temp); + +$tabletags_with = html_get_predefined_table('transparent', 2); +$tabletags_with->id = 'filter_events_tags_with'; +$tabletags_with->width = '100%'; +$tabletags_with->cellspacing = 4; +$tabletags_with->cellpadding = 4; +$tabletags_with->class = 'noshadow'; +$tabletags_with->styleTable = 'border: 0px;'; +if (defined('METACONSOLE')) { + $tabletags_with->class = 'nobady'; + $tabletags_with->cellspacing = 0; + $tabletags_with->cellpadding = 0; +} + + +$data = []; + +$data[0] = html_print_select( + $tags_select_with, + 'select_with', + '', + '', + '', + 0, + true, + true, + true, + '', + false, + 'width: 200px;' +); + +$data[1] = html_print_image( + 'images/darrowright.png', + true, + [ + 'id' => 'button-add_with', + 'style' => 'cursor: pointer;', + 'title' => __('Add'), + ] +); + +$data[1] .= html_print_input_hidden( + 'tag_with', + $tag_with_base64, + true +); + +$data[1] .= '

'.html_print_image( + 'images/darrowleft.png', + true, + [ + 'id' => 'button-remove_with', + 'style' => 'cursor: pointer;', + 'title' => __('Remove'), + ] +); + +$data[2] = html_print_select( + $tag_with_temp, + 'tag_with_temp', + [], + '', + '', + 0, + true, + true, + true, + '', + false, + 'width: 200px;' +); + +$tabletags_with->data[] = $data; +$tabletags_with->rowclass[] = ''; + + +$tabletags_without = html_get_predefined_table('transparent', 2); +$tabletags_without->id = 'filter_events_tags_without'; +$tabletags_without->width = '100%'; +$tabletags_without->cellspacing = 4; +$tabletags_without->cellpadding = 4; +$tabletags_without->class = 'noshadow'; +if (defined('METACONSOLE')) { + $tabletags_without->class = 'nobady'; + $tabletags_without->cellspacing = 0; + $tabletags_without->cellpadding = 0; +} + +$tabletags_without->styleTable = 'border: 0px;'; + +$data = []; +$data[0] = html_print_select( + $tags_select_without, + 'select_without', + '', + '', + '', + 0, + true, + true, + true, + '', + false, + 'width: 200px;' +); +$data[1] = html_print_image( + 'images/darrowright.png', + true, + [ + 'id' => 'button-add_without', + 'style' => 'cursor: pointer;', + 'title' => __('Add'), + ] +); +$data[1] .= html_print_input_hidden( + 'tag_without', + $tag_without_base64, + true +); +$data[1] .= '

'.html_print_image( + 'images/darrowleft.png', + true, + [ + 'id' => 'button-remove_without', + 'style' => 'cursor: pointer;', + 'title' => __('Remove'), + ] +); +$data[2] = html_print_select( + $tag_without_temp, + 'tag_without_temp', + [], + '', + '', + 0, + true, + true, + true, + '', + false, + 'width: 200px;' +); +$tabletags_without->data[] = $data; +$tabletags_without->rowclass[] = ''; + + +// END OF TAGS. // Datatables offset, limit. $start = get_parameter('start', 0); $length = get_parameter('length', $config['block_size']); @@ -111,8 +284,11 @@ if (is_ajax()) { $update_event_filter = get_parameter('update_event_filter', 0); $get_event_filters = get_parameter('get_event_filters', 0); $get_events = get_parameter('get_events', 0); + $filter = get_parameter('filter', []); if ($get_events) { + $order = get_datatable_order(true); + $sql_post = ' AND te.utimestamp > UNIX_TIMESTAMP(now() - INTERVAL '.$event_view_hr.' hour)'; $events = events_get_events_grouped( // Sql_post. @@ -126,7 +302,13 @@ if (is_ajax()) { // History. false, // Total. - false + false, + // History db. + false, + // Order. + $order['direction'], + // Sort field. + $order['field'] ); if ($events) { @@ -380,7 +562,10 @@ if (is_metaconsole() !== true) { } } -// Load filter form. +/* + * Load filter form. + */ + // Group. $user_groups_array = users_get_groups_for_select( $config['id_user'], @@ -483,7 +668,7 @@ $in .= $data.''; $inputs[] = $in; // Source. -$data = html_print_input_text('source', $source, '', 35, 255, true); +$data = html_print_input_text('source', $source, '', '', 255, true); $in = '
'; $in .= $data.'
'; $inputs[] = $in; @@ -500,7 +685,7 @@ $data = html_print_input_text( 'user_comment', $user_comment, '', - 35, + '', 255, true ); @@ -509,10 +694,229 @@ $in .= $data.''; $inputs[] = $in; -// Advanced filter. -$adv_filter = ''; +/* + * Advanced filter. + */ + +$adv_inputs = []; + +// Free search. +$data = html_print_input_text('search', $search, '', '', 255, true); +$in = '
'; +$in .= $data.'
'; +$adv_inputs[] = $in; + +// Agent search. +$params = []; +$params['show_helptip'] = true; +$params['input_name'] = 'text_agent'; +$params['value'] = $text_agent; +$params['return'] = true; + +if ($meta) { + $params['javascript_page'] = 'enterprise/meta/include/ajax/events.ajax'; +} + +$params['print_hidden_input_idagent'] = true; +$params['hidden_input_idagent_name'] = 'id_agent'; +$params['hidden_input_idagent_value'] = $id_agent; +$params['size'] = ''; + +$data = ui_print_agent_autocomplete_input($params); +$in = '
'; +$in .= $data.'
'; +$adv_inputs[] = $in; + +// Mixed. Metaconsole => server, Console => module. +if (is_metaconsole()) { + $title = __('Server'); + $data = html_print_select_from_sql( + 'SELECT id, server_name FROM tmetaconsole_setup', + 'server_id', + $server_id, + 'script', + __('All'), + '0', + true + ); +} else { + $title = __('Module search'); + $data = html_print_autocomplete_modules( + 'module_search', + $text_module, + false, + true, + '', + [], + true, + $id_agent_module, + '' + ); +} + +$in = '
'; +$in .= $data.'
'; +$adv_inputs[] = $in; + +// User ack. +$user_users = users_get_user_users( + $config['id_user'], + $access, + users_can_manage_group_all() +); + +$data = html_print_select( + $user_users, + 'id_user_ack', + $id_user_ack, + '', + __('Any'), + 0, + true +); +$in = '
'; +$in .= $data.'
'; +$adv_inputs[] = $in; + +// Only alert events. +$data = html_print_select( + [ + '-1' => __('All'), + '0' => __('Filter alert events'), + '1' => __('Only alert events'), + ], + 'filter_only_alert', + $filter_only_alert, + '', + '', + '', + true +); +$in = '
'; +$in .= $data.'
'; +$adv_inputs[] = $in; + +// Gap. +$adv_inputs[] = '
'; + +// Date from. +$data = html_print_input_text( + 'date_from', + $date_from, + '', + false, + 10, + true, + // Disabled. + false, + // Required. + false, + // Function. + '', + // Class. + '', + // OnChange. + '', + // Autocomplete. + 'off' +); +$in = '
'; +$in .= '
'; +$in .= $data.'
'; + +// Time from. +$data = html_print_input_text( + 'time_from', + $time_from, + '', + false, + 10, + true, + // Disabled. + false, + // Required. + false, + // Function. + '', + // Class. + '', + // OnChange. + '', + // Autocomplete. + 'off' +); +$in .= '
'; +$in .= $data.'
'; +$in .= '
'; +$adv_inputs[] = $in; + +// Date to. +$data = html_print_input_text( + 'date_to', + $date_to, + '', + false, + 10, + true, + // Disabled. + false, + // Required. + false, + // Function. + '', + // Class. + '', + // OnChange. + '', + // Autocomplete. + 'off' +); +$in = '
'; +$in .= '
'; +$in .= $data.'
'; + +// Time to. +$data = html_print_input_text( + 'time_to', + $time_to, + '', + false, + 10, + true, + // Disabled. + false, + // Required. + false, + // Function. + '', + // Class. + '', + // OnChange. + '', + // Autocomplete. + 'off' +); +$in .= '
'; +$in .= $data.'
'; +$in .= '
'; +$adv_inputs[] = $in; + + +// Tags. +if (is_metaconsole()) { + $data = '
'.__('Events with following tags').''.html_print_table($tabletags_with, true).'
'; + $data .= '
'.__('Events without following tags').''.html_print_table($tabletags_without, true).'
'; +} else { + $data = '
'.__('Events with following tags').''.html_print_table($tabletags_with, true).'
'; + $data .= '
'.__('Events without following tags').''.html_print_table($tabletags_without, true).'
'; +} + +$in = '
'; +$in .= $data.'
'; +$adv_inputs[] = $in; // Load view. +$adv_filter = join('', $adv_inputs); $filter = join('', $inputs); $filter .= ui_toggle( $adv_filter, @@ -522,14 +926,55 @@ $filter .= ui_toggle( true, true, 'white_box white_box_opened', - 'no-border' + 'no-border flex-row' ); try { + $column_names = [ + __('Event'), + __('Event ID'), + __('Agent name'), + __('Timestamp'), + __('Severity'), + __('Options'), + ]; + $fields = [ + 'evento', + 'id_evento', + // 'id_agente', + // 'id_usuario', + // 'id_grupo', + // 'estado', + 'agent_name', + 'timestamp', + // 'utimestamp', + // 'event_type', + // 'id_agentmodule', + // 'id_alert_am', + 'event_type', + // 'user_comment', + // 'tags', + // 'source', + // 'id_extra', + // 'critical_instructions', + // 'warning_instructions', + // 'unknown_instructions', + // 'owner_user', + // 'ack_utimestamp', + // 'custom_data', + // 'data', + // 'module_status', + // 'similar_ids', + // 'event_rep', + // 'timestamp_rep', + // 'timestamp_rep_min', + // 'module_name', + 'options', + ]; ui_print_datatable( [ 'id' => 'events', - 'class' => 'info_table', + 'class' => 'info_table events', 'style' => 'width: 100%;', 'ajax_url' => 'operation/events/events', 'ajax_data' => ['get_events' => 1], @@ -560,38 +1005,12 @@ try { 'html' => $filter, 'inputs' => [], ], - 'columns' => [ - 'id_evento', - 'id_agente', - // 'id_usuario', - // 'id_grupo', - // 'estado', - 'evento', - 'agent_name', - 'timestamp', - // 'utimestamp', - // 'event_type', - // 'id_agentmodule', - // 'id_alert_am', - 'criticity', - 'user_comment', - 'tags', - // 'source', - // 'id_extra', - // 'critical_instructions', - // 'warning_instructions', - // 'unknown_instructions', - // 'owner_user', - // 'ack_utimestamp', - // 'custom_data', - // 'data', - // 'module_status', - // 'similar_ids', - // 'event_rep', - // 'timestamp_rep', - // 'timestamp_rep_min', - // 'module_name', + 'order' => [ + 'field' => 'timestamp', + 'direction' => 'desc', ], + 'column_names' => $column_names, + 'columns' => $fields, 'ajax_postprocess' => ' function (item) { item.id_evento = "#"+item.id_evento; @@ -632,10 +1051,78 @@ try { text = "WARNING"; color = "'.COL_WARNING.'"; break; - } - item.criticity = \'
\' + text + "
"; + output = \'
\'; + output += \'
\'; + + evn = \'
\'; + evn += \'
\'+item.evento+\'
\'; + evn += output; + evn += \'
\' + + item.evento = evn; + + + // Event type. + switch (item.event_type) { + case "'.EVENTS_ALERT_FIRED.'": + case "'.EVENTS_ALERT_RECOVERED.'": + case "'.EVENTS_ALERT_CEASED.'": + case "'.EVENTS_ALERT_MANUAL_VALIDATION.'": + text = "'.__('ALERT').'"; + color = "'.COL_ALERTFIRED.'"; + break; + + case "'.EVENTS_RECON_HOST_DETECTED.'": + case "'.EVENTS_SYSTEM.'": + case "'.EVENTS_ERROR.'": + case "'.EVENTS_NEW_AGENT.'": + case "'.EVENTS_CONFIGURATION_CHANGE.'": + text = "'.__('SYSTEM').'"; + color = "'.COL_MAINTENANCE.'"; + break; + + case "'.EVENTS_GOING_UP_WARNING.'": + case "'.EVENTS_GOING_DOWN_WARNING.'": + $tex = "'.__('WARNING').'"; + color = "'.COL_WARNING.'"; + break; + + case "'.EVENTS_GOING_DOWN_NORMAL.'": + case "'.EVENTS_GOING_UP_NORMAL.'": + text = "'.__('NORMAL').'"; + color = "'.COL_NORMAL.'"; + break; + + case "'.EVENTS_GOING_DOWN_CRITICAL.'": + case "'.EVENTS_GOING_UP_CRITICAL.'": + text = "'.__('CRITICAL').'"; + color = "'.COL_CRITICAL.'"; + break; + + case "'.EVENTS_UNKNOWN.'": + case "'.EVENTS_GOING_UNKNOWN.'": + default: + text = "'.__('UNKNOWN').'"; + color = "'.COL_UNKNOWN.'"; + break; + } + + item.event_type = \'
\' + text + "
"; + + console.log(item); + + if (item.id_agente > 0) { + item.agent_name = \'\' + item.agent_name + \'\'; + } + + + item.options = \'button\'; }', ] ); @@ -645,3 +1132,34 @@ try { // Close viewer. enterprise_hook('close_meta_frame'); + +// Datepicker requirements. +ui_require_css_file('datepicker'); +ui_include_time_picker(); +ui_require_jquery_file( + 'ui.datepicker-'.get_user_language(), + 'include/javascript/i18n/' +); +?> + From d4d450926697d83a406a84cdd576979d26074720 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 7 Jun 2019 21:22:07 +0200 Subject: [PATCH 057/460] wip event view --- pandora_console/include/functions_events.php | 192 ++++- pandora_console/include/styles/events.css | 2 +- pandora_console/include/styles/tables.css | 5 + pandora_console/operation/events/events.php | 804 ++++++++++++++++++- 4 files changed, 923 insertions(+), 80 deletions(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index f082f8611a..41a2d76bc4 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -85,6 +85,145 @@ function events_sql_db_filter($filter) } +/** + * Retrieve all events filtered. + * + * @param array $fields Fields to retrieve. + * @param array $filter Filters to be applied. + * @param integer $limit Limit (pagination). + * @param integer $offset Offset (pagination). + * + * @return array Events. + * @throws Exception On error. + */ +function events_get_all( + $fields, + array $filter, + $offset=null, + $limit=null, + $order=null, + $sort_field=null +) { + global $config; + + if (!is_array($filter)) { + throw new Exception('[events_get_all] Filter must be an array.'); + } + + $count = false; + if (!is_array($fields) && $fields == 'count') { + $fields = ['te.*']; + $count = true; + } else if (!is_array($fields)) { + throw new Exception('[events_get_all] Fields must be an array or "count".'); + } + + $hour_filter = ''; + if (isset($filter['event_view_hr'])) { + $hour_filter = sprintf( + ' AND utimestamp > UNIX_TIMESTAMP(now() - INTERVAL %d HOUR) ', + $filter['event_view_hr'] + ); + } + + $agent_id_filter = ''; + if (isset($filter['id_agent']) && $filter['id_agent'] > 0) { + $agent_id_filter = sprintf( + ' AND id_agente = %d ', + $filter['id_agent'] + ); + } + + $table = events_get_events_table($meta, $history); + + $tevento = sprintf( + '(SELECT * + FROM %s + WHERE 1=1 %s %s) te', + $table, + $hour_filter, + $agent_id_filter + ); + + $agent_name_filter = ''; + if (!empty($filter['agent_alias'])) { + $agent_name_filter = sprintf( + ' AND ta.alias = "%s" ', + $filter['agent_alias'] + ); + } + + $order_by = ''; + if (isset($order, $sort_field)) { + $order_by = events_get_sql_order($sort_field, $order); + } + + $pagination = ''; + if (isset($limit, $offset)) { + $pagination = sprintf(' LIMIT %d OFFSET %d', $limit, $offset); + } + + $extra = ''; + if (is_metaconsole()) { + $extra = ', server_id'; + } + + $group_by = 'GROUP BY '; + $tagente_join = 'LEFT'; + switch ($filter['group_rep']) { + case '0': + default: + // All events. + $group_by = ''; + break; + + case '1': + // Group by events. + $group_by .= 'estado, evento, id_agente, id_agentmodule'; + $group_by .= $extra; + break; + + case '2': + // Group by agents. + $tagente_join = 'INNER'; + $group_by .= 'te.id_agente, te.event_type'; + $group_by .= $extra; + break; + } + + // Secondary groups. + db_process_sql('SET group_concat_max_len = 9999999'); + $event_lj = events_get_secondary_groups_left_join($table); + + $sql = sprintf( + 'SELECT %s + FROM %s + %s JOIN tagente ta + ON ta.id_agente = te.id_agente + %s + %s + WHERE 1=1 + %s + %s + %s + ', + join(',', $fields), + $tevento, + $tagente_join, + $event_lj, + $filter_extra_agents, + $group_by, + $order_by, + $pagination + ); + if ($count) { + $sql = 'SELECT count(*) as nitems FROM ('.$sql.') tt'; + } + + return db_get_all_rows_sql($sql); +} + + /** * Get all rows of events from the database, that * pass the filter, and can get only some fields. @@ -244,49 +383,30 @@ function events_get_events_grouped( db_process_sql('SET group_concat_max_len = 9999999'); $event_lj = events_get_secondary_groups_left_join($table); if ($total) { - $sql = sprintf( - 'SELECT COUNT(*) FROM (SELECT id_evento - FROM %s te %s - WHERE 1=1 %s - GROUP BY estado, evento, id_agente, id_agentmodule %s) AS t ', - $table, - $event_lj, - $sql_post, - $groupby_extra - ); + $sql = "SELECT COUNT(*) FROM (SELECT id_evento + FROM $table te $event_lj + WHERE 1=1 ".$sql_post.' + GROUP BY estado, evento, id_agente, id_agentmodule'.$groupby_extra.') AS t'; } else { - $sql = sprintf( - 'SELECT *, MAX(id_evento) AS id_evento, - GROUP_CONCAT(DISTINCT user_comment SEPARATOR "
") AS user_comment, - GROUP_CONCAT(DISTINCT id_evento SEPARATOR ",") AS similar_ids, + $sql = "SELECT *, MAX(id_evento) AS id_evento, + GROUP_CONCAT(DISTINCT user_comment SEPARATOR '
') AS user_comment, + GROUP_CONCAT(DISTINCT id_evento SEPARATOR ',') AS similar_ids, COUNT(id_evento) AS event_rep, MAX(utimestamp) AS timestamp_rep, MIN(utimestamp) AS timestamp_rep_min, - (SELECT owner_user FROM %s WHERE id_evento = MAX(te.id_evento)) owner_user, - (SELECT id_usuario FROM %s WHERE id_evento = MAX(te.id_evento)) id_usuario, - (SELECT id_agente FROM %s WHERE id_evento = MAX(te.id_evento)) id_agente, - (SELECT criticity FROM %s WHERE id_evento = MAX(te.id_evento)) AS criticity, - (SELECT ack_utimestamp FROM %s WHERE id_evento = MAX(te.id_evento)) AS ack_utimestamp, - (SELECT nombre FROM tagente_modulo WHERE id_agente_modulo = te.id_agentmodule) AS module_name, - (SELECT alias FROM tagente WHERE id_agente = te.id_agente) agent_name, - te.id_agente - FROM %s te %s - WHERE 1=1 %s - GROUP BY estado, evento, id_agente, id_agentmodule %s ', - $table, - $table, - $table, - $table, - $table, - $table, - $event_lj, - $sql_post, - $groupby_extra - ); + (SELECT owner_user FROM $table WHERE id_evento = MAX(te.id_evento)) owner_user, + (SELECT id_usuario FROM $table WHERE id_evento = MAX(te.id_evento)) id_usuario, + (SELECT id_agente FROM $table WHERE id_evento = MAX(te.id_evento)) id_agente, + (SELECT criticity FROM $table WHERE id_evento = MAX(te.id_evento)) AS criticity, + (SELECT ack_utimestamp FROM $table WHERE id_evento = MAX(te.id_evento)) AS ack_utimestamp, + (SELECT nombre FROM tagente_modulo WHERE id_agente_modulo = te.id_agentmodule) AS module_name + FROM $table te $event_lj + WHERE 1=1 ".$sql_post.' + GROUP BY estado, evento, id_agente, id_agentmodule'.$groupby_extra; $sql .= ' '.events_get_sql_order($sort_field, $order, 2); $sql .= ' LIMIT '.$offset.','.$pagination; } - // Extract the events by filter (or not) from db. + // Extract the events by filter (or not) from db $events = db_get_all_rows_sql($sql, $history_db); if ($total) { diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index 648f8a706e..17759213ce 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -52,7 +52,7 @@ div.filter_input_little { form.flex-row div.filter_input.large { flex: 1; - min-width: 650px; + min-width: 470px; } div.filter_input > label, diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index 4cd6052873..5450465638 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -245,3 +245,8 @@ tr.disabled_row_user * { color: grey; } + +/* Disable datatables border */ +table.dataTable.info_table.no-footer { + border-bottom: none; +} diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 606eab7804..5751a5711e 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -79,8 +79,8 @@ $pagination = get_parameter('filter[pagination]'); $event_view_hr = get_parameter('filter[event_view_hr]', 8); $id_user_ack = get_parameter('filter[id_user_ack]'); $group_rep = get_parameter('filter[group_rep]'); -$tag_with = get_parameter('filter[tag_with]', io_json_mb_encode([])); -$tag_without = get_parameter('filter[tag_without]', io_json_mb_encode([])); +$tag_with = get_parameter('filter[tag_with]', []); +$tag_without = get_parameter('filter[tag_without]', []); $filter_only_alert = get_parameter('filter[filter_only_alert]'); $id_group_filter = get_parameter('filter[id_group_filter]'); $date_from = get_parameter('filter[date_from]'); @@ -91,6 +91,9 @@ $user_comment = get_parameter('filter[user_comment]'); // TAGS. +// Get the tags where the user have permissions in Events reading tasks. +$tags = tags_get_user_tags($config['id_user'], $access); + $tags_select_with = []; $tags_select_without = []; $tag_with_temp = []; @@ -125,7 +128,7 @@ $tabletags_with->cellspacing = 4; $tabletags_with->cellpadding = 4; $tabletags_with->class = 'noshadow'; $tabletags_with->styleTable = 'border: 0px;'; -if (defined('METACONSOLE')) { +if (is_metaconsole()) { $tabletags_with->class = 'nobady'; $tabletags_with->cellspacing = 0; $tabletags_with->cellpadding = 0; @@ -200,7 +203,7 @@ $tabletags_without->width = '100%'; $tabletags_without->cellspacing = 4; $tabletags_without->cellpadding = 4; $tabletags_without->class = 'noshadow'; -if (defined('METACONSOLE')) { +if (is_metaconsole()) { $tabletags_without->class = 'nobady'; $tabletags_without->cellspacing = 0; $tabletags_without->cellpadding = 0; @@ -263,12 +266,6 @@ $data[2] = html_print_select( $tabletags_without->data[] = $data; $tabletags_without->rowclass[] = ''; - -// END OF TAGS. -// Datatables offset, limit. -$start = get_parameter('start', 0); -$length = get_parameter('length', $config['block_size']); - if (io_safe_output($tag_with) == '["0"]') { $tag_with = '[]'; } @@ -277,6 +274,11 @@ if (io_safe_output($tag_without) == '["0"]') { $tag_without = '[]'; } +/* + * END OF TAGS. + */ + + // Ajax responses. if (is_ajax()) { $get_filter_values = get_parameter('get_filter_values', 0); @@ -285,31 +287,36 @@ if (is_ajax()) { $get_event_filters = get_parameter('get_event_filters', 0); $get_events = get_parameter('get_events', 0); $filter = get_parameter('filter', []); + // Datatables offset, limit. + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); if ($get_events) { $order = get_datatable_order(true); - $sql_post = ' AND te.utimestamp > UNIX_TIMESTAMP(now() - INTERVAL '.$event_view_hr.' hour)'; - $events = events_get_events_grouped( - // Sql_post. - $sql_post, + $events = events_get_all( + [ + 'te.*', + 'ta.alias as agent_name', + ], + $filter, // Offset. $start, - // Pagination. + // Limit. $length, - // Meta. - false, - // History. - false, - // Total. - false, - // History db. - false, // Order. $order['direction'], // Sort field. $order['field'] ); + $count = events_get_all( + 'count', + $filter + ); + + if ($count !== false) { + $count = $count['0']['nitems']; + } if ($events) { $data = array_reduce( @@ -321,21 +328,6 @@ if (is_ajax()) { ); } - $count = events_get_events_grouped( - // Sql_post. - $sql_post, - // Offset. - $start, - // Pagination. - $length, - // Meta. - false, - // History. - false, - // Total. - true - ); - // RecordsTotal && recordsfiltered resultados totales. echo json_encode( [ @@ -652,9 +644,9 @@ $inputs[] = $in; // Duplicates group { events | agents }. $data = html_print_select( [ - __('All events'), - __('Group events'), - __('Group agents'), + 0 => __('All events'), + 1 => __('Group events'), + 2 => __('Group agents'), ], 'group_rep', $group_rep, @@ -1115,8 +1107,6 @@ try { item.event_type = \'
\' + text + "
"; - console.log(item); - if (item.id_agente > 0) { item.agent_name = \'\' + item.agent_name + \'\'; } @@ -1140,8 +1130,736 @@ ui_require_jquery_file( 'ui.datepicker-'.get_user_language(), 'include/javascript/i18n/' ); + +// End. Load required JS. ?> '; - $output = $filter.$table.$js; + // Order. + $output = $filter.$extra.$table.$js; ui_require_css_file('datatables.min', 'include/styles/js/'); ui_require_javascript_file('datatables.min'); diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index f98e3ff365..13bafabca3 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -146,3 +146,41 @@ fieldset { .event.flex-row.h100p.nowrap div { max-width: 98%; } + +.filter_summary { + margin-bottom: 3em; + height: 3em; +} + +.filter_summary div.label { + background: #878787; + color: #fff; + font-weight: bolder; + border-radius: 5px; + padding: 0.5em; +} +.filter_summary div.content { + padding: 0.5em; +} + +.filter_summary > div { + border: 1px solid #eee; + border-radius: 5px; +} + +.filter_summary div { + float: left; + margin-right: 2em; + text-align: center; + background: #fff; +} + +#events_processing { + background: #dedede; + font-size: 3em; + height: auto; + padding: 2em; + color: #777; + border: none; + margin-top: -2em; +} diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index 5450465638..6ded48262b 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -250,3 +250,14 @@ tr.disabled_row_user * { table.dataTable.info_table.no-footer { border-bottom: none; } + +/* Datatables pagination */ +.dataTables_paginate.paging_simple_numbers { +} + +.dataTables_wrapper .dataTables_paginate .paginate_button.current, +.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #fff; + background-color: #82b92e; + border-color: #82b92e; +} diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index c2e8f84a34..fdc4d4e4a1 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -66,17 +66,20 @@ $access = ($event_a == true) ? 'ER' : (($event_w == true) ? 'EW' : (($event_m == // Load specific stylesheet. ui_require_css_file('events'); +// Load extra javascript. +ui_require_javascript_file('pandora_events'); + // Get requests. $id_group = get_parameter('filter[id_group]'); $event_type = get_parameter('filter[event_type]'); $severity = get_parameter('filter[severity]'); -$status = get_parameter('filter[status]'); +$status = get_parameter('filter[status]', EVENT_NO_VALIDATED); $search = get_parameter('filter[search]'); $text_agent = get_parameter('filter[text_agent]'); $id_agent = get_parameter('filter[id_agent]'); $id_agent_module = get_parameter('filter[id_agent_module]'); $pagination = get_parameter('filter[pagination]'); -$event_view_hr = get_parameter('filter[event_view_hr]', 8); +$event_view_hr = get_parameter('filter[event_view_hr]', 1); $id_user_ack = get_parameter('filter[id_user_ack]'); $group_rep = get_parameter('filter[group_rep]'); $tag_with = get_parameter('filter[tag_with]', []); @@ -108,6 +111,7 @@ if (is_ajax()) { [ 'te.*', 'ta.alias as agent_name', + 'tg.nombre as group_name', ], $filter, // Offset. @@ -920,15 +924,7 @@ $filter .= ui_toggle( ); try { - $column_names = [ - __('Event'), - __('Event ID'), - __('Agent name'), - __('Timestamp'), - __('Severity'), - __('Options'), - ]; - $fields = [ + $default_fields = [ 'evento', 'id_evento', // 'id_agente', @@ -961,6 +957,86 @@ try { // 'module_name', 'options', ]; + $fields = explode(',', $config['event_fields']); + + // Always check something is shown. + if (empty($fields)) { + $fields = $default_fields; + } + + // Always add options column. + $fields = array_merge($fields, ['options']); + + // Get column names. + $column_names = events_get_column_names($fields); + + // Open current filter quick reference. + $active_filters_div = '
'; + // Event status. + $active_filters_div .= '
'; + $active_filters_div .= '
'.__('Event status').'
'; + $active_filters_div .= '
'; + switch ($status) { + case EVENT_ALL: + default: + $active_filters_div .= __('Any status.'); + break; + + case EVENT_NEW: + $active_filters_div .= __('New events.'); + break; + + case EVENT_VALIDATE: + $active_filters_div .= __('Validated.'); + break; + + case EVENT_PROCESS: + $active_filters_div .= __('In proccess.'); + break; + + case EVENT_NO_VALIDATED: + $active_filters_div .= __('Not validated.'); + break; + } + + $active_filters_div .= '
'; + $active_filters_div .= '
'; + + // Max. hours old. + $active_filters_div .= '
'; + $active_filters_div .= '
'.__('Max. hours old').'
'; + $active_filters_div .= '
'; + if ($event_view_hr == 0) { + $active_filters_div .= __('Any time.'); + } else if ($event_view_hr == 1) { + $active_filters_div .= __('Last hour.'); + } else if ($event_view_hr == 2) { + $active_filters_div .= __('Last %d hours.', $event_view_hr); + } + + $active_filters_div .= '
'; + $active_filters_div .= '
'; + + // Duplicates. + $active_filters_div .= '
'; + $active_filters_div .= '
'.__('Duplicated').'
'; + $active_filters_div .= '
'; + if ($group_rep == 0) { + $active_filters_div .= __('All events.'); + } else if ($group_rep == 1) { + $active_filters_div .= __('Group events'); + } else if ($group_rep == 2) { + $active_filters_div .= __('Group agents.'); + } + + $active_filters_div .= '
'; + $active_filters_div .= '
'; + + // Close. + $active_filters_div .= '
'; + + + // Print datatable. ui_print_datatable( [ 'id' => 'events', @@ -968,6 +1044,12 @@ try { 'style' => 'width: 100%;', 'ajax_url' => 'operation/events/events', 'ajax_data' => ['get_events' => 1], + 'form' => [ + 'class' => 'flex-row', + 'html' => $filter, + 'inputs' => [], + ], + 'extra_html' => $active_filters_div, 'pagination_options' => [ [ $config['block_size'], @@ -990,11 +1072,6 @@ try { 'All', ], ], - 'form' => [ - 'class' => 'flex-row', - 'html' => $filter, - 'inputs' => [], - ], 'order' => [ 'field' => 'timestamp', 'direction' => 'desc', @@ -1003,7 +1080,6 @@ try { 'columns' => $fields, 'ajax_postprocess' => ' function (item) { - item.id_evento = "#"+item.id_evento; var color = "'.COL_UNKNOWN.'"; var text = "UNKNOWN"; switch (item.criticity) { @@ -1050,11 +1126,15 @@ try { output += \'\'; evn = \'
\'; - evn += \'
\'+item.evento+\'
\'; + evn += \'\'; evn += output; evn += \'
\' item.evento = evn; + item.criticity = \'
\' + text + "
"; // Event type. @@ -1108,9 +1188,19 @@ try { if (item.id_agente > 0) { item.agent_name = \'\' + item.agent_name + \'\'; } - + + if (item.id_agente > 0) { + item.id_agente = \'\' + item.id_agente + \'\'; + } + + if (item.id_grupo == "0") { + item.id_grupo = "'.__('All').'"; + } else { + item.id_grupo = item.group_name; + } item.options = \'button\'; + item.id_evento = "#"+item.id_evento; }', ] ); @@ -1130,6 +1220,18 @@ ui_require_jquery_file( ); // End. Load required JS. +html_print_input_hidden('meta', (int) is_metaconsole()); +html_print_input_hidden('history', (int) $history); +html_print_input_hidden('filterid', $is_filter); +html_print_input_hidden( + 'ajax_file', + ui_get_full_url('ajax.php', false, false, false) +); + +// AJAX call options responses. +echo "
"; +echo "
"; +echo "
"; ?> + '; + if (check_acl($config['id_user'], 0, 'EW') + || check_acl($config['id_user'], 0, 'EM') + ) { + echo '
'; + $table = new StdClass; + $table->id = 'save_filter_form'; + $table->width = '100%'; + $table->cellspacing = 4; + $table->cellpadding = 4; + $table->class = 'databox'; + if (is_metaconsole()) { + $table->class = 'databox filters'; + $table->cellspacing = 0; + $table->cellpadding = 0; + } + + $table->styleTable = 'font-weight: bold; text-align:left;'; + if (!is_metaconsole()) { + $table->style[0] = 'width: 50%; width:50%;'; + } + + $data = []; + $table->rowid[0] = 'update_save_selector'; + $data[0] = html_print_radio_button( + 'filter_mode', + 'new', + '', + true, + true + ).__('New filter').''; + + $data[1] = html_print_radio_button( + 'filter_mode', + 'update', + '', + false, + true + ).__('Update filter').''; + + $table->data[] = $data; + $table->rowclass[] = ''; + + $data = []; + $table->rowid[1] = 'save_filter_row1'; + $data[0] = __('Filter name').$jump; + $data[0] .= html_print_input_text('id_name', '', '', 15, 255, true); + if (is_metaconsole()) { + $data[1] = __('Save in Group').$jump; + } else { + $data[1] = __('Filter group').$jump; + } + + $data[1] .= html_print_select( + $user_groups_array, + 'id_group_filter', + $id_group_filter, + '', + '', + 0, + true, + false, + false, + 'w130' + ); + + $table->data[] = $data; + $table->rowclass[] = ''; + + $data = []; + $table->rowid[2] = 'save_filter_row2'; + + $table->data[] = $data; + $table->rowclass[] = ''; + + $data = []; + $table->rowid[3] = 'update_filter_row1'; + $data[0] = __('Overwrite filter').$jump; + // Fix : Only admin user can see filters of group ALL for update. + $_filters_update = events_get_event_filter_select(false); + + $data[0] .= html_print_select( + $_filters_update, + 'overwrite_filter', + '', + '', + '', + 0, + true + ); + $data[1] = html_print_submit_button( + __('Update filter'), + 'update_filter', + false, + 'class="sub upd" onclick="save_update_filter();"', + true + ); + + $table->data[] = $data; + $table->rowclass[] = ''; + + html_print_table($table); + echo '
'; + echo html_print_submit_button( + __('Save filter'), + 'save_filter', + false, + 'class="sub upd" style="float:right;" onclick="save_new_filter();"', + true + ); + echo '
'; + } else { + include 'general/noaccess.php'; + } + + echo ''; + ?> + + "; + $tabs = "'; diff --git a/pandora_console/include/class/NetworkMap.class.php b/pandora_console/include/class/NetworkMap.class.php index 29acf27c30..0011167308 100644 --- a/pandora_console/include/class/NetworkMap.class.php +++ b/pandora_console/include/class/NetworkMap.class.php @@ -2847,7 +2847,7 @@ class NetworkMap __('Node Details'), '', false, - false + true ); $output .= ''; diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index a534b9e715..db6a679941 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -393,6 +393,7 @@ function events_get_all( } $tgrupo_join = 'LEFT'; + $tgrupo_join_filters = []; if (isset($filter['id_group_filter']) && $filter['id_group_filter'] > 0) { $tgrupo_join = 'INNER'; $tgrupo_join_filters[] = sprintf( @@ -405,8 +406,21 @@ function events_get_all( db_process_sql('SET group_concat_max_len = 9999999'); $event_lj = events_get_secondary_groups_left_join($table); + $group_selects = ''; + if ($group_by != '') { + if ($fields['0'] != 'count') { + $group_selects = ',GROUP_CONCAT(DISTINCT user_comment SEPARATOR "
") AS user_comment, + GROUP_CONCAT(DISTINCT id_evento SEPARATOR ",") AS similar_ids, + COUNT(id_evento) AS event_rep, MAX(utimestamp) AS timestamp_rep, + MIN(utimestamp) AS timestamp_rep_min'; + + unset($fields[array_search('te.user_comment', $fields)]); + } + } + $sql = sprintf( 'SELECT %s + %s FROM %s %s %s JOIN tagente ta @@ -422,6 +436,7 @@ function events_get_all( %s ', join(',', $fields), + $group_selects, $tevento, $event_lj, $tagente_join, diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 6200ab63e2..6f41f87f33 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2801,8 +2801,18 @@ function ui_progress( * 'column2', * ... * ], + * 'no_sortable_columns' => [ indexes ] 1,2... -1 etc. Avoid sorting. * 'form' => [ * 'html' => 'html code' a directly defined inputs in HTML. + * 'extra_buttons' => [ + * [ + * 'id' => button id, + * 'class' => button class, + * 'style' => button style, + * 'text' => button text, + * 'onclick' => button onclick, + * ] + * ], * 'search_button_class' => search button class. * 'class' => form class. * 'id' => form id. @@ -2850,6 +2860,11 @@ function ui_print_datatable(array $parameters) $parameters['default_pagination'] = $config['block_size']; } + $no_sortable_columns = []; + if (isset($parameters['no_sortable_columns'])) { + $no_sortable_columns = json_encode($parameters['no_sortable_columns']); + } + if (!is_array($parameters['order'])) { $order = '0, "asc"'; } else { @@ -2877,7 +2892,7 @@ function ui_print_datatable(array $parameters) $parameters['ajax_data'] = ''; } - $search_button_class = 'sub search'; + $search_button_class = 'sub filter'; if (isset($parameters['search_button_class'])) { $search_button_class = $parameters['search_button_class']; } @@ -2977,8 +2992,19 @@ function ui_print_datatable(array $parameters) $filter .= ''; } - // Search button. $filter .= '
  • '; + if (is_array($parameters['form']['extra_buttons'])) { + foreach ($parameters['form']['extra_buttons'] as $button) { + $filter .= ''; + } + } + + // Search button. $filter .= ''; $filter .= '
  • '; @@ -3078,7 +3104,9 @@ function ui_print_datatable(array $parameters) if (isset($parameters['ajax_postprocess'])) { $js .= ' if (json.data) { - json.data.forEach('.$parameters['ajax_postprocess'].'); + json.data.forEach(function(item) { + '.$parameters['ajax_postprocess'].' + }); } else { json.data = {}; }'; @@ -3110,7 +3138,8 @@ function ui_print_datatable(array $parameters) } }, "columnDefs": [ - { className: "no-class", targets: "_all" } + { className: "no-class", targets: "_all" }, + { bSortable: false, targets: '.$no_sortable_columns.' } ], columns: ['; diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 1f1ff42c3f..4182cb0476 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -56,8 +56,8 @@ function show_event_dialog(event_id, group_rep, dialog_page, result) { opacity: 0.5, background: "black" }, - width: 725, - height: 530 + width: 850, + height: 750 }) .show(); diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index 13bafabca3..a6b747a5b7 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -12,7 +12,7 @@ div.criticity { } div.mini-criticity { - width: 5px; + width: 10px; height: 3em; padding: 0; margin: 0; @@ -184,3 +184,117 @@ fieldset { border: none; margin-top: -2em; } + +/* Image open dialog in group events by agents*/ +#open_agent_groups { + cursor: pointer; +} + +.table_modal_alternate { + border-spacing: 0px; + text-align: left; +} + +/* Modal window - Show More */ +table.table_modal_alternate tr:nth-child(odd) td { + background-color: #ffffff; +} + +table.table_modal_alternate tr:nth-child(even) td { + background-color: #f9f9f9; + border-top: 1px solid #e0e0e0; + border-bottom: 1px solid #e0e0e0; +} + +table.table_modal_alternate tr td { + height: 33px; + max-height: 33px; + min-height: 33px; +} + +table.table_modal_alternate tr td:first-child { + width: 35%; + font-weight: bold; + padding-left: 20px; +} + +ul.events_tabs { + background: #ffffff; + border: 0px; + display: flex; + justify-content: space-between; + padding: 0px; +} + +ul.events_tabs:before, +ul.events_tabs:after { + content: none; +} + +ul.events_tabs > li { + margin: 0; + width: 100%; + text-align: center; + float: none; + outline-width: 0; +} + +ul.events_tabs > li.ui-state-default { + background: #fff; + border: none; + border-bottom: 2px solid #cacaca; +} + +ul.events_tabs > li a { + text-align: center; + float: none; + padding: 8px; + display: block; +} + +ul.events_tabs > li span { + position: relative; + top: -6px; + left: 5px; + margin-right: 10px; +} + +ul.events_tabs > li.ui-tabs-active { + border: none; +} + +ul.ui-tabs-nav.ui-corner-all.ui-helper-reset.ui-helper-clearfix.ui-widget-header { + background: none; + margin: 0; + margin-bottom: -1px; + border: none; +} + +ul.ui-tabs-nav.ui-corner-all.ui-helper-reset.ui-helper-clearfix.ui-widget-header + li { + padding: 0.5em; +} + +ul.ui-tabs-nav.ui-corner-all.ui-helper-reset.ui-helper-clearfix.ui-widget-header + li + > a { + display: flex; + align-items: center; + flex-direction: row; +} +ul.ui-tabs-nav.ui-corner-all.ui-helper-reset.ui-helper-clearfix.ui-widget-header + li + > a + > img { + margin-right: 0.3em; +} + +li.ui-tabs-tab.ui-corner-top.ui-state-default.ui-tab { + border-bottom: 1px solid #ccc; +} +li.ui-tabs-tab.ui-corner-top.ui-state-default.ui-tab.ui-tabs-active.ui-state-active { + border-bottom: 1px solid #fff; +} +div.extended_event_pages.ui-tabs-panel.ui-corner-bottom.ui-widget-content { + border-top: 1px solid #a9a9a9; +} diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css index ac19de900c..6f707d174e 100644 --- a/pandora_console/include/styles/js/jquery-ui_custom.css +++ b/pandora_console/include/styles/js/jquery-ui_custom.css @@ -88,8 +88,7 @@ background-image: url(../images/ui-icons_444444_256x240.png); } .ui-widget-content { - background: #ffffff url(../images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% - repeat-x; + background: #fff; } .ui-state-default, .ui-widget-content .ui-state-default, @@ -97,8 +96,7 @@ margin-top: 3px; border: 1px solid #d3d3d3; border-bottom: 0; - background: #e6e6e6 url(../images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% - repeat-x; + background: #e6e6e6; font-weight: normal; color: #555555; } @@ -139,7 +137,7 @@ } .ui-dialog .ui-widget-header { background-color: #82b92e; - margin: -1px; + margin: -1px -1px 0px -1px; } .ui_tpicker_hour, .ui_tpicker_minute, @@ -213,8 +211,7 @@ a.ui-button:active, .ui-widget-header .ui-state-hover { border: 1px solid #999999; border-bottom: 0; - background: #dadada url(../images/ui-bg_glass_75_dadada_1x400.png) 50% 50% - repeat-x; + background: #dadada; } .ui-state-active, @@ -222,8 +219,7 @@ a.ui-button:active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; border-bottom: 0; - background: #ffffff url(../images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% - repeat-x; + background: #ffffff; font-weight: normal; color: #212121; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 5034d60069..b6862db108 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -517,6 +517,9 @@ select:-internal-list-box { .padding-6 { padding: 6em; } +.margin-right-2 { + margin-right: 2em; +} .no-border { border: none; } @@ -544,6 +547,12 @@ select:-internal-list-box { .td-bg-white td { background: #fff; } +.float-left { + float: left; +} +.float-right { + float: right; +} div#page { background: #fbfbfb; @@ -632,6 +641,7 @@ p.center { } /* --- Botones --- */ +button.sub, input.sub { font-weight: normal; -moz-border-radius: 2px; @@ -645,10 +655,24 @@ input.sub { padding-bottom: 10px; padding-top: 10px; padding-left: 15px; - border-color: #888; + border: 1px solid #888; font-family: "lato", "Open Sans", sans-serif; + cursor: pointer; } +button.sub:hover, +input.sub:hover { + border: 1px solid #333; +} + +button.sub:active, +input.sub:active { + border: 1px solid #000; + color: #333; + background-color: #e1e1e1; +} + +button.sub[disabled], input.sub[disabled] { color: #b4b4b4; background-color: #f3f3f3; @@ -1519,6 +1543,24 @@ div#logo_text3 { text-align: right; } +button.next, +button.upd, +button.ok, +button.wand, +button.delete, +button.cog, +button.target, +button.search, +button.copy, +button.add, +button.graph, +button.percentile, +button.binary, +button.camera, +button.config, +button.filter, +button.cancel, +button.default, input.next, input.upd, input.ok, @@ -1534,6 +1576,7 @@ input.percentile, input.binary, input.camera, input.config, +input.filter, input.cancel, input.default, input.filter, @@ -1542,75 +1585,99 @@ input.spinn { padding-right: 30px; } +button.next, input.next { background-image: url(../../images/input_go.png); } +button.upd, input.upd { background-image: url(../../images/input_update.png); } +button.wand, input.wand { background-image: url(../../images/input_wand.png); } +button.wand:disabled, input.wand:disabled { background-image: url(../../images/input_wand.disabled.png); } +button.search, input.search { background-image: url(../../images/input_zoom.png); } +button.search:disabled, input.search:disabled { background-image: url(../../images/input_zoom.disabled.png); } +button.ok, input.ok { background-image: url(../../images/input_tick.png); } +button.ok:disabled, input.ok:disabled { background-image: url(../../images/input_tick.disabled.png); } +button.add, input.add { background-image: url(../../images/input_add.png); } +button.add:disabled, input.add:disabled { background-image: url(../../images/input_add.disabled.png); } +button.cancel, input.cancel { background-image: url(../../images/input_cross.png); } +button.cancel:disabled, input.cancel:disabled { background-image: url(../../images/input_cross.disabled.png); } +button.delete, input.delete { background-image: url(../../images/input_delete.png); } +button.delete:disabled, input.delete:disabled { background-image: url(../../images/input_delete.disabled.png); } +button.cog, input.cog { background-image: url(../../images/input_cog.png); } +button.cog:disabled, input.cog:disabled { background-image: url(../../images/input_cog.disabled.png); } +button.config, input.config { background-image: url(../../images/input_config.png); } +button.config:disabled, input.config:disabled { background-image: url(../../images/input_config.disabled.png); } +button.filter, input.filter { background-image: url(../../images/input_filter.png); } +button.filter:disabled, input.filter:disabled { background-image: url(../../images/input_filter.disabled.png); } +button.pdf, input.pdf { background-image: url(../../images/input_pdf.png); } +button.pdf:disabled, input.pdf:disabled { background-image: url(../../images/input_pdf.disabled.png); } +button.camera, input.camera { background-image: url(../../images/input_camera.png); } +button.spinn, input.spinn { background-image: url(../../images/spinner_green.gif); } @@ -3491,90 +3558,6 @@ div.simple_value > a > span.text p { white-space: pre; } -/* - * --------------------------------------------------------------------- - * - EVENTS - - * --------------------------------------------------------------------- - */ -/* Image open dialog in group events by agents*/ -#open_agent_groups { - cursor: pointer; -} - -.table_modal_alternate { - border-spacing: 0px; - text-align: left; -} - -/* Modal window - Show More */ -table.table_modal_alternate tr:nth-child(odd) td { - background-color: #ffffff; -} - -table.table_modal_alternate tr:nth-child(even) td { - background-color: #f9f9f9; - border-top: 1px solid #e0e0e0; - border-bottom: 1px solid #e0e0e0; -} - -table.table_modal_alternate tr td { - height: 33px; - max-height: 33px; - min-height: 33px; -} - -table.table_modal_alternate tr td:first-child { - width: 35%; - font-weight: bold; - padding-left: 20px; -} - -ul.events_tabs { - background: #ffffff; - border: 0px; - display: flex; - justify-content: space-between; - padding: 0px; -} - -ul.events_tabs:before, -ul.events_tabs:after { - content: none; -} - -ul.events_tabs > li { - margin: 0; - width: 100%; - text-align: center; - float: none; - outline-width: 0; -} - -ul.events_tabs > li.ui-state-default { - background: #fff; - border: none; - border-bottom: 2px solid #cacaca; -} - -ul.events_tabs > li a { - text-align: center; - float: none; - padding: 8px; - display: block; -} - -ul.events_tabs > li span { - position: relative; - top: -6px; - left: 5px; - margin-right: 10px; -} - -ul.events_tabs > li.ui-tabs-active { - border-bottom: 2px solid #82b92e; - border-top: 2px solid #82b92e; -} - /* * --------------------------------------------------------------------- * - modal window and edit user - diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index fdc4d4e4a1..705c2ea7f0 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -109,7 +109,30 @@ if (is_ajax()) { $events = events_get_all( [ - 'te.*', + 'te.id_evento', + 'te.id_agente', + 'te.id_usuario', + 'te.id_grupo', + 'te.estado', + 'te.timestamp', + 'te.evento', + 'te.utimestamp', + 'te.event_type', + 'te.id_agentmodule', + 'te.id_alert_am', + 'te.criticity', + 'te.user_comment', + 'te.tags', + 'te.source', + 'te.id_extra', + 'te.critical_instructions', + 'te.warning_instructions', + 'te.unknown_instructions', + 'te.owner_user', + 'te.ack_utimestamp', + 'te.custom_data', + 'te.data', + 'te.module_status', 'ta.alias as agent_name', 'tg.nombre as group_name', ], @@ -687,6 +710,21 @@ $in = '
    '; $in .= $data.'
    '; $inputs[] = $in; +$buttons = []; + +$buttons[] = [ + 'id' => 'load-filter', + 'class' => 'float-left margin-right-2 sub config', + 'text' => __('Load filter'), + 'onclick' => '', +]; + +$buttons[] = [ + 'id' => 'save-filter', + 'class' => 'float-left margin-right-2 sub wand', + 'text' => __('Save filter'), + 'onclick' => '', +]; /* * Advanced filter. @@ -1010,7 +1048,7 @@ try { $active_filters_div .= __('Any time.'); } else if ($event_view_hr == 1) { $active_filters_div .= __('Last hour.'); - } else if ($event_view_hr == 2) { + } else if ($event_view_hr > 1) { $active_filters_div .= __('Last %d hours.', $event_view_hr); } @@ -1039,18 +1077,19 @@ try { // Print datatable. ui_print_datatable( [ - 'id' => 'events', - 'class' => 'info_table events', - 'style' => 'width: 100%;', - 'ajax_url' => 'operation/events/events', - 'ajax_data' => ['get_events' => 1], - 'form' => [ - 'class' => 'flex-row', - 'html' => $filter, - 'inputs' => [], + 'id' => 'events', + 'class' => 'info_table events', + 'style' => 'width: 100%;', + 'ajax_url' => 'operation/events/events', + 'ajax_data' => ['get_events' => 1], + 'form' => [ + 'class' => 'flex-row', + 'html' => $filter, + 'inputs' => [], + 'extra_buttons' => $buttons, ], - 'extra_html' => $active_filters_div, - 'pagination_options' => [ + 'extra_html' => $active_filters_div, + 'pagination_options' => [ [ $config['block_size'], 10, @@ -1072,136 +1111,14 @@ try { 'All', ], ], - 'order' => [ + 'order' => [ 'field' => 'timestamp', 'direction' => 'desc', ], - 'column_names' => $column_names, - 'columns' => $fields, - 'ajax_postprocess' => ' - function (item) { - var color = "'.COL_UNKNOWN.'"; - var text = "UNKNOWN"; - switch (item.criticity) { - case "'.EVENT_CRIT_CRITICAL.'": - text = "CRITICAL"; - color = "'.COL_CRITICAL.'"; - break; - - case "'.EVENT_CRIT_MAINTENANCE.'": - text = "MAINTENANCE"; - color = "'.COL_MAINTENANCE.'"; - break; - - case "'.EVENT_CRIT_INFORMATIONAL.'": - text = "INFORMATIONAL"; - color = "'.COL_INFORMATIONAL.'"; - break; - - case "'.EVENT_CRIT_MAJOR.'": - text = "MAJOR"; - color = "'.COL_MAJOR.'"; - break; - - case "'.EVENT_CRIT_MINOR.'": - text = "MINOR"; - color = "'.COL_MINOR.'"; - break; - - case "'.EVENT_CRIT_NORMAL.'": - text = "NORMAL"; - color = "'.COL_NORMAL.'"; - break; - - case "'.EVENT_CRIT_WARNING.'": - text = "WARNING"; - color = "'.COL_WARNING.'"; - break; - } - output = \'
    \'; - output += \'
    \'; - - evn = \'
    \'; - evn += \'\'; - evn += output; - evn += \'
    \' - - item.evento = evn; - item.criticity = \'
    \' + text + "
    "; - - - // Event type. - switch (item.event_type) { - case "'.EVENTS_ALERT_FIRED.'": - case "'.EVENTS_ALERT_RECOVERED.'": - case "'.EVENTS_ALERT_CEASED.'": - case "'.EVENTS_ALERT_MANUAL_VALIDATION.'": - text = "'.__('ALERT').'"; - color = "'.COL_ALERTFIRED.'"; - break; - - case "'.EVENTS_RECON_HOST_DETECTED.'": - case "'.EVENTS_SYSTEM.'": - case "'.EVENTS_ERROR.'": - case "'.EVENTS_NEW_AGENT.'": - case "'.EVENTS_CONFIGURATION_CHANGE.'": - text = "'.__('SYSTEM').'"; - color = "'.COL_MAINTENANCE.'"; - break; - - case "'.EVENTS_GOING_UP_WARNING.'": - case "'.EVENTS_GOING_DOWN_WARNING.'": - $tex = "'.__('WARNING').'"; - color = "'.COL_WARNING.'"; - break; - - case "'.EVENTS_GOING_DOWN_NORMAL.'": - case "'.EVENTS_GOING_UP_NORMAL.'": - text = "'.__('NORMAL').'"; - color = "'.COL_NORMAL.'"; - break; - - case "'.EVENTS_GOING_DOWN_CRITICAL.'": - case "'.EVENTS_GOING_UP_CRITICAL.'": - text = "'.__('CRITICAL').'"; - color = "'.COL_CRITICAL.'"; - break; - - case "'.EVENTS_UNKNOWN.'": - case "'.EVENTS_GOING_UNKNOWN.'": - default: - text = "'.__('UNKNOWN').'"; - color = "'.COL_UNKNOWN.'"; - break; - } - - item.event_type = \'
    \' + text + "
    "; - - if (item.id_agente > 0) { - item.agent_name = \'\' + item.agent_name + \'\'; - } - - if (item.id_agente > 0) { - item.id_agente = \'\' + item.id_agente + \'\'; - } - - if (item.id_grupo == "0") { - item.id_grupo = "'.__('All').'"; - } else { - item.id_grupo = item.group_name; - } - - item.options = \'button\'; - item.id_evento = "#"+item.id_evento; - }', + 'column_names' => $column_names, + 'columns' => $fields, + 'no_sortable_columns' => [-1], + 'ajax_postprocess' => 'process_datatables_item(item)', ] ); } catch (Exception $e) { @@ -1232,9 +1149,13 @@ html_print_input_hidden( echo "
    "; echo "
    "; echo "
    "; + +// Load filter div for dialog. +echo ''; +echo ''; ?> '; + } if (!$return) { echo $output; diff --git a/pandora_console/include/styles/progress.css b/pandora_console/include/styles/progress.css index ccd75f620a..f263e87fcf 100644 --- a/pandora_console/include/styles/progress.css +++ b/pandora_console/include/styles/progress.css @@ -1,18 +1,21 @@ -span.progress_text { - position: absolute; - font-family: "lato-bolder", "Open Sans", sans-serif; - font-size: 2em; - margin-left: -0.5em; -} - -div.progress_main { - display: inline-block; - text-align: center; +.progress_main { height: 2.5em; border: 1px solid #82b92e; + position: relative; + width: 100%; + display: inline-block; +} +.progress_main:before { + content: attr(data-label); + position: absolute; + text-align: center; + left: 0; + right: 0; + margin-top: 0.2em; + font-family: "lato-bolder", "Open Sans", sans-serif; } -div.progress { +.progress { width: 0%; background: #82b92e; height: 100%; diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index cdf207e455..b7c472e176 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -314,7 +314,16 @@ $data[1] = ui_progress( 1.8, '#BBB', true, - floor(($agent['intervalo'] * (100 - $progress) / 100)).' s' + floor(($agent['intervalo'] * (100 - $progress) / 100)).' s', + [ + 'page' => 'operation/agentes/ver_agente', + 'interval' => (100 / $agent['intervalo']), + 'data' => [ + 'id_agente' => $id_agente, + 'refresh_contact' => 1, + ], + + ] ); if ($progress > 100) { @@ -739,40 +748,6 @@ if (!empty($network_interfaces)) { ?> '; + $output .= ''; + } else { + // This is for public link on the dashboard + $sql_count_event = 'SELECT SQL_NO_CACHE COUNT(id_evento) FROM tevento '; + if ($config['event_view_hr']) { + $sql_count_event .= 'WHERE utimestamp > (UNIX_TIMESTAMP(NOW()) - '.($config['event_view_hr'] * SECONDS_1HOUR).')'; + } - return $output; + $system_events = db_get_value_sql($sql_count_event); + + $output .= ''; + } + + return $output; } From a75acb75fc9597897452c2616a26135dca2932ba Mon Sep 17 00:00:00 2001 From: Alejandro Gallardo Escobar Date: Mon, 17 Jun 2019 12:46:35 +0200 Subject: [PATCH 104/460] Minor fix --- visual_console_client/src/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/visual_console_client/src/main.css b/visual_console_client/src/main.css index 99df3bb925..c69a486c8f 100644 --- a/visual_console_client/src/main.css +++ b/visual_console_client/src/main.css @@ -19,6 +19,7 @@ border: 2px dashed #b2b2b2; transform: translateX(-2px) translateY(-2px); cursor: move; + user-select: none; } .visual-console-item.is-editing > .resize-draggable { From 08c035a61292b5db2ecd36989518adb4c5bc9919 Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Mon, 17 Jun 2019 16:33:57 +0200 Subject: [PATCH 105/460] Refactorf SNMPBrowserWndow in one unique function --- .../realtime_graphs/realtime_graphs.js | 46 ++---------------- .../javascript/pandora_snmp_browser.js | 47 +++++++++++++++++++ 2 files changed, 51 insertions(+), 42 deletions(-) diff --git a/pandora_console/extensions/realtime_graphs/realtime_graphs.js b/pandora_console/extensions/realtime_graphs/realtime_graphs.js index 7140d245d4..b5d6c1eaa8 100644 --- a/pandora_console/extensions/realtime_graphs/realtime_graphs.js +++ b/pandora_console/extensions/realtime_graphs/realtime_graphs.js @@ -10,7 +10,9 @@ var plot; var plotOptions = { - legend: { container: $("#chartLegend") }, + legend: { + container: $("#chartLegend") + }, xaxis: { tickFormatter: function(timestamp, axis) { var date = new Date(timestamp * 1000); @@ -131,47 +133,6 @@ resetDataPooling(); } - // Set the form OID to the value selected in the SNMP browser - function setOID() { - if ($("#snmp_browser_version").val() == "3") { - $("#text-snmp_oid").val($("#table1-0-1").text()); - } else { - $("#text-snmp_oid").val($("#snmp_selected_oid").text()); - } - - // Close the SNMP browser - $(".ui-dialog-titlebar-close").trigger("click"); - } - - // Show the SNMP browser window - function snmpBrowserWindow() { - // Keep elements in the form and the SNMP browser synced - $("#text-target_ip").val($("#text-ip_target").val()); - $("#text-community").val($("#text-snmp_community").val()); - $("#snmp_browser_version").val($("#snmp_version").val()); - $("#snmp3_browser_auth_user").val($("#snmp3_auth_user").val()); - $("#snmp3_browser_security_level").val($("#snmp3_security_level").val()); - $("#snmp3_browser_auth_method").val($("#snmp3_auth_method").val()); - $("#snmp3_browser_auth_pass").val($("#snmp3_auth_pass").val()); - $("#snmp3_browser_privacy_method").val($("#snmp3_privacy_method").val()); - $("#snmp3_browser_privacy_pass").val($("#snmp3_privacy_pass").val()); - - $("#snmp_browser_container") - .show() - .dialog({ - title: "", - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 920, - height: 500 - }); - } - function shortNumber(number) { if (Math.round(number) != number) return number; number = Number.parseInt(number); @@ -187,6 +148,7 @@ return number + " " + shorts[pos]; } + function roundToTwo(num) { return +(Math.round(num + "e+2") + "e-2"); } diff --git a/pandora_console/include/javascript/pandora_snmp_browser.js b/pandora_console/include/javascript/pandora_snmp_browser.js index ee75eac71f..dbe8121a64 100644 --- a/pandora_console/include/javascript/pandora_snmp_browser.js +++ b/pandora_console/include/javascript/pandora_snmp_browser.js @@ -417,3 +417,50 @@ function checkSNMPVersion() { $("#snmp3_browser_options").css("display", "none"); } } + +// Show the SNMP browser window +function snmpBrowserWindow() { + // Keep elements in the form and the SNMP browser synced + $("#text-target_ip").val($("#text-ip_target").val()); + $("#text-community").val($("#text-snmp_community").val()); + $("#snmp_browser_version").val($("#snmp_version").val()); + $("#text-snmp3_browser_auth_user").val($("#text-snmp3_auth_user").val()); + $("#snmp3_browser_security_level").val($("#snmp3_security_level").val()); + $("#snmp3_browser_auth_method").val($("#snmp3_auth_method").val()); + $("#password-snmp3_browser_auth_pass").val( + $("#password-snmp3_auth_pass").val() + ); + $("#snmp3_browser_privacy_method").val($("#snmp3_privacy_method").val()); + $("#password-snmp3_browser_privacy_pass").val( + $("#password-snmp3_privacy_pass").val() + ); + + checkSNMPVersion(); + + $("#snmp_browser_container") + .show() + .dialog({ + title: "", + resizable: true, + draggable: true, + modal: true, + overlay: { + opacity: 0.5, + background: "black" + }, + width: 920, + height: 500 + }); +} + +// Set the form OID to the value selected in the SNMP browser +function setOID() { + if ($("#snmp_browser_version").val() == "3") { + $("#text-snmp_oid").val($("#table1-0-1").text()); + } else { + $("#text-snmp_oid").val($("#snmp_selected_oid").text()); + } + + // Close the SNMP browser + $(".ui-dialog-titlebar-close").trigger("click"); +} From 9bdf048fae2219b4121e50530906ede03b8174b2 Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Mon, 17 Jun 2019 16:35:58 +0200 Subject: [PATCH 106/460] Fixed and refactored duplicated functions SNMP Browser not showing v3 paramethers --- .../extensions/realtime_graphs.php | 2 +- .../agentes/module_manager_editor_network.php | 40 ------------------- 2 files changed, 1 insertion(+), 41 deletions(-) diff --git a/pandora_console/extensions/realtime_graphs.php b/pandora_console/extensions/realtime_graphs.php index cea09fe4d5..e487d49ee5 100644 --- a/pandora_console/extensions/realtime_graphs.php +++ b/pandora_console/extensions/realtime_graphs.php @@ -173,7 +173,7 @@ function pandora_realtime_graphs() $table->colspan[2]['snmp_oid'] = 2; $data['snmp_ver'] = __('Version').'  '.html_print_select($snmp_versions, 'snmp_version', $snmp_ver, '', '', 0, true); - $data['snmp_ver'] .= '  '.html_print_button(__('SNMP walk'), 'snmp_walk', false, 'javascript:realtimeGraphs.snmpBrowserWindow();', 'class="sub next"', true); + $data['snmp_ver'] .= '  '.html_print_button(__('SNMP walk'), 'snmp_walk', false, 'javascript:snmpBrowserWindow();', 'class="sub next"', true); $table->colspan[2]['snmp_ver'] = 2; $table->data[] = $data; diff --git a/pandora_console/godmode/agentes/module_manager_editor_network.php b/pandora_console/godmode/agentes/module_manager_editor_network.php index 306e5f9804..c0a6181a8e 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_network.php +++ b/pandora_console/godmode/agentes/module_manager_editor_network.php @@ -506,45 +506,5 @@ $(document).ready (function () { }); }); -// Show the SNMP browser window -function snmpBrowserWindow () { - - // Keep elements in the form and the SNMP browser synced - $('#text-target_ip').val($('#text-ip_target').val()); - $('#text-community').val($('#text-snmp_community').val()); - $('#snmp_browser_version').val($('#snmp_version').val()); - $('#text-snmp3_browser_auth_user').val($('#text-snmp3_auth_user').val()); - $('#snmp3_browser_security_level').val($('#snmp3_security_level').val()); - $('#snmp3_browser_auth_method').val($('#snmp3_auth_method').val()); - $('#password-snmp3_browser_auth_pass').val($('#password-snmp3_auth_pass').val()); - $('#snmp3_browser_privacy_method').val($('#snmp3_privacy_method').val()); - $('#password-snmp3_browser_privacy_pass').val($('#password-snmp3_privacy_pass').val()); - - $("#snmp_browser_container").show().dialog ({ - title: '', - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 920, - height: 500 - }); -} - -// Set the form OID to the value selected in the SNMP browser -function setOID () { - - if($('#snmp_browser_version').val() == '3'){ - $('#text-snmp_oid').val($('#table1-0-1').text()); - } else { - $('#text-snmp_oid').val($('#snmp_selected_oid').text()); - } - - // Close the SNMP browser - $('.ui-dialog-titlebar-close').trigger('click'); -} From ab7d72a1c9d6b3bd72dffd74ce8d4af25640b6a8 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 17 Jun 2019 17:02:33 +0200 Subject: [PATCH 107/460] wip event vwr ui-box close tick --- pandora_console/include/ajax/events.php | 37 +++++----- pandora_console/include/functions_events.php | 24 +++++-- .../include/javascript/pandora_events.js | 27 +++---- .../js/images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 65280 -> 86 bytes .../js/images/ui-icons_444444_256x240.png | Bin 66444 -> 3266 bytes .../js/images/ui-icons_555555_256x240.png | Bin 66434 -> 3274 bytes .../js/images/ui-icons_777620_256x240.png | Bin 66445 -> 3262 bytes .../js/images/ui-icons_777777_256x240.png | Bin 66457 -> 3266 bytes .../js/images/ui-icons_cc0000_256x240.png | Bin 66457 -> 3262 bytes .../js/images/ui-icons_ffffff_256x240.png | Bin 66457 -> 3264 bytes .../include/styles/js/jquery-ui_custom.css | 24 +++---- .../operation/events/events.build_query.php | 66 +++++++++--------- pandora_console/operation/events/events.php | 63 ++++++++++++++++- 13 files changed, 152 insertions(+), 89 deletions(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 6838c97edd..2293ac11d1 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -954,26 +954,26 @@ if ($change_owner) { return; } + +// Generate a modal window with extended information of given event. if ($get_extended_event) { global $config; - $event_id = get_parameter('event_id', false); - $childrens_ids = get_parameter('childrens_ids'); - $childrens_ids = json_decode($childrens_ids); + $event = get_parameter('event', false); - if ($meta) { - $event = events_meta_get_event($event_id, false, $history, 'ER'); - } else { - $event = events_get_event($event_id); + if ($event === false) { + return; } + $event_id = $event['id_evento']; + $readonly = false; if (!$meta && isset($config['event_replication']) && $config['event_replication'] == 1 && $config['show_events_in_local'] == 1 ) { - $readonly = true; + $readonly = true; } // Clean url from events and store in array. @@ -986,20 +986,17 @@ if ($get_extended_event) { } $dialog_page = get_parameter('dialog_page', 'general'); - $similar_ids = get_parameter('similar_ids', $event_id); - $group_rep = get_parameter('group_rep', false); - $event_rep = get_parameter('event_rep', 1); - $timestamp_first = get_parameter('timestamp_first', $event['utimestamp']); - $timestamp_last = get_parameter('timestamp_last', $event['utimestamp']); - $server_id = get_parameter('server_id', 0); $filter = get_parameter('filter', []); + $group_rep = $filter['group_rep']; + $event_rep = $event['event_rep']; + $timestamp_first = $event['min_timestamp']; + $timestamp_last = $event['max_timestamp']; + $server_id = $event['server_id']; + $comments = $event['comments']; - $event_rep = events_get_related_events($event_id, true, $filter); - - $event['similar_ids'] = $similar_ids; - $event['timestamp_first'] = $timestamp_first; - $event['timestamp_last'] = $timestamp_last; - $event['event_rep'] = $event_rep; + if (!isset($comments)) { + $comments = $event['user_comment']; + } // Check ACLs. if (is_user_admin($config['id_user'])) { diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 51caab0753..4fad541ee7 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -448,6 +448,7 @@ function events_update_status($id_evento, $status, $filter=null, $history=false) * @param string $sort_field Sort field. * @param boolean $history Apply on historical table. * @param boolean $return_sql Return SQL (true) or execute it (false). + * @param string $having Having filter. * * @return array Events. * @throws Exception On error. @@ -460,7 +461,8 @@ function events_get_all( $order=null, $sort_field=null, $history=false, - $return_sql=false + $return_sql=false, + $having='' ) { global $config; @@ -653,6 +655,17 @@ function events_get_all( // Free search. if (!empty($filter['search'])) { + if (isset($config['dbconnection']->server_version) + && $config['dbconnection']->server_version > 50600 + ) { + // Use "from_base64" requires mysql 5.6 or greater. + $custom_data_search = 'from_base64(te.custom_data)'; + } else { + // Custom data is JSON encoded base64, if 5.6 or lower, + // user is condemned to use plain search. + $custom_data_search = 'te.custom_data'; + } + $sql_filters[] = vsprintf( ' AND (lower(ta.alias) like lower("%%%s%%") OR te.id_evento like "%%%s%%" @@ -660,7 +673,7 @@ function events_get_all( OR lower(te.user_comment) like lower("%%%s%%") OR lower(te.id_extra) like lower("%%%s%%") OR lower(te.source) like lower("%%%s%%") - OR lower(te.custom_data) like lower("%%%s%%") )', + OR lower('.$custom_data_search.') like lower("%%%s%%") )', array_fill(0, 7, $filter['search']) ); } @@ -947,7 +960,8 @@ function events_get_all( if ($group_by != '') { $group_selects = ',COUNT(id_evento) AS event_rep ,GROUP_CONCAT(DISTINCT user_comment SEPARATOR "
    ") AS comments, - MAX(timestamp) as max_timestamp, + MAX(utimestamp) as timestamp_last, + MIN(utimestamp) as timestamp_first, MAX(id_evento) as max_id_evento'; if ($count === false) { @@ -974,6 +988,7 @@ function events_get_all( %s %s %s + %s ', join(',', $fields), $group_selects, @@ -988,7 +1003,8 @@ function events_get_all( join(' ', $sql_filters), $group_by, $order_by, - $pagination + $pagination, + $having ); if (!$user_is_admin) { diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 86f101ab83..a2180668f9 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -1,20 +1,19 @@ /*global jQuery,$,forced_title_callback,Base64, dt_events*/ // Show the modal window of an event -function show_event_dialog(event_id, group_rep, dialog_page, result) { +function show_event_dialog(event, dialog_page, result) { var ajax_file = $("#hidden-ajax_file").val(); if (dialog_page == undefined) { dialog_page = "general"; } - var similar_ids = $("#hidden-similar_ids_" + event_id).val(); - var timestamp_first = $("#hidden-timestamp_first_" + event_id).val(); - var timestamp_last = $("#hidden-timestamp_last_" + event_id).val(); - var user_comment = $("#hidden-user_comment_" + event_id).val(); - var event_rep = $("#hidden-event_rep_" + event_id).val(); - var server_id = $("#hidden-server_id_" + event_id).val(); - var childrens_ids = $("#hidden-childrens_ids").val(); + try { + event = JSON.parse(atob(event)); + } catch (e) { + console.error(e); + return; + } var inputs = $("#events_form :input"); var values = {}; @@ -33,17 +32,9 @@ function show_event_dialog(event_id, group_rep, dialog_page, result) { { page: "include/ajax/events", get_extended_event: 1, - group_rep: group_rep, - event_rep: event_rep, dialog_page: dialog_page, - similar_ids: similar_ids, - timestamp_first: timestamp_first, - timestamp_last: timestamp_last, - user_comment: user_comment, - event_id: event_id, - server_id: server_id, + event: event, meta: meta, - childrens_ids: childrens_ids, history: history, filter: values }, @@ -53,7 +44,7 @@ function show_event_dialog(event_id, group_rep, dialog_page, result) { .empty() .append(data) .dialog({ - title: get_event_name(event_id, meta, history), + title: event.evento, resizable: true, draggable: true, modal: true, diff --git a/pandora_console/include/styles/js/images/ui-bg_flat_0_aaaaaa_40x100.png b/pandora_console/include/styles/js/images/ui-bg_flat_0_aaaaaa_40x100.png index 5157978749e169e47612cb48db3bf2624ac25fb9..a2e6bfc085f51b392569e58b72d454586b900f61 100644 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F$P6UUt$JVyq?iMILR?p^S|wQb`zMgg=jq}Y hQo)$KfKh^VF#`ir1OsEt!yO=<44$rjF6*2UngAlC6uAHZ literal 65280 zcmeHw*>>AVx88j}1rB?qldLvKj2zsO{v%7WC0m1S$?|Zc03=94A_+DCYRWom*6!!N(kKWqQ8eYAD*`R$G|%*UgRU)Jcy z7zLBTdM%pNHhwXTwP6(W=mMAHC=ZP8Fi5i~U$4#bzS$OKM)BmrNTbnutvAWcX&UvT zygRHJLtL%bhIu~Co;MnUI3Lc!y7&n)RFc)Z$@n2v1eZaM<}F#tEQ``^GRdP!{>Yl_ zC#%VMvYOm)uSv|Y*&QXbUOjW`!8o{0Cc)K%C!A*3jK{$s%9i)4f#t(L*d4qHx@nSS zNg5C0$$BlAB$JzQGRtblIO@d#o{UB{BgTRa(m20auVur)w;j{{efQ|kt*iW9F!F~- zuiyPX?p?=!`nTg(M+sF?=fSJd{>y0V>NeR6CSmK`-;1|qpWb}< z^JdHWv;DGnvE@z1*Unof-CSRDK4Z z!P~(gZGX9Wef8enIZscw6R$P3M)vNO{Wi?c_w21n|2&yoSchrLIcmK5^ltZdvg0RL zGyh=wc6+neJ3Y6fm&aem!E9(>z5DiAkjJXyJ7KTu_UyK6wfb(@?KeAJ+jE<}&}w=8 z>O3&$)c(*>VL&>;-de9+#?jR@NwG5}AX~3p#l3vE-it2dZe;QegGl-?kMmKqasKBl zN^i_r+?d5?I5_K%g8a-n3;3Ti&$_lPt3I6!j3770L6%3U@qho1A--x9AJel}alShX z*BYW;?xo(jUX*pyc$&w_MC;$lFfx*UKkmlC$T)vTeK815@WD>|K{ql+ahL|_P2Jc6 zbWY=NmPbaOEOr5dj7G_H3;=F~H%2#&f;^^y)2)xKB#l9+M@R%*-|EwtnOBU|?@>$hM${o``oBlx8+ziNjLzt+URies>< zbT>%#0cErC7+YagX`Usm^7&o5>N{;&wXgrOttlYCI@;wDCj+rcS|6Wgg(^+Z0-X^& z(VCGPxmeQ52XtVxvPpOzbpe9Z@>k2!KGq7aUZKiovlM5ofN5&bV(SpGCIL|ik5)AQ zH(Y3f#3jiqXoVGUL5#N~c8Odv45~oG0n_u~+RWo|l+1KI04Q!PE1pJx|5=f`1cUuIo2MWDY=>cVcs2R*<&B-%pWfYMpWN$Ny8nTv!w zH&@fnft&4|Px3SO?90cuT{JK^*-1A~MmKrf&CFqv=^LP%jA$K_RFd967R=@p=Twjo zS_LRk-4@G1we|%N@FX{vAJ!G^OGeI&u7QLm!Ke|Y$rbSb8P`=FR8)EFaUQ8^7p;*4Yo6 zrrT$UUD90VrV@0uZ|u^7Fr)v=!p22syA0!Wh03qqvY3EHt# ziS}U$;+GsIo{&)j_E7smoQZkJ5nWFO5PE1E7#}dv^^E{Jy(mXDwCSe7%_yN|EU?nS z_UEg^+k>lvlXq8#+o$JWUL81JKJMKfZ4WPwKJMHe+;**lli`JUemeSczH|Ng{6&0l zdvSd@{$L$CADqMU)A8rq_v6D?AMB%(FY&?Ty0tfXJqkZ|tS_gX;g?tMZ@zpwyxlub z;-l@s?BM(Z0MO>_@Z@v6zx5jLUfOtXeR4(@ROayZ;_B!m@ea2y{3EpY?&STe!|iv? zgAaSxN86*92PcXB&N_Yd{^ZMx!+0;-o4lWfA5U+4uU_Wet-a>K3H4*|=J0&;=HTWk z4qkO`dw9M#?oE5IhW6*!KMx%%?h`-6z^J;S(If~*0R4TC;&Xm4w0`|QQu{{G(KtIEscqpiKo{j<04kB(lR zZGAXCIXXZ+l_DqacMiAl-I-ptQsVv2*3rQMN^PF(9UUHvzU#-4gjZ%3^dl2;2f|TB z$D6(%wp#su%WHvwZCfoX?DyN9RzCv5bUd#YG~Ip}@>x-{K@^J#OdDUW*RBQD1pXrE zrB&Q+q86{y5Bg!R=XSvi1}!__+M>{ns6v5Vd2=((uv8|tj2>#>;W*B-hG609K@M4& z5NHG=hP*_TOD^Mm)FmEjOMFuDT3`~Ni|?0lNmL~>MZ6F6xf~>r`pogA<-uN{-3+{g z46!2TTQ(*_WQz;86c7`nn8OdmvD^#2@VE0&M$oPI`ksI^D3&C>srJBYwL2XUQuo3_ zMHQ2)MB6f}$!7tKmrjP(q3J9Hm#bB%aD={mU#ld}&iW8*X|?o&QO2m|A=ONxoTOuC zX_DkmGE;hePdjbECZi;c&cr4@150`l<sNgZ8T(Ij+;9!t@W;PoIZL+y`r?m`Q+s@t}U5G2S8R`jM2b1IU>WnDqenA&AT5 zq&9@UhUyKI9z<$_<^wPUHD`jsG@{8R(MP=*Q$@xUvVG9w*)#!Zei?~-+N-FLuoic* z7hkHH7_12z9%4uO0`wL&3Pr(H3I+s%K>6ufAcbweVo#;Hne;ImtgQhu3c?s9_Vs#= zh)&VT>9y$?(;L$>!hsor=QMKg80OUw;thk2rwJ;qpLAy#wV7SSQ!`JBDmRYtfH0qI zW33U05v)<~;~o>f%>5D-h~9<)5%{ucV!^fN8~l-anI;3w5T?EU}Aty>(4vYjOY7mby9!U^SFoE0RiLp4@eUD}cXfRDkx)=sH2r19E z-eZ~quE`t?46yM7vpn7l&l#+8VBYm2uXXmn~Wpcj}qE}OX&jFU98vs%f8@7uz&xn zA*S=0F-T~&hw__e1|8eynAyYxQtA>+>%eQC&FlRh-X zIoI|dq#%&gzeuoQEyFVGCjP@SK@nmT*RhR-;GXN|Q4QlBPN(GJHrA#=J~aCAXk?}{ zT03HwlOFgHY|VqVVQsl}A3yk4UbMS>=^0Ml=@`wr?;3vHYZG|b3%|Zux5bZ( zPjS;R>y~ZS+YbNQb+2POcv5#;`1M^=JZPd=$3qePI`ptD?(rE$f(H&B*r>dTUtiRP zuj@^`vTVbyTW#vAjgQe(z2(p)J#V-0ANuQ}Y!f}Cuemb3@NHC%M|Qo1S{)Nb(1mtK zT)6d)Pa{A2K{JJcB7*qA$f(WG)1DF#X9ZFCrG#Y4iV z-FnNXvG};^_*k;KZ^NLWxwvWH`^%V8saZ) z3Epzp5T;l6XzKj7$^YKgK#Vr9wFRu>!$*LxfJNB&l>-e}0OBPwpszGRI!=H;t2ZWK z^&rZ{ZZ`WM?58Y6psLkBTJ7|RkJgIgM5OEd;lU)XIy^QGraGil=)nicGdjEOX?tj2 z+P7oNba&lLduX3F>Bf;ao_^!pj@u?mJ2-88pgiBe1~ly5=A|>Dok;)hyXf;JYOuT5 z)3j4@$~?R>?Nb}eLd!It4Zmz`nf z)Sg>SAW%805`_?{prEN_!fH|-SfINGFV1~F)nxCbPLb=WY#+vX<&)}mD)EDkS1N!P z`=b~KlxPzSA_96(x)%a9@pkO{8n87ci8&(y92GS}Ky#of@na6s;Ku9$Mgs#j9q+w5Jp1sr zQV}|dE`$48tVGyhutxQ)l(@=r;^*r!*Ggl0jgT2vs#=2G=Xu?4aou1o)2}HARbuB+~33-!J*96Kv zStU^hp7_f9mMRap_WSliHV(o89RtZiohH1-eJqAFhh*f&X^5pS7g6v!0-0ziKnMQ< zD;-3WnIy{T(gYt>Fq;Jf(~qxl0PNlt%x2P4UZN-86 z?kDWN=j&P=D;mJ}K2u0zb8%XjiSxMyjTAhmK;X=Go$q>Fmk}{Lv^bKhmh6l8|BwokS^O8{<|dt>*V8 z6GznF;xvK$!9Y@a<{G31BYjhFdb5kp@vsN2PNS! zl%yj8<2(v(ihD>`N{$0m(309wzceLUQonkmHOW#nEGriH2J;}PM~g^H9&S%3L3N^Z zY1@YJad;yQ(f(2FB>`H*Up|i{9hhF%3>bIuZ&haC8NgLAHhZ2;A$MM{!B84Xj!TF; zNGh;iBUn`6Ns>vJ-C=ZzpB^OB=J+BXlnWSySu!HCx&p#txfQ@%F$7E@%OFVJU_Y}* z&ARifxo^AAY?5rzD}8sDgPY?oD=&m~*Rt<)L;(tXDh5Hgg0{Lz(77PtZGy2v&c{n8 z4rT~R;FPv8eiT|zLoA=*eK8rMs82_lfAD6$Sbk}wX!n+*KL zY?P+~C@67QX?0}NPO@`J~=DI4987b{P$JiiY)gg`+TLiIBM#X<(UKXTRH ziq?(yk!*cKJxS%0JI4Bu)A(y11!L_f{@7ujpz+EvoO|$;TlCi~A&Yz%@3Muy; z$-FJuK|^(LWB$o^Bm2IU#>t}Yj6C=54PAcJoF1!=ZK$iiU=GDGs1n9ZJqq#J{0m4X zgqnYz>Rh%;8qSkPMhT~i1GH2Cu;eI}6gdECl*0apEWacuo#&t{3&@~|NX+=<|IQF#^qX#j1d#6TKt7QpG=G6JC>uE4Hul+DPkTicKqQWp4^ zVVNcS1?17tQ*eAv1hgm~8Yh#4#5$nDoK;lVKKyGZ2D^u{Rh{tUU26=zc`z-{@ORt` zAP?ap_3*9mEwY6Z(dLHuy_*K68Mx1$mQGbrasA-IYzc2NZWy#ZyOz<-*M@bULFMEx z^~2ef6V>X5x_W}KC^H6_BtFJLEQs6%)UAuhPBX;^Mf*v&lm^&4OY7mQ6|i zQ{1cp_m~+%6U{w%!huFGz-K9z24$*1hRL`4XrjJl#IHC4h_R!3Q`?w-a`%{@mgk+L zYBbdIbWE@2`cusJ58`?cO0T2ZhIT_!JU?{SM$JDg;loe9SJ@K$2e2J@n<7}wWH7gy z66XI$;CsKL;lPqfc?!nYlZ@|oHXnfSj8?V)B!JoX(_%k8hblK2RJ{n`mwh+J^f6-o zZ<7MZIsR3eYCyp?p27fCc*NaLwEtAZ0osMd4b3l;2IcMDNb*4xP$`tvC zdVZwJ3q&t9Y8(fMpGPCsZtouPU6lEqLW1w15rSP6Y%<`v)qq|J6px6+N)cP9h@$HoBw@vRu)C?tATTr-v!Sp^Yk*t;sP=)ob>VB;O)7C-_ zTS20P1xw{f#gMaN{>oBA=^Dz{_>PR}Dq5uFHA9XF&l_nuTcu|84~D`QR>bBLmVk&h z)rYb+rI@jW$tyo(8^MY>tKN!{bs@s&A(9P60W{cqyZVT{gfUoEV$p~Y1C@TyKJxCr|ci}|ctKObWnr70s%u_-+1-xq;0Dlf^|TE)s>|Cq|M zP+Wrb+CmJGhH96;m`#>_qly42VPJPvg7A?Mlpsa4;twY;5v>?;X!Bu$-oe2Urit-n z3Wsr|IPSt+UIae-?bmCkWxIdWC=!!6ZEL*jYBFi|*n1ljh$xt-6b@+8 z>q~CF!Z)5AAS#DIy-_={v}`SGU3Dw$c?)eermdW4ENyp~!UO_HJA=O+b%)6ZaxK?R zvK+n`GVLGQvg#j6X543FViwi;=*JQK+{=RnyL0(KJBpeYe|bJ-$r#-q;WSYgBE3hv zErv;c5mDgaXAS+GSi(Q`M{@1-M;z{B2siu)aU#Tl)n8Zl-IBsm=dmv9@9*p8!SbrmgYUMTg!E+gqw<83t67XW72(2Wx*>Z@aR*&IU1v2UN@IcjiWivSI zz~Tp*07S?_;MrQ^45q`=;h&?%t0+GfucO{!;r_Kv#V5kz^4D&b_5nUG;OBmE;l4|U zgT&j5K1OdoMW5bn9w(n7zmp%me|LU$oP4?I<%xe}UA(#-H2wbU{o#k5sD0?azTIiO zXpLw4{)cz_b~t&{Yr`#TcH0_-U5etYZOd#LjYhDFr=S4B>r8uDoxQpFRVSCGsIv3b zVV6684lvT`5F1lPOQR<>L$8i191jcxV*P5ca~17H05TJM+04Mg3`GbN#C2M)6+|i! zpECz4it;$d+Q6$=13?N(7*d$VlQBB%#ji{;Uf8pfy8&Y>te>fE1O4!7kC(y_vEhEH zc*2N!3(TrlZ6fvrjtNk56(AvSiZ0qJNfia{IDm*C4l1yYpedA?rEenpy3h!gJX+lH z3grnz$*>XDF=cELvkXpBp;>i+%tXo(C@kp(eFoY4LIaKEJ3e}I-6s7E``*haDhl~) zo@{DFDu#ttw|c}q%Z4erB(PhMBXq%%$`jk5zzP+wGV;HdF)ip)9uQTrikCq?s*;dX ztt@r}WD`os#>${&OyD5QR+ZS$sfwxx&9cA&f@r}31VZNtUKL{F|EI_RIPrQoll!fd zbWHgAVyS|2>m_{%s*6=TtgaNI9xQ}-xc5rgz1suZGZ1JYz*D%t;$M1?7v%#A$bb*@2NcDjyr-xR3$BHa zm~a8*zdqlx+}w0a3Z)VuM?I@f_Of6!_n&OPj&LY$-6ikLwoQNBO~2luU^Dn5gO9jI z6Mn=fg^;3kgpX;`zsD4JrAhA4&5SSLu!(Yrw1UqNNd;kB;AZV2W)1u~Z5xi9Z5Ov~ zyNf_I2-xBw)JYxjUf}hK4@97uP95=4+@Ov?d-T6-AB%{pF3HRK0KK*9tuDp0AxCWl zSfOw*HecWdkNAyx2B*>%y+eoCAzED8Ha+M6sjG1Hrt(Euyqntqx*sW{dkGFjpmp-M zbXG642IysZwbl~l>jWG52-E~MQNUjWf|p*>>oqMX{1Q~4HAPhMa%9dCXhnA!ea#aG zg7*jGPpUhdG9p?Q9W&=-z+GWlClT`@@^HU zM?+zn%bbRZ^unM+5Lm1i^#kzo1zOSE4fBR_lPy6yJGoY3-L>34&+gN{D6UONkuD- zk)?3^PNEm*MoNlS(Y#-wcqM(dNLYg06~JTp(bl3hRh&n8$8!__NSX}^B@mKBioPtR*wT%*a>(V*(tUB30#o#~1;7T%B3XBAKs%^LV zSG+HOioq2QtmvD5iot)1!O37oMKICD;1Gu|g#9TBvYAbTO^`@#PIhD)MLoJ2L0FK? zKYp@3#VS`iq@`in0eY6idfz{Kg`|3wdVYp_N9g|N zj}7(iSjg5MI*8pK`l0Q2EZgq|2*d;h6SYeHe;Zc4*;DcbZZbTc&ZsH7C6$z*4JvMjAwTH?IRvM8*38X#{Q z5~Q$AFM?%)>XRoG&Jg1`7om*1LE6hqnIBe3N@O)`lu0^KgRZ0%J@SD*Z!|KP>yCqZ zk`5ZjNk6}Wm%=eeouFugg;k*hQES|IVO`6E5^3`2?_8%T*$Pb|8)@)GJi(+*1LUAP zgB1hvJ>pf+L#nwELJ63Jm<>2xAPqUikYt-g(oa*^L4*nC*n?h?yiT*NA=wVqui}`O za|$X2rs@=0y--`j*9JOxD9EQWqn^~(bG$T;A&s%}T4C-=UpO@wQ}{N(Axw=}g(arZ z7i3YMB%?e=wmnL!pf1hKK*kUHpZpK#hr(5$x3dW(6FLL^Ihh$_#33|7WY)t}p&BCf z6XPl%FPuQPd%-maC+{O>Op&SjuO+u82~yF?{R&%#Fzco<`?@ed7lWvfPNf;oPZCVo zpx;e1%uU~uK=rWcb-Ku^8_0+lit|#uWr8KmF#4PFl_AAj({Q$2 z+)$z5Q#h%aFv%W3sI z*v69mBc-WplbtO7#~sy8Dd^hxivs+JKi~pLhvt|_Q-cC9qeMnNq|HNqJGR-R+UODf zQZrP7@3;uvQEdi)V>ojrlOG9|6eMN|yNW=?43;EGypSu3ArZpt6z(57{AzYAgAzSu zfNGIA?-VX+mB}88GsI=~mEfp~t^v)9hRF)(x)O?Nz*f675q(GR-Ad?6DE)5_T)C4X zt<4+|SY%^`m*1U9%YHJlPfQzIe#dpYj_tO*X2rzTI!O`$P~s zVW-veExQ?ZqfRUAJIzj~M+rwC!i7pGiZgQu9OW%@4?s$w48V0+)>PXoEu5(kpQno5 z>Q~%504JLx7kvMEMI+qkg2egG*QXvTIwLRv<@8$nLsgnoczjgix`dvM1KD=h z*L8mcU!6;$Dwli`nz0F@}IpO2;$4g>>SAj+Q%m6$R}-L(vk+ zC=$A&0$Ll|s^#e{ggmK`rQAU}&~cjQx0bniDt_x{erT2LyW-wKN~8qY#z_1I_f13_ zkxwWAm*jpCcf;sI3BmFl^??w`lLHvZ_heiT2kE>1b`iQX+()n(!8+>){yn;kI2`11Eh@Xm4Dv*X z^(uODrjeG zrCE~kK_KywECdpkAWSskDv*FxmQodRqCP~@pandWv55Jaaup)CUQhV{oe3$pyus;- zpna2fc`%SyVH!*z>Xvshy;f$ZGa^m|$gDedq*#(WIW0;KG!HJnCszejZn*o98{rrH z5|I=@-*iE5gm|jW*DgGt|x!d+mk%FQJ}mpI>~A1K|? z=m4%Ed{3ak0p81qTmpoLs3^S3NM$J{PU=(E8Zfl^4!c)^MiG<-a{q;0DM9aD+gpMU zxvROxr5kjLq#l{U!B3WKs|LSbxw+(PCG5J3nMY`8lPUu^{d0y`FZ0{&dtztE6R~HU z_Nfml%W_RnpYR4J;U;{@N$lxBF1m$W!jPHPUF<6qz?J1Hal=$uRHh;4(A^J(4$M_KwU=PQUrq41TM!MaOxdMU%v~Pd4NHH3|8V; zlD(SFBDoE>Xd<^U2EVz4M#nm>9s<+ml-Hc5m$I05aIDc{ivlWu3qVh$YNj|R&f|biE^@5YgJ_7dAI>| zv62&p!v32$;lE|XkhgL@3bejte;FH=+FwFB!G+aM$u8n4Q;qAjJe`%=@^9QNDvg_g zxUOlQAzBoewVOp!1tIxFzPCouyF|cUkxp;b9$8knvR#n+nj$GusDIc6TwPt&uUxhZ zaG(byu4aD62)$cXcc*U@O0}){!X|D+YpbIG!QKO!`Pm4u)hKB~Lb7m9hHW?_1QCHq zn1HDTu>|%i2Q=w$coU(1>jFF?*okGfL>!bBDdO6v0GKwC*ZUxnkWw4MiI#uqL(tsb zBF!D5idYCdgit4d#zZ;+u>qM83~d6L!TO8>sh}R`)WMgxWX?hCkUkXZBE?OiCMe_$ z)!?$Po+wOj>30>daC48bitP6dJG z_b%;S>(m-j$f2R_-yRT^yz8E}ht8#cJEqt~ty32_6xRrMLldGp+|I|FF^s(lEHj3A zCKe2T!50Z$Y|b==m`n=N0>hSqMaqx|d<2tj1aPHzY&>5&`znb};#1WnE5K#g2^sdK z(7hIpn!cL{aM9A zq2$*In39P?aY-Xd^Rl8D4tja#Hn_hSfETgsJG1lmSku3PaauLgchHsU6FH)llqJf2 zeQ8SC62;Zh5O1tnDNgE>tqp3{neHcFogYZGR;NinDT-E8bILQyf5gd}U%Y~9(+Yll z^}K>J;GU@UQv~97nr20q{Wx+@-;DY!D;i{emhZ9gn{w*Pxq2E1A&8MBJQ0%_s~MsS z6=E1T|5+q4HJwbx)rGY!Jz>LJ-R8DpF$$Iq67USkt1}3+%p4Y~$U6`%HCL^emkP{2 zM-d1SFH4>w6(cnaPn-C|cC>t1ss^NuDyRVv5g;8XS}4qn)4V%_{HMaTB3S1t4uISh z8ZEEi4y>Tt@tuCN@4-B~<+`x!>o{Q$_3f_H?6qwd1ix@*Xpk$z{Y(;(+C+6u8FFD_ zDHb|4tTI#@2$K7ppFnO~lA+Hp9s9WxSy8js_d|prjM`z)51nS{dv?@<5qYm`Q`mI5 z!T5k`(@IvdGcaQatPM-ya8Smw;}y8GI2O#SL|sJ~dv8ev7>(AVl5T=PL&)6tvLt%B zF&g(HW55^T)5U1cu<^!mmIb4%A%+Rr`Q7o;(YHqiP+uB*nW&ZZ+8F>SqO*fy7jf4S zxST?+-|+=0v9Q6BgD1a%9}S{V7azM>dO7oM`UgAl_2qeYlqJL78#mZG?>ncR^WJF| zp6oTO&ee4L<%^EV+^`ReZI=>%YcTU`>b$Qr-8-6*y*xb5K4x-)8w0S$S28c#o z27#w#z>*0A5*a!k#>g<3FT^^<8WwSwk;fFq<|$G3_$3={I&4OfWJI2}6>dhy*oDSy zYKVn<2F+gFB}0U5v4YawNUmqGF-1oWRZ8381eiqsH7`9?d~N6|)giXLQ`>l*z(`!? zhs%>*a05M=TRAXO^#RhHnoVPT%^}T;q;d$TI7DE2GBhWRqXFBjaXcCU;(<%Nj7D%E z0K-VSY_{f15T+lQ7OD6U8_qzs1kmr~^o_&bi=G+dU;?cU%?63NvS(Z(oW+PhpGjW> zd@O3IgR!pkwa`5&gD4~#LUK63Hv#YdQYR$@F@`EhoJP6YUp2!kr31t=FW2y@xPoi4gmoMSEtSB=+JG z6=7p1MNOoVSGIhT8mwjoRCfeyM!}6CqyWMZNa$;&)>%9zy#k?v#?B2%plD5XY4mm=rNV(;AO5F)wm%_3@1X{zr1YOmVY->kz~^ zzae4kEwYgGqU+~Ir-LLaoF`$C;7+4HP+^ugM9&^h9?Cs`CaD|R?wq<@90frPQrhcu zoyf%+pehhf&=cDdL`HWs>mk=e8VtxgOs%gzXetiGWUB218<{bwO6TQ~N{HyfSV_*^ zyypq-lYY=$(B%t}_fqjB)y4vOw#1QRr@j8W-)lkhr3}2Pu9R{Xw-X8pmjbjGUg4@V(w@)?NC@qYhfouVSQhMQUbJ zDWj)QGQ)(NnxMXuz#YA6Lm};x@gm}rdrh`fL;!TufIno1iHoAFO}*(S2p$!)7!C6JiU6VS8O*g!oKkiHOG z(?|3VxK)MWpuSCSBnTnPg4ku=%qDR}4>G$Q%k{0U)<; zN<{>sl4CD86ki{|$S`+9H}K`{nR*`e3ciy%4G?OHK!^YjMdFRB1AckT5iW@ttPl_*7kLAb(y|MV+dbVjmU#D!Zt+ z{e%0)QXkbpk^ub;yC;QGs+S_x#$);^%va^U1E>l{;*f0I?SYG?3X@cZe~qD2z)@XL zq|W#P6y;1z3{2w*NfS-we$D_5e;x-?wG+g)wvPg+tH5c6Fs=gAMNnD+q<;+V>U^A3$=L$@s7?V>713y>r~*Jxq8en>D^Smp69WU zc_SRnB2eBCNQn)kHvljT)=fOu89m0=cqyIcx5#EP{mcFkPV%ELM3=II7^d-y&UKx*c3byU0!l_H;2njO2RA^d*Dsi%0^K zxiZ5ub&{q5Y)2io#*JA+cK09Ix@R#HbGhynwl0q5H$>N*L*`%SIzfU{%2}a~I#0Mf zxzg1gQnEtqC~_N*V1_S~qA1rUnF$1PHw1xLT&r^Sgh~3}cvY$sG&ebOdv^6i=rhVt zSsL{bWvHyQB-f7oEYFQ2#HAP`;iEAn7ltv!m6U| zi#rb<363j)BsuKNb!-)_Kl<;Q^p)>uNqxJNi4A>&`*^QG) zQf}v`nUQpgV`(!p$CbN8)Fio*~QW~-V zL5hqs;ti5d1_-f3Nu?-RmK3sqW2mU<&L}~$HWQ1|HrAIYNl1}fxfcg;^3=YR2O31b zAflXtoKlKH%u70F0?hkYiNO@)RI>v8EVZFQRCzWj;U*(&B^O$Pu31#n4zu;E8YoCvH+_b5{t|G+>=oIfDo2ToEXPJOC=PGSTUI zQbPo@s;mH}Q^`RQiVFCXW(mxxsia~0wb&o57*lze#m923Wjb4ikA_@saX7mKGUe)& zTSxZt4%b6ik5&T+L)fy?LKz!YiS-_38`vUAQyXCjTJV6u9|%@h^yIbSCjUr6^gbN+-&5G6be6aFQ1mWK3XKkU~_9} z828+p+6kcpHK!ufbq&<^O35n`X$VPXX480r%+t6sUuBrf{1=qRf~Ij8Qt4%8ZU10D5EB1 z2*>L9W&bf2gj*HjQLRmGK~-OEPGv0}n*$6@(S>tj0?Z);^~wxN*?lp;0F$IQO@k{_ zw-E)7R}l$c$WNrJ;|l3&12sIFUa4(tC&G7EBh%3{W?v_XieV^s!NdC|n5@SG(b~o? z2rBqr7u{3qSxj&t<6|K94Q5_)kW%)C01wb?7p7keV5SGZ=6p_s`~X6cs_sUx6Y36w zG>hOu@!{m9iL|xCs0;qr-@{~#P|^wmuy-ey7pL3551jO-w|8{%X*AjlcZ2uuy{qPj z--ny0!C|AjJNdn{yWI{)t>1x(uQq$1U-VxL{YiX!7)?g6ch8$U9}{=;q_ypK8?Qfy z$z29u<(^tb-+~F64A_=QMe77TuP)8Wm7;m20U7TGLA}slo$6T`U2Ys)L`IU5xez8B zyu*;1gjXL^DliHQ!coK_K^4|k4cz4poTrE)+YQLF4u)4C4%cfGXU6`X#4_A~on2D# zlC~P&Qk0O}w0FrV7|~v!t~U6gVegU)ZuQZnO`fYhbgb~ap?@z?QRTs~1;Mt#<<10SExY!a{2xF8>p}&`!p*xCB}DuSfOITiX2d~ z4212CkPuobu?v2_de8C8e`eAIA_xl z%youPB*TEHrmyI4LrDGODSEPU%?+ab`U$N2wZ2Nxh#1|R-7p9f3AQW3jaSJk$RT&A zkc-H@FP?#%;2p2{Zk>i>!!0umx)(h_6mka4lUa9Yl6Pzl^D=p8%Ckdfib8a2r;Fm{ zRF4|%>I$*lhaw)Rj|5Wq7BnwHWNXHKdbDgrCrZdAePWi*xdlP$YhZ zdM7FtM#3;8j>MwF1+pO8IhQ>X!0Z@V-YSAu!a!9-Jys@(pl_PSGz8HOW&>1xv&>en z1gtRdR+pR$L1@+#xF`dDlVA;IlQ58DQtFT@2~N z(o8~2GstHEf5iLW$n4|~l1X=@>P~7fth(KH9WOKbaC%0-Yn0I0i>Py4;~+|>!u_4oUfH+ zUx^eDtz^hV;S|dwre|zr$pdD&&DZ#AFmf$hQzkfMSu8!6RR^ zK|o7FQn6C4Qatj5}_7Q z0cdYFk3=!V^{HFzzUU&H(^H!N?+84uj@^`vOwL}tu}QLW{R-Q zLi>m4=`MM0Me zVu|W6e3l*RfFgztwPrAi(3a?Jla?l2vMk~}4s?ny7!Fm>fh!8NH!V$q5l;T*r z=n=xK8}tGVkgX-cMBqyrxcU{QxR?d3FoF%CF}y)U2_IiHsT@X%K~j0dmY@aVAz{?4 zV4#4SxauGnMF*+_tX{pvYsiWM>IF>-&mjUI(*@e6aUe#Ljn%~}!*IC0iBR;2^CkY$ zIPoP+aKW5;2&04<^V=r>tLYo)pwR}`@>~3Pbcg02i*=Y%>E;r?$h+02xuHsIY!Qir zfI9+URN)PgMR)aR6|6vb9yqv75FO=CfCwBzrDUJw9b6{G9E-ld?6&HUi;cw98llT>w5uWP;vRrdt(RfKL4i12UZxpW_`$ z`2}Re0oe^kX_~+^40bRanNcFX#aAGFA%PNq#Yc*mzC*Xmk&PaJDM_cR(D0-5yKSHk zvi~O;6^Le_2;e@#S3nx=HesI(P6rnJD1hkNZ2;GOpf}(LI8Agq0h|uV??Av;hRv|x zL0PyC5Pqm5jKBEGvWNHtX|B3JBIJ^QN(s{dN42OGgo#5mJpLmp1N0{BVmbRo7jMUC z8ifcaw{|J|Q0tO#vxT@c__}k+*SBK}(A}~;QR0+B47FqdpnPjSM84AX3x-zd?iDXC za#4|{p4d!nm6fwE}())o@8`WSfwGv7cvv#fWmb6W}M6*JdR*<%&d+qFee77IG{q*Jc=B9hP{rb)AvA-LA zaeEgBr*X7<+`HU+yPF+^AK%`bjy`+N@y9pGvG?huze%puV(Vzh$QtL+-HHy*sgfn% zCw^dD66Jyq5tqQoV>lwfJ}Sv!02EBkwrlror{~qrS*{`K6w;Wr2hTv`uygauo*Xs8 zN%|tc+}b)BG%g$auiv|ew|nvH;nsEU@chr0$Yu2A;_9&f<=xB90FG?qh+L^N)AgGj@=;wf_IquCAiJ4#u_@?h z*@oEerp<8NvQ9pJ8h_mSY+a5&?pQPbXmGIeDHt8?9-Z$*AC7mNttcG7j9VW(w{dek zKA$vBhP`v=;4(k=wm$^Jy=lYm9mVgy?0k9Gh@N;uh>fCc2;X%bryVZa5IiaBk1lxv zczJi0~ffEd{|@smrL4Te26R>sE9FZ>TFz+>4T0B*haVks!w-NH`L< z75NY~>r181P=XAlOS!*h#n6neSua(llvV!Oh!Y{hwifyqAvRW2hc3;jSPXtw?ThH1 zG%~9=N0%gwl=@4uh_!Z_LFAZ}ciMd+>Mr7ksK_B4M?_)FuMS)AYZYAr!ye{I?;xZ9 zxu_~)jl@(6n2dYPWN3*!Vv}fDwZp|BQ09t-@`R^Y85(K^h&WeDL9+&_wK!UA`=K}b z7OH&cGN_%>)q=zg-Bh M{E>(Gc!Wv*f5N0D#sB~S diff --git a/pandora_console/include/styles/js/images/ui-icons_444444_256x240.png b/pandora_console/include/styles/js/images/ui-icons_444444_256x240.png index b5edd1f8938dd961d144b4aeb61c26c4d6d56bdd..df4e37378517044e8d109e5682b0d411d2eff92e 100644 GIT binary patch literal 3266 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 diff --git a/pandora_console/include/styles/js/images/ui-icons_555555_256x240.png b/pandora_console/include/styles/js/images/ui-icons_555555_256x240.png index daa09aa2f55599dce86d869e2da8a26a9c85ff78..bbb422fed19271590726760a02a4b251d7143cad 100644 GIT binary patch literal 3274 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 IM6N<$f@ur&%K!iX literal 66434 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 JjfR-y{|7E5pbG#1 diff --git a/pandora_console/include/styles/js/images/ui-icons_777620_256x240.png b/pandora_console/include/styles/js/images/ui-icons_777620_256x240.png index e26a7ad1d716e69762a09764234fee4d5d280187..ee49e9e501496827b5d632892a15f87535455af8 100644 GIT binary patch literal 3262 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 literal 66445 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

    $QSb&+9}^+d)oE&*?eccF(bG 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 L3WI!@V3PkIqduSG diff --git a/pandora_console/include/styles/js/images/ui-icons_777777_256x240.png b/pandora_console/include/styles/js/images/ui-icons_777777_256x240.png index 2002c8c96d223b9b5b938e720cbf77c45c560336..b01ff3deebd1fca16da650534e7e44abbe72cbf5 100644 GIT binary patch literal 3266 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 AyZ`_I literal 66457 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 diff --git a/pandora_console/include/styles/js/images/ui-icons_cc0000_256x240.png b/pandora_console/include/styles/js/images/ui-icons_cc0000_256x240.png index 65587cb507a9c1d12b6953fb4f8de1a7080fe57d..8920193948f0642fb2e4e722b702bae4e26bfaf4 100644 GIT binary patch literal 3262 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 literal 66457 zcmeHw*K*rfpXYr)1%_SQyHjnDhzxE?J+dTQvXyMfa=6ig07yat2^s(;QBza3SNjh8 zAX|ICk1|iPzyArq0h1No{q5%tBErGR=bytbztBHx|FV6wb^7IaM;qkBc;lBf`q5%< z)L*ZKquRzVnzl9wy?`!oISg}8^9Np^l=*Y!rUL! zv;nTxYlA!=XD=I#ev}U;-8%pAGE|b){bYEbD!eN%NArfLWRiucpN#Twls~X0^T}$m zo~$PO@ip-|*8Mn{1oh0WdqeLw8F|u~G(Hrew=-PVP>7i~>Gzx()Yx@CQ9 zzYZ?9oYC;cI=0fy_4OLxlvzHF!)y?S`5m`pgYV8pFZG7ub&_6Yx@Yyeo@LpA>-9RO z(`ovi-!cLx^zEkQ1iiYSVVDheWF9dS2Or|oy>ENdZrk_XxxXjvIR1P#%0DMpezZH? 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 diff --git a/pandora_console/include/styles/js/images/ui-icons_ffffff_256x240.png b/pandora_console/include/styles/js/images/ui-icons_ffffff_256x240.png index 61962b53d24b6f70e68425a3e078b4134328f74c..1cba4313d3b931df8231fd958084bb9dc27e31bd 100644 GIT binary patch literal 3264 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 diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css index 6f707d174e..aaefa3cdce 100644 --- a/pandora_console/include/styles/js/jquery-ui_custom.css +++ b/pandora_console/include/styles/js/jquery-ui_custom.css @@ -168,22 +168,22 @@ .ui-dialog-titlebar { border: 0px; } -.ui-dialog-titlebar .ui-icon-closethick, -.ui-dialog-titlebar .ui-state-default, -.ui-dialog-titlebar .ui-state-hover, -.ui-dialog-titlebar button { - background: transparent; - border: 0px; + +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background: none; } +.ui-dialog-titlebar.ui-icon-closethick:hover, .ui-dialog-titlebar .ui-icon-closethick { - margin-top: -5px; - background-image: url("../../../images/icono_cerrar.png"); - top: 20%; - left: 70%; + background: none; } -.ui-dialog-titlebar.ui-icon-closethick:hover { - background-image: url("../../../images/icono_cerrar.png"); +.ui-button.ui-corner-all.ui-widget.ui-button-icon-only.ui-dialog-titlebar-close, +.ui-button.ui-corner-all.ui-widget.ui-button-icon-only.ui-dialog-titlebar-close:hover { + background: url("../../../images/icono_cerrar.png") no-repeat center center; } + .ui-dialog-title { color: #ffffff; font-size: 9pt; diff --git a/pandora_console/operation/events/events.build_query.php b/pandora_console/operation/events/events.build_query.php index f915a5093b..7da35b6977 100755 --- a/pandora_console/operation/events/events.build_query.php +++ b/pandora_console/operation/events/events.build_query.php @@ -142,41 +142,43 @@ switch ($status) { break; } - -$events_wi_cdata = db_get_all_rows_sql('SELECT id_evento,custom_data from tevento WHERE custom_data != ""'); -$count_events = 0; -$events_wi_cdata_id = 'OR id_evento IN ('; -if ($events_wi_cdata === false) { - $events_wi_cdata = []; -} - -foreach ($events_wi_cdata as $key => $value) { - $needle = base64_decode($value['custom_data']); - if (($needle != '') && ($search != '')) { - if (strpos(strtolower($needle), strtolower($search)) != false) { - $events_wi_cdata_id .= $value['id_evento']; - $count_events++; - } - } - - if ($value !== end($events_wi_cdata) && $count_events > 0) { - $events_wi_cdata_id .= ','; - $events_wi_cdata_id = str_replace(',,', ',', $events_wi_cdata_id); - } -} - -$events_wi_cdata_id .= ')'; - -$events_wi_cdata_id = str_replace(',)', ')', $events_wi_cdata_id); - -if ($count_events == 0) { - $events_wi_cdata_id = ''; -} - +/* + * Never use things like this. + * + * $events_wi_cdata = db_get_all_rows_sql('SELECT id_evento,custom_data from tevento WHERE custom_data != ""'); + * $count_events = 0; + * $events_wi_cdata_id = 'OR id_evento IN ('; + * if ($events_wi_cdata === false) { + * $events_wi_cdata = []; + * } + * + * foreach ($events_wi_cdata as $key => $value) { + * $needle = base64_decode($value['custom_data']); + * if (($needle != '') && ($search != '')) { + * if (strpos(strtolower($needle), strtolower($search)) != false) { + * $events_wi_cdata_id .= $value['id_evento']; + * $count_events++; + * } + * } + * + * if ($value !== end($events_wi_cdata) && $count_events > 0) { + * $events_wi_cdata_id .= ','; + * $events_wi_cdata_id = str_replace(',,', ',', $events_wi_cdata_id); + * } + * } + * + * $events_wi_cdata_id .= ')'; + * + * $events_wi_cdata_id = str_replace(',)', ')', $events_wi_cdata_id); + * + * if ($count_events == 0) { + * $events_wi_cdata_id = ''; + * } + */ if ($search != '') { $filter_resume['free_search'] = $search; - $sql_post .= " AND (evento LIKE '%".$search."%' OR id_evento LIKE '%$search%' ".$events_wi_cdata_id.')'; + $sql_post .= " AND (evento LIKE '%".$search."%' OR id_evento LIKE '%$search%' )"; } if ($event_type != '') { diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index cb95cf116f..0c7b604d3c 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -169,7 +169,9 @@ if (is_ajax()) { $data = array_reduce( $events, function ($carry, $item) { - $carry[] = (object) $item; + $tmp = (object) $item; + $tmp->evento = io_safe_output($tmp->evento); + $carry[] = $tmp; return $carry; } ); @@ -589,6 +591,47 @@ if (is_metaconsole() !== true) { } } +/* + * Load user default form. + */ + +$user_filter = db_get_row_sql( + sprintf( + 'SELECT f.id_filter, f.id_name + FROM tevent_filter f + INNER JOIN tusuario u + ON u.default_event_filter=f.id_filter + WHERE u.id_user = "%s" ', + $config['id_user'] + ) +); +if ($user_filter !== false) { + $filter = events_get_event_filter($user_filter['id_filter']); + if ($filter !== false) { + $id_group = $filter['id_group']; + $event_type = $filter['event_type']; + $severity = $filter['severity']; + $status = $filter['status']; + $search = $filter['search']; + $text_agent = $filter['text_agent']; + $id_agent = $filter['id_agent']; + $id_agent_module = $filter['id_agent_module']; + $pagination = $filter['pagination']; + $event_view_hr = $filter['event_view_hr']; + $id_user_ack = $filter['id_user_ack']; + $group_rep = $filter['group_rep']; + $tag_with = $filter['tag_with']; + $tag_without = $filter['tag_without']; + $filter_only_alert = $filter['filter_only_alert']; + $id_group_filter = $filter['id_group_filter']; + $date_from = $filter['date_from']; + $date_to = $filter['date_to']; + $source = $filter['source']; + $id_extra = $filter['id_extra']; + $user_comment = $filter['user_comment']; + } +} + /* * Load filter form. */ @@ -1039,6 +1082,20 @@ try { // Open current filter quick reference. $active_filters_div = '

    '; + + // Current filter. + $active_filters_div .= '
    '; + $active_filters_div .= '
    '.__('Current filter').'
    '; + $active_filters_div .= '
    '; + if ($user_filter !== false) { + $active_filters_div .= io_safe_output($user_filter['id_name']); + } else { + $active_filters_div .= __('Not set.'); + } + + $active_filters_div .= '
    '; + $active_filters_div .= '
    '; + // Event status. $active_filters_div .= '
    '; $active_filters_div .= '
    '.__('Event status').'
    '; @@ -1362,8 +1419,8 @@ function process_datatables_item(item) { // Add event severity to end of text. evn = '
    '; - evn += '
    '; + evn += '
    '; // Grouped events. if(item.event_rep) { evn += '('+item.event_rep+') '; From 457c1c9edfc4b091d711e2dbe7b44048edb0c51d Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 17 Jun 2019 18:33:39 +0200 Subject: [PATCH 108/460] wip event view --- pandora_console/include/ajax/events.php | 32 +++- pandora_console/include/constants.php | 2 +- pandora_console/include/functions_events.php | 49 ++++-- pandora_console/include/functions_ui.php | 17 +- .../include/javascript/pandora_events.js | 2 +- pandora_console/operation/events/events.php | 150 ++++++++++-------- 6 files changed, 158 insertions(+), 94 deletions(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 2293ac11d1..6d99e8b22e 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -287,9 +287,8 @@ function show_filter() { $("#load-filter-select").dialog({ resizable: true, draggable: true, - modal: true, - closeOnEscape: true, - open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); } + modal: false, + closeOnEscape: true }); } @@ -487,12 +486,29 @@ if ($save_filter_modal) { ?> '; // Order. - $output = $filter.$extra.$table.$js; + $err_msg = '
    '; + $output = $err_msg.$filter.$extra.$table.$js; ui_require_css_file('datatables.min', 'include/styles/js/'); ui_require_javascript_file('datatables.min'); diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 4798927536..dee5498015 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -668,7 +668,7 @@ function show_event_response_command_dialog(id, response, total_checked) { }); } -var processing = 0; +var processed = 0; function update_event(table, id_evento, type, row) { var inputs = $("#events_form :input"); var values = {}; @@ -678,7 +678,6 @@ function update_event(table, id_evento, type, row) { }); var t1 = new Date(); - processing += 1; // Update events matching current filters and id_evento selected. $.ajax({ type: "POST", @@ -691,24 +690,23 @@ function update_event(table, id_evento, type, row) { id_evento: id_evento, filter: values }, - success: function() { + success: function(d) { + processed += 1; var t2 = new Date(); var diff_g = t2.getTime() - t1.getTime(); var diff_s = diff_g / 1000; - - // If operation takes less than 2 seconds, redraw. - processing -= 1; - if (diff_s < 2) { - redraw = true; - } - if (redraw) { - if (processing == 0) { - table.draw(false); + if (processed >= $(".chk_val:checked").length) { + // If operation takes less than 2 seconds, redraw. + if (diff_s < 2) { + redraw = true; + } + if (redraw) { + table.draw(false); + } else { + $(row) + .closest("tr") + .remove(); } - } else { - $(row) - .closest("tr") - .remove(); } } }); @@ -731,14 +729,22 @@ function delete_event(table, id_evento, row) { // Imported from old files. function execute_event_response(event_list_btn) { + processed = 0; $("#max_custom_event_resp_msg").hide(); $("#max_custom_selected").hide(); var response_id = $("select[name=response_id]").val(); + var total_checked = $(".chk_val:checked").length; + + // Check select an event. + if (total_checked == 0) { + $("#max_custom_selected").show(); + return; + } + if (!isNaN(response_id)) { // It is a custom response - var response = get_response(response_id); // If cannot get response abort it @@ -746,16 +752,8 @@ function execute_event_response(event_list_btn) { return; } - var total_checked = $(".chk_val:checked").length; - - // Check select an event. - if (total_checked == 0) { - $("#max_custom_selected").show(); - return; - } - // Limit number of events to apply custom responses - // to for performance reasons. + // due performance reasons. if (total_checked > $("#max_execution_event_response").val()) { $("#max_custom_event_resp_msg").show(); return; @@ -801,30 +799,32 @@ function execute_event_response(event_list_btn) { } } else { // It is not a custom response + var delay = 5000; + var $i = 0; switch (response_id) { case "in_progress_selected": - $(".chk_val").each(function() { - if ($(this).is(":checked")) { - in_process_event(dt_events, $(this).val(), this.parentElement); - } + $(".chk_val:checked").each(function() { + setTimeout( + in_process_event(dt_events, $(this).val(), this.parentElement), + total_checked * delay * $i++ + ); }); - dt_events.draw(false); break; case "validate_selected": - $(".chk_val").each(function() { - if ($(this).is(":checked")) { - validate_event(dt_events, $(this).val(), this.parentElement); - } + $(".chk_val:checked").each(function() { + setTimeout( + validate_event(dt_events, $(this).val(), this.parentElement), + total_checked * delay * $i++ + ); }); - dt_events.draw(false); break; case "delete_selected": - $(".chk_val").each(function() { - if ($(this).is(":checked")) { - delete_event(dt_events, $(this).val(), this.parentElement); - } + $(".chk_val:checked").each(function() { + setTimeout( + delete_event(dt_events, $(this).val(), this.parentElement), + total_checked * delay * $i++ + ); }); - dt_events.draw(false); break; } } @@ -839,28 +839,20 @@ function check_massive_response_event( var counter = 0; var end = 0; - $(".chk_val").each(function() { - if ($(this).is(":checked")) { - var event_id = $(this).val(); - var server_id = $("#hidden-server_id_" + event_id).val(); - response["target"] = get_response_target( - event_id, - response_id, - server_id, - response_command - ); + $(".chk_val:checked").each(function() { + var event_id = $(this).val(); + var server_id = $("#hidden-server_id_" + event_id).val(); + response["target"] = get_response_target( + event_id, + response_id, + server_id, + response_command + ); - if (total_checked - 1 === counter) end = 1; + if (total_checked - 1 === counter) end = 1; - show_massive_response_dialog( - event_id, - response_id, - response, - counter, - end - ); + show_massive_response_dialog(event_id, response_id, response, counter, end); - counter++; - } + counter++; }); } diff --git a/pandora_console/operation/events/event_statistics.php b/pandora_console/operation/events/event_statistics.php index 437ec0f47c..a4a5b1632a 100644 --- a/pandora_console/operation/events/event_statistics.php +++ b/pandora_console/operation/events/event_statistics.php @@ -1,30 +1,48 @@ '; diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 8fa3963d6a..f8e53ab7d1 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -93,7 +93,7 @@ $text_agent = get_parameter('filter[text_agent]'); $id_agent = get_parameter('filter[id_agent]'); $id_agent_module = get_parameter('filter[id_agent_module]'); $pagination = get_parameter('filter[pagination]'); -$event_view_hr = get_parameter('filter[event_view_hr]', 8); +$event_view_hr = get_parameter('filter[event_view_hr]', $config['event_view_hr']); $id_user_ack = get_parameter('filter[id_user_ack]'); $group_rep = get_parameter('filter[group_rep]', 1); $tag_with = get_parameter('filter[tag_with]', []); @@ -1034,6 +1034,13 @@ $filter .= ui_toggle( ); try { + $checkbox_all = html_print_checkbox( + 'all_validate_box', + 1, + false, + true + ); + $default_fields = [ 'evento', 'id_evento', @@ -1070,7 +1077,7 @@ try { 'class' => 'action_buttons w120px', ],[ 'text' => 'm', - 'extra' => "", + 'extra' => $checkbox_all, 'class' => 'w20px', ], ]; @@ -1090,7 +1097,7 @@ try { 'class' => 'action_buttons w120px', ],[ 'text' => 'm', - 'extra' => "", + 'extra' => $checkbox_all, 'class' => 'w20px no-text-imp', ], ] @@ -1298,7 +1305,6 @@ html_print_input_hidden( echo "
    "; echo "
    "; echo "
    "; -echo "
    "; // Load filter div for dialog. echo ''; From dc81d168e0d15cc4943f7d78d348a3048581f3eb Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 18 Jun 2019 11:00:48 +0200 Subject: [PATCH 112/460] event filters group selectors --- pandora_console/include/ajax/events.php | 7 +++++++ pandora_console/include/functions_events.php | 2 +- .../include/javascript/pandora_events.js | 19 +++++-------------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 6d99e8b22e..1c9a4a6c7b 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -420,6 +420,13 @@ if ($save_filter_modal) { $data[1] = __('Filter group').$jump; } + $user_groups_array = users_get_groups_for_select( + $config['id_user'], + 'EW', + users_can_manage_group_all(), + true + ); + $data[1] .= html_print_select( $user_groups_array, 'id_group_filter', diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 368e02c028..acc36a8f09 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -2901,7 +2901,7 @@ function events_get_event_filter_select($manage=true) $sql = ' SELECT id_filter, id_name FROM tevent_filter - WHERE id_group_filter IN ('.implode(',', array_keys($user_groups)).')'; + WHERE id_group_filter IN (0, '.implode(',', array_keys($user_groups)).')'; $event_filters = db_get_all_rows_sql($sql); diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index dee5498015..ff596aacb7 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -680,6 +680,8 @@ function update_event(table, id_evento, type, row) { // Update events matching current filters and id_evento selected. $.ajax({ + async: true, + timeout: 10000, type: "POST", url: $("#hidden-ajax_file").val(), data: { @@ -799,31 +801,20 @@ function execute_event_response(event_list_btn) { } } else { // It is not a custom response - var delay = 5000; - var $i = 0; switch (response_id) { case "in_progress_selected": $(".chk_val:checked").each(function() { - setTimeout( - in_process_event(dt_events, $(this).val(), this.parentElement), - total_checked * delay * $i++ - ); + in_process_event(dt_events, $(this).val(), this.parentElement); }); break; case "validate_selected": $(".chk_val:checked").each(function() { - setTimeout( - validate_event(dt_events, $(this).val(), this.parentElement), - total_checked * delay * $i++ - ); + validate_event(dt_events, $(this).val(), this.parentElement); }); break; case "delete_selected": $(".chk_val:checked").each(function() { - setTimeout( - delete_event(dt_events, $(this).val(), this.parentElement), - total_checked * delay * $i++ - ); + delete_event(dt_events, $(this).val(), this.parentElement); }); break; } From d8a331bf77e1defc54c2975ca8d55bf290b41388 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 18 Jun 2019 12:48:28 +0200 Subject: [PATCH 113/460] event filters tags, date, module name --- pandora_console/include/functions_events.php | 102 ++++++++++++++----- pandora_console/include/functions_ui.php | 8 +- pandora_console/include/styles/events.css | 36 ------- pandora_console/include/styles/tables.css | 60 ++++++++++- 4 files changed, 138 insertions(+), 68 deletions(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index acc36a8f09..0f46f00da9 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -482,14 +482,55 @@ function events_get_all( throw new Exception('[events_get_all] Fields must be an array or "count".'); } - $sql_filters = []; - if (isset($filter['event_view_hr']) && ($filter['event_view_hr'] > 0)) { + if (isset($filter['date_from']) && $filter['date_from'] != '0000-00-00') { + $date_from = $filter['date_from']; + } + + if (isset($filter['time_from'])) { + $time_from = $filter['time_from']; + } + + if (isset($date_from)) { + if (!isset($time_from)) { + $time_from = '00:00:00'; + } + + $from = $date_from.' '.$time_from; $sql_filters[] = sprintf( - ' AND utimestamp > UNIX_TIMESTAMP(now() - INTERVAL %d HOUR) ', - $filter['event_view_hr'] + ' AND te.utimestamp >= %d', + strtotime($from) ); } + if (isset($filter['date_to']) && $filter['date_to'] != '0000-00-00') { + $date_to = $filter['date_to']; + } + + if (isset($filter['time_to'])) { + $time_to = $filter['time_to']; + } + + if (isset($date_to)) { + if (!isset($time_to)) { + $time_to = '23:59:59'; + } + + $to = $date_to.' '.$time_to; + $sql_filters[] = sprintf( + ' AND te.utimestamp <= %d', + strtotime($to) + ); + } + + if (!isset($from)) { + if (isset($filter['event_view_hr']) && ($filter['event_view_hr'] > 0)) { + $sql_filters[] = sprintf( + ' AND utimestamp > UNIX_TIMESTAMP(now() - INTERVAL %d HOUR) ', + $filter['event_view_hr'] + ); + } + } + if (isset($filter['id_agent']) && $filter['id_agent'] > 0) { $sql_filters[] = sprintf( ' AND te.id_agente = %d ', @@ -728,43 +769,36 @@ function events_get_all( } } - $_tmp = ' AND ('; foreach ($tags as $id_tag) { if (!isset($tags_names[$id_tag])) { $tags_names[$id_tag] = tags_get_name($id_tag); } - if ($first) { - $_tmp .= ' ( '; - $first = false; - } else { - $_tmp .= ' AND ( '; - } - + $_tmp .= ' AND ( '; $_tmp .= sprintf( - 'tags LIKE "%s"', - $tag_names[$id_tag] + ' tags LIKE "%s" OR', + $tags_names[$id_tag] ); $_tmp .= sprintf( - 'tags LIKE "%s,%%"', - $tag_names[$id_tag] + ' tags LIKE "%s,%%" OR', + $tags_names[$id_tag] ); $_tmp .= sprintf( - 'tags LIKE "%%,%s"', - $tag_names[$id_tag] + ' tags LIKE "%%,%s" OR', + $tags_names[$id_tag] ); $_tmp .= sprintf( - 'tags LIKE "%%,%s,%%"', - $tag_names[$id_tag] + ' tags LIKE "%%,%s,%%" ', + $tags_names[$id_tag] ); $_tmp .= ') '; } - $sql_filters[] = $_tmp.') '; + $sql_filters[] = $_tmp; } } @@ -773,7 +807,6 @@ function events_get_all( $tag_without = base64_decode($filter['tag_without']); $tags = json_decode($tag_without, true); if (is_array($tags) && !in_array('0', $tags)) { - $_tmp = ' AND ('; foreach ($tags as $id_tag) { if (!isset($tags_names[$id_tag])) { $tags_names[$id_tag] = tags_get_name($id_tag); @@ -781,23 +814,23 @@ function events_get_all( $_tmp .= sprintf( ' AND tags NOT LIKE "%s" ', - $tag_names[$id_tag] + $tags_names[$id_tag] ); $_tmp .= sprintf( ' AND tags NOT LIKE "%s,%%" ', - $tag_names[$id_tag] + $tags_names[$id_tag] ); $_tmp .= sprintf( ' AND tags NOT LIKE "%%,%s" ', - $tag_names[$id_tag] + $tags_names[$id_tag] ); $_tmp .= sprintf( ' AND tags NOT LIKE "%%,%s,%%" ', - $tag_names[$id_tag] + $tags_names[$id_tag] ); } - $sql_filters[] = $_tmp.') '; + $sql_filters[] = $_tmp; } } @@ -891,6 +924,17 @@ function events_get_all( $sql_filters[] = $tags_acls_condition; } + // Module search. + $agentmodule_join = ''; + if (!empty($filter['module_search'])) { + $agentmodule_join = 'INNER JOIN tagente_modulo am + ON te.id_agentmodule = am.id_agente_modulo'; + $sql_filters[] = sprintf( + ' AND am.nombre = "%s" ', + $filter['module_search'] + ); + } + // Order. $order_by = ''; if (isset($order, $sort_field)) { @@ -899,7 +943,7 @@ function events_get_all( // Pagination. $pagination = ''; - if (isset($limit, $offset)) { + if (isset($limit, $offset) && $limit > 0) { $pagination = sprintf(' LIMIT %d OFFSET %d', $limit, $offset); } @@ -977,6 +1021,7 @@ function events_get_all( %s FROM %s %s + %s %s JOIN %s ta ON ta.%s = te.id_agente %s @@ -994,6 +1039,7 @@ function events_get_all( $group_selects, $tevento, $event_lj, + $agentmodule_join, $tagente_join, $tagente_table, $tagente_field, diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 9803666c08..ac77ae6771 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3127,10 +3127,16 @@ function ui_print_datatable(array $parameters) $table .= '
    '; + $pagination_class = 'pandora_pagination'; + if (!empty($parameters['pagination_class'])) { + $pagination_class = $parameters['pagination_class']; + } + // Javascript controller. $js = ' diff --git a/pandora_console/godmode/groups/group_list.php b/pandora_console/godmode/groups/group_list.php index ee61cdaf79..8cb3c106c1 100644 --- a/pandora_console/godmode/groups/group_list.php +++ b/pandora_console/godmode/groups/group_list.php @@ -1,20 +1,36 @@ $v) { $agents[$keys_prefix.$k] = $v; unset($agents[$k]); if ($all_agents) { - // Unserialize to get the status + // Unserialize to get the status. if ($serialized && is_metaconsole()) { $agent_info = explode($serialized_separator, $k); $agent_disabled = db_get_value_filter( @@ -174,7 +193,8 @@ if (is_ajax()) { ['id_agente' => $agent_info[1]] ); } else if (!$serialized && is_metaconsole()) { - // Cannot retrieve the disabled status. Mark all as not disabled + // Cannot retrieve the disabled status. + // Mark all as not disabled. $agent_disabled = 0; } else { $agent_disabled = db_get_value_filter( @@ -226,11 +246,13 @@ if (! check_acl($config['id_user'], 0, 'PM')) { } $sec = defined('METACONSOLE') ? 'advanced' : 'gagente'; -$url_tree = "index.php?sec=$sec&sec2=godmode/groups/group_list&tab=tree"; -$url_groups = "index.php?sec=$sec&sec2=godmode/groups/group_list&tab=groups"; +$url_credbox = 'index.php?sec='.$sec.'&sec2=godmode/groups/group_list&tab=credbox'; +$url_tree = 'index.php?sec='.$sec.'&sec2=godmode/groups/group_list&tab=tree'; +$url_groups = 'index.php?sec='.$sec.'&sec2=godmode/groups/group_list&tab=groups'; + $buttons['tree'] = [ 'active' => false, - 'text' => "".html_print_image( + 'text' => ''.html_print_image( 'images/gm_massive_operations.png', true, [ @@ -241,7 +263,7 @@ $buttons['tree'] = [ $buttons['groups'] = [ 'active' => false, - 'text' => "".html_print_image( + 'text' => ''.html_print_image( 'images/group.png', true, [ @@ -250,21 +272,38 @@ $buttons['groups'] = [ ).'', ]; +$buttons['credbox'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/key.png', + true, + [ + 'title' => __('Credential Store'), + ] + ).'', +]; + $tab = (string) get_parameter('tab', 'groups'); -// Marks correct tab +$title = __('Groups defined in %s', get_product_name()); +// Marks correct tab. switch ($tab) { case 'tree': $buttons['tree']['active'] = true; break; + case 'credbox': + $buttons['credbox']['active'] = true; + $title = __('Credential store'); + break; + case 'groups': default: $buttons['groups']['active'] = true; break; } -// Header +// Header. if (defined('METACONSOLE')) { agents_meta_print_header(); echo '
    '; @@ -272,7 +311,7 @@ if (defined('METACONSOLE')) { echo '
    '; } else { ui_print_page_header( - __('Groups defined in %s', get_product_name()), + $title, 'images/group.png', false, 'group_list_tab', @@ -281,12 +320,19 @@ if (defined('METACONSOLE')) { ); } +// Load credential store view before parse list-tree forms. +if ($tab == 'credbox') { + include_once __DIR__.'/credential_store.php'; + // Stop script. + return; +} + $create_group = (bool) get_parameter('create_group'); $update_group = (bool) get_parameter('update_group'); $delete_group = (bool) get_parameter('delete_group'); $pure = get_parameter('pure', 0); -// Create group +// Create group. if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) { $name = (string) get_parameter('name'); $icon = (string) get_parameter('icon'); @@ -301,7 +347,7 @@ if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) { $check = db_get_value('nombre', 'tgrupo', 'nombre', $name); $propagate = (bool) get_parameter('propagate'); - // Check if name field is empty + // Check if name field is empty. if ($name != '') { if (!$check) { $values = [ @@ -328,12 +374,11 @@ if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) { ui_print_error_message(__('Each group must have a different name')); } } else { - // $result = false; ui_print_error_message(__('Group must have a name')); } } -// Update group +// Update group. if ($update_group) { $id_group = (int) get_parameter('id_group'); $name = (string) get_parameter('name'); @@ -349,49 +394,35 @@ if ($update_group) { $contact = (string) get_parameter('contact'); $other = (string) get_parameter('other'); - // Check if name field is empty + // Check if name field is empty. if ($name != '') { - switch ($config['dbtype']) { - case 'mysql': - $sql = sprintf( - 'UPDATE tgrupo SET nombre = "%s", - icon = "%s", disabled = %d, parent = %d, custom_id = "%s", propagate = %d, id_skin = %d, description = "%s", contact = "%s", other = "%s", password = "%s" - WHERE id_grupo = %d', - $name, - empty($icon) ? '' : substr($icon, 0, -4), - !$alerts_enabled, - $id_parent, - $custom_id, - $propagate, - $skin, - $description, - $contact, - $other, - $group_pass, - $id_group - ); - break; - - case 'postgresql': - case 'oracle': - $sql = sprintf( - 'UPDATE tgrupo SET nombre = \'%s\', - icon = \'%s\', disabled = %d, parent = %d, custom_id = \'%s\', propagate = %d, id_skin = %d, description = \'%s\', contact = \'%s\', other = \'%s\' - WHERE id_grupo = %d', - $name, - substr($icon, 0, -4), - !$alerts_enabled, - $id_parent, - $custom_id, - $propagate, - $skin, - $description, - $contact, - $other, - $id_group - ); - break; - } + $sql = sprintf( + 'UPDATE tgrupo + SET nombre = "%s", + icon = "%s", + disabled = %d, + parent = %d, + custom_id = "%s", + propagate = %d, + id_skin = %d, + description = "%s", + contact = "%s", + other = "%s", + password = "%s" + WHERE id_grupo = %d', + $name, + empty($icon) ? '' : substr($icon, 0, -4), + !$alerts_enabled, + $id_parent, + $custom_id, + $propagate, + $skin, + $description, + $contact, + $other, + $group_pass, + $id_group + ); $result = db_process_sql($sql); } else { @@ -405,7 +436,7 @@ if ($update_group) { } } -// Delete group +// Delete group. if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) { $id_group = (int) get_parameter('id_group'); @@ -445,7 +476,14 @@ if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) { } } + +// Credential store is loaded previously in this document to avoid +// process group tree - list forms. if ($tab == 'tree') { + /* + * Group tree view. + */ + echo html_print_image( 'images/spinner.gif', true, @@ -456,6 +494,10 @@ if ($tab == 'tree') { ); echo "
    "; } else { + /* + * Group list view. + */ + $acl = ''; $search_name = ''; $offset = (int) get_parameter('offset', 0); @@ -463,17 +505,22 @@ if ($tab == 'tree') { $block_size = $config['block_size']; if (!empty($search)) { - $search_name = "AND t.nombre LIKE '%$search%'"; + $search_name = 'AND t.nombre LIKE "%'.$search.'%"'; } if (!users_can_manage_group_all('AR')) { $user_groups_acl = users_get_groups(false, 'AR'); $groups_acl = implode(',', $user_groups_ACL); if (empty($groups_acl)) { - return ui_print_info_message(['no_close' => true, 'message' => __('There are no defined groups') ]); + return ui_print_info_message( + [ + 'no_close' => true, + 'message' => __('There are no defined groups'), + ] + ); } - $acl = "AND t.id_grupo IN ($groups_acl)"; + $acl = 'AND t.id_grupo IN ('.$groups_acl.')'; } $form = "
    "; @@ -488,29 +535,37 @@ if ($tab == 'tree') { echo $form; - $groups_sql = "SELECT t.*, + $groups_sql = sprintf( + 'SELECT t.*, p.nombre AS parent_name, IF(t.parent=p.id_grupo, 1, 0) AS has_child - FROM tgrupo t - LEFT JOIN tgrupo p + FROM tgrupo t + LEFT JOIN tgrupo p ON t.parent=p.id_grupo - WHERE 1=1 - $acl - $search_name + WHERE 1=1 + %s + %s ORDER BY nombre - LIMIT $offset, $block_size - "; + LIMIT %d, %d', + $acl, + $search_name, + $offset, + $block_size + ); $groups = db_get_all_rows_sql($groups_sql); if (!empty($groups)) { - // Count all groups for pagination only saw user and filters - $groups_sql_count = "SELECT count(*) + // Count all groups for pagination only saw user and filters. + $groups_sql_count = sprintf( + 'SELECT count(*) FROM tgrupo t WHERE 1=1 - $acl - $search_name - "; + %s + %s', + $acl, + $search_name + ); $groups_count = db_get_value_sql($groups_sql_count); $table = new StdClass(); @@ -545,7 +600,7 @@ if ($tab == 'tree') { $url = 'index.php?sec=gagente&sec2=godmode/groups/configure_group&id_group='.$group['id_grupo']; $url_delete = 'index.php?sec=gagente&sec2=godmode/groups/group_list&delete_group=1&id_group='.$group['id_grupo']; $table->data[$key][0] = $group['id_grupo']; - $table->data[$key][1] = "".$group['nombre'].''; + $table->data[$key][1] = ''.$group['nombre'].''; if ($group['icon'] != '') { $table->data[$key][2] = html_print_image( 'images/groups_small/'.$group['icon'].'.png', @@ -553,22 +608,25 @@ if ($tab == 'tree') { [ 'style' => '', 'class' => 'bot', - 'alt' => $group['nombre'], + 'alt' => $group['nombre'], 'title' => $group['nombre'], - false, false, false, true - ] + ], + false, + false, + false, + true ); } else { $table->data[$key][2] = ''; } - // reporting_get_group_stats - $table->data[$key][3] = $group['disabled'] ? __('Disabled') : __('Enabled'); + // Reporting_get_group_stats. + $table->data[$key][3] = ($group['disabled']) ? __('Disabled') : __('Enabled'); $table->data[$key][4] = $group['parent_name']; $table->data[$key][5] = $group['description']; $table->cellclass[$key][6] = 'action_buttons'; - $table->data[$key][6] = "".html_print_image( + $table->data[$key][6] = ''.html_print_image( 'images/config.png', true, [ diff --git a/pandora_console/include/functions_credential_store.php b/pandora_console/include/functions_credential_store.php new file mode 100644 index 0000000000..acf15bb6be --- /dev/null +++ b/pandora_console/include/functions_credential_store.php @@ -0,0 +1,97 @@ + $v) { - $js .= $k.':'.json_encode($v).",\n"; + if (is_array($parameters['ajax_data'])) { + foreach ($parameters['ajax_data'] as $k => $v) { + $js .= $k.':'.json_encode($v).",\n"; + } } $js .= 'page: "'.$parameters['ajax_url'].'" diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index b30295bba6..bdd1bca841 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -693,6 +693,20 @@ CREATE TABLE IF NOT EXISTS `tgrupo` ( KEY `parent_index` (`parent`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- --------------------------------------------------------------------- +-- Table `tcredential_store` +-- --------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `tcredential_store` ( + `identifier` varchar(100) NOT NULL, + `id_group` mediumint(4) unsigned NOT NULL DEFAULT 0, + `product` text, + `username` text, + `password` text, + `extra_1` text, + `extra_2` text, + PRIMARY KEY (`identifier`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + -- --------------------------------------------------------------------- -- Table `tincidencia` -- --------------------------------------------------------------------- From 379a0039aed08e7d82c526f2555bc1c8cbd3b598 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Fri, 21 Jun 2019 12:41:05 +0200 Subject: [PATCH 150/460] Fixed vc-control --- pandora_console/include/styles/pandora.css | 3 +-- pandora_console/operation/visual_console/view.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 0596f5bf41..4b2a761e4c 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1390,7 +1390,6 @@ div.title_line { #menu_tab { margin-right: 10px; - min-width: 510px; } #menu_tab .mn, @@ -3711,7 +3710,7 @@ div#vc-controls { div#vc-controls div.vc-title, div#vc-controls div.vc-refr { - margin-top: 6px; + margin-top: 15px; margin-left: 3px; margin-right: 3px; } diff --git a/pandora_console/operation/visual_console/view.php b/pandora_console/operation/visual_console/view.php index 61633b1fc6..3b0707036b 100644 --- a/pandora_console/operation/visual_console/view.php +++ b/pandora_console/operation/visual_console/view.php @@ -172,7 +172,7 @@ if ($pure === true) { echo '
    '; echo ''; text: "", click: function(e) { $(this).dialog('close'); + $(this).remove(); } }, { diff --git a/pandora_console/include/functions_credential_store.php b/pandora_console/include/functions_credential_store.php index acc6a2c09f..accc9348fd 100644 --- a/pandora_console/include/functions_credential_store.php +++ b/pandora_console/include/functions_credential_store.php @@ -277,7 +277,7 @@ function print_inputs($values=null) 'id' => 'id_group', 'input_class' => 'flex-row', 'type' => 'select_groups', - 'selected' => $values['id_grupo'], + 'selected' => $values['id_group'], 'return' => true, 'class' => 'w50p', ] @@ -288,6 +288,7 @@ function print_inputs($values=null) 'name' => 'product', 'input_class' => 'flex-row', 'type' => 'select', + 'script' => 'calculate_inputs()', 'fields' => [ 'CUSTOM' => __('Custom'), 'AWS' => __('Aws'), From 6dea559ab92f27c456390e5b8113b7fe26dff128 Mon Sep 17 00:00:00 2001 From: alejandro-campos Date: Tue, 25 Jun 2019 17:06:11 +0200 Subject: [PATCH 202/460] fix api return message --- pandora_console/include/functions_api.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 24a7f9f62a..0569319a29 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -15087,10 +15087,10 @@ function remove_agent_from_policy($id_policy, $use_agent_name, $params) } $return = policies_change_delete_pending_agent($policy_agent['id']); - $data = __('Successfully added to delete pending id agent %d to id policy %d.', $id2, $id); + $data = __('Successfully added to delete pending id agent %d to id policy %d.', $id_agent, $id_policy); if ($return === false) { - returnError('error_delete_policy_agent', 'Could not be deleted id agent %d from id policy %d', $id2, $id); + returnError('error_delete_policy_agent', 'Could not be deleted id agent %d from id policy %d', $id_agent, $id_policy); } else { returnData('string', ['type' => 'string', 'data' => $data]); } From 8f914b69a601538b76954c61d4644e3c16e2fe19 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 25 Jun 2019 17:24:16 +0200 Subject: [PATCH 203/460] Minor fixes --- pandora_console/include/javascript/pandora_events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index afd9fbe573..94dadb6fbb 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -688,7 +688,7 @@ function update_event(table, id_evento, type, event_rep, row) { var diff_s = diff_g / 1000; if (processed >= $(".chk_val:checked").length) { // If operation takes less than 2 seconds, redraw. - if (diff_s < 2) { + if (diff_s < 2 || $(".chk_val:checked").length > 1) { redraw = true; } if (redraw) { From e1bf12a1fb9c8fc8c1bb2166063c1be902d4c421 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 25 Jun 2019 18:21:23 +0200 Subject: [PATCH 204/460] Credential store --- .../godmode/groups/credential_store.php | 157 +++++++++++------- .../include/functions_credential_store.php | 7 +- 2 files changed, 99 insertions(+), 65 deletions(-) diff --git a/pandora_console/godmode/groups/credential_store.php b/pandora_console/godmode/groups/credential_store.php index 01e7f11bfa..9a822dc986 100644 --- a/pandora_console/godmode/groups/credential_store.php +++ b/pandora_console/godmode/groups/credential_store.php @@ -49,16 +49,21 @@ if (! check_acl($config['id_user'], 0, 'PM')) { // Required files. ui_require_css_file('credential_store'); require_once $config['homedir'].'/include/functions_credential_store.php'; - +require_once $config['homedir'].'/include/functions_io.php'; if (is_ajax()) { $draw = get_parameter('draw', 0); $filter = get_parameter('filter', []); $get_key = get_parameter('get_key', 0); + $new_form = get_parameter('new_form', 0); $new_key = get_parameter('new_key', 0); $update_key = get_parameter('update_key', 0); $delete_key = get_parameter('delete_key', 0); + if ($new_form) { + echo print_inputs(); + exit; + } if ($delete_key) { $identifier = get_parameter('identifier', null); @@ -130,6 +135,9 @@ if (is_ajax()) { $values = []; foreach ($data as $key => $value) { $values[$key] = base64_decode($value); + if ($key == 'identifier') { + $values[$key] = preg_replace('/\s+/', '-', trim($values[$key])); + } } $identifier = $values['identifier']; @@ -318,8 +326,7 @@ try { // Auxiliar div. $new = ''; +$new .= '
    '; $details = ''; $aux = ''; @@ -386,7 +393,7 @@ echo ''; if (!failed) { dt_.draw(0); $(".ui-dialog-content").dialog("close"); - $('.ui-dialog-content').remove(); + cleanupDOM(); } else { $(this).dialog('close'); } @@ -407,7 +414,8 @@ echo ''; text: '', click: function(e) { $(this).dialog('close'); - $(this).remove(); + cleanupDOM(); + } }, { @@ -464,7 +472,7 @@ echo ''; text: '', click: function(e) { $(this).dialog('close'); - $(this).remove(); + cleanupDOM(); } }, { @@ -503,6 +511,15 @@ echo ''; }) } + function cleanupDOM() { + $('#div-identifier').empty(); + $('#div-product').empty(); + $('#div-username').empty(); + $('#div-password').empty(); + $('#div-extra_1').empty(); + $('#div-extra_2').empty(); + } + function calculate_inputs() { if ($('#product :selected').val() == "CUSTOM") { $('#div-username label').text(''); @@ -528,66 +545,82 @@ echo ''; function add_key() { // Clear form. - $('#form_new :input').each(function() { - $(this).val('') - }); - $('#id_group').val(0); - $('#product').val('CUSTOM'); - - $('#product').on('change', function() { - calculate_inputs() - }); - - // Show form. - $('#new_key').dialog({ - width: 580, - height: 400, - position: { - my: 'center', - at: 'center', - of: window, - collision: 'fit' + $('#form_update').empty(); + $('#form_update').html('Loading...'); + $.ajax({ + method: 'post', + url: '', + data: { + page: 'godmode/groups/credential_store', + new_form: 1 }, - title: "", - buttons: [ - { - class: 'ui-widget ui-state-default ui-corner-all ui-button-text-only sub upd submit-cancel', - text: "", - click: function(e) { - $(this).dialog('close'); - $(this).remove(); - } - }, - { - class: 'ui-widget ui-state-default ui-corner-all ui-button-text-only sub ok submit-next', - text: 'OK', - click: function(e) { - var values = {}; + success: function(data) { + $('#form_new').html(data); + $('#id_group').val(0); + // By default AWS. + $('#product').val('AWS'); + calculate_inputs(); - $('#form_new :input').each(function() { - values[this.name] = btoa($(this).val()); - }); + $('#product').on('change', function() { + calculate_inputs() + }); - $.ajax({ - method: 'post', - url: '', - data: { - page: 'godmode/groups/credential_store', - new_key: 1, - values: values - }, - datatype: "json", - success: function (data) { - handle_response(data); - }, - error: function(e) { - handle_response(e); + // Show form. + $('#new_key').dialog({ + width: 580, + height: 400, + position: { + my: 'center', + at: 'center', + of: window, + collision: 'fit' + }, + title: "", + buttons: [ + { + class: 'ui-widget ui-state-default ui-corner-all ui-button-text-only sub upd submit-cancel', + text: "", + click: function(e) { + $(this).dialog('close'); + cleanupDOM(); } - }); - } - }, - ] - }); + }, + { + class: 'ui-widget ui-state-default ui-corner-all ui-button-text-only sub ok submit-next', + text: 'OK', + click: function(e) { + var values = {}; + + console.log($('#form_new')); + + $('#form_new :input').each(function() { + values[this.name] = btoa($(this).val()); + }); + + $.ajax({ + method: 'post', + url: '', + data: { + page: 'godmode/groups/credential_store', + new_key: 1, + values: values + }, + datatype: "json", + success: function (data) { + handle_response(data); + }, + error: function(e) { + handle_response(e); + } + }); + } + }, + ] + }); + } + }) + + } $(document).ready(function(){ diff --git a/pandora_console/include/functions_credential_store.php b/pandora_console/include/functions_credential_store.php index accc9348fd..e49bd71399 100644 --- a/pandora_console/include/functions_credential_store.php +++ b/pandora_console/include/functions_credential_store.php @@ -268,6 +268,7 @@ function print_inputs($values=null) 'value' => $values['identifier'], 'disabled' => (bool) $values['identifier'], 'return' => true, + 'script' => 'alert(\'puta\')', ] ); $return .= html_print_input( @@ -290,9 +291,9 @@ function print_inputs($values=null) 'type' => 'select', 'script' => 'calculate_inputs()', 'fields' => [ - 'CUSTOM' => __('Custom'), - 'AWS' => __('Aws'), - 'AZURE' => __('Azure'), + // 'CUSTOM' => __('Custom'), + 'AWS' => __('Aws'), + // 'AZURE' => __('Azure'), // 'GOOGLE' => __('Google'), ], 'selected' => $values['product'], From 9a65d8188a2cc67375a46a8e552e859524d0aad5 Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 26 Jun 2019 00:01:09 +0200 Subject: [PATCH 205/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 6771606f50..2faf21c47a 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.735-190625 +Version: 7.0NG.735-190626 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index fe7628e999..7521094eba 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.735-190625" +pandora_version="7.0NG.735-190626" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 6bbb463b49..3cf1d22126 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.735'; -use constant AGENT_BUILD => '190625'; +use constant AGENT_BUILD => '190626'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 8f580504eb..725d5abaa2 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.735 -%define release 190625 +%define release 190626 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 28023a28f3..970291a4c3 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.735 -%define release 190625 +%define release 190626 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 879ff79eac..2b9cf3b68c 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.735" -PI_BUILD="190625" +PI_BUILD="190626" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 21e38fb13b..7aecb7cff2 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190625} +{190626} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 2194b622ac..f655faabc6 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.735(Build 190625)") +#define PANDORA_VERSION ("7.0NG.735(Build 190626)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index f328ab299c..3d3a2ebf4a 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.735(Build 190625))" + VALUE "ProductVersion", "(7.0NG.735(Build 190626))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 8a166990ab..5fc2731073 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.735-190625 +Version: 7.0NG.735-190626 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 2d45e0aa49..44d78e12ac 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.735-190625" +pandora_version="7.0NG.735-190626" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 60a348e138..95f6595032 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190625'; +$build_version = 'PC190626'; $pandora_version = 'v7.0NG.735'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 2e3074241c..00a940965b 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index d6b4578521..14abd0603d 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.735 -%define release 190625 +%define release 190626 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index f3758822ff..3e53f83626 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.735 -%define release 190625 +%define release 190626 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index b63386d7df..97459cff2f 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.735" -PI_BUILD="190625" +PI_BUILD="190626" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 875f8f51dd..b9f0bfa2d2 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.735 PS190625"; +my $version = "7.0NG.735 PS190626"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index e00e964276..c6c88c7139 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.735 PS190625"; +my $version = "7.0NG.735 PS190626"; # save program name for logging my $progname = basename($0); From fdf2a983d291ca0e49d374da458f2797b712566a Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 26 Jun 2019 10:39:18 +0200 Subject: [PATCH 206/460] general review credential store --- pandora_console/include/functions_credential_store.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_credential_store.php b/pandora_console/include/functions_credential_store.php index e49bd71399..cf09e6d67b 100644 --- a/pandora_console/include/functions_credential_store.php +++ b/pandora_console/include/functions_credential_store.php @@ -403,7 +403,7 @@ function credentials_list_accounts($product) if (!isset($user_groups)) { $user_groups = users_get_groups( $config['id_user'], - 'AW' + 'AR' ); // Always add group 'ALL' because 'ALL' group credentials From f66e5b5ef8434cf55989c8bfc6d3776363de823b Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 26 Jun 2019 11:11:21 +0200 Subject: [PATCH 207/460] Fix class names to avoid addblock hide them --- pandora_console/godmode/agentes/agent_manager.php | 4 ++-- pandora_console/include/styles/agent_manager.css | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index 7c6a3ab03b..3ea3a7f0c2 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -777,7 +777,7 @@ $table_adv_options = ' '.$adv_secondary_groups_right.'
    -
    +
    '.$table_adv_parent.$table_adv_module_mode.$table_adv_cascade; if ($new_agent) { @@ -788,7 +788,7 @@ if ($new_agent) { $table_adv_options .= '
    '; $table_adv_options .= ' -
    +
    '.$table_adv_gis.$table_adv_agent_icon.$table_adv_url.$table_adv_quiet.$table_adv_status.$table_adv_remote.$table_adv_safe.'
    '; diff --git a/pandora_console/include/styles/agent_manager.css b/pandora_console/include/styles/agent_manager.css index a5e80a64ee..8b3e0db4f7 100644 --- a/pandora_console/include/styles/agent_manager.css +++ b/pandora_console/include/styles/agent_manager.css @@ -119,8 +119,8 @@ a#qr_code_agent_view { border-bottom-right-radius: 0px; } -.adv_right, -.adv_left, +.agent_av_opt_right, +.agent_av_opt_left, .secondary_groups_list { flex: 1; } @@ -150,8 +150,8 @@ a#qr_code_agent_view { margin: 1em; } -.adv_left input, -.adv_left select { +.agent_av_opt_left input, +.agent_av_opt_left select { width: 100%; } From 29932781781789d4200b06473c51028772e98b16 Mon Sep 17 00:00:00 2001 From: Alejandro Gallardo Escobar Date: Wed, 26 Jun 2019 11:33:45 +0200 Subject: [PATCH 208/460] Removed the resize functionality of the module graph vc item --- .../include/visual-console-client/vc.main.min.js | 2 +- .../include/visual-console-client/vc.main.min.js.map | 2 +- visual_console_client/src/Item.ts | 2 +- visual_console_client/src/items/ModuleGraph.ts | 9 +++++++++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/visual-console-client/vc.main.min.js b/pandora_console/include/visual-console-client/vc.main.min.js index 29b551979c..915f2deaaf 100644 --- a/pandora_console/include/visual-console-client/vc.main.min.js +++ b/pandora_console/include/visual-console-client/vc.main.min.js @@ -1,2 +1,2 @@ -!function(t){var e={};function n(i){if(e[i])return e[i].exports;var r=e[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)n.d(i,r,function(e){return t[e]}.bind(null,r));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=9)}([function(t,e,n){"use strict";n.d(e,"m",function(){return r}),n.d(e,"l",function(){return s}),n.d(e,"r",function(){return o}),n.d(e,"j",function(){return a}),n.d(e,"k",function(){return c}),n.d(e,"n",function(){return u}),n.d(e,"q",function(){return h}),n.d(e,"i",function(){return p}),n.d(e,"h",function(){return _}),n.d(e,"g",function(){return f}),n.d(e,"o",function(){return d}),n.d(e,"d",function(){return m}),n.d(e,"e",function(){return y}),n.d(e,"f",function(){return b}),n.d(e,"p",function(){return v}),n.d(e,"c",function(){return x}),n.d(e,"a",function(){return w}),n.d(e,"b",function(){return O});var i=function(){return(i=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&!isNaN(parseInt(t))?parseInt(t):e}function s(t,e){return"number"==typeof t?t:"string"==typeof t&&t.length>0&&!isNaN(parseFloat(t))?parseFloat(t):e}function o(t){return null==t||0===t.length}function a(t,e){return"string"==typeof t&&t.length>0?t:e}function c(t){return"boolean"==typeof t?t:"number"==typeof t?t>0:"string"==typeof t&&("1"===t||"true"===t)}function l(t,e,n){void 0===n&&(n=" "),"number"==typeof t&&(t=""+t),"number"==typeof n&&(n=""+n);var i=e-t.length;if(0===i)return t;if(i<0)return t.substr(Math.abs(i));if(i===n.length)return""+n+t;if(i0&&id||y+r+m.width-b>u.width||r===x&&y<0&&i>f+x+c,A=h0&&h_||g+s+m.height-b>u.height||s===E&&g<0&&h>p+E+l;(e=O?0:T?x:y+r)<0&&(e=0),(n=A?0:k?E:g+s)<0&&(n=0),o=i,a=h,e===r&&n===s||(w(e,n),v(e,n),r=e,s=n)},T=function(){r=0,s=0,o=0,a=0,document.removeEventListener("mousemove",O),document.removeEventListener("mouseup",T),t.draggable=i,document.body.style.userSelect="auto"},A=function(e){e.stopPropagation(),t.draggable=!1,r=t.offsetLeft,s=t.offsetTop,o=e.pageX,a=e.pageY,c=e.offsetX,l=e.offsetY,u=n.getBoundingClientRect(),h=E(n),p=h.top,_=p+u.height,f=h.left,d=f+u.width,m=t.getBoundingClientRect(),y=window.getComputedStyle(t).borderWidth||"0",b=2*Number.parseInt(y),document.addEventListener("mousemove",O),document.addEventListener("mouseup",T),document.body.style.userSelect="none"};return t.addEventListener("mousedown",A),function(){t.removeEventListener("mousedown",A),T()}}function O(t,e){var n=document.createElement("div");n.className="resize-draggable",t.appendChild(n);var i=t.parentElement,r=t.draggable,s=0,o=0,a=0,c=0,l=0,u=i.getBoundingClientRect(),h=E(i),p=h.top,_=p+u.height,f=h.left,d=f+u.width,m=E(t),y=m.top,b=m.left,v=window.getComputedStyle(t).borderWidth||"0",w=Number.parseInt(v),O=x(32,function(t,n){return e(t,n)}),T=g(16,function(t,n){return e(t,n)}),A=function(t){var e=s+(t.pageX-a),n=o+(t.pageY-c);e===s&&n===o||eb+(s-l)||(e<15?e=15:e+b-w/2>=d&&(e=d-b),n<15?n=15:n+y-w/2>=_&&(n=_-y),T(e,n),O(e,n),s=e,o=n,a=t.pageX,c=t.pageY)},k=function(){s=0,o=0,a=0,c=0,l=0,0,document.removeEventListener("mousemove",A),document.removeEventListener("mouseup",k),t.draggable=r,document.body.style.userSelect="auto"};return n.addEventListener("mousedown",function(e){e.stopPropagation(),t.draggable=!1;var n=t.getBoundingClientRect(),r=n.width,v=n.height;s=r,o=v,a=e.pageX,c=e.pageY,l=e.offsetX,e.offsetY,u=i.getBoundingClientRect(),h=E(i),p=h.top,_=p+u.height,f=h.left,d=f+u.width,m=E(t),y=m.top,b=m.left,document.addEventListener("mousemove",A),document.addEventListener("mouseup",k),document.body.style.userSelect="none"}),function(){n.remove(),k()}}},function(t,e,n){"use strict";n.d(e,"b",function(){return a});var i=n(0),r=n(2),s=function(){return(s=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var i=e.labelElementRef.getBoundingClientRect(),r=i.width,s=i.height;switch(e.props.labelPosition){case"up":case"down":n-=s;break;case"left":case"right":t-=r}}e.resizeElement(t,n),e.debouncedResizementSave(t,n)})},t.prototype.stopResizementListener=function(){this.removeResizement&&(this.removeResizement(),this.removeResizement=null)},t.prototype.createContainerDomElement=function(){var t,e=this;return this.props.isLinkEnabled?(t=document.createElement("a"),this.props.link&&(t.href=this.props.link)):t=document.createElement("div"),t.className="visual-console-item",t.style.zIndex=this.props.isOnTop?"2":"1",t.style.left=this.props.x+"px",t.style.top=this.props.y+"px",t.addEventListener("click",function(t){e.meta.editMode?(t.preventDefault(),t.stopPropagation()):e.clickEventManager.emit({data:e.props,nativeEvent:t})}),this.meta.editMode&&(t.classList.add("is-editing"),this.initMovementListener(t),this.initResizementListener(t)),this.meta.isFetching&&t.classList.add("is-fetching"),this.meta.isUpdating&&t.classList.add("is-updating"),t},t.prototype.createLabelDomElement=function(){var t=document.createElement("div");t.className="visual-console-item-label";var e=this.getLabelWithMacrosReplaced();if(e.length>0){var n=document.createElement("table"),i=document.createElement("tr"),r=document.createElement("tr"),s=document.createElement("tr"),o=document.createElement("td");switch(o.innerHTML=e,i.append(o),n.append(r,i,s),n.style.textAlign="center",this.props.labelPosition){case"up":case"down":this.props.width>0&&(n.style.width=this.props.width+"px",n.style.height=null);break;case"left":case"right":this.props.height>0&&(n.style.width=null,n.style.height=this.props.height+"px")}t.append(n)}return t},t.prototype.getLabelWithMacrosReplaced=function(){var t=this.props;return Object(i.p)([{macro:"_date_",value:Object(i.e)(new Date)},{macro:"_time_",value:Object(i.f)(new Date)},{macro:"_agent_",value:null!=t.agentAlias?t.agentAlias:""},{macro:"_agentdescription_",value:null!=t.agentDescription?t.agentDescription:""},{macro:"_address_",value:null!=t.agentAddress?t.agentAddress:""},{macro:"_module_",value:null!=t.moduleName?t.moduleName:""},{macro:"_moduledescription_",value:null!=t.moduleDescription?t.moduleDescription:""}],this.props.label||"")},t.prototype.updateDomElement=function(t){t.innerHTML=this.createDomElement().innerHTML},Object.defineProperty(t.prototype,"props",{get:function(){return s({},this.itemProps)},set:function(t){var e=this.props;this.itemProps=t,this.shouldBeUpdated(e,t)&&this.render(e,this._metadata)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"meta",{get:function(){return s({},this._metadata)},set:function(t){this.setMeta(t)},enumerable:!0,configurable:!0}),t.prototype.setMeta=function(t){var e=this._metadata;this._metadata=t,this.render(this.itemProps,e)},t.prototype.shouldBeUpdated=function(t,e){return t!==e},t.prototype.render=function(t,e){void 0===t&&(t=null),void 0===e&&(e=null),this.updateDomElement(this.childElementRef),t&&!this.positionChanged(t,this.props)||this.moveElement(this.props.x,this.props.y),t&&!this.sizeChanged(t,this.props)||this.resizeElement(this.props.width,this.props.height);var n=this.labelElementRef.innerHTML,i=this.createLabelDomElement().innerHTML;if(n!==i&&(this.labelElementRef.innerHTML=i),t&&t.labelPosition===this.props.labelPosition||this.changeLabelPosition(this.props.labelPosition),t&&(t.isLinkEnabled!==this.props.isLinkEnabled||this.props.isLinkEnabled&&t.link!==this.props.link)){var r=this.createContainerDomElement();r.innerHTML=this.elementRef.innerHTML;for(var s=this.elementRef.attributes,o=0;o0?e.item(0):null;if(n)switch(this.props.labelPosition){case"up":case"down":this.props.width>0&&(n.style.width=this.props.width+"px",n.style.height=null);break;case"left":case"right":this.props.height>0&&(n.style.width=null,n.style.height=this.props.height+"px")}},t.prototype.moveElement=function(t,e){this.elementRef.style.left=t+"px",this.elementRef.style.top=e+"px"},t.prototype.move=function(t,e){this.moveElement(t,e),this.itemProps=s({},this.props,{x:t,y:e})},t.prototype.sizeChanged=function(t,e){return t.width!==e.width||t.height!==e.height},t.prototype.resizeElement=function(t,e){if(this.childElementRef.style.width=t>0?t+"px":null,this.childElementRef.style.height=e>0?e+"px":null,this.props.label&&this.props.label.length>0){var n=this.labelElementRef.getElementsByTagName("table"),i=n.length>0?n.item(0):null;if(i)switch(this.props.labelPosition){case"up":case"down":i.style.width=t>0?t+"px":null;break;case"left":case"right":i.style.height=e>0?e+"px":null}}},t.prototype.resize=function(t,e){this.resizeElement(t,e),this.itemProps=s({},this.props,{width:t,height:e})},t.prototype.onClick=function(t){var e=this.clickEventManager.on(t);return this.disposables.push(e),e},t.prototype.onMoved=function(t){var e=this.movedEventManager.on(t);return this.disposables.push(e),e},t.prototype.onResized=function(t){var e=this.resizedEventManager.on(t);return this.disposables.push(e),e},t.prototype.onRemove=function(t){var e=this.removeEventManager.on(t);return this.disposables.push(e),e},t}();e.a=c},function(t,e,n){"use strict";var i=function(){return function(){var t=this;this.listeners=[],this.listenersOncer=[],this.on=function(e){return t.listeners.push(e),{dispose:function(){return t.off(e)}}},this.once=function(e){t.listenersOncer.push(e)},this.off=function(e){var n=t.listeners.indexOf(e);n>-1&&t.listeners.splice(n,1)},this.emit=function(e){t.listeners.forEach(function(t){return t(e)}),t.listenersOncer.forEach(function(t){return t(e)}),t.listenersOncer=[]},this.pipe=function(e){return t.on(function(t){return e.emit(t)})}}}();e.a=i},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"b",function(){return eventsHistoryPropsDecoder});var _lib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),_Item__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(1),__extends=(extendStatics=function(t,e){return(extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}extendStatics(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),extendStatics,__assign=function(){return(__assign=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var y=document.createElementNS(t,"text");y.setAttribute("text-anchor","middle"),y.setAttribute("font-size","8"),y.setAttribute("transform","translate(30 50) rotate(90)"),y.setAttribute("fill",i),y.textContent=m,f.append(y)}var b=document.createElementNS(t,"g");b.setAttribute("class","marks");var v=document.createElementNS(t,"g");v.setAttribute("class","mark"),v.setAttribute("transform","translate(50 50)");var g=document.createElementNS(t,"line");g.setAttribute("x1","36"),g.setAttribute("y1","0"),g.setAttribute("x2","46"),g.setAttribute("y2","0"),g.setAttribute("stroke",i),g.setAttribute("stroke-width","5");var x=document.createElementNS(t,"line");x.setAttribute("x1","36"),x.setAttribute("y1","0"),x.setAttribute("x2","46"),x.setAttribute("y2","0"),x.setAttribute("stroke",e),x.setAttribute("stroke-width","1"),v.append(g,x),b.append(v);for(var E=1;E<60;E++){var w=document.createElementNS(t,"line");w.setAttribute("y1","0"),w.setAttribute("y2","0"),w.setAttribute("stroke",i),w.setAttribute("transform","translate(50 50) rotate("+6*E+")"),E%5==0?(w.setAttribute("x1","38"),w.setAttribute("x2","46"),w.setAttribute("stroke-width",E%15==0?"2":"1")):(w.setAttribute("x1","42"),w.setAttribute("x2","46"),w.setAttribute("stroke-width","0.5")),b.append(w)}var O=document.createElementNS(t,"g");O.setAttribute("class","hour-hand"),O.setAttribute("transform","translate(50 50)");var T=document.createElementNS(t,"line");T.setAttribute("class","hour-hand-a"),T.setAttribute("x1","0"),T.setAttribute("y1","0"),T.setAttribute("x2","30"),T.setAttribute("y2","0"),T.setAttribute("stroke",o),T.setAttribute("stroke-width","4"),T.setAttribute("stroke-linecap","round");var A=document.createElementNS(t,"line");A.setAttribute("class","hour-hand-b"),A.setAttribute("x1","0"),A.setAttribute("y1","0"),A.setAttribute("x2","29.9"),A.setAttribute("y2","0"),A.setAttribute("stroke",s),A.setAttribute("stroke-width","3.1"),A.setAttribute("stroke-linecap","round"),O.append(T,A);var k=document.createElementNS(t,"g");k.setAttribute("class","minute-hand"),k.setAttribute("transform","translate(50 50)");var M=document.createElementNS(t,"line");M.setAttribute("class","minute-hand-a"),M.setAttribute("x1","0"),M.setAttribute("y1","0"),M.setAttribute("x2","40"),M.setAttribute("y2","0"),M.setAttribute("stroke",o),M.setAttribute("stroke-width","2"),M.setAttribute("stroke-linecap","round");var j=document.createElementNS(t,"line");j.setAttribute("class","minute-hand-b"),j.setAttribute("x1","0"),j.setAttribute("y1","0"),j.setAttribute("x2","39.9"),j.setAttribute("y2","0"),j.setAttribute("stroke",s),j.setAttribute("stroke-width","1.5"),j.setAttribute("stroke-linecap","round");var P=document.createElementNS(t,"circle");P.setAttribute("r","3"),P.setAttribute("fill",s),k.append(M,j,P);var S=document.createElementNS(t,"g");S.setAttribute("class","second-hand"),S.setAttribute("transform","translate(50 50)");var L=document.createElementNS(t,"line");L.setAttribute("x1","0"),L.setAttribute("y1","0"),L.setAttribute("x2","46"),L.setAttribute("y2","0"),L.setAttribute("stroke",a),L.setAttribute("stroke-width","1"),L.setAttribute("stroke-linecap","round");var R=document.createElementNS(t,"circle");R.setAttribute("r","2"),R.setAttribute("fill",a),S.append(L,R);var N=document.createElementNS(t,"circle");N.setAttribute("cx","50"),N.setAttribute("cy","50"),N.setAttribute("r","0.3"),N.setAttribute("fill",s);var I=this.getOriginDate(),D=I.getSeconds(),C=I.getMinutes(),z=6*D,B=6*C+D/60*6,W=30*I.getHours()+C/60*30;if(O.setAttribute("transform","translate(50 50) rotate("+W+")"),k.setAttribute("transform","translate(50 50) rotate("+B+")"),S.setAttribute("transform","translate(50 50) rotate("+z+")"),_.append(f,b,O,k,S,N),_.setAttribute("transform","rotate(-90)"),p.innerHTML="\n \n ",p.append(_),"datetime"===this.props.clockFormat){var H=document.createElement("span");H.className="date",H.textContent=Object(r.e)(I,"default"),H.style.fontSize=h+"px",this.props.color&&(H.style.color=this.props.color),p.append(H)}return p},e.prototype.createDigitalClock=function(){var t=document.createElement("div");t.className="digital-clock";var e=this.getElementSize().width,n=6/this.props.clockTimezone.length,i=20*e/100,s=10*e/100,o=Math.min(20*n*e/100,e/100*10),a=this.getOriginDate();if("datetime"===this.props.clockFormat){var c=document.createElement("span");c.className="date",c.textContent=Object(r.e)(a,"default"),c.style.fontSize=s+"px",this.props.color&&(c.style.color=this.props.color),t.append(c)}var l=document.createElement("span");l.className="time",l.textContent=Object(r.f)(a),l.style.fontSize=i+"px",this.props.color&&(l.style.color=this.props.color),t.append(l);var u=this.getHumanTimezone();if(u.length>0){var h=document.createElement("span");h.className="timezone",h.textContent=u,h.style.fontSize=o+"px",this.props.color&&(h.style.color=this.props.color),t.append(h)}return t},e.prototype.getOriginDate=function(t){void 0===t&&(t=null);var e=t||new Date,n=1e3*this.props.clockTimezoneOffset,i=60*e.getTimezoneOffset()*1e3,r=e.getTime()+n+i;return new Date(r)},e.prototype.getHumanTimezone=function(t){void 0===t&&(t=this.props.clockTimezone);var e=t.split("/")[1];return(void 0===e?"":e).replace("_"," ")},e.prototype.getElementSize=function(t,e){switch(void 0===t&&(t=this.props.width),void 0===e&&(e=this.props.height),this.props.clockType){case"analogic":var n=100;return t>0&&e>0?n=Math.min(t,e):t>0?n=t:e>0&&(n=e),{width:n,height:n};case"digital":return t>0&&e>0?e=t/20?e=t/2:e>0?t=2*e:(t=100,e=50),{width:t,height:e};default:throw new Error("invalid clock type.")}},e.TICK_INTERVAL=1e3,e}(s.a),P=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),S=function(){return(S=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){t.style.borderStyle="solid";var e=Math.min(this.props.width,this.props.height)/2,n=Math.min(this.props.borderWidth,e);t.style.borderWidth=n+"px",this.props.borderColor&&(t.style.borderColor=this.props.borderColor)}return t},e}(s.a),N=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),I=function(){return(I=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&(n=Object(r.p)([{macro:/\(?_VALUE_\)?/i,value:n}],i)),t.innerHTML=n}return t},e.prototype.createLabelDomElement=function(){var t=document.createElement("div");return t.className="visual-console-item-label",t},e}(s.a),Y=n(3),Z=Math.PI,Q=2*Z,J=Q-1e-6;function $(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function tt(){return new $}$.prototype=tt.prototype={constructor:$,moveTo:function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},quadraticCurveTo:function(t,e,n,i){this._+="Q"+ +t+","+ +e+","+(this._x1=+n)+","+(this._y1=+i)},bezierCurveTo:function(t,e,n,i,r,s){this._+="C"+ +t+","+ +e+","+ +n+","+ +i+","+(this._x1=+r)+","+(this._y1=+s)},arcTo:function(t,e,n,i,r){t=+t,e=+e,n=+n,i=+i,r=+r;var s=this._x1,o=this._y1,a=n-t,c=i-e,l=s-t,u=o-e,h=l*l+u*u;if(r<0)throw new Error("negative radius: "+r);if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(h>1e-6)if(Math.abs(u*a-c*l)>1e-6&&r){var p=n-s,_=i-o,f=a*a+c*c,d=p*p+_*_,m=Math.sqrt(f),y=Math.sqrt(h),b=r*Math.tan((Z-Math.acos((f+h-d)/(2*m*y)))/2),v=b/y,g=b/m;Math.abs(v-1)>1e-6&&(this._+="L"+(t+v*l)+","+(e+v*u)),this._+="A"+r+","+r+",0,0,"+ +(u*p>l*_)+","+(this._x1=t+g*a)+","+(this._y1=e+g*c)}else this._+="L"+(this._x1=t)+","+(this._y1=e);else;},arc:function(t,e,n,i,r,s){t=+t,e=+e;var o=(n=+n)*Math.cos(i),a=n*Math.sin(i),c=t+o,l=e+a,u=1^s,h=s?i-r:r-i;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+c+","+l:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-l)>1e-6)&&(this._+="L"+c+","+l),n&&(h<0&&(h=h%Q+Q),h>J?this._+="A"+n+","+n+",0,1,"+u+","+(t-o)+","+(e-a)+"A"+n+","+n+",0,1,"+u+","+(this._x1=c)+","+(this._y1=l):h>1e-6&&(this._+="A"+n+","+n+",0,"+ +(h>=Z)+","+u+","+(this._x1=t+n*Math.cos(r))+","+(this._y1=e+n*Math.sin(r))))},rect:function(t,e,n,i){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +i+"h"+-n+"Z"},toString:function(){return this._}};var et=tt,nt=function(t){return function(){return t}},it=Math.abs,rt=Math.atan2,st=Math.cos,ot=Math.max,at=Math.min,ct=Math.sin,lt=Math.sqrt,ut=1e-12,ht=Math.PI,pt=ht/2,_t=2*ht;function ft(t){return t>=1?pt:t<=-1?-pt:Math.asin(t)}function dt(t){return t.innerRadius}function mt(t){return t.outerRadius}function yt(t){return t.startAngle}function bt(t){return t.endAngle}function vt(t){return t&&t.padAngle}function gt(t,e,n,i,r,s,o){var a=t-n,c=e-i,l=(o?s:-s)/lt(a*a+c*c),u=l*c,h=-l*a,p=t+u,_=e+h,f=n+u,d=i+h,m=(p+f)/2,y=(_+d)/2,b=f-p,v=d-_,g=b*b+v*v,x=r-s,E=p*d-f*_,w=(v<0?-1:1)*lt(ot(0,x*x*g-E*E)),O=(E*v-b*w)/g,T=(-E*b-v*w)/g,A=(E*v+b*w)/g,k=(-E*b+v*w)/g,M=O-m,j=T-y,P=A-m,S=k-y;return M*M+j*j>P*P+S*S&&(O=A,T=k),{cx:O,cy:T,x01:-u,y01:-h,x11:O*(r/x-1),y11:T*(r/x-1)}}var xt=function(){var t=dt,e=mt,n=nt(0),i=null,r=yt,s=bt,o=vt,a=null;function c(){var c,l,u,h=+t.apply(this,arguments),p=+e.apply(this,arguments),_=r.apply(this,arguments)-pt,f=s.apply(this,arguments)-pt,d=it(f-_),m=f>_;if(a||(a=c=et()),put)if(d>_t-ut)a.moveTo(p*st(_),p*ct(_)),a.arc(0,0,p,_,f,!m),h>ut&&(a.moveTo(h*st(f),h*ct(f)),a.arc(0,0,h,f,_,m));else{var y,b,v=_,g=f,x=_,E=f,w=d,O=d,T=o.apply(this,arguments)/2,A=T>ut&&(i?+i.apply(this,arguments):lt(h*h+p*p)),k=at(it(p-h)/2,+n.apply(this,arguments)),M=k,j=k;if(A>ut){var P=ft(A/h*ct(T)),S=ft(A/p*ct(T));(w-=2*P)>ut?(x+=P*=m?1:-1,E-=P):(w=0,x=E=(_+f)/2),(O-=2*S)>ut?(v+=S*=m?1:-1,g-=S):(O=0,v=g=(_+f)/2)}var L=p*st(v),R=p*ct(v),N=h*st(E),I=h*ct(E);if(k>ut){var D,C=p*st(g),z=p*ct(g),B=h*st(x),W=h*ct(x);if(d1?0:u<-1?ht:Math.acos(u))/2),F=lt(D[0]*D[0]+D[1]*D[1]);M=at(k,(h-F)/(q-1)),j=at(k,(p-F)/(q+1))}}O>ut?j>ut?(y=gt(B,W,L,R,p,j,m),b=gt(C,z,N,I,p,j,m),a.moveTo(y.cx+y.x01,y.cy+y.y01),jut&&w>ut?M>ut?(y=gt(N,I,C,z,h,-M,m),b=gt(L,R,B,W,h,-M,m),a.lineTo(y.cx+y.x01,y.cy+y.y01),M0)for(var i,r=t[0],s=e[0],o=t[n]-r,a=e[n]-s,c=-1;++c<=n;)i=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(r+i*o),this._beta*e[c]+(1-this._beta)*(s+i*a));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};(function t(e){function n(t){return 1===e?new jt(t):new Lt(t,e)}return n.beta=function(e){return t(+e)},n})(.85);function Rt(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Nt(t,e){this._context=t,this._k=(1-e)/6}Nt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Rt(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Rt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Nt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function It(t,e){this._context=t,this._k=(1-e)/6}It.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Rt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new It(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Dt(t,e){this._context=t,this._k=(1-e)/6}Dt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Rt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Dt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Ct(t,e,n){var i=t._x1,r=t._y1,s=t._x2,o=t._y2;if(t._l01_a>ut){var a=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*a-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,r=(r*a-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>ut){var l=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,u=3*t._l23_a*(t._l23_a+t._l12_a);s=(s*l+t._x1*t._l23_2a-e*t._l12_2a)/u,o=(o*l+t._y1*t._l23_2a-n*t._l12_2a)/u}t._context.bezierCurveTo(i,r,s,o,t._x2,t._y2)}function zt(t,e){this._context=t,this._alpha=e}zt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new zt(t,e):new Nt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Bt(t,e){this._context=t,this._alpha=e}Bt.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new Bt(t,e):new It(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Wt(t,e){this._context=t,this._alpha=e}Wt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new Wt(t,e):new Dt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Ht(t){this._context=t}Ht.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};function Ut(t){return t<0?-1:1}function Kt(t,e,n){var i=t._x1-t._x0,r=e-t._x1,s=(t._y1-t._y0)/(i||r<0&&-0),o=(n-t._y1)/(r||i<0&&-0),a=(s*r+o*i)/(i+r);return(Ut(s)+Ut(o))*Math.min(Math.abs(s),Math.abs(o),.5*Math.abs(a))||0}function Gt(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function qt(t,e,n){var i=t._x0,r=t._y0,s=t._x1,o=t._y1,a=(s-i)/3;t._context.bezierCurveTo(i+a,r+a*e,s-a,o-a*n,s,o)}function Ft(t){this._context=t}function Vt(t){this._context=new Xt(t)}function Xt(t){this._context=t}function Yt(t){this._context=t}function Zt(t){var e,n,i=t.length-1,r=new Array(i),s=new Array(i),o=new Array(i);for(r[0]=0,s[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)r[e]=(o[e]-r[e+1])/s[e];for(s[i-1]=(t[i]+r[i-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var Jt=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),$t=function(){return($t=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var p=document.createElementNS(ie,"tspan");p.setAttribute("x","0"),p.setAttribute("dy","1em"),p.textContent=""+t,p.style.fontSize="8pt";var _=document.createElementNS(ie,"tspan");_.setAttribute("x","0"),_.setAttribute("dy","1em"),_.textContent=""+this.props.unit,_.style.fontSize="8pt",h.append(p,_),h.setAttribute("transform","translate(50 33)")}else h.textContent=""+t,h.style.fontSize="8pt",h.setAttribute("transform","translate(50 50)");else h.textContent=n+"%",h.setAttribute("transform","translate(50 50)");r.append(h)}return i.append(r),i},e.prototype.getProgress=function(){var t=this.props.minValue||0,e=this.props.maxValue||100,n=null==this.props.value?0:this.props.value;return n<=t?0:n>=e?100:Math.trunc((n-t)/(e-t)*100)},e}(s.a),se=n(2),oe=n(4),ae=n(5),ce=n(6),le=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),ue=function(){return(ue=Object.assign||function(t){for(var e,n=1,i=arguments.length;ne.id?1:-1})).forEach(function(t){try{var e=fe(t);i.elementsById[e.props.id]=e,i.elementIds.push(e.props.id),e.onClick(i.handleElementClick),e.onMoved(i.handleElementMovement),e.onResized(i.handleElementResizement),e.onRemove(i.handleElementRemove),i.containerRef.append(e.elementRef)}catch(t){console.log("Error creating a new element:",t.message)}}),this.buildRelations()}return Object.defineProperty(t.prototype,"elements",{get:function(){var t=this;return this.elementIds.map(function(e){return t.elementsById[e]}).filter(function(t){return null!=t})},enumerable:!0,configurable:!0}),t.prototype.updateElements=function(t){var e=this,n=t.map(function(t){return t.id||null}).filter(function(t){return null!=t});this.elementIds.filter(function(t){return n.indexOf(t)<0}).forEach(function(t){null!=e.elementsById[t]&&(e.elementsById[t].remove(),delete e.elementsById[t])}),this.elementIds=n,t.forEach(function(t){if(t.id)if(null==e.elementsById[t.id])try{var n=fe(t);e.elementsById[n.props.id]=n,n.onClick(e.handleElementClick),n.onRemove(e.handleElementRemove),e.containerRef.append(n.elementRef)}catch(t){console.log("Error creating a new element:",t.message)}else try{e.elementsById[t.id].props=function(t){var e=Object(r.m)(t.type,null);if(null==e)throw new TypeError("missing item type.");switch(e){case 0:return l(t);case 1:return Object(ce.b)(t);case 2:case 6:case 7:case 8:return V(t);case 3:case 9:case 15:case 16:return ne(t);case 4:return H(t);case 5:return _(t);case 10:return he(t);case 11:return E(t);case 12:return L(t);case 13:return D(t);case 14:return Object(Y.b)(t);case 17:return Object(oe.b)(t);case 18:return Object(ae.a)(t);case 19:return M(t);case 20:return y(t);default:throw new TypeError("decoder not found")}}(t)}catch(t){console.log("Error updating an element:",t.message)}}),this.buildRelations()},Object.defineProperty(t.prototype,"props",{get:function(){return _e({},this._props)},set:function(t){var e=this.props;this._props=t,this.render(e)},enumerable:!0,configurable:!0}),t.prototype.render=function(t){void 0===t&&(t=null),t?(t.backgroundURL!==this.props.backgroundURL&&(this.containerRef.style.backgroundImage=null!==this.props.backgroundURL?"url("+this.props.backgroundURL+")":null),t.backgroundColor!==this.props.backgroundColor&&(this.containerRef.style.backgroundColor=this.props.backgroundColor),this.sizeChanged(t,this.props)&&this.resizeElement(this.props.width,this.props.height)):(this.containerRef.style.backgroundImage=null!==this.props.backgroundURL?"url("+this.props.backgroundURL+")":null,this.containerRef.style.backgroundColor=this.props.backgroundColor,this.resizeElement(this.props.width,this.props.height))},t.prototype.sizeChanged=function(t,e){return t.width!==e.width||t.height!==e.height},t.prototype.resizeElement=function(t,e){this.containerRef.style.width=t+"px",this.containerRef.style.height=e+"px"},t.prototype.resize=function(t,e){this.props=_e({},this.props,{width:t,height:e})},t.prototype.remove=function(){this.disposables.forEach(function(t){return t.dispose()}),this.elements.forEach(function(t){return t.remove()}),this.elementsById={},this.elementIds=[],this.clearRelations(),this.containerRef.innerHTML=""},t.prototype.buildRelations=function(){var t=this;this.clearRelations(),this.elements.forEach(function(e){if(null!==e.props.parentId){var n=t.elementsById[e.props.parentId],i=t.elementsById[e.props.id];n&&i&&t.addRelationLine(n,i)}})},t.prototype.clearRelations=function(t){if(null!=t)for(var e in this.relations){var n=e.split("|"),i=Number.parseInt(n[0]),r=Number.parseInt(n[1]);t!==i&&t!==r||(this.relations[e].remove(),delete this.relations[e])}else for(var e in this.relations)this.relations[e].remove(),delete this.relations[e]},t.prototype.getRelationLine=function(t,e){var n=t+"|"+e;return this.relations[n]||null},t.prototype.addRelationLine=function(t,e){var n=t.props.id+"|"+e.props.id;null!=this.relations[n]&&this.relations[n].remove();var i=t.props.x+t.elementRef.clientWidth/2,s=t.props.y+(t.elementRef.clientHeight-t.labelElementRef.clientHeight)/2,o=e.props.x+e.elementRef.clientWidth/2,a=e.props.y+(e.elementRef.clientHeight-e.labelElementRef.clientHeight)/2,c=new z(D({id:0,type:13,startX:i,startY:s,endX:o,endY:a,width:0,height:0,lineWidth:this.props.relationLineWidth,color:"#CCCCCC"}),Object(r.g)({receivedAt:new Date}));return this.relations[n]=c,c.elementRef.style.zIndex="0",this.containerRef.append(c.elementRef),c},t.prototype.onItemClick=function(t){var e=this.clickEventManager.on(t);return this.disposables.push(e),e},t.prototype.onItemMoved=function(t){var e=this.movedEventManager.on(t);return this.disposables.push(e),e},t.prototype.onItemResized=function(t){var e=this.resizedEventManager.on(t);return this.disposables.push(e),e},t.prototype.enableEditMode=function(){this.elements.forEach(function(t){t.meta=_e({},t.meta,{editMode:!0})}),this.containerRef.classList.add("is-editing")},t.prototype.disableEditMode=function(){this.elements.forEach(function(t){t.meta=_e({},t.meta,{editMode:!1})}),this.containerRef.classList.remove("is-editing")},t}(),me=function(){function t(t){this.cancellable={cancel:function(){}},this._status="waiting",this.statusChangeEventManager=new se.a,this.disposables=[],this.taskInitiator=t}return Object.defineProperty(t.prototype,"status",{get:function(){return this._status},set:function(t){this._status=t,this.statusChangeEventManager.emit(t)},enumerable:!0,configurable:!0}),t.prototype.init=function(){var t=this;this.cancellable=this.taskInitiator(function(){t.status="finished"}),this.status="started"},t.prototype.cancel=function(){this.cancellable.cancel(),this.status="cancelled"},t.prototype.onStatusChange=function(t){var e=this.statusChangeEventManager.on(t);return this.disposables.push(e),e},t}();var ye=function(){function t(){this.tasks={}}return t.prototype.add=function(t,e,n){void 0===n&&(n=0),this.tasks[t]&&"started"===this.tasks[t].status&&this.tasks[t].cancel();var i=n>0?function(t,e){return new me(function(){var n=null;return t.onStatusChange(function(i){"finished"===i&&(n=window.setTimeout(function(){t.init()},e))}),t.init(),{cancel:function(){n&&clearTimeout(n),t.cancel()}}})}(new me(e),n):new me(e);return this.tasks[t]=i,this.tasks[t]},t.prototype.init=function(t){!this.tasks[t]||"waiting"!==this.tasks[t].status&&"cancelled"!==this.tasks[t].status&&"finished"!==this.tasks[t].status||this.tasks[t].init()},t.prototype.cancel=function(t){this.tasks[t]&&"started"===this.tasks[t].status&&this.tasks[t].cancel()},t}();window.VisualConsole=de,window.AsyncTaskManager=ye}]); +!function(t){var e={};function n(i){if(e[i])return e[i].exports;var r=e[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)n.d(i,r,function(e){return t[e]}.bind(null,r));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=9)}([function(t,e,n){"use strict";n.d(e,"m",function(){return r}),n.d(e,"l",function(){return s}),n.d(e,"r",function(){return o}),n.d(e,"j",function(){return a}),n.d(e,"k",function(){return c}),n.d(e,"n",function(){return u}),n.d(e,"q",function(){return h}),n.d(e,"i",function(){return p}),n.d(e,"h",function(){return _}),n.d(e,"g",function(){return f}),n.d(e,"o",function(){return d}),n.d(e,"d",function(){return m}),n.d(e,"e",function(){return y}),n.d(e,"f",function(){return b}),n.d(e,"p",function(){return v}),n.d(e,"c",function(){return x}),n.d(e,"a",function(){return w}),n.d(e,"b",function(){return O});var i=function(){return(i=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&!isNaN(parseInt(t))?parseInt(t):e}function s(t,e){return"number"==typeof t?t:"string"==typeof t&&t.length>0&&!isNaN(parseFloat(t))?parseFloat(t):e}function o(t){return null==t||0===t.length}function a(t,e){return"string"==typeof t&&t.length>0?t:e}function c(t){return"boolean"==typeof t?t:"number"==typeof t?t>0:"string"==typeof t&&("1"===t||"true"===t)}function l(t,e,n){void 0===n&&(n=" "),"number"==typeof t&&(t=""+t),"number"==typeof n&&(n=""+n);var i=e-t.length;if(0===i)return t;if(i<0)return t.substr(Math.abs(i));if(i===n.length)return""+n+t;if(i0&&id||y+r+m.width-b>u.width||r===x&&y<0&&i>f+x+c,A=h0&&h_||g+s+m.height-b>u.height||s===E&&g<0&&h>p+E+l;(e=O?0:T?x:y+r)<0&&(e=0),(n=A?0:k?E:g+s)<0&&(n=0),o=i,a=h,e===r&&n===s||(w(e,n),v(e,n),r=e,s=n)},T=function(){r=0,s=0,o=0,a=0,document.removeEventListener("mousemove",O),document.removeEventListener("mouseup",T),t.draggable=i,document.body.style.userSelect="auto"},A=function(e){e.stopPropagation(),t.draggable=!1,r=t.offsetLeft,s=t.offsetTop,o=e.pageX,a=e.pageY,c=e.offsetX,l=e.offsetY,u=n.getBoundingClientRect(),h=E(n),p=h.top,_=p+u.height,f=h.left,d=f+u.width,m=t.getBoundingClientRect(),y=window.getComputedStyle(t).borderWidth||"0",b=2*Number.parseInt(y),document.addEventListener("mousemove",O),document.addEventListener("mouseup",T),document.body.style.userSelect="none"};return t.addEventListener("mousedown",A),function(){t.removeEventListener("mousedown",A),T()}}function O(t,e){var n=document.createElement("div");n.className="resize-draggable",t.appendChild(n);var i=t.parentElement,r=t.draggable,s=0,o=0,a=0,c=0,l=0,u=i.getBoundingClientRect(),h=E(i),p=h.top,_=p+u.height,f=h.left,d=f+u.width,m=E(t),y=m.top,b=m.left,v=window.getComputedStyle(t).borderWidth||"0",w=Number.parseInt(v),O=x(32,function(t,n){return e(t,n)}),T=g(16,function(t,n){return e(t,n)}),A=function(t){var e=s+(t.pageX-a),n=o+(t.pageY-c);e===s&&n===o||eb+(s-l)||(e<15?e=15:e+b-w/2>=d&&(e=d-b),n<15?n=15:n+y-w/2>=_&&(n=_-y),T(e,n),O(e,n),s=e,o=n,a=t.pageX,c=t.pageY)},k=function(){s=0,o=0,a=0,c=0,l=0,0,document.removeEventListener("mousemove",A),document.removeEventListener("mouseup",k),t.draggable=r,document.body.style.userSelect="auto"};return n.addEventListener("mousedown",function(e){e.stopPropagation(),t.draggable=!1;var n=t.getBoundingClientRect(),r=n.width,v=n.height;s=r,o=v,a=e.pageX,c=e.pageY,l=e.offsetX,e.offsetY,u=i.getBoundingClientRect(),h=E(i),p=h.top,_=p+u.height,f=h.left,d=f+u.width,m=E(t),y=m.top,b=m.left,document.addEventListener("mousemove",A),document.addEventListener("mouseup",k),document.body.style.userSelect="none"}),function(){n.remove(),k()}}},function(t,e,n){"use strict";n.d(e,"b",function(){return a});var i=n(0),r=n(2),s=function(){return(s=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var i=e.labelElementRef.getBoundingClientRect(),r=i.width,s=i.height;switch(e.props.labelPosition){case"up":case"down":n-=s;break;case"left":case"right":t-=r}}e.resizeElement(t,n),e.debouncedResizementSave(t,n)})},t.prototype.stopResizementListener=function(){this.removeResizement&&(this.removeResizement(),this.removeResizement=null)},t.prototype.createContainerDomElement=function(){var t,e=this;return this.props.isLinkEnabled?(t=document.createElement("a"),this.props.link&&(t.href=this.props.link)):t=document.createElement("div"),t.className="visual-console-item",t.style.zIndex=this.props.isOnTop?"2":"1",t.style.left=this.props.x+"px",t.style.top=this.props.y+"px",t.addEventListener("click",function(t){e.meta.editMode?(t.preventDefault(),t.stopPropagation()):e.clickEventManager.emit({data:e.props,nativeEvent:t})}),this.meta.editMode&&(t.classList.add("is-editing"),this.initMovementListener(t),this.initResizementListener(t)),this.meta.isFetching&&t.classList.add("is-fetching"),this.meta.isUpdating&&t.classList.add("is-updating"),t},t.prototype.createLabelDomElement=function(){var t=document.createElement("div");t.className="visual-console-item-label";var e=this.getLabelWithMacrosReplaced();if(e.length>0){var n=document.createElement("table"),i=document.createElement("tr"),r=document.createElement("tr"),s=document.createElement("tr"),o=document.createElement("td");switch(o.innerHTML=e,i.append(o),n.append(r,i,s),n.style.textAlign="center",this.props.labelPosition){case"up":case"down":this.props.width>0&&(n.style.width=this.props.width+"px",n.style.height=null);break;case"left":case"right":this.props.height>0&&(n.style.width=null,n.style.height=this.props.height+"px")}t.append(n)}return t},t.prototype.getLabelWithMacrosReplaced=function(){var t=this.props;return Object(i.p)([{macro:"_date_",value:Object(i.e)(new Date)},{macro:"_time_",value:Object(i.f)(new Date)},{macro:"_agent_",value:null!=t.agentAlias?t.agentAlias:""},{macro:"_agentdescription_",value:null!=t.agentDescription?t.agentDescription:""},{macro:"_address_",value:null!=t.agentAddress?t.agentAddress:""},{macro:"_module_",value:null!=t.moduleName?t.moduleName:""},{macro:"_moduledescription_",value:null!=t.moduleDescription?t.moduleDescription:""}],this.props.label||"")},t.prototype.updateDomElement=function(t){t.innerHTML=this.createDomElement().innerHTML},Object.defineProperty(t.prototype,"props",{get:function(){return s({},this.itemProps)},set:function(t){var e=this.props;this.itemProps=t,this.shouldBeUpdated(e,t)&&this.render(e,this._metadata)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"meta",{get:function(){return s({},this._metadata)},set:function(t){this.setMeta(t)},enumerable:!0,configurable:!0}),t.prototype.setMeta=function(t){var e=this._metadata;this._metadata=t,this.render(this.itemProps,e)},t.prototype.shouldBeUpdated=function(t,e){return t!==e},t.prototype.render=function(t,e){void 0===t&&(t=null),void 0===e&&(e=null),this.updateDomElement(this.childElementRef),t&&!this.positionChanged(t,this.props)||this.moveElement(this.props.x,this.props.y),t&&!this.sizeChanged(t,this.props)||this.resizeElement(this.props.width,this.props.height);var n=this.labelElementRef.innerHTML,i=this.createLabelDomElement().innerHTML;if(n!==i&&(this.labelElementRef.innerHTML=i),t&&t.labelPosition===this.props.labelPosition||this.changeLabelPosition(this.props.labelPosition),t&&(t.isLinkEnabled!==this.props.isLinkEnabled||this.props.isLinkEnabled&&t.link!==this.props.link)){var r=this.createContainerDomElement();r.innerHTML=this.elementRef.innerHTML;for(var s=this.elementRef.attributes,o=0;o0?e.item(0):null;if(n)switch(this.props.labelPosition){case"up":case"down":this.props.width>0&&(n.style.width=this.props.width+"px",n.style.height=null);break;case"left":case"right":this.props.height>0&&(n.style.width=null,n.style.height=this.props.height+"px")}},t.prototype.moveElement=function(t,e){this.elementRef.style.left=t+"px",this.elementRef.style.top=e+"px"},t.prototype.move=function(t,e){this.moveElement(t,e),this.itemProps=s({},this.props,{x:t,y:e})},t.prototype.sizeChanged=function(t,e){return t.width!==e.width||t.height!==e.height},t.prototype.resizeElement=function(t,e){if(this.childElementRef.style.width=t>0?t+"px":null,this.childElementRef.style.height=e>0?e+"px":null,this.props.label&&this.props.label.length>0){var n=this.labelElementRef.getElementsByTagName("table"),i=n.length>0?n.item(0):null;if(i)switch(this.props.labelPosition){case"up":case"down":i.style.width=t>0?t+"px":null;break;case"left":case"right":i.style.height=e>0?e+"px":null}}},t.prototype.resize=function(t,e){this.resizeElement(t,e),this.itemProps=s({},this.props,{width:t,height:e})},t.prototype.onClick=function(t){var e=this.clickEventManager.on(t);return this.disposables.push(e),e},t.prototype.onMoved=function(t){var e=this.movedEventManager.on(t);return this.disposables.push(e),e},t.prototype.onResized=function(t){var e=this.resizedEventManager.on(t);return this.disposables.push(e),e},t.prototype.onRemove=function(t){var e=this.removeEventManager.on(t);return this.disposables.push(e),e},t}();e.a=c},function(t,e,n){"use strict";var i=function(){return function(){var t=this;this.listeners=[],this.listenersOncer=[],this.on=function(e){return t.listeners.push(e),{dispose:function(){return t.off(e)}}},this.once=function(e){t.listenersOncer.push(e)},this.off=function(e){var n=t.listeners.indexOf(e);n>-1&&t.listeners.splice(n,1)},this.emit=function(e){t.listeners.forEach(function(t){return t(e)}),t.listenersOncer.forEach(function(t){return t(e)}),t.listenersOncer=[]},this.pipe=function(e){return t.on(function(t){return e.emit(t)})}}}();e.a=i},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"b",function(){return eventsHistoryPropsDecoder});var _lib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),_Item__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(1),__extends=(extendStatics=function(t,e){return(extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}extendStatics(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),extendStatics,__assign=function(){return(__assign=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var y=document.createElementNS(t,"text");y.setAttribute("text-anchor","middle"),y.setAttribute("font-size","8"),y.setAttribute("transform","translate(30 50) rotate(90)"),y.setAttribute("fill",i),y.textContent=m,f.append(y)}var b=document.createElementNS(t,"g");b.setAttribute("class","marks");var v=document.createElementNS(t,"g");v.setAttribute("class","mark"),v.setAttribute("transform","translate(50 50)");var g=document.createElementNS(t,"line");g.setAttribute("x1","36"),g.setAttribute("y1","0"),g.setAttribute("x2","46"),g.setAttribute("y2","0"),g.setAttribute("stroke",i),g.setAttribute("stroke-width","5");var x=document.createElementNS(t,"line");x.setAttribute("x1","36"),x.setAttribute("y1","0"),x.setAttribute("x2","46"),x.setAttribute("y2","0"),x.setAttribute("stroke",e),x.setAttribute("stroke-width","1"),v.append(g,x),b.append(v);for(var E=1;E<60;E++){var w=document.createElementNS(t,"line");w.setAttribute("y1","0"),w.setAttribute("y2","0"),w.setAttribute("stroke",i),w.setAttribute("transform","translate(50 50) rotate("+6*E+")"),E%5==0?(w.setAttribute("x1","38"),w.setAttribute("x2","46"),w.setAttribute("stroke-width",E%15==0?"2":"1")):(w.setAttribute("x1","42"),w.setAttribute("x2","46"),w.setAttribute("stroke-width","0.5")),b.append(w)}var O=document.createElementNS(t,"g");O.setAttribute("class","hour-hand"),O.setAttribute("transform","translate(50 50)");var T=document.createElementNS(t,"line");T.setAttribute("class","hour-hand-a"),T.setAttribute("x1","0"),T.setAttribute("y1","0"),T.setAttribute("x2","30"),T.setAttribute("y2","0"),T.setAttribute("stroke",o),T.setAttribute("stroke-width","4"),T.setAttribute("stroke-linecap","round");var A=document.createElementNS(t,"line");A.setAttribute("class","hour-hand-b"),A.setAttribute("x1","0"),A.setAttribute("y1","0"),A.setAttribute("x2","29.9"),A.setAttribute("y2","0"),A.setAttribute("stroke",s),A.setAttribute("stroke-width","3.1"),A.setAttribute("stroke-linecap","round"),O.append(T,A);var k=document.createElementNS(t,"g");k.setAttribute("class","minute-hand"),k.setAttribute("transform","translate(50 50)");var M=document.createElementNS(t,"line");M.setAttribute("class","minute-hand-a"),M.setAttribute("x1","0"),M.setAttribute("y1","0"),M.setAttribute("x2","40"),M.setAttribute("y2","0"),M.setAttribute("stroke",o),M.setAttribute("stroke-width","2"),M.setAttribute("stroke-linecap","round");var j=document.createElementNS(t,"line");j.setAttribute("class","minute-hand-b"),j.setAttribute("x1","0"),j.setAttribute("y1","0"),j.setAttribute("x2","39.9"),j.setAttribute("y2","0"),j.setAttribute("stroke",s),j.setAttribute("stroke-width","1.5"),j.setAttribute("stroke-linecap","round");var P=document.createElementNS(t,"circle");P.setAttribute("r","3"),P.setAttribute("fill",s),k.append(M,j,P);var S=document.createElementNS(t,"g");S.setAttribute("class","second-hand"),S.setAttribute("transform","translate(50 50)");var L=document.createElementNS(t,"line");L.setAttribute("x1","0"),L.setAttribute("y1","0"),L.setAttribute("x2","46"),L.setAttribute("y2","0"),L.setAttribute("stroke",a),L.setAttribute("stroke-width","1"),L.setAttribute("stroke-linecap","round");var R=document.createElementNS(t,"circle");R.setAttribute("r","2"),R.setAttribute("fill",a),S.append(L,R);var N=document.createElementNS(t,"circle");N.setAttribute("cx","50"),N.setAttribute("cy","50"),N.setAttribute("r","0.3"),N.setAttribute("fill",s);var I=this.getOriginDate(),D=I.getSeconds(),C=I.getMinutes(),z=6*D,B=6*C+D/60*6,W=30*I.getHours()+C/60*30;if(O.setAttribute("transform","translate(50 50) rotate("+W+")"),k.setAttribute("transform","translate(50 50) rotate("+B+")"),S.setAttribute("transform","translate(50 50) rotate("+z+")"),_.append(f,b,O,k,S,N),_.setAttribute("transform","rotate(-90)"),p.innerHTML="\n \n ",p.append(_),"datetime"===this.props.clockFormat){var H=document.createElement("span");H.className="date",H.textContent=Object(r.e)(I,"default"),H.style.fontSize=h+"px",this.props.color&&(H.style.color=this.props.color),p.append(H)}return p},e.prototype.createDigitalClock=function(){var t=document.createElement("div");t.className="digital-clock";var e=this.getElementSize().width,n=6/this.props.clockTimezone.length,i=20*e/100,s=10*e/100,o=Math.min(20*n*e/100,e/100*10),a=this.getOriginDate();if("datetime"===this.props.clockFormat){var c=document.createElement("span");c.className="date",c.textContent=Object(r.e)(a,"default"),c.style.fontSize=s+"px",this.props.color&&(c.style.color=this.props.color),t.append(c)}var l=document.createElement("span");l.className="time",l.textContent=Object(r.f)(a),l.style.fontSize=i+"px",this.props.color&&(l.style.color=this.props.color),t.append(l);var u=this.getHumanTimezone();if(u.length>0){var h=document.createElement("span");h.className="timezone",h.textContent=u,h.style.fontSize=o+"px",this.props.color&&(h.style.color=this.props.color),t.append(h)}return t},e.prototype.getOriginDate=function(t){void 0===t&&(t=null);var e=t||new Date,n=1e3*this.props.clockTimezoneOffset,i=60*e.getTimezoneOffset()*1e3,r=e.getTime()+n+i;return new Date(r)},e.prototype.getHumanTimezone=function(t){void 0===t&&(t=this.props.clockTimezone);var e=t.split("/")[1];return(void 0===e?"":e).replace("_"," ")},e.prototype.getElementSize=function(t,e){switch(void 0===t&&(t=this.props.width),void 0===e&&(e=this.props.height),this.props.clockType){case"analogic":var n=100;return t>0&&e>0?n=Math.min(t,e):t>0?n=t:e>0&&(n=e),{width:n,height:n};case"digital":return t>0&&e>0?e=t/20?e=t/2:e>0?t=2*e:(t=100,e=50),{width:t,height:e};default:throw new Error("invalid clock type.")}},e.TICK_INTERVAL=1e3,e}(s.a),P=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),S=function(){return(S=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){t.style.borderStyle="solid";var e=Math.min(this.props.width,this.props.height)/2,n=Math.min(this.props.borderWidth,e);t.style.borderWidth=n+"px",this.props.borderColor&&(t.style.borderColor=this.props.borderColor)}return t},e}(s.a),N=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),I=function(){return(I=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&(n=Object(r.p)([{macro:/\(?_VALUE_\)?/i,value:n}],i)),t.innerHTML=n}return t},e.prototype.createLabelDomElement=function(){var t=document.createElement("div");return t.className="visual-console-item-label",t},e}(s.a),Y=n(3),Z=Math.PI,Q=2*Z,J=Q-1e-6;function $(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function tt(){return new $}$.prototype=tt.prototype={constructor:$,moveTo:function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},quadraticCurveTo:function(t,e,n,i){this._+="Q"+ +t+","+ +e+","+(this._x1=+n)+","+(this._y1=+i)},bezierCurveTo:function(t,e,n,i,r,s){this._+="C"+ +t+","+ +e+","+ +n+","+ +i+","+(this._x1=+r)+","+(this._y1=+s)},arcTo:function(t,e,n,i,r){t=+t,e=+e,n=+n,i=+i,r=+r;var s=this._x1,o=this._y1,a=n-t,c=i-e,l=s-t,u=o-e,h=l*l+u*u;if(r<0)throw new Error("negative radius: "+r);if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(h>1e-6)if(Math.abs(u*a-c*l)>1e-6&&r){var p=n-s,_=i-o,f=a*a+c*c,d=p*p+_*_,m=Math.sqrt(f),y=Math.sqrt(h),b=r*Math.tan((Z-Math.acos((f+h-d)/(2*m*y)))/2),v=b/y,g=b/m;Math.abs(v-1)>1e-6&&(this._+="L"+(t+v*l)+","+(e+v*u)),this._+="A"+r+","+r+",0,0,"+ +(u*p>l*_)+","+(this._x1=t+g*a)+","+(this._y1=e+g*c)}else this._+="L"+(this._x1=t)+","+(this._y1=e);else;},arc:function(t,e,n,i,r,s){t=+t,e=+e;var o=(n=+n)*Math.cos(i),a=n*Math.sin(i),c=t+o,l=e+a,u=1^s,h=s?i-r:r-i;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+c+","+l:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-l)>1e-6)&&(this._+="L"+c+","+l),n&&(h<0&&(h=h%Q+Q),h>J?this._+="A"+n+","+n+",0,1,"+u+","+(t-o)+","+(e-a)+"A"+n+","+n+",0,1,"+u+","+(this._x1=c)+","+(this._y1=l):h>1e-6&&(this._+="A"+n+","+n+",0,"+ +(h>=Z)+","+u+","+(this._x1=t+n*Math.cos(r))+","+(this._y1=e+n*Math.sin(r))))},rect:function(t,e,n,i){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +i+"h"+-n+"Z"},toString:function(){return this._}};var et=tt,nt=function(t){return function(){return t}},it=Math.abs,rt=Math.atan2,st=Math.cos,ot=Math.max,at=Math.min,ct=Math.sin,lt=Math.sqrt,ut=1e-12,ht=Math.PI,pt=ht/2,_t=2*ht;function ft(t){return t>=1?pt:t<=-1?-pt:Math.asin(t)}function dt(t){return t.innerRadius}function mt(t){return t.outerRadius}function yt(t){return t.startAngle}function bt(t){return t.endAngle}function vt(t){return t&&t.padAngle}function gt(t,e,n,i,r,s,o){var a=t-n,c=e-i,l=(o?s:-s)/lt(a*a+c*c),u=l*c,h=-l*a,p=t+u,_=e+h,f=n+u,d=i+h,m=(p+f)/2,y=(_+d)/2,b=f-p,v=d-_,g=b*b+v*v,x=r-s,E=p*d-f*_,w=(v<0?-1:1)*lt(ot(0,x*x*g-E*E)),O=(E*v-b*w)/g,T=(-E*b-v*w)/g,A=(E*v+b*w)/g,k=(-E*b+v*w)/g,M=O-m,j=T-y,P=A-m,S=k-y;return M*M+j*j>P*P+S*S&&(O=A,T=k),{cx:O,cy:T,x01:-u,y01:-h,x11:O*(r/x-1),y11:T*(r/x-1)}}var xt=function(){var t=dt,e=mt,n=nt(0),i=null,r=yt,s=bt,o=vt,a=null;function c(){var c,l,u,h=+t.apply(this,arguments),p=+e.apply(this,arguments),_=r.apply(this,arguments)-pt,f=s.apply(this,arguments)-pt,d=it(f-_),m=f>_;if(a||(a=c=et()),put)if(d>_t-ut)a.moveTo(p*st(_),p*ct(_)),a.arc(0,0,p,_,f,!m),h>ut&&(a.moveTo(h*st(f),h*ct(f)),a.arc(0,0,h,f,_,m));else{var y,b,v=_,g=f,x=_,E=f,w=d,O=d,T=o.apply(this,arguments)/2,A=T>ut&&(i?+i.apply(this,arguments):lt(h*h+p*p)),k=at(it(p-h)/2,+n.apply(this,arguments)),M=k,j=k;if(A>ut){var P=ft(A/h*ct(T)),S=ft(A/p*ct(T));(w-=2*P)>ut?(x+=P*=m?1:-1,E-=P):(w=0,x=E=(_+f)/2),(O-=2*S)>ut?(v+=S*=m?1:-1,g-=S):(O=0,v=g=(_+f)/2)}var L=p*st(v),R=p*ct(v),N=h*st(E),I=h*ct(E);if(k>ut){var D,C=p*st(g),z=p*ct(g),B=h*st(x),W=h*ct(x);if(d1?0:u<-1?ht:Math.acos(u))/2),F=lt(D[0]*D[0]+D[1]*D[1]);M=at(k,(h-F)/(q-1)),j=at(k,(p-F)/(q+1))}}O>ut?j>ut?(y=gt(B,W,L,R,p,j,m),b=gt(C,z,N,I,p,j,m),a.moveTo(y.cx+y.x01,y.cy+y.y01),jut&&w>ut?M>ut?(y=gt(N,I,C,z,h,-M,m),b=gt(L,R,B,W,h,-M,m),a.lineTo(y.cx+y.x01,y.cy+y.y01),M0)for(var i,r=t[0],s=e[0],o=t[n]-r,a=e[n]-s,c=-1;++c<=n;)i=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(r+i*o),this._beta*e[c]+(1-this._beta)*(s+i*a));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};(function t(e){function n(t){return 1===e?new jt(t):new Lt(t,e)}return n.beta=function(e){return t(+e)},n})(.85);function Rt(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Nt(t,e){this._context=t,this._k=(1-e)/6}Nt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Rt(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Rt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Nt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function It(t,e){this._context=t,this._k=(1-e)/6}It.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Rt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new It(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Dt(t,e){this._context=t,this._k=(1-e)/6}Dt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Rt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Dt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Ct(t,e,n){var i=t._x1,r=t._y1,s=t._x2,o=t._y2;if(t._l01_a>ut){var a=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*a-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,r=(r*a-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>ut){var l=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,u=3*t._l23_a*(t._l23_a+t._l12_a);s=(s*l+t._x1*t._l23_2a-e*t._l12_2a)/u,o=(o*l+t._y1*t._l23_2a-n*t._l12_2a)/u}t._context.bezierCurveTo(i,r,s,o,t._x2,t._y2)}function zt(t,e){this._context=t,this._alpha=e}zt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new zt(t,e):new Nt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Bt(t,e){this._context=t,this._alpha=e}Bt.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new Bt(t,e):new It(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Wt(t,e){this._context=t,this._alpha=e}Wt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new Wt(t,e):new Dt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Ht(t){this._context=t}Ht.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};function Ut(t){return t<0?-1:1}function Kt(t,e,n){var i=t._x1-t._x0,r=e-t._x1,s=(t._y1-t._y0)/(i||r<0&&-0),o=(n-t._y1)/(r||i<0&&-0),a=(s*r+o*i)/(i+r);return(Ut(s)+Ut(o))*Math.min(Math.abs(s),Math.abs(o),.5*Math.abs(a))||0}function Gt(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function qt(t,e,n){var i=t._x0,r=t._y0,s=t._x1,o=t._y1,a=(s-i)/3;t._context.bezierCurveTo(i+a,r+a*e,s-a,o-a*n,s,o)}function Ft(t){this._context=t}function Vt(t){this._context=new Xt(t)}function Xt(t){this._context=t}function Yt(t){this._context=t}function Zt(t){var e,n,i=t.length-1,r=new Array(i),s=new Array(i),o=new Array(i);for(r[0]=0,s[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)r[e]=(o[e]-r[e+1])/s[e];for(s[i-1]=(t[i]+r[i-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var Jt=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),$t=function(){return($t=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var p=document.createElementNS(ie,"tspan");p.setAttribute("x","0"),p.setAttribute("dy","1em"),p.textContent=""+t,p.style.fontSize="8pt";var _=document.createElementNS(ie,"tspan");_.setAttribute("x","0"),_.setAttribute("dy","1em"),_.textContent=""+this.props.unit,_.style.fontSize="8pt",h.append(p,_),h.setAttribute("transform","translate(50 33)")}else h.textContent=""+t,h.style.fontSize="8pt",h.setAttribute("transform","translate(50 50)");else h.textContent=n+"%",h.setAttribute("transform","translate(50 50)");r.append(h)}return i.append(r),i},e.prototype.getProgress=function(){var t=this.props.minValue||0,e=this.props.maxValue||100,n=null==this.props.value?0:this.props.value;return n<=t?0:n>=e?100:Math.trunc((n-t)/(e-t)*100)},e}(s.a),se=n(2),oe=n(4),ae=n(5),ce=n(6),le=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),ue=function(){return(ue=Object.assign||function(t){for(var e,n=1,i=arguments.length;ne.id?1:-1})).forEach(function(t){try{var e=fe(t);i.elementsById[e.props.id]=e,i.elementIds.push(e.props.id),e.onClick(i.handleElementClick),e.onMoved(i.handleElementMovement),e.onResized(i.handleElementResizement),e.onRemove(i.handleElementRemove),i.containerRef.append(e.elementRef)}catch(t){console.log("Error creating a new element:",t.message)}}),this.buildRelations()}return Object.defineProperty(t.prototype,"elements",{get:function(){var t=this;return this.elementIds.map(function(e){return t.elementsById[e]}).filter(function(t){return null!=t})},enumerable:!0,configurable:!0}),t.prototype.updateElements=function(t){var e=this,n=t.map(function(t){return t.id||null}).filter(function(t){return null!=t});this.elementIds.filter(function(t){return n.indexOf(t)<0}).forEach(function(t){null!=e.elementsById[t]&&(e.elementsById[t].remove(),delete e.elementsById[t])}),this.elementIds=n,t.forEach(function(t){if(t.id)if(null==e.elementsById[t.id])try{var n=fe(t);e.elementsById[n.props.id]=n,n.onClick(e.handleElementClick),n.onRemove(e.handleElementRemove),e.containerRef.append(n.elementRef)}catch(t){console.log("Error creating a new element:",t.message)}else try{e.elementsById[t.id].props=function(t){var e=Object(r.m)(t.type,null);if(null==e)throw new TypeError("missing item type.");switch(e){case 0:return l(t);case 1:return Object(ce.b)(t);case 2:case 6:case 7:case 8:return V(t);case 3:case 9:case 15:case 16:return ne(t);case 4:return H(t);case 5:return _(t);case 10:return he(t);case 11:return E(t);case 12:return L(t);case 13:return D(t);case 14:return Object(Y.b)(t);case 17:return Object(oe.b)(t);case 18:return Object(ae.a)(t);case 19:return M(t);case 20:return y(t);default:throw new TypeError("decoder not found")}}(t)}catch(t){console.log("Error updating an element:",t.message)}}),this.buildRelations()},Object.defineProperty(t.prototype,"props",{get:function(){return _e({},this._props)},set:function(t){var e=this.props;this._props=t,this.render(e)},enumerable:!0,configurable:!0}),t.prototype.render=function(t){void 0===t&&(t=null),t?(t.backgroundURL!==this.props.backgroundURL&&(this.containerRef.style.backgroundImage=null!==this.props.backgroundURL?"url("+this.props.backgroundURL+")":null),t.backgroundColor!==this.props.backgroundColor&&(this.containerRef.style.backgroundColor=this.props.backgroundColor),this.sizeChanged(t,this.props)&&this.resizeElement(this.props.width,this.props.height)):(this.containerRef.style.backgroundImage=null!==this.props.backgroundURL?"url("+this.props.backgroundURL+")":null,this.containerRef.style.backgroundColor=this.props.backgroundColor,this.resizeElement(this.props.width,this.props.height))},t.prototype.sizeChanged=function(t,e){return t.width!==e.width||t.height!==e.height},t.prototype.resizeElement=function(t,e){this.containerRef.style.width=t+"px",this.containerRef.style.height=e+"px"},t.prototype.resize=function(t,e){this.props=_e({},this.props,{width:t,height:e})},t.prototype.remove=function(){this.disposables.forEach(function(t){return t.dispose()}),this.elements.forEach(function(t){return t.remove()}),this.elementsById={},this.elementIds=[],this.clearRelations(),this.containerRef.innerHTML=""},t.prototype.buildRelations=function(){var t=this;this.clearRelations(),this.elements.forEach(function(e){if(null!==e.props.parentId){var n=t.elementsById[e.props.parentId],i=t.elementsById[e.props.id];n&&i&&t.addRelationLine(n,i)}})},t.prototype.clearRelations=function(t){if(null!=t)for(var e in this.relations){var n=e.split("|"),i=Number.parseInt(n[0]),r=Number.parseInt(n[1]);t!==i&&t!==r||(this.relations[e].remove(),delete this.relations[e])}else for(var e in this.relations)this.relations[e].remove(),delete this.relations[e]},t.prototype.getRelationLine=function(t,e){var n=t+"|"+e;return this.relations[n]||null},t.prototype.addRelationLine=function(t,e){var n=t.props.id+"|"+e.props.id;null!=this.relations[n]&&this.relations[n].remove();var i=t.props.x+t.elementRef.clientWidth/2,s=t.props.y+(t.elementRef.clientHeight-t.labelElementRef.clientHeight)/2,o=e.props.x+e.elementRef.clientWidth/2,a=e.props.y+(e.elementRef.clientHeight-e.labelElementRef.clientHeight)/2,c=new z(D({id:0,type:13,startX:i,startY:s,endX:o,endY:a,width:0,height:0,lineWidth:this.props.relationLineWidth,color:"#CCCCCC"}),Object(r.g)({receivedAt:new Date}));return this.relations[n]=c,c.elementRef.style.zIndex="0",this.containerRef.append(c.elementRef),c},t.prototype.onItemClick=function(t){var e=this.clickEventManager.on(t);return this.disposables.push(e),e},t.prototype.onItemMoved=function(t){var e=this.movedEventManager.on(t);return this.disposables.push(e),e},t.prototype.onItemResized=function(t){var e=this.resizedEventManager.on(t);return this.disposables.push(e),e},t.prototype.enableEditMode=function(){this.elements.forEach(function(t){t.meta=_e({},t.meta,{editMode:!0})}),this.containerRef.classList.add("is-editing")},t.prototype.disableEditMode=function(){this.elements.forEach(function(t){t.meta=_e({},t.meta,{editMode:!1})}),this.containerRef.classList.remove("is-editing")},t}(),me=function(){function t(t){this.cancellable={cancel:function(){}},this._status="waiting",this.statusChangeEventManager=new se.a,this.disposables=[],this.taskInitiator=t}return Object.defineProperty(t.prototype,"status",{get:function(){return this._status},set:function(t){this._status=t,this.statusChangeEventManager.emit(t)},enumerable:!0,configurable:!0}),t.prototype.init=function(){var t=this;this.cancellable=this.taskInitiator(function(){t.status="finished"}),this.status="started"},t.prototype.cancel=function(){this.cancellable.cancel(),this.status="cancelled"},t.prototype.onStatusChange=function(t){var e=this.statusChangeEventManager.on(t);return this.disposables.push(e),e},t}();var ye=function(){function t(){this.tasks={}}return t.prototype.add=function(t,e,n){void 0===n&&(n=0),this.tasks[t]&&"started"===this.tasks[t].status&&this.tasks[t].cancel();var i=n>0?function(t,e){return new me(function(){var n=null;return t.onStatusChange(function(i){"finished"===i&&(n=window.setTimeout(function(){t.init()},e))}),t.init(),{cancel:function(){n&&clearTimeout(n),t.cancel()}}})}(new me(e),n):new me(e);return this.tasks[t]=i,this.tasks[t]},t.prototype.init=function(t){!this.tasks[t]||"waiting"!==this.tasks[t].status&&"cancelled"!==this.tasks[t].status&&"finished"!==this.tasks[t].status||this.tasks[t].init()},t.prototype.cancel=function(t){this.tasks[t]&&"started"===this.tasks[t].status&&this.tasks[t].cancel()},t}();window.VisualConsole=de,window.AsyncTaskManager=ye}]); //# sourceMappingURL=vc.main.min.js.map \ No newline at end of file diff --git a/pandora_console/include/visual-console-client/vc.main.min.js.map b/pandora_console/include/visual-console-client/vc.main.min.js.map index 5fae8d74d0..10f1309b68 100644 --- a/pandora_console/include/visual-console-client/vc.main.min.js.map +++ b/pandora_console/include/visual-console-client/vc.main.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/index.ts","webpack:///./src/Item.ts","webpack:///./src/lib/TypedEvent.ts","webpack:///./src/items/EventsHistory.ts","webpack:///./src/items/DonutGraph.ts","webpack:///./src/items/BarsGraph.ts","webpack:///./src/items/ModuleGraph.ts","webpack:///./src/items/StaticGraph.ts","webpack:///./src/items/Icon.ts","webpack:///./src/items/ColorCloud.ts","webpack:///./src/items/Group.ts","webpack:///./src/items/Clock/index.ts","webpack:///./src/items/Box.ts","webpack:///./src/items/Line.ts","webpack:///./src/items/Label.ts","webpack:///./src/items/SimpleValue.ts","webpack:///./node_modules/d3-path/src/path.js","webpack:///./node_modules/d3-shape/src/constant.js","webpack:///./node_modules/d3-shape/src/math.js","webpack:///./node_modules/d3-shape/src/arc.js","webpack:///./node_modules/d3-shape/src/curve/linear.js","webpack:///./node_modules/d3-shape/src/curve/radial.js","webpack:///./node_modules/d3-shape/src/array.js","webpack:///./node_modules/d3-shape/src/symbol/diamond.js","webpack:///./node_modules/d3-shape/src/symbol/circle.js","webpack:///./node_modules/d3-shape/src/symbol/star.js","webpack:///./node_modules/d3-shape/src/noop.js","webpack:///./node_modules/d3-shape/src/symbol/triangle.js","webpack:///./node_modules/d3-shape/src/symbol/wye.js","webpack:///./node_modules/d3-shape/src/curve/basis.js","webpack:///./node_modules/d3-shape/src/curve/basisClosed.js","webpack:///./node_modules/d3-shape/src/curve/basisOpen.js","webpack:///./node_modules/d3-shape/src/curve/bundle.js","webpack:///./node_modules/d3-shape/src/curve/cardinal.js","webpack:///./node_modules/d3-shape/src/curve/cardinalClosed.js","webpack:///./node_modules/d3-shape/src/curve/cardinalOpen.js","webpack:///./node_modules/d3-shape/src/curve/catmullRom.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomClosed.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomOpen.js","webpack:///./node_modules/d3-shape/src/curve/linearClosed.js","webpack:///./node_modules/d3-shape/src/curve/monotone.js","webpack:///./node_modules/d3-shape/src/curve/natural.js","webpack:///./node_modules/d3-shape/src/curve/step.js","webpack:///./node_modules/d3-shape/src/order/descending.js","webpack:///./src/items/Percentile.ts","webpack:///./src/items/Service.ts","webpack:///./src/VisualConsole.ts","webpack:///./src/lib/AsyncTaskManager.ts","webpack:///./src/index.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","parseIntOr","defaultValue","length","isNaN","parseInt","parseFloatOr","parseFloat","stringIsEmpty","notEmptyStringOr","parseBoolean","leftPad","pad","diffLength","substr","Math","abs","substring","repeatTimes","floor","restLength","newPad","positionPropsDecoder","data","x","y","sizePropsDecoder","width","height","TypeError","modulePropsDecoder","__assign","moduleName","moduleDescription","agentProps","agentId","agent","agentName","agentAlias","agentDescription","agentAddress","metaconsoleId","agentPropsDecoder","linkedVCPropsDecoder","id","linkedLayoutId","linkedLayoutAgentId","linkedLayoutStatusProps","linkedLayoutStatusType","weight","linkedLayoutStatusTypeWeight","warningThreshold","linkedLayoutStatusTypeWarningThreshold","criticalThreshold","linkedLayoutStatusTypeCriticalThreshold","linkedLayoutBaseProps","itemMetaDecoder","receivedAt","Date","Number","getTime","error","Error","editMode","isFromCache","isFetching","isUpdating","prefixedCssRules","ruleName","ruleValue","rule","decodeBase64","input","decodeURIComponent","escape","window","atob","humanDate","date","locale","Intl","DateTimeFormat","day","month","year","format","getDate","getMonth","getFullYear","humanTime","getHours","getMinutes","getSeconds","replaceMacros","macros","text","reduce","acc","_a","macro","replace","throttle","delay","fn","last","args","_i","arguments","now","apply","debounce","timerRef","clearTimeout","setTimeout","getOffset","el","offsetLeft","offsetTop","scrollLeft","scrollTop","offsetParent","top","left","addMovementListener","element","onMoved","container","parentElement","isDraggable","draggable","lastX","lastY","lastMouseX","lastMouseY","mouseElementOffsetX","mouseElementOffsetY","containerBounds","getBoundingClientRect","containerOffset","containerTop","containerBottom","containerLeft","containerRight","elementBounds","borderWidth","getComputedStyle","borderFix","debouncedMovement","throttledMovement","handleMove","e","mouseX","pageX","mouseY","pageY","mouseDeltaX","mouseDeltaY","maxX","maxY","outOfBoundsLeft","outOfBoundsRight","outOfBoundsTop","outOfBoundsBottom","handleEnd","document","removeEventListener","body","style","userSelect","handleStart","stopPropagation","offsetX","offsetY","addEventListener","addResizementListener","onResized","resizeDraggable","createElement","className","appendChild","lastWidth","lastHeight","elementOffset","elementTop","elementLeft","debouncedResizement","throttledResizement","handleResize","remove","parseLabelPosition","labelPosition","itemBasePropsDecoder","type","label","_lib__WEBPACK_IMPORTED_MODULE_0__","isLinkEnabled","link","isOnTop","parentId","aclGroupId","VisualConsoleItem","props","metadata","_this","this","clickEventManager","_lib_TypedEvent__WEBPACK_IMPORTED_MODULE_1__","movedEventManager","resizedEventManager","removeEventManager","disposables","debouncedMovementSave","prevPosition","newPosition","positionChanged","move","emit","item","removeMovement","debouncedResizementSave","prevSize","newSize","sizeChanged","resize","removeResizement","itemProps","_metadata","elementRef","createContainerDomElement","labelElementRef","createLabelDomElement","childElementRef","createDomElement","append","resizeElement","changeLabelPosition","initMovementListener","moveElement","stopMovementListener","initResizementListener","labelWidth","labelHeight","stopResizementListener","box","href","zIndex","meta","preventDefault","nativeEvent","classList","add","getLabelWithMacrosReplaced","table","row","emptyRow1","emptyRow2","cell","innerHTML","textAlign","updateDomElement","newProps","prevProps","shouldBeUpdated","render","newMetadata","setMeta","prevMetadata","prevMeta","oldLabelHtml","newLabelHtml","attrs","attributes","nodeName","setAttributeNode","parentNode","replaceChild","forEach","disposable","dispose","ignored","position","flexDirection","tables","getElementsByTagName","onClick","listener","on","push","onRemove","__webpack_exports__","TypedEvent","listeners","listenersOncer","off","once","callbackIndex","indexOf","splice","event","pipe","te","eventsHistoryPropsDecoder","html","encodedHtml","_Item__WEBPACK_IMPORTED_MODULE_1__","maxTime","EventsHistory","_super","__extends","scripts","src","eval","trim","aux","donutGraphPropsDecoder","DonutGraph","barsGraphPropsDecoder","BarsGraph","moduleGraphPropsDecoder","ModuleGraph","legendP","margin","overviewGraphs","getElementsByClassName","parseShowLastValueTooltip","showLastValueTooltip","staticGraphPropsDecoder","imageSrc","Item","statusImageSrc","lib","lastValue","StaticGraph","imgSrc","background","backgroundSize","backgroundPosition","setAttribute","iconPropsDecoder","Icon_assign","Icon","Icon_extends","colorCloudPropsDecoder","color","ColorCloud_assign","ColorCloud_svgNS","ColorCloud","ColorCloud_extends","createSvgElement","gradientId","svg","createElementNS","defs","radialGradient","stop0","stop100","circle","groupPropsDecoder","groupId","showStatistics","extractHtml","Group_assign","Group","Group_extends","parseClockType","clockType","parseClockFormat","clockFormat","clockPropsDecoder","clockTimezone","Clock_assign","clockTimezoneOffset","showClockTimezone","items_Clock","Clock","intervalRef","startTick","createClock","TICK_INTERVAL","Clock_extends","stopTick","clearInterval","handler","interval","setInterval","getElementSize","newWidth","newHeight","createAnalogicClock","createDigitalClock","svgNS","colors","dateFontSize","baseTimeFontSize","div","clockFace","clockFaceBackground","city","getHumanTimezone","timezoneComplication","textContent","marksGroup","mainMarkGroup","mark1a","mark1b","mark","hourHand","hourHandA","hourHandB","minuteHand","minuteHandA","minuteHandB","minuteHandPin","secondHand","secondHandBar","secondHandPin","pin","getOriginDate","seconds","minutes","secAngle","minuteAngle","hourAngle","join","dateElem","fontSize","tzFontSizeMultiplier","timeFontSize","tzFontSize","min","timeElem","tzElem","initialDate","targetTZOffset","localTZOffset","getTimezoneOffset","utimestamp","timezone","_b","split","diameter","boxPropsDecoder","Box_assign","borderColor","fillColor","Box","Box_extends","boxSizing","backgroundColor","borderStyle","maxBorderWidth","linePropsDecoder","Line_assign","startPosition","startX","startY","endPosition","endX","endY","lineWidth","Line","extractBoxSizeAndPosition","Line_extends","toString","line","labelPropsDecoder","Label_assign","Label","Label_extends","parseValueType","valueType","parseProcessValue","processValue","simpleValuePropsDecoder","SimpleValue_assign","period","SimpleValue","SimpleValue_extends","img","pi","PI","tau","tauEpsilon","Path","_x0","_y0","_x1","_y1","_","path","constructor","moveTo","closePath","lineTo","quadraticCurveTo","x1","y1","bezierCurveTo","x2","y2","arcTo","x0","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","sqrt","l01","tan","acos","t01","t21","arc","a0","a1","ccw","dx","cos","dy","sin","cw","da","rect","w","h","src_path","constant","atan2","max","math_epsilon","math_pi","halfPi","math_tau","asin","arcInnerRadius","innerRadius","arcOuterRadius","outerRadius","arcStartAngle","startAngle","arcEndAngle","endAngle","arcPadAngle","padAngle","cornerTangents","r1","rc","lo","ox","oy","x11","y11","x10","y10","x00","y00","d2","D","cx0","cy0","cx1","cy1","dx0","dy0","dx1","dy1","cx","cy","src_arc","cornerRadius","padRadius","context","buffer","r0","t0","t1","a01","a11","a00","a10","da0","da1","ap","rp","rc0","rc1","p0","p1","oc","x3","y3","x32","y32","intersect","ax","ay","bx","by","kc","lc","centroid","a","Linear","_context","areaStart","_line","areaEnd","NaN","lineStart","_point","lineEnd","point","linear","curveRadial","Radial","curve","_curve","radial","Array","slice","kr","noop","that","Basis","BasisClosed","_x2","_x3","_x4","_y2","_y3","_y4","BasisOpen","Bundle","beta","_basis","_beta","_x","_y","j","custom","bundle","cardinal_point","_k","Cardinal","tension","cardinal","CardinalClosed","_x5","_y5","CardinalOpen","catmullRom_point","_l01_a","_l01_2a","_l12_a","_l12_2a","_l23_a","b","_l23_2a","CatmullRom","alpha","_alpha","x23","y23","pow","catmullRom","CatmullRomClosed","CatmullRomOpen","LinearClosed","sign","slope3","h0","h1","s0","s1","slope2","monotone_point","MonotoneX","MonotoneY","ReflectContext","Natural","controlPoints","_t0","px","py","i0","i1","Step","_t","extractPercentileType","extractValueType","percentilePropsDecoder","Percentile_assign","percentileType","minValue","maxValue","labelColor","unit","Percentile_svgNS","Percentile","Percentile_extends","formatValue","progress","getProgress","NumberFormat","backgroundRect","progressRect","backgroundCircle","progressCircle","arcProps","trunc","servicePropsDecoder","encodedTitle","serviceId","Service_assign","Service","Service_extends","itemInstanceFrom","items_StaticGraph","items_SimpleValue","items_Percentile","items_Label","items_Icon","items_Service","items_Group","items_Box","items_Line","items_ColorCloud","VisualConsole","items","elementsById","elementIds","relations","handleElementClick","handleElementMovement","handleElementResizement","handleElementRemove","filter","clearRelations","containerRef","_props","backgroundURL","isFavorite","relationLineWidth","VisualConsole_assign","visualConsolePropsDecoder","sort","itemInstance","console","log","message","buildRelations","map","updateElements","itemIds","decodeProps","backgroundImage","elements","parent_1","child","addRelationLine","itemId","ids","childId","getRelationLine","identifier","parent","clientWidth","clientHeight","onItemClick","onItemMoved","onItemResized","enableEditMode","disableEditMode","AsyncTaskManager_AsyncTask","AsyncTask","taskInitiator","cancellable","cancel","_status","statusChangeEventManager","status","init","onStatusChange","AsyncTaskManager","tasks","asyncTask","task","ref","asyncPeriodic","src_VisualConsole","lib_AsyncTaskManager"],"mappings":"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","file":"vc.main.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 9);\n","import {\n AnyObject,\n Position,\n Size,\n WithAgentProps,\n WithModuleProps,\n LinkedVisualConsoleProps,\n LinkedVisualConsolePropsStatus,\n UnknownObject,\n ItemMeta\n} from \"./types\";\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\nexport function parseIntOr(value: unknown, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.length > 0 && !isNaN(parseInt(value)))\n return parseInt(value);\n else return defaultValue;\n}\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\nexport function parseFloatOr(value: unknown, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (\n typeof value === \"string\" &&\n value.length > 0 &&\n !isNaN(parseFloat(value))\n )\n return parseFloat(value);\n else return defaultValue;\n}\n\n/**\n * Check if a string exists and it's not empty.\n * @param value Value to check.\n * @return The check result.\n */\nexport function stringIsEmpty(value?: string | null): boolean {\n return value == null || value.length === 0;\n}\n\n/**\n * Return a not empty string or a default value from a raw value.\n * @param value Raw value from which we will try to extract a non empty string.\n * @param defaultValue Default value to use if we cannot extract a non empty string.\n * @return A non empty string or the default value.\n */\nexport function notEmptyStringOr(\n value: unknown,\n defaultValue: T\n): string | T {\n return typeof value === \"string\" && value.length > 0 ? value : defaultValue;\n}\n\n/**\n * Return a boolean from a raw value.\n * @param value Raw value from which we will try to extract the boolean.\n * @return A valid boolean value. false by default.\n */\nexport function parseBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n else if (typeof value === \"number\") return value > 0;\n else if (typeof value === \"string\") return value === \"1\" || value === \"true\";\n else return false;\n}\n\n/**\n * Return a valid date or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid date.\n * @param defaultValue Default value to use if we cannot extract a valid date.\n * @return A valid date or the default value.\n */\nexport function parseDateOr(value: unknown, defaultValue: T): Date | T {\n if (value instanceof Date) return value;\n else if (typeof value === \"number\") return new Date(value * 1000);\n else if (\n typeof value === \"string\" &&\n !Number.isNaN(new Date(value).getTime())\n )\n return new Date(value);\n else return defaultValue;\n}\n\n/**\n * Pad the current string with another string (multiple times, if needed)\n * until the resulting string reaches the given length.\n * The padding is applied from the start (left) of the current string.\n * @param value Text that needs to be padded.\n * @param length Length of the returned text.\n * @param pad Text to add.\n * @return Padded text.\n */\nexport function leftPad(\n value: string | number,\n length: number,\n pad: string | number = \" \"\n): string {\n if (typeof value === \"number\") value = `${value}`;\n if (typeof pad === \"number\") pad = `${pad}`;\n\n const diffLength = length - value.length;\n if (diffLength === 0) return value;\n if (diffLength < 0) return value.substr(Math.abs(diffLength));\n\n if (diffLength === pad.length) return `${pad}${value}`;\n if (diffLength < pad.length) return `${pad.substring(0, diffLength)}${value}`;\n\n const repeatTimes = Math.floor(diffLength / pad.length);\n const restLength = diffLength - pad.length * repeatTimes;\n\n let newPad = \"\";\n for (let i = 0; i < repeatTimes; i++) newPad += pad;\n\n if (restLength === 0) return `${newPad}${value}`;\n return `${newPad}${pad.substring(0, restLength)}${value}`;\n}\n\n/* Decoders */\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the position.\n */\nexport function positionPropsDecoder(data: AnyObject): Position {\n return {\n x: parseIntOr(data.x, 0),\n y: parseIntOr(data.y, 0)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the size.\n * @throws Will throw a TypeError if the width and height are not valid numbers.\n */\nexport function sizePropsDecoder(data: AnyObject): Size | never {\n if (\n data.width == null ||\n isNaN(parseInt(data.width)) ||\n data.height == null ||\n isNaN(parseInt(data.height))\n ) {\n throw new TypeError(\"invalid size.\");\n }\n\n return {\n width: parseInt(data.width),\n height: parseInt(data.height)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the agent properties.\n */\nexport function agentPropsDecoder(data: AnyObject): WithAgentProps {\n const agentProps: WithAgentProps = {\n agentId: parseIntOr(data.agent, null),\n agentName: notEmptyStringOr(data.agentName, null),\n agentAlias: notEmptyStringOr(data.agentAlias, null),\n agentDescription: notEmptyStringOr(data.agentDescription, null),\n agentAddress: notEmptyStringOr(data.agentAddress, null)\n };\n\n return data.metaconsoleId != null\n ? {\n metaconsoleId: data.metaconsoleId,\n ...agentProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : agentProps;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the module and agent properties.\n */\nexport function modulePropsDecoder(data: AnyObject): WithModuleProps {\n return {\n moduleId: parseIntOr(data.moduleId, null),\n moduleName: notEmptyStringOr(data.moduleName, null),\n moduleDescription: notEmptyStringOr(data.moduleDescription, null),\n ...agentPropsDecoder(data) // Object spread: http://es6-features.org/#SpreadOperator\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the linked visual console properties.\n * @throws Will throw a TypeError if the status calculation properties are invalid.\n */\nexport function linkedVCPropsDecoder(\n data: AnyObject\n): LinkedVisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n metaconsoleId,\n linkedLayoutId: id,\n linkedLayoutAgentId: agentId\n } = data;\n\n let linkedLayoutStatusProps: LinkedVisualConsolePropsStatus = {\n linkedLayoutStatusType: \"default\"\n };\n switch (data.linkedLayoutStatusType) {\n case \"weight\": {\n const weight = parseIntOr(data.linkedLayoutStatusTypeWeight, null);\n if (weight == null)\n throw new TypeError(\"invalid status calculation properties.\");\n\n if (data.linkedLayoutStatusTypeWeight)\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"weight\",\n linkedLayoutStatusTypeWeight: weight\n };\n break;\n }\n case \"service\": {\n const warningThreshold = parseIntOr(\n data.linkedLayoutStatusTypeWarningThreshold,\n null\n );\n const criticalThreshold = parseIntOr(\n data.linkedLayoutStatusTypeCriticalThreshold,\n null\n );\n if (warningThreshold == null || criticalThreshold == null) {\n throw new TypeError(\"invalid status calculation properties.\");\n }\n\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"service\",\n linkedLayoutStatusTypeWarningThreshold: warningThreshold,\n linkedLayoutStatusTypeCriticalThreshold: criticalThreshold\n };\n break;\n }\n }\n\n const linkedLayoutBaseProps = {\n linkedLayoutId: parseIntOr(id, null),\n linkedLayoutAgentId: parseIntOr(agentId, null),\n ...linkedLayoutStatusProps // Object spread: http://es6-features.org/#SpreadOperator\n };\n\n return metaconsoleId != null\n ? {\n metaconsoleId,\n ...linkedLayoutBaseProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : linkedLayoutBaseProps;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the item's meta properties.\n */\nexport function itemMetaDecoder(data: UnknownObject): ItemMeta | never {\n const receivedAt = parseDateOr(data.receivedAt, null);\n if (receivedAt === null) throw new TypeError(\"invalid meta structure\");\n\n let error = null;\n if (data.error instanceof Error) error = data.error;\n else if (typeof data.error === \"string\") error = new Error(data.error);\n\n return {\n receivedAt,\n error,\n editMode: parseBoolean(data.editMode),\n isFromCache: parseBoolean(data.isFromCache),\n isFetching: false,\n isUpdating: false\n };\n}\n\n/**\n * To get a CSS rule with the most used prefixes.\n * @param ruleName Name of the CSS rule.\n * @param ruleValue Value of the CSS rule.\n * @return An array of rules with the prefixes applied.\n */\nexport function prefixedCssRules(\n ruleName: string,\n ruleValue: string\n): string[] {\n const rule = `${ruleName}: ${ruleValue};`;\n return [\n `-webkit-${rule}`,\n `-moz-${rule}`,\n `-ms-${rule}`,\n `-o-${rule}`,\n `${rule}`\n ];\n}\n\n/**\n * Decode a base64 string.\n * @param input Data encoded using base64.\n * @return Decoded data.\n */\nexport function decodeBase64(input: string): string {\n return decodeURIComponent(escape(window.atob(input)));\n}\n\n/**\n * Generate a date representation with the format 'd/m/Y'.\n * @param initialDate Date to be used instead of a generated one.\n * @param locale Locale to use if localization is required and available.\n * @example 24/02/2020.\n * @return Date representation.\n */\nexport function humanDate(date: Date, locale: string | null = null): string {\n if (locale && Intl && Intl.DateTimeFormat) {\n // Format using the user locale.\n const options: Intl.DateTimeFormatOptions = {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\"\n };\n return Intl.DateTimeFormat(locale, options).format(date);\n } else {\n // Use getDate, getDay returns the week day.\n const day = leftPad(date.getDate(), 2, 0);\n // The getMonth function returns the month starting by 0.\n const month = leftPad(date.getMonth() + 1, 2, 0);\n const year = leftPad(date.getFullYear(), 4, 0);\n\n // Format: 'd/m/Y'.\n return `${day}/${month}/${year}`;\n }\n}\n\n/**\n * Generate a time representation with the format 'hh:mm:ss'.\n * @param initialDate Date to be used instead of a generated one.\n * @example 01:34:09.\n * @return Time representation.\n */\nexport function humanTime(date: Date): string {\n const hours = leftPad(date.getHours(), 2, 0);\n const minutes = leftPad(date.getMinutes(), 2, 0);\n const seconds = leftPad(date.getSeconds(), 2, 0);\n\n return `${hours}:${minutes}:${seconds}`;\n}\n\ninterface Macro {\n macro: string | RegExp;\n value: string;\n}\n/**\n * Replace the macros of a text.\n * @param macros List of macros and their replacements.\n * @param text Text in which we need to replace the macros.\n */\nexport function replaceMacros(macros: Macro[], text: string): string {\n return macros.reduce(\n (acc, { macro, value }) => acc.replace(macro, value),\n text\n );\n}\n\n/**\n * Create a function which will limit the rate of execution of\n * the selected function to one time for the selected interval.\n * @param delay Interval.\n * @param fn Function to be executed at a limited rate.\n */\nexport function throttle(delay: number, fn: (...args: T[]) => R) {\n let last = 0;\n return (...args: T[]) => {\n const now = Date.now();\n if (now - last < delay) return;\n last = now;\n return fn(...args);\n };\n}\n\n/**\n * Create a function which will call the selected function only\n * after the interval time has passed after its last execution.\n * @param delay Interval.\n * @param fn Function to be executed after the last call.\n */\nexport function debounce(delay: number, fn: (...args: T[]) => void) {\n let timerRef: number | null = null;\n return (...args: T[]) => {\n if (timerRef !== null) window.clearTimeout(timerRef);\n timerRef = window.setTimeout(() => {\n fn(...args);\n timerRef = null;\n }, delay);\n };\n}\n\n/**\n * Retrieve the offset of an element relative to the page.\n * @param el Node used to calculate the offset.\n */\nfunction getOffset(el: HTMLElement | null) {\n let x = 0;\n let y = 0;\n while (el && !Number.isNaN(el.offsetLeft) && !Number.isNaN(el.offsetTop)) {\n x += el.offsetLeft - el.scrollLeft;\n y += el.offsetTop - el.scrollTop;\n el = el.offsetParent as HTMLElement | null;\n }\n return { top: y, left: x };\n}\n\n/**\n * Add the grab & move functionality to a certain element inside it's container.\n *\n * @param element Element to move.\n * @param onMoved Function to execute when the element moves.\n *\n * @return A function which will clean the event handlers when executed.\n */\nexport function addMovementListener(\n element: HTMLElement,\n onMoved: (x: Position[\"x\"], y: Position[\"y\"]) => void\n): Function {\n const container = element.parentElement as HTMLElement;\n // Store the initial draggable state.\n const isDraggable = element.draggable;\n // Init the coordinates.\n let lastX: Position[\"x\"] = 0;\n let lastY: Position[\"y\"] = 0;\n let lastMouseX: Position[\"x\"] = 0;\n let lastMouseY: Position[\"y\"] = 0;\n let mouseElementOffsetX: Position[\"x\"] = 0;\n let mouseElementOffsetY: Position[\"y\"] = 0;\n // Bounds.\n let containerBounds = container.getBoundingClientRect();\n let containerOffset = getOffset(container);\n let containerTop = containerOffset.top;\n let containerBottom = containerTop + containerBounds.height;\n let containerLeft = containerOffset.left;\n let containerRight = containerLeft + containerBounds.width;\n let elementBounds = element.getBoundingClientRect();\n let borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n let borderFix = Number.parseInt(borderWidth) * 2;\n\n // Will run onMoved 32ms after its last execution.\n const debouncedMovement = debounce(32, (x: Position[\"x\"], y: Position[\"y\"]) =>\n onMoved(x, y)\n );\n // Will run onMoved one time max every 16ms.\n const throttledMovement = throttle(16, (x: Position[\"x\"], y: Position[\"y\"]) =>\n onMoved(x, y)\n );\n\n const handleMove = (e: MouseEvent) => {\n // Calculate the new element coordinates.\n let x = 0;\n let y = 0;\n\n const mouseX = e.pageX;\n const mouseY = e.pageY;\n const mouseDeltaX = mouseX - lastMouseX;\n const mouseDeltaY = mouseY - lastMouseY;\n\n const minX = 0;\n const maxX = containerBounds.width - elementBounds.width + borderFix;\n const minY = 0;\n const maxY = containerBounds.height - elementBounds.height + borderFix;\n\n const outOfBoundsLeft =\n mouseX < containerLeft ||\n (lastX === 0 &&\n mouseDeltaX > 0 &&\n mouseX < containerLeft + mouseElementOffsetX);\n const outOfBoundsRight =\n mouseX > containerRight ||\n mouseDeltaX + lastX + elementBounds.width - borderFix >\n containerBounds.width ||\n (lastX === maxX &&\n mouseDeltaX < 0 &&\n mouseX > containerLeft + maxX + mouseElementOffsetX);\n const outOfBoundsTop =\n mouseY < containerTop ||\n (lastY === 0 &&\n mouseDeltaY > 0 &&\n mouseY < containerTop + mouseElementOffsetY);\n const outOfBoundsBottom =\n mouseY > containerBottom ||\n mouseDeltaY + lastY + elementBounds.height - borderFix >\n containerBounds.height ||\n (lastY === maxY &&\n mouseDeltaY < 0 &&\n mouseY > containerTop + maxY + mouseElementOffsetY);\n\n if (outOfBoundsLeft) x = minX;\n else if (outOfBoundsRight) x = maxX;\n else x = mouseDeltaX + lastX;\n\n if (outOfBoundsTop) y = minY;\n else if (outOfBoundsBottom) y = maxY;\n else y = mouseDeltaY + lastY;\n\n if (x < 0) x = minX;\n if (y < 0) y = minY;\n\n // Store the last mouse coordinates.\n lastMouseX = mouseX;\n lastMouseY = mouseY;\n\n if (x === lastX && y === lastY) return;\n\n // Run the movement events.\n throttledMovement(x, y);\n debouncedMovement(x, y);\n\n // Store the coordinates of the element.\n lastX = x;\n lastY = y;\n };\n const handleEnd = () => {\n // Reset the positions.\n lastX = 0;\n lastY = 0;\n lastMouseX = 0;\n lastMouseY = 0;\n // Remove the move event.\n document.removeEventListener(\"mousemove\", handleMove);\n // Clean itself.\n document.removeEventListener(\"mouseup\", handleEnd);\n // Reset the draggable property to its initial state.\n element.draggable = isDraggable;\n // Reset the body selection property to a default state.\n document.body.style.userSelect = \"auto\";\n };\n const handleStart = (e: MouseEvent) => {\n e.stopPropagation();\n\n // Disable the drag temporarily.\n element.draggable = false;\n\n // Store the difference between the cursor and\n // the initial coordinates of the element.\n lastX = element.offsetLeft;\n lastY = element.offsetTop;\n // Store the mouse position.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n // Store the relative position between the mouse and the element.\n mouseElementOffsetX = e.offsetX;\n mouseElementOffsetY = e.offsetY;\n\n // Initialize the bounds.\n containerBounds = container.getBoundingClientRect();\n containerOffset = getOffset(container);\n containerTop = containerOffset.top;\n containerBottom = containerTop + containerBounds.height;\n containerLeft = containerOffset.left;\n containerRight = containerLeft + containerBounds.width;\n elementBounds = element.getBoundingClientRect();\n borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n borderFix = Number.parseInt(borderWidth) * 2;\n\n // Listen to the mouse movement.\n document.addEventListener(\"mousemove\", handleMove);\n // Listen to the moment when the mouse click is not pressed anymore.\n document.addEventListener(\"mouseup\", handleEnd);\n // Limit the mouse selection of the body.\n document.body.style.userSelect = \"none\";\n };\n\n // Event to listen the init of the movement.\n element.addEventListener(\"mousedown\", handleStart);\n\n // Returns a function to clean the event listeners.\n return () => {\n element.removeEventListener(\"mousedown\", handleStart);\n handleEnd();\n };\n}\n\n/**\n * Add the grab & resize functionality to a certain element.\n *\n * @param element Element to move.\n * @param onResized Function to execute when the element is resized.\n *\n * @return A function which will clean the event handlers when executed.\n */\nexport function addResizementListener(\n element: HTMLElement,\n onResized: (x: Position[\"x\"], y: Position[\"y\"]) => void\n): Function {\n const minWidth = 15;\n const minHeight = 15;\n\n const resizeDraggable = document.createElement(\"div\");\n resizeDraggable.className = \"resize-draggable\";\n element.appendChild(resizeDraggable);\n\n // Container of the resizable element.\n const container = element.parentElement as HTMLElement;\n // Store the initial draggable state.\n const isDraggable = element.draggable;\n // Init the coordinates.\n let lastWidth: Size[\"width\"] = 0;\n let lastHeight: Size[\"height\"] = 0;\n let lastMouseX: Position[\"x\"] = 0;\n let lastMouseY: Position[\"y\"] = 0;\n let mouseElementOffsetX: Position[\"x\"] = 0;\n let mouseElementOffsetY: Position[\"y\"] = 0;\n // Init the bounds.\n let containerBounds = container.getBoundingClientRect();\n let containerOffset = getOffset(container);\n let containerTop = containerOffset.top;\n let containerBottom = containerTop + containerBounds.height;\n let containerLeft = containerOffset.left;\n let containerRight = containerLeft + containerBounds.width;\n let elementOffset = getOffset(element);\n let elementTop = elementOffset.top;\n let elementLeft = elementOffset.left;\n let borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n let borderFix = Number.parseInt(borderWidth);\n\n // Will run onResized 32ms after its last execution.\n const debouncedResizement = debounce(\n 32,\n (width: Size[\"width\"], height: Size[\"height\"]) => onResized(width, height)\n );\n // Will run onResized one time max every 16ms.\n const throttledResizement = throttle(\n 16,\n (width: Size[\"width\"], height: Size[\"height\"]) => onResized(width, height)\n );\n\n const handleResize = (e: MouseEvent) => {\n // Calculate the new element coordinates.\n let width = lastWidth + (e.pageX - lastMouseX);\n let height = lastHeight + (e.pageY - lastMouseY);\n\n if (width === lastWidth && height === lastHeight) return;\n\n if (\n width < lastWidth &&\n e.pageX > elementLeft + (lastWidth - mouseElementOffsetX)\n )\n return;\n\n if (width < minWidth) {\n // Minimum value.\n width = minWidth;\n } else if (width + elementLeft - borderFix / 2 >= containerRight) {\n // Limit the size to the container.\n width = containerRight - elementLeft;\n }\n if (height < minHeight) {\n // Minimum value.\n height = minHeight;\n } else if (height + elementTop - borderFix / 2 >= containerBottom) {\n // Limit the size to the container.\n height = containerBottom - elementTop;\n }\n\n // Run the movement events.\n throttledResizement(width, height);\n debouncedResizement(width, height);\n\n // Store the coordinates of the element.\n lastWidth = width;\n lastHeight = height;\n // Store the last mouse coordinates.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n };\n const handleEnd = () => {\n // Reset the positions.\n lastWidth = 0;\n lastHeight = 0;\n lastMouseX = 0;\n lastMouseY = 0;\n mouseElementOffsetX = 0;\n mouseElementOffsetY = 0;\n // Remove the move event.\n document.removeEventListener(\"mousemove\", handleResize);\n // Clean itself.\n document.removeEventListener(\"mouseup\", handleEnd);\n // Reset the draggable property to its initial state.\n element.draggable = isDraggable;\n // Reset the body selection property to a default state.\n document.body.style.userSelect = \"auto\";\n };\n const handleStart = (e: MouseEvent) => {\n e.stopPropagation();\n\n // Disable the drag temporarily.\n element.draggable = false;\n\n // Store the difference between the cursor and\n // the initial coordinates of the element.\n const { width, height } = element.getBoundingClientRect();\n lastWidth = width;\n lastHeight = height;\n // Store the mouse position.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n // Store the relative position between the mouse and the element.\n mouseElementOffsetX = e.offsetX;\n mouseElementOffsetY = e.offsetY;\n\n // Initialize the bounds.\n containerBounds = container.getBoundingClientRect();\n containerOffset = getOffset(container);\n containerTop = containerOffset.top;\n containerBottom = containerTop + containerBounds.height;\n containerLeft = containerOffset.left;\n containerRight = containerLeft + containerBounds.width;\n elementOffset = getOffset(element);\n elementTop = elementOffset.top;\n elementLeft = elementOffset.left;\n\n // Listen to the mouse movement.\n document.addEventListener(\"mousemove\", handleResize);\n // Listen to the moment when the mouse click is not pressed anymore.\n document.addEventListener(\"mouseup\", handleEnd);\n // Limit the mouse selection of the body.\n document.body.style.userSelect = \"none\";\n };\n\n // Event to listen the init of the movement.\n resizeDraggable.addEventListener(\"mousedown\", handleStart);\n\n // Returns a function to clean the event listeners.\n return () => {\n resizeDraggable.remove();\n handleEnd();\n };\n}\n","import {\n Position,\n Size,\n AnyObject,\n WithModuleProps,\n ItemMeta\n} from \"./lib/types\";\nimport {\n sizePropsDecoder,\n positionPropsDecoder,\n parseIntOr,\n parseBoolean,\n notEmptyStringOr,\n replaceMacros,\n humanDate,\n humanTime,\n addMovementListener,\n debounce,\n addResizementListener\n} from \"./lib\";\nimport TypedEvent, { Listener, Disposable } from \"./lib/TypedEvent\";\n\n// Enum: https://www.typescriptlang.org/docs/handbook/enums.html.\nexport const enum ItemType {\n STATIC_GRAPH = 0,\n MODULE_GRAPH = 1,\n SIMPLE_VALUE = 2,\n PERCENTILE_BAR = 3,\n LABEL = 4,\n ICON = 5,\n SIMPLE_VALUE_MAX = 6,\n SIMPLE_VALUE_MIN = 7,\n SIMPLE_VALUE_AVG = 8,\n PERCENTILE_BUBBLE = 9,\n SERVICE = 10,\n GROUP_ITEM = 11,\n BOX_ITEM = 12,\n LINE_ITEM = 13,\n AUTO_SLA_GRAPH = 14,\n CIRCULAR_PROGRESS_BAR = 15,\n CIRCULAR_INTERIOR_PROGRESS_BAR = 16,\n DONUT_GRAPH = 17,\n BARS_GRAPH = 18,\n CLOCK = 19,\n COLOR_CLOUD = 20\n}\n\n// Base item properties. This interface should be extended by the item implementations.\nexport interface ItemProps extends Position, Size {\n readonly id: number;\n readonly type: ItemType;\n label: string | null;\n labelPosition: \"up\" | \"right\" | \"down\" | \"left\";\n isLinkEnabled: boolean;\n link: string | null;\n isOnTop: boolean;\n parentId: number | null;\n aclGroupId: number | null;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemClickEvent {\n // data: Props;\n data: AnyObject;\n nativeEvent: Event;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemRemoveEvent {\n // data: Props;\n data: AnyObject;\n}\n\nexport interface ItemMovedEvent {\n item: VisualConsoleItem;\n prevPosition: Position;\n newPosition: Position;\n}\n\nexport interface ItemResizedEvent {\n item: VisualConsoleItem;\n prevSize: Size;\n newSize: Size;\n}\n\n/**\n * Extract a valid enum value from a raw label positi9on value.\n * @param labelPosition Raw value.\n */\nconst parseLabelPosition = (\n labelPosition: unknown\n): ItemProps[\"labelPosition\"] => {\n switch (labelPosition) {\n case \"up\":\n case \"right\":\n case \"down\":\n case \"left\":\n return labelPosition;\n default:\n return \"down\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function itemBasePropsDecoder(data: AnyObject): ItemProps | never {\n if (data.id == null || isNaN(parseInt(data.id))) {\n throw new TypeError(\"invalid id.\");\n }\n if (data.type == null || isNaN(parseInt(data.type))) {\n throw new TypeError(\"invalid type.\");\n }\n\n return {\n id: parseInt(data.id),\n type: parseInt(data.type),\n label: notEmptyStringOr(data.label, null),\n labelPosition: parseLabelPosition(data.labelPosition),\n isLinkEnabled: parseBoolean(data.isLinkEnabled),\n link: notEmptyStringOr(data.link, null),\n isOnTop: parseBoolean(data.isOnTop),\n parentId: parseIntOr(data.parentId, null),\n aclGroupId: parseIntOr(data.aclGroupId, null),\n ...sizePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...positionPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\n/**\n * Base class of the visual console items. Should be extended to use its capabilities.\n */\nabstract class VisualConsoleItem {\n // Properties of the item.\n private itemProps: Props;\n // Metadata of the item.\n private _metadata: ItemMeta;\n // Reference to the DOM element which will contain the item.\n public elementRef: HTMLElement;\n public readonly labelElementRef: HTMLElement;\n // Reference to the DOM element which will contain the view of the item which extends this class.\n protected readonly childElementRef: HTMLElement;\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent>();\n // Event manager for moved events.\n private readonly movedEventManager = new TypedEvent();\n // Event manager for resized events.\n private readonly resizedEventManager = new TypedEvent();\n // Event manager for remove events.\n private readonly removeEventManager = new TypedEvent<\n ItemRemoveEvent\n >();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n // This function will only run the 2nd arg function after the time\n // of the first arg have passed after its last execution.\n private debouncedMovementSave = debounce(\n 500, // ms.\n (x: Position[\"x\"], y: Position[\"y\"]) => {\n const prevPosition = {\n x: this.props.x,\n y: this.props.y\n };\n const newPosition = {\n x: x,\n y: y\n };\n\n if (!this.positionChanged(prevPosition, newPosition)) return;\n\n // Save the new position to the props.\n this.move(x, y);\n // Emit the movement event.\n this.movedEventManager.emit({\n item: this,\n prevPosition: prevPosition,\n newPosition: newPosition\n });\n }\n );\n // This property will store the function\n // to clean the movement listener.\n private removeMovement: Function | null = null;\n\n /**\n * Start the movement funtionality.\n * @param element Element to move inside its container.\n */\n private initMovementListener(element: HTMLElement): void {\n this.removeMovement = addMovementListener(\n element,\n (x: Position[\"x\"], y: Position[\"y\"]) => {\n // Move the DOM element.\n this.moveElement(x, y);\n // Run the save function.\n this.debouncedMovementSave(x, y);\n }\n );\n }\n /**\n * Stop the movement fun\n */\n private stopMovementListener(): void {\n if (this.removeMovement) {\n this.removeMovement();\n this.removeMovement = null;\n }\n }\n\n // This function will only run the 2nd arg function after the time\n // of the first arg have passed after its last execution.\n private debouncedResizementSave = debounce(\n 500, // ms.\n (width: Size[\"width\"], height: Size[\"height\"]) => {\n const prevSize = {\n width: this.props.width,\n height: this.props.height\n };\n const newSize = {\n width: width,\n height: height\n };\n\n if (!this.sizeChanged(prevSize, newSize)) return;\n\n // Save the new position to the props.\n this.resize(width, height);\n // Emit the resizement event.\n this.resizedEventManager.emit({\n item: this,\n prevSize: prevSize,\n newSize: newSize\n });\n }\n );\n // This property will store the function\n // to clean the resizement listener.\n private removeResizement: Function | null = null;\n\n /**\n * Start the resizement funtionality.\n * @param element Element to move inside its container.\n */\n private initResizementListener(element: HTMLElement): void {\n this.removeResizement = addResizementListener(\n element,\n (width: Size[\"width\"], height: Size[\"height\"]) => {\n // The label it's outside the item's size, so we need\n // to get rid of its size to get the real size of the\n // item's content.\n if (this.props.label && this.props.label.length > 0) {\n const {\n width: labelWidth,\n height: labelHeight\n } = this.labelElementRef.getBoundingClientRect();\n\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n height -= labelHeight;\n break;\n case \"left\":\n case \"right\":\n width -= labelWidth;\n break;\n }\n }\n\n // Move the DOM element.\n this.resizeElement(width, height);\n // Run the save function.\n this.debouncedResizementSave(width, height);\n }\n );\n }\n /**\n * Stop the resizement functionality.\n */\n private stopResizementListener(): void {\n if (this.removeResizement) {\n this.removeResizement();\n this.removeResizement = null;\n }\n }\n\n /**\n * To create a new element which will be inside the item box.\n * @return Item.\n */\n protected abstract createDomElement(): HTMLElement;\n\n public constructor(props: Props, metadata: ItemMeta) {\n this.itemProps = props;\n this._metadata = metadata;\n\n /*\n * Get a HTMLElement which represents the container box\n * of the Visual Console item. This element will manage\n * all the common things like click events, show a border\n * when hovered, etc.\n */\n this.elementRef = this.createContainerDomElement();\n this.labelElementRef = this.createLabelDomElement();\n\n /*\n * Get a HTMLElement which represents the custom view\n * of the Visual Console item. This element will be\n * different depending on the item implementation.\n */\n this.childElementRef = this.createDomElement();\n\n // Insert the elements into the container.\n this.elementRef.append(this.childElementRef, this.labelElementRef);\n\n // Resize element.\n this.resizeElement(props.width, props.height);\n // Set label position.\n this.changeLabelPosition(props.labelPosition);\n }\n\n /**\n * To create a new box for the visual console item.\n * @return Item box.\n */\n private createContainerDomElement(): HTMLElement {\n let box;\n if (this.props.isLinkEnabled) {\n box = document.createElement(\"a\") as HTMLAnchorElement;\n if (this.props.link) box.href = this.props.link;\n } else {\n box = document.createElement(\"div\") as HTMLDivElement;\n }\n\n box.className = \"visual-console-item\";\n box.style.zIndex = this.props.isOnTop ? \"2\" : \"1\";\n box.style.left = `${this.props.x}px`;\n box.style.top = `${this.props.y}px`;\n // Init the click listener.\n box.addEventListener(\"click\", e => {\n if (this.meta.editMode) {\n e.preventDefault();\n e.stopPropagation();\n } else {\n this.clickEventManager.emit({ data: this.props, nativeEvent: e });\n }\n });\n\n // Metadata state.\n if (this.meta.editMode) {\n box.classList.add(\"is-editing\");\n // Init the movement listener.\n this.initMovementListener(box);\n // Init the resizement listener.\n this.initResizementListener(box);\n }\n if (this.meta.isFetching) {\n box.classList.add(\"is-fetching\");\n }\n if (this.meta.isUpdating) {\n box.classList.add(\"is-updating\");\n }\n\n return box;\n }\n\n /**\n * To create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Add the label if it exists.\n const label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n // Ugly table we need to use to replicate the legacy style.\n const table = document.createElement(\"table\");\n const row = document.createElement(\"tr\");\n const emptyRow1 = document.createElement(\"tr\");\n const emptyRow2 = document.createElement(\"tr\");\n const cell = document.createElement(\"td\");\n\n cell.innerHTML = label;\n row.append(cell);\n table.append(emptyRow1, row, emptyRow2);\n table.style.textAlign = \"center\";\n\n // Change the table size depending on its position.\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n\n // element.innerHTML = this.props.label;\n element.append(table);\n }\n\n return element;\n }\n\n /**\n * Return the label stored into the props with some macros replaced.\n */\n protected getLabelWithMacrosReplaced(): string {\n // We assert that the props may have some needed properties.\n const props = this.props as Partial;\n\n return replaceMacros(\n [\n {\n macro: \"_date_\",\n value: humanDate(new Date())\n },\n {\n macro: \"_time_\",\n value: humanTime(new Date())\n },\n {\n macro: \"_agent_\",\n value: props.agentAlias != null ? props.agentAlias : \"\"\n },\n {\n macro: \"_agentdescription_\",\n value: props.agentDescription != null ? props.agentDescription : \"\"\n },\n {\n macro: \"_address_\",\n value: props.agentAddress != null ? props.agentAddress : \"\"\n },\n {\n macro: \"_module_\",\n value: props.moduleName != null ? props.moduleName : \"\"\n },\n {\n macro: \"_moduledescription_\",\n value: props.moduleDescription != null ? props.moduleDescription : \"\"\n }\n ],\n this.props.label || \"\"\n );\n }\n\n /**\n * To update the content element.\n * @return Item.\n */\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.createDomElement().innerHTML;\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): Props {\n return { ...this.itemProps }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: Props) {\n const prevProps = this.props;\n // Update the internal props.\n this.itemProps = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Check if we should re-render.\n if (this.shouldBeUpdated(prevProps, newProps))\n this.render(prevProps, this._metadata);\n }\n\n /**\n * Public accessor of the `meta` property.\n * @return Properties.\n */\n public get meta(): ItemMeta {\n return { ...this._metadata }; // Return a copy.\n }\n\n /**\n * Public setter of the `meta` property.\n * If the new meta are different enough than the\n * stored meta, a render would be fired.\n * @param newProps\n */\n public set meta(newMetadata: ItemMeta) {\n this.setMeta(newMetadata);\n }\n\n /**\n * Clasic and protected version of the setter of the `meta` property.\n * Useful to override it from children classes.\n * @param newProps\n */\n protected setMeta(newMetadata: ItemMeta) {\n const prevMetadata = this._metadata;\n // Update the internal meta.\n this._metadata = newMetadata;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Check if we should re-render.\n // if (this.shouldBeUpdated(prevMetadata, newMetadata))\n this.render(this.itemProps, prevMetadata);\n }\n\n /**\n * To compare the previous and the new props and returns a boolean value\n * in case the difference is meaningfull enough to perform DOM changes.\n *\n * Here, the only comparision is done by reference.\n *\n * Override this function to perform a different comparision depending on the item needs.\n *\n * @param prevProps\n * @param newProps\n * @return Whether the difference is meaningful enough to perform DOM changes or not.\n */\n protected shouldBeUpdated(prevProps: Props, newProps: Props): boolean {\n return prevProps !== newProps;\n }\n\n /**\n * To recreate or update the HTMLElement which represents the item into the DOM.\n * @param prevProps If exists it will be used to only perform DOM updates instead of a full replace.\n */\n public render(\n prevProps: Props | null = null,\n prevMeta: ItemMeta | null = null\n ): void {\n this.updateDomElement(this.childElementRef);\n\n // Move box.\n if (!prevProps || this.positionChanged(prevProps, this.props)) {\n this.moveElement(this.props.x, this.props.y);\n }\n // Resize box.\n if (!prevProps || this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n // Change label.\n const oldLabelHtml = this.labelElementRef.innerHTML;\n const newLabelHtml = this.createLabelDomElement().innerHTML;\n if (oldLabelHtml !== newLabelHtml) {\n this.labelElementRef.innerHTML = newLabelHtml;\n }\n // Change label position.\n if (!prevProps || prevProps.labelPosition !== this.props.labelPosition) {\n this.changeLabelPosition(this.props.labelPosition);\n }\n // Change link.\n if (\n prevProps &&\n (prevProps.isLinkEnabled !== this.props.isLinkEnabled ||\n (this.props.isLinkEnabled && prevProps.link !== this.props.link))\n ) {\n const container = this.createContainerDomElement();\n // Add the children of the old element.\n container.innerHTML = this.elementRef.innerHTML;\n // Copy the attributes.\n const attrs = this.elementRef.attributes;\n for (let i = 0; i < attrs.length; i++) {\n if (attrs[i].nodeName !== \"id\") {\n container.setAttributeNode(attrs[i]);\n }\n }\n // Replace the reference.\n if (this.elementRef.parentNode !== null) {\n this.elementRef.parentNode.replaceChild(container, this.elementRef);\n }\n\n // Changed the reference to the main element. It's ugly, but needed.\n this.elementRef = container;\n }\n\n // Change metadata related things.\n if (!prevMeta || prevMeta.editMode !== this.meta.editMode) {\n if (this.meta.editMode) {\n this.elementRef.classList.add(\"is-editing\");\n this.initMovementListener(this.elementRef);\n this.initResizementListener(this.elementRef);\n } else {\n this.elementRef.classList.remove(\"is-editing\");\n this.stopMovementListener();\n this.stopResizementListener();\n }\n }\n if (!prevMeta || prevMeta.isFetching !== this.meta.isFetching) {\n if (this.meta.isFetching) {\n this.elementRef.classList.add(\"is-fetching\");\n } else {\n this.elementRef.classList.remove(\"is-fetching\");\n }\n }\n if (!prevMeta || prevMeta.isUpdating !== this.meta.isUpdating) {\n if (this.meta.isUpdating) {\n this.elementRef.classList.add(\"is-updating\");\n } else {\n this.elementRef.classList.remove(\"is-updating\");\n }\n }\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n // Call the remove event.\n this.removeEventManager.emit({ data: this.props });\n // Event listeners.\n this.disposables.forEach(disposable => {\n try {\n disposable.dispose();\n } catch (ignored) {} // eslint-disable-line no-empty\n });\n // VisualConsoleItem DOM element.\n this.elementRef.remove();\n }\n\n /**\n * Compare the previous and the new position and return\n * a boolean value in case the position changed.\n * @param prevPosition\n * @param newPosition\n * @return Whether the position changed or not.\n */\n protected positionChanged(\n prevPosition: Position,\n newPosition: Position\n ): boolean {\n return prevPosition.x !== newPosition.x || prevPosition.y !== newPosition.y;\n }\n\n /**\n * Move the label around the item content.\n * @param position Label position.\n */\n protected changeLabelPosition(position: Props[\"labelPosition\"]): void {\n switch (position) {\n case \"up\":\n this.elementRef.style.flexDirection = \"column-reverse\";\n break;\n case \"left\":\n this.elementRef.style.flexDirection = \"row-reverse\";\n break;\n case \"right\":\n this.elementRef.style.flexDirection = \"row\";\n break;\n case \"down\":\n default:\n this.elementRef.style.flexDirection = \"column\";\n break;\n }\n\n // Ugly table to show the label as its legacy counterpart.\n const tables = this.labelElementRef.getElementsByTagName(\"table\");\n const table = tables.length > 0 ? tables.item(0) : null;\n // Change the table size depending on its position.\n if (table) {\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n }\n }\n\n /**\n * Move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n protected moveElement(x: number, y: number): void {\n this.elementRef.style.left = `${x}px`;\n this.elementRef.style.top = `${y}px`;\n }\n\n /**\n * Update the position into the properties and move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n public move(x: number, y: number): void {\n this.moveElement(x, y);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n x,\n y\n };\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n protected sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n // The most valuable size is the content size.\n this.childElementRef.style.width = width > 0 ? `${width}px` : null;\n this.childElementRef.style.height = height > 0 ? `${height}px` : null;\n\n if (this.props.label && this.props.label.length > 0) {\n // Ugly table to show the label as its legacy counterpart.\n const tables = this.labelElementRef.getElementsByTagName(\"table\");\n const table = tables.length > 0 ? tables.item(0) : null;\n\n if (table) {\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n table.style.width = width > 0 ? `${width}px` : null;\n break;\n case \"left\":\n case \"right\":\n table.style.height = height > 0 ? `${height}px` : null;\n break;\n }\n }\n }\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.resizeElement(width, height);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onClick(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the movement of visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onMoved(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.movedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the resizement of visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onResized(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.resizedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the removal of the item.\n * @param listener Function which is going to be executed when a item is removed.\n */\n public onRemove(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.removeEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n\nexport default VisualConsoleItem;\n","export interface Listener {\n (event: T): void;\n}\n\nexport interface Disposable {\n dispose: () => void;\n}\n\n/** passes through events as they happen. You will not get events from before you start listening */\nexport default class TypedEvent {\n private listeners: Listener[] = [];\n private listenersOncer: Listener[] = [];\n\n public on = (listener: Listener): Disposable => {\n this.listeners.push(listener);\n return {\n dispose: () => this.off(listener)\n };\n };\n\n public once = (listener: Listener): void => {\n this.listenersOncer.push(listener);\n };\n\n public off = (listener: Listener): void => {\n const callbackIndex = this.listeners.indexOf(listener);\n if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1);\n };\n\n public emit = (event: T): void => {\n /** Update any general listeners */\n this.listeners.forEach(listener => listener(event));\n\n /** Clear the `once` queue */\n this.listenersOncer.forEach(listener => listener(event));\n this.listenersOncer = [];\n };\n\n public pipe = (te: TypedEvent): Disposable => this.on(e => te.emit(e));\n}\n","import { AnyObject, WithModuleProps } from \"../lib/types\";\nimport {\n modulePropsDecoder,\n parseIntOr,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type EventsHistoryProps = {\n type: ItemType.AUTO_SLA_GRAPH;\n maxTime: number | null;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the events history props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function eventsHistoryPropsDecoder(\n data: AnyObject\n): EventsHistoryProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.AUTO_SLA_GRAPH,\n maxTime: parseIntOr(data.maxTime, null),\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class EventsHistory extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"events-history\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type DonutGraphProps = {\n type: ItemType.DONUT_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the donut graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function donutGraphPropsDecoder(\n data: AnyObject\n): DonutGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.DONUT_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class DonutGraph extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"donut-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import { AnyObject, WithModuleProps } from \"../lib/types\";\nimport { modulePropsDecoder, decodeBase64, stringIsEmpty } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type BarsGraphProps = {\n type: ItemType.BARS_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the bars graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function barsGraphPropsDecoder(data: AnyObject): BarsGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BARS_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class BarsGraph extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"bars-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ModuleGraphProps = {\n type: ItemType.MODULE_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the module graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function moduleGraphPropsDecoder(\n data: AnyObject\n): ModuleGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.MODULE_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class ModuleGraph extends Item {\n /**\n * @override Item.resizeElement.\n * Resize the DOM content container.\n * We need to override the resize function cause this item's height\n * is larger than the configured and the graph is over the label.\n * @param width\n * @param height\n */\n protected resizeElement(width: number): void {\n super.resizeElement(width, 0);\n }\n\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"module-graph\";\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n AnyObject\n} from \"../lib/types\";\n\nimport {\n modulePropsDecoder,\n linkedVCPropsDecoder,\n notEmptyStringOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type StaticGraphProps = {\n type: ItemType.STATIC_GRAPH;\n imageSrc: string; // URL?\n showLastValueTooltip: \"default\" | \"enabled\" | \"disabled\";\n statusImageSrc: string | null; // URL?\n lastValue: string | null;\n} & ItemProps &\n (WithModuleProps | LinkedVisualConsoleProps);\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param showLastValueTooltip Raw value.\n */\nconst parseShowLastValueTooltip = (\n showLastValueTooltip: unknown\n): StaticGraphProps[\"showLastValueTooltip\"] => {\n switch (showLastValueTooltip) {\n case \"default\":\n case \"enabled\":\n case \"disabled\":\n return showLastValueTooltip;\n default:\n return \"default\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function staticGraphPropsDecoder(\n data: AnyObject\n): StaticGraphProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.STATIC_GRAPH,\n imageSrc: data.imageSrc,\n showLastValueTooltip: parseShowLastValueTooltip(data.showLastValueTooltip),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n lastValue: notEmptyStringOr(data.lastValue, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class StaticGraph extends Item {\n protected createDomElement(): HTMLElement {\n const imgSrc = this.props.statusImageSrc || this.props.imageSrc;\n const element = document.createElement(\"div\");\n element.className = \"static-graph\";\n element.style.background = `url(${imgSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n // Show last value in a tooltip.\n if (\n this.props.lastValue !== null &&\n this.props.showLastValueTooltip !== \"disabled\"\n ) {\n element.className = \"static-graph image forced_title\";\n element.setAttribute(\"data-use_title_for_force_title\", \"1\");\n element.setAttribute(\"data-title\", this.props.lastValue);\n }\n\n return element;\n }\n}\n","import { LinkedVisualConsoleProps, AnyObject } from \"../lib/types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type IconProps = {\n type: ItemType.ICON;\n imageSrc: string; // URL?\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the icon props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function iconPropsDecoder(data: AnyObject): IconProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.ICON,\n imageSrc: data.imageSrc,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Icon extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"icon\";\n element.style.background = `url(${this.props.imageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n return element;\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n AnyObject\n} from \"../lib/types\";\nimport { modulePropsDecoder, linkedVCPropsDecoder } from \"../lib\";\nimport Item, { itemBasePropsDecoder, ItemType, ItemProps } from \"../Item\";\n\nexport type ColorCloudProps = {\n type: ItemType.COLOR_CLOUD;\n color: string;\n // TODO: Add the rest of the color cloud values?\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function colorCloudPropsDecoder(\n data: AnyObject\n): ColorCloudProps | never {\n // TODO: Validate the color.\n if (typeof data.color !== \"string\" || data.color.length === 0) {\n throw new TypeError(\"invalid color.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.COLOR_CLOUD,\n color: data.color,\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class ColorCloud extends Item {\n protected createDomElement(): HTMLElement {\n const container: HTMLDivElement = document.createElement(\"div\");\n container.className = \"color-cloud\";\n\n // Add the SVG.\n container.append(this.createSvgElement());\n\n return container;\n }\n\n protected resizeElement(width: number): void {\n super.resizeElement(width, width);\n }\n\n public createSvgElement(): SVGSVGElement {\n const gradientId = `grad_${this.props.id}`;\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Defs.\n const defs = document.createElementNS(svgNS, \"defs\");\n // Radial gradient.\n const radialGradient = document.createElementNS(svgNS, \"radialGradient\");\n radialGradient.setAttribute(\"id\", gradientId);\n radialGradient.setAttribute(\"cx\", \"50%\");\n radialGradient.setAttribute(\"cy\", \"50%\");\n radialGradient.setAttribute(\"r\", \"50%\");\n radialGradient.setAttribute(\"fx\", \"50%\");\n radialGradient.setAttribute(\"fy\", \"50%\");\n // Stops.\n const stop0 = document.createElementNS(svgNS, \"stop\");\n stop0.setAttribute(\"offset\", \"0%\");\n stop0.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0.9`\n );\n const stop100 = document.createElementNS(svgNS, \"stop\");\n stop100.setAttribute(\"offset\", \"100%\");\n stop100.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0`\n );\n // Circle.\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.setAttribute(\"fill\", `url(#${gradientId})`);\n circle.setAttribute(\"cx\", \"50%\");\n circle.setAttribute(\"cy\", \"50%\");\n circle.setAttribute(\"r\", \"50%\");\n\n // Append elements.\n radialGradient.append(stop0, stop100);\n defs.append(radialGradient);\n svg.append(defs, circle);\n\n return svg;\n }\n}\n","import { LinkedVisualConsoleProps, AnyObject } from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n stringIsEmpty,\n decodeBase64,\n parseBoolean\n} from \"../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../Item\";\n\nexport type GroupProps = {\n type: ItemType.GROUP_ITEM;\n groupId: number;\n imageSrc: string | null; // URL?\n statusImageSrc: string | null;\n showStatistics: boolean;\n html?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\nfunction extractHtml(data: AnyObject): string | null {\n if (!stringIsEmpty(data.html)) return data.html;\n if (!stringIsEmpty(data.encodedHtml)) return decodeBase64(data.encodedHtml);\n return null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the group props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function groupPropsDecoder(data: AnyObject): GroupProps | never {\n if (\n (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) &&\n data.encodedHtml === null\n ) {\n throw new TypeError(\"invalid image src.\");\n }\n if (parseIntOr(data.groupId, null) === null) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n const showStatistics = parseBoolean(data.showStatistics);\n const html = showStatistics ? extractHtml(data) : null;\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.GROUP_ITEM,\n groupId: parseInt(data.groupId),\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n showStatistics,\n html,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Group extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"group\";\n\n if (!this.props.showStatistics && this.props.statusImageSrc !== null) {\n // Icon with status.\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.showStatistics && this.props.html != null) {\n // Stats table.\n element.innerHTML = this.props.html;\n }\n\n return element;\n }\n}\n","import \"./styles.css\";\n\nimport {\n LinkedVisualConsoleProps,\n AnyObject,\n Size,\n ItemMeta\n} from \"../../lib/types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n parseBoolean,\n prefixedCssRules,\n notEmptyStringOr,\n humanDate,\n humanTime\n} from \"../../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../../Item\";\n\nexport type ClockProps = {\n type: ItemType.CLOCK;\n clockType: \"analogic\" | \"digital\";\n clockFormat: \"datetime\" | \"time\";\n clockTimezone: string;\n clockTimezoneOffset: number; // Offset of the timezone to UTC in seconds.\n showClockTimezone: boolean;\n color?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockType Raw value.\n */\nconst parseClockType = (clockType: unknown): ClockProps[\"clockType\"] => {\n switch (clockType) {\n case \"analogic\":\n case \"digital\":\n return clockType;\n default:\n return \"analogic\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockFormat Raw value.\n */\nconst parseClockFormat = (clockFormat: unknown): ClockProps[\"clockFormat\"] => {\n switch (clockFormat) {\n case \"datetime\":\n case \"time\":\n return clockFormat;\n default:\n return \"datetime\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the clock props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function clockPropsDecoder(data: AnyObject): ClockProps | never {\n if (\n typeof data.clockTimezone !== \"string\" ||\n data.clockTimezone.length === 0\n ) {\n throw new TypeError(\"invalid timezone.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.CLOCK,\n clockType: parseClockType(data.clockType),\n clockFormat: parseClockFormat(data.clockFormat),\n clockTimezone: data.clockTimezone,\n clockTimezoneOffset: parseIntOr(data.clockTimezoneOffset, 0),\n showClockTimezone: parseBoolean(data.showClockTimezone),\n color: notEmptyStringOr(data.color, null),\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Clock extends Item {\n public static readonly TICK_INTERVAL = 1000; // In ms.\n private intervalRef: number | null = null;\n\n public constructor(props: ClockProps, meta: ItemMeta) {\n // Call the superclass constructor.\n super(props, meta);\n\n /* The item is already loaded and inserted into the DOM.\n * The class properties are now initialized.\n * Now you can modify the item, add event handlers, timers, etc.\n */\n\n /* The use of the arrow function is important here. startTick will\n * use the function passed as an argument to call the global setInterval\n * function. The interval, timeout or event functions, among other, are\n * called into another execution loop and using a different context.\n * The arrow functions, unlike the classic functions, doesn't create\n * their own context (this), so their context at execution time will be\n * use the current context at the declaration time.\n * http://es6-features.org/#Lexicalthis\n */\n this.startTick(\n () => {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n },\n /* The analogic clock doesn't need to tick,\n * but it will be refreshed every 20 seconds\n * to avoid a desync caused by page freezes.\n */\n this.props.clockType === \"analogic\" ? 20000 : Clock.TICK_INTERVAL\n );\n }\n\n /**\n * Wrap a window.clearInterval call.\n */\n private stopTick(): void {\n if (this.intervalRef !== null) {\n window.clearInterval(this.intervalRef);\n this.intervalRef = null;\n }\n }\n\n /**\n * Wrap a window.setInterval call.\n * @param handler Function to be called every time the interval\n * timer is reached.\n * @param interval Number in milliseconds for the interval timer.\n */\n private startTick(\n handler: TimerHandler,\n interval: number = Clock.TICK_INTERVAL\n ): void {\n this.stopTick();\n this.intervalRef = window.setInterval(handler, interval);\n }\n\n /**\n * Create a element which contains the DOM representation of the item.\n * @return DOM Element.\n * @override\n */\n protected createDomElement(): HTMLElement | never {\n return this.createClock();\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n * @override\n */\n public remove(): void {\n // Clear the interval.\n this.stopTick();\n // Call to the parent clean function.\n super.remove();\n }\n\n /**\n * @override Item.resizeElement\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n const { width: newWidth, height: newHeight } = this.getElementSize(\n width,\n height\n ); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n super.resizeElement(newWidth, newHeight);\n // Re-render the item to force it calculate a new font size.\n if (this.props.clockType === \"digital\") {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n }\n }\n\n /**\n * Create a element which contains a representation of a clock.\n * It choose between the clock types.\n * @return DOM Element.\n * @throws Error.\n */\n private createClock(): HTMLElement | never {\n switch (this.props.clockType) {\n case \"analogic\":\n return this.createAnalogicClock();\n case \"digital\":\n return this.createDigitalClock();\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n\n /**\n * Create a element which contains a representation of an analogic clock.\n * @return DOM Element.\n */\n private createAnalogicClock(): HTMLElement {\n const svgNS = \"http://www.w3.org/2000/svg\";\n const colors = {\n watchFace: \"#FFFFF0\",\n watchFaceBorder: \"#242124\",\n mark: \"#242124\",\n handDark: \"#242124\",\n handLight: \"#525252\",\n secondHand: \"#DC143C\"\n };\n\n const { width, height } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n\n const div = document.createElement(\"div\");\n div.className = \"analogic-clock\";\n div.style.width = `${width}px`;\n div.style.height = `${height}px`;\n\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Clock face.\n const clockFace = document.createElementNS(svgNS, \"g\");\n clockFace.setAttribute(\"class\", \"clockface\");\n const clockFaceBackground = document.createElementNS(svgNS, \"circle\");\n clockFaceBackground.setAttribute(\"cx\", \"50\");\n clockFaceBackground.setAttribute(\"cy\", \"50\");\n clockFaceBackground.setAttribute(\"r\", \"48\");\n clockFaceBackground.setAttribute(\"fill\", colors.watchFace);\n clockFaceBackground.setAttribute(\"stroke\", colors.watchFaceBorder);\n clockFaceBackground.setAttribute(\"stroke-width\", \"2\");\n clockFaceBackground.setAttribute(\"stroke-linecap\", \"round\");\n // Insert the clockface background into the clockface group.\n clockFace.append(clockFaceBackground);\n\n // Timezone complication.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const timezoneComplication = document.createElementNS(svgNS, \"text\");\n timezoneComplication.setAttribute(\"text-anchor\", \"middle\");\n timezoneComplication.setAttribute(\"font-size\", \"8\");\n timezoneComplication.setAttribute(\n \"transform\",\n \"translate(30 50) rotate(90)\" // Rotate to counter the clock rotation.\n );\n timezoneComplication.setAttribute(\"fill\", colors.mark);\n timezoneComplication.textContent = city;\n clockFace.append(timezoneComplication);\n }\n\n // Marks group.\n const marksGroup = document.createElementNS(svgNS, \"g\");\n marksGroup.setAttribute(\"class\", \"marks\");\n // Build the 12 hours mark.\n const mainMarkGroup = document.createElementNS(svgNS, \"g\");\n mainMarkGroup.setAttribute(\"class\", \"mark\");\n mainMarkGroup.setAttribute(\"transform\", \"translate(50 50)\");\n const mark1a = document.createElementNS(svgNS, \"line\");\n mark1a.setAttribute(\"x1\", \"36\");\n mark1a.setAttribute(\"y1\", \"0\");\n mark1a.setAttribute(\"x2\", \"46\");\n mark1a.setAttribute(\"y2\", \"0\");\n mark1a.setAttribute(\"stroke\", colors.mark);\n mark1a.setAttribute(\"stroke-width\", \"5\");\n const mark1b = document.createElementNS(svgNS, \"line\");\n mark1b.setAttribute(\"x1\", \"36\");\n mark1b.setAttribute(\"y1\", \"0\");\n mark1b.setAttribute(\"x2\", \"46\");\n mark1b.setAttribute(\"y2\", \"0\");\n mark1b.setAttribute(\"stroke\", colors.watchFace);\n mark1b.setAttribute(\"stroke-width\", \"1\");\n // Insert the 12 mark lines into their group.\n mainMarkGroup.append(mark1a, mark1b);\n // Insert the main mark into the marks group.\n marksGroup.append(mainMarkGroup);\n // Build the rest of the marks.\n for (let i = 1; i < 60; i++) {\n const mark = document.createElementNS(svgNS, \"line\");\n mark.setAttribute(\"y1\", \"0\");\n mark.setAttribute(\"y2\", \"0\");\n mark.setAttribute(\"stroke\", colors.mark);\n mark.setAttribute(\"transform\", `translate(50 50) rotate(${i * 6})`);\n\n if (i % 5 === 0) {\n mark.setAttribute(\"x1\", \"38\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", i % 15 === 0 ? \"2\" : \"1\");\n } else {\n mark.setAttribute(\"x1\", \"42\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", \"0.5\");\n }\n\n // Insert the mark into the marks group.\n marksGroup.append(mark);\n }\n\n /* Clock hands */\n\n // Hour hand.\n const hourHand = document.createElementNS(svgNS, \"g\");\n hourHand.setAttribute(\"class\", \"hour-hand\");\n hourHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const hourHandA = document.createElementNS(svgNS, \"line\");\n hourHandA.setAttribute(\"class\", \"hour-hand-a\");\n hourHandA.setAttribute(\"x1\", \"0\");\n hourHandA.setAttribute(\"y1\", \"0\");\n hourHandA.setAttribute(\"x2\", \"30\");\n hourHandA.setAttribute(\"y2\", \"0\");\n hourHandA.setAttribute(\"stroke\", colors.handLight);\n hourHandA.setAttribute(\"stroke-width\", \"4\");\n hourHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const hourHandB = document.createElementNS(svgNS, \"line\");\n hourHandB.setAttribute(\"class\", \"hour-hand-b\");\n hourHandB.setAttribute(\"x1\", \"0\");\n hourHandB.setAttribute(\"y1\", \"0\");\n hourHandB.setAttribute(\"x2\", \"29.9\");\n hourHandB.setAttribute(\"y2\", \"0\");\n hourHandB.setAttribute(\"stroke\", colors.handDark);\n hourHandB.setAttribute(\"stroke-width\", \"3.1\");\n hourHandB.setAttribute(\"stroke-linecap\", \"round\");\n // Append the elements to finish the hour hand.\n hourHand.append(hourHandA, hourHandB);\n\n // Minute hand.\n const minuteHand = document.createElementNS(svgNS, \"g\");\n minuteHand.setAttribute(\"class\", \"minute-hand\");\n minuteHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const minuteHandA = document.createElementNS(svgNS, \"line\");\n minuteHandA.setAttribute(\"class\", \"minute-hand-a\");\n minuteHandA.setAttribute(\"x1\", \"0\");\n minuteHandA.setAttribute(\"y1\", \"0\");\n minuteHandA.setAttribute(\"x2\", \"40\");\n minuteHandA.setAttribute(\"y2\", \"0\");\n minuteHandA.setAttribute(\"stroke\", colors.handLight);\n minuteHandA.setAttribute(\"stroke-width\", \"2\");\n minuteHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const minuteHandB = document.createElementNS(svgNS, \"line\");\n minuteHandB.setAttribute(\"class\", \"minute-hand-b\");\n minuteHandB.setAttribute(\"x1\", \"0\");\n minuteHandB.setAttribute(\"y1\", \"0\");\n minuteHandB.setAttribute(\"x2\", \"39.9\");\n minuteHandB.setAttribute(\"y2\", \"0\");\n minuteHandB.setAttribute(\"stroke\", colors.handDark);\n minuteHandB.setAttribute(\"stroke-width\", \"1.5\");\n minuteHandB.setAttribute(\"stroke-linecap\", \"round\");\n const minuteHandPin = document.createElementNS(svgNS, \"circle\");\n minuteHandPin.setAttribute(\"r\", \"3\");\n minuteHandPin.setAttribute(\"fill\", colors.handDark);\n // Append the elements to finish the minute hand.\n minuteHand.append(minuteHandA, minuteHandB, minuteHandPin);\n\n // Second hand.\n const secondHand = document.createElementNS(svgNS, \"g\");\n secondHand.setAttribute(\"class\", \"second-hand\");\n secondHand.setAttribute(\"transform\", \"translate(50 50)\");\n const secondHandBar = document.createElementNS(svgNS, \"line\");\n secondHandBar.setAttribute(\"x1\", \"0\");\n secondHandBar.setAttribute(\"y1\", \"0\");\n secondHandBar.setAttribute(\"x2\", \"46\");\n secondHandBar.setAttribute(\"y2\", \"0\");\n secondHandBar.setAttribute(\"stroke\", colors.secondHand);\n secondHandBar.setAttribute(\"stroke-width\", \"1\");\n secondHandBar.setAttribute(\"stroke-linecap\", \"round\");\n const secondHandPin = document.createElementNS(svgNS, \"circle\");\n secondHandPin.setAttribute(\"r\", \"2\");\n secondHandPin.setAttribute(\"fill\", colors.secondHand);\n // Append the elements to finish the second hand.\n secondHand.append(secondHandBar, secondHandPin);\n\n // Pin.\n const pin = document.createElementNS(svgNS, \"circle\");\n pin.setAttribute(\"cx\", \"50\");\n pin.setAttribute(\"cy\", \"50\");\n pin.setAttribute(\"r\", \"0.3\");\n pin.setAttribute(\"fill\", colors.handDark);\n\n // Get the hand angles.\n const date = this.getOriginDate();\n const seconds = date.getSeconds();\n const minutes = date.getMinutes();\n const hours = date.getHours();\n const secAngle = (360 / 60) * seconds;\n const minuteAngle = (360 / 60) * minutes + (360 / 60) * (seconds / 60);\n const hourAngle = (360 / 12) * hours + (360 / 12) * (minutes / 60);\n // Set the clock time by moving the hands.\n hourHand.setAttribute(\"transform\", `translate(50 50) rotate(${hourAngle})`);\n minuteHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${minuteAngle})`\n );\n secondHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${secAngle})`\n );\n\n // Build the clock\n svg.append(clockFace, marksGroup, hourHand, minuteHand, secondHand, pin);\n // Rotate the clock to its normal position.\n svg.setAttribute(\"transform\", \"rotate(-90)\");\n\n /* Add the animation declaration to the container.\n * Since the animation keyframes need to know the\n * start angle, this angle is dynamic (current time),\n * and we can't edit keyframes through javascript\n * safely and with backwards compatibility, we need\n * to inject it.\n */\n div.innerHTML = `\n \n `;\n // Add the clock to the container\n div.append(svg);\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n div.append(dateElem);\n }\n\n return div;\n }\n\n /**\n * Create a element which contains a representation of a digital clock.\n * @return DOM Element.\n */\n private createDigitalClock(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"digital-clock\";\n\n const { width } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const tzFontSizeMultiplier = 6 / this.props.clockTimezone.length;\n const timeFontSize = (baseTimeFontSize * width) / 100;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n const tzFontSize = Math.min(\n (baseTimeFontSize * tzFontSizeMultiplier * width) / 100,\n (width / 100) * 10\n );\n\n // Date calculated using the original timezone.\n const date = this.getOriginDate();\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n element.append(dateElem);\n }\n\n // Time.\n const timeElem: HTMLSpanElement = document.createElement(\"span\");\n timeElem.className = \"time\";\n timeElem.textContent = humanTime(date);\n timeElem.style.fontSize = `${timeFontSize}px`;\n if (this.props.color) timeElem.style.color = this.props.color;\n element.append(timeElem);\n\n // City name.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const tzElem: HTMLSpanElement = document.createElement(\"span\");\n tzElem.className = \"timezone\";\n tzElem.textContent = city;\n tzElem.style.fontSize = `${tzFontSize}px`;\n if (this.props.color) tzElem.style.color = this.props.color;\n element.append(tzElem);\n }\n\n return element;\n }\n\n /**\n * Generate the current date using the timezone offset stored into the properties.\n * @return The current date.\n */\n private getOriginDate(initialDate: Date | null = null): Date {\n const d = initialDate ? initialDate : new Date();\n const targetTZOffset = this.props.clockTimezoneOffset * 1000; // In ms.\n const localTZOffset = d.getTimezoneOffset() * 60 * 1000; // In ms.\n const utimestamp = d.getTime() + targetTZOffset + localTZOffset;\n\n return new Date(utimestamp);\n }\n\n /**\n * Extract a human readable city name from the timezone text.\n * @param timezone Timezone text.\n */\n public getHumanTimezone(timezone: string = this.props.clockTimezone): string {\n const [, city = \"\"] = timezone.split(\"/\");\n return city.replace(\"_\", \" \");\n }\n\n /**\n * Generate a element size using the current size and the default values.\n * @return The size.\n */\n private getElementSize(\n width: number = this.props.width,\n height: number = this.props.height\n ): Size {\n switch (this.props.clockType) {\n case \"analogic\": {\n let diameter = 100; // Default value.\n\n if (width > 0 && height > 0) {\n diameter = Math.min(width, height);\n } else if (width > 0) {\n diameter = width;\n } else if (height > 0) {\n diameter = height;\n }\n\n return {\n width: diameter,\n height: diameter\n };\n }\n case \"digital\": {\n if (width > 0 && height > 0) {\n // The proportion of the clock should be (width = height / 2) aproximately.\n height = width / 2 < height ? width / 2 : height;\n } else if (width > 0) {\n height = width / 2;\n } else if (height > 0) {\n // The proportion of the clock should be (height * 2 = width) aproximately.\n width = height * 2;\n } else {\n width = 100; // Default value.\n height = 50; // Default value.\n }\n\n return {\n width,\n height\n };\n }\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n}\n","import { AnyObject } from \"../lib/types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface BoxProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.BOX_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n borderWidth: number;\n borderColor: string | null;\n fillColor: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function boxPropsDecoder(data: AnyObject): BoxProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BOX_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Custom properties.\n borderWidth: parseIntOr(data.borderWidth, 0),\n borderColor: notEmptyStringOr(data.borderColor, null),\n fillColor: notEmptyStringOr(data.fillColor, null)\n };\n}\n\nexport default class Box extends Item {\n protected createDomElement(): HTMLElement {\n const box: HTMLDivElement = document.createElement(\"div\");\n box.className = \"box\";\n // To prevent this item to expand beyond its parent.\n box.style.boxSizing = \"border-box\";\n\n if (this.props.fillColor) {\n box.style.backgroundColor = this.props.fillColor;\n }\n\n // Border.\n if (this.props.borderWidth > 0) {\n box.style.borderStyle = \"solid\";\n // Control the max width to prevent this item to expand beyond its parent.\n const maxBorderWidth = Math.min(this.props.width, this.props.height) / 2;\n const borderWidth = Math.min(this.props.borderWidth, maxBorderWidth);\n box.style.borderWidth = `${borderWidth}px`;\n\n if (this.props.borderColor) {\n box.style.borderColor = this.props.borderColor;\n }\n }\n\n return box;\n }\n}\n","import { AnyObject, Position, Size, ItemMeta } from \"../lib/types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface LineProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.LINE_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n startPosition: Position;\n endPosition: Position;\n lineWidth: number;\n color: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function linePropsDecoder(data: AnyObject): LineProps | never {\n const props: LineProps = {\n ...itemBasePropsDecoder({ ...data, width: 1, height: 1 }), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LINE_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Initialize Position & Size.\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n // Custom properties.\n startPosition: {\n x: parseIntOr(data.startX, 0),\n y: parseIntOr(data.startY, 0)\n },\n endPosition: {\n x: parseIntOr(data.endX, 0),\n y: parseIntOr(data.endY, 0)\n },\n lineWidth: parseIntOr(data.lineWidth || data.borderWidth, 1),\n color: notEmptyStringOr(data.borderColor || data.color, null)\n };\n\n /*\n * We need to enhance the props with the extracted size and position\n * of the box cause there are missing at the props update. A better\n * solution would be overriding the props setter to do it there, but\n * the language doesn't allow it while targetting ES5.\n * TODO: We need to figure out a more consistent solution.\n */\n\n return {\n ...props,\n // Enhance the props extracting the box size and position.\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n ...Line.extractBoxSizeAndPosition(props)\n };\n}\n\nexport default class Line extends Item {\n /**\n * @override\n */\n public constructor(props: LineProps, meta: ItemMeta) {\n /*\n * We need to override the constructor cause we need to obtain\n * the\n * box size and position from the start and finish points\n * of the line.\n */\n super(\n {\n ...props,\n ...Line.extractBoxSizeAndPosition(props)\n },\n {\n ...meta,\n editMode: false\n }\n );\n }\n\n /**\n * Clasic and protected version of the setter of the `meta` property.\n * Useful to override it from children classes.\n * @param newProps\n * @override Item.setMeta\n */\n public setMeta(newMetadata: ItemMeta) {\n super.setMeta({\n ...newMetadata,\n editMode: false\n });\n }\n\n /**\n * @override\n * To create the item's DOM representation.\n * @return Item.\n */\n protected createDomElement(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"line\";\n\n const svgNS = \"http://www.w3.org/2000/svg\";\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Set SVG size.\n svg.setAttribute(\n \"width\",\n (this.props.width + this.props.lineWidth).toString()\n );\n svg.setAttribute(\n \"height\",\n (this.props.height + this.props.lineWidth).toString()\n );\n const line = document.createElementNS(svgNS, \"line\");\n line.setAttribute(\n \"x1\",\n `${this.props.startPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y1\",\n `${this.props.startPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"x2\",\n `${this.props.endPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y2\",\n `${this.props.endPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\"stroke\", this.props.color || \"black\");\n line.setAttribute(\"stroke-width\", this.props.lineWidth.toString());\n\n svg.append(line);\n element.append(svg);\n\n return element;\n }\n\n /**\n * Extract the size and position of the box from\n * the start and the finish of the line.\n * @param props Item properties.\n */\n public static extractBoxSizeAndPosition(props: LineProps): Size & Position {\n return {\n width: Math.abs(props.startPosition.x - props.endPosition.x),\n height: Math.abs(props.startPosition.y - props.endPosition.y),\n x: Math.min(props.startPosition.x, props.endPosition.x),\n y: Math.min(props.startPosition.y, props.endPosition.y)\n };\n }\n}\n","import { LinkedVisualConsoleProps, AnyObject } from \"../lib/types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type LabelProps = {\n type: ItemType.LABEL;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the label props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function labelPropsDecoder(data: AnyObject): LabelProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LABEL,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Label extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"label\";\n element.innerHTML = this.getLabelWithMacrosReplaced();\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n public createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","import {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n modulePropsDecoder,\n replaceMacros\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type SimpleValueProps = {\n type: ItemType.SIMPLE_VALUE;\n valueType: \"string\" | \"image\";\n value: string;\n} & (\n | {\n processValue: \"none\";\n }\n | {\n processValue: \"avg\" | \"max\" | \"min\";\n period: number;\n }) &\n ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw value type.\n * @param valueType Raw value.\n */\nconst parseValueType = (valueType: unknown): SimpleValueProps[\"valueType\"] => {\n switch (valueType) {\n case \"string\":\n case \"image\":\n return valueType;\n default:\n return \"string\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw process value.\n * @param processValue Raw value.\n */\nconst parseProcessValue = (\n processValue: unknown\n): SimpleValueProps[\"processValue\"] => {\n switch (processValue) {\n case \"none\":\n case \"avg\":\n case \"max\":\n case \"min\":\n return processValue;\n default:\n return \"none\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the simple value props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function simpleValuePropsDecoder(\n data: AnyObject\n): SimpleValueProps | never {\n if (typeof data.value !== \"string\" || data.value.length === 0) {\n throw new TypeError(\"invalid value\");\n }\n\n const processValue = parseProcessValue(data.processValue);\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SIMPLE_VALUE,\n valueType: parseValueType(data.valueType),\n value: data.value,\n ...(processValue === \"none\"\n ? { processValue }\n : { processValue, period: parseIntOr(data.period, 0) }), // Object spread. It will merge the properties of the two objects.\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class SimpleValue extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"simple-value\";\n\n if (this.props.valueType === \"image\") {\n const img = document.createElement(\"img\");\n img.src = this.props.value;\n element.append(img);\n } else {\n // Add the value to the label and show it.\n let text = this.props.value;\n let label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n text = replaceMacros([{ macro: /\\(?_VALUE_\\)?/i, value: text }], label);\n }\n\n element.innerHTML = text;\n }\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle.\n if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","import curveLinear from \"./linear\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n","export var slice = Array.prototype.slice;\n","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n","import {pi, tau} from \"../math\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","import {pi, tau} from \"../math\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n","export default function() {}\n","var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n","import noop from \"../noop\";\nimport {point} from \"./basis\";\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisClosed(context);\n}\n","import {point} from \"./basis\";\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisOpen(context);\n}\n","import {Basis} from \"./basis\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import noop from \"../noop\";\nimport {point} from \"./cardinal\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {point} from \"./cardinal\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {epsilon} from \"../math\";\nimport {Cardinal} from \"./cardinal\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalClosed} from \"./cardinalClosed\";\nimport noop from \"../noop\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalOpen} from \"./cardinalOpen\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import noop from \"../noop\";\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nexport default function(context) {\n return new LinearClosed(context);\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n","import ascending from \"./ascending\";\n\nexport default function(series) {\n return ascending(series).reverse();\n}\n","import { arc as arcFactory } from \"d3-shape\";\n\nimport {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n notEmptyStringOr,\n parseIntOr,\n parseFloatOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type PercentileProps = {\n type: ItemType.PERCENTILE_BAR;\n percentileType:\n | \"progress-bar\"\n | \"bubble\"\n | \"circular-progress-bar\"\n | \"circular-progress-bar-alt\";\n valueType: \"percent\" | \"value\";\n minValue: number | null;\n maxValue: number | null;\n color: string | null;\n labelColor: string | null;\n value: number | null;\n unit: string | null;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw type value.\n * @param type Raw value.\n */\nfunction extractPercentileType(\n type: unknown\n): PercentileProps[\"percentileType\"] {\n switch (type) {\n case \"progress-bar\":\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n return type;\n default:\n case ItemType.PERCENTILE_BAR:\n return \"progress-bar\";\n case ItemType.PERCENTILE_BUBBLE:\n return \"bubble\";\n case ItemType.CIRCULAR_PROGRESS_BAR:\n return \"circular-progress-bar\";\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return \"circular-progress-bar-alt\";\n }\n}\n\n/**\n * Extract a valid enum value from a raw value type value.\n * @param type Raw value.\n */\nfunction extractValueType(valueType: unknown): PercentileProps[\"valueType\"] {\n switch (valueType) {\n case \"percent\":\n case \"value\":\n return valueType;\n default:\n return \"percent\";\n }\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the percentile props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function percentilePropsDecoder(\n data: AnyObject\n): PercentileProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.PERCENTILE_BAR,\n percentileType: extractPercentileType(data.percentileType || data.type),\n valueType: extractValueType(data.valueType),\n minValue: parseIntOr(data.minValue, null),\n maxValue: parseIntOr(data.maxValue, null),\n color: notEmptyStringOr(data.color, null),\n labelColor: notEmptyStringOr(data.labelColor, null),\n value: parseFloatOr(data.value, null),\n unit: notEmptyStringOr(data.unit, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class Percentile extends Item {\n protected createDomElement(): HTMLElement {\n const colors = {\n background: \"#000000\",\n progress: this.props.color || \"#F0F0F0\",\n text: this.props.labelColor || \"#444444\"\n };\n // Progress.\n const progress = this.getProgress();\n // Main element.\n const element = document.createElement(\"div\");\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n\n var formatValue;\n if (this.props.value != null) {\n if (Intl) {\n formatValue = Intl.NumberFormat(\"en-EN\").format(this.props.value);\n } else {\n formatValue = this.props.value;\n }\n }\n\n switch (this.props.percentileType) {\n case \"progress-bar\":\n {\n const backgroundRect = document.createElementNS(svgNS, \"rect\");\n backgroundRect.setAttribute(\"fill\", colors.background);\n backgroundRect.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundRect.setAttribute(\"width\", \"100\");\n backgroundRect.setAttribute(\"height\", \"20\");\n backgroundRect.setAttribute(\"rx\", \"5\");\n backgroundRect.setAttribute(\"ry\", \"5\");\n const progressRect = document.createElementNS(svgNS, \"rect\");\n progressRect.setAttribute(\"fill\", colors.progress);\n progressRect.setAttribute(\"fill-opacity\", \"1\");\n progressRect.setAttribute(\"width\", `${progress}`);\n progressRect.setAttribute(\"height\", \"20\");\n progressRect.setAttribute(\"rx\", \"5\");\n progressRect.setAttribute(\"ry\", \"5\");\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"12\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"transform\", \"translate(50 11)\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\") {\n text.style.fontSize = \"6pt\";\n\n text.textContent = this.props.unit\n ? `${formatValue} ${this.props.unit}`\n : `${formatValue}`;\n } else {\n text.textContent = `${progress}%`;\n }\n\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 20\");\n svg.append(backgroundRect, progressRect, text);\n }\n break;\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n {\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n if (this.props.percentileType === \"bubble\") {\n // Create and append the circles.\n const backgroundCircle = document.createElementNS(svgNS, \"circle\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"r\", \"50\");\n const progressCircle = document.createElementNS(svgNS, \"circle\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\"r\", `${progress / 2}`);\n\n svg.append(backgroundCircle, progressCircle);\n } else {\n // Create and append the circles.\n const arcProps = {\n innerRadius:\n this.props.percentileType === \"circular-progress-bar\" ? 30 : 0,\n outerRadius: 50,\n startAngle: 0,\n endAngle: Math.PI * 2\n };\n const arc = arcFactory();\n\n const backgroundCircle = document.createElementNS(svgNS, \"path\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"d\", `${arc(arcProps)}`);\n const progressCircle = document.createElementNS(svgNS, \"path\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\n \"d\",\n `${arc({\n ...arcProps,\n endAngle: arcProps.endAngle * (progress / 100)\n })}`\n );\n\n svg.append(backgroundCircle, progressCircle);\n }\n\n // Create and append the text.\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"16\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\" && this.props.value != null) {\n // Show value and unit in 1 (no unit) or 2 lines.\n if (this.props.unit && this.props.unit.length > 0) {\n const value = document.createElementNS(svgNS, \"tspan\");\n value.setAttribute(\"x\", \"0\");\n value.setAttribute(\"dy\", \"1em\");\n value.textContent = `${formatValue}`;\n value.style.fontSize = \"8pt\";\n const unit = document.createElementNS(svgNS, \"tspan\");\n unit.setAttribute(\"x\", \"0\");\n unit.setAttribute(\"dy\", \"1em\");\n unit.textContent = `${this.props.unit}`;\n unit.style.fontSize = \"8pt\";\n text.append(value, unit);\n text.setAttribute(\"transform\", \"translate(50 33)\");\n } else {\n text.textContent = `${formatValue}`;\n text.style.fontSize = \"8pt\";\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n } else {\n // Percentage.\n text.textContent = `${progress}%`;\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n\n svg.append(text);\n }\n break;\n }\n\n element.append(svg);\n\n return element;\n }\n\n private getProgress(): number {\n const minValue = this.props.minValue || 0;\n const maxValue = this.props.maxValue || 100;\n const value = this.props.value == null ? 0 : this.props.value;\n\n if (value <= minValue) return 0;\n else if (value >= maxValue) return 100;\n else return Math.trunc(((value - minValue) / (maxValue - minValue)) * 100);\n }\n}\n","import { AnyObject } from \"../lib/types\";\nimport {\n stringIsEmpty,\n notEmptyStringOr,\n decodeBase64,\n parseIntOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ServiceProps = {\n type: ItemType.SERVICE;\n serviceId: number;\n imageSrc: string | null;\n statusImageSrc: string | null;\n encodedTitle: string | null;\n} & ItemProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the service props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function servicePropsDecoder(data: AnyObject): ServiceProps | never {\n if (data.imageSrc !== null) {\n if (\n typeof data.statusImageSrc !== \"string\" ||\n data.imageSrc.statusImageSrc === 0\n ) {\n throw new TypeError(\"invalid status image src.\");\n }\n } else {\n if (stringIsEmpty(data.encodedTitle)) {\n throw new TypeError(\"missing encode tittle content.\");\n }\n }\n\n if (parseIntOr(data.serviceId, null) === null) {\n throw new TypeError(\"invalid service id.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SERVICE,\n serviceId: data.serviceId,\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n encodedTitle: notEmptyStringOr(data.encodedTitle, null)\n };\n}\n\nexport default class Service extends Item {\n public createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"service\";\n\n if (this.props.statusImageSrc !== null) {\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.encodedTitle !== null) {\n element.innerHTML = decodeBase64(this.props.encodedTitle);\n }\n\n return element;\n }\n}\n","import { AnyObject, Size } from \"./lib/types\";\nimport {\n parseBoolean,\n sizePropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n itemMetaDecoder\n} from \"./lib\";\nimport Item, {\n ItemType,\n ItemProps,\n ItemClickEvent,\n ItemRemoveEvent,\n ItemMovedEvent,\n ItemResizedEvent\n} from \"./Item\";\nimport StaticGraph, { staticGraphPropsDecoder } from \"./items/StaticGraph\";\nimport Icon, { iconPropsDecoder } from \"./items/Icon\";\nimport ColorCloud, { colorCloudPropsDecoder } from \"./items/ColorCloud\";\nimport Group, { groupPropsDecoder } from \"./items/Group\";\nimport Clock, { clockPropsDecoder } from \"./items/Clock\";\nimport Box, { boxPropsDecoder } from \"./items/Box\";\nimport Line, { linePropsDecoder } from \"./items/Line\";\nimport Label, { labelPropsDecoder } from \"./items/Label\";\nimport SimpleValue, { simpleValuePropsDecoder } from \"./items/SimpleValue\";\nimport EventsHistory, {\n eventsHistoryPropsDecoder\n} from \"./items/EventsHistory\";\nimport Percentile, { percentilePropsDecoder } from \"./items/Percentile\";\nimport TypedEvent, { Disposable, Listener } from \"./lib/TypedEvent\";\nimport DonutGraph, { donutGraphPropsDecoder } from \"./items/DonutGraph\";\nimport BarsGraph, { barsGraphPropsDecoder } from \"./items/BarsGraph\";\nimport ModuleGraph, { moduleGraphPropsDecoder } from \"./items/ModuleGraph\";\nimport Service, { servicePropsDecoder } from \"./items/Service\";\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction itemInstanceFrom(data: AnyObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n const meta = itemMetaDecoder(data);\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return new StaticGraph(staticGraphPropsDecoder(data), meta);\n case ItemType.MODULE_GRAPH:\n return new ModuleGraph(moduleGraphPropsDecoder(data), meta);\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return new SimpleValue(simpleValuePropsDecoder(data), meta);\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return new Percentile(percentilePropsDecoder(data), meta);\n case ItemType.LABEL:\n return new Label(labelPropsDecoder(data), meta);\n case ItemType.ICON:\n return new Icon(iconPropsDecoder(data), meta);\n case ItemType.SERVICE:\n return new Service(servicePropsDecoder(data), meta);\n case ItemType.GROUP_ITEM:\n return new Group(groupPropsDecoder(data), meta);\n case ItemType.BOX_ITEM:\n return new Box(boxPropsDecoder(data), meta);\n case ItemType.LINE_ITEM:\n return new Line(linePropsDecoder(data), meta);\n case ItemType.AUTO_SLA_GRAPH:\n return new EventsHistory(eventsHistoryPropsDecoder(data), meta);\n case ItemType.DONUT_GRAPH:\n return new DonutGraph(donutGraphPropsDecoder(data), meta);\n case ItemType.BARS_GRAPH:\n return new BarsGraph(barsGraphPropsDecoder(data), meta);\n case ItemType.CLOCK:\n return new Clock(clockPropsDecoder(data), meta);\n case ItemType.COLOR_CLOUD:\n return new ColorCloud(colorCloudPropsDecoder(data), meta);\n default:\n throw new TypeError(\"item not found\");\n }\n}\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction decodeProps(data: AnyObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return staticGraphPropsDecoder(data);\n case ItemType.MODULE_GRAPH:\n return moduleGraphPropsDecoder(data);\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return simpleValuePropsDecoder(data);\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return percentilePropsDecoder(data);\n case ItemType.LABEL:\n return labelPropsDecoder(data);\n case ItemType.ICON:\n return iconPropsDecoder(data);\n case ItemType.SERVICE:\n return servicePropsDecoder(data);\n case ItemType.GROUP_ITEM:\n return groupPropsDecoder(data);\n case ItemType.BOX_ITEM:\n return boxPropsDecoder(data);\n case ItemType.LINE_ITEM:\n return linePropsDecoder(data);\n case ItemType.AUTO_SLA_GRAPH:\n return eventsHistoryPropsDecoder(data);\n case ItemType.DONUT_GRAPH:\n return donutGraphPropsDecoder(data);\n case ItemType.BARS_GRAPH:\n return barsGraphPropsDecoder(data);\n case ItemType.CLOCK:\n return clockPropsDecoder(data);\n case ItemType.COLOR_CLOUD:\n return colorCloudPropsDecoder(data);\n default:\n throw new TypeError(\"decoder not found\");\n }\n}\n\n// Base properties.\nexport interface VisualConsoleProps extends Size {\n readonly id: number;\n name: string;\n groupId: number;\n backgroundURL: string | null; // URL?\n backgroundColor: string | null;\n isFavorite: boolean;\n relationLineWidth: number;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the Visual Console props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function visualConsolePropsDecoder(\n data: AnyObject\n): VisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n id,\n name,\n groupId,\n backgroundURL,\n backgroundColor,\n isFavorite,\n relationLineWidth\n } = data;\n\n if (id == null || isNaN(parseInt(id))) {\n throw new TypeError(\"invalid Id.\");\n }\n if (typeof name !== \"string\" || name.length === 0) {\n throw new TypeError(\"invalid name.\");\n }\n if (groupId == null || isNaN(parseInt(groupId))) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n return {\n id: parseInt(id),\n name,\n groupId: parseInt(groupId),\n backgroundURL: notEmptyStringOr(backgroundURL, null),\n backgroundColor: notEmptyStringOr(backgroundColor, null),\n isFavorite: parseBoolean(isFavorite),\n relationLineWidth: parseIntOr(relationLineWidth, 0),\n ...sizePropsDecoder(data)\n };\n}\n\nexport default class VisualConsole {\n // Reference to the DOM element which will contain the items.\n private readonly containerRef: HTMLElement;\n // Properties.\n private _props: VisualConsoleProps;\n // Visual Console Item instances by their Id.\n private elementsById: {\n [key: number]: Item;\n } = {};\n // Visual Console Item Ids.\n private elementIds: ItemProps[\"id\"][] = [];\n // Dictionary which store the created lines.\n private relations: {\n [key: string]: Line;\n } = {};\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent<\n ItemClickEvent\n >();\n // Event manager for move events.\n private readonly movedEventManager = new TypedEvent();\n // Event manager for resize events.\n private readonly resizedEventManager = new TypedEvent();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n /**\n * React to a click on an element.\n * @param e Event object.\n */\n private handleElementClick: (e: ItemClickEvent) => void = e => {\n this.clickEventManager.emit(e);\n // console.log(`Clicked element #${e.data.id}`, e);\n };\n\n /**\n * React to a movement on an element.\n * @param e Event object.\n */\n private handleElementMovement: (e: ItemMovedEvent) => void = e => {\n this.movedEventManager.emit(e);\n // console.log(`Moved element #${e.item.props.id}`, e);\n };\n\n /**\n * React to a resizement on an element.\n * @param e Event object.\n */\n private handleElementResizement: (e: ItemResizedEvent) => void = e => {\n this.resizedEventManager.emit(e);\n // console.log(`Resized element #${e.item.props.id}`, e);\n };\n\n /**\n * Clear some element references.\n * @param e Event object.\n */\n private handleElementRemove: (e: ItemRemoveEvent) => void = e => {\n // Remove the element from the list and its relations.\n this.elementIds = this.elementIds.filter(id => id !== e.data.id);\n delete this.elementsById[e.data.id];\n this.clearRelations(e.data.id);\n };\n\n public constructor(\n container: HTMLElement,\n props: AnyObject,\n items: AnyObject[]\n ) {\n this.containerRef = container;\n this._props = visualConsolePropsDecoder(props);\n\n // Force the first render.\n this.render();\n\n // Sort by isOnTop, id ASC\n items = items.sort(function(a, b) {\n if (\n a.isOnTop == null ||\n b.isOnTop == null ||\n a.id == null ||\n b.id == null\n ) {\n return 0;\n }\n\n if (a.isOnTop && !b.isOnTop) return 1;\n else if (!a.isOnTop && b.isOnTop) return -1;\n else if (a.id > b.id) return 1;\n else return -1;\n });\n\n // Initialize the items.\n items.forEach(item => {\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n this.elementIds.push(itemInstance.props.id);\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onMoved(this.handleElementMovement);\n itemInstance.onResized(this.handleElementResizement);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n });\n\n // Create lines.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `elements` property.\n * @return Properties.\n */\n public get elements(): Item[] {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n return this.elementIds\n .map(id => this.elementsById[id])\n .filter(_ => _ != null) as Item[];\n }\n\n /**\n * Public setter of the `elements` property.\n * @param items.\n */\n public updateElements(items: AnyObject[]): void {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n const itemIds = items\n .map(item => item.id || null)\n .filter(id => id != null) as number[];\n // Get the elements we should delete.\n const deletedIds = this.elementIds.filter(id => itemIds.indexOf(id) < 0);\n // Delete the elements.\n deletedIds.forEach(id => {\n if (this.elementsById[id] != null) {\n this.elementsById[id].remove();\n delete this.elementsById[id];\n }\n });\n // Replace the element ids.\n this.elementIds = itemIds;\n\n // Initialize the items.\n items.forEach(item => {\n if (item.id) {\n if (this.elementsById[item.id] == null) {\n // New item.\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n } else {\n // Update item.\n try {\n this.elementsById[item.id].props = decodeProps(item);\n } catch (error) {\n console.log(\"Error updating an element:\", error.message);\n }\n }\n }\n });\n\n // Re-build relations.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): VisualConsoleProps {\n return { ...this._props }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: VisualConsoleProps) {\n const prevProps = this.props;\n // Update the internal props.\n this._props = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Re-render.\n this.render(prevProps);\n }\n\n /**\n * Recreate or update the HTMLElement which represents the Visual Console into the DOM.\n * @param prevProps If exists it will be used to only DOM updates instead of a full replace.\n */\n public render(prevProps: VisualConsoleProps | null = null): void {\n if (prevProps) {\n if (prevProps.backgroundURL !== this.props.backgroundURL) {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n }\n if (prevProps.backgroundColor !== this.props.backgroundColor) {\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n }\n if (this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n } else {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n this.resizeElement(this.props.width, this.props.height);\n }\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n public sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM container.\n * @param width\n * @param height\n */\n public resizeElement(width: number, height: number): void {\n this.containerRef.style.width = `${width}px`;\n this.containerRef.style.height = `${height}px`;\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.props = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n this.disposables.forEach(d => d.dispose()); // Arrow function.\n this.elements.forEach(e => e.remove()); // Arrow function.\n this.elementsById = {};\n this.elementIds = [];\n // Clear relations.\n this.clearRelations();\n // Clean container.\n this.containerRef.innerHTML = \"\";\n }\n\n /**\n * Create line elements which connect the elements with their parents.\n */\n private buildRelations(): void {\n // Clear relations.\n this.clearRelations();\n // Add relations.\n this.elements.forEach(item => {\n if (item.props.parentId !== null) {\n const parent = this.elementsById[item.props.parentId];\n const child = this.elementsById[item.props.id];\n if (parent && child) this.addRelationLine(parent, child);\n }\n });\n }\n\n /**\n * @param itemId Optional identifier of a parent or child item.\n * Remove the line elements which connect the elements with their parents.\n */\n private clearRelations(itemId?: number): void {\n if (itemId != null) {\n for (let key in this.relations) {\n const ids = key.split(\"|\");\n const parentId = Number.parseInt(ids[0]);\n const childId = Number.parseInt(ids[1]);\n\n if (itemId === parentId || itemId === childId) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n } else {\n for (let key in this.relations) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n }\n\n /**\n * Retrieve the line element which represent the relation between items.\n * @param parentId Identifier of the parent item.\n * @param childId Itentifier of the child item.\n * @return The line element or nothing.\n */\n private getRelationLine(parentId: number, childId: number): Line | null {\n const identifier = `${parentId}|${childId}`;\n return this.relations[identifier] || null;\n }\n\n /**\n * Add a new line item to represent a relation between the items.\n * @param parent Parent item.\n * @param child Child item.\n * @return Whether the line was added or not.\n */\n private addRelationLine(\n parent: Item,\n child: Item\n ): Line {\n const identifier = `${parent.props.id}|${child.props.id}`;\n if (this.relations[identifier] != null) {\n this.relations[identifier].remove();\n }\n\n // Get the items center.\n const startX = parent.props.x + parent.elementRef.clientWidth / 2;\n const startY =\n parent.props.y +\n (parent.elementRef.clientHeight - parent.labelElementRef.clientHeight) /\n 2;\n const endX = child.props.x + child.elementRef.clientWidth / 2;\n const endY =\n child.props.y +\n (child.elementRef.clientHeight - child.labelElementRef.clientHeight) / 2;\n\n const line = new Line(\n linePropsDecoder({\n id: 0,\n type: ItemType.LINE_ITEM,\n startX,\n startY,\n endX,\n endY,\n width: 0,\n height: 0,\n lineWidth: this.props.relationLineWidth,\n color: \"#CCCCCC\"\n }),\n itemMetaDecoder({\n receivedAt: new Date()\n })\n );\n // Save a reference to the line item.\n this.relations[identifier] = line;\n\n // Add the line to the DOM.\n line.elementRef.style.zIndex = \"0\";\n this.containerRef.append(line.elementRef);\n\n return line;\n }\n\n /**\n * Add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onItemClick(\n listener: Listener>\n ): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Add an event handler to the movement of the visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onItemMoved(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.movedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Add an event handler to the resizement of the visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onItemResized(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.resizedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Enable the edition mode.\n */\n public enableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: true };\n });\n this.containerRef.classList.add(\"is-editing\");\n }\n\n /**\n * Disable the edition mode.\n */\n public disableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: false };\n });\n this.containerRef.classList.remove(\"is-editing\");\n }\n}\n","import TypedEvent, { Disposable, Listener } from \"./TypedEvent\";\n\ninterface Cancellable {\n cancel(): void;\n}\n\ntype AsyncTaskStatus = \"waiting\" | \"started\" | \"cancelled\" | \"finished\";\ntype AsyncTaskInitiator = (done: () => void) => Cancellable;\n\n/**\n * Defines an async task which can be started and cancelled.\n * It's possible to observe the status changes of the task.\n */\nclass AsyncTask {\n private readonly taskInitiator: AsyncTaskInitiator;\n private cancellable: Cancellable = { cancel: () => {} };\n private _status: AsyncTaskStatus = \"waiting\";\n\n // Event manager for status change events.\n private readonly statusChangeEventManager = new TypedEvent();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n public constructor(taskInitiator: AsyncTaskInitiator) {\n this.taskInitiator = taskInitiator;\n }\n\n /**\n * Public setter of the `status` property.\n * @param status.\n */\n public set status(status: AsyncTaskStatus) {\n this._status = status;\n this.statusChangeEventManager.emit(status);\n }\n\n /**\n * Public accessor of the `status` property.\n * @return status.\n */\n public get status() {\n return this._status;\n }\n\n /**\n * Start the async task.\n */\n public init(): void {\n this.cancellable = this.taskInitiator(() => {\n this.status = \"finished\";\n });\n this.status = \"started\";\n }\n\n /**\n * Cancel the async task.\n */\n public cancel(): void {\n this.cancellable.cancel();\n this.status = \"cancelled\";\n }\n\n /**\n * Add an event handler to the status change.\n * @param listener Function which is going to be executed when the status changes.\n */\n public onStatusChange(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.statusChangeEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n\n/**\n * Wrap an async task into another which will execute that task indefinitely\n * every time the tash finnish and the chosen period ends.\n * Will last until cancellation.\n *\n * @param task Async task to execute.\n * @param period Time in milliseconds to wait until the next async esecution.\n *\n * @return A new async task.\n */\nfunction asyncPeriodic(task: AsyncTask, period: number): AsyncTask {\n return new AsyncTask(() => {\n let ref: number | null = null;\n\n task.onStatusChange(status => {\n if (status === \"finished\") {\n ref = window.setTimeout(() => {\n task.init();\n }, period);\n }\n });\n\n task.init();\n\n return {\n cancel: () => {\n if (ref) clearTimeout(ref);\n task.cancel();\n }\n };\n });\n}\n\n/**\n * Manages a list of async tasks.\n */\nexport default class AsyncTaskManager {\n private tasks: { [identifier: string]: AsyncTask } = {};\n\n /**\n * Adds an async task to the manager.\n *\n * @param identifier Unique identifier.\n * @param taskInitiator Function to initialize the async task.\n * Should return a structure to cancel the task.\n * @param period Optional period to repeat the task indefinitely.\n */\n public add(\n identifier: string,\n taskInitiator: AsyncTaskInitiator,\n period: number = 0\n ): AsyncTask {\n if (this.tasks[identifier] && this.tasks[identifier].status === \"started\") {\n this.tasks[identifier].cancel();\n }\n\n const asyncTask =\n period > 0\n ? asyncPeriodic(new AsyncTask(taskInitiator), period)\n : new AsyncTask(taskInitiator);\n\n this.tasks[identifier] = asyncTask;\n\n return this.tasks[identifier];\n }\n\n /**\n * Starts an async task.\n *\n * @param identifier Unique identifier.\n */\n public init(identifier: string) {\n if (\n this.tasks[identifier] &&\n (this.tasks[identifier].status === \"waiting\" ||\n this.tasks[identifier].status === \"cancelled\" ||\n this.tasks[identifier].status === \"finished\")\n ) {\n this.tasks[identifier].init();\n }\n }\n\n /**\n * Cancel a running async task.\n *\n * @param identifier Unique identifier.\n */\n public cancel(identifier: string) {\n if (this.tasks[identifier] && this.tasks[identifier].status === \"started\") {\n this.tasks[identifier].cancel();\n }\n }\n}\n","/*\n * Useful resources.\n * http://es6-features.org/\n * http://exploringjs.com/es6\n * https://www.typescriptlang.org/\n */\n\nimport \"./main.css\"; // CSS import.\nimport VisualConsole from \"./VisualConsole\";\nimport AsyncTaskManager from \"./lib/AsyncTaskManager\";\n\n// Export the VisualConsole class to the global object.\n// eslint-disable-next-line\n(window as any).VisualConsole = VisualConsole;\n\n// Export the AsyncTaskManager class to the global object.\n// eslint-disable-next-line\n(window as any).AsyncTaskManager = AsyncTaskManager;\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/index.ts","webpack:///./src/Item.ts","webpack:///./src/lib/TypedEvent.ts","webpack:///./src/items/EventsHistory.ts","webpack:///./src/items/DonutGraph.ts","webpack:///./src/items/BarsGraph.ts","webpack:///./src/items/ModuleGraph.ts","webpack:///./src/items/StaticGraph.ts","webpack:///./src/items/Icon.ts","webpack:///./src/items/ColorCloud.ts","webpack:///./src/items/Group.ts","webpack:///./src/items/Clock/index.ts","webpack:///./src/items/Box.ts","webpack:///./src/items/Line.ts","webpack:///./src/items/Label.ts","webpack:///./src/items/SimpleValue.ts","webpack:///./node_modules/d3-path/src/path.js","webpack:///./node_modules/d3-shape/src/constant.js","webpack:///./node_modules/d3-shape/src/math.js","webpack:///./node_modules/d3-shape/src/arc.js","webpack:///./node_modules/d3-shape/src/curve/linear.js","webpack:///./node_modules/d3-shape/src/curve/radial.js","webpack:///./node_modules/d3-shape/src/array.js","webpack:///./node_modules/d3-shape/src/symbol/diamond.js","webpack:///./node_modules/d3-shape/src/symbol/circle.js","webpack:///./node_modules/d3-shape/src/symbol/star.js","webpack:///./node_modules/d3-shape/src/noop.js","webpack:///./node_modules/d3-shape/src/symbol/triangle.js","webpack:///./node_modules/d3-shape/src/symbol/wye.js","webpack:///./node_modules/d3-shape/src/curve/basis.js","webpack:///./node_modules/d3-shape/src/curve/basisClosed.js","webpack:///./node_modules/d3-shape/src/curve/basisOpen.js","webpack:///./node_modules/d3-shape/src/curve/bundle.js","webpack:///./node_modules/d3-shape/src/curve/cardinal.js","webpack:///./node_modules/d3-shape/src/curve/cardinalClosed.js","webpack:///./node_modules/d3-shape/src/curve/cardinalOpen.js","webpack:///./node_modules/d3-shape/src/curve/catmullRom.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomClosed.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomOpen.js","webpack:///./node_modules/d3-shape/src/curve/linearClosed.js","webpack:///./node_modules/d3-shape/src/curve/monotone.js","webpack:///./node_modules/d3-shape/src/curve/natural.js","webpack:///./node_modules/d3-shape/src/curve/step.js","webpack:///./node_modules/d3-shape/src/order/descending.js","webpack:///./src/items/Percentile.ts","webpack:///./src/items/Service.ts","webpack:///./src/VisualConsole.ts","webpack:///./src/lib/AsyncTaskManager.ts","webpack:///./src/index.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","parseIntOr","defaultValue","length","isNaN","parseInt","parseFloatOr","parseFloat","stringIsEmpty","notEmptyStringOr","parseBoolean","leftPad","pad","diffLength","substr","Math","abs","substring","repeatTimes","floor","restLength","newPad","positionPropsDecoder","data","x","y","sizePropsDecoder","width","height","TypeError","modulePropsDecoder","__assign","moduleName","moduleDescription","agentProps","agentId","agent","agentName","agentAlias","agentDescription","agentAddress","metaconsoleId","agentPropsDecoder","linkedVCPropsDecoder","id","linkedLayoutId","linkedLayoutAgentId","linkedLayoutStatusProps","linkedLayoutStatusType","weight","linkedLayoutStatusTypeWeight","warningThreshold","linkedLayoutStatusTypeWarningThreshold","criticalThreshold","linkedLayoutStatusTypeCriticalThreshold","linkedLayoutBaseProps","itemMetaDecoder","receivedAt","Date","Number","getTime","error","Error","editMode","isFromCache","isFetching","isUpdating","prefixedCssRules","ruleName","ruleValue","rule","decodeBase64","input","decodeURIComponent","escape","window","atob","humanDate","date","locale","Intl","DateTimeFormat","day","month","year","format","getDate","getMonth","getFullYear","humanTime","getHours","getMinutes","getSeconds","replaceMacros","macros","text","reduce","acc","_a","macro","replace","throttle","delay","fn","last","args","_i","arguments","now","apply","debounce","timerRef","clearTimeout","setTimeout","getOffset","el","offsetLeft","offsetTop","scrollLeft","scrollTop","offsetParent","top","left","addMovementListener","element","onMoved","container","parentElement","isDraggable","draggable","lastX","lastY","lastMouseX","lastMouseY","mouseElementOffsetX","mouseElementOffsetY","containerBounds","getBoundingClientRect","containerOffset","containerTop","containerBottom","containerLeft","containerRight","elementBounds","borderWidth","getComputedStyle","borderFix","debouncedMovement","throttledMovement","handleMove","e","mouseX","pageX","mouseY","pageY","mouseDeltaX","mouseDeltaY","maxX","maxY","outOfBoundsLeft","outOfBoundsRight","outOfBoundsTop","outOfBoundsBottom","handleEnd","document","removeEventListener","body","style","userSelect","handleStart","stopPropagation","offsetX","offsetY","addEventListener","addResizementListener","onResized","resizeDraggable","createElement","className","appendChild","lastWidth","lastHeight","elementOffset","elementTop","elementLeft","debouncedResizement","throttledResizement","handleResize","remove","parseLabelPosition","labelPosition","itemBasePropsDecoder","type","label","_lib__WEBPACK_IMPORTED_MODULE_0__","isLinkEnabled","link","isOnTop","parentId","aclGroupId","VisualConsoleItem","props","metadata","_this","this","clickEventManager","_lib_TypedEvent__WEBPACK_IMPORTED_MODULE_1__","movedEventManager","resizedEventManager","removeEventManager","disposables","debouncedMovementSave","prevPosition","newPosition","positionChanged","move","emit","item","removeMovement","debouncedResizementSave","prevSize","newSize","sizeChanged","resize","removeResizement","itemProps","_metadata","elementRef","createContainerDomElement","labelElementRef","createLabelDomElement","childElementRef","createDomElement","append","resizeElement","changeLabelPosition","initMovementListener","moveElement","stopMovementListener","initResizementListener","labelWidth","labelHeight","stopResizementListener","box","href","zIndex","meta","preventDefault","nativeEvent","classList","add","getLabelWithMacrosReplaced","table","row","emptyRow1","emptyRow2","cell","innerHTML","textAlign","updateDomElement","newProps","prevProps","shouldBeUpdated","render","newMetadata","setMeta","prevMetadata","prevMeta","oldLabelHtml","newLabelHtml","attrs","attributes","nodeName","setAttributeNode","parentNode","replaceChild","forEach","disposable","dispose","ignored","position","flexDirection","tables","getElementsByTagName","onClick","listener","on","push","onRemove","__webpack_exports__","TypedEvent","listeners","listenersOncer","off","once","callbackIndex","indexOf","splice","event","pipe","te","eventsHistoryPropsDecoder","html","encodedHtml","_Item__WEBPACK_IMPORTED_MODULE_1__","maxTime","EventsHistory","_super","__extends","scripts","src","eval","trim","aux","donutGraphPropsDecoder","DonutGraph","barsGraphPropsDecoder","BarsGraph","moduleGraphPropsDecoder","ModuleGraph","legendP","margin","overviewGraphs","getElementsByClassName","parseShowLastValueTooltip","showLastValueTooltip","staticGraphPropsDecoder","imageSrc","Item","statusImageSrc","lib","lastValue","StaticGraph","imgSrc","background","backgroundSize","backgroundPosition","setAttribute","iconPropsDecoder","Icon_assign","Icon","Icon_extends","colorCloudPropsDecoder","color","ColorCloud_assign","ColorCloud_svgNS","ColorCloud","ColorCloud_extends","createSvgElement","gradientId","svg","createElementNS","defs","radialGradient","stop0","stop100","circle","groupPropsDecoder","groupId","showStatistics","extractHtml","Group_assign","Group","Group_extends","parseClockType","clockType","parseClockFormat","clockFormat","clockPropsDecoder","clockTimezone","Clock_assign","clockTimezoneOffset","showClockTimezone","items_Clock","Clock","intervalRef","startTick","createClock","TICK_INTERVAL","Clock_extends","stopTick","clearInterval","handler","interval","setInterval","getElementSize","newWidth","newHeight","createAnalogicClock","createDigitalClock","svgNS","colors","dateFontSize","baseTimeFontSize","div","clockFace","clockFaceBackground","city","getHumanTimezone","timezoneComplication","textContent","marksGroup","mainMarkGroup","mark1a","mark1b","mark","hourHand","hourHandA","hourHandB","minuteHand","minuteHandA","minuteHandB","minuteHandPin","secondHand","secondHandBar","secondHandPin","pin","getOriginDate","seconds","minutes","secAngle","minuteAngle","hourAngle","join","dateElem","fontSize","tzFontSizeMultiplier","timeFontSize","tzFontSize","min","timeElem","tzElem","initialDate","targetTZOffset","localTZOffset","getTimezoneOffset","utimestamp","timezone","_b","split","diameter","boxPropsDecoder","Box_assign","borderColor","fillColor","Box","Box_extends","boxSizing","backgroundColor","borderStyle","maxBorderWidth","linePropsDecoder","Line_assign","startPosition","startX","startY","endPosition","endX","endY","lineWidth","Line","extractBoxSizeAndPosition","Line_extends","toString","line","labelPropsDecoder","Label_assign","Label","Label_extends","parseValueType","valueType","parseProcessValue","processValue","simpleValuePropsDecoder","SimpleValue_assign","period","SimpleValue","SimpleValue_extends","img","pi","PI","tau","tauEpsilon","Path","_x0","_y0","_x1","_y1","_","path","constructor","moveTo","closePath","lineTo","quadraticCurveTo","x1","y1","bezierCurveTo","x2","y2","arcTo","x0","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","sqrt","l01","tan","acos","t01","t21","arc","a0","a1","ccw","dx","cos","dy","sin","cw","da","rect","w","h","src_path","constant","atan2","max","math_epsilon","math_pi","halfPi","math_tau","asin","arcInnerRadius","innerRadius","arcOuterRadius","outerRadius","arcStartAngle","startAngle","arcEndAngle","endAngle","arcPadAngle","padAngle","cornerTangents","r1","rc","lo","ox","oy","x11","y11","x10","y10","x00","y00","d2","D","cx0","cy0","cx1","cy1","dx0","dy0","dx1","dy1","cx","cy","src_arc","cornerRadius","padRadius","context","buffer","r0","t0","t1","a01","a11","a00","a10","da0","da1","ap","rp","rc0","rc1","p0","p1","oc","x3","y3","x32","y32","intersect","ax","ay","bx","by","kc","lc","centroid","a","Linear","_context","areaStart","_line","areaEnd","NaN","lineStart","_point","lineEnd","point","linear","curveRadial","Radial","curve","_curve","radial","Array","slice","kr","noop","that","Basis","BasisClosed","_x2","_x3","_x4","_y2","_y3","_y4","BasisOpen","Bundle","beta","_basis","_beta","_x","_y","j","custom","bundle","cardinal_point","_k","Cardinal","tension","cardinal","CardinalClosed","_x5","_y5","CardinalOpen","catmullRom_point","_l01_a","_l01_2a","_l12_a","_l12_2a","_l23_a","b","_l23_2a","CatmullRom","alpha","_alpha","x23","y23","pow","catmullRom","CatmullRomClosed","CatmullRomOpen","LinearClosed","sign","slope3","h0","h1","s0","s1","slope2","monotone_point","MonotoneX","MonotoneY","ReflectContext","Natural","controlPoints","_t0","px","py","i0","i1","Step","_t","extractPercentileType","extractValueType","percentilePropsDecoder","Percentile_assign","percentileType","minValue","maxValue","labelColor","unit","Percentile_svgNS","Percentile","Percentile_extends","formatValue","progress","getProgress","NumberFormat","backgroundRect","progressRect","backgroundCircle","progressCircle","arcProps","trunc","servicePropsDecoder","encodedTitle","serviceId","Service_assign","Service","Service_extends","itemInstanceFrom","items_StaticGraph","items_SimpleValue","items_Percentile","items_Label","items_Icon","items_Service","items_Group","items_Box","items_Line","items_ColorCloud","VisualConsole","items","elementsById","elementIds","relations","handleElementClick","handleElementMovement","handleElementResizement","handleElementRemove","filter","clearRelations","containerRef","_props","backgroundURL","isFavorite","relationLineWidth","VisualConsole_assign","visualConsolePropsDecoder","sort","itemInstance","console","log","message","buildRelations","map","updateElements","itemIds","decodeProps","backgroundImage","elements","parent_1","child","addRelationLine","itemId","ids","childId","getRelationLine","identifier","parent","clientWidth","clientHeight","onItemClick","onItemMoved","onItemResized","enableEditMode","disableEditMode","AsyncTaskManager_AsyncTask","AsyncTask","taskInitiator","cancellable","cancel","_status","statusChangeEventManager","status","init","onStatusChange","AsyncTaskManager","tasks","asyncTask","task","ref","asyncPeriodic","src_VisualConsole","lib_AsyncTaskManager"],"mappings":"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","file":"vc.main.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 9);\n","import {\n AnyObject,\n Position,\n Size,\n WithAgentProps,\n WithModuleProps,\n LinkedVisualConsoleProps,\n LinkedVisualConsolePropsStatus,\n UnknownObject,\n ItemMeta\n} from \"./types\";\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\nexport function parseIntOr(value: unknown, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.length > 0 && !isNaN(parseInt(value)))\n return parseInt(value);\n else return defaultValue;\n}\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\nexport function parseFloatOr(value: unknown, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (\n typeof value === \"string\" &&\n value.length > 0 &&\n !isNaN(parseFloat(value))\n )\n return parseFloat(value);\n else return defaultValue;\n}\n\n/**\n * Check if a string exists and it's not empty.\n * @param value Value to check.\n * @return The check result.\n */\nexport function stringIsEmpty(value?: string | null): boolean {\n return value == null || value.length === 0;\n}\n\n/**\n * Return a not empty string or a default value from a raw value.\n * @param value Raw value from which we will try to extract a non empty string.\n * @param defaultValue Default value to use if we cannot extract a non empty string.\n * @return A non empty string or the default value.\n */\nexport function notEmptyStringOr(\n value: unknown,\n defaultValue: T\n): string | T {\n return typeof value === \"string\" && value.length > 0 ? value : defaultValue;\n}\n\n/**\n * Return a boolean from a raw value.\n * @param value Raw value from which we will try to extract the boolean.\n * @return A valid boolean value. false by default.\n */\nexport function parseBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n else if (typeof value === \"number\") return value > 0;\n else if (typeof value === \"string\") return value === \"1\" || value === \"true\";\n else return false;\n}\n\n/**\n * Return a valid date or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid date.\n * @param defaultValue Default value to use if we cannot extract a valid date.\n * @return A valid date or the default value.\n */\nexport function parseDateOr(value: unknown, defaultValue: T): Date | T {\n if (value instanceof Date) return value;\n else if (typeof value === \"number\") return new Date(value * 1000);\n else if (\n typeof value === \"string\" &&\n !Number.isNaN(new Date(value).getTime())\n )\n return new Date(value);\n else return defaultValue;\n}\n\n/**\n * Pad the current string with another string (multiple times, if needed)\n * until the resulting string reaches the given length.\n * The padding is applied from the start (left) of the current string.\n * @param value Text that needs to be padded.\n * @param length Length of the returned text.\n * @param pad Text to add.\n * @return Padded text.\n */\nexport function leftPad(\n value: string | number,\n length: number,\n pad: string | number = \" \"\n): string {\n if (typeof value === \"number\") value = `${value}`;\n if (typeof pad === \"number\") pad = `${pad}`;\n\n const diffLength = length - value.length;\n if (diffLength === 0) return value;\n if (diffLength < 0) return value.substr(Math.abs(diffLength));\n\n if (diffLength === pad.length) return `${pad}${value}`;\n if (diffLength < pad.length) return `${pad.substring(0, diffLength)}${value}`;\n\n const repeatTimes = Math.floor(diffLength / pad.length);\n const restLength = diffLength - pad.length * repeatTimes;\n\n let newPad = \"\";\n for (let i = 0; i < repeatTimes; i++) newPad += pad;\n\n if (restLength === 0) return `${newPad}${value}`;\n return `${newPad}${pad.substring(0, restLength)}${value}`;\n}\n\n/* Decoders */\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the position.\n */\nexport function positionPropsDecoder(data: AnyObject): Position {\n return {\n x: parseIntOr(data.x, 0),\n y: parseIntOr(data.y, 0)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the size.\n * @throws Will throw a TypeError if the width and height are not valid numbers.\n */\nexport function sizePropsDecoder(data: AnyObject): Size | never {\n if (\n data.width == null ||\n isNaN(parseInt(data.width)) ||\n data.height == null ||\n isNaN(parseInt(data.height))\n ) {\n throw new TypeError(\"invalid size.\");\n }\n\n return {\n width: parseInt(data.width),\n height: parseInt(data.height)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the agent properties.\n */\nexport function agentPropsDecoder(data: AnyObject): WithAgentProps {\n const agentProps: WithAgentProps = {\n agentId: parseIntOr(data.agent, null),\n agentName: notEmptyStringOr(data.agentName, null),\n agentAlias: notEmptyStringOr(data.agentAlias, null),\n agentDescription: notEmptyStringOr(data.agentDescription, null),\n agentAddress: notEmptyStringOr(data.agentAddress, null)\n };\n\n return data.metaconsoleId != null\n ? {\n metaconsoleId: data.metaconsoleId,\n ...agentProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : agentProps;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the module and agent properties.\n */\nexport function modulePropsDecoder(data: AnyObject): WithModuleProps {\n return {\n moduleId: parseIntOr(data.moduleId, null),\n moduleName: notEmptyStringOr(data.moduleName, null),\n moduleDescription: notEmptyStringOr(data.moduleDescription, null),\n ...agentPropsDecoder(data) // Object spread: http://es6-features.org/#SpreadOperator\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the linked visual console properties.\n * @throws Will throw a TypeError if the status calculation properties are invalid.\n */\nexport function linkedVCPropsDecoder(\n data: AnyObject\n): LinkedVisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n metaconsoleId,\n linkedLayoutId: id,\n linkedLayoutAgentId: agentId\n } = data;\n\n let linkedLayoutStatusProps: LinkedVisualConsolePropsStatus = {\n linkedLayoutStatusType: \"default\"\n };\n switch (data.linkedLayoutStatusType) {\n case \"weight\": {\n const weight = parseIntOr(data.linkedLayoutStatusTypeWeight, null);\n if (weight == null)\n throw new TypeError(\"invalid status calculation properties.\");\n\n if (data.linkedLayoutStatusTypeWeight)\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"weight\",\n linkedLayoutStatusTypeWeight: weight\n };\n break;\n }\n case \"service\": {\n const warningThreshold = parseIntOr(\n data.linkedLayoutStatusTypeWarningThreshold,\n null\n );\n const criticalThreshold = parseIntOr(\n data.linkedLayoutStatusTypeCriticalThreshold,\n null\n );\n if (warningThreshold == null || criticalThreshold == null) {\n throw new TypeError(\"invalid status calculation properties.\");\n }\n\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"service\",\n linkedLayoutStatusTypeWarningThreshold: warningThreshold,\n linkedLayoutStatusTypeCriticalThreshold: criticalThreshold\n };\n break;\n }\n }\n\n const linkedLayoutBaseProps = {\n linkedLayoutId: parseIntOr(id, null),\n linkedLayoutAgentId: parseIntOr(agentId, null),\n ...linkedLayoutStatusProps // Object spread: http://es6-features.org/#SpreadOperator\n };\n\n return metaconsoleId != null\n ? {\n metaconsoleId,\n ...linkedLayoutBaseProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : linkedLayoutBaseProps;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the item's meta properties.\n */\nexport function itemMetaDecoder(data: UnknownObject): ItemMeta | never {\n const receivedAt = parseDateOr(data.receivedAt, null);\n if (receivedAt === null) throw new TypeError(\"invalid meta structure\");\n\n let error = null;\n if (data.error instanceof Error) error = data.error;\n else if (typeof data.error === \"string\") error = new Error(data.error);\n\n return {\n receivedAt,\n error,\n editMode: parseBoolean(data.editMode),\n isFromCache: parseBoolean(data.isFromCache),\n isFetching: false,\n isUpdating: false\n };\n}\n\n/**\n * To get a CSS rule with the most used prefixes.\n * @param ruleName Name of the CSS rule.\n * @param ruleValue Value of the CSS rule.\n * @return An array of rules with the prefixes applied.\n */\nexport function prefixedCssRules(\n ruleName: string,\n ruleValue: string\n): string[] {\n const rule = `${ruleName}: ${ruleValue};`;\n return [\n `-webkit-${rule}`,\n `-moz-${rule}`,\n `-ms-${rule}`,\n `-o-${rule}`,\n `${rule}`\n ];\n}\n\n/**\n * Decode a base64 string.\n * @param input Data encoded using base64.\n * @return Decoded data.\n */\nexport function decodeBase64(input: string): string {\n return decodeURIComponent(escape(window.atob(input)));\n}\n\n/**\n * Generate a date representation with the format 'd/m/Y'.\n * @param initialDate Date to be used instead of a generated one.\n * @param locale Locale to use if localization is required and available.\n * @example 24/02/2020.\n * @return Date representation.\n */\nexport function humanDate(date: Date, locale: string | null = null): string {\n if (locale && Intl && Intl.DateTimeFormat) {\n // Format using the user locale.\n const options: Intl.DateTimeFormatOptions = {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\"\n };\n return Intl.DateTimeFormat(locale, options).format(date);\n } else {\n // Use getDate, getDay returns the week day.\n const day = leftPad(date.getDate(), 2, 0);\n // The getMonth function returns the month starting by 0.\n const month = leftPad(date.getMonth() + 1, 2, 0);\n const year = leftPad(date.getFullYear(), 4, 0);\n\n // Format: 'd/m/Y'.\n return `${day}/${month}/${year}`;\n }\n}\n\n/**\n * Generate a time representation with the format 'hh:mm:ss'.\n * @param initialDate Date to be used instead of a generated one.\n * @example 01:34:09.\n * @return Time representation.\n */\nexport function humanTime(date: Date): string {\n const hours = leftPad(date.getHours(), 2, 0);\n const minutes = leftPad(date.getMinutes(), 2, 0);\n const seconds = leftPad(date.getSeconds(), 2, 0);\n\n return `${hours}:${minutes}:${seconds}`;\n}\n\ninterface Macro {\n macro: string | RegExp;\n value: string;\n}\n/**\n * Replace the macros of a text.\n * @param macros List of macros and their replacements.\n * @param text Text in which we need to replace the macros.\n */\nexport function replaceMacros(macros: Macro[], text: string): string {\n return macros.reduce(\n (acc, { macro, value }) => acc.replace(macro, value),\n text\n );\n}\n\n/**\n * Create a function which will limit the rate of execution of\n * the selected function to one time for the selected interval.\n * @param delay Interval.\n * @param fn Function to be executed at a limited rate.\n */\nexport function throttle(delay: number, fn: (...args: T[]) => R) {\n let last = 0;\n return (...args: T[]) => {\n const now = Date.now();\n if (now - last < delay) return;\n last = now;\n return fn(...args);\n };\n}\n\n/**\n * Create a function which will call the selected function only\n * after the interval time has passed after its last execution.\n * @param delay Interval.\n * @param fn Function to be executed after the last call.\n */\nexport function debounce(delay: number, fn: (...args: T[]) => void) {\n let timerRef: number | null = null;\n return (...args: T[]) => {\n if (timerRef !== null) window.clearTimeout(timerRef);\n timerRef = window.setTimeout(() => {\n fn(...args);\n timerRef = null;\n }, delay);\n };\n}\n\n/**\n * Retrieve the offset of an element relative to the page.\n * @param el Node used to calculate the offset.\n */\nfunction getOffset(el: HTMLElement | null) {\n let x = 0;\n let y = 0;\n while (el && !Number.isNaN(el.offsetLeft) && !Number.isNaN(el.offsetTop)) {\n x += el.offsetLeft - el.scrollLeft;\n y += el.offsetTop - el.scrollTop;\n el = el.offsetParent as HTMLElement | null;\n }\n return { top: y, left: x };\n}\n\n/**\n * Add the grab & move functionality to a certain element inside it's container.\n *\n * @param element Element to move.\n * @param onMoved Function to execute when the element moves.\n *\n * @return A function which will clean the event handlers when executed.\n */\nexport function addMovementListener(\n element: HTMLElement,\n onMoved: (x: Position[\"x\"], y: Position[\"y\"]) => void\n): Function {\n const container = element.parentElement as HTMLElement;\n // Store the initial draggable state.\n const isDraggable = element.draggable;\n // Init the coordinates.\n let lastX: Position[\"x\"] = 0;\n let lastY: Position[\"y\"] = 0;\n let lastMouseX: Position[\"x\"] = 0;\n let lastMouseY: Position[\"y\"] = 0;\n let mouseElementOffsetX: Position[\"x\"] = 0;\n let mouseElementOffsetY: Position[\"y\"] = 0;\n // Bounds.\n let containerBounds = container.getBoundingClientRect();\n let containerOffset = getOffset(container);\n let containerTop = containerOffset.top;\n let containerBottom = containerTop + containerBounds.height;\n let containerLeft = containerOffset.left;\n let containerRight = containerLeft + containerBounds.width;\n let elementBounds = element.getBoundingClientRect();\n let borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n let borderFix = Number.parseInt(borderWidth) * 2;\n\n // Will run onMoved 32ms after its last execution.\n const debouncedMovement = debounce(32, (x: Position[\"x\"], y: Position[\"y\"]) =>\n onMoved(x, y)\n );\n // Will run onMoved one time max every 16ms.\n const throttledMovement = throttle(16, (x: Position[\"x\"], y: Position[\"y\"]) =>\n onMoved(x, y)\n );\n\n const handleMove = (e: MouseEvent) => {\n // Calculate the new element coordinates.\n let x = 0;\n let y = 0;\n\n const mouseX = e.pageX;\n const mouseY = e.pageY;\n const mouseDeltaX = mouseX - lastMouseX;\n const mouseDeltaY = mouseY - lastMouseY;\n\n const minX = 0;\n const maxX = containerBounds.width - elementBounds.width + borderFix;\n const minY = 0;\n const maxY = containerBounds.height - elementBounds.height + borderFix;\n\n const outOfBoundsLeft =\n mouseX < containerLeft ||\n (lastX === 0 &&\n mouseDeltaX > 0 &&\n mouseX < containerLeft + mouseElementOffsetX);\n const outOfBoundsRight =\n mouseX > containerRight ||\n mouseDeltaX + lastX + elementBounds.width - borderFix >\n containerBounds.width ||\n (lastX === maxX &&\n mouseDeltaX < 0 &&\n mouseX > containerLeft + maxX + mouseElementOffsetX);\n const outOfBoundsTop =\n mouseY < containerTop ||\n (lastY === 0 &&\n mouseDeltaY > 0 &&\n mouseY < containerTop + mouseElementOffsetY);\n const outOfBoundsBottom =\n mouseY > containerBottom ||\n mouseDeltaY + lastY + elementBounds.height - borderFix >\n containerBounds.height ||\n (lastY === maxY &&\n mouseDeltaY < 0 &&\n mouseY > containerTop + maxY + mouseElementOffsetY);\n\n if (outOfBoundsLeft) x = minX;\n else if (outOfBoundsRight) x = maxX;\n else x = mouseDeltaX + lastX;\n\n if (outOfBoundsTop) y = minY;\n else if (outOfBoundsBottom) y = maxY;\n else y = mouseDeltaY + lastY;\n\n if (x < 0) x = minX;\n if (y < 0) y = minY;\n\n // Store the last mouse coordinates.\n lastMouseX = mouseX;\n lastMouseY = mouseY;\n\n if (x === lastX && y === lastY) return;\n\n // Run the movement events.\n throttledMovement(x, y);\n debouncedMovement(x, y);\n\n // Store the coordinates of the element.\n lastX = x;\n lastY = y;\n };\n const handleEnd = () => {\n // Reset the positions.\n lastX = 0;\n lastY = 0;\n lastMouseX = 0;\n lastMouseY = 0;\n // Remove the move event.\n document.removeEventListener(\"mousemove\", handleMove);\n // Clean itself.\n document.removeEventListener(\"mouseup\", handleEnd);\n // Reset the draggable property to its initial state.\n element.draggable = isDraggable;\n // Reset the body selection property to a default state.\n document.body.style.userSelect = \"auto\";\n };\n const handleStart = (e: MouseEvent) => {\n e.stopPropagation();\n\n // Disable the drag temporarily.\n element.draggable = false;\n\n // Store the difference between the cursor and\n // the initial coordinates of the element.\n lastX = element.offsetLeft;\n lastY = element.offsetTop;\n // Store the mouse position.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n // Store the relative position between the mouse and the element.\n mouseElementOffsetX = e.offsetX;\n mouseElementOffsetY = e.offsetY;\n\n // Initialize the bounds.\n containerBounds = container.getBoundingClientRect();\n containerOffset = getOffset(container);\n containerTop = containerOffset.top;\n containerBottom = containerTop + containerBounds.height;\n containerLeft = containerOffset.left;\n containerRight = containerLeft + containerBounds.width;\n elementBounds = element.getBoundingClientRect();\n borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n borderFix = Number.parseInt(borderWidth) * 2;\n\n // Listen to the mouse movement.\n document.addEventListener(\"mousemove\", handleMove);\n // Listen to the moment when the mouse click is not pressed anymore.\n document.addEventListener(\"mouseup\", handleEnd);\n // Limit the mouse selection of the body.\n document.body.style.userSelect = \"none\";\n };\n\n // Event to listen the init of the movement.\n element.addEventListener(\"mousedown\", handleStart);\n\n // Returns a function to clean the event listeners.\n return () => {\n element.removeEventListener(\"mousedown\", handleStart);\n handleEnd();\n };\n}\n\n/**\n * Add the grab & resize functionality to a certain element.\n *\n * @param element Element to move.\n * @param onResized Function to execute when the element is resized.\n *\n * @return A function which will clean the event handlers when executed.\n */\nexport function addResizementListener(\n element: HTMLElement,\n onResized: (x: Position[\"x\"], y: Position[\"y\"]) => void\n): Function {\n const minWidth = 15;\n const minHeight = 15;\n\n const resizeDraggable = document.createElement(\"div\");\n resizeDraggable.className = \"resize-draggable\";\n element.appendChild(resizeDraggable);\n\n // Container of the resizable element.\n const container = element.parentElement as HTMLElement;\n // Store the initial draggable state.\n const isDraggable = element.draggable;\n // Init the coordinates.\n let lastWidth: Size[\"width\"] = 0;\n let lastHeight: Size[\"height\"] = 0;\n let lastMouseX: Position[\"x\"] = 0;\n let lastMouseY: Position[\"y\"] = 0;\n let mouseElementOffsetX: Position[\"x\"] = 0;\n let mouseElementOffsetY: Position[\"y\"] = 0;\n // Init the bounds.\n let containerBounds = container.getBoundingClientRect();\n let containerOffset = getOffset(container);\n let containerTop = containerOffset.top;\n let containerBottom = containerTop + containerBounds.height;\n let containerLeft = containerOffset.left;\n let containerRight = containerLeft + containerBounds.width;\n let elementOffset = getOffset(element);\n let elementTop = elementOffset.top;\n let elementLeft = elementOffset.left;\n let borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n let borderFix = Number.parseInt(borderWidth);\n\n // Will run onResized 32ms after its last execution.\n const debouncedResizement = debounce(\n 32,\n (width: Size[\"width\"], height: Size[\"height\"]) => onResized(width, height)\n );\n // Will run onResized one time max every 16ms.\n const throttledResizement = throttle(\n 16,\n (width: Size[\"width\"], height: Size[\"height\"]) => onResized(width, height)\n );\n\n const handleResize = (e: MouseEvent) => {\n // Calculate the new element coordinates.\n let width = lastWidth + (e.pageX - lastMouseX);\n let height = lastHeight + (e.pageY - lastMouseY);\n\n if (width === lastWidth && height === lastHeight) return;\n\n if (\n width < lastWidth &&\n e.pageX > elementLeft + (lastWidth - mouseElementOffsetX)\n )\n return;\n\n if (width < minWidth) {\n // Minimum value.\n width = minWidth;\n } else if (width + elementLeft - borderFix / 2 >= containerRight) {\n // Limit the size to the container.\n width = containerRight - elementLeft;\n }\n if (height < minHeight) {\n // Minimum value.\n height = minHeight;\n } else if (height + elementTop - borderFix / 2 >= containerBottom) {\n // Limit the size to the container.\n height = containerBottom - elementTop;\n }\n\n // Run the movement events.\n throttledResizement(width, height);\n debouncedResizement(width, height);\n\n // Store the coordinates of the element.\n lastWidth = width;\n lastHeight = height;\n // Store the last mouse coordinates.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n };\n const handleEnd = () => {\n // Reset the positions.\n lastWidth = 0;\n lastHeight = 0;\n lastMouseX = 0;\n lastMouseY = 0;\n mouseElementOffsetX = 0;\n mouseElementOffsetY = 0;\n // Remove the move event.\n document.removeEventListener(\"mousemove\", handleResize);\n // Clean itself.\n document.removeEventListener(\"mouseup\", handleEnd);\n // Reset the draggable property to its initial state.\n element.draggable = isDraggable;\n // Reset the body selection property to a default state.\n document.body.style.userSelect = \"auto\";\n };\n const handleStart = (e: MouseEvent) => {\n e.stopPropagation();\n\n // Disable the drag temporarily.\n element.draggable = false;\n\n // Store the difference between the cursor and\n // the initial coordinates of the element.\n const { width, height } = element.getBoundingClientRect();\n lastWidth = width;\n lastHeight = height;\n // Store the mouse position.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n // Store the relative position between the mouse and the element.\n mouseElementOffsetX = e.offsetX;\n mouseElementOffsetY = e.offsetY;\n\n // Initialize the bounds.\n containerBounds = container.getBoundingClientRect();\n containerOffset = getOffset(container);\n containerTop = containerOffset.top;\n containerBottom = containerTop + containerBounds.height;\n containerLeft = containerOffset.left;\n containerRight = containerLeft + containerBounds.width;\n elementOffset = getOffset(element);\n elementTop = elementOffset.top;\n elementLeft = elementOffset.left;\n\n // Listen to the mouse movement.\n document.addEventListener(\"mousemove\", handleResize);\n // Listen to the moment when the mouse click is not pressed anymore.\n document.addEventListener(\"mouseup\", handleEnd);\n // Limit the mouse selection of the body.\n document.body.style.userSelect = \"none\";\n };\n\n // Event to listen the init of the movement.\n resizeDraggable.addEventListener(\"mousedown\", handleStart);\n\n // Returns a function to clean the event listeners.\n return () => {\n resizeDraggable.remove();\n handleEnd();\n };\n}\n","import {\n Position,\n Size,\n AnyObject,\n WithModuleProps,\n ItemMeta\n} from \"./lib/types\";\nimport {\n sizePropsDecoder,\n positionPropsDecoder,\n parseIntOr,\n parseBoolean,\n notEmptyStringOr,\n replaceMacros,\n humanDate,\n humanTime,\n addMovementListener,\n debounce,\n addResizementListener\n} from \"./lib\";\nimport TypedEvent, { Listener, Disposable } from \"./lib/TypedEvent\";\n\n// Enum: https://www.typescriptlang.org/docs/handbook/enums.html.\nexport const enum ItemType {\n STATIC_GRAPH = 0,\n MODULE_GRAPH = 1,\n SIMPLE_VALUE = 2,\n PERCENTILE_BAR = 3,\n LABEL = 4,\n ICON = 5,\n SIMPLE_VALUE_MAX = 6,\n SIMPLE_VALUE_MIN = 7,\n SIMPLE_VALUE_AVG = 8,\n PERCENTILE_BUBBLE = 9,\n SERVICE = 10,\n GROUP_ITEM = 11,\n BOX_ITEM = 12,\n LINE_ITEM = 13,\n AUTO_SLA_GRAPH = 14,\n CIRCULAR_PROGRESS_BAR = 15,\n CIRCULAR_INTERIOR_PROGRESS_BAR = 16,\n DONUT_GRAPH = 17,\n BARS_GRAPH = 18,\n CLOCK = 19,\n COLOR_CLOUD = 20\n}\n\n// Base item properties. This interface should be extended by the item implementations.\nexport interface ItemProps extends Position, Size {\n readonly id: number;\n readonly type: ItemType;\n label: string | null;\n labelPosition: \"up\" | \"right\" | \"down\" | \"left\";\n isLinkEnabled: boolean;\n link: string | null;\n isOnTop: boolean;\n parentId: number | null;\n aclGroupId: number | null;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemClickEvent {\n // data: Props;\n data: AnyObject;\n nativeEvent: Event;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemRemoveEvent {\n // data: Props;\n data: AnyObject;\n}\n\nexport interface ItemMovedEvent {\n item: VisualConsoleItem;\n prevPosition: Position;\n newPosition: Position;\n}\n\nexport interface ItemResizedEvent {\n item: VisualConsoleItem;\n prevSize: Size;\n newSize: Size;\n}\n\n/**\n * Extract a valid enum value from a raw label positi9on value.\n * @param labelPosition Raw value.\n */\nconst parseLabelPosition = (\n labelPosition: unknown\n): ItemProps[\"labelPosition\"] => {\n switch (labelPosition) {\n case \"up\":\n case \"right\":\n case \"down\":\n case \"left\":\n return labelPosition;\n default:\n return \"down\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function itemBasePropsDecoder(data: AnyObject): ItemProps | never {\n if (data.id == null || isNaN(parseInt(data.id))) {\n throw new TypeError(\"invalid id.\");\n }\n if (data.type == null || isNaN(parseInt(data.type))) {\n throw new TypeError(\"invalid type.\");\n }\n\n return {\n id: parseInt(data.id),\n type: parseInt(data.type),\n label: notEmptyStringOr(data.label, null),\n labelPosition: parseLabelPosition(data.labelPosition),\n isLinkEnabled: parseBoolean(data.isLinkEnabled),\n link: notEmptyStringOr(data.link, null),\n isOnTop: parseBoolean(data.isOnTop),\n parentId: parseIntOr(data.parentId, null),\n aclGroupId: parseIntOr(data.aclGroupId, null),\n ...sizePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...positionPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\n/**\n * Base class of the visual console items. Should be extended to use its capabilities.\n */\nabstract class VisualConsoleItem {\n // Properties of the item.\n private itemProps: Props;\n // Metadata of the item.\n private _metadata: ItemMeta;\n // Reference to the DOM element which will contain the item.\n public elementRef: HTMLElement;\n public readonly labelElementRef: HTMLElement;\n // Reference to the DOM element which will contain the view of the item which extends this class.\n protected readonly childElementRef: HTMLElement;\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent>();\n // Event manager for moved events.\n private readonly movedEventManager = new TypedEvent();\n // Event manager for resized events.\n private readonly resizedEventManager = new TypedEvent();\n // Event manager for remove events.\n private readonly removeEventManager = new TypedEvent<\n ItemRemoveEvent\n >();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n // This function will only run the 2nd arg function after the time\n // of the first arg have passed after its last execution.\n private debouncedMovementSave = debounce(\n 500, // ms.\n (x: Position[\"x\"], y: Position[\"y\"]) => {\n const prevPosition = {\n x: this.props.x,\n y: this.props.y\n };\n const newPosition = {\n x: x,\n y: y\n };\n\n if (!this.positionChanged(prevPosition, newPosition)) return;\n\n // Save the new position to the props.\n this.move(x, y);\n // Emit the movement event.\n this.movedEventManager.emit({\n item: this,\n prevPosition: prevPosition,\n newPosition: newPosition\n });\n }\n );\n // This property will store the function\n // to clean the movement listener.\n private removeMovement: Function | null = null;\n\n /**\n * Start the movement funtionality.\n * @param element Element to move inside its container.\n */\n private initMovementListener(element: HTMLElement): void {\n this.removeMovement = addMovementListener(\n element,\n (x: Position[\"x\"], y: Position[\"y\"]) => {\n // Move the DOM element.\n this.moveElement(x, y);\n // Run the save function.\n this.debouncedMovementSave(x, y);\n }\n );\n }\n /**\n * Stop the movement fun\n */\n private stopMovementListener(): void {\n if (this.removeMovement) {\n this.removeMovement();\n this.removeMovement = null;\n }\n }\n\n // This function will only run the 2nd arg function after the time\n // of the first arg have passed after its last execution.\n private debouncedResizementSave = debounce(\n 500, // ms.\n (width: Size[\"width\"], height: Size[\"height\"]) => {\n const prevSize = {\n width: this.props.width,\n height: this.props.height\n };\n const newSize = {\n width: width,\n height: height\n };\n\n if (!this.sizeChanged(prevSize, newSize)) return;\n\n // Save the new position to the props.\n this.resize(width, height);\n // Emit the resizement event.\n this.resizedEventManager.emit({\n item: this,\n prevSize: prevSize,\n newSize: newSize\n });\n }\n );\n // This property will store the function\n // to clean the resizement listener.\n private removeResizement: Function | null = null;\n\n /**\n * Start the resizement funtionality.\n * @param element Element to move inside its container.\n */\n protected initResizementListener(element: HTMLElement): void {\n this.removeResizement = addResizementListener(\n element,\n (width: Size[\"width\"], height: Size[\"height\"]) => {\n // The label it's outside the item's size, so we need\n // to get rid of its size to get the real size of the\n // item's content.\n if (this.props.label && this.props.label.length > 0) {\n const {\n width: labelWidth,\n height: labelHeight\n } = this.labelElementRef.getBoundingClientRect();\n\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n height -= labelHeight;\n break;\n case \"left\":\n case \"right\":\n width -= labelWidth;\n break;\n }\n }\n\n // Move the DOM element.\n this.resizeElement(width, height);\n // Run the save function.\n this.debouncedResizementSave(width, height);\n }\n );\n }\n /**\n * Stop the resizement functionality.\n */\n private stopResizementListener(): void {\n if (this.removeResizement) {\n this.removeResizement();\n this.removeResizement = null;\n }\n }\n\n /**\n * To create a new element which will be inside the item box.\n * @return Item.\n */\n protected abstract createDomElement(): HTMLElement;\n\n public constructor(props: Props, metadata: ItemMeta) {\n this.itemProps = props;\n this._metadata = metadata;\n\n /*\n * Get a HTMLElement which represents the container box\n * of the Visual Console item. This element will manage\n * all the common things like click events, show a border\n * when hovered, etc.\n */\n this.elementRef = this.createContainerDomElement();\n this.labelElementRef = this.createLabelDomElement();\n\n /*\n * Get a HTMLElement which represents the custom view\n * of the Visual Console item. This element will be\n * different depending on the item implementation.\n */\n this.childElementRef = this.createDomElement();\n\n // Insert the elements into the container.\n this.elementRef.append(this.childElementRef, this.labelElementRef);\n\n // Resize element.\n this.resizeElement(props.width, props.height);\n // Set label position.\n this.changeLabelPosition(props.labelPosition);\n }\n\n /**\n * To create a new box for the visual console item.\n * @return Item box.\n */\n private createContainerDomElement(): HTMLElement {\n let box;\n if (this.props.isLinkEnabled) {\n box = document.createElement(\"a\") as HTMLAnchorElement;\n if (this.props.link) box.href = this.props.link;\n } else {\n box = document.createElement(\"div\") as HTMLDivElement;\n }\n\n box.className = \"visual-console-item\";\n box.style.zIndex = this.props.isOnTop ? \"2\" : \"1\";\n box.style.left = `${this.props.x}px`;\n box.style.top = `${this.props.y}px`;\n // Init the click listener.\n box.addEventListener(\"click\", e => {\n if (this.meta.editMode) {\n e.preventDefault();\n e.stopPropagation();\n } else {\n this.clickEventManager.emit({ data: this.props, nativeEvent: e });\n }\n });\n\n // Metadata state.\n if (this.meta.editMode) {\n box.classList.add(\"is-editing\");\n // Init the movement listener.\n this.initMovementListener(box);\n // Init the resizement listener.\n this.initResizementListener(box);\n }\n if (this.meta.isFetching) {\n box.classList.add(\"is-fetching\");\n }\n if (this.meta.isUpdating) {\n box.classList.add(\"is-updating\");\n }\n\n return box;\n }\n\n /**\n * To create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Add the label if it exists.\n const label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n // Ugly table we need to use to replicate the legacy style.\n const table = document.createElement(\"table\");\n const row = document.createElement(\"tr\");\n const emptyRow1 = document.createElement(\"tr\");\n const emptyRow2 = document.createElement(\"tr\");\n const cell = document.createElement(\"td\");\n\n cell.innerHTML = label;\n row.append(cell);\n table.append(emptyRow1, row, emptyRow2);\n table.style.textAlign = \"center\";\n\n // Change the table size depending on its position.\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n\n // element.innerHTML = this.props.label;\n element.append(table);\n }\n\n return element;\n }\n\n /**\n * Return the label stored into the props with some macros replaced.\n */\n protected getLabelWithMacrosReplaced(): string {\n // We assert that the props may have some needed properties.\n const props = this.props as Partial;\n\n return replaceMacros(\n [\n {\n macro: \"_date_\",\n value: humanDate(new Date())\n },\n {\n macro: \"_time_\",\n value: humanTime(new Date())\n },\n {\n macro: \"_agent_\",\n value: props.agentAlias != null ? props.agentAlias : \"\"\n },\n {\n macro: \"_agentdescription_\",\n value: props.agentDescription != null ? props.agentDescription : \"\"\n },\n {\n macro: \"_address_\",\n value: props.agentAddress != null ? props.agentAddress : \"\"\n },\n {\n macro: \"_module_\",\n value: props.moduleName != null ? props.moduleName : \"\"\n },\n {\n macro: \"_moduledescription_\",\n value: props.moduleDescription != null ? props.moduleDescription : \"\"\n }\n ],\n this.props.label || \"\"\n );\n }\n\n /**\n * To update the content element.\n * @return Item.\n */\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.createDomElement().innerHTML;\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): Props {\n return { ...this.itemProps }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: Props) {\n const prevProps = this.props;\n // Update the internal props.\n this.itemProps = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Check if we should re-render.\n if (this.shouldBeUpdated(prevProps, newProps))\n this.render(prevProps, this._metadata);\n }\n\n /**\n * Public accessor of the `meta` property.\n * @return Properties.\n */\n public get meta(): ItemMeta {\n return { ...this._metadata }; // Return a copy.\n }\n\n /**\n * Public setter of the `meta` property.\n * If the new meta are different enough than the\n * stored meta, a render would be fired.\n * @param newProps\n */\n public set meta(newMetadata: ItemMeta) {\n this.setMeta(newMetadata);\n }\n\n /**\n * Clasic and protected version of the setter of the `meta` property.\n * Useful to override it from children classes.\n * @param newProps\n */\n protected setMeta(newMetadata: ItemMeta) {\n const prevMetadata = this._metadata;\n // Update the internal meta.\n this._metadata = newMetadata;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Check if we should re-render.\n // if (this.shouldBeUpdated(prevMetadata, newMetadata))\n this.render(this.itemProps, prevMetadata);\n }\n\n /**\n * To compare the previous and the new props and returns a boolean value\n * in case the difference is meaningfull enough to perform DOM changes.\n *\n * Here, the only comparision is done by reference.\n *\n * Override this function to perform a different comparision depending on the item needs.\n *\n * @param prevProps\n * @param newProps\n * @return Whether the difference is meaningful enough to perform DOM changes or not.\n */\n protected shouldBeUpdated(prevProps: Props, newProps: Props): boolean {\n return prevProps !== newProps;\n }\n\n /**\n * To recreate or update the HTMLElement which represents the item into the DOM.\n * @param prevProps If exists it will be used to only perform DOM updates instead of a full replace.\n */\n public render(\n prevProps: Props | null = null,\n prevMeta: ItemMeta | null = null\n ): void {\n this.updateDomElement(this.childElementRef);\n\n // Move box.\n if (!prevProps || this.positionChanged(prevProps, this.props)) {\n this.moveElement(this.props.x, this.props.y);\n }\n // Resize box.\n if (!prevProps || this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n // Change label.\n const oldLabelHtml = this.labelElementRef.innerHTML;\n const newLabelHtml = this.createLabelDomElement().innerHTML;\n if (oldLabelHtml !== newLabelHtml) {\n this.labelElementRef.innerHTML = newLabelHtml;\n }\n // Change label position.\n if (!prevProps || prevProps.labelPosition !== this.props.labelPosition) {\n this.changeLabelPosition(this.props.labelPosition);\n }\n // Change link.\n if (\n prevProps &&\n (prevProps.isLinkEnabled !== this.props.isLinkEnabled ||\n (this.props.isLinkEnabled && prevProps.link !== this.props.link))\n ) {\n const container = this.createContainerDomElement();\n // Add the children of the old element.\n container.innerHTML = this.elementRef.innerHTML;\n // Copy the attributes.\n const attrs = this.elementRef.attributes;\n for (let i = 0; i < attrs.length; i++) {\n if (attrs[i].nodeName !== \"id\") {\n container.setAttributeNode(attrs[i]);\n }\n }\n // Replace the reference.\n if (this.elementRef.parentNode !== null) {\n this.elementRef.parentNode.replaceChild(container, this.elementRef);\n }\n\n // Changed the reference to the main element. It's ugly, but needed.\n this.elementRef = container;\n }\n\n // Change metadata related things.\n if (!prevMeta || prevMeta.editMode !== this.meta.editMode) {\n if (this.meta.editMode) {\n this.elementRef.classList.add(\"is-editing\");\n this.initMovementListener(this.elementRef);\n this.initResizementListener(this.elementRef);\n } else {\n this.elementRef.classList.remove(\"is-editing\");\n this.stopMovementListener();\n this.stopResizementListener();\n }\n }\n if (!prevMeta || prevMeta.isFetching !== this.meta.isFetching) {\n if (this.meta.isFetching) {\n this.elementRef.classList.add(\"is-fetching\");\n } else {\n this.elementRef.classList.remove(\"is-fetching\");\n }\n }\n if (!prevMeta || prevMeta.isUpdating !== this.meta.isUpdating) {\n if (this.meta.isUpdating) {\n this.elementRef.classList.add(\"is-updating\");\n } else {\n this.elementRef.classList.remove(\"is-updating\");\n }\n }\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n // Call the remove event.\n this.removeEventManager.emit({ data: this.props });\n // Event listeners.\n this.disposables.forEach(disposable => {\n try {\n disposable.dispose();\n } catch (ignored) {} // eslint-disable-line no-empty\n });\n // VisualConsoleItem DOM element.\n this.elementRef.remove();\n }\n\n /**\n * Compare the previous and the new position and return\n * a boolean value in case the position changed.\n * @param prevPosition\n * @param newPosition\n * @return Whether the position changed or not.\n */\n protected positionChanged(\n prevPosition: Position,\n newPosition: Position\n ): boolean {\n return prevPosition.x !== newPosition.x || prevPosition.y !== newPosition.y;\n }\n\n /**\n * Move the label around the item content.\n * @param position Label position.\n */\n protected changeLabelPosition(position: Props[\"labelPosition\"]): void {\n switch (position) {\n case \"up\":\n this.elementRef.style.flexDirection = \"column-reverse\";\n break;\n case \"left\":\n this.elementRef.style.flexDirection = \"row-reverse\";\n break;\n case \"right\":\n this.elementRef.style.flexDirection = \"row\";\n break;\n case \"down\":\n default:\n this.elementRef.style.flexDirection = \"column\";\n break;\n }\n\n // Ugly table to show the label as its legacy counterpart.\n const tables = this.labelElementRef.getElementsByTagName(\"table\");\n const table = tables.length > 0 ? tables.item(0) : null;\n // Change the table size depending on its position.\n if (table) {\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n }\n }\n\n /**\n * Move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n protected moveElement(x: number, y: number): void {\n this.elementRef.style.left = `${x}px`;\n this.elementRef.style.top = `${y}px`;\n }\n\n /**\n * Update the position into the properties and move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n public move(x: number, y: number): void {\n this.moveElement(x, y);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n x,\n y\n };\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n protected sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n // The most valuable size is the content size.\n this.childElementRef.style.width = width > 0 ? `${width}px` : null;\n this.childElementRef.style.height = height > 0 ? `${height}px` : null;\n\n if (this.props.label && this.props.label.length > 0) {\n // Ugly table to show the label as its legacy counterpart.\n const tables = this.labelElementRef.getElementsByTagName(\"table\");\n const table = tables.length > 0 ? tables.item(0) : null;\n\n if (table) {\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n table.style.width = width > 0 ? `${width}px` : null;\n break;\n case \"left\":\n case \"right\":\n table.style.height = height > 0 ? `${height}px` : null;\n break;\n }\n }\n }\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.resizeElement(width, height);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onClick(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the movement of visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onMoved(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.movedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the resizement of visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onResized(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.resizedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the removal of the item.\n * @param listener Function which is going to be executed when a item is removed.\n */\n public onRemove(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.removeEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n\nexport default VisualConsoleItem;\n","export interface Listener {\n (event: T): void;\n}\n\nexport interface Disposable {\n dispose: () => void;\n}\n\n/** passes through events as they happen. You will not get events from before you start listening */\nexport default class TypedEvent {\n private listeners: Listener[] = [];\n private listenersOncer: Listener[] = [];\n\n public on = (listener: Listener): Disposable => {\n this.listeners.push(listener);\n return {\n dispose: () => this.off(listener)\n };\n };\n\n public once = (listener: Listener): void => {\n this.listenersOncer.push(listener);\n };\n\n public off = (listener: Listener): void => {\n const callbackIndex = this.listeners.indexOf(listener);\n if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1);\n };\n\n public emit = (event: T): void => {\n /** Update any general listeners */\n this.listeners.forEach(listener => listener(event));\n\n /** Clear the `once` queue */\n this.listenersOncer.forEach(listener => listener(event));\n this.listenersOncer = [];\n };\n\n public pipe = (te: TypedEvent): Disposable => this.on(e => te.emit(e));\n}\n","import { AnyObject, WithModuleProps } from \"../lib/types\";\nimport {\n modulePropsDecoder,\n parseIntOr,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type EventsHistoryProps = {\n type: ItemType.AUTO_SLA_GRAPH;\n maxTime: number | null;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the events history props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function eventsHistoryPropsDecoder(\n data: AnyObject\n): EventsHistoryProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.AUTO_SLA_GRAPH,\n maxTime: parseIntOr(data.maxTime, null),\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class EventsHistory extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"events-history\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type DonutGraphProps = {\n type: ItemType.DONUT_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the donut graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function donutGraphPropsDecoder(\n data: AnyObject\n): DonutGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.DONUT_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class DonutGraph extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"donut-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import { AnyObject, WithModuleProps } from \"../lib/types\";\nimport { modulePropsDecoder, decodeBase64, stringIsEmpty } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type BarsGraphProps = {\n type: ItemType.BARS_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the bars graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function barsGraphPropsDecoder(data: AnyObject): BarsGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BARS_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class BarsGraph extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"bars-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ModuleGraphProps = {\n type: ItemType.MODULE_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the module graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function moduleGraphPropsDecoder(\n data: AnyObject\n): ModuleGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.MODULE_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class ModuleGraph extends Item {\n /**\n * @override Item.resizeElement.\n * Resize the DOM content container.\n * We need to override the resize function cause this item's height\n * is larger than the configured and the graph is over the label.\n * @param width\n * @param height\n */\n protected resizeElement(width: number): void {\n super.resizeElement(width, 0);\n }\n\n /**\n * @override Item.initResizementListener. To disable the functionality.\n * Start the resizement funtionality.\n * @param element Element to move inside its container.\n */\n protected initResizementListener(): void {\n // No-Op. Disable the resizement functionality for this item.\n }\n\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"module-graph\";\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n AnyObject\n} from \"../lib/types\";\n\nimport {\n modulePropsDecoder,\n linkedVCPropsDecoder,\n notEmptyStringOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type StaticGraphProps = {\n type: ItemType.STATIC_GRAPH;\n imageSrc: string; // URL?\n showLastValueTooltip: \"default\" | \"enabled\" | \"disabled\";\n statusImageSrc: string | null; // URL?\n lastValue: string | null;\n} & ItemProps &\n (WithModuleProps | LinkedVisualConsoleProps);\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param showLastValueTooltip Raw value.\n */\nconst parseShowLastValueTooltip = (\n showLastValueTooltip: unknown\n): StaticGraphProps[\"showLastValueTooltip\"] => {\n switch (showLastValueTooltip) {\n case \"default\":\n case \"enabled\":\n case \"disabled\":\n return showLastValueTooltip;\n default:\n return \"default\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function staticGraphPropsDecoder(\n data: AnyObject\n): StaticGraphProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.STATIC_GRAPH,\n imageSrc: data.imageSrc,\n showLastValueTooltip: parseShowLastValueTooltip(data.showLastValueTooltip),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n lastValue: notEmptyStringOr(data.lastValue, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class StaticGraph extends Item {\n protected createDomElement(): HTMLElement {\n const imgSrc = this.props.statusImageSrc || this.props.imageSrc;\n const element = document.createElement(\"div\");\n element.className = \"static-graph\";\n element.style.background = `url(${imgSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n // Show last value in a tooltip.\n if (\n this.props.lastValue !== null &&\n this.props.showLastValueTooltip !== \"disabled\"\n ) {\n element.className = \"static-graph image forced_title\";\n element.setAttribute(\"data-use_title_for_force_title\", \"1\");\n element.setAttribute(\"data-title\", this.props.lastValue);\n }\n\n return element;\n }\n}\n","import { LinkedVisualConsoleProps, AnyObject } from \"../lib/types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type IconProps = {\n type: ItemType.ICON;\n imageSrc: string; // URL?\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the icon props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function iconPropsDecoder(data: AnyObject): IconProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.ICON,\n imageSrc: data.imageSrc,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Icon extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"icon\";\n element.style.background = `url(${this.props.imageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n return element;\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n AnyObject\n} from \"../lib/types\";\nimport { modulePropsDecoder, linkedVCPropsDecoder } from \"../lib\";\nimport Item, { itemBasePropsDecoder, ItemType, ItemProps } from \"../Item\";\n\nexport type ColorCloudProps = {\n type: ItemType.COLOR_CLOUD;\n color: string;\n // TODO: Add the rest of the color cloud values?\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function colorCloudPropsDecoder(\n data: AnyObject\n): ColorCloudProps | never {\n // TODO: Validate the color.\n if (typeof data.color !== \"string\" || data.color.length === 0) {\n throw new TypeError(\"invalid color.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.COLOR_CLOUD,\n color: data.color,\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class ColorCloud extends Item {\n protected createDomElement(): HTMLElement {\n const container: HTMLDivElement = document.createElement(\"div\");\n container.className = \"color-cloud\";\n\n // Add the SVG.\n container.append(this.createSvgElement());\n\n return container;\n }\n\n protected resizeElement(width: number): void {\n super.resizeElement(width, width);\n }\n\n public createSvgElement(): SVGSVGElement {\n const gradientId = `grad_${this.props.id}`;\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Defs.\n const defs = document.createElementNS(svgNS, \"defs\");\n // Radial gradient.\n const radialGradient = document.createElementNS(svgNS, \"radialGradient\");\n radialGradient.setAttribute(\"id\", gradientId);\n radialGradient.setAttribute(\"cx\", \"50%\");\n radialGradient.setAttribute(\"cy\", \"50%\");\n radialGradient.setAttribute(\"r\", \"50%\");\n radialGradient.setAttribute(\"fx\", \"50%\");\n radialGradient.setAttribute(\"fy\", \"50%\");\n // Stops.\n const stop0 = document.createElementNS(svgNS, \"stop\");\n stop0.setAttribute(\"offset\", \"0%\");\n stop0.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0.9`\n );\n const stop100 = document.createElementNS(svgNS, \"stop\");\n stop100.setAttribute(\"offset\", \"100%\");\n stop100.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0`\n );\n // Circle.\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.setAttribute(\"fill\", `url(#${gradientId})`);\n circle.setAttribute(\"cx\", \"50%\");\n circle.setAttribute(\"cy\", \"50%\");\n circle.setAttribute(\"r\", \"50%\");\n\n // Append elements.\n radialGradient.append(stop0, stop100);\n defs.append(radialGradient);\n svg.append(defs, circle);\n\n return svg;\n }\n}\n","import { LinkedVisualConsoleProps, AnyObject } from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n stringIsEmpty,\n decodeBase64,\n parseBoolean\n} from \"../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../Item\";\n\nexport type GroupProps = {\n type: ItemType.GROUP_ITEM;\n groupId: number;\n imageSrc: string | null; // URL?\n statusImageSrc: string | null;\n showStatistics: boolean;\n html?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\nfunction extractHtml(data: AnyObject): string | null {\n if (!stringIsEmpty(data.html)) return data.html;\n if (!stringIsEmpty(data.encodedHtml)) return decodeBase64(data.encodedHtml);\n return null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the group props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function groupPropsDecoder(data: AnyObject): GroupProps | never {\n if (\n (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) &&\n data.encodedHtml === null\n ) {\n throw new TypeError(\"invalid image src.\");\n }\n if (parseIntOr(data.groupId, null) === null) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n const showStatistics = parseBoolean(data.showStatistics);\n const html = showStatistics ? extractHtml(data) : null;\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.GROUP_ITEM,\n groupId: parseInt(data.groupId),\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n showStatistics,\n html,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Group extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"group\";\n\n if (!this.props.showStatistics && this.props.statusImageSrc !== null) {\n // Icon with status.\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.showStatistics && this.props.html != null) {\n // Stats table.\n element.innerHTML = this.props.html;\n }\n\n return element;\n }\n}\n","import \"./styles.css\";\n\nimport {\n LinkedVisualConsoleProps,\n AnyObject,\n Size,\n ItemMeta\n} from \"../../lib/types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n parseBoolean,\n prefixedCssRules,\n notEmptyStringOr,\n humanDate,\n humanTime\n} from \"../../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../../Item\";\n\nexport type ClockProps = {\n type: ItemType.CLOCK;\n clockType: \"analogic\" | \"digital\";\n clockFormat: \"datetime\" | \"time\";\n clockTimezone: string;\n clockTimezoneOffset: number; // Offset of the timezone to UTC in seconds.\n showClockTimezone: boolean;\n color?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockType Raw value.\n */\nconst parseClockType = (clockType: unknown): ClockProps[\"clockType\"] => {\n switch (clockType) {\n case \"analogic\":\n case \"digital\":\n return clockType;\n default:\n return \"analogic\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockFormat Raw value.\n */\nconst parseClockFormat = (clockFormat: unknown): ClockProps[\"clockFormat\"] => {\n switch (clockFormat) {\n case \"datetime\":\n case \"time\":\n return clockFormat;\n default:\n return \"datetime\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the clock props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function clockPropsDecoder(data: AnyObject): ClockProps | never {\n if (\n typeof data.clockTimezone !== \"string\" ||\n data.clockTimezone.length === 0\n ) {\n throw new TypeError(\"invalid timezone.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.CLOCK,\n clockType: parseClockType(data.clockType),\n clockFormat: parseClockFormat(data.clockFormat),\n clockTimezone: data.clockTimezone,\n clockTimezoneOffset: parseIntOr(data.clockTimezoneOffset, 0),\n showClockTimezone: parseBoolean(data.showClockTimezone),\n color: notEmptyStringOr(data.color, null),\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Clock extends Item {\n public static readonly TICK_INTERVAL = 1000; // In ms.\n private intervalRef: number | null = null;\n\n public constructor(props: ClockProps, meta: ItemMeta) {\n // Call the superclass constructor.\n super(props, meta);\n\n /* The item is already loaded and inserted into the DOM.\n * The class properties are now initialized.\n * Now you can modify the item, add event handlers, timers, etc.\n */\n\n /* The use of the arrow function is important here. startTick will\n * use the function passed as an argument to call the global setInterval\n * function. The interval, timeout or event functions, among other, are\n * called into another execution loop and using a different context.\n * The arrow functions, unlike the classic functions, doesn't create\n * their own context (this), so their context at execution time will be\n * use the current context at the declaration time.\n * http://es6-features.org/#Lexicalthis\n */\n this.startTick(\n () => {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n },\n /* The analogic clock doesn't need to tick,\n * but it will be refreshed every 20 seconds\n * to avoid a desync caused by page freezes.\n */\n this.props.clockType === \"analogic\" ? 20000 : Clock.TICK_INTERVAL\n );\n }\n\n /**\n * Wrap a window.clearInterval call.\n */\n private stopTick(): void {\n if (this.intervalRef !== null) {\n window.clearInterval(this.intervalRef);\n this.intervalRef = null;\n }\n }\n\n /**\n * Wrap a window.setInterval call.\n * @param handler Function to be called every time the interval\n * timer is reached.\n * @param interval Number in milliseconds for the interval timer.\n */\n private startTick(\n handler: TimerHandler,\n interval: number = Clock.TICK_INTERVAL\n ): void {\n this.stopTick();\n this.intervalRef = window.setInterval(handler, interval);\n }\n\n /**\n * Create a element which contains the DOM representation of the item.\n * @return DOM Element.\n * @override\n */\n protected createDomElement(): HTMLElement | never {\n return this.createClock();\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n * @override\n */\n public remove(): void {\n // Clear the interval.\n this.stopTick();\n // Call to the parent clean function.\n super.remove();\n }\n\n /**\n * @override Item.resizeElement\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n const { width: newWidth, height: newHeight } = this.getElementSize(\n width,\n height\n ); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n super.resizeElement(newWidth, newHeight);\n // Re-render the item to force it calculate a new font size.\n if (this.props.clockType === \"digital\") {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n }\n }\n\n /**\n * Create a element which contains a representation of a clock.\n * It choose between the clock types.\n * @return DOM Element.\n * @throws Error.\n */\n private createClock(): HTMLElement | never {\n switch (this.props.clockType) {\n case \"analogic\":\n return this.createAnalogicClock();\n case \"digital\":\n return this.createDigitalClock();\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n\n /**\n * Create a element which contains a representation of an analogic clock.\n * @return DOM Element.\n */\n private createAnalogicClock(): HTMLElement {\n const svgNS = \"http://www.w3.org/2000/svg\";\n const colors = {\n watchFace: \"#FFFFF0\",\n watchFaceBorder: \"#242124\",\n mark: \"#242124\",\n handDark: \"#242124\",\n handLight: \"#525252\",\n secondHand: \"#DC143C\"\n };\n\n const { width, height } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n\n const div = document.createElement(\"div\");\n div.className = \"analogic-clock\";\n div.style.width = `${width}px`;\n div.style.height = `${height}px`;\n\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Clock face.\n const clockFace = document.createElementNS(svgNS, \"g\");\n clockFace.setAttribute(\"class\", \"clockface\");\n const clockFaceBackground = document.createElementNS(svgNS, \"circle\");\n clockFaceBackground.setAttribute(\"cx\", \"50\");\n clockFaceBackground.setAttribute(\"cy\", \"50\");\n clockFaceBackground.setAttribute(\"r\", \"48\");\n clockFaceBackground.setAttribute(\"fill\", colors.watchFace);\n clockFaceBackground.setAttribute(\"stroke\", colors.watchFaceBorder);\n clockFaceBackground.setAttribute(\"stroke-width\", \"2\");\n clockFaceBackground.setAttribute(\"stroke-linecap\", \"round\");\n // Insert the clockface background into the clockface group.\n clockFace.append(clockFaceBackground);\n\n // Timezone complication.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const timezoneComplication = document.createElementNS(svgNS, \"text\");\n timezoneComplication.setAttribute(\"text-anchor\", \"middle\");\n timezoneComplication.setAttribute(\"font-size\", \"8\");\n timezoneComplication.setAttribute(\n \"transform\",\n \"translate(30 50) rotate(90)\" // Rotate to counter the clock rotation.\n );\n timezoneComplication.setAttribute(\"fill\", colors.mark);\n timezoneComplication.textContent = city;\n clockFace.append(timezoneComplication);\n }\n\n // Marks group.\n const marksGroup = document.createElementNS(svgNS, \"g\");\n marksGroup.setAttribute(\"class\", \"marks\");\n // Build the 12 hours mark.\n const mainMarkGroup = document.createElementNS(svgNS, \"g\");\n mainMarkGroup.setAttribute(\"class\", \"mark\");\n mainMarkGroup.setAttribute(\"transform\", \"translate(50 50)\");\n const mark1a = document.createElementNS(svgNS, \"line\");\n mark1a.setAttribute(\"x1\", \"36\");\n mark1a.setAttribute(\"y1\", \"0\");\n mark1a.setAttribute(\"x2\", \"46\");\n mark1a.setAttribute(\"y2\", \"0\");\n mark1a.setAttribute(\"stroke\", colors.mark);\n mark1a.setAttribute(\"stroke-width\", \"5\");\n const mark1b = document.createElementNS(svgNS, \"line\");\n mark1b.setAttribute(\"x1\", \"36\");\n mark1b.setAttribute(\"y1\", \"0\");\n mark1b.setAttribute(\"x2\", \"46\");\n mark1b.setAttribute(\"y2\", \"0\");\n mark1b.setAttribute(\"stroke\", colors.watchFace);\n mark1b.setAttribute(\"stroke-width\", \"1\");\n // Insert the 12 mark lines into their group.\n mainMarkGroup.append(mark1a, mark1b);\n // Insert the main mark into the marks group.\n marksGroup.append(mainMarkGroup);\n // Build the rest of the marks.\n for (let i = 1; i < 60; i++) {\n const mark = document.createElementNS(svgNS, \"line\");\n mark.setAttribute(\"y1\", \"0\");\n mark.setAttribute(\"y2\", \"0\");\n mark.setAttribute(\"stroke\", colors.mark);\n mark.setAttribute(\"transform\", `translate(50 50) rotate(${i * 6})`);\n\n if (i % 5 === 0) {\n mark.setAttribute(\"x1\", \"38\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", i % 15 === 0 ? \"2\" : \"1\");\n } else {\n mark.setAttribute(\"x1\", \"42\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", \"0.5\");\n }\n\n // Insert the mark into the marks group.\n marksGroup.append(mark);\n }\n\n /* Clock hands */\n\n // Hour hand.\n const hourHand = document.createElementNS(svgNS, \"g\");\n hourHand.setAttribute(\"class\", \"hour-hand\");\n hourHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const hourHandA = document.createElementNS(svgNS, \"line\");\n hourHandA.setAttribute(\"class\", \"hour-hand-a\");\n hourHandA.setAttribute(\"x1\", \"0\");\n hourHandA.setAttribute(\"y1\", \"0\");\n hourHandA.setAttribute(\"x2\", \"30\");\n hourHandA.setAttribute(\"y2\", \"0\");\n hourHandA.setAttribute(\"stroke\", colors.handLight);\n hourHandA.setAttribute(\"stroke-width\", \"4\");\n hourHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const hourHandB = document.createElementNS(svgNS, \"line\");\n hourHandB.setAttribute(\"class\", \"hour-hand-b\");\n hourHandB.setAttribute(\"x1\", \"0\");\n hourHandB.setAttribute(\"y1\", \"0\");\n hourHandB.setAttribute(\"x2\", \"29.9\");\n hourHandB.setAttribute(\"y2\", \"0\");\n hourHandB.setAttribute(\"stroke\", colors.handDark);\n hourHandB.setAttribute(\"stroke-width\", \"3.1\");\n hourHandB.setAttribute(\"stroke-linecap\", \"round\");\n // Append the elements to finish the hour hand.\n hourHand.append(hourHandA, hourHandB);\n\n // Minute hand.\n const minuteHand = document.createElementNS(svgNS, \"g\");\n minuteHand.setAttribute(\"class\", \"minute-hand\");\n minuteHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const minuteHandA = document.createElementNS(svgNS, \"line\");\n minuteHandA.setAttribute(\"class\", \"minute-hand-a\");\n minuteHandA.setAttribute(\"x1\", \"0\");\n minuteHandA.setAttribute(\"y1\", \"0\");\n minuteHandA.setAttribute(\"x2\", \"40\");\n minuteHandA.setAttribute(\"y2\", \"0\");\n minuteHandA.setAttribute(\"stroke\", colors.handLight);\n minuteHandA.setAttribute(\"stroke-width\", \"2\");\n minuteHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const minuteHandB = document.createElementNS(svgNS, \"line\");\n minuteHandB.setAttribute(\"class\", \"minute-hand-b\");\n minuteHandB.setAttribute(\"x1\", \"0\");\n minuteHandB.setAttribute(\"y1\", \"0\");\n minuteHandB.setAttribute(\"x2\", \"39.9\");\n minuteHandB.setAttribute(\"y2\", \"0\");\n minuteHandB.setAttribute(\"stroke\", colors.handDark);\n minuteHandB.setAttribute(\"stroke-width\", \"1.5\");\n minuteHandB.setAttribute(\"stroke-linecap\", \"round\");\n const minuteHandPin = document.createElementNS(svgNS, \"circle\");\n minuteHandPin.setAttribute(\"r\", \"3\");\n minuteHandPin.setAttribute(\"fill\", colors.handDark);\n // Append the elements to finish the minute hand.\n minuteHand.append(minuteHandA, minuteHandB, minuteHandPin);\n\n // Second hand.\n const secondHand = document.createElementNS(svgNS, \"g\");\n secondHand.setAttribute(\"class\", \"second-hand\");\n secondHand.setAttribute(\"transform\", \"translate(50 50)\");\n const secondHandBar = document.createElementNS(svgNS, \"line\");\n secondHandBar.setAttribute(\"x1\", \"0\");\n secondHandBar.setAttribute(\"y1\", \"0\");\n secondHandBar.setAttribute(\"x2\", \"46\");\n secondHandBar.setAttribute(\"y2\", \"0\");\n secondHandBar.setAttribute(\"stroke\", colors.secondHand);\n secondHandBar.setAttribute(\"stroke-width\", \"1\");\n secondHandBar.setAttribute(\"stroke-linecap\", \"round\");\n const secondHandPin = document.createElementNS(svgNS, \"circle\");\n secondHandPin.setAttribute(\"r\", \"2\");\n secondHandPin.setAttribute(\"fill\", colors.secondHand);\n // Append the elements to finish the second hand.\n secondHand.append(secondHandBar, secondHandPin);\n\n // Pin.\n const pin = document.createElementNS(svgNS, \"circle\");\n pin.setAttribute(\"cx\", \"50\");\n pin.setAttribute(\"cy\", \"50\");\n pin.setAttribute(\"r\", \"0.3\");\n pin.setAttribute(\"fill\", colors.handDark);\n\n // Get the hand angles.\n const date = this.getOriginDate();\n const seconds = date.getSeconds();\n const minutes = date.getMinutes();\n const hours = date.getHours();\n const secAngle = (360 / 60) * seconds;\n const minuteAngle = (360 / 60) * minutes + (360 / 60) * (seconds / 60);\n const hourAngle = (360 / 12) * hours + (360 / 12) * (minutes / 60);\n // Set the clock time by moving the hands.\n hourHand.setAttribute(\"transform\", `translate(50 50) rotate(${hourAngle})`);\n minuteHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${minuteAngle})`\n );\n secondHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${secAngle})`\n );\n\n // Build the clock\n svg.append(clockFace, marksGroup, hourHand, minuteHand, secondHand, pin);\n // Rotate the clock to its normal position.\n svg.setAttribute(\"transform\", \"rotate(-90)\");\n\n /* Add the animation declaration to the container.\n * Since the animation keyframes need to know the\n * start angle, this angle is dynamic (current time),\n * and we can't edit keyframes through javascript\n * safely and with backwards compatibility, we need\n * to inject it.\n */\n div.innerHTML = `\n \n `;\n // Add the clock to the container\n div.append(svg);\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n div.append(dateElem);\n }\n\n return div;\n }\n\n /**\n * Create a element which contains a representation of a digital clock.\n * @return DOM Element.\n */\n private createDigitalClock(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"digital-clock\";\n\n const { width } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const tzFontSizeMultiplier = 6 / this.props.clockTimezone.length;\n const timeFontSize = (baseTimeFontSize * width) / 100;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n const tzFontSize = Math.min(\n (baseTimeFontSize * tzFontSizeMultiplier * width) / 100,\n (width / 100) * 10\n );\n\n // Date calculated using the original timezone.\n const date = this.getOriginDate();\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n element.append(dateElem);\n }\n\n // Time.\n const timeElem: HTMLSpanElement = document.createElement(\"span\");\n timeElem.className = \"time\";\n timeElem.textContent = humanTime(date);\n timeElem.style.fontSize = `${timeFontSize}px`;\n if (this.props.color) timeElem.style.color = this.props.color;\n element.append(timeElem);\n\n // City name.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const tzElem: HTMLSpanElement = document.createElement(\"span\");\n tzElem.className = \"timezone\";\n tzElem.textContent = city;\n tzElem.style.fontSize = `${tzFontSize}px`;\n if (this.props.color) tzElem.style.color = this.props.color;\n element.append(tzElem);\n }\n\n return element;\n }\n\n /**\n * Generate the current date using the timezone offset stored into the properties.\n * @return The current date.\n */\n private getOriginDate(initialDate: Date | null = null): Date {\n const d = initialDate ? initialDate : new Date();\n const targetTZOffset = this.props.clockTimezoneOffset * 1000; // In ms.\n const localTZOffset = d.getTimezoneOffset() * 60 * 1000; // In ms.\n const utimestamp = d.getTime() + targetTZOffset + localTZOffset;\n\n return new Date(utimestamp);\n }\n\n /**\n * Extract a human readable city name from the timezone text.\n * @param timezone Timezone text.\n */\n public getHumanTimezone(timezone: string = this.props.clockTimezone): string {\n const [, city = \"\"] = timezone.split(\"/\");\n return city.replace(\"_\", \" \");\n }\n\n /**\n * Generate a element size using the current size and the default values.\n * @return The size.\n */\n private getElementSize(\n width: number = this.props.width,\n height: number = this.props.height\n ): Size {\n switch (this.props.clockType) {\n case \"analogic\": {\n let diameter = 100; // Default value.\n\n if (width > 0 && height > 0) {\n diameter = Math.min(width, height);\n } else if (width > 0) {\n diameter = width;\n } else if (height > 0) {\n diameter = height;\n }\n\n return {\n width: diameter,\n height: diameter\n };\n }\n case \"digital\": {\n if (width > 0 && height > 0) {\n // The proportion of the clock should be (width = height / 2) aproximately.\n height = width / 2 < height ? width / 2 : height;\n } else if (width > 0) {\n height = width / 2;\n } else if (height > 0) {\n // The proportion of the clock should be (height * 2 = width) aproximately.\n width = height * 2;\n } else {\n width = 100; // Default value.\n height = 50; // Default value.\n }\n\n return {\n width,\n height\n };\n }\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n}\n","import { AnyObject } from \"../lib/types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface BoxProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.BOX_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n borderWidth: number;\n borderColor: string | null;\n fillColor: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function boxPropsDecoder(data: AnyObject): BoxProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BOX_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Custom properties.\n borderWidth: parseIntOr(data.borderWidth, 0),\n borderColor: notEmptyStringOr(data.borderColor, null),\n fillColor: notEmptyStringOr(data.fillColor, null)\n };\n}\n\nexport default class Box extends Item {\n protected createDomElement(): HTMLElement {\n const box: HTMLDivElement = document.createElement(\"div\");\n box.className = \"box\";\n // To prevent this item to expand beyond its parent.\n box.style.boxSizing = \"border-box\";\n\n if (this.props.fillColor) {\n box.style.backgroundColor = this.props.fillColor;\n }\n\n // Border.\n if (this.props.borderWidth > 0) {\n box.style.borderStyle = \"solid\";\n // Control the max width to prevent this item to expand beyond its parent.\n const maxBorderWidth = Math.min(this.props.width, this.props.height) / 2;\n const borderWidth = Math.min(this.props.borderWidth, maxBorderWidth);\n box.style.borderWidth = `${borderWidth}px`;\n\n if (this.props.borderColor) {\n box.style.borderColor = this.props.borderColor;\n }\n }\n\n return box;\n }\n}\n","import { AnyObject, Position, Size, ItemMeta } from \"../lib/types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface LineProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.LINE_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n startPosition: Position;\n endPosition: Position;\n lineWidth: number;\n color: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function linePropsDecoder(data: AnyObject): LineProps | never {\n const props: LineProps = {\n ...itemBasePropsDecoder({ ...data, width: 1, height: 1 }), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LINE_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Initialize Position & Size.\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n // Custom properties.\n startPosition: {\n x: parseIntOr(data.startX, 0),\n y: parseIntOr(data.startY, 0)\n },\n endPosition: {\n x: parseIntOr(data.endX, 0),\n y: parseIntOr(data.endY, 0)\n },\n lineWidth: parseIntOr(data.lineWidth || data.borderWidth, 1),\n color: notEmptyStringOr(data.borderColor || data.color, null)\n };\n\n /*\n * We need to enhance the props with the extracted size and position\n * of the box cause there are missing at the props update. A better\n * solution would be overriding the props setter to do it there, but\n * the language doesn't allow it while targetting ES5.\n * TODO: We need to figure out a more consistent solution.\n */\n\n return {\n ...props,\n // Enhance the props extracting the box size and position.\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n ...Line.extractBoxSizeAndPosition(props)\n };\n}\n\nexport default class Line extends Item {\n /**\n * @override\n */\n public constructor(props: LineProps, meta: ItemMeta) {\n /*\n * We need to override the constructor cause we need to obtain\n * the\n * box size and position from the start and finish points\n * of the line.\n */\n super(\n {\n ...props,\n ...Line.extractBoxSizeAndPosition(props)\n },\n {\n ...meta,\n editMode: false\n }\n );\n }\n\n /**\n * Clasic and protected version of the setter of the `meta` property.\n * Useful to override it from children classes.\n * @param newProps\n * @override Item.setMeta\n */\n public setMeta(newMetadata: ItemMeta) {\n super.setMeta({\n ...newMetadata,\n editMode: false\n });\n }\n\n /**\n * @override\n * To create the item's DOM representation.\n * @return Item.\n */\n protected createDomElement(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"line\";\n\n const svgNS = \"http://www.w3.org/2000/svg\";\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Set SVG size.\n svg.setAttribute(\n \"width\",\n (this.props.width + this.props.lineWidth).toString()\n );\n svg.setAttribute(\n \"height\",\n (this.props.height + this.props.lineWidth).toString()\n );\n const line = document.createElementNS(svgNS, \"line\");\n line.setAttribute(\n \"x1\",\n `${this.props.startPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y1\",\n `${this.props.startPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"x2\",\n `${this.props.endPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y2\",\n `${this.props.endPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\"stroke\", this.props.color || \"black\");\n line.setAttribute(\"stroke-width\", this.props.lineWidth.toString());\n\n svg.append(line);\n element.append(svg);\n\n return element;\n }\n\n /**\n * Extract the size and position of the box from\n * the start and the finish of the line.\n * @param props Item properties.\n */\n public static extractBoxSizeAndPosition(props: LineProps): Size & Position {\n return {\n width: Math.abs(props.startPosition.x - props.endPosition.x),\n height: Math.abs(props.startPosition.y - props.endPosition.y),\n x: Math.min(props.startPosition.x, props.endPosition.x),\n y: Math.min(props.startPosition.y, props.endPosition.y)\n };\n }\n}\n","import { LinkedVisualConsoleProps, AnyObject } from \"../lib/types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type LabelProps = {\n type: ItemType.LABEL;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the label props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function labelPropsDecoder(data: AnyObject): LabelProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LABEL,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Label extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"label\";\n element.innerHTML = this.getLabelWithMacrosReplaced();\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n public createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","import {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n modulePropsDecoder,\n replaceMacros\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type SimpleValueProps = {\n type: ItemType.SIMPLE_VALUE;\n valueType: \"string\" | \"image\";\n value: string;\n} & (\n | {\n processValue: \"none\";\n }\n | {\n processValue: \"avg\" | \"max\" | \"min\";\n period: number;\n }) &\n ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw value type.\n * @param valueType Raw value.\n */\nconst parseValueType = (valueType: unknown): SimpleValueProps[\"valueType\"] => {\n switch (valueType) {\n case \"string\":\n case \"image\":\n return valueType;\n default:\n return \"string\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw process value.\n * @param processValue Raw value.\n */\nconst parseProcessValue = (\n processValue: unknown\n): SimpleValueProps[\"processValue\"] => {\n switch (processValue) {\n case \"none\":\n case \"avg\":\n case \"max\":\n case \"min\":\n return processValue;\n default:\n return \"none\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the simple value props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function simpleValuePropsDecoder(\n data: AnyObject\n): SimpleValueProps | never {\n if (typeof data.value !== \"string\" || data.value.length === 0) {\n throw new TypeError(\"invalid value\");\n }\n\n const processValue = parseProcessValue(data.processValue);\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SIMPLE_VALUE,\n valueType: parseValueType(data.valueType),\n value: data.value,\n ...(processValue === \"none\"\n ? { processValue }\n : { processValue, period: parseIntOr(data.period, 0) }), // Object spread. It will merge the properties of the two objects.\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class SimpleValue extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"simple-value\";\n\n if (this.props.valueType === \"image\") {\n const img = document.createElement(\"img\");\n img.src = this.props.value;\n element.append(img);\n } else {\n // Add the value to the label and show it.\n let text = this.props.value;\n let label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n text = replaceMacros([{ macro: /\\(?_VALUE_\\)?/i, value: text }], label);\n }\n\n element.innerHTML = text;\n }\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle.\n if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","import curveLinear from \"./linear\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n","export var slice = Array.prototype.slice;\n","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n","import {pi, tau} from \"../math\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","import {pi, tau} from \"../math\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n","export default function() {}\n","var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n","import noop from \"../noop\";\nimport {point} from \"./basis\";\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisClosed(context);\n}\n","import {point} from \"./basis\";\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisOpen(context);\n}\n","import {Basis} from \"./basis\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import noop from \"../noop\";\nimport {point} from \"./cardinal\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {point} from \"./cardinal\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {epsilon} from \"../math\";\nimport {Cardinal} from \"./cardinal\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalClosed} from \"./cardinalClosed\";\nimport noop from \"../noop\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalOpen} from \"./cardinalOpen\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import noop from \"../noop\";\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nexport default function(context) {\n return new LinearClosed(context);\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n","import ascending from \"./ascending\";\n\nexport default function(series) {\n return ascending(series).reverse();\n}\n","import { arc as arcFactory } from \"d3-shape\";\n\nimport {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n notEmptyStringOr,\n parseIntOr,\n parseFloatOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type PercentileProps = {\n type: ItemType.PERCENTILE_BAR;\n percentileType:\n | \"progress-bar\"\n | \"bubble\"\n | \"circular-progress-bar\"\n | \"circular-progress-bar-alt\";\n valueType: \"percent\" | \"value\";\n minValue: number | null;\n maxValue: number | null;\n color: string | null;\n labelColor: string | null;\n value: number | null;\n unit: string | null;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw type value.\n * @param type Raw value.\n */\nfunction extractPercentileType(\n type: unknown\n): PercentileProps[\"percentileType\"] {\n switch (type) {\n case \"progress-bar\":\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n return type;\n default:\n case ItemType.PERCENTILE_BAR:\n return \"progress-bar\";\n case ItemType.PERCENTILE_BUBBLE:\n return \"bubble\";\n case ItemType.CIRCULAR_PROGRESS_BAR:\n return \"circular-progress-bar\";\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return \"circular-progress-bar-alt\";\n }\n}\n\n/**\n * Extract a valid enum value from a raw value type value.\n * @param type Raw value.\n */\nfunction extractValueType(valueType: unknown): PercentileProps[\"valueType\"] {\n switch (valueType) {\n case \"percent\":\n case \"value\":\n return valueType;\n default:\n return \"percent\";\n }\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the percentile props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function percentilePropsDecoder(\n data: AnyObject\n): PercentileProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.PERCENTILE_BAR,\n percentileType: extractPercentileType(data.percentileType || data.type),\n valueType: extractValueType(data.valueType),\n minValue: parseIntOr(data.minValue, null),\n maxValue: parseIntOr(data.maxValue, null),\n color: notEmptyStringOr(data.color, null),\n labelColor: notEmptyStringOr(data.labelColor, null),\n value: parseFloatOr(data.value, null),\n unit: notEmptyStringOr(data.unit, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class Percentile extends Item {\n protected createDomElement(): HTMLElement {\n const colors = {\n background: \"#000000\",\n progress: this.props.color || \"#F0F0F0\",\n text: this.props.labelColor || \"#444444\"\n };\n // Progress.\n const progress = this.getProgress();\n // Main element.\n const element = document.createElement(\"div\");\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n\n var formatValue;\n if (this.props.value != null) {\n if (Intl) {\n formatValue = Intl.NumberFormat(\"en-EN\").format(this.props.value);\n } else {\n formatValue = this.props.value;\n }\n }\n\n switch (this.props.percentileType) {\n case \"progress-bar\":\n {\n const backgroundRect = document.createElementNS(svgNS, \"rect\");\n backgroundRect.setAttribute(\"fill\", colors.background);\n backgroundRect.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundRect.setAttribute(\"width\", \"100\");\n backgroundRect.setAttribute(\"height\", \"20\");\n backgroundRect.setAttribute(\"rx\", \"5\");\n backgroundRect.setAttribute(\"ry\", \"5\");\n const progressRect = document.createElementNS(svgNS, \"rect\");\n progressRect.setAttribute(\"fill\", colors.progress);\n progressRect.setAttribute(\"fill-opacity\", \"1\");\n progressRect.setAttribute(\"width\", `${progress}`);\n progressRect.setAttribute(\"height\", \"20\");\n progressRect.setAttribute(\"rx\", \"5\");\n progressRect.setAttribute(\"ry\", \"5\");\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"12\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"transform\", \"translate(50 11)\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\") {\n text.style.fontSize = \"6pt\";\n\n text.textContent = this.props.unit\n ? `${formatValue} ${this.props.unit}`\n : `${formatValue}`;\n } else {\n text.textContent = `${progress}%`;\n }\n\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 20\");\n svg.append(backgroundRect, progressRect, text);\n }\n break;\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n {\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n if (this.props.percentileType === \"bubble\") {\n // Create and append the circles.\n const backgroundCircle = document.createElementNS(svgNS, \"circle\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"r\", \"50\");\n const progressCircle = document.createElementNS(svgNS, \"circle\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\"r\", `${progress / 2}`);\n\n svg.append(backgroundCircle, progressCircle);\n } else {\n // Create and append the circles.\n const arcProps = {\n innerRadius:\n this.props.percentileType === \"circular-progress-bar\" ? 30 : 0,\n outerRadius: 50,\n startAngle: 0,\n endAngle: Math.PI * 2\n };\n const arc = arcFactory();\n\n const backgroundCircle = document.createElementNS(svgNS, \"path\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"d\", `${arc(arcProps)}`);\n const progressCircle = document.createElementNS(svgNS, \"path\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\n \"d\",\n `${arc({\n ...arcProps,\n endAngle: arcProps.endAngle * (progress / 100)\n })}`\n );\n\n svg.append(backgroundCircle, progressCircle);\n }\n\n // Create and append the text.\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"16\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\" && this.props.value != null) {\n // Show value and unit in 1 (no unit) or 2 lines.\n if (this.props.unit && this.props.unit.length > 0) {\n const value = document.createElementNS(svgNS, \"tspan\");\n value.setAttribute(\"x\", \"0\");\n value.setAttribute(\"dy\", \"1em\");\n value.textContent = `${formatValue}`;\n value.style.fontSize = \"8pt\";\n const unit = document.createElementNS(svgNS, \"tspan\");\n unit.setAttribute(\"x\", \"0\");\n unit.setAttribute(\"dy\", \"1em\");\n unit.textContent = `${this.props.unit}`;\n unit.style.fontSize = \"8pt\";\n text.append(value, unit);\n text.setAttribute(\"transform\", \"translate(50 33)\");\n } else {\n text.textContent = `${formatValue}`;\n text.style.fontSize = \"8pt\";\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n } else {\n // Percentage.\n text.textContent = `${progress}%`;\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n\n svg.append(text);\n }\n break;\n }\n\n element.append(svg);\n\n return element;\n }\n\n private getProgress(): number {\n const minValue = this.props.minValue || 0;\n const maxValue = this.props.maxValue || 100;\n const value = this.props.value == null ? 0 : this.props.value;\n\n if (value <= minValue) return 0;\n else if (value >= maxValue) return 100;\n else return Math.trunc(((value - minValue) / (maxValue - minValue)) * 100);\n }\n}\n","import { AnyObject } from \"../lib/types\";\nimport {\n stringIsEmpty,\n notEmptyStringOr,\n decodeBase64,\n parseIntOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ServiceProps = {\n type: ItemType.SERVICE;\n serviceId: number;\n imageSrc: string | null;\n statusImageSrc: string | null;\n encodedTitle: string | null;\n} & ItemProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the service props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function servicePropsDecoder(data: AnyObject): ServiceProps | never {\n if (data.imageSrc !== null) {\n if (\n typeof data.statusImageSrc !== \"string\" ||\n data.imageSrc.statusImageSrc === 0\n ) {\n throw new TypeError(\"invalid status image src.\");\n }\n } else {\n if (stringIsEmpty(data.encodedTitle)) {\n throw new TypeError(\"missing encode tittle content.\");\n }\n }\n\n if (parseIntOr(data.serviceId, null) === null) {\n throw new TypeError(\"invalid service id.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SERVICE,\n serviceId: data.serviceId,\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n encodedTitle: notEmptyStringOr(data.encodedTitle, null)\n };\n}\n\nexport default class Service extends Item {\n public createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"service\";\n\n if (this.props.statusImageSrc !== null) {\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.encodedTitle !== null) {\n element.innerHTML = decodeBase64(this.props.encodedTitle);\n }\n\n return element;\n }\n}\n","import { AnyObject, Size } from \"./lib/types\";\nimport {\n parseBoolean,\n sizePropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n itemMetaDecoder\n} from \"./lib\";\nimport Item, {\n ItemType,\n ItemProps,\n ItemClickEvent,\n ItemRemoveEvent,\n ItemMovedEvent,\n ItemResizedEvent\n} from \"./Item\";\nimport StaticGraph, { staticGraphPropsDecoder } from \"./items/StaticGraph\";\nimport Icon, { iconPropsDecoder } from \"./items/Icon\";\nimport ColorCloud, { colorCloudPropsDecoder } from \"./items/ColorCloud\";\nimport Group, { groupPropsDecoder } from \"./items/Group\";\nimport Clock, { clockPropsDecoder } from \"./items/Clock\";\nimport Box, { boxPropsDecoder } from \"./items/Box\";\nimport Line, { linePropsDecoder } from \"./items/Line\";\nimport Label, { labelPropsDecoder } from \"./items/Label\";\nimport SimpleValue, { simpleValuePropsDecoder } from \"./items/SimpleValue\";\nimport EventsHistory, {\n eventsHistoryPropsDecoder\n} from \"./items/EventsHistory\";\nimport Percentile, { percentilePropsDecoder } from \"./items/Percentile\";\nimport TypedEvent, { Disposable, Listener } from \"./lib/TypedEvent\";\nimport DonutGraph, { donutGraphPropsDecoder } from \"./items/DonutGraph\";\nimport BarsGraph, { barsGraphPropsDecoder } from \"./items/BarsGraph\";\nimport ModuleGraph, { moduleGraphPropsDecoder } from \"./items/ModuleGraph\";\nimport Service, { servicePropsDecoder } from \"./items/Service\";\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction itemInstanceFrom(data: AnyObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n const meta = itemMetaDecoder(data);\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return new StaticGraph(staticGraphPropsDecoder(data), meta);\n case ItemType.MODULE_GRAPH:\n return new ModuleGraph(moduleGraphPropsDecoder(data), meta);\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return new SimpleValue(simpleValuePropsDecoder(data), meta);\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return new Percentile(percentilePropsDecoder(data), meta);\n case ItemType.LABEL:\n return new Label(labelPropsDecoder(data), meta);\n case ItemType.ICON:\n return new Icon(iconPropsDecoder(data), meta);\n case ItemType.SERVICE:\n return new Service(servicePropsDecoder(data), meta);\n case ItemType.GROUP_ITEM:\n return new Group(groupPropsDecoder(data), meta);\n case ItemType.BOX_ITEM:\n return new Box(boxPropsDecoder(data), meta);\n case ItemType.LINE_ITEM:\n return new Line(linePropsDecoder(data), meta);\n case ItemType.AUTO_SLA_GRAPH:\n return new EventsHistory(eventsHistoryPropsDecoder(data), meta);\n case ItemType.DONUT_GRAPH:\n return new DonutGraph(donutGraphPropsDecoder(data), meta);\n case ItemType.BARS_GRAPH:\n return new BarsGraph(barsGraphPropsDecoder(data), meta);\n case ItemType.CLOCK:\n return new Clock(clockPropsDecoder(data), meta);\n case ItemType.COLOR_CLOUD:\n return new ColorCloud(colorCloudPropsDecoder(data), meta);\n default:\n throw new TypeError(\"item not found\");\n }\n}\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction decodeProps(data: AnyObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return staticGraphPropsDecoder(data);\n case ItemType.MODULE_GRAPH:\n return moduleGraphPropsDecoder(data);\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return simpleValuePropsDecoder(data);\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return percentilePropsDecoder(data);\n case ItemType.LABEL:\n return labelPropsDecoder(data);\n case ItemType.ICON:\n return iconPropsDecoder(data);\n case ItemType.SERVICE:\n return servicePropsDecoder(data);\n case ItemType.GROUP_ITEM:\n return groupPropsDecoder(data);\n case ItemType.BOX_ITEM:\n return boxPropsDecoder(data);\n case ItemType.LINE_ITEM:\n return linePropsDecoder(data);\n case ItemType.AUTO_SLA_GRAPH:\n return eventsHistoryPropsDecoder(data);\n case ItemType.DONUT_GRAPH:\n return donutGraphPropsDecoder(data);\n case ItemType.BARS_GRAPH:\n return barsGraphPropsDecoder(data);\n case ItemType.CLOCK:\n return clockPropsDecoder(data);\n case ItemType.COLOR_CLOUD:\n return colorCloudPropsDecoder(data);\n default:\n throw new TypeError(\"decoder not found\");\n }\n}\n\n// Base properties.\nexport interface VisualConsoleProps extends Size {\n readonly id: number;\n name: string;\n groupId: number;\n backgroundURL: string | null; // URL?\n backgroundColor: string | null;\n isFavorite: boolean;\n relationLineWidth: number;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the Visual Console props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function visualConsolePropsDecoder(\n data: AnyObject\n): VisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n id,\n name,\n groupId,\n backgroundURL,\n backgroundColor,\n isFavorite,\n relationLineWidth\n } = data;\n\n if (id == null || isNaN(parseInt(id))) {\n throw new TypeError(\"invalid Id.\");\n }\n if (typeof name !== \"string\" || name.length === 0) {\n throw new TypeError(\"invalid name.\");\n }\n if (groupId == null || isNaN(parseInt(groupId))) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n return {\n id: parseInt(id),\n name,\n groupId: parseInt(groupId),\n backgroundURL: notEmptyStringOr(backgroundURL, null),\n backgroundColor: notEmptyStringOr(backgroundColor, null),\n isFavorite: parseBoolean(isFavorite),\n relationLineWidth: parseIntOr(relationLineWidth, 0),\n ...sizePropsDecoder(data)\n };\n}\n\nexport default class VisualConsole {\n // Reference to the DOM element which will contain the items.\n private readonly containerRef: HTMLElement;\n // Properties.\n private _props: VisualConsoleProps;\n // Visual Console Item instances by their Id.\n private elementsById: {\n [key: number]: Item;\n } = {};\n // Visual Console Item Ids.\n private elementIds: ItemProps[\"id\"][] = [];\n // Dictionary which store the created lines.\n private relations: {\n [key: string]: Line;\n } = {};\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent<\n ItemClickEvent\n >();\n // Event manager for move events.\n private readonly movedEventManager = new TypedEvent();\n // Event manager for resize events.\n private readonly resizedEventManager = new TypedEvent();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n /**\n * React to a click on an element.\n * @param e Event object.\n */\n private handleElementClick: (e: ItemClickEvent) => void = e => {\n this.clickEventManager.emit(e);\n // console.log(`Clicked element #${e.data.id}`, e);\n };\n\n /**\n * React to a movement on an element.\n * @param e Event object.\n */\n private handleElementMovement: (e: ItemMovedEvent) => void = e => {\n this.movedEventManager.emit(e);\n // console.log(`Moved element #${e.item.props.id}`, e);\n };\n\n /**\n * React to a resizement on an element.\n * @param e Event object.\n */\n private handleElementResizement: (e: ItemResizedEvent) => void = e => {\n this.resizedEventManager.emit(e);\n // console.log(`Resized element #${e.item.props.id}`, e);\n };\n\n /**\n * Clear some element references.\n * @param e Event object.\n */\n private handleElementRemove: (e: ItemRemoveEvent) => void = e => {\n // Remove the element from the list and its relations.\n this.elementIds = this.elementIds.filter(id => id !== e.data.id);\n delete this.elementsById[e.data.id];\n this.clearRelations(e.data.id);\n };\n\n public constructor(\n container: HTMLElement,\n props: AnyObject,\n items: AnyObject[]\n ) {\n this.containerRef = container;\n this._props = visualConsolePropsDecoder(props);\n\n // Force the first render.\n this.render();\n\n // Sort by isOnTop, id ASC\n items = items.sort(function(a, b) {\n if (\n a.isOnTop == null ||\n b.isOnTop == null ||\n a.id == null ||\n b.id == null\n ) {\n return 0;\n }\n\n if (a.isOnTop && !b.isOnTop) return 1;\n else if (!a.isOnTop && b.isOnTop) return -1;\n else if (a.id > b.id) return 1;\n else return -1;\n });\n\n // Initialize the items.\n items.forEach(item => {\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n this.elementIds.push(itemInstance.props.id);\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onMoved(this.handleElementMovement);\n itemInstance.onResized(this.handleElementResizement);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n });\n\n // Create lines.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `elements` property.\n * @return Properties.\n */\n public get elements(): Item[] {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n return this.elementIds\n .map(id => this.elementsById[id])\n .filter(_ => _ != null) as Item[];\n }\n\n /**\n * Public setter of the `elements` property.\n * @param items.\n */\n public updateElements(items: AnyObject[]): void {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n const itemIds = items\n .map(item => item.id || null)\n .filter(id => id != null) as number[];\n // Get the elements we should delete.\n const deletedIds = this.elementIds.filter(id => itemIds.indexOf(id) < 0);\n // Delete the elements.\n deletedIds.forEach(id => {\n if (this.elementsById[id] != null) {\n this.elementsById[id].remove();\n delete this.elementsById[id];\n }\n });\n // Replace the element ids.\n this.elementIds = itemIds;\n\n // Initialize the items.\n items.forEach(item => {\n if (item.id) {\n if (this.elementsById[item.id] == null) {\n // New item.\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n } else {\n // Update item.\n try {\n this.elementsById[item.id].props = decodeProps(item);\n } catch (error) {\n console.log(\"Error updating an element:\", error.message);\n }\n }\n }\n });\n\n // Re-build relations.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): VisualConsoleProps {\n return { ...this._props }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: VisualConsoleProps) {\n const prevProps = this.props;\n // Update the internal props.\n this._props = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Re-render.\n this.render(prevProps);\n }\n\n /**\n * Recreate or update the HTMLElement which represents the Visual Console into the DOM.\n * @param prevProps If exists it will be used to only DOM updates instead of a full replace.\n */\n public render(prevProps: VisualConsoleProps | null = null): void {\n if (prevProps) {\n if (prevProps.backgroundURL !== this.props.backgroundURL) {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n }\n if (prevProps.backgroundColor !== this.props.backgroundColor) {\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n }\n if (this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n } else {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n this.resizeElement(this.props.width, this.props.height);\n }\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n public sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM container.\n * @param width\n * @param height\n */\n public resizeElement(width: number, height: number): void {\n this.containerRef.style.width = `${width}px`;\n this.containerRef.style.height = `${height}px`;\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.props = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n this.disposables.forEach(d => d.dispose()); // Arrow function.\n this.elements.forEach(e => e.remove()); // Arrow function.\n this.elementsById = {};\n this.elementIds = [];\n // Clear relations.\n this.clearRelations();\n // Clean container.\n this.containerRef.innerHTML = \"\";\n }\n\n /**\n * Create line elements which connect the elements with their parents.\n */\n private buildRelations(): void {\n // Clear relations.\n this.clearRelations();\n // Add relations.\n this.elements.forEach(item => {\n if (item.props.parentId !== null) {\n const parent = this.elementsById[item.props.parentId];\n const child = this.elementsById[item.props.id];\n if (parent && child) this.addRelationLine(parent, child);\n }\n });\n }\n\n /**\n * @param itemId Optional identifier of a parent or child item.\n * Remove the line elements which connect the elements with their parents.\n */\n private clearRelations(itemId?: number): void {\n if (itemId != null) {\n for (let key in this.relations) {\n const ids = key.split(\"|\");\n const parentId = Number.parseInt(ids[0]);\n const childId = Number.parseInt(ids[1]);\n\n if (itemId === parentId || itemId === childId) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n } else {\n for (let key in this.relations) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n }\n\n /**\n * Retrieve the line element which represent the relation between items.\n * @param parentId Identifier of the parent item.\n * @param childId Itentifier of the child item.\n * @return The line element or nothing.\n */\n private getRelationLine(parentId: number, childId: number): Line | null {\n const identifier = `${parentId}|${childId}`;\n return this.relations[identifier] || null;\n }\n\n /**\n * Add a new line item to represent a relation between the items.\n * @param parent Parent item.\n * @param child Child item.\n * @return Whether the line was added or not.\n */\n private addRelationLine(\n parent: Item,\n child: Item\n ): Line {\n const identifier = `${parent.props.id}|${child.props.id}`;\n if (this.relations[identifier] != null) {\n this.relations[identifier].remove();\n }\n\n // Get the items center.\n const startX = parent.props.x + parent.elementRef.clientWidth / 2;\n const startY =\n parent.props.y +\n (parent.elementRef.clientHeight - parent.labelElementRef.clientHeight) /\n 2;\n const endX = child.props.x + child.elementRef.clientWidth / 2;\n const endY =\n child.props.y +\n (child.elementRef.clientHeight - child.labelElementRef.clientHeight) / 2;\n\n const line = new Line(\n linePropsDecoder({\n id: 0,\n type: ItemType.LINE_ITEM,\n startX,\n startY,\n endX,\n endY,\n width: 0,\n height: 0,\n lineWidth: this.props.relationLineWidth,\n color: \"#CCCCCC\"\n }),\n itemMetaDecoder({\n receivedAt: new Date()\n })\n );\n // Save a reference to the line item.\n this.relations[identifier] = line;\n\n // Add the line to the DOM.\n line.elementRef.style.zIndex = \"0\";\n this.containerRef.append(line.elementRef);\n\n return line;\n }\n\n /**\n * Add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onItemClick(\n listener: Listener>\n ): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Add an event handler to the movement of the visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onItemMoved(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.movedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Add an event handler to the resizement of the visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onItemResized(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.resizedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Enable the edition mode.\n */\n public enableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: true };\n });\n this.containerRef.classList.add(\"is-editing\");\n }\n\n /**\n * Disable the edition mode.\n */\n public disableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: false };\n });\n this.containerRef.classList.remove(\"is-editing\");\n }\n}\n","import TypedEvent, { Disposable, Listener } from \"./TypedEvent\";\n\ninterface Cancellable {\n cancel(): void;\n}\n\ntype AsyncTaskStatus = \"waiting\" | \"started\" | \"cancelled\" | \"finished\";\ntype AsyncTaskInitiator = (done: () => void) => Cancellable;\n\n/**\n * Defines an async task which can be started and cancelled.\n * It's possible to observe the status changes of the task.\n */\nclass AsyncTask {\n private readonly taskInitiator: AsyncTaskInitiator;\n private cancellable: Cancellable = { cancel: () => {} };\n private _status: AsyncTaskStatus = \"waiting\";\n\n // Event manager for status change events.\n private readonly statusChangeEventManager = new TypedEvent();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n public constructor(taskInitiator: AsyncTaskInitiator) {\n this.taskInitiator = taskInitiator;\n }\n\n /**\n * Public setter of the `status` property.\n * @param status.\n */\n public set status(status: AsyncTaskStatus) {\n this._status = status;\n this.statusChangeEventManager.emit(status);\n }\n\n /**\n * Public accessor of the `status` property.\n * @return status.\n */\n public get status() {\n return this._status;\n }\n\n /**\n * Start the async task.\n */\n public init(): void {\n this.cancellable = this.taskInitiator(() => {\n this.status = \"finished\";\n });\n this.status = \"started\";\n }\n\n /**\n * Cancel the async task.\n */\n public cancel(): void {\n this.cancellable.cancel();\n this.status = \"cancelled\";\n }\n\n /**\n * Add an event handler to the status change.\n * @param listener Function which is going to be executed when the status changes.\n */\n public onStatusChange(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.statusChangeEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n\n/**\n * Wrap an async task into another which will execute that task indefinitely\n * every time the tash finnish and the chosen period ends.\n * Will last until cancellation.\n *\n * @param task Async task to execute.\n * @param period Time in milliseconds to wait until the next async esecution.\n *\n * @return A new async task.\n */\nfunction asyncPeriodic(task: AsyncTask, period: number): AsyncTask {\n return new AsyncTask(() => {\n let ref: number | null = null;\n\n task.onStatusChange(status => {\n if (status === \"finished\") {\n ref = window.setTimeout(() => {\n task.init();\n }, period);\n }\n });\n\n task.init();\n\n return {\n cancel: () => {\n if (ref) clearTimeout(ref);\n task.cancel();\n }\n };\n });\n}\n\n/**\n * Manages a list of async tasks.\n */\nexport default class AsyncTaskManager {\n private tasks: { [identifier: string]: AsyncTask } = {};\n\n /**\n * Adds an async task to the manager.\n *\n * @param identifier Unique identifier.\n * @param taskInitiator Function to initialize the async task.\n * Should return a structure to cancel the task.\n * @param period Optional period to repeat the task indefinitely.\n */\n public add(\n identifier: string,\n taskInitiator: AsyncTaskInitiator,\n period: number = 0\n ): AsyncTask {\n if (this.tasks[identifier] && this.tasks[identifier].status === \"started\") {\n this.tasks[identifier].cancel();\n }\n\n const asyncTask =\n period > 0\n ? asyncPeriodic(new AsyncTask(taskInitiator), period)\n : new AsyncTask(taskInitiator);\n\n this.tasks[identifier] = asyncTask;\n\n return this.tasks[identifier];\n }\n\n /**\n * Starts an async task.\n *\n * @param identifier Unique identifier.\n */\n public init(identifier: string) {\n if (\n this.tasks[identifier] &&\n (this.tasks[identifier].status === \"waiting\" ||\n this.tasks[identifier].status === \"cancelled\" ||\n this.tasks[identifier].status === \"finished\")\n ) {\n this.tasks[identifier].init();\n }\n }\n\n /**\n * Cancel a running async task.\n *\n * @param identifier Unique identifier.\n */\n public cancel(identifier: string) {\n if (this.tasks[identifier] && this.tasks[identifier].status === \"started\") {\n this.tasks[identifier].cancel();\n }\n }\n}\n","/*\n * Useful resources.\n * http://es6-features.org/\n * http://exploringjs.com/es6\n * https://www.typescriptlang.org/\n */\n\nimport \"./main.css\"; // CSS import.\nimport VisualConsole from \"./VisualConsole\";\nimport AsyncTaskManager from \"./lib/AsyncTaskManager\";\n\n// Export the VisualConsole class to the global object.\n// eslint-disable-next-line\n(window as any).VisualConsole = VisualConsole;\n\n// Export the AsyncTaskManager class to the global object.\n// eslint-disable-next-line\n(window as any).AsyncTaskManager = AsyncTaskManager;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/visual_console_client/src/Item.ts b/visual_console_client/src/Item.ts index 7809b5b29d..0b23c8c26a 100644 --- a/visual_console_client/src/Item.ts +++ b/visual_console_client/src/Item.ts @@ -248,7 +248,7 @@ abstract class VisualConsoleItem { * Start the resizement funtionality. * @param element Element to move inside its container. */ - private initResizementListener(element: HTMLElement): void { + protected initResizementListener(element: HTMLElement): void { this.removeResizement = addResizementListener( element, (width: Size["width"], height: Size["height"]) => { diff --git a/visual_console_client/src/items/ModuleGraph.ts b/visual_console_client/src/items/ModuleGraph.ts index ce23785d36..a2882d6c97 100644 --- a/visual_console_client/src/items/ModuleGraph.ts +++ b/visual_console_client/src/items/ModuleGraph.ts @@ -58,6 +58,15 @@ export default class ModuleGraph extends Item { super.resizeElement(width, 0); } + /** + * @override Item.initResizementListener. To disable the functionality. + * Start the resizement funtionality. + * @param element Element to move inside its container. + */ + protected initResizementListener(): void { + // No-Op. Disable the resizement functionality for this item. + } + protected createDomElement(): HTMLElement { const element = document.createElement("div"); element.className = "module-graph"; From 006e0cd4ece0d801522c172e11ae9e4e3f7c5bb0 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 26 Jun 2019 12:31:47 +0200 Subject: [PATCH 209/460] Changed js --- .../godmode/reporting/visual_console_builder.editor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/visual_console_builder.editor.js b/pandora_console/godmode/reporting/visual_console_builder.editor.js index 85cbd9be5e..ad78900be2 100755 --- a/pandora_console/godmode/reporting/visual_console_builder.editor.js +++ b/pandora_console/godmode/reporting/visual_console_builder.editor.js @@ -254,7 +254,7 @@ function update_button_palette_callback() { var values = {}; values = readFields(); - if (values["map_linked"] == 0) { + if (selectedItem == "static_graph") { if (values["agent"] == "" || values["agent"] == "none") { dialog_message("#message_alert_no_agent"); return false; From c223e0bdad0c11d00d4a5a4bcd2a583b7e0142a3 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 26 Jun 2019 12:50:19 +0200 Subject: [PATCH 210/460] Changed js --- .../godmode/reporting/visual_console_builder.editor.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pandora_console/godmode/reporting/visual_console_builder.editor.js b/pandora_console/godmode/reporting/visual_console_builder.editor.js index ad78900be2..a4c18d3737 100755 --- a/pandora_console/godmode/reporting/visual_console_builder.editor.js +++ b/pandora_console/godmode/reporting/visual_console_builder.editor.js @@ -255,9 +255,11 @@ function update_button_palette_callback() { values = readFields(); if (selectedItem == "static_graph") { - if (values["agent"] == "" || values["agent"] == "none") { - dialog_message("#message_alert_no_agent"); - return false; + if (values["map_linked"] == 0) { + if (values["agent"] == "" || values["agent"] == "none") { + dialog_message("#message_alert_no_agent"); + return false; + } } } // TODO VALIDATE DATA From fb407c51f2d36835da5e5feffc9ea88712f47253 Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 26 Jun 2019 13:25:57 +0200 Subject: [PATCH 211/460] Updated version and build strings. --- pandora_agents/pc/AIX/pandora_agent.conf | 2 +- pandora_agents/pc/FreeBSD/pandora_agent.conf | 2 +- pandora_agents/pc/HP-UX/pandora_agent.conf | 2 +- pandora_agents/pc/Linux/pandora_agent.conf | 2 +- pandora_agents/pc/NT4/pandora_agent.conf | 2 +- pandora_agents/pc/SunOS/pandora_agent.conf | 2 +- pandora_agents/pc/Win32/pandora_agent.conf | 2 +- pandora_agents/shellscript/aix/pandora_agent.conf | 2 +- pandora_agents/shellscript/bsd-ipso/pandora_agent.conf | 2 +- pandora_agents/shellscript/hp-ux/pandora_agent.conf | 2 +- pandora_agents/shellscript/linux/pandora_agent.conf | 2 +- pandora_agents/shellscript/mac_osx/pandora_agent.conf | 2 +- pandora_agents/shellscript/openWRT/pandora_agent.conf | 2 +- pandora_agents/shellscript/solaris/pandora_agent.conf | 2 +- pandora_agents/unix/AIX/pandora_agent.conf | 2 +- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/Darwin/pandora_agent.conf | 2 +- pandora_agents/unix/FreeBSD/pandora_agent.conf | 2 +- pandora_agents/unix/HP-UX/pandora_agent.conf | 2 +- pandora_agents/unix/Linux/pandora_agent.conf | 2 +- pandora_agents/unix/NT4/pandora_agent.conf | 2 +- pandora_agents/unix/NetBSD/pandora_agent.conf | 2 +- pandora_agents/unix/SunOS/pandora_agent.conf | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 4 ++-- pandora_agents/unix/pandora_agent.spec | 4 ++-- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/bin/pandora_agent.conf | 2 +- pandora_agents/win32/installer/pandora.mpi | 4 ++-- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 4 ++-- pandora_console/pandora_console.rhel7.spec | 4 ++-- pandora_console/pandora_console.spec | 4 ++-- pandora_console/pandora_console_install | 2 +- pandora_console/pandoradb_data.sql | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/conf/pandora_server.conf.new | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 4 ++-- pandora_server/pandora_server.spec | 4 ++-- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 51 files changed, 59 insertions(+), 59 deletions(-) diff --git a/pandora_agents/pc/AIX/pandora_agent.conf b/pandora_agents/pc/AIX/pandora_agent.conf index 0ff67a62d3..30fb45624c 100644 --- a/pandora_agents/pc/AIX/pandora_agent.conf +++ b/pandora_agents/pc/AIX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, AIX version +# Version 7.0NG.736, AIX version # Licensed under GPL license v2, # Copyright (c) 2003-2010 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/FreeBSD/pandora_agent.conf b/pandora_agents/pc/FreeBSD/pandora_agent.conf index c7c6fdd493..fc704fb87b 100644 --- a/pandora_agents/pc/FreeBSD/pandora_agent.conf +++ b/pandora_agents/pc/FreeBSD/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, FreeBSD Version +# Version 7.0NG.736, FreeBSD Version # Licensed under GPL license v2, # Copyright (c) 2003-2010 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/HP-UX/pandora_agent.conf b/pandora_agents/pc/HP-UX/pandora_agent.conf index 1a349583dc..46789e8bea 100644 --- a/pandora_agents/pc/HP-UX/pandora_agent.conf +++ b/pandora_agents/pc/HP-UX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, HP-UX Version +# Version 7.0NG.736, HP-UX Version # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/Linux/pandora_agent.conf b/pandora_agents/pc/Linux/pandora_agent.conf index dc172b7e2f..ce69b462a5 100644 --- a/pandora_agents/pc/Linux/pandora_agent.conf +++ b/pandora_agents/pc/Linux/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, GNU/Linux +# Version 7.0NG.736, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/NT4/pandora_agent.conf b/pandora_agents/pc/NT4/pandora_agent.conf index 3d76832397..904015a997 100644 --- a/pandora_agents/pc/NT4/pandora_agent.conf +++ b/pandora_agents/pc/NT4/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, GNU/Linux +# Version 7.0NG.736, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/SunOS/pandora_agent.conf b/pandora_agents/pc/SunOS/pandora_agent.conf index 9b088eae51..d2d0661065 100644 --- a/pandora_agents/pc/SunOS/pandora_agent.conf +++ b/pandora_agents/pc/SunOS/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, Solaris Version +# Version 7.0NG.736, Solaris Version # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/Win32/pandora_agent.conf b/pandora_agents/pc/Win32/pandora_agent.conf index e2c442a520..d0593ebcc9 100644 --- a/pandora_agents/pc/Win32/pandora_agent.conf +++ b/pandora_agents/pc/Win32/pandora_agent.conf @@ -1,6 +1,6 @@ # Base config file for Pandora FMS Windows Agent # (c) 2006-2010 Artica Soluciones Tecnologicas -# Version 7.0NG.735 +# Version 7.0NG.736 # This program is Free Software, you can redistribute it and/or modify it # under the terms of the GNU General Public Licence as published by the Free Software diff --git a/pandora_agents/shellscript/aix/pandora_agent.conf b/pandora_agents/shellscript/aix/pandora_agent.conf index fea0cb56db..74c397dc94 100644 --- a/pandora_agents/shellscript/aix/pandora_agent.conf +++ b/pandora_agents/shellscript/aix/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.735, AIX version +# Version 7.0NG.736, AIX version # General Parameters # ================== diff --git a/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf b/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf index f0ce5b2519..b7a30f962e 100644 --- a/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf +++ b/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.735 +# Version 7.0NG.736 # FreeBSD/IPSO version # Licenced under GPL licence, 2003-2007 Sancho Lerena diff --git a/pandora_agents/shellscript/hp-ux/pandora_agent.conf b/pandora_agents/shellscript/hp-ux/pandora_agent.conf index 20cdfeff99..9114cd7348 100644 --- a/pandora_agents/shellscript/hp-ux/pandora_agent.conf +++ b/pandora_agents/shellscript/hp-ux/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.735, HPUX Version +# Version 7.0NG.736, HPUX Version # General Parameters # ================== diff --git a/pandora_agents/shellscript/linux/pandora_agent.conf b/pandora_agents/shellscript/linux/pandora_agent.conf index e8ba9653ce..8eb9c0bbc8 100644 --- a/pandora_agents/shellscript/linux/pandora_agent.conf +++ b/pandora_agents/shellscript/linux/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735 +# Version 7.0NG.736 # Licensed under GPL license v2, # (c) 2003-2010 Artica Soluciones Tecnologicas # please visit http://pandora.sourceforge.net diff --git a/pandora_agents/shellscript/mac_osx/pandora_agent.conf b/pandora_agents/shellscript/mac_osx/pandora_agent.conf index 29d13ff75c..24d44d51fc 100644 --- a/pandora_agents/shellscript/mac_osx/pandora_agent.conf +++ b/pandora_agents/shellscript/mac_osx/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735 +# Version 7.0NG.736 # Licensed under GPL license v2, # (c) 2003-2009 Artica Soluciones Tecnologicas # please visit http://pandora.sourceforge.net diff --git a/pandora_agents/shellscript/openWRT/pandora_agent.conf b/pandora_agents/shellscript/openWRT/pandora_agent.conf index 8ef8a6fdc1..a940b58a89 100644 --- a/pandora_agents/shellscript/openWRT/pandora_agent.conf +++ b/pandora_agents/shellscript/openWRT/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735 +# Version 7.0NG.736 # Licensed under GPL license v2, # please visit http://pandora.sourceforge.net diff --git a/pandora_agents/shellscript/solaris/pandora_agent.conf b/pandora_agents/shellscript/solaris/pandora_agent.conf index 1ace947818..13611f36c0 100644 --- a/pandora_agents/shellscript/solaris/pandora_agent.conf +++ b/pandora_agents/shellscript/solaris/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.735, Solaris version +# Version 7.0NG.736, Solaris version # General Parameters # ================== diff --git a/pandora_agents/unix/AIX/pandora_agent.conf b/pandora_agents/unix/AIX/pandora_agent.conf index c67f64d16c..6a826afd8b 100644 --- a/pandora_agents/unix/AIX/pandora_agent.conf +++ b/pandora_agents/unix/AIX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, AIX version +# Version 7.0NG.736, AIX version # Licensed under GPL license v2, # Copyright (c) 2003-2010 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 2faf21c47a..23cf78af16 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.735-190626 +Version: 7.0NG.736 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 7521094eba..0eb8507e7b 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.735-190626" +pandora_version="7.0NG.736" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/Darwin/pandora_agent.conf b/pandora_agents/unix/Darwin/pandora_agent.conf index d7ee481255..35a24de477 100644 --- a/pandora_agents/unix/Darwin/pandora_agent.conf +++ b/pandora_agents/unix/Darwin/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, GNU/Linux +# Version 7.0NG.736, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2012 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/FreeBSD/pandora_agent.conf b/pandora_agents/unix/FreeBSD/pandora_agent.conf index b02b379470..fba8f9fa24 100644 --- a/pandora_agents/unix/FreeBSD/pandora_agent.conf +++ b/pandora_agents/unix/FreeBSD/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, FreeBSD Version +# Version 7.0NG.736, FreeBSD Version # Licensed under GPL license v2, # Copyright (c) 2003-2016 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/HP-UX/pandora_agent.conf b/pandora_agents/unix/HP-UX/pandora_agent.conf index 57e35c0a03..36164100be 100644 --- a/pandora_agents/unix/HP-UX/pandora_agent.conf +++ b/pandora_agents/unix/HP-UX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, HP-UX Version +# Version 7.0NG.736, HP-UX Version # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/Linux/pandora_agent.conf b/pandora_agents/unix/Linux/pandora_agent.conf index db07876f12..6012f59705 100644 --- a/pandora_agents/unix/Linux/pandora_agent.conf +++ b/pandora_agents/unix/Linux/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, GNU/Linux +# Version 7.0NG.736, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2014 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/NT4/pandora_agent.conf b/pandora_agents/unix/NT4/pandora_agent.conf index 8cda0f8fe0..300c03a3f5 100644 --- a/pandora_agents/unix/NT4/pandora_agent.conf +++ b/pandora_agents/unix/NT4/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, GNU/Linux +# Version 7.0NG.736, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/NetBSD/pandora_agent.conf b/pandora_agents/unix/NetBSD/pandora_agent.conf index 629fe6a6fb..e899eed824 100644 --- a/pandora_agents/unix/NetBSD/pandora_agent.conf +++ b/pandora_agents/unix/NetBSD/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, NetBSD Version +# Version 7.0NG.736, NetBSD Version # Licensed under GPL license v2, # Copyright (c) 2003-2010 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/SunOS/pandora_agent.conf b/pandora_agents/unix/SunOS/pandora_agent.conf index 8ff3c52de5..be7904794d 100644 --- a/pandora_agents/unix/SunOS/pandora_agent.conf +++ b/pandora_agents/unix/SunOS/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.735, Solaris Version +# Version 7.0NG.736, Solaris Version # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 3cf1d22126..6c685e63db 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -41,7 +41,7 @@ my $Sem = undef; # Semaphore used to control the number of threads my $ThreadSem = undef; -use constant AGENT_VERSION => '7.0NG.735'; +use constant AGENT_VERSION => '7.0NG.736'; use constant AGENT_BUILD => '190626'; # Agent log default file size maximum and instances diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 725d5abaa2..61ef7466ca 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -2,8 +2,8 @@ #Pandora FMS Linux Agent # %define name pandorafms_agent_unix -%define version 7.0NG.735 -%define release 190626 +%define version 7.0NG.736 +%define release 1 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 970291a4c3..187ab0c80f 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -2,8 +2,8 @@ #Pandora FMS Linux Agent # %define name pandorafms_agent_unix -%define version 7.0NG.735 -%define release 190626 +%define version 7.0NG.736 +%define release 1 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 2b9cf3b68c..17c2af4cea 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -9,7 +9,7 @@ # Please see http://www.pandorafms.org. This code is licensed under GPL 2.0 license. # ********************************************************************** -PI_VERSION="7.0NG.735" +PI_VERSION="7.0NG.736" PI_BUILD="190626" OS_NAME=`uname -s` diff --git a/pandora_agents/win32/bin/pandora_agent.conf b/pandora_agents/win32/bin/pandora_agent.conf index 518cd3df0e..9c2fe6d01d 100644 --- a/pandora_agents/win32/bin/pandora_agent.conf +++ b/pandora_agents/win32/bin/pandora_agent.conf @@ -1,6 +1,6 @@ # Base config file for Pandora FMS Windows Agent # (c) 2006-2017 Artica Soluciones Tecnologicas -# Version 7.0NG.735 +# Version 7.0NG.736 # This program is Free Software, you can redistribute it and/or modify it # under the terms of the GNU General Public Licence as published by the Free Software diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 7aecb7cff2..ccbb5d18b6 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -3,7 +3,7 @@ AllowLanguageSelection {Yes} AppName -{Pandora FMS Windows Agent v7.0NG.735} +{Pandora FMS Windows Agent v7.0NG.736} ApplicationID {17E3D2CF-CA02-406B-8A80-9D31C17BD08F} @@ -2387,7 +2387,7 @@ Windows,BuildSeparateArchives {No} Windows,Executable -{<%AppName%>-<%Version%>-Setup<%Ext%>} +{<%AppName%>-Setup<%Ext%>} Windows,FileDescription {<%AppName%> <%Version%> Setup} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index f655faabc6..26384d8353 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.735(Build 190626)") +#define PANDORA_VERSION ("7.0NG.736(Build 190626)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 3d3a2ebf4a..45cb437458 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.735(Build 190626))" + VALUE "ProductVersion", "(7.0NG.736(Build 190626))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 5fc2731073..e47a0a982b 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.735-190626 +Version: 7.0NG.736 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 44d78e12ac..0e886c4585 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.735-190626" +pandora_version="7.0NG.736" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 95f6595032..0672366db4 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -21,7 +21,7 @@ * Pandora build version and version */ $build_version = 'PC190626'; -$pandora_version = 'v7.0NG.735'; +$pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. $script_tz = @date_default_timezone_get(); diff --git a/pandora_console/install.php b/pandora_console/install.php index 00a940965b..1404ef3c32 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -128,7 +128,7 @@
    Date: Wed, 26 Jun 2019 15:37:04 +0200 Subject: [PATCH 212/460] update current package --- pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql | 4 ++-- pandora_console/pandoradb_data.sql | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql index c4dabae30d..8fe694d8e4 100644 --- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql +++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql @@ -1235,13 +1235,13 @@ ALTER TABLE titem MODIFY `source_data` int(10) unsigned; INSERT INTO `tconfig` (`token`, `value`) VALUES ('big_operation_step_datos_purge', '100'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('small_operation_step_datos_purge', '1000'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('days_autodisable_deletion', '30'); -INSERT INTO `tconfig` (`token`, `value`) VALUES ('MR', 28); +INSERT INTO `tconfig` (`token`, `value`) VALUES ('MR', 29); INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_docs_logo', 'default_docs.png'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_support_logo', 'default_support.png'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_logo_white_bg_preview', 'pandora_logo_head_white_bg.png'); UPDATE tconfig SET value = 'https://licensing.artica.es/pandoraupdate7/server.php' WHERE token='url_update_manager'; DELETE FROM `tconfig` WHERE `token` = 'current_package_enterprise'; -INSERT INTO `tconfig` (`token`, `value`) VALUES ('current_package_enterprise', '735'); +INSERT INTO `tconfig` (`token`, `value`) VALUES ('current_package_enterprise', '736'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('status_monitor_fields', 'policy,agent,data_type,module_name,server_type,interval,status,graph,warn,data,timestamp'); -- --------------------------------------------------------------------- diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index eb52c1dad8..c69e37e545 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -114,10 +114,10 @@ INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_report_front_logo', 'images/pandora_logo_white.jpg'), ('custom_report_front_header', ''), ('custom_report_front_footer', ''), -('MR', 28), +('MR', 29), ('identification_reminder', 1), ('identification_reminder_timestamp', 0), -('current_package_enterprise', '735'), +('current_package_enterprise', '736'), ('post_process_custom_values', '{"0.00000038580247":"Seconds to months","0.00000165343915":"Seconds to weeks","0.00001157407407":"Seconds to days","0.01666666666667":"Seconds to minutes","0.00000000093132":"Bytes to Gigabytes","0.00000095367432":"Bytes to Megabytes","0.0009765625":"Bytes to Kilobytes","0.00000001653439":"Timeticks to weeks","0.00000011574074":"Timeticks to days"}'), ('custom_docs_logo', 'default_docs.png'), ('custom_support_logo', 'default_support.png'), From 58483e87487cf7e59286afb0798ecf30d05d7fe5 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 26 Jun 2019 16:23:54 +0200 Subject: [PATCH 213/460] improved countdown --- pandora_console/operation/agentes/ver_agente.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index 5f7f29f916..b9b2a2128d 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -68,15 +68,16 @@ if (is_ajax()) { if ($refresh_contact) { $id_agente = get_parameter('id_agente', 0); if ($id_agente > 0) { - $d = db_get_row( - 'tagente', - 'id_agente', - $id_agente + $last_contact = db_get_value_sql( + sprintf( + 'SELECT intervalo - (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(IF(ultimo_contacto > ultimo_contacto_remoto, ultimo_contacto, ultimo_contacto_remoto))) + FROM `tagente` + WHERE id_agente = %d ', + $id_agente + ) ); $progress = agents_get_next_contact($id_agente); - $last_contact = floor(($d['intervalo'] * (100 - $progress) / 100)); - if ($progress < 0 || $progress > 100) { $progress = 100; } From 058abdd552c986199450fc4e5fcf736f0ce5687c Mon Sep 17 00:00:00 2001 From: alejandro-campos Date: Wed, 26 Jun 2019 17:17:56 +0200 Subject: [PATCH 214/460] Add condition in tactical view to exclude disabled alerts from count of triggered alerts --- pandora_console/include/functions_tactical.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_tactical.php b/pandora_console/include/functions_tactical.php index c10f194386..39f44a9beb 100644 --- a/pandora_console/include/functions_tactical.php +++ b/pandora_console/include/functions_tactical.php @@ -444,7 +444,7 @@ function tactical_monitor_fired_alerts($group_array, $strict_user=false, $id_gro WHERE tagente.id_grupo IN $group_clause_strict AND tagente_modulo.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND talert_template_modules.id_agent_module = tagente_modulo.id_agente_modulo - AND times_fired > 0 "; + AND times_fired > 0 AND talert_template_modules.disabled = 0"; $count = db_get_sql($sql); return $count; @@ -456,7 +456,7 @@ function tactical_monitor_fired_alerts($group_array, $strict_user=false, $id_gro WHERE tagente.id_grupo IN $group_clause AND tagente_modulo.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND talert_template_modules.id_agent_module = tagente_modulo.id_agente_modulo - AND times_fired > 0" + AND times_fired > 0 AND talert_template_modules.disabled = 0" ); } From 225de6b5ea7f0b12499649f8573bdb2d92d714cc Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 26 Jun 2019 19:33:42 +0200 Subject: [PATCH 215/460] MR forgotten change --- pandora_console/extras/mr/29.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/extras/mr/29.sql b/pandora_console/extras/mr/29.sql index e036c9d2eb..2bc8b9a8c9 100644 --- a/pandora_console/extras/mr/29.sql +++ b/pandora_console/extras/mr/29.sql @@ -23,5 +23,6 @@ UPDATE `tagente` ta INNER JOIN `tagente` taa on ta.`id_parent` = taa.`id_agente` UPDATE `tagente` SET `nombre` = md5(concat((SELECT `username` FROM `tcredential_store` WHERE `identifier` = "imported_aws_account" LIMIT 1), `nombre`)) WHERE `nombre` IN ("Aws", "us-east-1", "us-east-2", "us-west-1", "us-west-2", "ca-central-1", "eu-central-1", "eu-west-1", "eu-west-2", "eu-west-3", "ap-northeast-1", "ap-northeast-2", "ap-southeast-1", "ap-southeast-2", "ap-south-1", "sa-east-1"); +UPDATE `trecon_task` SET `auth_strings` = "imported_aws_account" WHERE `type` IN (2,6,7); COMMIT; From 470e399f508d251ed6d63695e09609fc598e3164 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 26 Jun 2019 19:34:34 +0200 Subject: [PATCH 216/460] Fixed url edit task in RDS --- pandora_console/godmode/wizards/DiscoveryTaskList.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php index 1a16967f60..e018ec3d30 100644 --- a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php +++ b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php @@ -725,7 +725,7 @@ class DiscoveryTaskList extends Wizard return 'wiz=cloud&mode=amazonws&ki='.$task['auth_strings'].'&page=1'; case DISCOVERY_CLOUD_AWS_RDS: - return 'wiz=cloud&mode=amazonws&sub=rds&page=0'; + return 'wiz=cloud&mode=amazonws&ki='.$task['auth_strings'].'&sub=rds&page=0'; default: if ($task['description'] == 'console_task') { From ead768c9df9a9fc9531928e5ed0c748126296fb1 Mon Sep 17 00:00:00 2001 From: artica Date: Thu, 27 Jun 2019 00:01:10 +0200 Subject: [PATCH 217/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 4 ++-- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 26 insertions(+), 26 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 23cf78af16..97a0f96608 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736 +Version: 7.0NG.736-190627 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 0eb8507e7b..cea74298d9 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736" +pandora_version="7.0NG.736-190627" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 6c685e63db..c105fe6e07 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190626'; +use constant AGENT_BUILD => '190627'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 61ef7466ca..147b53eea0 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 1 +%define release 190627 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 187ab0c80f..2747373302 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 1 +%define release 190627 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 17c2af4cea..f52301c2ef 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190626" +PI_BUILD="190627" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index ccbb5d18b6..73d18a13be 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190626} +{190627} ViewReadme {Yes} @@ -2387,7 +2387,7 @@ Windows,BuildSeparateArchives {No} Windows,Executable -{<%AppName%>-Setup<%Ext%>} +{<%AppName%>-<%Version%>-Setup<%Ext%>} Windows,FileDescription {<%AppName%> <%Version%> Setup} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 26384d8353..bafda8aaef 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190626)") +#define PANDORA_VERSION ("7.0NG.736(Build 190627)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 45cb437458..f1336d2ab8 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190626))" + VALUE "ProductVersion", "(7.0NG.736(Build 190627))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index e47a0a982b..8b39df1b04 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736 +Version: 7.0NG.736-190627 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 0e886c4585..1665ae05d1 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736" +pandora_version="7.0NG.736-190627" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 0672366db4..6b175d2a3b 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190626'; +$build_version = 'PC190627'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 1404ef3c32..add341cb50 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 006283762f..19aa431817 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 1 +%define release 190627 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 1069c66b3b..e59b71f0e1 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 1 +%define release 190627 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 6b6666b145..8c2ee3fe84 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190626" +PI_BUILD="190627" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 0de9fdef13..c9ea0135c0 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190626"; +my $version = "7.0NG.736 PS190627"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 0d0d83d5fa..99458b0b0d 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190626"; +my $version = "7.0NG.736 PS190627"; # save program name for logging my $progname = basename($0); From 77419ee70981894effaf89914b729351b1eb6456 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 27 Jun 2019 09:05:22 +0200 Subject: [PATCH 218/460] Modified jquery window function --- pandora_console/operation/users/webchat.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/operation/users/webchat.php b/pandora_console/operation/users/webchat.php index db97864863..3de302b0be 100644 --- a/pandora_console/operation/users/webchat.php +++ b/pandora_console/operation/users/webchat.php @@ -120,11 +120,10 @@ echo "
    ".html_print_button( init_webchat(); }); - - $(window).unload(function () { + $(window).on("beforeunload",function () { exit_webchat(); }); - + function init_webchat() { send_login_message(); long_polling_check_messages(); @@ -305,6 +304,7 @@ echo "
    ".html_print_button( data: parameters, dataType: "json", success: function(data) { + console.log(data); } }); } From 0e1ad434222ca243a26b05a48c4e0433b9cdd666 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 27 Jun 2019 09:33:31 +0200 Subject: [PATCH 219/460] Update webchat.php. Forgotten console log --- pandora_console/operation/users/webchat.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_console/operation/users/webchat.php b/pandora_console/operation/users/webchat.php index 3de302b0be..4492c9703c 100644 --- a/pandora_console/operation/users/webchat.php +++ b/pandora_console/operation/users/webchat.php @@ -304,7 +304,6 @@ echo "
    ".html_print_button( data: parameters, dataType: "json", success: function(data) { - console.log(data); } }); } From 1ffb435d5a5e8f1256e52f259ec2a766ae28db88 Mon Sep 17 00:00:00 2001 From: Luis Calvo Date: Thu, 27 Jun 2019 09:48:37 +0200 Subject: [PATCH 220/460] Fixed wrong img paths --- pandora_console/include/styles/js/cluetip.css | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/styles/js/cluetip.css b/pandora_console/include/styles/js/cluetip.css index 233dbf3cbb..a1360b0afe 100644 --- a/pandora_console/include/styles/js/cluetip.css +++ b/pandora_console/include/styles/js/cluetip.css @@ -2,19 +2,23 @@ #cluetip-close img { border: 0; } + #cluetip-title { overflow: hidden; } + #cluetip-title #cluetip-close { float: right; position: relative; } + #cluetip-waitimage { width: 43px; height: 11px; position: absolute; background-image: url(../../../images/wait.gif); } + .cluetip-arrows { display: none; position: absolute; @@ -25,9 +29,11 @@ background-repeat: no-repeat; background-position: 0 0; } + #cluetip-extra { display: none; } + /*************************************** =cluetipClass: 'default' -------------------------------------- */ @@ -36,11 +42,13 @@ background-color: #fff; text-align: left; } + .cluetip-default #cluetip-outer { position: relative; margin: 0; background-color: #fff; } + .cluetip-default h3 { margin: 0 0 5px; padding: 8px 10px 4px; @@ -49,6 +57,7 @@ background-color: #b1b1b1; color: #fff; } + .cluetip-default h3#cluetip-title { display: none; height: 0px; @@ -56,41 +65,49 @@ padding: 0; color: #fff; } + .cluetip-default #cluetip-title a { color: #fff; font-size: 0.95em; } + .cluetip-default #cluetip-inner { padding: 10px; } + .cluetip-default div#cluetip-close { text-align: right; margin: 0 5px 5px; color: #900; } + .cluetip-default ul { text-align: left; } + /* default arrows */ .clue-right-default .cluetip-arrows { - background-image: url(../../images/darrowleft.png); + background-image: url(../../../images/darrowleft.png); } + .clue-left-default .cluetip-arrows { - background-image: url(../../images/darrowright.png); + background-image: url(../../../images/darrowright.png); left: 100%; margin-right: -11px; } + .clue-top-default .cluetip-arrows { - background-image: url(../../images/darrowdown.png); + background-image: url(../../../images/darrowdown.png); top: 100%; left: 50%; margin-left: -11px; height: 11px; width: 22px; } + .clue-bottom-default .cluetip-arrows { - background-image: url(../../images/darrowup.png); + background-image: url(../../../images/darrowup.png); top: -11px; left: 50%; margin-left: -11px; From d956f0801110e43ef41e4bba036f1c6d42a5084e Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 27 Jun 2019 10:39:43 +0200 Subject: [PATCH 221/460] Minor fixes --- .../extras/pandoradb_migrate_6.0_to_7.0.mysql.sql | 14 +++++++++----- pandora_console/pandoradb.sql | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql index 8fe694d8e4..4bad7b3652 100644 --- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql +++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql @@ -1007,10 +1007,12 @@ CREATE TABLE IF NOT EXISTS `tmetaconsole_agent` ( `agent_version` varchar(100) default '', `ultimo_contacto_remoto` datetime default '1970-01-01 00:00:00', `disabled` tinyint(2) NOT NULL default '0', + `remote` tinyint(1) NOT NULL default '0', `id_parent` int(10) unsigned default '0', `custom_id` varchar(255) default '', `server_name` varchar(100) default '', `cascade_protection` tinyint(2) NOT NULL default '0', + `cascade_protection_module` int(10) unsigned default '0', `timezone_offset` TINYINT(2) NULL DEFAULT '0' COMMENT 'number of hours of diference with the server timezone' , `icon_path` VARCHAR(127) NULL DEFAULT NULL COMMENT 'path in the server to the image of the icon representing the agent' , `update_gis_data` TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'set it to one to update the position data (altitude, longitude, latitude) when getting information from the agent or to 0 to keep the last value and do not update it' , @@ -1025,19 +1027,21 @@ CREATE TABLE IF NOT EXISTS `tmetaconsole_agent` ( `fired_count` bigint(20) NOT NULL default '0', `update_module_count` tinyint(1) NOT NULL default '0', `update_alert_count` tinyint(1) NOT NULL default '0', + `update_secondary_groups` tinyint(1) NOT NULL default '0', + `transactional_agent` tinyint(1) NOT NULL default '0', + `alias` varchar(600) BINARY NOT NULL default '', + `alias_as_name` tinyint(2) NOT NULL default '0', + `safe_mode_module` int(10) unsigned NOT NULL default '0', + `cps` int NOT NULL default 0, PRIMARY KEY (`id_agente`), KEY `nombre` (`nombre`(255)), KEY `direccion` (`direccion`), + KEY `id_tagente_idx` (`id_tagente`), KEY `disabled` (`disabled`), KEY `id_grupo` (`id_grupo`), FOREIGN KEY (`id_tmetaconsole_setup`) REFERENCES tmetaconsole_setup(`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -ALTER TABLE tmetaconsole_agent ADD COLUMN `remote` tinyint(1) NOT NULL default '0'; -ALTER TABLE tmetaconsole_agent ADD COLUMN `cascade_protection_module` int(10) default '0'; -ALTER TABLE tmetaconsole_agent ADD COLUMN `transactional_agent` tinyint(1) NOT NULL default '0'; -ALTER TABLE tmetaconsole_agent ADD COLUMN `alias` VARCHAR(600) not null DEFAULT ''; - -- --------------------------------------------------------------------- -- Table `ttransaction` -- --------------------------------------------------------------------- diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index e5c4467551..6784ecb309 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -3233,6 +3233,7 @@ CREATE TABLE IF NOT EXISTS `tmetaconsole_agent` ( PRIMARY KEY (`id_agente`), KEY `nombre` (`nombre`(255)), KEY `direccion` (`direccion`), + KEY `id_tagente_idx` (`id_tagente`), KEY `disabled` (`disabled`), KEY `id_grupo` (`id_grupo`), FOREIGN KEY (`id_tmetaconsole_setup`) REFERENCES tmetaconsole_setup(`id`) ON DELETE CASCADE ON UPDATE CASCADE From a2877b46f336b4b674549b6223dfa302bbdab119 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 27 Jun 2019 14:58:57 +0200 Subject: [PATCH 222/460] Solved wrong variable rewriting --- .../godmode/reporting/reporting_builder.item_editor.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index a5e59e46ce..211385cac8 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -847,7 +847,10 @@ $class = 'databox filters'; } ?> '.html_print_image('images/tip.png', true, ['title' => $text]).''; ?> From 5ccc16d7d659897dc5fa61533675cf5e5de293cc Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 27 Jun 2019 15:04:58 +0200 Subject: [PATCH 223/460] Revert 28.sql --- pandora_console/extras/mr/28.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_console/extras/mr/28.sql b/pandora_console/extras/mr/28.sql index 6aa30fb34c..bab07bead8 100644 --- a/pandora_console/extras/mr/28.sql +++ b/pandora_console/extras/mr/28.sql @@ -42,5 +42,4 @@ ALTER TABLE `tusuario` ADD COLUMN `ehorus_user_level_user` VARCHAR(60); ALTER TABLE `tusuario` ADD COLUMN `ehorus_user_level_pass` VARCHAR(45); ALTER TABLE `tusuario` ADD COLUMN `ehorus_user_level_enabled` TINYINT(1) DEFAULT '1'; - COMMIT; From 411e62fb0dd8451437b75beb6d9a6a197653ef45 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 27 Jun 2019 16:38:00 +0200 Subject: [PATCH 224/460] Changed link to Discovery task list and added ui_get_full_url function over other links --- .../godmode/servers/servers.build_table.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pandora_console/godmode/servers/servers.build_table.php b/pandora_console/godmode/servers/servers.build_table.php index aa2f0a0735..f0e2a4ad08 100644 --- a/pandora_console/godmode/servers/servers.build_table.php +++ b/pandora_console/godmode/servers/servers.build_table.php @@ -152,12 +152,12 @@ foreach ($servers as $server) { $data[8] = ''; if ($server['type'] == 'recon') { - $data[8] .= ''; + $data[8] .= ''; $data[8] .= html_print_image( 'images/firts_task/icono_grande_reconserver.png', true, [ - 'title' => __('Manage recon tasks'), + 'title' => __('Manage Discovery tasks'), 'style' => 'width:21px;height:21px;', ] ); @@ -165,7 +165,7 @@ foreach ($servers as $server) { } if ($server['type'] == 'data') { - $data[8] .= ''; + $data[8] .= ''; $data[8] .= html_print_image( 'images/target.png', true, @@ -173,7 +173,7 @@ foreach ($servers as $server) { ); $data[8] .= ''; } else if ($server['type'] == 'enterprise snmp') { - $data[8] .= ''; + $data[8] .= ''; $data[8] .= html_print_image( 'images/target.png', true, @@ -182,7 +182,7 @@ foreach ($servers as $server) { $data[8] .= ''; } - $data[8] .= ''; + $data[8] .= ''; $data[8] .= html_print_image( 'images/config.png', true, @@ -191,7 +191,7 @@ foreach ($servers as $server) { $data[8] .= ''; if (($names_servers[$safe_server_name] === true) && ($server['type'] == 'data' || $server['type'] == 'enterprise satellite')) { - $data[8] .= ''; + $data[8] .= ''; $data[8] .= html_print_image( 'images/remote_configuration.png', true, @@ -201,7 +201,7 @@ foreach ($servers as $server) { $names_servers[$safe_server_name] = false; } - $data[8] .= ''; + $data[8] .= ''; $data[8] .= html_print_image( 'images/cross.png', true, From 25e5f0914ac5eb33595b20b1e18c5ae1f1e70b41 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 27 Jun 2019 16:58:48 +0200 Subject: [PATCH 225/460] Added delete_files entry for recon view deletion --- pandora_console/extras/delete_files/delete_files.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 pandora_console/extras/delete_files/delete_files.txt diff --git a/pandora_console/extras/delete_files/delete_files.txt b/pandora_console/extras/delete_files/delete_files.txt new file mode 100644 index 0000000000..c0d8f0a9db --- /dev/null +++ b/pandora_console/extras/delete_files/delete_files.txt @@ -0,0 +1 @@ +operation/servers/recon_view.php \ No newline at end of file From 03edb75b7c1d9d16f2215b249c7581e5a1d95c79 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 27 Jun 2019 17:19:48 +0200 Subject: [PATCH 226/460] Modified agent alias name --- pandora_console/godmode/servers/plugin.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php index a7fc94bcca..3eb385332c 100644 --- a/pandora_console/godmode/servers/plugin.php +++ b/pandora_console/godmode/servers/plugin.php @@ -70,7 +70,7 @@ if (is_ajax()) { $table->head[0] = __('Agent'); $table->head[1] = __('Module'); foreach ($modules as $mod) { - $agent_name = ''.modules_get_agentmodule_agent_name( + $agent_name = ''.modules_get_agentmodule_agent_alias( $mod['id_agente_modulo'] ).''; @@ -1215,4 +1215,3 @@ ui_require_javascript_file('pandora_modules'); - From 3d75e045f9f9141dc421659ef1c84934b7939722 Mon Sep 17 00:00:00 2001 From: alejandro-campos Date: Thu, 27 Jun 2019 17:42:29 +0200 Subject: [PATCH 227/460] added new fields to saml configuration and added check to not allow user creation with all group in case an empty value was specified in group name attribute input --- pandora_console/include/functions_config.php | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index 5a11249f74..61e16be8ab 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -668,10 +668,22 @@ function config_update_config() $error_update[] = __('Saml group name parameter'); } + if (!config_update_value('saml_attr_type', (bool) get_parameter('saml_attr_type'))) { + $error_update[] = __('Saml attr type parameter'); + } + if (!config_update_value('saml_profiles_and_tags', get_parameter('saml_profiles_and_tags'))) { $error_update[] = __('Saml profiles and tags parameter'); } + if (!config_update_value('saml_profile', get_parameter('saml_profile'))) { + $error_update[] = __('Saml profile parameters'); + } + + if (!config_update_value('saml_tag', get_parameter('saml_tag'))) { + $error_update[] = __('Saml tag parameter'); + } + if (!config_update_value('saml_profile_tag_separator', get_parameter('saml_profile_tag_separator'))) { $error_update[] = __('Saml profile and tag separator'); } @@ -2404,10 +2416,22 @@ function config_process_config() config_update_value('saml_group_name', ''); } + if (!isset($config['saml_attr_type'])) { + config_update_value('saml_attr_type', false); + } + if (!isset($config['saml_profiles_and_tags'])) { config_update_value('saml_profiles_and_tags', ''); } + if (!isset($config['saml_profile'])) { + config_update_value('saml_profile', ''); + } + + if (!isset($config['saml_tag'])) { + config_update_value('saml_tag', ''); + } + if (!isset($config['saml_profile_tag_separator'])) { config_update_value('saml_profile_tag_separator', ''); } From 8a04e2eec279f2ee60ace457f7ef2e4376ad7860 Mon Sep 17 00:00:00 2001 From: artica Date: Fri, 28 Jun 2019 00:01:06 +0200 Subject: [PATCH 228/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 97a0f96608..b6e8eee877 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190627 +Version: 7.0NG.736-190628 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index cea74298d9..5b33962912 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190627" +pandora_version="7.0NG.736-190628" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index c105fe6e07..e547e26c9d 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190627'; +use constant AGENT_BUILD => '190628'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 147b53eea0..dae9afb803 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190627 +%define release 190628 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 2747373302..d195943bad 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190627 +%define release 190628 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index f52301c2ef..8df338265a 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190627" +PI_BUILD="190628" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 73d18a13be..12e927b377 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190627} +{190628} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index bafda8aaef..df44b628ce 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190627)") +#define PANDORA_VERSION ("7.0NG.736(Build 190628)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index f1336d2ab8..6e5b9873bf 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190627))" + VALUE "ProductVersion", "(7.0NG.736(Build 190628))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 8b39df1b04..ccfbbb3ace 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190627 +Version: 7.0NG.736-190628 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 1665ae05d1..270ec1354b 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190627" +pandora_version="7.0NG.736-190628" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 6b175d2a3b..213036374f 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190627'; +$build_version = 'PC190628'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index add341cb50..4e708966e3 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 19aa431817..58de3c6e8d 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190627 +%define release 190628 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index e59b71f0e1..c79285db3f 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190627 +%define release 190628 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 8c2ee3fe84..3b3d487c43 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190627" +PI_BUILD="190628" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index c9ea0135c0..4addd4b6f8 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190627"; +my $version = "7.0NG.736 PS190628"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 99458b0b0d..7e638ace81 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190627"; +my $version = "7.0NG.736 PS190628"; # save program name for logging my $progname = basename($0); From 52f391667a72942cd9b1411f41a86d0a34bb6836 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Fri, 28 Jun 2019 10:24:53 +0200 Subject: [PATCH 229/460] Style changes - #4250 --- pandora_console/extensions/db_status.php | 2 +- pandora_console/godmode/agentes/planned_downtime.list.php | 5 +---- pandora_console/godmode/events/custom_events.php | 4 ++-- pandora_console/include/styles/tables.css | 3 ++- pandora_console/operation/network/network_report.php | 2 +- pandora_console/operation/network/network_usage_map.php | 2 +- pandora_console/operation/users/webchat.php | 4 ++-- 7 files changed, 10 insertions(+), 12 deletions(-) diff --git a/pandora_console/extensions/db_status.php b/pandora_console/extensions/db_status.php index d78ff90fc8..5659ed6d9b 100755 --- a/pandora_console/extensions/db_status.php +++ b/pandora_console/extensions/db_status.php @@ -69,7 +69,7 @@ function extension_db_status() echo "
    "; html_print_input_hidden('db_status_execute', 1); - html_print_submit_button(__('Execute Test'), 'submit', false, 'class="sub"'); + html_print_submit_button(__('Execute Test'), 'submit', false, 'class="sub next"'); echo '
    '; echo ''; diff --git a/pandora_console/godmode/agentes/planned_downtime.list.php b/pandora_console/godmode/agentes/planned_downtime.list.php index 961ea1f7d0..49a72f125d 100755 --- a/pandora_console/godmode/agentes/planned_downtime.list.php +++ b/pandora_console/godmode/agentes/planned_downtime.list.php @@ -52,7 +52,7 @@ if ($migrate_malformed) { // Header. ui_print_page_header( - __('Planned Downtime'), + __('Scheduled Downtime'), 'images/gm_monitoring.png', false, 'planned_downtime', @@ -136,9 +136,6 @@ $table_form = new StdClass(); $table_form->class = 'databox filters'; $table_form->width = '100%'; $table_form->rowstyle = []; -$table_form->rowstyle[0] = 'background-color: #f9faf9;'; -$table_form->rowstyle[1] = 'background-color: #f9faf9;'; -$table_form->rowstyle[2] = 'background-color: #f9faf9;'; $table_form->data = []; $row = []; diff --git a/pandora_console/godmode/events/custom_events.php b/pandora_console/godmode/events/custom_events.php index cfdf50cf17..fb4b6f9ab1 100644 --- a/pandora_console/godmode/events/custom_events.php +++ b/pandora_console/godmode/events/custom_events.php @@ -126,7 +126,7 @@ foreach ($fields_available as $key => $available) { $table->data[0][0] = ''.__('Fields available').''; $table->data[1][0] = html_print_select($fields_available, 'fields_available[]', true, '', '', 0, true, true, false, '', false, 'width: 300px'); $table->data[1][1] = ''.html_print_image( - 'images/darrowright.png', + 'images/darrowright_green.png', true, [ 'id' => 'right', @@ -134,7 +134,7 @@ $table->data[1][1] = ''.html_print_image( ] ).''; $table->data[1][1] .= '



    '.html_print_image( - 'images/darrowleft.png', + 'images/darrowleft_green.png', true, [ 'id' => 'left', diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index a017dae715..c3e1deb94c 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -190,7 +190,8 @@ } .info_table > tbody > tr:hover { - background-color: #eee; + /* This !important is necessary to overwrite the white background of tables with less than 5 rows. */ + background-color: #eee !important; } .info_.profile_list > thead > tr > th > a.tip { diff --git a/pandora_console/operation/network/network_report.php b/pandora_console/operation/network/network_report.php index c9f3edf408..d590e224fb 100644 --- a/pandora_console/operation/network/network_report.php +++ b/pandora_console/operation/network/network_report.php @@ -62,7 +62,7 @@ $style_period = ($is_period) ? '' : 'display: none;'; // Build the table. $table = new stdClass(); -$table->class = 'databox'; +$table->class = 'databox filters'; $table->styleTable = 'width: 100%'; $table->data['0']['0'] = __('Data to show').'  '; $table->data['0']['0'] .= html_print_select( diff --git a/pandora_console/operation/network/network_usage_map.php b/pandora_console/operation/network/network_usage_map.php index 046cc1fcc4..764cd4eae3 100644 --- a/pandora_console/operation/network/network_usage_map.php +++ b/pandora_console/operation/network/network_usage_map.php @@ -67,7 +67,7 @@ $style_period = ($is_period) ? '' : 'display: none;'; // Build the table. $table = new stdClass(); -$table->class = 'databox'; +$table->class = 'databox filters'; $table->styleTable = 'width: 100%'; $table->data['0']['0'] = '
    '; diff --git a/pandora_console/operation/users/webchat.php b/pandora_console/operation/users/webchat.php index db97864863..7e6e58712c 100644 --- a/pandora_console/operation/users/webchat.php +++ b/pandora_console/operation/users/webchat.php @@ -79,10 +79,10 @@ $table->class = 'databox filters'; $table->style[0][1] = 'text-align: right; vertical-align: top;'; $table->data[0][0] = '
    '; $table->data[0][1] = '

    '.__('Users Online').'

    '.'
    '; $table->data[1][0] = ''.__('Message').'   '.html_print_input_text( 'message_box', From 63e0df4434e62781057ae94bc9358f00ef3e7172 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Fri, 28 Jun 2019 12:11:25 +0200 Subject: [PATCH 230/460] Fixed unordered groups --- pandora_console/godmode/agentes/modificar_agente.php | 2 +- pandora_console/include/functions_users.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index 9e7ce18c4e..4f51ede323 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -163,7 +163,7 @@ echo ''; echo __('Group').' '; $own_info = get_user_info($config['id_user']); -if (!$own_info['is_admin'] && check_acl($config['id_user'], 0, 'AW')) { +if (!$own_info['is_admin'] && !check_acl($config['id_user'], 0, 'AR') && !check_acl($config['id_user'], 0, 'AW')) { $return_all_group = false; } else { $return_all_group = true; diff --git a/pandora_console/include/functions_users.php b/pandora_console/include/functions_users.php index 3b4af210d0..d461ca9754 100755 --- a/pandora_console/include/functions_users.php +++ b/pandora_console/include/functions_users.php @@ -293,7 +293,7 @@ function users_get_groups( } // Per-group permissions. else { - $query = 'SELECT * FROM tgrupo ORDER BY parent,id_grupo DESC'; + $query = 'SELECT * FROM tgrupo ORDER BY nombre'; $raw_groups = db_get_all_rows_sql($query); $query = sprintf( From eeffe40b6ba47e6b19d3bf0caaac0f134ec6ab69 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 29 Jun 2019 00:01:07 +0200 Subject: [PATCH 231/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index b6e8eee877..d28b2ec146 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190628 +Version: 7.0NG.736-190629 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 5b33962912..cc1476eb23 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190628" +pandora_version="7.0NG.736-190629" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index e547e26c9d..d9ad04d838 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190628'; +use constant AGENT_BUILD => '190629'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index dae9afb803..0dcdd21e04 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190628 +%define release 190629 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index d195943bad..524fb0f673 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190628 +%define release 190629 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 8df338265a..5f942b61bb 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190628" +PI_BUILD="190629" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 12e927b377..c4ae668ac0 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190628} +{190629} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index df44b628ce..a84a4711c5 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190628)") +#define PANDORA_VERSION ("7.0NG.736(Build 190629)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 6e5b9873bf..a0e4514803 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190628))" + VALUE "ProductVersion", "(7.0NG.736(Build 190629))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index ccfbbb3ace..40b942e9d7 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190628 +Version: 7.0NG.736-190629 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 270ec1354b..8fa22dadd4 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190628" +pandora_version="7.0NG.736-190629" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 213036374f..bbbb059b49 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190628'; +$build_version = 'PC190629'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 4e708966e3..2c3b33186d 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 58de3c6e8d..434cd4dc60 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190628 +%define release 190629 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index c79285db3f..d90eca0c08 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190628 +%define release 190629 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 3b3d487c43..98c0857109 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190628" +PI_BUILD="190629" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 4addd4b6f8..bcb02960c1 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190628"; +my $version = "7.0NG.736 PS190629"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 7e638ace81..2d5beeb20c 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190628"; +my $version = "7.0NG.736 PS190629"; # save program name for logging my $progname = basename($0); From c9f101eda68670de7ddd03365dcfb3526fe97885 Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 30 Jun 2019 00:01:05 +0200 Subject: [PATCH 232/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index d28b2ec146..7af0f4d36c 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190629 +Version: 7.0NG.736-190630 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index cc1476eb23..9699c3aaf3 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190629" +pandora_version="7.0NG.736-190630" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index d9ad04d838..3870c287a2 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190629'; +use constant AGENT_BUILD => '190630'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 0dcdd21e04..1399996932 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190629 +%define release 190630 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 524fb0f673..e962c38618 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190629 +%define release 190630 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 5f942b61bb..0a57d81e27 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190629" +PI_BUILD="190630" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index c4ae668ac0..0a645c12c0 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190629} +{190630} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index a84a4711c5..b2542ed82d 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190629)") +#define PANDORA_VERSION ("7.0NG.736(Build 190630)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index a0e4514803..89c933cc26 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190629))" + VALUE "ProductVersion", "(7.0NG.736(Build 190630))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 40b942e9d7..271b698ec9 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190629 +Version: 7.0NG.736-190630 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 8fa22dadd4..3bba8bd8cd 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190629" +pandora_version="7.0NG.736-190630" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index bbbb059b49..160b432514 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190629'; +$build_version = 'PC190630'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 2c3b33186d..4869f70136 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 434cd4dc60..c8d1b4f325 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190629 +%define release 190630 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index d90eca0c08..defdeba862 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190629 +%define release 190630 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 98c0857109..abf486fafa 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190629" +PI_BUILD="190630" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index bcb02960c1..838fd5b529 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190629"; +my $version = "7.0NG.736 PS190630"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 2d5beeb20c..4602a8190f 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190629"; +my $version = "7.0NG.736 PS190630"; # save program name for logging my $progname = basename($0); From dd75aa6a42645a231a14f38cfd97866bdc0dcdfc Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 1 Jul 2019 00:01:07 +0200 Subject: [PATCH 233/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 7af0f4d36c..72471bf73d 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190630 +Version: 7.0NG.736-190701 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 9699c3aaf3..1d0950a6c2 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190630" +pandora_version="7.0NG.736-190701" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 3870c287a2..c75bac002b 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190630'; +use constant AGENT_BUILD => '190701'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 1399996932..75b1232417 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190630 +%define release 190701 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index e962c38618..a7b3d24163 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190630 +%define release 190701 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 0a57d81e27..14b4bd5092 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190630" +PI_BUILD="190701" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 0a645c12c0..ecfd905763 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190630} +{190701} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index b2542ed82d..138daf143a 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190630)") +#define PANDORA_VERSION ("7.0NG.736(Build 190701)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 89c933cc26..2a4e9a924d 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190630))" + VALUE "ProductVersion", "(7.0NG.736(Build 190701))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 271b698ec9..c0f73ed08b 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190630 +Version: 7.0NG.736-190701 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 3bba8bd8cd..a557249535 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190630" +pandora_version="7.0NG.736-190701" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 160b432514..e2e2bd6c63 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190630'; +$build_version = 'PC190701'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 4869f70136..c48f32de4b 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index c8d1b4f325..c44e40570a 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190630 +%define release 190701 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index defdeba862..3613e6b0ae 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190630 +%define release 190701 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index abf486fafa..1d140cba64 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190630" +PI_BUILD="190701" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 838fd5b529..8c89121a0f 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190630"; +my $version = "7.0NG.736 PS190701"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 4602a8190f..b59d7f7076 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190630"; +my $version = "7.0NG.736 PS190701"; # save program name for logging my $progname = basename($0); From a6327a16ad6f3493e07c5e421ed10700458754bf Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 1 Jul 2019 12:46:09 +0200 Subject: [PATCH 234/460] Session expiration ignoring notifications checks --- pandora_console/ajax.php | 55 +++++--- pandora_console/include/functions_config.php | 12 +- pandora_console/include/load_session.php | 130 ++++++++++++++++--- 3 files changed, 159 insertions(+), 38 deletions(-) diff --git a/pandora_console/ajax.php b/pandora_console/ajax.php index 92f6c146bc..beb07e7752 100644 --- a/pandora_console/ajax.php +++ b/pandora_console/ajax.php @@ -1,17 +1,34 @@ $session_id]); + $retval_write = db_process_sql_update( + 'tsessions_php', + $values, + ['id_session' => $session_id] + ); } return $retval_write !== false; } +/** + * Destroy a session. + * + * @param string $session_id Session Id. + * + * @return boolean + */ function pandora_session_destroy($session_id) { $session_id = addslashes($session_id); - $retval = (bool) db_process_sql_delete('tsessions_php', ['id_session' => $session_id]); + $retval = (bool) db_process_sql_delete( + 'tsessions_php', + ['id_session' => $session_id] + ); return $retval; } +/** + * Session garbage collector. + * + * @param integer $max_lifetime Max lifetime. + * + * @return boolean. + */ function pandora_session_gc($max_lifetime=300) { global $config; @@ -80,7 +164,12 @@ function pandora_session_gc($max_lifetime=300) $time_limit = (time() - $max_lifetime); - $retval = (bool) db_process_sql_delete('tsessions_php', ['last_active' => '<'.$time_limit]); + $retval = (bool) db_process_sql_delete( + 'tsessions_php', + [ + 'last_active' => '<'.$time_limit, + ] + ); return $retval; } @@ -88,5 +177,12 @@ function pandora_session_gc($max_lifetime=300) // FIXME: SAML should work with pandora session handlers if (db_get_value('value', 'tconfig', 'token', 'auth') != 'saml') { - $result_handler = session_set_save_handler('pandora_session_open', 'pandora_session_close', 'pandora_session_read', 'pandora_session_write', 'pandora_session_destroy', 'pandora_session_gc'); + $result_handler = session_set_save_handler( + 'pandora_session_open', + 'pandora_session_close', + 'pandora_session_read', + 'pandora_session_write', + 'pandora_session_destroy', + 'pandora_session_gc' + ); } From 6349c29eb50b052e63cdcf0273460f93b9c559f7 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Mon, 1 Jul 2019 13:45:42 +0200 Subject: [PATCH 235/460] Add message for autenticaition error SAML --- pandora_console/general/noaccesssaml.php | 164 ++++++++++++++++++++++ pandora_console/include/auth/saml.php | 166 +++++++++++++++++++++++ pandora_console/index.php | 11 +- 3 files changed, 338 insertions(+), 3 deletions(-) create mode 100644 pandora_console/general/noaccesssaml.php create mode 100755 pandora_console/include/auth/saml.php diff --git a/pandora_console/general/noaccesssaml.php b/pandora_console/general/noaccesssaml.php new file mode 100644 index 0000000000..e357e040dc --- /dev/null +++ b/pandora_console/general/noaccesssaml.php @@ -0,0 +1,164 @@ + + + + + + + +
    + +
    + images/input_cross.png'> +
    + +
    +
    + +
    + +
    +
    '; + echo __('Please make sure you have SAML authentication properly configured. For more information the error to access this page are recorded in security logs of %s System Database', get_product_name()); + ?> + +
    + +
    + OK +
    +
    +
    + +
    + + + + + diff --git a/pandora_console/include/auth/saml.php b/pandora_console/include/auth/saml.php new file mode 100755 index 0000000000..6ffbc8cf4b --- /dev/null +++ b/pandora_console/include/auth/saml.php @@ -0,0 +1,166 @@ +requireAuth(); + $session = SimpleSAML_Session::getSessionFromRequest(); + $session->cleanup(); + $attributes = $as->getAttributes(); + + if (empty($attributes)) { + return false; + } + + $id_user = $attributes[SAML_MAIL_IN_PANDORA][0]; + $email = $attributes[SAML_MAIL_IN_PANDORA][0]; + $group_name = $attributes[SAML_GROUP_IN_PANDORA][0]; + $profiles_and_tags = $attributes[SAML_ROLE_AND_TAG]; + + $profile_names = []; + $tag_names = []; + // Manages array with tags and roles to separate them + foreach ($profiles_and_tags as $profile_or_tag) { + $is_profile_or_tag = explode(SAML_DEFAULT_PROFILES_AND_TAGS_FORM, $profile_or_tag); + $is_profile_or_tag2 = explode(':', $is_profile_or_tag[1]); + if ($is_profile_or_tag2[0] == 'role') { + $profile_names[] = $is_profile_or_tag2[1]; + } else if ($is_profile_or_tag2[0] == 'tag') { + $tag_names[] = $is_profile_or_tag2[1]; + } + } + + // Connect to Pandora db + $connection = mysql_connect_db( + $config['pandora_server'], + $config['pandora_dbname'], + $config['pandora_user'], + $config['pandora_pass'] + ); + + if ($connection === false) { + return false; + } + + // Get the red.es user id + $rows = db_get_all_rows_sql( + "SELECT * FROM tusuario + WHERE id_user = '".$id_user."'", + false, + false, + $connection + ); + + // Checks group id, profiles id and tags id + $group_id = ''; + $profile_id = []; + $tag_id = ''; + $tags_to_profile = ''; + if ($group_name != '') { + $group_id = db_get_all_rows_sql("SELECT id_grupo FROM tgrupo WHERE nombre = '".$group_name."'"); + $group_id = $group_id[0]['id_grupo']; + if (empty($group_id)) { + $config['auth_error'] = 'Group not found in database'; + db_pandora_audit('Logon Failed', 'Group '.$group_name.' not found in database', $_SERVER['REMOTE_ADDR']); + return false; + } + } + + if (!empty($profile_names)) { + foreach ($profile_names as $profile_name) { + $profile_id[] = db_get_row_sql("SELECT id_perfil FROM tperfil WHERE name = '".io_safe_input($profile_name)."'"); + } + } + + if (!empty($tag_names)) { + $i = 0; + foreach ($tag_names as $tag_name) { + $tag_id = db_get_row_sql("SELECT id_tag FROM ttag WHERE name = '".io_safe_input($tag_name)."'"); + if ($i == 0) { + $tags_to_profile = (String) $tag_id['id_tag']; + } else { + $tags_to_profile .= ','.(String) $tag_id['id_tag']; + } + + $i++; + } + } + + // If user does not exist in Pandora + if (empty($rows)) { + if ($id_user != '') { + $values_user = []; + $values_user['id_user'] = $id_user; + $values_user['email'] = $email; + $result_insert_user = db_process_sql_insert('tusuario', $values_user); + + // Separates user insert of profile insert + $values_user_profile = []; + $values_user_profile['id_usuario'] = $id_user; + $values_user_profile['id_grupo'] = $group_id; + $values_user_profile['tags'] = $tags_to_profile; + foreach ($profile_id as $id) { + $values_user_profile['id_perfil'] = $id['id_perfil']; + $result_insert_user_profile = db_process_sql_insert('tusuario_perfil', $values_user_profile); + } + + if (!$result_insert_user_profile) { + $config['auth_error'] = 'Login error'; + return false; + } + + return $id_user; + } else { + return false; + } + } else { + $user = $rows[0]; + // To update the profiles, delete the old and insert the new + $have_profiles = db_get_all_rows_sql("SELECT id_up FROM tusuario_perfil WHERE id_usuario = '".$user['id_user']."'"); + if ($have_profiles) { + $delete_old_profiles = db_process_sql("DELETE FROM tusuario_perfil WHERE id_usuario = '".$user['id_user']."'"); + } + + $values_user_profile = []; + $values_user_profile['id_usuario'] = $user['id_user']; + $values_user_profile['id_grupo'] = $group_id; + $values_user_profile['tags'] = $tags_to_profile; + foreach ($profile_id as $id) { + $values_user_profile['id_perfil'] = $id['id_perfil']; + $result_insert_user_profile = db_process_sql_insert('tusuario_perfil', $values_user_profile); + } + + return $user['id_user']; + } + + $config['auth_error'] = 'User not found in database or incorrect password'; + + return false; +} diff --git a/pandora_console/index.php b/pandora_console/index.php index 3c95074171..a543829bb7 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -359,12 +359,17 @@ if (! isset($config['id_user'])) { $nick_in_db = $_SESSION['prepared_login_da']['id_user']; $expired_pass = false; } else if (($config['auth'] == 'saml') && ($login_button_saml)) { - include_once ENTERPRISE_DIR.'/include/auth/saml.php'; - - $saml_user_id = saml_process_user_login(); + if (!include_once 'include/auth/saml.php') { + include_once 'general/noaccesssaml.php'; + } else { + $saml_user_id = saml_process_user_login(); + } $nick_in_db = $saml_user_id; + if (!$nick_in_db) { + include_once 'general/noaccesssaml.php'; + include_once $config['saml_path'].'simplesamlphp/lib/_autoload.php'; $as = new SimpleSAML_Auth_Simple('PandoraFMS'); $as->logout(); From 52025efbee2ddc95a1931a0c74c00368b8d330e7 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 1 Jul 2019 13:55:44 +0200 Subject: [PATCH 236/460] Modified control for module edition --- .../agentes/module_manager_editor_common.php | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index fbdd620f77..e09a14ae92 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -134,7 +134,9 @@ $largeClassDisabledBecauseInPolicy = ''; $page = get_parameter('page', ''); -if (strstr($page, 'policy_modules') === false && $id_agent_module) { +$in_policies_page = strstr($page, 'policy_modules'); + +if ($in_policies_page === false && $id_agent_module) { if ($config['enterprise_installed']) { if (policies_is_module_linked($id_agent_module) == 1) { $disabledBecauseInPolicy = 1; @@ -243,6 +245,12 @@ $table_simple->data[0][3] .= html_print_select_from_sql( $disabledBecauseInPolicy ); +if ((isset($id_agent_module) && $id_agent_module) || $id_policy_module != 0) { + $edit = false; +} else { + $edit = true; +} + $in_policy = strstr($page, 'policy_modules'); if (!$in_policy) { // Cannot select the current module to be itself parent @@ -273,17 +281,6 @@ if (!$in_policy) { $table_simple->data[2][0] = __('Type').' '.ui_print_help_icon($help_type, true, '', 'images/help_green.png', '', 'module_type_help'); $table_simple->data[2][0] .= html_print_input_hidden('id_module_type_hidden', $id_module_type, true); -if (isset($id_agent_module)) { - if ($id_agent_module) { - $edit = false; - } else { - $edit = true; - } -} else { - // Run into a policy - $edit = true; -} - if (!$edit) { $sql = sprintf( 'SELECT id_tipo, nombre From 9163f725eda92e59f021b3172a86dfe03e027ffa Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Mon, 1 Jul 2019 16:57:33 +0200 Subject: [PATCH 237/460] Created black theme - #4194 --- pandora_console/extras/pandora_diag.php | 2 +- pandora_console/include/functions_ui.php | 14 +- pandora_console/include/styles/pandoraPDF.css | 2 + .../include/styles/pandora_black.css | 4365 +---------------- pandora_console/index.php | 9 +- 5 files changed, 189 insertions(+), 4203 deletions(-) diff --git a/pandora_console/extras/pandora_diag.php b/pandora_console/extras/pandora_diag.php index f3b11177d1..9258a3be42 100644 --- a/pandora_console/extras/pandora_diag.php +++ b/pandora_console/extras/pandora_diag.php @@ -362,7 +362,7 @@ if ($console_mode == 1) { true ); - echo ""; + echo "
    "; echo "'; } diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index ef8089ac3a..33603c8072 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -1755,6 +1755,12 @@ function ui_process_page_head($string, $bitfield) // Add the dialog styles CSS. $config['css']['dialog'] = 'include/styles/js/introjs.css'; + // If the theme is the default, we don't load it twice. + if ($config['style'] !== 'pandora') { + // It loads the last of all. + $config['css']['theme'] = 'include/styles/'.$config['style'].'.css'; + } + // If skin's css files exists then add them. if ($exists_css) { foreach ($skin_styles as $filename => $name) { @@ -1766,10 +1772,10 @@ function ui_process_page_head($string, $bitfield) // User style should go last so it can rewrite common styles. $config['css'] = array_merge( [ - 'common' => 'include/styles/common.css', - 'menu' => 'include/styles/menu.css', - 'tables' => 'include/styles/tables.css', - $config['style'] => 'include/styles/'.$config['style'].'.css', + 'common' => 'include/styles/common.css', + 'menu' => 'include/styles/menu.css', + 'tables' => 'include/styles/tables.css', + 'general' => 'include/styles/pandora.css', ], $config['css'] ); diff --git a/pandora_console/include/styles/pandoraPDF.css b/pandora_console/include/styles/pandoraPDF.css index 37d527c30b..5bb0e15174 100644 --- a/pandora_console/include/styles/pandoraPDF.css +++ b/pandora_console/include/styles/pandoraPDF.css @@ -1,4 +1,6 @@ /** + * Exclude css from visual styles + * * Extension to manage a list of gateways and the node address where they should * point to. * diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css index 8e2d756e0c..e2a4f41602 100644 --- a/pandora_console/include/styles/pandora_black.css +++ b/pandora_console/include/styles/pandora_black.css @@ -21,4242 +21,217 @@ Description: The default Pandora FMS theme layout // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* Tree view styles */ -@import url(tree.css); - -* { - font-family: verdana, sans-serif; - letter-spacing: 0.03pt; - font-size: 8pt; - color: #fff; -} -svg * { - font-size: 11pt; -} -body { - background-color: #5b5b5b; - margin: 0 auto; -} - -div#page { - background: #5b5b5b; - background-image: none; -} - -body.pure { - background-color: #5b5b5b; -} -input, -textarea { - border: 1px solid #ddd; -} - -textarea { - padding: 5px; - min-height: 100px; - width: 99%; -} -textarea.conf_editor { - padding: 5px; - width: 650px; - height: 350px; -} -textarea.conf_error { - background-image: url(../../images/err.png); - background-repeat: no-repeat; - background-position: top right; -} -input { - padding: 2px 3px 4px 3px; - vertical-align: middle; -} - -input[type="checkbox"] { - display: inline; -} - -select { - padding: 2px 3px 3px 3px; - vertical-align: middle; -} -input.button { - font-family: Arial, Sans-serif; - border: 4px solid #ccc; - background: #5b5b5b; - padding: 2px 3px; - margin: 10px 15px; -} - -input[type="submit"], -input[type="button"] { - cursor: pointer; -} - -select { - border: 1px solid #ddd; -} -checkbox { - padding: 4px; - border: 1px solid #eee; -} -h1, -h2, -h3, -h4 { - font-weight: bold; - font-size: 1em; - font-family: Arial, Sans-serif; - text-transform: uppercase; - color: #fff; - padding-bottom: 4px; - padding-top: 7px; -} -h1 { - font-size: 16px; -} -h2 { - font-size: 15px; -} -h3 { - font-size: 14px; -} -h4 { - margin-bottom: 10px; - font-size: 13px; - color: #fff; - text-transform: none; -} -a { - color: #fff; - text-decoration: none; -} -a:hover { - color: #fff; - text-decoration: underline; -} -a.white_bold { - color: #eee; - text-decoration: none; - font-weight: bold; -} -a.white { - color: #eee; - text-decoration: none; -} -p.center { - text-align: center; -} -h1#log_title { - font-size: 18px; - margin-bottom: 0px; - color: #fff; - width: 300px; -} -div#log_msg { - display: none; -} -div#error_buttons { - margin-top: 20px; -} -div#error_buttons a { - margin: 14px; -} - -#noaccess { - position: relative; - margin-top: 25px; - left: 15px; - padding-top: 5px; - background-color: #5b5b5b; - border-top-left-radius: 2px; - border-top-right-radius: 2px; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; -} - -#noaccess-title { - color: #fff; - font-weight: bold; - padding-top: 5px; - margin-left: 5px; - background: none repeat scroll 0% 0% #82b92e; - border-top-left-radius: 2px; - border-top-right-radius: 2px; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - text-align: center; -} - -#noaccess-text { - font-size: 12px; - text-align: justify; - padding-top: 25px; - padding-right: 50px; - float: right; -} - -#noaccess-image { - position: relative; - left: 10px; - top: 10px; - float: left; -} - -div#activity { - padding-top: 0px; - padding-bottom: 18px; -} -div#noa { - float: right; - padding-right: 50px; - margin-top: 25px; -} -div#db_f { - text-align: justify; - margin: auto; - padding: 0.5em; - width: 55em; - margin-top: 3em; -} -div#db_ftxt { - float: right; - padding-top: 10px; -} -div#container { - margin: 0 auto; - min-width: 960px; - text-align: left; - #border-left: solid 2px #000; - #border-right: solid 2px #000; - #border-top: solid 2px #000; - #margin-top: 5px; - height: 100%; - background: #5b5b5b; -} -div#page { - width: 960px; - clear: both; -} -div#main { - width: auto; - margin: 0px 2% 0px 0%; - float: right; - position: relative; - min-height: 850px; -} -div#main_help { - width: 100%; - padding-left: 0px; - padding-top: 0px; - background-color: #5b5b5b; - margin-top: 0px; - margin-left: 0px; - margin-right: 0px; - border-radius: 10px; -} -div#main_help div.databox, -.license_databox { - background: F3F3F3; - -moz-border-radius: 8px; - -webkit-border-radius: 8px; - border-radius: 8px; - border: 0px; - padding-left: 25px; - padding-right: 25px; - margin-top: 10px; - -moz-box-shadow: -1px 1px 6px #aaa; - -webkit-box-shadow: -1px 1px 6px #aaa; - box-shadow: -1px 1px 6px #aaa; -} - -div#main_help div.databox h1 { - padding-bottom: 0px; - margin-bottom: 0px; - font-weight: bold; - font-family: sans-serif, verdana; -} - -div#main_help div.databox h3, -div#main_help div.databox h2 { - color: #6eb432; - font-family: sans-serif, verdana; -} - -div#main_help div.databox h3 { - font-size: 12px; -} - -div#main_help a.footer, -div#main_help span { - color: #999; -} - -a.footer, -a.footer span { - font-size: 9px; - color: white; -} - -div#main_help div.databox hr { - width: 100%; - border: 0px; - height: 1px; - background-color: #222; - margin: 0px; -} - -div#main_help div.databox p { - line-height: 15px; - text-align: justify; -} - -div#menu_container { - -moz-border-top-right-radius: 6px; - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - z-index: 1010; - width: 40px; - height: 100%; -} - -div#menu { - width: 45px; - float: left; - z-index: 2000; - position: absolute; -} - -div#head { - font-size: 8pt; - width: 100%; - height: 60px; - padding-top: 0px; - margin-bottom: 20px; - border-bottom-style: solid; - border-bottom-width: 3px; - border-color: #82b92e; - min-width: 882px; - background-color: #333; - color: white; - background-image: url("../../images/header_f2b.jpg"); -} - -.fixed_header { - z-index: 9999; - position: fixed; - left: 0; - top: 0; - width: 100%; -} - -div#foot { - font-size: 6pt; - border-top: solid 2px #222; - padding-top: 8px; - padding-bottom: 5px; - text-align: center; - background: #333333; - height: 30px; - clear: both; - width: auto; -} -#ver { - margin-bottom: 25px; -} - -/****************/ -/* LOGIN STYLES */ -/****************/ - -@font-face { - font-family: "Nunito"; - font-style: normal; - font-weight: 400; - src: local("Nunito-Regular"), url(../../fonts/nunito.woff) format("woff"); -} - -@font-face { - font-family: "roboto"; - src: url("../../fonts/roboto.woff2") format("woff2"); -} - -@font-face { - font-family: "opensans"; - src: url("../../fonts/opensans.woff2") format("woff2"); -} - -@font-face { - font-family: "lato"; - src: url("../../fonts/lato.woff2") format("woff2"); -} - -@font-face { - font-family: "leaguegothic"; - src: url("../../fonts/leaguegothic.woff") format("woff"); -} - -#login_body { - /* Set rules to fill background */ - min-height: 100%; - min-width: 1024px; - width: 100%; - z-index: -9999; - position: absolute; -} - -@media screen and (max-width: 1024px) { - /* Specific to this particular image */ - #login_body { - left: 50%; - margin-left: -512px; /* 50% */ - } -} -@media screen and (max-width: 1100px) { - /* Specific to this particular image */ - #login_body { - background-image: url("../../images/backgrounds/fondo_madera_bn_1100.jpg"); - background-repeat: repeat; - background-position: center center; - } -} -@media screen and (max-width: 1400px) { - /* Specific to this particular image */ - #login_body { - background-image: url("../../images/backgrounds/fondo_madera_bn_1400.jpg"); - background-repeat: repeat; - background-position: center center; - } -} -@media screen and (max-width: 2000px) { - /* Specific to this particular image */ - #login_body { - background-image: url("../../images/backgrounds/fondo_madera_bn_2000.jpg"); - background-repeat: repeat; - background-position: center center; - } -} -@media screen and (min-width: 2000px) { - /* Specific to this particular image */ - #login_body { - background-image: url("../../images/backgrounds/fondo_madera_bn_2500.jpg"); - background-repeat: repeat; - background-position: center center; - } -} - -p.log_in { - color: #fff; - padding: 0px 10px; - width: 300px; -} -h1#log_f { - color: #c00; - border-bottom: 1px solid #c00; - padding-bottom: 3px; -} -div#login { - border-width: 2px 2px 2px 2px; - border-style: solid; - border-color: #000; - font-size: 12px; -} -div#login_in, -#login_f { - /*margin: 0 auto 0 140px; - width: 400px;*/ -} - -.databox_login, -.databox_logout { - border-radius: 5px; - height: 200px; -} - -#login_inner { - width: 100%; - height: 100%; - border-radius: 5px; - /* Browser without multibackground support */ - background-color: #373737; -} -#login_outer { - border-radius: 11px; - background-color: #000; - width: 500px; - color: #fff; - margin: 0px auto; -} - -.version_login { - transform: rotate(36deg); - /* Old browser support */ - -ms-transform: rotate(36deg); /* IE */ - -moz-transform: rotate(36deg); /* FF */ - -o-transform: rotate(36deg); /* Opera */ - -webkit-transform: rotate(36deg); /* Safari and Chrome */ - - float: right; - margin-top: 18px; - width: 80px; - height: 0px; - border-right: 13px solid transparent; - border-left: 25px solid transparent; - border-bottom: 18px solid #82b92e; - left: 16px; - position: relative; -} - -#login_outer * { - font-family: Nunito, "Arial Rounded MT", Arial, Helvetica, sans-serif; - font-weight: bold; -} -.login_border { - border-right: 1px solid #fff; - text-align: center; -} -table#login_layout { - width: 100%; - height: 160px; - position: absolute; -} - -div#error_login { - text-align: center; - margin-top: 5px; - margin-left: 5px; - width: 75%; - float: right; - text-align: left; - top: 100px; -} - -div#error_login_icon { - #margin: 0 auto; - margin-top: 10px; - margin-right: 7px; - text-align: center; - #margin-left: 20px; - width: 20%; - float: right; -} - -div#login_f { - margin-top: 10px; - margin-bottom: 25px; -} - -a:focus, -input:focus, -button:focus { - utline-width: 0; - outline: 0; -} - -/*DIV.login_links { - margin: 10px 0px 0px; - color: #FFF; - text-align: center; -} - -DIV.login_links>a { - color: #FFF; -} - -DIV.login_button{ - text-align:right; - width: 100%; - margin-top: 15px; -} - -DIV.login_button>input{ - background-color: #373737; - border: 0px none; - background-image: url("../../images/input_go.png"); - padding-right: 25px; -} - -.login_page{ - height: 200px; - padding-top: 10%; - text-align: center; - width: 100%; - position: absolute; -} - -input.next_login { - padding-right: 12px; - padding-left: 12px; - height: 23px; - text-align: center; - font-weight: 600; - letter-spacing: 0.5pt; - font-size: 12px; - border-radius: 3px; -} - -DIV.login_nick, DIV.login_pass { - text-align:left; - padding-left: 15px; - margin-top: 10px; -} - -DIV.login_nick>input, DIV.login_pass>input { - height: 20px; - border-radius:0px; - margin-left: 10px; -} - -DIV.login_nick>input:focus,DIV.login_pass>input:focus { - outline-width: 0px; - border-color: #82b92e; - background-color: #82b92e; - font-size: 12px; - height: 20px; - box-shadow: 0px 0px 3px 3px #82b92e; -} - -DIV.login_nick>img, DIV.login_pass>img { - vertical-align: middle; -} - -DIV.login_links a { - letter-spacing: 0.8pt; -} - -DIV.login_links a:first-child { - margin-right: 5px; -} - -DIV.login_links a:last-child { - margin-left: 5px; -} - -DIV.login_nick_text { - text-align: left; - margin-bottom: 3px; - width: 191px; - margin: 5px 0px; - font-size: 12px; - letter-spacing: 0.4pt; -} - -DIV.login_pass_text { - text-align: left; - width: 191px; - margin: 13px 0px 5px 0px; - font-size: 12px; - letter-spacing: 0.4pt; -} - -DIV.login_pass { -} - -input.login { - border: 0px none; - margin: 0px 0px; - width: 135px; - height: 18px; - font-weight: 100; - - letter-spacing: 0.3pt; -} - -input.login_user { - - color: #373737; - padding-left: 8px; - width: 179px; - color: #222; - height: 18px; -} - -input.login_password { - - padding-left: 8px; - width: 179px; - color: #222; - height: 20px; -} -*/ - -.databox_error { - width: 657px; - height: 400px; - border: none; - background-color: #fafafa; - background: url(../../images/splash_error.png) no-repeat; -} - -#ver_num { - margin: 0px auto; - width: 100%; - position: absolute; - bottom: 10px; - color: #fff; - text-align: center; -} - -input:-webkit-autofill { - #-webkit-box-shadow: 0 0 0px 1000px #ddd inset; -} -/***********************/ -/* END OF LOGIN STYLES */ -/***********************/ - -th > label { - padding-top: 7px; -} -input.chk { - margin-right: 0px; - border: 0px none; - height: 14px; -} -input.datos { - background-color: #f5f5f5; -} -input.datos_readonly { - background-color: #050505; -} - -input.sub { - font-weight: normal; - - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - - font-size: 8pt; - - background-color: #333; - background-repeat: no-repeat; - background-position: 92% 3px; - - color: white; - padding: 3px 3px 5px 12px; - - border-color: #333; -} - -input.sub[disabled] { - color: #b4b4b4; - background-color: #f3f3f3; - border-color: #b6b6b6; - cursor: default; -} - -input.next, -input.upd, -input.ok, -input.wand, -input.delete, -input.cog, -input.target, -input.search, -input.copy, -input.add, -input.graph, -input.percentile, -input.binary, -input.camera, -input.config, -input.cancel, -input.default, -input.filter, -input.pdf { - padding-right: 30px; - height: 23px; -} - -input.next { - background-image: url(../../images/input_go.png); -} -input.upd { - background-image: url(../../images/input_update.png); -} -input.wand { - background-image: url(../../images/input_wand.png); -} -input.wand:disabled { - background-image: url(../../images/input_wand.disabled.png); -} -input.search { - background-image: url(../../images/input_zoom.png); -} -input.search:disabled { - background-image: url(../../images/input_zoom.disabled.png); -} -input.ok { - background-image: url(../../images/input_tick.png); -} -input.ok:disabled { - background-image: url(../../images/input_tick.disabled.png); -} -input.add { - background-image: url(../../images/input_add.png); -} -input.add:disabled { - background-image: url(../../images/input_add.disabled.png); -} -input.cancel { - background-image: url(../../images/input_cross.png); -} -input.cancel:disabled { - background-image: url(../../images/input_cross.disabled.png); -} -input.delete { - background-image: url(../../images/input_delete.png); -} -input.delete:disabled { - background-image: url(../../images/input_delete.disabled.png); -} -input.cog { - background-image: url(../../images/input_cog.png); -} -input.cog:disabled { - background-image: url(../../images/input_cog.disabled.png); -} -input.config { - background-image: url(../../images/input_config.png); -} -input.config:disabled { - background-image: url(../../images/input_config.disabled.png); -} -input.filter { - background-image: url(../../images/input_filter.png); -} -input.filter:disabled { - background-image: url(../../images/input_filter.disabled.png); -} -input.pdf { - background-image: url(../../images/input_pdf.png); -} -input.pdf:disabled { - background-image: url(../../images/input_pdf.disabled.png); -} -input.camera { - background-image: url(../../images/input_camera.png); -} - -#toolbox #auto_save { - padding-top: 5px; -} - -#toolbox { - margin-top: 13px; -} -input.visual_editor_button_toolbox { - padding-right: 15px; - padding-top: 10px; - margin-top: 5px; -} -input.delete_min { - background: #fefefe url(../../images/cross.png) no-repeat center; -} -input.delete_min[disabled] { - background: #fefefe url(../../images/cross.disabled.png) no-repeat center; -} -input.graph_min { - background: #fefefe url(../../images/chart_curve.png) no-repeat center; -} -input.graph_min[disabled] { - background: #fefefe url(../../images/chart_curve.disabled.png) no-repeat - center; -} -input.percentile_min { - background: #fefefe url(../../images/chart_bar.png) no-repeat center; -} -input.percentile_min[disabled] { - background: #fefefe url(../../images/chart_bar.disabled.png) no-repeat center; -} -input.percentile_item_min { - background: #fefefe url(../../images/percentile_item.png) no-repeat center; -} -input.percentile_item_min[disabled] { - background: #fefefe url(../../images/percentile_item.disabled.png) no-repeat - center; -} -input.binary_min { - background: #fefefe url(../../images/binary.png) no-repeat center; -} -input.binary_min[disabled] { - background: #fefefe url(../../images/binary.disabled.png) no-repeat center; -} -input.camera_min { - background: #fefefe url(../../images/camera.png) no-repeat center; -} -input.camera_min[disabled] { - background: #fefefe url(../../images/camera.disabled.png) no-repeat center; -} -input.config_min { - background: #fefefe url(../../images/config.png) no-repeat center; -} -input.config_min[disabled] { - background: #fefefe url(../../images/config.disabled.png) no-repeat center; -} -input.label_min { - background: #fefefe url(../../images/tag_red.png) no-repeat center; -} -input.label_min[disabled] { - background: #fefefe url(../../images/tag_red.disabled.png) no-repeat center; -} -input.icon_min { - background: #fefefe url(../../images/photo.png) no-repeat center; -} -input.icon_min[disabled] { - background: #fefefe url(../../images/photo.disabled.png) no-repeat center; -} -input.box_item { - background: #fefefe url(../../images/box_item.png) no-repeat center; -} -input.box_item[disabled] { - background: #fefefe url(../../images/box_item.disabled.png) no-repeat center; -} -input.line_item { - background: #fefefe url(../../images/line_item.png) no-repeat center; -} -input.line_item[disabled] { - background: #fefefe url(../../images/line_item.disabled.png) no-repeat center; -} -input.copy_item { - background: #fefefe url(../../images/copy_visualmap.png) no-repeat center; -} -input.copy_item[disabled] { - background: #fefefe url(../../images/copy_visualmap.disabled.png) no-repeat - center; -} -input.grid_min { - background: #fefefe url(../../images/grid.png) no-repeat center; -} -input.grid_min[disabled] { - background: #fefefe url(../../images/grid.disabled.png) no-repeat center; -} -input.save_min { - background: #fefefe url(../../images/file.png) no-repeat center; -} -input.save_min[disabled] { - background: #fefefe url(../../images/file.disabled.png) no-repeat center; -} -input.service_min { - background: #fefefe url(../../images/box.png) no-repeat center; -} -input.service_min[disabled] { - background: #fefefe url(../../images/box.disabled.png) no-repeat center; -} - -input.group_item_min { - background: #fefefe url(../../images/group_green.png) no-repeat center; -} -input.group_item_min[disabled] { - background: #fefefe url(../../images/group_green.disabled.png) no-repeat - center; -} - -div#cont { - position: fixed; - max-height: 320px; - overflow-y: auto; - overflow-x: hidden; -} - -.termframe { - background-color: #82b92e; -} - -table, -img { - border: 0px; -} - -tr:first-child > th { - background-color: #373737; -} - -th { - color: #fff; - background-color: #666; - font-size: 7.5pt; - letter-spacing: 0.3pt; -} -tr.datos, -tr.datost, -tr.datosb, -tr.datos_id, -tr.datosf9 { - #background-color: #eaeaea; -} - -tr.datos2, -tr.datos2t, -tr.datos2b, -tr.datos2_id, -tr.datos2f9 { - #background-color: #f2f2f2; -} - -tr.datos:hover, -tr.datost:hover, -tr.datosb:hover, -tr.datos_id:hover, -tr.datosf9:hover, -tr.datos2:hover, -tr.datos2t:hover, -tr.datos2b:hover, -tr.datos2_id:hover, -tr.datos2f9:hover { - #background-color: #efefef; -} - -/* Checkbox styles */ -td input[type="checkbox"] { - /* Double-sized Checkboxes */ - -ms-transform: scale(1.3); /* IE */ - -moz-transform: scale(1.3); /* FF */ - -o-transform: scale(1.3); /* Opera */ - -webkit-transform: scale(1.3); /* Safari and Chrome */ - padding: 10px; - margin-top: 2px; - display: table-cell; -} - -td.datos3, -td.datos3 * { - background-color: #666; - color: white; -} - -td.datos4, -td.datos4 * { - /*Add because in php the function html_print_table write style in cell and this is style head.*/ - text-align: center; - background-color: #666; - color: white; -} - -td.datos_id { - color: #1a313a; -} - -tr.disabled_row_user * { - color: grey; -} - -.bg { - /* op menu */ - background: #82b92e; -} - -.bg2 { - /* main page */ - background-color: #0a160c; -} -.bg3 { - /* godmode */ - background: #666666; -} -.bg4 { - /* links */ - background-color: #989898; -} -.bg, -.bg2, -.bg3, -.bg4 { - position: relative; - width: 100%; -} -.bg { - height: 20px; -} -.bg2, -.bg3, -.bg4 { - height: 18px; -} -.f10, -#ip { - font-size: 7pt; - text-align: center; -} -.f9, -.f9i, -.f9b, -.datos_greyf9, -.datos_bluef9, -.datos_greenf9, -.datos_redf9, -.datos_yellowf9, -td.f9, -td.f9i, -td.datosf9, -td.datos2f9 { - font-size: 6.5pt; -} -.f9i, -.redi { - font-style: italic; -} -.tit { - padding: 6px 0px; - height: 14px; -} -.tit, -.titb { - font-weight: bold; - color: #fff; - text-align: center; -} - -.suc * { - color: #5a8629; -} - -.info * { - color: #006f9d; -} - -.error * { - color: #f85858; -} - -.warning * { - color: #f3b200; -} - -.help { - background: url(../../images/help.png) no-repeat; -} -.red, -.redb, -.redi, -.error { - color: #c00; -} - -.sep { - margin-left: 30px; - border-bottom: 1px solid #708090; - width: 100%; -} -.orange { - color: #fd7304; -} -.green { - color: #5a8629; -} -.yellow { - color: #f3c500; -} -.greenb { - color: #00aa00; -} -.grey { - color: #808080; - font-weight: bold; -} -.blue { - color: #5ab7e5; - font-weight: bold; -} -.redb, -.greenb, -td.datos_id, -td.datos2_id, -f9b { - font-weight: bold; -} -.p10 { - padding-top: 1px; - padding-bottom: 0px; -} -.p21 { - padding-top: 2px; - padding-bottom: 1px; -} -.w120 { - width: 120px; -} -.w130, -#table-agent-configuration select { - width: 130px; -} -.w135 { - width: 135px; -} -.w155, -#table_layout_data select { - width: 155px; -} -.top, -.top_red, -.bgt, -td.datost, -td.datos2t { - vertical-align: top; -} -.top_red { - background: #ff0000; -} -.bot, -.titb, -td.datosb { - vertical-align: bottom; -} -.msg { - margin-top: 15px; - text-align: justify; -} -ul.mn { - list-style: none; - padding: 0px 0px 0px 0px; - margin: 0px 0px 0px 0px; - line-height: 15px; -} -.gr { - font-size: 10pt; - font-weight: bold; -} -a.mn, -.gr { - font-family: Arial, Verdana, sans-serif, Helvetica; -} -div.nf { - background: url(../../images/info.png) no-repeat scroll 0 50% transparent; - margin-left: 7px; - padding: 8px 1px 6px 25px; -} -div.title_line { - background-color: #4e682c; - height: 5px; - width: 762px; -} - -.alpha50 { - filter: alpha(opacity=50); - -moz-opacity: 0.5; - opacity: 0.5; - -khtml-opacity: 0.5; -} - +div#page, #menu_tab_frame, -#menu_tab_frame_view { - display: block; - border-bottom: 1px solid #82b92e; - /* float:left; */ - margin-left: 0px; - max-height: 31px; - min-height: 31px; - padding-right: 28px; - width: 100%; -} - -#menu_tab { - margin: 0px 0px 0px 0px; -} - -#menu_tab .mn, -#menu_tab ul, -#menu_tab .mn ul { - padding: 0px; - list-style: none; - margin: 0px 0px 0px 0px; -} -#menu_tab .mn li { - float: right; - position: relative; - margin: 0px 0px 0px 0px; -} -/* -#menu_tab li a, #menu_tab a { - padding: 2px 0px; - font-weight: bold; - line-height: 18px; - margin-left: 3px; - margin-right: 0px; - - -moz-border-top-right-radius: 5px; - -webkit-border-top-right-radius: 5px; - border-top-right-radius: 5px; - - -moz-border-top-left-radius: 5px; - -webkit-border-top-left-radius: 5px; - border-top-left-radius: 5px; -} - -#menu_tab li>form { - padding-left: 7px; - padding-top: 4px; -} -*/ - -#menu_tab li.separator_view { - padding: 4px; -} - -#menu_tab li.separator { - padding: 4px; -} - -#menu_tab li.nomn_high a { - /*background: #82b92e;*/ - color: #fff; -} -#menu_tab .mn li a { - display: block; - text-decoration: none; - padding: 0px; - margin: 0px; - height: 21px; - width: 21px; -} -#menu_tab li.nomn:hover a, -#menu_tab li:hover ul a:hover { - /*background: #82b92e;*/ - color: #fff; -} -#menu_tab li:hover a { - /*background: #b2b08a url("../../images/arrow.png") no-repeat right 3px;*/ -} - -#menu_tab li.nomn { - min-width: 30px; - height: 28px; -} -#menu_tab li.nomn_high { - min-width: 30px; - height: 28px; -} -/* TAB TITLE */ -#menu_tab_left { - margin-left: 0px; -} - -#menu_tab_left .mn, -#menu_tab_left ul, -#menu_tab_left .mn ul { - background-color: #000; - color: #fff; - font-weight: bold; - padding: 0px 0px 0px 0px; - list-style: none; - margin: 0px 0px 0px 0px; -} -#menu_tab_left .mn li { - float: left; - position: relative; - height: 26px; - max-height: 26px; -} -#menu_tab_left li a, -#menu_tab_left li span { - /* text-transform: uppercase; */ - padding: 0px 0px 0px 0px; - color: #fff; - font-size: 8.5pt; - font-weight: bold; - line-height: 20px; -} -#menu_tab_left .mn li a { - display: block; - text-decoration: none; -} -#menu_tab_left li.view a { - padding: 2px 10px 2px 10px; - color: #fff; - font-weight: bold; - line-height: 18px; - display: none; -} - -#menu_tab_left li.view { - background: #82b92e; - max-width: 40%; - min-width: 20%; - padding: 5px 5px 0px; - text-align: center; - -moz-border-top-right-radius: 3px; - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - - -moz-border-top-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-top-left-radius: 3px; - margin-left: 0px; - overflow-y: hidden; -} - -#menu_tab_left li.view img.bottom { - width: 24px; - height: 24px; -} - -#menu_tab_frame *, -#menu_tab_frame_view * { - #margin: 0px 0px 0px 0px; -} - -span.users { - background: url(../../images/group.png) no-repeat; -} -span.agents { - background: url(../../images/bricks.png) no-repeat; -} -span.data { - background: url(../../images/data.png) no-repeat; -} -span.alerts { - background: url(../../images/bell.png) no-repeat; -} -span.time { - background: url(../../images/hourglass.png) no-repeat; -} -span.net { - background: url(../../images/network.png) no-repeat; -} -span.master { - background: url(../../images/master.png) no-repeat; -} -span.wmi { - background: url(../../images/wmi.png) no-repeat; -} -span.prediction { - background: url(../../images/chart_bar.png) no-repeat; -} -span.plugin { - background: url(../../images/plugin.png) no-repeat; -} -span.export { - background: url(../../images/database_refresh.png) no-repeat; -} -span.snmp { - background: url(../../images/snmp.png) no-repeat; -} -span.binary { - background: url(../../images/binary.png) no-repeat; -} -span.recon { - background: url(../../images/recon.png) no-repeat; -} -span.rmess { - background: url(../../images/email_open.png) no-repeat; -} -span.nrmess { - background: url(../../images/email.png) no-repeat; -} -span.recon_server { - background: url(../../images/recon.png) no-repeat; -} -span.wmi_server { - background: url(../../images/wmi.png) no-repeat; -} -span.export_server { - background: url(../../images/server_export.png) no-repeat; -} -span.inventory_server { - background: url(../../images/page_white_text.png) no-repeat; -} -span.web_server { - background: url(../../images/world.png) no-repeat; -} -/* This kind of span do not have any sense, should be replaced on PHP code -by a real img in code. They are not useful because insert too much margin around -(for example, not valid to use in the table of server view */ -span.users, -span.agents, -span.data, -span.alerts, -span.time, -span.net, -span.master, -span.snmp, -span.binary, -span.recon, -span.wmi, -span.prediction, -span.plugin, -span.plugin, -span.export, -span.recon_server, -span.wmi_server, -span.export_server, -span.inventory_server, -span.web_server { - margin-left: 4px; - margin-top: 10px; - padding: 4px 8px 12px 30px; - display: block; -} -span.rmess, -span.nrmess { - margin-left: 14px; - padding: 1px 0px 10px 30px; - display: block; -} -/* New styles for data box */ -.databox, -.databox_color, -.databox_frame { - margin-bottom: 5px; - margin-top: 0px; - margin-left: 0px; - border: 1px solid #e2e2e2; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; -} -.databox_color { - padding-top: 5px; -} - -table.databox { - background-color: #5b5b5b; - border-spacing: 0px; - -moz-box-shadow: 0px 0px 0px #ddd; - -webkit-box-shadow: 0px 0px 0px #ddd; - box-shadow: 0px 0px 0px #ddd; -} - -.databox td { - -moz-border-radius: 0px; - -webkit-border-radius: 0px; - border-radius: 0px; - border: 0px none #e2e2e2; -} - -.databox th { - padding: 9px 7px; - font-weight: normal; - color: #fff; -} -.databox td { - #border-bottom: 1px solid #e2e2e2; -} - -.databox th * { - color: #fff; -} - -.databox th input, -.databox th textarea, -.databox th select, -.databox th select option { - color: #222; -} - -.tabletitle { - color: #333; -} - -.tactical_set legend { - text-align: left; - color: #fff; -} - -.tactical_set { - background: #5b5b5b; - border: 1px solid #e2e2e2; - margin-left: auto; - margin-right: auto; - width: auto; -} - -/* For use in Netflow */ - -table.databox_grid { - margin: 25px; -} - -table.databox_grid th { - font-size: 12px; -} - -table.databox_grid td { - padding: 6px; - margin: 4px; - border-bottom: 1px solid #acacac; - border-right: 1px solid #acacac; -} - -table.alternate tr:nth-child(odd) td { - background-color: #5b5b5b; -} -table.alternate tr:nth-child(even) td { - background-color: #e4e5e4; -} - -table.rounded_cells td { - padding: 4px 4px 4px 10px; - -moz-border-radius: 6px; - -webkit-border-radius: 6px; - border-radius: 6px; -} - -.databox_color { - background-color: #fafafa; -} -#head_l { - float: left; - margin: 0; - padding: 0; -} -#head_r { - float: right; - text-align: right; - margin-right: 10px; - padding-top: 0px; -} -#head_m { - position: absolute; - padding-top: 6px; - padding-left: 12em; -} -span#logo_text1 { - font: bolder 3em Arial, Sans-serif; - letter-spacing: -2px; - color: #eee; -} -span#logo_text2 { - font: 3em Arial, Sans-serif; - letter-spacing: -2px; - color: #aaa; -} - -div#logo_text3 { - text-align: right; - font: 2em Arial, Sans-serif; - letter-spacing: 6px; - color: #aaa; - font-weight: bold; - margin-top: 0px; - margin-left: 4px; - padding-top: 0px; -} - -.bb0 { - border-bottom: 0px; -} -.bt0 { - border-top: 0px; -} -.action-buttons { - text-align: right; -} -#table-add-item select, -#table-add-sla select { - width: 180px; -} - -/* end of classes for event priorities */ -div#main_pure { - background-color: #fefefe; - text-align: left; - margin-bottom: 25px; - margin-top: 30px; - margin-left: 10px; - margin-right: 10px; - height: 1000px; - width: 98%; - position: static; -} -#table-agent-configuration radio { - margin-right: 40px; -} -.ui-draggable { - cursor: move; -} -#layout_trash_drop { - float: right; - width: 300px; - height: 180px; - background: #fff url("../../images/trash.png") no-repeat bottom left; -} -#layout_trash_drop div { - display: block; -} -#layout_editor_drop { - float: left; - width: 300px; -} -.agent_reporting { - margin: 5px; - padding: 5px; -} -.report_table, -.agent_reporting { - border: #ccc outset 3px; -} -.img_help { - cursor: help; -} -#loading { - position: fixed; - width: 200px; - margin-left: 30%; - text-align: center; - top: 50%; - background-color: #999999; - padding: 20px; -} -/* IE 7 Hack */ -#editor { - *margin-top: 10px; -} -/* big_data is used in tactical and logon_ok */ -.big_data { - text-decoration: none; - font: bold 2em Arial, Sans-serif; -} - -.med_data { - text-decoration: none; - font: bold 1.5em Arial, Sans-serif; -} - -.notify { - background-color: #f7ffa5; - text-align: center; - font-weight: bold; - padding: 8px; - margin: 0px 0px 0px 0px; - z-index: -1; -} - -.notify a { - color: #003a3a; - text-decoration: underline; -} - -.listing { - border-collapse: collapse; -} -.listing td { - border-bottom: 1px solid #cccccc; - border-top: 1px solid #cccccc; -} -ul { - list-style-type: none; - padding-left: 0; - margin-left: 0; -} -span.actions { - margin-left: 30px; -} -.actions { - min-width: 200px; -} -code, -pre { - font-family: courier, serif; -} -select#template, -select#action { - width: 250px; -} -#label-checkbox-matches_value, -#label-checkbox-copy_modules, -#label-checkbox-copy_alerts { - display: inline; - font-weight: normal; -} -input[type="image"] { - border: 0px; - background-color: transparent; -} -table#simple select#id_module_type, -table#alert_search select#id_agent, -table#alert_search select#id_group, -table#network_component select#type { - width: 200px; -} -table#simple select#select_snmp_oid, -table#simple select#id_plugin, -table#network_component select#id_plugin { - width: 270px; -} -table#simple select#prediction_id_group, -table#simple select#prediction_id_agent, -table#simple select#prediction_module { - width: 50%; - display: block; -} -table#simple input#text-plugin_parameter, -table#simple input#text-snmp_oid, -table#source_table select, -table#destiny_table select, -table#target_table select, -table#filter_compound_table select, -table#filter_compound_table #text-search, -table#delete_table select { - width: 100%; -} -table#simple select#network_component_group, -table#simple select#network_component { - width: 90%; -} -table#simple span#component_group, -table#simple span#component { - width: 45%; - font-style: italic; -} -table#simple label { - display: inline; - font-weight: normal; - font-style: italic; -} -.clickable { - cursor: pointer; -} -table#agent_list tr, -table.alert_list tr { - vertical-align: top; -} -.toggle { - border-collapse: collapse; -} -.toggle td { - border-left: 1px solid #d3d3d3; -} - -ul.actions_list { - list-style-image: url(../../images/arrow.png); - list-style-position: inside; - margin-top: 0; -} -div.loading { - background-color: #fff1a8; - margin-left: auto; - margin-right: auto; - padding: 5px; - text-align: center; - font-style: italic; - width: 95%; -} -div.loading img { - float: right; -} -/* Tablesorter jQuery pager */ -div.pager { - margin-left: 10px; - margin-top: 5px; -} -div.pager img { - position: relative; - top: 4px; - padding-left: 5px; -} -div.pager input { - padding-left: 5px; -} -.pagedisplay { - border: 0; - width: 35px; -} -/* Steps style */ -ol.steps { - margin-bottom: 15px; - padding: 0; - list-style-type: none; - list-style-position: outside; -} -ol.steps li { - float: left; - background-color: #efefef; - padding: 5px; - margin-left: 5px; - width: 150px; -} -ol.steps li a { - color: #111; -} -ol.steps li.visited a { - color: #999; -} -ol.steps li span { - font-weight: normal; - display: block; -} -ol.steps li span { - color: #777; -} -ol.steps li.visited span { - color: #999; -} -ol.steps li.current { - border-left: 5px solid #778866; - margin-left: 0; - font-weight: bold; - background-color: #e9f3d2; -} -ol.steps li.visited { - color: #999; -} - -fieldset { - background-color: #5b5b5b; - border: 1px solid #e2e2e2; - padding: 0.5em; - margin-bottom: 20px; - position: relative; -} -fieldset legend { - font-size: 1.1em; - font-weight: bold; - #color: #3f4e2f; - line-height: 20px; - color: #3f3f3f; - #top: -2em; -} - -fieldset .databox { - border: 0px solid; -} - -fieldset.databox { - padding: 14px; -} - -fieldset legend span, -span#latest_value { - font-style: italic; -} -span#latest_value span#value { - font-style: normal; -} -form#filter_form { - margin-bottom: 15px; -} -ul.action_list { - margin: 0; - list-style: none inside circle; -} -ul.action_list li div { - margin-left: 15px; -} -span.action_name { - float: none; -} -div.actions_container { - overflow: auto; - width: 100%; - max-height: 200px; -} -div.actions_container label { - display: inline; - font-weight: normal; - font-style: italic; -} -a.add_action { - clear: both; - display: block; -} - -/* timeEntry styles */ -.timeEntry_control { - vertical-align: middle; - margin-left: 2px; -} -div#steps_clean { - clear: both; -} -div#event_control { - clear: right; -} - -/* Autocomplete styles */ -.ac_results { - padding: 0px; - border: 1px solid black; - background-color: white; - overflow: hidden; - z-index: 99999; -} - -.ac_results ul { - width: 100%; - list-style-position: outside; - list-style: none; - padding: 0; - margin: 0; - text-align: left; -} - -.ac_results li { - margin: 0px; - padding: 2px 5px; - cursor: default; - display: block; - /* - if width will be 100% horizontal scrollbar will apear - when scroll mode will be used - */ - /*width: 100%;*/ - font: menu; - font-size: 12px; - /* - it is very important, if line-height not setted or setted - in relative units scroll will be broken in firefox - */ - line-height: 16px; -} - -.ac_loading { - background: white url("../images/loading.gif") right center no-repeat; -} - -.ac_over { - background-color: #efefef; -} -span.ac_extra_field, -span.ac_extra_field strong { - font-style: italic; - font-size: 9px; -} - -div#pandora_logo_header { - /* Put here your company logo (139x60 pixels) like this: */ - /* background: url(../../images/MiniLogoArtica.jpg); */ - background: url(../../images/pandora_logo_head.png); - background-position: 0% 0%; - width: 139px; - height: 60px; - float: left; -} - -#header_table img { - margin-top: 0px; -} - -.autorefresh_disabled { - cursor: not-allowed; -} - -a.autorefresh { - padding-right: 8px; -} - -#refrcounter { - color: white; -} - -#combo_refr select { - margin-right: 8px; -} - -.disabled_module { - color: #aaa; -} -div.warn { - background: url(../../images/info.png) no-repeat; - margin-top: 7px; - padding: 2px 1px 6px 25px; -} - -.submenu_not_selected { - transition-property: background-color; - transition-duration: 0.5s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color; - -webkit-transition-duration: 0.5s; - -webkit-transition-timing-function: ease-out; - -moz-transition-property: background-color; - -moz-transition-duration: 0.5s; - -moz-transition-timing-function: ease-out; - -o-transition-property: background-color; - -o-transition-duration: 0.5s; - -o-transition-timing-function: ease-out; - font-weight: normal; -} - -/* Submenus havent borders */ -.submenu_not_selected, -.submenu_selected, -.submenu2 { - border: 0px; - min-height: 35px; -} - -/* Pandora width style theme */ - -div#container { - width: 100%; -} -div#page { - width: auto; -} -div#main { - max-width: 93%; - min-width: 93%; -} - -ol.steps { - margin-bottom: 70px; -} -div#steps_clean { - display: none; -} - -#menu_tab_frame, -#menu_tab_frame_view { - width: 100%; - padding-right: 0px; - margin-left: 0px; - margin-bottom: 20px; - height: 31px; -} -div#events_list { - float: left; - width: 100%; -} -span#logo_text1 { - font: bolder 3em Arial, Sans-serif; - letter-spacing: -2px; - color: #eee; -} -span#logo_text2 { - font: 3em Arial, Sans-serif; - letter-spacing: -2px; - color: #aaa; -} -div#logo_text3 { - text-align: right; - font: 2em Arial, Sans-serif; - letter-spacing: 6px; - color: #aaa; - font-weight: bold; - margin-top: 0px; - margin-left: 4px; - padding-top: 0px; -} -.pagination { - margin-top: 15px; - margin-bottom: 5px; -} -.pagination * { - margin-left: 0px; - margin-right: 0px; - vertical-align: middle; -} - -/*CALENDAR TOOLTIP STYLE*/ - -/* Calendar background */ -table.scw { - background-color: #82b92e; - border: 0; - border-radius: 4px; -} - -/* Week number heading */ -td.scwWeekNumberHead { - color: #111; -} - -td.scwWeek { - color: #111; -} - -Today selector td.scwFoot { - background-color: #daedae; - color: #111; -} - -td.scwFootDisabled { - background-color: #000; - color: #ffffff; -} - -tfoot.scwFoot { - color: #111; -} - -.scwFoot :hover { - color: #3f3f3f; -} - -table.scwCells { - background-color: #5b5b5b; - color: #3c3c3c; -} - -table.scwCells:hover { - background-color: #5b5b5b; -} - -td.scwCellsExMonth { - background-color: #eee; - color: #3c3c3c; -} - -td.scwCellsWeekend { - background-color: #3c3c3c; - color: #fff; - border: 0; -} - -td.scwInputDate { - background-color: #777; - color: #ffffff; - border: 0; -} - -td.scwFoot { - background-color: #5b5b5b; - color: #3c3c3c; - border: 0; -} - -/* Cells divs to set individual styles with the table objects */ -div.cellBold { - width: 100%; - height: 100%; - font-weight: bold; -} - -div.cellRight { - width: 100%; - height: 100%; - text-align: right; -} - -div.cellCenter { - width: 100%; - height: 100%; - text-align: center; -} - -div.cellWhite { - width: 100%; - height: 100%; - background: #5b5b5b; - color: #111; -} - -div.cellNormal { - width: 100%; - height: 100%; - background: #6eb432; - color: #fff; -} - -div.cellCritical { - width: 100%; - height: 100%; - background: #f85858; - color: #fff; -} - -div.cellWarning { - width: 100%; - height: 100%; - background: #ffea59; - color: #111; -} - -div.cellUnknown { - width: 100%; - height: 100%; - background: #aaaaaa; - color: #ffffff; -} - -div.cellNotInit { - width: 100%; - height: 100%; - background: #4a83f3; - color: #ffffff; -} - -div.cellAlert { - width: 100%; - height: 100%; - background: #ff8800; - color: #111; -} - -div.cellBorder1 { - width: 100%; - height: 100%; - border: 1px solid #666; -} - -div.cellBig { - width: 100%; - height: 100%; - font-size: 18px; -} - -.info_box { - background: #5b5b5b; - margin-top: 10px; - margin-bottom: 10px; - padding: 0px 5px 5px 10px; - border-color: #e2e2e2; - border-style: solid; - border-width: 1px; - width: 100%; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; -} - -.info_box .title * { - font-size: 10pt; - font-weight: bolder; -} - -.info_box .icon { - width: 30px; - text-align: center; -} - -/* Standard styles for status colos (groups, events, backgrounds...) */ - -.opacity_cell { - filter: alpha(opacity=80); - -moz-opacity: 0.8; - opacity: 0.8; - -khtml-opacity: 0.8; -} - -tr.group_view_data, -.group_view_data { - color: #3f3f3f; -} - -tr.group_view_crit, -.group_view_crit { - background-color: #e63c52; - color: #fff; -} - -tr.group_view_norm, -.group_view_norm, -tr.group_view_normal, -.group_view_normal { - #background-color: #5b5b5b; -} -tr.group_view_ok, -.group_view_ok { - background-color: #82b92e; - color: #fff; -} - -tr.group_view_not_init, -.group_view_not_init, -tr.group_view_not_init, -.group_view_not_init { - background-color: #5bb6e5; - color: #fff; -} - -tr.group_view_warn, -.group_view_warn, -tr.group_view_warn.a, -a.group_view_warn, -tr.a.group_view_warn { - background-color: #f3b200; - color: #3f3f3f; -} - -a.group_view_warn { - color: #f3b200; -} - -tr.group_view_alrm, -.group_view_alrm { - background-color: #ffa631; - color: #fff; -} - -tr.group_view_unk, -.group_view_unk { - background-color: #b2b2b2; - color: #fff; -} - -/* classes for event priorities. Sits now in functions.php */ -.datos_green, -.datos_greenf9, -.datos_green a, -.datos_greenf9 a, -.datos_green * { - background-color: #82b92e; - color: #fff; -} -.datos_red, -.datos_redf9, -.datos_red a, -.datos_redf9 a, -.datos_red * { - background-color: #e63c52; - color: #fff; -} - -.datos_yellow, -.datos_yellowf9, -.datos_yellow * { - background-color: #f3b200; - color: #111; -} - -a.datos_blue, -.datos_bluef9, -.datos_blue, -.datos_blue * { - background-color: #4ca8e0; - color: #fff; -} - -.datos_grey, -.datos_greyf9, -.datos_grey * { - background-color: #999999; - color: #fff; -} - -.datos_pink, -.datos_pinkf9, -.datos_pink * { - background-color: #fdc4ca; - color: #111; -} - -.datos_brown, -.datos_brownf9, -.datos_brown * { - background-color: #a67c52; - color: #fff; -} - -.datos_orange, -.datos_orangef9, -.datos_orange * { - background-color: #f7931e; - color: #111; -} - -td.datos_greyf9, -td.datos_bluef9, -td.datos_greenf9, -td.datos_redf9, -td.datos_yellowf9, -td.datos_pinkf9, -td.datos_brownf9, -td.datos_orangef9 { - padding: 5px 5px 5px 5px; -} - -.menu li.selected { - font-weight: bold; -} - -ul.operation li a:hover { - #font-weight: bold; -} - -.menu_icon { - transition-property: background-color; - transition-duration: 0.5s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color; - -webkit-transition-duration: 0.5s; - -webkit-transition-timing-function: ease-out; - -moz-transition-property: background-color; - -moz-transition-duration: 0.5s; - -moz-transition-timing-function: ease-out; - -o-transition-property: background-color; - -o-transition-duration: 0.5s; - -o-transition-timing-function: ease-out; -} - -.menu_icon:hover { - transition-property: background-color; - transition-duration: 0.5s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color; - -webkit-transition-duration: 0.5s; - -webkit-transition-timing-function: ease-out; - -moz-transition-property: background-color; - -moz-transition-duration: 0.5s; - -moz-transition-timing-function: ease-out; - -o-transition-property: background-color; - -o-transition-duration: 0.5s; - -o-transition-timing-function: ease-out; - background-color: #b1b1b1; -} -.submenu_not_selected:hover { - transition-property: background-color; - transition-duration: 0.5s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color; - -webkit-transition-duration: 0.5s; - -webkit-transition-timing-function: ease-out; - -moz-transition-property: background-color; - -moz-transition-duration: 0.5s; - -moz-transition-timing-function: ease-out; - -o-transition-property: background-color; - -o-transition-duration: 0.5s; - -o-transition-timing-function: ease-out; - background-color: #b1b1b1; -} - -.submenu_selected:hover { - background-color: #b1b1b1; -} - -.sub_subMenu { - transition-property: background-color; - transition-duration: 0.5s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color; - -webkit-transition-duration: 0.5s; - -webkit-transition-timing-function: ease-out; - -moz-transition-property: background-color; - -moz-transition-duration: 0.5s; - -moz-transition-timing-function: ease-out; - -o-transition-property: background-color; - -o-transition-duration: 0.5s; -} -.sub_subMenu:hover { - transition-property: background-color; - transition-duration: 0.5s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color; - -webkit-transition-duration: 0.5s; - -webkit-transition-timing-function: ease-out; - -moz-transition-property: background-color; - -moz-transition-duration: 0.5s; - -moz-transition-timing-function: ease-out; - -o-transition-property: background-color; - -o-transition-duration: 0.5s; - background-color: #b1b1b1; -} - -.submenu_text { - color: #fff; -} - -.menu li.selected { - box-shadow: inset 4px 0 #b1b1b1; -} - -li.links a:hover { - #font-weight: bold; -} - -.is_submenu2 li { - background-color: #ff0000; -} - -.is_submenu2 { - background-color: #222222; -} - -.operation { - background-color: #333; -} - -.operation .selected { - background-color: #b1b1b1; -} - -.menu li, -.menu .li.not_selected { - border-radius: 0px 0px 0px 0px; - display: block; - min-height: 35px; - border-bottom: 0px none #424242; - vertical-align: middle; -} - -#menu_tab li.separator { - /* Empty */ -} - -.operation { - border-top-right-radius: 5px; - border-right-style: solid; - border-right-width: 0px; -} - +#menu_tab_frame_view, +#menu_tab_frame_view_bc, +input.search_input, +.filters input, input#text-id_parent.ac_input, input, textarea, -select { - background-color: #5b5b5b; - border: 1px solid #cbcbcb; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; -} - -span#plugin_description { - font-size: 9px; -} - -/*FOR TINYMCE*/ -#tinymce { - text-align: left; -} -.visual_font_size_4pt, -.visual_font_size_4pt > em, -.visual_font_size_4pt > strong, -.visual_font_size_4pt > strong > span, -.visual_font_size_4pt > span, -.visual_font_size_4pt > strong > em, -.visual_font_size_4pt > em > strong, -.visual_font_size_4pt em span, -.visual_font_size_4pt span em { - font-size: 4pt; - line-height: 4pt; -} -.visual_font_size_6pt, -.visual_font_size_6pt > em, -.visual_font_size_6pt > strong, -.visual_font_size_6pt > strong > span, -.visual_font_size_6pt > span, -.visual_font_size_6pt > strong > em, -.visual_font_size_6pt > em > strong, -.visual_font_size_6pt em span, -.visual_font_size_6pt span em { - font-size: 6pt; - line-height: 6pt; -} -.visual_font_size_8pt, -.visual_font_size_8pt > em, -.visual_font_size_8pt > strong, -.visual_font_size_8pt > strong > span, -.visual_font_size_8pt > span, -.visual_font_size_8pt > strong > em, -.visual_font_size_8pt > em > strong, -.visual_font_size_8pt em span, -.visual_font_size_8pt span em { - font-size: 8pt; - line-height: 8pt; -} -.visual_font_size_10pt, -.visual_font_size_10pt > em, -.visual_font_size_10pt > strong, -.visual_font_size_10pt > strong > em, -.visual_font_size_10pt > em > strong, -.visual_font_size_10pt em span, -.visual_font_size_10pt span em { - font-size: 10pt; - line-height: 10pt; -} -.visual_font_size_12pt, -.visual_font_size_12pt > em, -.visual_font_size_12pt > strong, -.visual_font_size_12pt > strong > em, -.visual_font_size_12pt > em > strong, -.visual_font_size_12pt em span, -.visual_font_size_12pt span em { - font-size: 12pt; - line-height: 12pt; -} -.visual_font_size_14pt, -.visual_font_size_14pt > em, -.visual_font_size_14pt > strong, -.visual_font_size_14pt > strong > span, -.visual_font_size_14pt > span, -.visual_font_size_14pt > strong > em, -.visual_font_size_14pt > em > strong, -.visual_font_size_14pt em span, -.visual_font_size_14pt span em { - font-size: 14pt; - line-height: 14pt; -} -.visual_font_size_18pt, -.visual_font_size_18pt > em, -.visual_font_size_18pt > strong, -.visual_font_size_18pt > strong > span, -.visual_font_size_18pt > span, -.visual_font_size_18pt > strong > em, -.visual_font_size_18pt > em > strong, -.visual_font_size_18pt em span, -.visual_font_size_18pt span em { - font-size: 18pt; - line-height: 18pt; -} -.visual_font_size_24pt, -.visual_font_size_24pt > em, -.visual_font_size_24pt > strong, -.visual_font_size_24pt > strong > span, -.visual_font_size_24pt > span, -.visual_font_size_24pt > strong > em, -.visual_font_size_24pt > em > strong, -.visual_font_size_24pt em span, -.visual_font_size_24pt span em { - font-size: 24pt; - line-height: 24pt; -} -.visual_font_size_28pt, -.visual_font_size_28pt > em, -.visual_font_size_28pt > strong, -.visual_font_size_28pt > strong > span, -.visual_font_size_28pt > span, -.visual_font_size_28pt > strong > em, -.visual_font_size_28pt > em > strong, -.visual_font_size_28pt em span, -.visual_font_size_28pt span em { - font-size: 28pt; - line-height: 28pt; -} -.visual_font_size_36pt, -.visual_font_size_36pt > em, -.visual_font_size_36pt > strong, -.visual_font_size_36pt > strong > span, -.visual_font_size_36pt > span, -.visual_font_size_36pt > strong > em, -.visual_font_size_36pt > em > strong, -.visual_font_size_36pt em span, -.visual_font_size_36pt span em { - font-size: 36pt; - line-height: 36pt; -} -.visual_font_size_48pt, -.visual_font_size_48pt > em, -.visual_font_size_48pt > strong, -.visual_font_size_48pt > strong > span, -.visual_font_size_48pt > span, -.visual_font_size_48pt > strong > em, -.visual_font_size_48pt > em > strong, -.visual_font_size_48pt em span, -.visual_font_size_48pt span em { - font-size: 48pt; - line-height: 48pt; -} -.visual_font_size_60pt, -.visual_font_size_60pt > em, -.visual_font_size_60pt > strong, -.visual_font_size_60pt > strong > span, -.visual_font_size_60pt > span, -.visual_font_size_60pt > strong > em, -.visual_font_size_60pt > em > strong, -.visual_font_size_60pt em span, -.visual_font_size_60pt span em { - font-size: 60pt; - line-height: 60pt; -} -.visual_font_size_72pt, -.visual_font_size_72pt > em, -.visual_font_size_72pt > strong, -.visual_font_size_72pt > strong > span, -.visual_font_size_72pt > span, -.visual_font_size_72pt > strong > em, -.visual_font_size_72pt > em > strong, -.visual_font_size_72pt em span, -.visual_font_size_72pt span em { - font-size: 72pt; - line-height: 72pt; -} -.visual_font_size_84pt, -.visual_font_size_84pt > em, -.visual_font_size_84pt > strong, -.visual_font_size_84pt > strong > span, -.visual_font_size_84pt > span, -.visual_font_size_84pt > strong > em, -.visual_font_size_84pt > em > strong, -.visual_font_size_84pt em span, -.visual_font_size_84pt span em { - font-size: 84pt; - line-height: 84pt; -} - -.visual_font_size_96pt, -.visual_font_size_96pt > em, -.visual_font_size_96pt > strong, -.visual_font_size_96pt > strong > span, -.visual_font_size_96pt > span, -.visual_font_size_96pt > strong > em, -.visual_font_size_96pt > em > strong, -.visual_font_size_96pt em span, -.visual_font_size_96pt span em { - font-size: 96pt; - line-height: 96pt; -} - -.visual_font_size_116pt, -.visual_font_size_116pt > em, -.visual_font_size_116pt > strong, -.visual_font_size_116pt > strong > span, -.visual_font_size_116pt > span, -.visual_font_size_116pt > strong > em, -.visual_font_size_116pt > em > strong, -.visual_font_size_116pt em span, -.visual_font_size_116pt span em { - font-size: 116pt; - line-height: 116pt; -} - -.visual_font_size_128pt, -.visual_font_size_128pt > em, -.visual_font_size_128pt > strong, -.visual_font_size_128pt > strong > span, -.visual_font_size_128pt > span, -.visual_font_size_128pt > strong > em, -.visual_font_size_128pt > em > strong, -.visual_font_size_128pt em span, -.visual_font_size_128pt span em { - font-size: 128pt; - line-height: 128pt; -} - -.visual_font_size_140pt, -.visual_font_size_140pt > em, -.visual_font_size_140pt > strong, -.visual_font_size_140pt > strong > span, -.visual_font_size_140pt > span, -.visual_font_size_140pt > strong > em, -.visual_font_size_140pt > em > strong, -.visual_font_size_140pt em span, -.visual_font_size_140pt span em { - font-size: 140pt; - line-height: 140pt; -} - -.visual_font_size_154pt, -.visual_font_size_154pt > em, -.visual_font_size_154pt > strong, -.visual_font_size_154pt > strong > span, -.visual_font_size_154pt > span, -.visual_font_size_154pt > strong > em, -.visual_font_size_154pt > em > strong, -.visual_font_size_154pt em span, -.visual_font_size_154pt span em { - font-size: 154pt; - line-height: 154pt; -} - -.visual_font_size_196pt, -.visual_font_size_196pt > em, -.visual_font_size_196pt > strong, -.visual_font_size_196pt > strong > span, -.visual_font_size_196pt > span, -.visual_font_size_196pt > strong > em, -.visual_font_size_196pt > em > strong, -.visual_font_size_196pt em span, -.visual_font_size_196pt span em { - font-size: 196pt; - line-height: 196pt; -} - -.resize_visual_font_size_8pt, -.resize_visual_font_size_8pt > em, -.resize_visual_font_size_8pt > strong, -.resize_visual_font_size_8pt > strong > span, -.resize_visual_font_size_8pt > span, -.resize_visual_font_size_8pt > strong > em, -.resize_visual_font_size_8pt > em > strong, -.visual_font_size_8pt em span, -.visual_font_size_8pt span em { - font-size: 4pt; - line-height: 4pt; -} -.resize_visual_font_size_14pt, -.resize_visual_font_size_14pt > em, -.resize_visual_font_size_14pt > strong, -.resize_visual_font_size_14pt > strong > span, -.resize_visual_font_size_14pt > span, -.resize_visual_font_size_14pt > strong > em, -.resize_visual_font_size_14pt > em > strong, -.visual_font_size_14pt em span, -.visual_font_size_14pt span em { - font-size: 7pt; - line-height: 7pt; -} -.resize_visual_font_size_24pt, -.resize_visual_font_size_24pt > em, -.resize_visual_font_size_24pt > strong, -.resize_visual_font_size_24pt > strong > span, -.resize_visual_font_size_24pt > span, -.resize_visual_font_size_24pt > strong > em, -.resize_visual_font_size_24pt > em > strong, -.visual_font_size_14pt em span, -.visual_font_size_14pt span em { - font-size: 12pt; - line-height: 12pt; -} -.resize_visual_font_size_36pt, -.resize_visual_font_size_36pt > em, -.resize_visual_font_size_36pt > strong, -.resize_visual_font_size_36pt > strong > span, -.resize_visual_font_size_36pt > span, -.resize_visual_font_size_36pt > strong > em, -.resize_visual_font_size_36pt > em > strong, -.visual_font_size_36pt em span, -.visual_font_size_36pt span em { - font-size: 18pt; - line-height: 18pt; -} -.resize_visual_font_size_72pt, -.resize_visual_font_size_72pt > em, -.resize_visual_font_size_72pt > strong, -.resize_visual_font_size_72pt > strong > span, -.resize_visual_font_size_72pt > span, -.resize_visual_font_size_72pt > strong > em, -.resize_visual_font_size_72pt > em > strong, -.visual_font_size_72pt em span, -.visual_font_size_72pt span em { - font-size: 36pt; - line-height: 36pt; -} - -/*SIDEBAR*/ -.menu_sidebar { - color: #111; - background: #3f3f3f; - - margin-left: 10px; - padding-left: 0px; - padding-right: 0px; - padding-top: 10px; - text-align: left; - font-family: arial, sans-serif, verdana; - font-size: 10px; - border: 1px solid #000; - position: absolute; - margin: 0; - width: 400px; - height: 260px; - - -moz-box-shadow: 0px 4px 4px #010e1b; - -webkit-box-shadow: 0px 4px 4px #010e1b; - box-shadow: 0px 4px 4px #010e1b; - - filter: alpha(opacity=97); - -moz-opacity: 0.97; - opacity: 0.97; -} - -.menu_sidebar_radius_left { - -moz-border-top-left-radius: 8px; - -webkit-border-top-left-radius: 8px; - border-top-left-radius: 8px; - - -moz-border-bottom-left-radius: 8px; - -webkit-border-bottom-left-radius: 8px; - border-bottom-left-radius: 8px; - - border-right: 0px solid #000; -} - -.menu_sidebar_radius_right { - -moz-border-top-right-radius: 8px; - -webkit-border-top-right-radius: 8px; - border-top-right-radius: 8px; - -moz-border-bottom-right-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - border-bottom-right-radius: 8px; -} - -.menu_sidebar_outer { - margin-left: 3px; - background: #ececec; - width: 100%; - text-align: center; - -moz-border-radius: 6px; - -webkit-border-radius: 6px; - border-radius: 6px; - padding: 8px; -} - -/*Groupsview*/ - -.groupsview { - border-spacing: 0px 4px; -} - -.groupsview tr { - background-color: #666; -} - -.groupsview th { - font-size: 12px; - padding: 5px; -} - -.groupsview td.first, -.groupsview th.first { - -moz-border-top-left-radius: 10px; - -webkit-border-top-left-radius: 10px; - border-top-left-radius: 10px; - - -moz-border-bottom-left-radius: 10px; - -webkit-border-bottom-left-radius: 10px; - border-bottom-left-radius: 10px; -} - -.groupsview td.last, -.groupsview th.last { - -moz-border-top-right-radius: 10px; - -webkit-border-top-right-radius: 10px; - border-top-right-radius: 10px; - -moz-border-bottom-right-radius: 10px; - -webkit-border-bottom-right-radius: 10px; - border-bottom-right-radius: 10px; -} - -a.tip { - display: inline; - cursor: help; -} - -a.tip > img { - margin-left: 2px; - margin-right: 2px; -} - -input.search_input { - background: white url("../../images/input_zoom.png") no-repeat right; - padding: 0px; - padding-left: 5px; - margin: 0; - width: 80%; - height: 19px; - margin-bottom: 5px; - margin-left: 2px; - padding-right: 25px; - color: #999; -} - -.vertical_fields td input, -.vertical_fields td select { - margin-top: 8px; -} - -a[id^="tgl_ctrl_"] > img, -a[id^="tgl_ctrl_"] > b > img { - vertical-align: middle; -} - -.noshadow { - -moz-box-shadow: 0px; - -webkit-box-shadow: 0px; - box-shadow: 0px; -} - -/* Images forced title */ - -div.forced_title_layer { - display: block; - text-decoration: none; - position: absolute; - z-index: 100000; - border: 1px solid #708090; - background-color: #666; +select, +.edit_user_comments #textarea_comments, +.discovery_textarea_input { + background-color: #111; color: #fff; - padding: 4px 5px; - font-weight: bold; - font-size: small; - font-size: 11px; - /* IE 8 */ - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=9)"; - /* Netscape */ - -moz-opacity: 0.9; - opacity: 0.9; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; -} - -/* Graphs styles */ - -div.legend > div { - pointer-events: none; /* Allow to click the graphs below */ - opacity: 0.65; -} - -div.nodata_text { - padding: 5px 12px 0px 68px; - font-weight: bold; - color: #c1c1c1; - text-transform: uppercase; - display: table-cell; - vertical-align: middle; - text-align: left; -} - -div.nodata_container { - width: 150px; - height: 100px; - background-repeat: no-repeat; - background-position: center; - margin: auto auto; - display: table; -} - -#snmp_data { - width: 40%; - position: absolute; - top: 0; - right: 20px; - - #background-color: #5b5b5b; - #padding: 10px; -} - -#rmf_data { - width: 40%; - height: 80%; - position: absolute; - top: 0; - right: 20px; - overflow: auto; - - #background-color: #5b5b5b; - #padding: 10px; -} - -/* Subtab styles */ - -ul.subsubmenu { - border-bottom-right-radius: 5px; - border-bottom-left-radius: 5px; - -moz-border-bottom-right-radius: 5px; - -moz-border-bottom-left-radius: 5px; - -webkit-border-bottom-right-radius: 5px; - -webkit-border-bottom-left-radius: 5px; - - background: #ececec; -} - -ul.subsubmenu li { - background-color: #ececec; - font-weight: bold; - text-decoration: none; - font-size: 14px; - border-color: #e2e2e2; - border-style: solid; - border-width: 1px; -} - -ul.subsubmenu li a { - padding: 0px 10px 5px; -} - -div#agent_wizard_subtabs { - position: absolute; - margin-left: 0px; - display: none; - padding-bottom: 3px; - z-index: 1000; -} - -.agent_wizard_tab:hover { - cursor: default; -} - -#container_servicemap_legend { - position: absolute; - width: 200px; - background: #5b5b5b; - margin-top: 10px; - right: 2px; - border: 1px solid #e2e2e2; - border-radius: 5px; - padding: 10px; - opacity: 0.9; -} - -#container_servicemap_legend table { - text-align: left; -} - -.legend_square { - width: 20px; - padding-left: 20px; - padding-right: 10px; -} - -.legend_square_simple { - padding-left: 0px; - padding-right: 10px; - padding-bottom: 3px; -} -.legend_square div, -.legend_square_simple div { - width: 20px; - height: 20px; - border-radius: 3px; -} - -.legend_basic { - background: #f4f4f4; - margin-top: 10px; - border-radius: 5px; - padding: 10px; -} - -.agents_modules_table th { - background: #3f3f3f; -} - -.agents_modules_table th * { - color: #ffffff; -} - -/* - * LOAD_ENTERPRISE.PHP - */ -#code_license_dialog { - padding: 50px; - padding-top: 10px; -} -#code_license_dialog #logo { - margin-bottom: 20px; - text-align: center; -} -#code_license_dialog, -#code_license_dialog * { - font-size: 14px; -} -#code_license_dialog ul { - padding-left: 30px; - list-style-image: url("../../images/input_tick.png"); -} -#code_license_dialog li { - margin-bottom: 12px; -} - -#code_license_dialog #code { - font-weight: bolder; - font-size: 20px; - border: 1px solid #dddddd; - padding: 5px; - text-align: center; - -moz-border-radius: 8px; - -webkit-border-radius: 8px; - border-radius: 8px; -} - -#code_license_dialog a { - text-decoration: underline; -} - -/* GRAPHS CSS */ - -.parent_graph { - position: relative; -} - -.menu_graph, -.timestamp_graph { - position: absolute; -} - -.menu_graph { - -moz-border-top-right-radius: 6px; - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -moz-border-top-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; -} - -.legend_graph { - margin: 0px; - padding: 0px; - text-align: left; -} - -.legendColorBox * { - font-size: 0px; - padding: 0px 4px; - overflow: visible; -} - -/* GIS CSS */ - -.olLayerDiv { - z-index: 102; -} - -/* Alert view */ - -table.alert_days th, -table.alert_time th { - height: 30px; - vertical-align: middle; -} - -table.alert_escalation th img { - width: 18px; -} - -td.used_field { - #border: solid #6eb432; - background: #6eb432; - color: #ffffff; - font-weight: bold; -} - -td.overrided_field { - color: #666; -} - -td.unused_field { - color: #888; -} - -td.empty_field { - background: url("../../images/long_arrow.png") no-repeat 100% center; -} - -#table_macros textarea { - width: 96%; -} - -/* Policies styles */ - -table#policy_modules td * { - display: inline; -} - -.context_help_title { - font-weight: bolder; - text-align: left; -} -.context_help_body { - text-align: left; -} - -#left_column_logon_ok { - width: 750px; - float: left; -} - -#news_board { - min-width: 530px; -} - -#right_column_logon_ok { - width: 350px; - float: right; - margin-right: 20px; -} - -#clippy_head_title { - font-weight: bold; - background: #82b92e; - color: #ffffff; - margin-top: -15px; - margin-left: -15px; - margin-right: -15px; - padding: 5px; - margin-bottom: 10px; - border-top-left-radius: 2px; - border-top-right-radius: 2px; -} - -.clippy_body { - color: black; -} - -#dialog-double_auth-container { - width: 100%; - text-align: center; - vertical-align: middle; -} - -.center_align { - text-align: center; -} - -.left_align { - text-align: left; -} - -.status_tactical { - width: 100%; - margin-left: auto; - margin-right: auto; - background-color: #5b5b5b; - padding: 10px; - border: 1px solid #e2e2e2; - margin-top: 5%; - text-align: left; -} - -.status_tactical img { - border: 3px solid #000; - border-radius: 100px; -} - -#sumary { - color: #fff; - margin: 15px; - padding: 10px 30px; - font-size: 20px; - font-weight: bold; - height: 66px; - width: 191px; - border-radius: 2px; -} - -.databox.data td { - border-bottom: 1px solid #e2e2e2; -} - -.databox .search { - margin-top: 0px; -} - -.databox.data td.progress_bar img { - border: 3px solid #000; - border-radius: 100px; -} - -.databox td { - padding-left: 9px; - padding-right: 9px; - padding-top: 7px; - padding-bottom: 7px; -} -.databox.pies fieldset.tactical_set { - width: 70%; - height: 285px; -} - -.difference { - border-left-width: 2px; - border-left-style: solid; - border-right-width: 2px; - border-right-style: solid; - border-color: #e2e2e2; -} - -#title_menu { - color: #fff; - float: right; - width: 70%; - letter-spacing: 0pt; - font-size: 8pt; - white-space: pre-wrap; -} - -.no_hidden_menu { - background-position: 11% 50%; -} - -#menu_tab li.nomn, -#menu_tab li.nomn_high { - background-color: #ececec; - padding-right: 3px; - padding-left: 3px; - font-weight: bold; - text-decoration: none; - font-size: 14px; - border-color: #e2e2e2; - border-style: solid; - border-width: 1px; - margin-top: -10px; } +div#head, #menu_tab li.nomn_high, -#menu_tab li.nomn_high span { +#menu_tab li.nomn_high span, +.info_box, +.white_table_graph_header, +.white-box-content, +fieldset, +.databox.filters, +table.databox, +.legend_basic, +.databox_color, +.white_box { + background-color: #222 !important; color: #fff; - background-color: #5b5b5b; } +/* Tabs icons change color */ #menu_tab li.nomn img, #menu_tab li img { - margin-top: 3px; - margin-left: 3px; + filter: invert(100%); } -#menu_tab li.tab_operation a, -#menu_tab a.tab_operation { - background: none; +/* White text */ +a, +#menu_tab_left li a, +#menu_tab_left li span, +fieldset legend, +.tactical_set legend, +#user-notifications-wrappe, +#user_form *, +h1, +h2, +h3, +h4, +.info_table > tbody > tr > th, +.info_table > thead > tr > th, +.info_table > thead > tr > th a, +.info_table > thead > tr > th > span, +form.discovery label, +.edit_user_labels, +.input_label { + color: #fff; } -.subsubmenu { - position: absolute; - float: right; - z-index: 9999; - display: none; - margin-top: 6px; - left: 0px; -} -.subsubmenu li { - margin-top: 0px; +/* Overwrite inline styles */ +.textodialogo td { + color: #fff !important; } -.agents_modules_table { - border: 1px solid #e2e2e2; - border-spacing: 0px; -} -.agents_modules_table td { - border: 1px solid #e2e2e2; -} -.agents_modules_table th { - border: 1px solid #e2e2e2; +.box-shadow { + box-shadow: none; } -.databox.filters, -.databox.data, -.databox.profile_list { - margin-bottom: 20px; +select:disabled, +textarea:disabled { + background-color: #666; } -.databox.filters td { - padding: 10px; - padding-left: 20px; -} -.databox.profile_list td { - padding: 4px 1px; - padding-left: 5px; - border-bottom: 1px solid #e2e2e2; -} -.databox.profile_list a.tip > img { - margin: 0px; +.status_tactical, +.tactical_set, +.td-bg-white td { + background-color: transparent; } -.databox.filters td > img, -.databox.filters td > div > a > img, -.databox.filters td > span > img, -.databox.filters td > span > a > img, -.databox.filters td > a > img { - vertical-align: middle; - margin-left: 5px; -} -.databox.data td > img, -.databox.data th > img, -.databox.data td > div > a > img, -.databox.data td > span > img, -.databox.data td > span > a > img, -.databox.data td > a > img, -.databox.data td > form > a > img { - vertical-align: middle; +/* tables */ +.info_table { + background-color: #222; } -.databox.filters td > a > img { - vertical-align: middle; +.info_table > tbody > tr:nth-child(even) { + background-color: #111; } -.databox.data td > input[type="checkbox"] { - margin: 0px; +.info_table tr:first-child > th, +.info_table th { + background-color: #222; + color: #fff; } -.databox_color td { - padding-left: 10px; +.info_table > tbody > tr:hover, +.databox.data > tbody > tr:hover, +.rowPair:hover, +.rowOdd:hover { + background-color: #555 !important; /* porque tables.css se carga depues.... */ } -.databox.agente td > div > canvas { - width: 100%; - text-align: left; +.info_table .datos3, +.datos3, +.info_table .datos4, +.datos4 { + background-color: #666; + color: #fff; } -.databox.agente td > div.graph { - width: 100%; - text-align: left; +.agent_details_col, +.white_table, +.white_table tr:first-child > th, +.white_table_graph_content { + background-color: #222; + color: #fff; +} + +/* action buttons in tables */ +.action_buttons a[href] img, +.action_buttons input[type="image"], +.action_button_img { + filter: brightness(2.5) contrast(50%); +} + +/* fix cosas generales */ +.notify, +.notify h3 { + color: #000; +} + +/* firts_task.css */ +.new_task, +div.new_task_cluster, +div.new_task_cluster > div { + background-color: #222; +} + +/* webchat */ +#chat_box, +#userlist_box { + background: #222 !important; +} + +/* tree.css */ +.node-content:hover { + background-color: #222; +} + +ul.tree-group + li.tree-node + div.node-content + img:not(.module-status):not(.agent-status):not(.agent-alerts-fired) { + filter: brightness(2); +} + +/* login.css */ +div.login_nick input, +div.login_pass input { + background-color: #fff !important; +} + +/* user edit */ +.edit_user_info_right input { + border-bottom: 1px solid #5f5f5f; +} + +/* datatables */ +table.dataTable tbody tr { + background-color: #222; +} + +table.dataTable span { + color: #fff; +} + +/* diagnostic info */ +table#diagnostic_info { + background-color: #111 !important; +} + +table#diagnostic_info tbody td div { + background-color: #222 !important; +} + +/* agent view */ +.agent_details_graph div#status_pie { + background: #fff; + border-radius: 5px; +} + +/* menu.css */ +.operation { + background-color: #252525; } .godmode, -.menu_icon ul li { - background-color: #222; -} -.operation .menu_icon ul li { - background-color: #333; -} - -.godmode { - border-top: 4px solid; - padding-bottom: 4px; - border-bottom-right-radius: 5px; - border-right-style: solid; - border-right-width: 0px; -} - -.green_title { - background-color: #82b92e; - font-weight: normal; - text-align: center; -} - -.dashboard { - top: 23px; -} - -.dashboard li a { - width: 158px; -} - -.text_subDashboard { - float: left; - margin-top: 5%; - margin-left: 3%; -} - -/* The items with the class 'spinner' will rotate */ -/* Not supported on IE9 and below */ -.spinner { - -webkit-animation: spinner 2s infinite linear; - animation: spinner 2s infinite linear; -} - -@-webkit-keyframes spinner { - 0% { - -ms-transform: rotate(0deg); /* IE */ - -moz-transform: rotate(0deg); /* FF */ - -o-transform: rotate(0deg); /* Opera */ - -webkit-transform: rotate(0deg); /* Safari and Chrome */ - transform: rotate(0deg); - } - 100% { - -ms-transform: rotate(359deg); /* IE */ - -moz-transform: rotate(359deg); /* FF */ - -o-transform: rotate(359deg); /* Opera */ - -webkit-transform: rotate(359deg); /* Safari and Chrome */ - transform: rotate(359deg); - } -} - -@keyframes spinner { - 0% { - -ms-transform: rotate(0deg); /* IE */ - -moz-transform: rotate(0deg); /* FF */ - -o-transform: rotate(0deg); /* Opera */ - -webkit-transform: rotate(0deg); /* Safari and Chrome */ - transform: rotate(0deg); - } - 100% { - -ms-transform: rotate(359deg); /* IE */ - -moz-transform: rotate(359deg); /* FF */ - -o-transform: rotate(359deg); /* Opera */ - -webkit-transform: rotate(359deg); /* Safari and Chrome */ - transform: rotate(359deg); - } -} - -#alert_messages { - -moz-border-bottom-right-radius: 5px; - -webkit-border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; - border-bottom-left-radius: 5px; - z-index: 3; - position: fixed; - width: 750px; - max-width: 750px; - min-width: 750px; - top: 20%; - background: white; -} -.modalheader { - text-align: center; - width: 100%; - height: 37px; - left: 0px; - background-color: #82b92e; -} -.modalheadertext { - color: white; - position: relative; - font-family: Nunito; - font-size: 13pt; - top: 8px; -} -.modalclosex { - cursor: pointer; - display: inline; - float: right; - margin-right: 10px; - margin-top: 10px; -} -.modalcontent { - color: black; - background: white; -} -.modalcontentimg { - float: left; - margin-left: 30px; - margin-top: 30px; - margin-bottom: 30px; -} -.modalcontenttext { - float: left; - text-align: justify; - color: #666; - font-size: 9.5pt; - line-height: 13pt; - margin-top: 30px; - width: 430px; - margin-left: 30px; -} - -.modalcontenttext > p { - color: black; -} -.modalcontenttext > p > a { - color: black; -} - -.modalokbutton { - transition-property: background-color, color; - transition-duration: 1s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color, color; - -webkit-transition-duration: 1s; - -o-transition-property: background-color, color; - -o-transition-duration: 1s; - cursor: pointer; - text-align: center; - margin-right: 45px; - float: right; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - margin-bottom: 30px; - border-radius: 3px; - width: 90px; - height: 30px; - background-color: white; - border: 1px solid #82b92e; -} -.modalokbuttontext { - transition-property: background-color, color; - transition-duration: 1s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color, color; - -webkit-transition-duration: 1s; - -o-transition-property: background-color, color; - -o-transition-duration: 1s; - color: #82b92e; - font-family: Nunito; - font-size: 10pt; - position: relative; - top: 6px; -} - -.modalokbutton:hover { - transition-property: background-color, color; - transition-duration: 1s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color, color; - -webkit-transition-duration: 1s; - -o-transition-property: background-color, color; - -o-transition-duration: 1s; - background-color: #82b92e; -} - -.modalokbutton:hover .modalokbuttontext { - transition-property: background-color, color; - transition-duration: 1s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color, color; - -webkit-transition-duration: 1s; - -o-transition-property: background-color, color; - -o-transition-duration: 1s; - color: white; -} -.modalgobutton { - transition-property: background-color, color; - transition-duration: 1s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color, color; - -webkit-transition-duration: 1s; - -o-transition-property: background-color, color; - -o-transition-duration: 1s; - cursor: pointer; - text-align: center; - margin-right: 15px; - margin-bottom: 30px; - float: right; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - width: 240px; - height: 30px; - background-color: white; - border: 1px solid #82b92e; -} -.modalgobuttontext { - transition-property: background-color, color; - transition-duration: 1s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color, color; - -webkit-transition-duration: 1s; - -o-transition-property: background-color, color; - -o-transition-duration: 1s; - color: #82b92e; - font-family: Nunito; - font-size: 10pt; - position: relative; - top: 6px; -} - -.modalgobutton:hover { - transition-property: background-color, color; - transition-duration: 1s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color, color; - -webkit-transition-duration: 1s; - -o-transition-property: background-color, color; - -o-transition-duration: 1s; - background-color: #82b92e; -} - -.modalgobutton:hover .modalgobuttontext { - transition-property: background-color, color; - transition-duration: 1s; - transition-timing-function: ease-out; - -webkit-transition-property: background-color, color; - -webkit-transition-duration: 1s; - -o-transition-property: background-color, color; - -o-transition-duration: 1s; - color: white; -} - -#opacidad { - opacity: 0.5; - z-index: 1; - width: 100%; - height: 100%; - position: absolute; - left: 0px; - top: 0px; -} - -.textodialogo { - margin-left: 0px; - color: black; - font-size: 9pt; -} - -.cargatextodialogo { - max-width: 58.5%; - width: 58.5%; - min-width: 58.5%; - float: left; - margin-left: 0px; - font-size: 18pt; - padding: 20px; - text-align: center; -} - -.cargatextodialogo b { - color: black; -} -.cargatextodialogo p { - color: black; -} - -.cargatextodialogo b { - color: black; -} -.cargatextodialogo a { - color: black; -} - -.cargatextodialogo > div { - color: black; -} - -.cargatextodialogo p, -.cargatextodialogo b, -.cargatextodialogo a { - font-size: 18pt; -} - -#toolbox > input { - border-width: 0px 1px 0px 0px; - border-color: lightgray; -} - -#toolbox > input.service_min { - border-width: 0px 0px 0px 0px; -} - -#toolbox > input.grid_min { - border-width: 0px 0px 0px 0px; -} -#tinymce { - padding-top: 20px; -} - -.rowPair:hover, -.rowOdd:hover { - background-color: #6e6e6e; -} -.databox.data > tbody > tr:hover { - background-color: #6e6e6e; -} -.checkselected { - background-color: #eee; -} - -#login_help_dialog * { - color: #222222; -} - -.introjs-tooltip * { - color: #222222; -} - -.dd_widget_content * { - color: #222222; -} - -#dialog_add_new_widget * { - color: #222222; -} - -.widget_configuration_form table tbody tr td:first-child { - color: #222222; -} - -.widget_configuration_form .container * { - color: #222222; -} -.widget_configuration_form b { - color: #222222; -} - -form[action="index.php?sec=estado&sec2=godmode/agentes/planned_downtime.list"] - * { - color: #222222; -} - -form[action="index.php?sec=estado&sec2=godmode/agentes/planned_downtime.list"] - input { - color: white; -} - -form[action="index.php?sec=estado&sec2=godmode/agentes/planned_downtime.list"] - select { - color: white; -} -.notify { - color: black; -} -.notify * { - color: black; -} -#login_logout * { - color: #222222; -} - -/*modal windows login*/ -div.content_alert { - width: 98%; - margin-top: 20px; +#menu_full { + background-color: #1a1a1a; } -div.icon_message_alert { - float: left; - width: 25%; - text-align: center; -} - -div.icon_message_alert img { - width: 85px; -} - -div.content_message_alert { - width: 75%; - float: right; -} - -div.content_message_alert * { - color: black; -} - -div.text_message_alert { - width: 100%; - margin-top: 10px; -} - -div.text_message_alert h1 { - margin: 0px; -} - -div.text_message_alert p { - margin: 0px; - font-size: 10.3pt; - line-height: 14pt; -} - -div.button_message_alert { - width: 100%; -} - -div.button_message_alert input { - float: right; - width: 87px; - height: 33px; - color: #82b92e; - border: 1px solid #82b92e; - font-weight: bold; - margin-right: 20px; - margin-top: 20px; - font-size: 10pt; -} - -div.form_message_alert { - width: 90%; - clear: both; - padding-top: 20px; - padding-left: 40px; -} - -div.form_message_alert ul li { - display: inline-block; - padding: 10px; -} - -div.form_message_alert ul li input { - border: none; - background-color: #dadada; - border-radius: 0px; - height: 17px; - width: 145px; - padding-left: 5px; -} - -div.form_message_alert ul li label { - font-size: 10pt; - padding-right: 20px; -} - -div.form_message_alert h4 { - margin: 0px; - margin-bottom: 10px; -} - -div.button_message_alert_form input { - float: right; - width: 87px; - height: 33px; - color: #82b92e; - border: 1px solid #82b92e; - font-weight: bold; - font-size: 10pt; - margin-right: 25px; -} - -.ui-dialog .ui-dialog-titlebar { - background-color: #82b92e; -} - -/* - styles header login -*/ -div#header_login { - width: 100%; - height: 65px; - background-color: rgba(255, 255, 255, 0.06); -} - -div#icon_custom_pandora { - float: left; - margin-top: 5px; - margin-left: 4%; -} - -div#list_icon_docs_support { - float: right; - margin-top: 8px; - margin-right: 4%; -} - -div#list_icon_docs_support ul { - margin-top: 5px; -} - -div#list_icon_docs_support ul li { - display: inline-block; - color: white; - vertical-align: middle; - margin-right: 5px; - font-size: 10pt; -} - -li#li_margin_left { - margin-left: 30px; -} - -/* - styles login form -*/ - -div.container_login { - margin-top: 10%; - margin-left: 5%; - margin-right: 5%; -} - -div.login_page { - width: 35%; - min-height: 600px; - float: left; -} - -div.login_page form { - border-right: 1px solid #868686; - padding-top: 30px; - padding-bottom: 50px; - min-width: 400px; - max-height: 600px; -} - -div.login_logo_icon { - margin-bottom: 40px; - text-align: center; -} - -div.login_logo_icon img { - margin: 0 auto; - width: 150px; -} -div.login_double_auth_code, -div.login_nick, -div.login_pass { - margin: 0 auto; - width: 70%; - height: 40px; - background-color: rgba(255, 255, 255, 0.2); - margin-bottom: 25px; - min-width: 260px; -} - -div.login_nick img, -div.login_pass img { - vertical-align: middle; - margin: 3px; -} - -div.login_nick input, -div.login_pass input { - background-color: rgba(255, 255, 255, 0); - border: 0px; - color: white; - border-radius: 0px; - width: 89%; - height: 40px; - font-size: 9pt; - padding: 0px; -} - -div.login_nick input:focus, -div.login_pass input:focus { - outline: none; -} - -div.login_nick input:-webkit-autofill, -div.login_nick input:-webkit-autofill:hover, -div.login_nick input:-webkit-autofill:focus, -div.login_nick input:-webkit-autofill:active, -div.login_pass input:-webkit-autofill, -div.login_pass input:-webkit-autofill:hover, -div.login_pass input:-webkit-autofill:focus, -div.login_pass input:-webkit-autofill:active { - transition: background-color 10000s ease-in-out 0s; - -webkit-box-shadow: 0 0 0px 0px transparent inset; - -webkit-text-fill-color: white; - border: 0px; - width: 89%; -} - -div.login_nick input::-webkit-input-placeholder, -div.login_pass input::-webkit-input-placeholder { - color: white; -} - -div.login_pass img, -div.login_nick img { - width: 30px; -} - -div.login_pass div, -div.login_nick div { - float: left; - width: 11%; -} - -div.login_button { - margin: 0 auto; - width: 70%; - height: 40px; - background-color: rgb(25, 25, 25); - border: 1px solid white; - min-width: 260px; -} - -div.login_button input { - width: 100%; - background-color: rgb(25, 25, 25); - text-align: center; - border: 0px; - border-radius: 0px; - height: 40px; - padding: 0px; - font-size: 9pt; - color: white; -} - -div.login_data { - width: 65%; - min-height: 600px; - float: left; -} - -div.text_banner_login { - width: 100%; - margin-bottom: 60px; - color: white; - text-align: center; -} - -div.text_banner_login span { - width: 100%; -} - -span.span1 { - font-size: 3vw; - font-family: "lato-thin"; - color: white; -} - -span.span2 { - font-size: 3vw; - font-family: "lato-bolder"; - color: white; -} - -div.img_banner_login { - width: 100%; - text-align: center; -} - -div.img_banner_login img { - max-width: 70%; - min-width: 70%; - max-height: 50%; - min-height: 50%; -} - -@media all and (max-width: 1200px) { - span.span1 { - font-size: 30pt; - } - span.span2 { - font-size: 30pt; - } -} - -.new_task p, -.new_task h3, -.new_task h2, -.new_task a, -.new_task strong { - color: #222222; -} -.item p { - color: #222222; +.button_collapse { + background-color: #444; } -.item span { - color: #222222; +.operation .selected, +.godmode .selected, +.menu_icon:hover { + background-color: #080808; } -.widget_config_advice, -.widget_config_advice * { - color: black; +/* footer */ +div#foot { + background: #222; } diff --git a/pandora_console/index.php b/pandora_console/index.php index 3c95074171..58c5998b87 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1214,14 +1214,17 @@ echo "\n\n"; // Values from PHP to be recovered from JAVASCRIPT require 'include/php_to_js_values.php'; - +// if ($config['style'] !== 'pandora') { ?> '; // This tag is included in the buffer passed to ui_process_page_head so -// technically it can be stripped +// technically it can be stripped. echo ''."\n"; require_once 'include/functions_themes.php'; @@ -212,13 +232,13 @@ $config['remote_addr'] = $_SERVER['REMOTE_ADDR']; $sec2 = get_parameter_get('sec2'); $sec2 = safe_url_extraclean($sec2); $page = $sec2; -// Reference variable for old time sake +// Reference variable for old time sake. $sec = get_parameter_get('sec'); $sec = safe_url_extraclean($sec); $process_login = false; -// Update user password +// Update user password. $change_pass = get_parameter_post('renew_password', 0); if ($change_pass == 1) { @@ -235,14 +255,14 @@ $searchPage = false; $search = get_parameter_get('head_search_keywords'); if (strlen($search) > 0) { $config['search_keywords'] = io_safe_input(trim(io_safe_output(get_parameter('keywords')))); - // If not search category providad, we'll use an agent search + // If not search category providad, we'll use an agent search. $config['search_category'] = get_parameter('search_category', 'all'); if (($config['search_keywords'] != 'Enter keywords to search') && (strlen($config['search_keywords']) > 0)) { $searchPage = true; } } -// Login process +// Login process. if (! isset($config['id_user'])) { // Clear error messages. unset($_COOKIE['errormsg']); @@ -250,50 +270,53 @@ if (! isset($config['id_user'])) { if (isset($_GET['login'])) { include_once 'include/functions_db.php'; - // Include it to use escape_string_sql function + // Include it to use escape_string_sql function. $config['auth_error'] = ''; - // Set this to the error message from the authorization mechanism + // Set this to the error message from the authorization mechanism. $nick = get_parameter_post('nick'); - // This is the variable with the login + // This is the variable with the login. $pass = get_parameter_post('pass'); - // This is the variable with the password + // This is the variable with the password. $nick = db_escape_string_sql($nick); $pass = db_escape_string_sql($pass); - // Since now, only the $pass variable are needed + // Since now, only the $pass variable are needed. unset($_GET['pass'], $_POST['pass'], $_REQUEST['pass']); - // If the auth_code exists, we assume the user has come through the double auth page + // If the auth_code exists, we assume the user has come from + // double authorization page. if (isset($_POST['auth_code'])) { $double_auth_success = false; - // The double authentication is activated and the user has surpassed the first step (the login). + // The double authentication is activated and the user has + // surpassed the first step (the login). // Now the authentication code provided will be checked. if (isset($_SESSION['prepared_login_da'])) { if (isset($_SESSION['prepared_login_da']['id_user']) && isset($_SESSION['prepared_login_da']['timestamp']) ) { - // The user has a maximum of 5 minutes to introduce the double auth code + // The user has a maximum of 5 minutes to introduce + // the double auth code. $dauth_period = SECONDS_2MINUTES; $now = time(); $dauth_time = $_SESSION['prepared_login_da']['timestamp']; if (($now - $dauth_period) < $dauth_time) { - // Nick + // Nick. $nick = $_SESSION['prepared_login_da']['id_user']; - // Code + // Code. $code = (string) get_parameter_post('auth_code'); if (!empty($code)) { $result = validate_double_auth_code($nick, $code); if ($result === true) { - // Double auth success + // Double auth success. $double_auth_success = true; } else { - // Screen + // Screen. $login_screen = 'double_auth'; - // Error message + // Error message. $config['auth_error'] = __('Invalid code'); if (!isset($_SESSION['prepared_login_da']['attempts'])) { @@ -303,9 +326,9 @@ if (! isset($config['id_user'])) { $_SESSION['prepared_login_da']['attempts']++; } } else { - // Screen + // Screen. $login_screen = 'double_auth'; - // Error message + // Error message. $config['auth_error'] = __("The code shouldn't be empty"); if (!isset($_SESSION['prepared_login_da']['attempts'])) { @@ -315,27 +338,27 @@ if (! isset($config['id_user'])) { $_SESSION['prepared_login_da']['attempts']++; } } else { - // Expired login + // Expired login. unset($_SESSION['prepared_login_da']); - // Error message + // Error message. $config['auth_error'] = __('Expired login'); } } else { - // If the code doesn't exist, remove the prepared login + // If the code doesn't exist, remove the prepared login. unset($_SESSION['prepared_login_da']); - // Error message + // Error message. $config['auth_error'] = __('Login error'); } - } - // If $_SESSION['prepared_login_da'] doesn't exist, the user have to do the login again - else { - // Error message + } else { + // If $_SESSION['prepared_login_da'] doesn't exist, the user + // must login again. + // Error message. $config['auth_error'] = __('Login error'); } - // Remove the authenticator code + // Remove the authenticator code. unset($_POST['auth_code'], $code); if (!$double_auth_success) { @@ -347,6 +370,8 @@ if (! isset($config['id_user'])) { $_SERVER['REMOTE_ADDR'] ); while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); @@ -355,7 +380,8 @@ if (! isset($config['id_user'])) { $login_button_saml = get_parameter('login_button_saml', false); if (isset($double_auth_success) && $double_auth_success) { - // This values are true cause there are checked before complete the 2nd auth step + // This values are true cause there are checked before complete + // the 2nd auth step. $nick_in_db = $_SESSION['prepared_login_da']['id_user']; $expired_pass = false; } else if (($config['auth'] == 'saml') && ($login_button_saml)) { @@ -370,10 +396,13 @@ if (! isset($config['id_user'])) { $as->logout(); } } else { - // process_user_login is a virtual function which should be defined in each auth file. - // It accepts username and password. The rest should be internal to the auth file. - // The auth file can set $config["auth_error"] to an informative error output or reference their internal error messages to it - // process_user_login should return false in case of errors or invalid login, the nickname if correct + // Function process_user_login is a virtual function which should be + // defined in each auth file. It accepts username and password. The + // rest should be internal to the auth file. The auth file can set + // $config["auth_error"] to an informative error output or reference + // their internal error messages to it process_user_login should + // return false in case of errors or invalid login, the nickname + // if correct. $nick_in_db = process_user_login($nick, $pass); $expired_pass = false; @@ -391,28 +420,34 @@ if (! isset($config['id_user'])) { include_once 'general/login_page.php'; db_pandora_audit('Password expired', 'Password expired: '.$nick, $nick); while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); } - // Checks if password has expired + // Checks if password has expired. $check_status = check_pass_status($nick, $pass); switch ($check_status) { case PASSSWORD_POLICIES_FIRST_CHANGE: - // first change + // First change. case PASSSWORD_POLICIES_EXPIRED: - // pass expired + // Pass expired. $expired_pass = true; login_change_password($nick, '', $check_status); break; + + default: + // Ignore. + break; } } } if (($nick_in_db !== false) && $expired_pass) { - // login ok and password has expired + // Login ok and password has expired. include_once 'general/login_page.php'; db_pandora_audit( 'Password expired', @@ -420,30 +455,38 @@ if (! isset($config['id_user'])) { $nick ); while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); } else if (($nick_in_db !== false) && (!$expired_pass)) { - // login ok and password has not expired - // Double auth check - if ((!isset($double_auth_success) || !$double_auth_success) && is_double_auth_enabled($nick_in_db)) { - // Store this values in the session to know if the user login was correct + // Login ok and password has not expired. + // Double auth check. + if ((!isset($double_auth_success) + || !$double_auth_success) + && is_double_auth_enabled($nick_in_db) + ) { + // Store this values in the session to know if the user login + // was correct. $_SESSION['prepared_login_da'] = [ 'id_user' => $nick_in_db, 'timestamp' => time(), 'attempts' => 0, ]; - // Load the page to introduce the double auth code + // Load the page to introduce the double auth code. $login_screen = 'double_auth'; include_once 'general/login_page.php'; while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); } - // login ok and password has not expired + // Login ok and password has not expired. $process_login = true; if (is_user_admin($nick)) { @@ -455,7 +498,7 @@ if (! isset($config['id_user'])) { if (!isset($_GET['sec2']) && !isset($_GET['sec'])) { // Avoid the show homepage when the user go to // a specific section of pandora - // for example when timeout the sesion + // for example when timeout the sesion. unset($_GET['sec2']); $_GET['sec'] = 'general/logon_ok'; $home_page = ''; @@ -486,6 +529,7 @@ if (! isset($config['id_user'])) { break; case 'Default': + default: $_GET['sec'] = 'general/logon_ok'; break; @@ -521,11 +565,14 @@ if (! isset($config['id_user'])) { $_SESSION['id_usuario'] = $nick_in_db; $config['id_user'] = $nick_in_db; - // Check if connection goes through F5 balancer. If it does, then don't call config_prepare_session() or user will be back to login all the time + // Check if connection goes through F5 balancer. If it does, then + // don't call config_prepare_session() or user will be back to login + // all the time. $prepare_session = true; foreach ($_COOKIE as $key => $value) { if (preg_match('/BIGipServer*/', $key)) { $prepare_session = false; + break; } } @@ -534,9 +581,13 @@ if (! isset($config['id_user'])) { } if (is_user_admin($config['id_user'])) { - // PHP configuration values - $PHPupload_max_filesize = config_return_in_bytes(ini_get('upload_max_filesize')); - $PHPmemory_limit = config_return_in_bytes(ini_get('memory_limit')); + // PHP configuration values. + $PHPupload_max_filesize = config_return_in_bytes( + ini_get('upload_max_filesize') + ); + $PHPmemory_limit = config_return_in_bytes( + ini_get('memory_limit') + ); $PHPmax_execution_time = ini_get('max_execution_time'); if ($PHPmax_execution_time !== '0') { @@ -571,43 +622,60 @@ if (! isset($config['id_user'])) { $l10n = null; if (file_exists('./include/languages/'.$user_language.'.mo')) { - $l10n = new gettext_reader(new CachedFileReader('./include/languages/'.$user_language.'.mo')); + $cacheFileReader = new CachedFileReader( + './include/languages/'.$user_language.'.mo' + ); + $l10n = new gettext_reader($cacheFileReader); $l10n->load_tables(); } } else { - // login wrong + // Login wrong. $blocked = false; - if ((!is_user_admin($nick) || $config['enable_pass_policy_admin']) && file_exists(ENTERPRISE_DIR.'/load_enterprise.php')) { + if ((!is_user_admin($nick) || $config['enable_pass_policy_admin']) + && file_exists(ENTERPRISE_DIR.'/load_enterprise.php') + ) { $blocked = login_check_blocked($nick); } if (!$blocked) { if (file_exists(ENTERPRISE_DIR.'/load_enterprise.php')) { + // Checks failed attempts. login_check_failed($nick); - // Checks failed attempts } $login_failed = true; include_once 'general/login_page.php'; - db_pandora_audit('Logon Failed', 'Invalid login: '.$nick, $nick); + db_pandora_audit( + 'Logon Failed', + 'Invalid login: '.$nick, + $nick + ); while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); } else { include_once 'general/login_page.php'; - db_pandora_audit('Logon Failed', 'Invalid login: '.$nick, $nick); + db_pandora_audit( + 'Logon Failed', + 'Invalid login: '.$nick, + $nick + ); while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); } } - // Form the url + // Form the url. $query_params_redirect = $_GET; - // Visual console do not want sec2 + // Visual console do not want sec2. if ($home_page == 'Visual console') { unset($query_params_redirect['sec2']); } @@ -621,15 +689,19 @@ if (! isset($config['id_user'])) { $redirect_url .= '&'.safe_url_extraclean($key).'='.safe_url_extraclean($value); } - header('Location: '.$config['homeurl'].'index.php'.$redirect_url); + header('Location: '.ui_get_full_url('index.php'.$redirect_url)); exit; // Always exit after sending location headers. } else if (isset($_GET['loginhash'])) { - // Hash login process + // Hash login process. $loginhash_data = get_parameter('loginhash_data', ''); $loginhash_user = str_rot13(get_parameter('loginhash_user', '')); - if ($config['loginhash_pwd'] != '' && $loginhash_data == md5($loginhash_user.io_output_password($config['loginhash_pwd']))) { + if ($config['loginhash_pwd'] != '' + && $loginhash_data == md5( + $loginhash_user.io_output_password($config['loginhash_pwd']) + ) + ) { db_logon($loginhash_user, $_SERVER['REMOTE_ADDR']); $_SESSION['id_usuario'] = $loginhash_user; $config['id_user'] = $loginhash_user; @@ -637,6 +709,8 @@ if (! isset($config['id_user'])) { include_once 'general/login_page.php'; db_pandora_audit('Logon Failed (loginhash', '', 'system'); while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); @@ -758,7 +832,7 @@ if (! isset($config['id_user'])) { $body .= '

    '; $body .= __('Please click the link below to reset your password'); $body .= '

    '; - $body .= ''.__('Reset your password').''; + $body .= ''.__('Reset your password').''; $body .= '

    '; $body .= get_product_name(); $body .= '

    '; @@ -781,6 +855,8 @@ if (! isset($config['id_user'])) { } while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); @@ -790,11 +866,20 @@ if (! isset($config['id_user'])) { $loginhash_data = get_parameter('loginhash_data', ''); $loginhash_user = str_rot13(get_parameter('loginhash_user', '')); $iduser = $_SESSION['id_usuario']; - // logoff_db ($iduser, $_SERVER["REMOTE_ADDR"]); check why is not available + + /* + * Check why is not available. + * logoff_db ($iduser, $_SERVER["REMOTE_ADDR"]); + */ + unset($_SESSION['id_usuario']); unset($iduser); - if ($config['loginhash_pwd'] != '' && $loginhash_data == md5($loginhash_user.io_output_password($config['loginhash_pwd']))) { + if ($config['loginhash_pwd'] != '' + && $loginhash_data == md5( + $loginhash_user.io_output_password($config['loginhash_pwd']) + ) + ) { db_logon($loginhash_user, $_SERVER['REMOTE_ADDR']); $_SESSION['id_usuario'] = $loginhash_user; $config['id_user'] = $loginhash_user; @@ -802,6 +887,8 @@ if (! isset($config['id_user'])) { include_once 'general/login_page.php'; db_pandora_audit('Logon Failed (loginhash', '', 'system'); while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); @@ -814,7 +901,7 @@ if (! isset($config['id_user'])) { '*' ); if ($user_in_db == false) { - // logout + // Logout. $_REQUEST = []; $_GET = []; $_POST = []; @@ -825,6 +912,8 @@ if (! isset($config['id_user'])) { unset($iduser); include_once 'general/login_page.php'; while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); @@ -832,7 +921,7 @@ if (! isset($config['id_user'])) { if (((bool) $user_in_db['is_admin'] === false) && ((bool) $user_in_db['not_login'] === true) ) { - // logout + // Logout. $_REQUEST = []; $_GET = []; $_POST = []; @@ -843,6 +932,8 @@ if (! isset($config['id_user'])) { unset($iduser); include_once 'general/login_page.php'; while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); @@ -850,12 +941,12 @@ if (! isset($config['id_user'])) { } } -// Enterprise support +// Enterprise support. if (file_exists(ENTERPRISE_DIR.'/load_enterprise.php')) { include_once ENTERPRISE_DIR.'/load_enterprise.php'; } -// Log off +// Log off. if (isset($_GET['bye'])) { include 'general/logoff.php'; $iduser = $_SESSION['id_usuario']; @@ -873,6 +964,8 @@ if (isset($_GET['bye'])) { } while (@ob_end_flush()) { + // Dumping... + continue; } exit(''); @@ -880,10 +973,11 @@ if (isset($_GET['bye'])) { clear_pandora_error_for_header(); -// ---------------------------------------------------------------------- -// EXTENSIONS -// ---------------------------------------------------------------------- /* + * ---------------------------------------------------------------------- + * EXTENSIONS + * ---------------------------------------------------------------------- + * * Load the basic configurations of extension and add extensions into menu. * Load here, because if not, some extensions not load well, I don't why. */ @@ -892,7 +986,7 @@ $config['logged'] = false; extensions_load_extensions($process_login); if ($process_login) { - // Call all extensions login function + // Call all extensions login function. extensions_call_login_function(); unset($_SESSION['new_update']); @@ -983,7 +1077,7 @@ if (get_parameter('login', 0) !== 0) { } } -// Header +// Header. if ($config['pure'] == 0) { echo '

    '; - // main_pure + // Main pure. } echo '
    '; @@ -1202,16 +1299,17 @@ require_once 'include/functions_clippy.php'; clippy_start($sec2); while (@ob_end_flush()) { - // Dump. + // Dumping... + continue; } db_print_database_debug(); echo ''; $run_time = format_numeric((microtime(true) - $config['start_time']), 3); -echo "\n\n"; +echo "\n\n"; -// Values from PHP to be recovered from JAVASCRIPT +// Values from PHP to be recovered from JAVASCRIPT. require 'include/php_to_js_values.php'; @@ -1219,12 +1317,13 @@ require 'include/php_to_js_values.php'; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 679e01e0f4..93bd2dee08 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -5323,6 +5323,10 @@ table.info_table.policy_sub_table { margin-bottom: 4px; } +.agent_options input[readonly] { + color: #848484; +} + /* * --------------------------------------------------------------------- * - CLASSES FOR THE NEW TOGGLES - From a10945d2096489a560ae78487753809e6653026f Mon Sep 17 00:00:00 2001 From: alejandro-campos Date: Thu, 4 Jul 2019 18:33:12 +0200 Subject: [PATCH 260/460] fix bug in api function that removes an agent from a policy --- pandora_console/include/functions_api.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 0569319a29..899add9ec0 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -15059,17 +15059,18 @@ function remove_agent_from_policy($id_policy, $use_agent_name, $params) if (is_metaconsole()) { if ($use_agent_name === false) { $id_node = $params[1]; - $id_agent = db_get_value_filter('id_agente', 'tmetaconsole_agent', ['id_tagente' => $params[0], 'id_tmetaconsole_setup' => $id_node]); + $id_agent = $params[0]; } else { - $id_agent = db_get_value_filter('id_agente', 'tmetaconsole_agent', ['nombre' => $params[0]]); + $id_node = db_get_value_filter('id_tmetaconsole_setup', 'tmetaconsole_agent', ['nombre' => $params[0]]); + $id_agent = db_get_value_filter('id_tagente', 'tmetaconsole_agent', ['nombre' => $params[0]]); } - $agent = db_get_row_filter('tmetaconsole_agent', ['id_agente' => $id_agent]); + $agent = db_get_row_filter('tmetaconsole_agent', ['id_tagente' => $id_agent, 'id_tmetaconsole_setup' => $id_node]); } $policy = policies_get_policy($id_policy, false, false); - $policy_agent = db_get_row_filter('tpolicy_agents', ['id_policy' => $id_policy, 'id_agent' => $id_agent]); + $policy_agent = (is_metaconsole()) ? db_get_row_filter('tpolicy_agents', ['id_policy' => $id_policy, 'id_agent' => $id_agent, 'id_node' => $id_node]) : db_get_row_filter('tpolicy_agents', ['id_policy' => $id_policy, 'id_agent' => $id_agent]); if (empty($policy)) { returnError('error_policy', __('This policy does not exist.')); From 0e3fd848f7e1e5a66ba670058c278ef4d1bcea85 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 4 Jul 2019 19:34:03 +0200 Subject: [PATCH 261/460] minor fixes and visual change in azure credentials --- pandora_console/include/constants.php | 1 + pandora_console/include/functions_credential_store.php | 4 ++-- pandora_console/operation/agentes/ver_agente.php | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/constants.php b/pandora_console/include/constants.php index c5cce5d347..7e44f1c080 100644 --- a/pandora_console/include/constants.php +++ b/pandora_console/include/constants.php @@ -590,6 +590,7 @@ define('DISCOVERY_APP_MYSQL', 4); define('DISCOVERY_APP_ORACLE', 5); define('DISCOVERY_CLOUD_AWS_EC2', 6); define('DISCOVERY_CLOUD_AWS_RDS', 7); +define('DISCOVERY_CLOUD_AZURE_COMPUTE', 8); // Discovery types matching definition. diff --git a/pandora_console/include/functions_credential_store.php b/pandora_console/include/functions_credential_store.php index 20b643d0b8..eaf756f7b1 100644 --- a/pandora_console/include/functions_credential_store.php +++ b/pandora_console/include/functions_credential_store.php @@ -362,7 +362,7 @@ function print_inputs($values=null) 'label' => $extra_1_label, 'name' => 'extra_1', 'input_class' => 'flex-row', - 'type' => 'password', + 'type' => 'text', 'value' => $values['extra_1'], 'return' => true, ] @@ -375,7 +375,7 @@ function print_inputs($values=null) 'label' => $extra_2_label, 'name' => 'extra_2', 'input_class' => 'flex-row', - 'type' => 'password', + 'type' => 'text', 'value' => $values['extra_2'], 'return' => true, 'display' => $extra2, diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index b9b2a2128d..b625595930 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -70,7 +70,7 @@ if (is_ajax()) { if ($id_agente > 0) { $last_contact = db_get_value_sql( sprintf( - 'SELECT intervalo - (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(IF(ultimo_contacto > ultimo_contacto_remoto, ultimo_contacto, ultimo_contacto_remoto))) + 'SELECT format(intervalo,2) - (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(IF(ultimo_contacto > ultimo_contacto_remoto, ultimo_contacto, ultimo_contacto_remoto))) as "val" FROM `tagente` WHERE id_agente = %d ', $id_agente From 8229f634e0e85e5a7b00218cf119236050faf7a4 Mon Sep 17 00:00:00 2001 From: artica Date: Fri, 5 Jul 2019 00:01:09 +0200 Subject: [PATCH 262/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 4ca43080d4..531a41e5b3 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190704 +Version: 7.0NG.736-190705 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 4d2eb2ad36..98fdaa992f 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190704" +pandora_version="7.0NG.736-190705" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index c4b8c9a482..1e03cfa248 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190704'; +use constant AGENT_BUILD => '190705'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 9ee7dfac59..1e03c24394 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190704 +%define release 190705 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 0adace638a..ac8a594450 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190704 +%define release 190705 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 1650743680..1fc0ed921c 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190704" +PI_BUILD="190705" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 6e9c24fdbf..32836deca7 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190704} +{190705} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 61557bc15a..02d9a63209 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190704)") +#define PANDORA_VERSION ("7.0NG.736(Build 190705)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 6a19940b9b..8ecffd52ee 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190704))" + VALUE "ProductVersion", "(7.0NG.736(Build 190705))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 2f4cba40c0..5e6512722a 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190704 +Version: 7.0NG.736-190705 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 9e607576dc..d6f3b6da50 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190704" +pandora_version="7.0NG.736-190705" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 4868483266..62812d314c 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190704'; +$build_version = 'PC190705'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 56db55110d..00e176f42c 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index bd2c15d77d..b2e81b4c72 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190704 +%define release 190705 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index ce2fc59451..a31db9b0c4 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190704 +%define release 190705 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 1de14abf9f..39391e9339 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190704" +PI_BUILD="190705" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 9fa9ef2dfc..fa0822b985 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190704"; +my $version = "7.0NG.736 PS190705"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 5eae88d3e8..be30e449dc 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190704"; +my $version = "7.0NG.736 PS190705"; # save program name for logging my $progname = basename($0); From 31b19ab970f1df69484c4c799c43a639b3d34bd3 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Fri, 5 Jul 2019 09:31:23 +0200 Subject: [PATCH 263/460] Fix pagination blank page - #4306 --- pandora_console/include/functions_ui.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index ef8089ac3a..0bf4b8dd2d 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2049,7 +2049,7 @@ function ui_pagination( $actual_page = floor($offset / $pagination); $ini_page = (floor($actual_page / $block_limit) * $block_limit); $end_page = ($ini_page + $block_limit - 1); - if ($end_page > $number_of_pages) { + if ($end_page >= $number_of_pages) { $end_page = ($number_of_pages - 1); } From 7175d716f032dde6da6178afa70c317025244c7c Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Fri, 5 Jul 2019 10:32:10 +0200 Subject: [PATCH 264/460] fixed translate --- .../godmode/reporting/reporting_builder.item_editor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index b269b153d5..ff8ca88e40 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -2617,7 +2617,7 @@ $class = 'databox filters';
    ".__('Pandora status info').'
    From 6e7dfb38fd0482db0314b0cd230ee0f4173f0fc3 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Fri, 5 Jul 2019 13:46:48 +0200 Subject: [PATCH 265/460] fixed error network component plugin --- .../manage_network_components_form_plugin.php | 63 +++++++++++----- .../include/javascript/pandora_modules.js | 74 ++++++++++++++----- 2 files changed, 100 insertions(+), 37 deletions(-) diff --git a/pandora_console/godmode/modules/manage_network_components_form_plugin.php b/pandora_console/godmode/modules/manage_network_components_form_plugin.php index 19d3c45e8f..94ce00892e 100755 --- a/pandora_console/godmode/modules/manage_network_components_form_plugin.php +++ b/pandora_console/godmode/modules/manage_network_components_form_plugin.php @@ -1,17 +1,32 @@ rowstyle['macro_field'] = 'display:none'; push_table_row($data, 'macro_field'); -// If there are $macros, we create the form fields +// If there are $macros, we create the form fields. if (!empty($macros)) { $macros = json_decode($macros, true); @@ -68,9 +83,23 @@ if (!empty($macros)) { } if ($m['hide'] == 1) { - $data[1] = html_print_input_text($m['macro'], $m['value'], '', 100, 1024, true); + $data[1] = html_print_input_text( + $m['macro'], + io_output_password($m['value']), + '', + 100, + 1024, + true + ); } else { - $data[1] = html_print_input_text($m['macro'], io_output_password($m['value']), '', 100, 1024, true); + $data[1] = html_print_input_text( + $m['macro'], + $m['value'], + '', + 100, + 1024, + true + ); } $table->colspan['macro'.$m['macro']][1] = 3; diff --git a/pandora_console/include/javascript/pandora_modules.js b/pandora_console/include/javascript/pandora_modules.js index 049bb9e96b..1d5c804289 100644 --- a/pandora_console/include/javascript/pandora_modules.js +++ b/pandora_console/include/javascript/pandora_modules.js @@ -791,7 +791,7 @@ function new_macro(prefix, callback) { } } -function add_macro_field(macro, row_model_id) { +function add_macro_field(macro, row_model_id, type_copy) { var macro_desc = macro["desc"]; // Change the carriage returns by html returns
    in help var macro_help = macro["help"].replace(/ /g, "
    "); @@ -850,16 +850,31 @@ function add_macro_field(macro, row_model_id) { } // Change the text box id and value - $("#" + row_id) - .children() - .eq(1) - .attr("id", "text-" + macro_macro); - $("#" + row_id) - .children() - .eq(1) - .attr("name", macro_macro); + if (type_copy == "td") { + $("#" + row_id) + .children() + .eq(1) + .children() + .eq(0) + .attr("id", "text-" + macro_macro); + $("#" + row_id) + .children() + .eq(1) + .children() + .eq(0) + .attr("name", macro_macro); + } else { + $("#" + row_id) + .children() + .eq(1) + .attr("id", "text-" + macro_macro); + $("#" + row_id) + .children() + .eq(1) + .attr("name", macro_macro); + } - macro_field_hide = false; + var macro_field_hide = false; if (typeof macro["hide"] == "string") { if (macro["hide"].length == 0) { macro_field_hide = false; @@ -872,16 +887,35 @@ function add_macro_field(macro, row_model_id) { } } - if (macro_field_hide) { - $("#" + row_id) - .children() - .eq(1) - .attr("type", "password"); + if (type_copy == "td") { + if (macro_field_hide) { + $("#" + row_id) + .children() + .eq(1) + .children() + .eq(0) + .attr("type", "password"); + } else { + $("#" + row_id) + .children() + .eq(1) + .children() + .eq(0) + .val(macro_value); + } + } else { + if (macro_field_hide) { + $("#" + row_id) + .children() + .eq(1) + .attr("type", "password"); + } else { + $("#" + row_id) + .children() + .eq(1) + .val(macro_value); + } } - $("#" + row_id) - .children() - .eq(1) - .val(macro_value); $("#" + row_id).show(); } @@ -908,7 +942,7 @@ function load_plugin_macros_fields(row_model_id) { $("#hidden-macros").val(data["base64"]); jQuery.each(data["array"], function(i, macro) { if (macro["desc"] != "") { - add_macro_field(macro, row_model_id); + add_macro_field(macro, row_model_id, "td"); } }); //Plugin text can be larger From d1bc6cc2ffd83b98fe40b71032a056f92464b20d Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Fri, 5 Jul 2019 13:59:48 +0200 Subject: [PATCH 266/460] Created green theme - #4194 --- .../include/graphs/functions_d3.php | 2 +- .../include/styles/pandora_black.css | 38 ++++ .../include/styles/pandora_green_old.css | 185 +++++++++++++----- 3 files changed, 173 insertions(+), 52 deletions(-) diff --git a/pandora_console/include/graphs/functions_d3.php b/pandora_console/include/graphs/functions_d3.php index e3962bf729..fea1273015 100644 --- a/pandora_console/include/graphs/functions_d3.php +++ b/pandora_console/include/graphs/functions_d3.php @@ -770,7 +770,7 @@ function print_donut_narrow_graph( default: $textColor = '#000'; - $strokeColor = 'transparent'; + $strokeColor = '#fff'; break; } diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css index 2fcee7b2ae..a94dcf468c 100644 --- a/pandora_console/include/styles/pandora_black.css +++ b/pandora_console/include/styles/pandora_black.css @@ -130,6 +130,15 @@ textarea:disabled { filter: brightness(2.5) contrast(3.5); } +/* events.css */ +table.table_modal_alternate tr:nth-child(odd) td { + background-color: #222; +} + +table.table_modal_alternate tr:nth-child(even) td { + background-color: #111; +} + /* tables.css */ .info_table { background-color: #222; @@ -281,3 +290,32 @@ div#foot { .ui-widget-content a { color: #fff; } + +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default { + background-color: #222; + color: #fff; +} + +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active { + background-color: #111; + color: #fff; +} + +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #fff; +} + +ul.ui-tabs-nav.ui-corner-all.ui-helper-reset.ui-helper-clearfix.ui-widget-header + img { + filter: brightness(2); +} diff --git a/pandora_console/include/styles/pandora_green_old.css b/pandora_console/include/styles/pandora_green_old.css index cb04b54d57..239ecee786 100644 --- a/pandora_console/include/styles/pandora_green_old.css +++ b/pandora_console/include/styles/pandora_green_old.css @@ -21,70 +21,153 @@ Description: The default Pandora FMS theme layout // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* header */ -div#head { - background-color: #80ab51; - color: white; - background-image: url(../../images/header.jpg); -} - /* menu.css */ .operation, -#menu_full { - background-color: #80ab51; -} - -.operation .selected { - background-color: #d9fb86; -} - -.operation li.selected { - box-shadow: inset 4px 0 #80ab51; -} -.operation .menu_icon:hover { - background-color: #d9fb86; -} - -.operation .sub_subMenu:hover { - background-color: #d9fb86; - color: #585858; -} - -.godmode .selected { - background-color: #a77853; -} - -.godmode li.selected { - box-shadow: inset 4px 0 #e79b5d; -} - -.godmode .menu_icon:hover { - background-color: #a77853; +#menu_full, +.godmode, +.operation .menu_icon ul.submenu > li, +.godmode .menu_icon ul.submenu > li, +.sub_subMenu { + background-color: #fff; } +.operation .selected, +.operation .menu_icon:hover, +.godmode .selected, +.godmode .menu_icon:hover, .godmode .submenu_not_selected:hover, -.godmode .submenu_selected:hover { - background-color: #a77853 !important; +.godmode .submenu_selected:hover, +.operation .sub_subMenu:hover, +.operation .menu_icon ul.submenu > li:hover, +.godmode .menu_icon ul.submenu > li:hover { + background-color: #343434 !important; + color: #fff; } -.godmode .sub_subMenu:hover { - background-color: #a77853; - color: #2f2f2f; +ul.subsubmenu li { + background-color: #82b92e; } -/* General styles */ -.green_title { - background-color: #80ab51; +.godmode { + border-top: 1px solid #f1f1f1; +} + +.menu li ul { + border: 1px solid #f1f1f1; +} + +#title_menu, +.submenu_text { + color: #9c9c9c; +} + +.button_collapse, +div#foot { + background-color: #82b92e; +} + +/* footer */ +div#foot a, +div#foot span { + color: #fff; } /* Tabs */ -#menu_tab li.nomn_high, -#menu_tab li.nomn_high span { - box-shadow: inset 0px 4px #80ab51; -} - #menu_tab_frame, #menu_tab_frame_view, #menu_tab_frame_view_bc { - border-bottom: 2px solid #80ab51; + background-color: #82b92e; +} + +#menu_tab li.nomn_high, +#menu_tab li.nomn_high span { + box-shadow: inset 0px 4px #fff; + background-color: transparent; +} +#menu_tab li:hover { + box-shadow: inset 0px 4px #fff; + background-color: #ffffff38; +} + +#menu_tab_left li a, +#menu_tab_left li span { + color: #fff; +} + +#menu_tab li.nomn img, +#menu_tab li img { + filter: brightness(4.5); +} + +/* General styles */ +div#page { + background: #ecfad6; +} + +#top_btn { + background-color: #343434; +} + +#top_btn:hover { + background-color: transparent; +} + +.breadcrumb_link.selected, +.breadcrumb_active { + color: #ecfad6; +} + +.sort_arrow img { + filter: brightness(2.5) contrast(3.5); +} + +/* tables.css */ +.info_table tr:first-child > th { + background-color: #343434; + color: #fff; +} + +.info_table > tbody > tr > th, +.info_table > thead > tr > th, +.info_table > thead > tr > th a, +.info_table > thead > tr > th > span { + color: #fff; +} + +/* agent view*/ +.agent_details_header, +.white_table tr:first-child > th, +.white_table_graph_header { + background-color: #343434; + color: #fff; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.white_table thead tr:first-child > th { + border-radius: 0; +} + +.white_table thead tr:first-child > th:first-child { + border-top-left-radius: 4px; +} + +.white_table thead tr:first-child > th:last-child { + border-top-right-radius: 4px; +} + +.buttons_agent_view a img { + background-color: #fff; +} + +.breadcrumbs_container, +.breadcrumb_link, +div.agent_details_agent_alias * { + color: #fff; +} + +/* jquery custom */ +.ui-dialog, +.ui-widget-content { + background-color: #ecfad6; } From 745ab711de469133d45b32ef9f1cdc8b92be4016 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Fri, 5 Jul 2019 14:02:59 +0200 Subject: [PATCH 267/460] Created green theme - #4194 --- pandora_console/include/styles/pandora_green_old.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/pandora_green_old.css b/pandora_console/include/styles/pandora_green_old.css index 239ecee786..a9fbdf7f80 100644 --- a/pandora_console/include/styles/pandora_green_old.css +++ b/pandora_console/include/styles/pandora_green_old.css @@ -1,7 +1,7 @@ /* Author: The Pandora FMS team -Name: GreenOld theme +Name: Green old theme Description: The default Pandora FMS theme layout // Pandora FMS - http://pandorafms.com @@ -100,6 +100,8 @@ div#foot span { } /* General styles */ + +body, div#page { background: #ecfad6; } From 8242bf34b813c07dd179be5685d01ee2d6289863 Mon Sep 17 00:00:00 2001 From: Alejandro Fraguas Date: Fri, 5 Jul 2019 14:55:22 +0200 Subject: [PATCH 268/460] Revert "Merge branch 'ent-3693-pete-php-pantalla-en-blanco-con-auth-saml' into 'develop'" This reverts merge request !2562 --- pandora_console/general/noaccesssaml.php | 164 ---------------------- pandora_console/include/auth/saml.php | 166 ----------------------- pandora_console/index.php | 11 +- 3 files changed, 3 insertions(+), 338 deletions(-) delete mode 100644 pandora_console/general/noaccesssaml.php delete mode 100755 pandora_console/include/auth/saml.php diff --git a/pandora_console/general/noaccesssaml.php b/pandora_console/general/noaccesssaml.php deleted file mode 100644 index e357e040dc..0000000000 --- a/pandora_console/general/noaccesssaml.php +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - -
    - -
    - images/input_cross.png'> -
    - -
    -
    - -
    - -
    -
    '; - echo __('Please make sure you have SAML authentication properly configured. For more information the error to access this page are recorded in security logs of %s System Database', get_product_name()); - ?> - -
    - -
    - OK -
    -
    -
    - -
    - - - - - diff --git a/pandora_console/include/auth/saml.php b/pandora_console/include/auth/saml.php deleted file mode 100755 index 6ffbc8cf4b..0000000000 --- a/pandora_console/include/auth/saml.php +++ /dev/null @@ -1,166 +0,0 @@ -requireAuth(); - $session = SimpleSAML_Session::getSessionFromRequest(); - $session->cleanup(); - $attributes = $as->getAttributes(); - - if (empty($attributes)) { - return false; - } - - $id_user = $attributes[SAML_MAIL_IN_PANDORA][0]; - $email = $attributes[SAML_MAIL_IN_PANDORA][0]; - $group_name = $attributes[SAML_GROUP_IN_PANDORA][0]; - $profiles_and_tags = $attributes[SAML_ROLE_AND_TAG]; - - $profile_names = []; - $tag_names = []; - // Manages array with tags and roles to separate them - foreach ($profiles_and_tags as $profile_or_tag) { - $is_profile_or_tag = explode(SAML_DEFAULT_PROFILES_AND_TAGS_FORM, $profile_or_tag); - $is_profile_or_tag2 = explode(':', $is_profile_or_tag[1]); - if ($is_profile_or_tag2[0] == 'role') { - $profile_names[] = $is_profile_or_tag2[1]; - } else if ($is_profile_or_tag2[0] == 'tag') { - $tag_names[] = $is_profile_or_tag2[1]; - } - } - - // Connect to Pandora db - $connection = mysql_connect_db( - $config['pandora_server'], - $config['pandora_dbname'], - $config['pandora_user'], - $config['pandora_pass'] - ); - - if ($connection === false) { - return false; - } - - // Get the red.es user id - $rows = db_get_all_rows_sql( - "SELECT * FROM tusuario - WHERE id_user = '".$id_user."'", - false, - false, - $connection - ); - - // Checks group id, profiles id and tags id - $group_id = ''; - $profile_id = []; - $tag_id = ''; - $tags_to_profile = ''; - if ($group_name != '') { - $group_id = db_get_all_rows_sql("SELECT id_grupo FROM tgrupo WHERE nombre = '".$group_name."'"); - $group_id = $group_id[0]['id_grupo']; - if (empty($group_id)) { - $config['auth_error'] = 'Group not found in database'; - db_pandora_audit('Logon Failed', 'Group '.$group_name.' not found in database', $_SERVER['REMOTE_ADDR']); - return false; - } - } - - if (!empty($profile_names)) { - foreach ($profile_names as $profile_name) { - $profile_id[] = db_get_row_sql("SELECT id_perfil FROM tperfil WHERE name = '".io_safe_input($profile_name)."'"); - } - } - - if (!empty($tag_names)) { - $i = 0; - foreach ($tag_names as $tag_name) { - $tag_id = db_get_row_sql("SELECT id_tag FROM ttag WHERE name = '".io_safe_input($tag_name)."'"); - if ($i == 0) { - $tags_to_profile = (String) $tag_id['id_tag']; - } else { - $tags_to_profile .= ','.(String) $tag_id['id_tag']; - } - - $i++; - } - } - - // If user does not exist in Pandora - if (empty($rows)) { - if ($id_user != '') { - $values_user = []; - $values_user['id_user'] = $id_user; - $values_user['email'] = $email; - $result_insert_user = db_process_sql_insert('tusuario', $values_user); - - // Separates user insert of profile insert - $values_user_profile = []; - $values_user_profile['id_usuario'] = $id_user; - $values_user_profile['id_grupo'] = $group_id; - $values_user_profile['tags'] = $tags_to_profile; - foreach ($profile_id as $id) { - $values_user_profile['id_perfil'] = $id['id_perfil']; - $result_insert_user_profile = db_process_sql_insert('tusuario_perfil', $values_user_profile); - } - - if (!$result_insert_user_profile) { - $config['auth_error'] = 'Login error'; - return false; - } - - return $id_user; - } else { - return false; - } - } else { - $user = $rows[0]; - // To update the profiles, delete the old and insert the new - $have_profiles = db_get_all_rows_sql("SELECT id_up FROM tusuario_perfil WHERE id_usuario = '".$user['id_user']."'"); - if ($have_profiles) { - $delete_old_profiles = db_process_sql("DELETE FROM tusuario_perfil WHERE id_usuario = '".$user['id_user']."'"); - } - - $values_user_profile = []; - $values_user_profile['id_usuario'] = $user['id_user']; - $values_user_profile['id_grupo'] = $group_id; - $values_user_profile['tags'] = $tags_to_profile; - foreach ($profile_id as $id) { - $values_user_profile['id_perfil'] = $id['id_perfil']; - $result_insert_user_profile = db_process_sql_insert('tusuario_perfil', $values_user_profile); - } - - return $user['id_user']; - } - - $config['auth_error'] = 'User not found in database or incorrect password'; - - return false; -} diff --git a/pandora_console/index.php b/pandora_console/index.php index a543829bb7..3c95074171 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -359,17 +359,12 @@ if (! isset($config['id_user'])) { $nick_in_db = $_SESSION['prepared_login_da']['id_user']; $expired_pass = false; } else if (($config['auth'] == 'saml') && ($login_button_saml)) { - if (!include_once 'include/auth/saml.php') { - include_once 'general/noaccesssaml.php'; - } else { - $saml_user_id = saml_process_user_login(); - } + include_once ENTERPRISE_DIR.'/include/auth/saml.php'; + + $saml_user_id = saml_process_user_login(); $nick_in_db = $saml_user_id; - if (!$nick_in_db) { - include_once 'general/noaccesssaml.php'; - include_once $config['saml_path'].'simplesamlphp/lib/_autoload.php'; $as = new SimpleSAML_Auth_Simple('PandoraFMS'); $as->logout(); From d0f3a6bc0b9418c16efe8567392a81906a488b56 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 6 Jul 2019 00:01:19 +0200 Subject: [PATCH 269/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 531a41e5b3..9fb3888b56 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190705 +Version: 7.0NG.736-190706 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 98fdaa992f..0db060be9d 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190705" +pandora_version="7.0NG.736-190706" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 1e03cfa248..b995494f84 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190705'; +use constant AGENT_BUILD => '190706'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 1e03c24394..341958f85b 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190705 +%define release 190706 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index ac8a594450..b16873ba8e 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190705 +%define release 190706 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 1fc0ed921c..a460425043 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190705" +PI_BUILD="190706" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 32836deca7..4fd63586fb 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190705} +{190706} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 02d9a63209..49771beaf4 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190705)") +#define PANDORA_VERSION ("7.0NG.736(Build 190706)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 8ecffd52ee..756617327c 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190705))" + VALUE "ProductVersion", "(7.0NG.736(Build 190706))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 5e6512722a..6a48453fd6 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190705 +Version: 7.0NG.736-190706 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index d6f3b6da50..1d03b25f1e 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190705" +pandora_version="7.0NG.736-190706" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 62812d314c..a6c55e0755 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190705'; +$build_version = 'PC190706'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 00e176f42c..f485cb3000 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index b2e81b4c72..850f36ace4 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190705 +%define release 190706 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index a31db9b0c4..930f8a681c 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190705 +%define release 190706 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 39391e9339..e30946b9ac 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190705" +PI_BUILD="190706" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index fa0822b985..48f2961049 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190705"; +my $version = "7.0NG.736 PS190706"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index be30e449dc..3142d7a0d9 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190705"; +my $version = "7.0NG.736 PS190706"; # save program name for logging my $progname = basename($0); From 90497410c75182d01021607f7f9fa426c25f2bfb Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 7 Jul 2019 00:01:07 +0200 Subject: [PATCH 270/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 9fb3888b56..c701f2c1d8 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190706 +Version: 7.0NG.736-190707 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 0db060be9d..9a728d043f 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190706" +pandora_version="7.0NG.736-190707" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index b995494f84..e0b5740813 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190706'; +use constant AGENT_BUILD => '190707'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 341958f85b..4551d4f7ad 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190706 +%define release 190707 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index b16873ba8e..d32371885f 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190706 +%define release 190707 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index a460425043..85834b9b10 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190706" +PI_BUILD="190707" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 4fd63586fb..a4faf508be 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190706} +{190707} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 49771beaf4..ae897511c6 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190706)") +#define PANDORA_VERSION ("7.0NG.736(Build 190707)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 756617327c..41ccc44a4d 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190706))" + VALUE "ProductVersion", "(7.0NG.736(Build 190707))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 6a48453fd6..d3d25c2b86 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190706 +Version: 7.0NG.736-190707 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 1d03b25f1e..352bd78c5b 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190706" +pandora_version="7.0NG.736-190707" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index a6c55e0755..ea494ea2cf 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190706'; +$build_version = 'PC190707'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index f485cb3000..ec9f8406d9 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 850f36ace4..22fe1af31e 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190706 +%define release 190707 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 930f8a681c..5cbc0ddc69 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190706 +%define release 190707 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index e30946b9ac..e61d88feae 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190706" +PI_BUILD="190707" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 48f2961049..e1b88ef2aa 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190706"; +my $version = "7.0NG.736 PS190707"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 3142d7a0d9..11a293b4eb 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190706"; +my $version = "7.0NG.736 PS190707"; # save program name for logging my $progname = basename($0); From 034181037dff514a7de7c97bbf84237aeda52ba1 Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 8 Jul 2019 00:01:17 +0200 Subject: [PATCH 271/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index c701f2c1d8..02a7bdab5f 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190707 +Version: 7.0NG.736-190708 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 9a728d043f..cc8929763d 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190707" +pandora_version="7.0NG.736-190708" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index e0b5740813..399559f00b 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190707'; +use constant AGENT_BUILD => '190708'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 4551d4f7ad..977af1104f 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190707 +%define release 190708 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index d32371885f..84eac835d9 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190707 +%define release 190708 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 85834b9b10..02c3728350 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190707" +PI_BUILD="190708" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index a4faf508be..ce66038ef5 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190707} +{190708} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index ae897511c6..41ae8eb267 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190707)") +#define PANDORA_VERSION ("7.0NG.736(Build 190708)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 41ccc44a4d..696d6c34e3 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190707))" + VALUE "ProductVersion", "(7.0NG.736(Build 190708))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index d3d25c2b86..062c14afdc 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190707 +Version: 7.0NG.736-190708 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 352bd78c5b..56d98823ac 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190707" +pandora_version="7.0NG.736-190708" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index ea494ea2cf..3adcf1f113 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190707'; +$build_version = 'PC190708'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index ec9f8406d9..e22cf98add 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 22fe1af31e..9eca22a68f 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190707 +%define release 190708 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 5cbc0ddc69..92935fbd0d 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190707 +%define release 190708 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index e61d88feae..1ddc84c2c9 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190707" +PI_BUILD="190708" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index e1b88ef2aa..f4c3a443df 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190707"; +my $version = "7.0NG.736 PS190708"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 11a293b4eb..cf5bf608e3 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190707"; +my $version = "7.0NG.736 PS190708"; # save program name for logging my $progname = basename($0); From b6d551d5837be53af4a829282abe7f8ac79d9867 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Mon, 8 Jul 2019 10:08:04 +0200 Subject: [PATCH 272/460] Changed images with white background - #4194 --- .../images/wizard/netscan_green.png | Bin 15485 -> 3424 bytes .../include/styles/pandora_black.css | 143 +++++++++--------- 2 files changed, 71 insertions(+), 72 deletions(-) diff --git a/pandora_console/images/wizard/netscan_green.png b/pandora_console/images/wizard/netscan_green.png index faeae9b04208888f9b7fdb70a185494bf45cd862..c602e96ac58a079b2154a8f044b5ac1c1527361a 100644 GIT binary patch literal 3424 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 tbody > tr > th, -.info_table > thead > tr > th, -.info_table > thead > tr > th a, -.info_table > thead > tr > th > span, -form.discovery label, -.edit_user_labels, -.input_label, -.pagination, -tr.group_view_data, -.group_view_data { - color: #fff; -} - -/* Overwrite inline styles */ -.textodialogo td { - color: #fff !important; -} - -/* snmp */ -#snmp_browser { - background-color: #222 !important; -} - -/* General styles */ .box-shadow { box-shadow: none; } @@ -130,6 +88,76 @@ textarea:disabled { filter: brightness(2.5) contrast(3.5); } +/* White text */ +a, +#menu_tab_left li a, +#menu_tab_left li span, +fieldset legend, +.tactical_set legend, +#user-notifications-wrappe, +#user_form *, +h1, +h2, +h3, +h4, +.info_table > tbody > tr > th, +.info_table > thead > tr > th, +.info_table > thead > tr > th a, +.info_table > thead > tr > th > span, +form.discovery label, +.edit_user_labels, +.input_label, +.pagination, +tr.group_view_data, +.group_view_data { + color: #fff; +} + +/* Tabs icons change color */ +#menu_tab li.nomn img, +#menu_tab li img { + filter: invert(100%); +} + +/* menu.css */ +.operation { + background-color: #252525; +} + +.godmode, +#menu_full { + background-color: #1a1a1a; +} + +.button_collapse { + background-color: #444; +} + +.operation .selected, +.godmode .selected, +.menu_icon:hover { + background-color: #080808; +} + +.sub_subMenu { + background-color: #343434; +} + +/* footer */ +div#foot { + background: #222; +} + +/* Overwrite inline styles */ +.textodialogo td { + color: #fff !important; +} + +/* snmp */ +#snmp_browser { + background-color: #222 !important; +} + /* events.css */ table.table_modal_alternate tr:nth-child(odd) td { background-color: #222; @@ -252,35 +280,6 @@ table#diagnostic_info tbody td div { filter: brightness(2.5); } -/* menu.css */ -.operation { - background-color: #252525; -} - -.godmode, -#menu_full { - background-color: #1a1a1a; -} - -.button_collapse { - background-color: #444; -} - -.operation .selected, -.godmode .selected, -.menu_icon:hover { - background-color: #080808; -} - -.sub_subMenu { - background-color: #343434; -} - -/* footer */ -div#foot { - background: #222; -} - /* jquery custom */ .ui-dialog, .ui-widget-content { From 8ea9b673264fead2bb266fb34febd065774c36a0 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Mon, 8 Jul 2019 10:20:43 +0200 Subject: [PATCH 273/460] fixed graph in mobile view metaconsole --- .../mobile/operation/module_graph.php | 35 +++++++++++++++++-- pandora_console/mobile/operation/modules.php | 16 ++++++++- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/pandora_console/mobile/operation/module_graph.php b/pandora_console/mobile/operation/module_graph.php index 3a6668b0bc..2d057fb8fb 100644 --- a/pandora_console/mobile/operation/module_graph.php +++ b/pandora_console/mobile/operation/module_graph.php @@ -47,6 +47,8 @@ class ModuleGraph private $module = null; + private $server_id = ''; + function __construct() { @@ -68,6 +70,8 @@ class ModuleGraph $this->id = (int) $system->getRequest('id', 0); $this->id_agent = (int) $system->getRequest('id_agent', 0); + $this->server_id = $system->getRequest('server_id', ''); + $this->module = modules_get_agentmodule($this->id); $this->graph_type = return_graphtype($this->module['id_tipo_modulo']); @@ -124,6 +128,16 @@ class ModuleGraph switch ($parameter2) { case 'get_graph': $this->getFilters(); + if ($system->getConfig('metaconsole')) { + $server_data = metaconsole_get_connection_by_id( + $this->server_id + ); + // Establishes connection. + if (metaconsole_load_external_db($server_data) !== NOERR) { + return false; + } + } + $correct = 0; $graph = ''; $correct = 1; @@ -197,6 +211,10 @@ class ModuleGraph break; } + if ($system->getConfig('metaconsole')) { + metaconsole_restore_db(); + } + $graph = ob_get_clean().$graph; echo json_encode(['correct' => $correct, 'graph' => $graph]); @@ -252,7 +270,7 @@ class ModuleGraph - $(".ui-collapsible").height() - 55; var width = $(document).width() - 25; - ajax_get_graph($("#id_module").val(), heigth, width); + ajax_get_graph($("#id_module").val(), heigth, width, $("#server_id").val()); } load_graph(); @@ -264,7 +282,7 @@ class ModuleGraph }); }); - function ajax_get_graph(id, heigth_graph, width_graph) { + function ajax_get_graph(id, heigth_graph, width_graph, server_id) { postvars = {}; postvars["action"] = "ajax"; postvars["parameter1"] = "module_graph"; @@ -284,6 +302,8 @@ class ModuleGraph postvars["id"] = id; + postvars["server_id"] = server_id; + $.ajax ({ type: "POST", url: "index.php", @@ -360,9 +380,18 @@ class ModuleGraph ] ) ); + $ui->contentAddHtml( + $ui->getInput( + [ + 'id' => 'server_id', + 'value' => $this->server_id, + 'type' => 'hidden', + ] + ) + ); $title = sprintf(__('Options for %s : %s'), $agent_alias, $this->module['nombre']); $ui->contentBeginCollapsible($title); - $ui->beginForm('index.php?page=module_graph&id='.$this->id); + $ui->beginForm('index.php?page=module_graph&id='.$this->id.'&server_id='.$this->server_id); $options = [ 'name' => 'draw_alerts', 'value' => 1, diff --git a/pandora_console/mobile/operation/modules.php b/pandora_console/mobile/operation/modules.php index 8b9bd18804..5b32c358ad 100644 --- a/pandora_console/mobile/operation/modules.php +++ b/pandora_console/mobile/operation/modules.php @@ -485,6 +485,8 @@ class Modules $temp_modules = db_get_all_rows_sql($sql_select.$sql.$sql_limit); foreach ($temp_modules as $result_element_key => $result_element_value) { + $result_element_value['server_id'] = $server['id']; + $result_element_value['server_name'] = $server['server_name']; array_push($modules_db, $result_element_value); } @@ -684,7 +686,19 @@ class Modules $row[7] = ui_get_snapshot_image($link, $is_snapshot).'  '; } else { - $row[7] = $row[__('Data')] = ''.''.''.$output.''.''; + if ($system->getConfig('metaconsole')) { + $row[__('Data')] = ''; + $row[__('Data')] .= ''; + $row[__('Data')] .= 'id_agent.'">'; + $row[__('Data')] .= $output.''; + $row[7] = $row[__('Data')]; + } else { + $row[7] = $row[__('Data')] = ''.''.''.$output.''.''; + } } if (!$ajax) { From 0cccafc7bed19abcb209e0505d4266562769ff4d Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Mon, 8 Jul 2019 10:37:34 +0200 Subject: [PATCH 274/460] Heartbeat gifs with black background - #4194 --- .../images/heartbeat_green_black.gif | Bin 0 -> 18665 bytes pandora_console/images/heartbeat_red_black.gif | Bin 0 -> 16734 bytes pandora_console/include/functions_agents.php | 15 +++++++++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 pandora_console/images/heartbeat_green_black.gif create mode 100644 pandora_console/images/heartbeat_red_black.gif diff --git a/pandora_console/images/heartbeat_green_black.gif b/pandora_console/images/heartbeat_green_black.gif new file mode 100644 index 0000000000000000000000000000000000000000..b365cade3f406e3492b7cd532805da83f862cdbd GIT binary patch literal 18665 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 '170', @@ -3399,7 +3410,7 @@ function agents_get_status_animation($up=true) case false: return html_print_image( - 'images/heartbeat_red.gif', + $heartbeat_red, true, [ 'width' => '170', From f444f639bd02c118d28f71b74c97104d1d02294f Mon Sep 17 00:00:00 2001 From: Kike Date: Mon, 8 Jul 2019 12:17:48 +0200 Subject: [PATCH 275/460] New SMPP client --- pandora_server/util/pandora_smpp.pl | 152 ++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100755 pandora_server/util/pandora_smpp.pl diff --git a/pandora_server/util/pandora_smpp.pl b/pandora_server/util/pandora_smpp.pl new file mode 100755 index 0000000000..af85d496f5 --- /dev/null +++ b/pandora_server/util/pandora_smpp.pl @@ -0,0 +1,152 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use Net::SMPP; + +use lib '/usr/lib/perl5'; +use PandoraFMS::PluginTools qw(read_configuration); + +my $HELP =< -user -password -source -destination -message [OPTIONS] + +- Comma separated list of destination numbers (+123456789,+234567891,...) + +OPTIONS: + +-service_type Default: '' +-source_addr_ton Default: 0x00 +-source_addr_npi Default: 0x00 +-dest_addr_ton Default: 0x00 +-dest_addr_npi Default: 0x00 +-esm_class Default: 0x00 +-protocol_id Default: 0x00 +-priority_flag Default: 0x00 +-schedule_delivery_time Default: '' +-validity_period Default: '' +-registered_delivery Default: 0x00 +-replace_if_present_flag Default: 0x00 +-data_coding Default: 0x00 +-sm_default_msg_id Default: 0x00 +-system_type Default: '' +-interface_version Default: 0x34 +-addr_ton Default: 0x00 +-addr_npi Default: 0x00 +-address_range Default: '' + +Example: + +$0 -server 192.168.1.50:2775 -user myuser -password mypassword -source +123456789 -destination +234567891 -message "Content of SMS message" + +EO_H + +my $config; +$config = read_configuration($config); + +if (!$config->{'server'}){ + print "Parameter -server is mandatory."; + print $HELP; + exit; +} +if (!$config->{'user'}){ + print "Parameter -user is mandatory."; + print $HELP; + exit; +} +if (!$config->{'password'}){ + print "Parameter -password is mandatory."; + print $HELP; + exit; +} +if (!$config->{'source'}){ + print "Parameter -source is mandatory."; + print $HELP; + exit; +} +if (!$config->{'destination'}){ + print "Parameter -destination is mandatory."; + print $HELP; + exit; +} +if (!$config->{'message'}){ + print "Parameter -message is mandatory."; + print $HELP; + exit; +} + +my ($smsc_server, $smsc_port) = split /:/, $config->{'server'}; + +my @destination_numbers = $config->{'destination'}; + +if (!$smsc_port){ + $smsc_port = 2775; +} + +$config->{'service_type'} = '' if (!$config->{'service_type'}); +$config->{'source_addr_ton'} = '0x00' if (!$config->{'source_addr_ton'}); +$config->{'source_addr_npi'} = '0x00' if (!$config->{'source_addr_npi'}); +$config->{'dest_addr_ton'} = '0x00' if (!$config->{'dest_addr_ton'}); +$config->{'dest_addr_npi'} = '0x00' if (!$config->{'dest_addr_npi'}); +$config->{'esm_class'} = '0x00' if (!$config->{'esm_class'}); +$config->{'protocol_id'} = '0x00' if (!$config->{'protocol_id'}); +$config->{'priority_flag'} = '0x00' if (!$config->{'priority_flag'}); +$config->{'schedule_delivery_time'} = '' if (!$config->{'schedule_delivery_time'}); +$config->{'validity_period'} = '' if (!$config->{'validity_period'}); +$config->{'registered_delivery'} = '0x00' if (!$config->{'registered_delivery'}); +$config->{'replace_if_present_flag'} = '0x00' if (!$config->{'replace_if_present_flag'}); +$config->{'data_coding'} = '0x00' if (!$config->{'data_coding'}); +$config->{'sm_default_msg_id'} = '0x00' if (!$config->{'sm_default_msg_id'}); +$config->{'system_type'} = '' if (!$config->{'system_type'}); +$config->{'interface_version'} = '0x34' if (!$config->{'interface_version'}); +$config->{'addr_ton'} = '0x00' if (!$config->{'addr_ton'}); +$config->{'addr_npi'} = '0x00' if (!$config->{'addr_npi'}); +$config->{'address_range'} = '' if (!$config->{'address_range'}); + +my $smpp = Net::SMPP->new_transmitter( + $smsc_server, + port => $smsc_port, + system_id => $config->{'user'}, + password => $config->{'password'}, + system_type => $config->{'system_type'}, + interface_version => $config->{'interface_version'}, + addr_ton => $config->{'addr_ton'}, + addr_npi => $config->{'addr_npi'}, + address_range => $config->{'address_range'} +) or die "Unable to connect to [$smsc_server] on port [$smsc_port] with user [" . $config->{'user'} . "]\n"; + +foreach my $destination_number (@destination_numbers){ + my $resp_pdu = $smpp->submit_sm( + source_addr => $config->{'source'}, + destination_addr => $destination_number, + short_message => $config->{'message'}, + service_type => $config->{'service_type'}, + source_addr_ton => $config->{'source_addr_ton'}, + source_addr_npi => $config->{'source_addr_npi'}, + dest_addr_ton => $config->{'dest_addr_ton'}, + dest_addr_npi => $config->{'dest_addr_npi'}, + esm_class => $config->{'esm_class'}, + protocol_id => $config->{'protocol_id'}, + priority_flag => $config->{'priority_flag'}, + schedule_delivery_time => $config->{'schedule_delivery_time'}, + validity_period => $config->{'validity_period'}, + registered_delivery => $config->{'registered_delivery'}, + replace_if_present_flag => $config->{'replace_if_present_flag'}, + data_coding => $config->{'data_coding'}, + sm_default_msg_id => $config->{'sm_default_msg_id'} + ); + + if ($resp_pdu->{message_id}){ + print "SUCCESS: Message sent to [$destination_number]\n"; + }else{ + print "ERROR: Unable to send message to [$destination_number] - Response error: " . $resp_pdu->explain_status() . "\n"; + } +} \ No newline at end of file From 58cb113d400964ead195719e4f0f968b61ec2222 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Mon, 8 Jul 2019 13:23:35 +0200 Subject: [PATCH 276/460] fixed error in pdf --- pandora_console/include/functions_graph.php | 2 +- pandora_console/include/graphs/flot/pandora.flot.js | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 72bc9b5c91..d04c2049a0 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -2161,7 +2161,7 @@ function graphic_combined_module( $graph_values = $temp; if (!$params['vconsole']) { - $width = 1024; + $width = $width; $height = 500; } diff --git a/pandora_console/include/graphs/flot/pandora.flot.js b/pandora_console/include/graphs/flot/pandora.flot.js index f7af997508..f0976cb98f 100644 --- a/pandora_console/include/graphs/flot/pandora.flot.js +++ b/pandora_console/include/graphs/flot/pandora.flot.js @@ -2791,14 +2791,16 @@ function pandoraFlotArea( if (short_data) { formatted = number_format(v, force_integer, "", short_data); } else { - // It is an integer + // It is an integer. if (v - Math.floor(v) == 0) { formatted = number_format(v, force_integer, "", 2); } } - // Get only two decimals - formatted = round_with_decimals(formatted, 100); + // Get only two decimals. + if (typeof formatted != "string") { + formatted = Math.round(formatted * 100) / 100; + } return formatted; } From b70c904ec3cb79dd31e9fa723d24099e1e04becd Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Mon, 8 Jul 2019 13:40:52 +0200 Subject: [PATCH 277/460] fixed minor error network components --- pandora_console/include/javascript/pandora_modules.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/javascript/pandora_modules.js b/pandora_console/include/javascript/pandora_modules.js index 1d5c804289..2795df7bdb 100644 --- a/pandora_console/include/javascript/pandora_modules.js +++ b/pandora_console/include/javascript/pandora_modules.js @@ -536,7 +536,7 @@ function configure_modules_form() { var obj = jQuery.parseJSON(data["macros"]); $.each(obj, function(k, macro) { - add_macro_field(macro, "simple-macro"); + add_macro_field(macro, "simple-macro", "td"); }); } From d5362c1d5dfe04abe5a85fc95d79dd2b175c138d Mon Sep 17 00:00:00 2001 From: alejandro-campos Date: Mon, 8 Jul 2019 16:07:22 +0200 Subject: [PATCH 278/460] fix bug: label macros not being replaced in view report --- .../include/functions_reporting.php | 779 +++++++++--------- 1 file changed, 399 insertions(+), 380 deletions(-) diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 46359c1471..aac7e2104d 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -190,13 +190,13 @@ function reporting_make_reporting_data( ); $sql_tags_join = 'INNER JOIN tagente ON tagente.id_agente = t1.id_agente - INNER JOIN ttag_module ON ttag_module.id_agente_modulo = t1.id_agente_modulo - LEFT JOIN tagent_secondary_group tasg ON tagente.id_agente = tasg.id_agent'; + INNER JOIN ttag_module ON ttag_module.id_agente_modulo = t1.id_agente_modulo + LEFT JOIN tagent_secondary_group tasg ON tagente.id_agente = tasg.id_agent'; $sql = sprintf( 'SELECT count(*) FROM tagente_modulo t1 - %s WHERE t1.delete_pending = 0 AND t1.id_agente_modulo = '.$content['id_agent_module'].' - AND t1.id_agente = '.$content['id_agent'].' %s', + %s WHERE t1.delete_pending = 0 AND t1.id_agente_modulo = '.$content['id_agent_module'].' + AND t1.id_agente = '.$content['id_agent'].' %s', $sql_tags_join, $where_tags ); @@ -284,6 +284,25 @@ function reporting_make_reporting_data( if (!metaconsole_load_external_db($connection)) { continue; } + + $items_label['agent_description'] = agents_get_description($content['id_agent']); + $items_label['agent_group'] = agents_get_agent_group($content['id_agent']); + $items_label['agent_address'] = agents_get_address($content['id_agent']); + + $modules = agents_get_modules( + $agent_value, + [ + 'id_agente_modulo', + 'nombre', + 'descripcion', + ], + [ + 'id_agente_modulo' => $content['id_agent_module'], + ] + ); + + $items_label['module_name'] = $modules[$content['id_agent_module']]['nombre']; + $items_label['module_description'] = $modules[$content['id_agent_module']]['descripcion']; } if (is_array($content['id_agent']) && count($content['id_agent']) != 1) { @@ -294,12 +313,12 @@ function reporting_make_reporting_data( $content['style']['name_label'] = str_replace('_module_', count($content['id_agent_module']).__(' modules'), $content['style']['name_label']); } - $content['name'] = reporting_label_macro($items_label, $content['style']['name_label']); - if ($metaconsole_on) { // Restore db connection. metaconsole_restore_db(); } + + $content['name'] = reporting_label_macro($items_label, $content['style']['name_label']); } switch (reporting_get_type($content)) { @@ -1359,8 +1378,8 @@ function reporting_event_top_n( // Get all the related data. $sql = sprintf( 'SELECT id_agent_module, server_name - FROM treport_content_item - WHERE id_report_content = %d', + FROM treport_content_item + WHERE id_report_content = %d', $content['id_rc'] ); @@ -2323,9 +2342,9 @@ function reporting_exception( // Get all the related data. $sql = sprintf( ' - SELECT id_agent_module, server_name, operation - FROM treport_content_item - WHERE id_report_content = %d', + SELECT id_agent_module, server_name, operation + FROM treport_content_item + WHERE id_report_content = %d', $content['id_rc'] ); @@ -3091,10 +3110,10 @@ function reporting_database_serialized($report, $content) // This query gets information from the default and the historic database $result = db_get_all_rows_sql( 'SELECT * - FROM tagente_datos - WHERE id_agente_modulo = '.$content['id_agent_module'].' - AND utimestamp > '.$datelimit.' - AND utimestamp <= '.$report['datetime'], + FROM tagente_datos + WHERE id_agente_modulo = '.$content['id_agent_module'].' + AND utimestamp > '.$datelimit.' + AND utimestamp <= '.$report['datetime'], $search_in_history_db ); @@ -3103,10 +3122,10 @@ function reporting_database_serialized($report, $content) // This query gets information from the default and the historic database $result = db_get_all_rows_sql( 'SELECT * - FROM tagente_datos_string - WHERE id_agente_modulo = '.$content['id_agent_module'].' - AND utimestamp > '.$datelimit.' - AND utimestamp <= '.$report['datetime'], + FROM tagente_datos_string + WHERE id_agente_modulo = '.$content['id_agent_module'].' + AND utimestamp > '.$datelimit.' + AND utimestamp <= '.$report['datetime'], $search_in_history_db ); } @@ -3211,9 +3230,9 @@ function reporting_group_configuration($report, $content) } } else { $sql = ' - SELECT * - FROM tagente - WHERE id_grupo='.$content['id_group']; + SELECT * + FROM tagente + WHERE id_grupo='.$content['id_group']; } $agents_list = db_get_all_rows_sql($sql); @@ -3472,25 +3491,25 @@ function reporting_alert_report_group($report, $content) if ($content['id_group'] == 0) { $agent_modules = db_get_all_rows_sql( ' - SELECT distinct(id_agent_module) - FROM talert_template_modules - WHERE disabled = 0 - AND id_agent_module IN ( - SELECT id_agente_modulo - FROM tagente_modulo)' + SELECT distinct(id_agent_module) + FROM talert_template_modules + WHERE disabled = 0 + AND id_agent_module IN ( + SELECT id_agente_modulo + FROM tagente_modulo)' ); } else { $agent_modules = db_get_all_rows_sql( ' - SELECT distinct(id_agent_module) - FROM talert_template_modules - WHERE disabled = 0 - AND id_agent_module IN ( - SELECT id_agente_modulo - FROM tagente_modulo - WHERE id_agente IN ( - SELECT id_agente - FROM tagente WHERE id_grupo = '.$content['id_group'].'))' + SELECT distinct(id_agent_module) + FROM talert_template_modules + WHERE disabled = 0 + AND id_agent_module IN ( + SELECT id_agente_modulo + FROM tagente_modulo + WHERE id_agente IN ( + SELECT id_agente + FROM tagente WHERE id_grupo = '.$content['id_group'].'))' ); } @@ -4109,8 +4128,8 @@ function reporting_netflow( // Get item filters. $filter = db_get_row_sql( "SELECT * - FROM tnetflow_filter - WHERE id_sg = '".(int) $content['text']."'", + FROM tnetflow_filter + WHERE id_sg = '".(int) $content['text']."'", false, true ); @@ -4294,9 +4313,9 @@ function reporting_agent_configuration($report, $content) } $sql = ' - SELECT * - FROM tagente - WHERE id_agente='.$content['id_agent']; + SELECT * + FROM tagente + WHERE id_agente='.$content['id_agent']; $agent_data = db_get_row_sql($sql); $agent_configuration = []; @@ -4316,9 +4335,9 @@ function reporting_agent_configuration($report, $content) if (!empty($modules)) { foreach ($modules as $id_agent_module => $module) { $sql = " - SELECT * - FROM tagente_modulo - WHERE id_agente_modulo = $id_agent_module"; + SELECT * + FROM tagente_modulo + WHERE id_agente_modulo = $id_agent_module"; $module_db = db_get_row_sql($sql); $data_module = []; @@ -4364,12 +4383,12 @@ function reporting_agent_configuration($report, $content) $data_module['status_icon'] = ui_print_status_image($status, $title, true); $data_module['status'] = $title; $sql_tag = " - SELECT name - FROM ttag - WHERE id_tag IN ( - SELECT id_tag - FROM ttag_module - WHERE id_agente_modulo = $id_agent_module)"; + SELECT name + FROM ttag + WHERE id_tag IN ( + SELECT id_tag + FROM ttag_module + WHERE id_agente_modulo = $id_agent_module)"; $tags = db_get_all_rows_sql($sql_tag); if ($tags === false) { $data_module['tags'] = []; @@ -4537,41 +4556,41 @@ function reporting_value($report, $content, $type, $pdf=false) } } else { $value = ' - - - - - + + - - + + - - - + + +
    '; + + + - - + + - - - + + + + +
    '; if ($content['visual_format'] == 1 || $content['visual_format'] == 2 || $content['visual_format'] == 3) { $value .= ' - - - - - - - - - - -
    - '.__('Agent').' - - '.__('Module').' - - '.__('Maximum').' -
    - '.$agent_name.' - - '.$module_name.' - - '.format_for_graph(reporting_get_agentmodule_data_max($content['id_agent_module'], $content['period'], $report['datetime']), $config['graph_precision']).' '.$unit.' -
    '; + + + + + + + + + + +
    + '.__('Agent').' + + '.__('Module').' + + '.__('Maximum').' +
    + '.$agent_name.' + + '.$module_name.' + + '.format_for_graph(reporting_get_agentmodule_data_max($content['id_agent_module'], $content['period'], $report['datetime']), $config['graph_precision']).' '.$unit.' +
    '; } $value .= ' -
    - '; + + '; if ($content['visual_format'] == 2 || $content['visual_format'] == 3) { $params['force_interval'] = 'max_only'; @@ -4580,23 +4599,23 @@ function reporting_value($report, $content, $type, $pdf=false) $value .= ' -
    '; +
    '; if ($content['visual_format'] == 1 || $content['visual_format'] == 3) { $value .= ' - - - - - - '; +
    - '.__('Lapse').' - - '.__('Maximum').' -
    + + + + + '; $time_begin = db_get_row_sql('select utimestamp from tagente_datos where id_agente_modulo ='.$content['id_agent_module'], true); $date_reference = getdate(); @@ -4670,16 +4689,16 @@ function reporting_value($report, $content, $type, $pdf=false) - -
    + '.__('Lapse').' + + '.__('Maximum').' +
    '.format_for_graph(reporting_get_agentmodule_data_min($content['id_agent_module'], $content['period'], $report['datetime']), $config['graph_precision']).' '.$unit.' -
    '; +
    '; } $value .= ' -
    - '; + + '; if ($content['visual_format'] == 2 || $content['visual_format'] == 3) { $params['force_interval'] = 'min_only'; @@ -4694,16 +4713,16 @@ function reporting_value($report, $content, $type, $pdf=false) if ($content['visual_format'] == 1 || $content['visual_format'] == 3) { $value .= ' - - - - - - '; +
    - '.__('Lapse').' - - '.__('Minimum').' -
    + + + + + '; $time_begin = db_get_row_sql('select utimestamp from tagente_datos where id_agente_modulo ='.$content['id_agent_module']); $date_reference = getdate(); @@ -4728,7 +4747,7 @@ function reporting_value($report, $content, $type, $pdf=false) } $value .= ' - +
    + '.__('Lapse').' + + '.__('Minimum').' +
    '; @@ -4757,60 +4776,60 @@ function reporting_value($report, $content, $type, $pdf=false) if ($content['visual_format'] == 1 || $content['visual_format'] == 2 || $content['visual_format'] == 3) { $value .= ' - - - - - - - - - - -
    - '.__('Agent').' - - '.__('Module').' - - '.__('Average').' -
    - '.$agent_name.' - - '.$module_name.' - - '.format_for_graph(reporting_get_agentmodule_data_average($content['id_agent_module'], $content['period'], $report['datetime']), $config['graph_precision']).' '.$unit.' -
    '; + + + + + + + + + + +
    + '.__('Agent').' + + '.__('Module').' + + '.__('Average').' +
    + '.$agent_name.' + + '.$module_name.' + + '.format_for_graph(reporting_get_agentmodule_data_average($content['id_agent_module'], $content['period'], $report['datetime']), $config['graph_precision']).' '.$unit.' +
    '; } $value .= ' -
    - '; + + '; if ($content['visual_format'] == 2 || $content['visual_format'] == 3) { $params['force_interval'] = 'avg_only'; $value .= grafico_modulo_sparse($params); } $value .= ' - -
    '; + +
    '; if ($content['visual_format'] == 1 || $content['visual_format'] == 3) { $value .= ' - - - - - - '; +
    - '.__('Lapse').' - - '.__('Average').' -
    + + + + + '; $time_begin = db_get_row_sql('select utimestamp from tagente_datos where id_agente_modulo ='.$content['id_agent_module']); $date_reference = getdate(); @@ -4835,7 +4854,7 @@ function reporting_value($report, $content, $type, $pdf=false) } $value .= ' - +
    + '.__('Lapse').' + + '.__('Average').' +
    '; @@ -6146,10 +6165,10 @@ function reporting_availability($report, $content, $date=false, $time=false) if (empty($content['subitems'])) { $sql = sprintf( ' - SELECT id_agent_module, - server_name, operation - FROM treport_content_item - WHERE id_report_content = %d', + SELECT id_agent_module, + server_name, operation + FROM treport_content_item + WHERE id_report_content = %d', $content['id_rc'] ); @@ -6823,13 +6842,13 @@ function reporting_increment($report, $content) if (is_metaconsole()) { $sql1 = 'SELECT datos FROM tagente_datos WHERE id_agente_modulo = '.$id_agent_module.' - AND utimestamp <= '.(time() - $period).' ORDER BY utimestamp DESC'; + AND utimestamp <= '.(time() - $period).' ORDER BY utimestamp DESC'; $sql2 = 'SELECT datos FROM tagente_datos WHERE id_agente_modulo = '.$id_agent_module.' ORDER BY utimestamp DESC'; $servers = db_get_all_rows_sql( 'SELECT * - FROM tmetaconsole_setup - WHERE disabled = 0' + FROM tmetaconsole_setup + WHERE disabled = 0' ); if ($servers === false) { @@ -6853,7 +6872,7 @@ function reporting_increment($report, $content) } else { $old_data = db_get_value_sql( 'SELECT datos FROM tagente_datos WHERE id_agente_modulo = '.$id_agent_module.' - AND utimestamp <= '.(time() - $period).' ORDER BY utimestamp DESC' + AND utimestamp <= '.(time() - $period).' ORDER BY utimestamp DESC' ); $last_data = db_get_value_sql('SELECT datos FROM tagente_datos WHERE id_agente_modulo = '.$id_agent_module.' ORDER BY utimestamp DESC'); @@ -7276,8 +7295,8 @@ function reporting_custom_graph( if (is_metaconsole()) { $module_source = db_get_all_rows_sql( 'SELECT id_agent_module, id_server - FROM tgraph_source - WHERE id_graph = '.$content['id_gs'] + FROM tgraph_source + WHERE id_graph = '.$content['id_gs'] ); if (isset($module_source) && is_array($module_source)) { @@ -8015,10 +8034,10 @@ function reporting_get_group_stats($id_group=0, $access='AR') foreach ($id_group as $group) { $group_stat = db_get_all_rows_sql( "SELECT * - FROM tgroup_stat, tgrupo - WHERE tgrupo.id_grupo = tgroup_stat.id_group - AND tgroup_stat.id_group = $group - ORDER BY nombre" + FROM tgroup_stat, tgrupo + WHERE tgrupo.id_grupo = tgroup_stat.id_group + AND tgroup_stat.id_group = $group + ORDER BY nombre" ); $data['monitor_checks'] += $group_stat[0]['modules']; @@ -8246,10 +8265,10 @@ function reporting_get_group_stats_resume($id_group=0, $access='AR') foreach ($id_group as $group) { $group_stat = db_get_all_rows_sql( "SELECT * - FROM tgroup_stat, tgrupo - WHERE tgrupo.id_grupo = tgroup_stat.id_group - AND tgroup_stat.id_group = $group - ORDER BY nombre" + FROM tgroup_stat, tgrupo + WHERE tgrupo.id_grupo = tgroup_stat.id_group + AND tgroup_stat.id_group = $group + ORDER BY nombre" ); $data['monitor_checks'] += $group_stat[0]['modules']; @@ -8284,8 +8303,8 @@ function reporting_get_group_stats_resume($id_group=0, $access='AR') $tags = db_get_value('tags', 'tusuario_perfil', 'id_usuario', $config['id_user']); if ($tags) { $tags_sql = " AND tae.id_agente_modulo IN ( SELECT id_agente_modulo - FROM ttag_module - WHERE id_tag IN ($tags) ) "; + FROM ttag_module + WHERE id_tag IN ($tags) ) "; } else { $tags_sql = ''; } @@ -8296,27 +8315,27 @@ function reporting_get_group_stats_resume($id_group=0, $access='AR') // for stats modules $sql = "SELECT tg.id_grupo as id, tg.nombre as name, - SUM(tae.estado=0) as monitor_ok, - SUM(tae.estado=1) as monitor_critical, - SUM(tae.estado=2) as monitor_warning, - SUM(tae.estado=3) as monitor_unknown, - SUM(tae.estado=4) as monitor_not_init, - COUNT(tae.estado) as monitor_total + SUM(tae.estado=0) as monitor_ok, + SUM(tae.estado=1) as monitor_critical, + SUM(tae.estado=2) as monitor_warning, + SUM(tae.estado=3) as monitor_unknown, + SUM(tae.estado=4) as monitor_not_init, + COUNT(tae.estado) as monitor_total - FROM - tagente_estado tae, - tagente ta, - tagente_modulo tam, - tgrupo tg + FROM + tagente_estado tae, + tagente ta, + tagente_modulo tam, + tgrupo tg - WHERE 1=1 - AND tae.id_agente = ta.id_agente - AND tae.id_agente_modulo = tam.id_agente_modulo - AND ta.id_grupo = tg.id_grupo - AND tam.disabled = 0 - AND ta.disabled = 0 - AND ta.id_grupo IN ($id_group) $tags_sql - GROUP BY tg.id_grupo;"; + WHERE 1=1 + AND tae.id_agente = ta.id_agente + AND tae.id_agente_modulo = tam.id_agente_modulo + AND ta.id_grupo = tg.id_grupo + AND tam.disabled = 0 + AND ta.disabled = 0 + AND ta.id_grupo IN ($id_group) $tags_sql + GROUP BY tg.id_grupo;"; $data_array = db_get_all_rows_sql($sql); $data = $data_array[0]; @@ -8329,27 +8348,27 @@ function reporting_get_group_stats_resume($id_group=0, $access='AR') // for stats agents $sql = "SELECT tae.id_agente id_agente, tg.id_grupo id_grupo, - SUM(tae.estado=0) as monitor_agent_ok, - SUM(tae.estado=1) as monitor_agent_critical, - SUM(tae.estado=2) as monitor_agent_warning, - SUM(tae.estado=3) as monitor_agent_unknown, - SUM(tae.estado=4) as monitor_agent_not_init, - COUNT(tae.estado) as monitor_agent_total + SUM(tae.estado=0) as monitor_agent_ok, + SUM(tae.estado=1) as monitor_agent_critical, + SUM(tae.estado=2) as monitor_agent_warning, + SUM(tae.estado=3) as monitor_agent_unknown, + SUM(tae.estado=4) as monitor_agent_not_init, + COUNT(tae.estado) as monitor_agent_total - FROM - tagente_estado tae, - tagente ta, - tagente_modulo tam, - tgrupo tg - - WHERE 1=1 - AND tae.id_agente = ta.id_agente - AND tae.id_agente_modulo = tam.id_agente_modulo - AND ta.id_grupo = tg.id_grupo - AND tam.disabled = 0 - AND ta.disabled = 0 - AND ta.id_grupo IN ($id_group) $tags_sql - GROUP BY tae.id_agente;"; + FROM + tagente_estado tae, + tagente ta, + tagente_modulo tam, + tgrupo tg + + WHERE 1=1 + AND tae.id_agente = ta.id_agente + AND tae.id_agente_modulo = tam.id_agente_modulo + AND ta.id_grupo = tg.id_grupo + AND tam.disabled = 0 + AND ta.disabled = 0 + AND ta.id_grupo IN ($id_group) $tags_sql + GROUP BY tae.id_agente;"; $data_array_2 = db_get_all_rows_sql($sql); if (is_array($data_array_2) || is_object($data_array_2)) { @@ -8460,22 +8479,22 @@ function reporting_get_stats_indicators($data, $width=280, $height=20, $html=tru if ($html) { $tdata[0] = '
    - '.__('Server health').ui_print_help_tip(sprintf(__('%d Downed servers'), $servers['down']), true).''.progress_bar($servers['health'], $width, $height, '', 0).'
    '; + '.__('Server health').ui_print_help_tip(sprintf(__('%d Downed servers'), $servers['down']), true).''.progress_bar($servers['health'], $width, $height, '', 0).''; $table_ind->rowclass[] = ''; $table_ind->data[] = $tdata; $tdata[0] = '
    - '.__('Monitor health').ui_print_help_tip(sprintf(__('%d Not Normal monitors'), $data['monitor_not_normal']), true).''.progress_bar($data['monitor_health'], $width, $height, $data['monitor_health'].'% '.__('of monitors up'), 0).'
    '; + '.__('Monitor health').ui_print_help_tip(sprintf(__('%d Not Normal monitors'), $data['monitor_not_normal']), true).''.progress_bar($data['monitor_health'], $width, $height, $data['monitor_health'].'% '.__('of monitors up'), 0).''; $table_ind->rowclass[] = ''; $table_ind->data[] = $tdata; $tdata[0] = '
    - '.__('Module sanity').ui_print_help_tip(sprintf(__('%d Not inited monitors'), $data['monitor_not_init']), true).''.progress_bar($data['module_sanity'], $width, $height, $data['module_sanity'].'% '.__('of total modules inited'), 0).'
    '; + '.__('Module sanity').ui_print_help_tip(sprintf(__('%d Not inited monitors'), $data['monitor_not_init']), true).''.progress_bar($data['module_sanity'], $width, $height, $data['module_sanity'].'% '.__('of total modules inited'), 0).''; $table_ind->rowclass[] = ''; $table_ind->data[] = $tdata; $tdata[0] = '
    - '.__('Alert level').ui_print_help_tip(sprintf(__('%d Fired alerts'), $data['monitor_alerts_fired']), true).''.progress_bar($data['alert_level'], $width, $height, $data['alert_level'].'% '.__('of defined alerts not fired'), 0).'
    '; + '.__('Alert level').ui_print_help_tip(sprintf(__('%d Fired alerts'), $data['monitor_alerts_fired']), true).''.progress_bar($data['alert_level'], $width, $height, $data['alert_level'].'% '.__('of defined alerts not fired'), 0).''; $table_ind->rowclass[] = ''; $table_ind->data[] = $tdata; @@ -8558,7 +8577,7 @@ function reporting_get_stats_alerts($data, $links=false) if (!is_metaconsole()) { $output = '
    - '.__('Defined and fired alerts').''.html_print_table($table_al, true).'
    '; + '.__('Defined and fired alerts').''.html_print_table($table_al, true).''; } else { // Remove the defined alerts cause with the new cache table is difficult to retrieve them unset($table_al->data[0][0], $table_al->data[0][1]); @@ -8566,7 +8585,7 @@ function reporting_get_stats_alerts($data, $links=false) $table_al->class = 'tactical_view'; $table_al->style = []; $output = '
    - '.__('Fired alerts').''.html_print_table($table_al, true).'
    '; + '.__('Fired alerts').''.html_print_table($table_al, true).''; } return $output; @@ -8642,14 +8661,14 @@ function reporting_get_stats_modules_status($data, $graph_width=250, $graph_heig if (!is_metaconsole()) { $output = ' -
    - '.__('Monitors by status').''.html_print_table($table_mbs, true).'
    '; +
    + '.__('Monitors by status').''.html_print_table($table_mbs, true).'
    '; } else { $table_mbs->class = 'tactical_view'; $table_mbs->style = []; $output = ' -
    - '.__('Monitors by status').''.html_print_table($table_mbs, true).'
    '; +
    + '.__('Monitors by status').''.html_print_table($table_mbs, true).'
    '; } return $output; @@ -8715,7 +8734,7 @@ function reporting_get_stats_agents_monitors($data) $table_am->data[] = $tdata; $output = '
    - '.__('Total agents and monitors').''.html_print_table($table_am, true).'
    '; + '.__('Total agents and monitors').''.html_print_table($table_am, true).''; return $output; } @@ -8746,7 +8765,7 @@ function reporting_get_stats_users($data) $table_us->data[] = $tdata; $output = '
    - '.__('Users').''.html_print_table($table_us, true).'
    '; + '.__('Users').''.html_print_table($table_us, true).''; return $output; } @@ -8781,8 +8800,8 @@ function reporting_get_agentmodule_data_average($id_agent_module, $period=0, $da // Get module data $interval_data = db_get_all_rows_sql( 'SELECT * - FROM tagente_datos - WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', + FROM tagente_datos + WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', $search_in_history_db ); if ($interval_data === false) { @@ -8907,8 +8926,8 @@ function reporting_get_agentmodule_mttr($id_agent_module, $period=0, $date=0) $module = db_get_row_sql( 'SELECT max_critical, min_critical, id_tipo_modulo - FROM tagente_modulo - WHERE id_agente_modulo = '.(int) $id_agent_module + FROM tagente_modulo + WHERE id_agente_modulo = '.(int) $id_agent_module ); if ($module === false) { return false; @@ -8929,7 +8948,7 @@ function reporting_get_agentmodule_mttr($id_agent_module, $period=0, $date=0) // Get module data $interval_data = db_get_all_rows_sql( 'SELECT * FROM tagente_datos - WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', + WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', $search_in_history_db ); if ($interval_data === false) { @@ -9053,8 +9072,8 @@ function reporting_get_agentmodule_mtbf($id_agent_module, $period=0, $date=0) $module = db_get_row_sql( 'SELECT max_critical, min_critical, id_tipo_modulo - FROM tagente_modulo - WHERE id_agente_modulo = '.(int) $id_agent_module + FROM tagente_modulo + WHERE id_agente_modulo = '.(int) $id_agent_module ); if ($module === false) { return false; @@ -9075,7 +9094,7 @@ function reporting_get_agentmodule_mtbf($id_agent_module, $period=0, $date=0) // Get module data $interval_data = db_get_all_rows_sql( 'SELECT * FROM tagente_datos - WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', + WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', $search_in_history_db ); if ($interval_data === false) { @@ -9195,8 +9214,8 @@ function reporting_get_agentmodule_tto($id_agent_module, $period=0, $date=0) $module = db_get_row_sql( 'SELECT max_critical, min_critical, id_tipo_modulo - FROM tagente_modulo - WHERE id_agente_modulo = '.(int) $id_agent_module + FROM tagente_modulo + WHERE id_agente_modulo = '.(int) $id_agent_module ); if ($module === false) { return false; @@ -9217,7 +9236,7 @@ function reporting_get_agentmodule_tto($id_agent_module, $period=0, $date=0) // Get module data $interval_data = db_get_all_rows_sql( 'SELECT * FROM tagente_datos - WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', + WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', $search_in_history_db ); if ($interval_data === false) { @@ -9304,8 +9323,8 @@ function reporting_get_agentmodule_ttr($id_agent_module, $period=0, $date=0) $module = db_get_row_sql( 'SELECT max_critical, min_critical, id_tipo_modulo - FROM tagente_modulo - WHERE id_agente_modulo = '.(int) $id_agent_module + FROM tagente_modulo + WHERE id_agente_modulo = '.(int) $id_agent_module ); if ($module === false) { return false; @@ -9326,7 +9345,7 @@ function reporting_get_agentmodule_ttr($id_agent_module, $period=0, $date=0) // Get module data $interval_data = db_get_all_rows_sql( 'SELECT * FROM tagente_datos - WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', + WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', $search_in_history_db ); if ($interval_data === false) { @@ -9775,9 +9794,9 @@ function reporting_get_agentmodule_sla( // Get interval data $sql = sprintf( 'SELECT * - FROM tagente_datos - WHERE id_agente_modulo = %d - AND utimestamp > %d AND utimestamp <= %d', + FROM tagente_datos + WHERE id_agente_modulo = %d + AND utimestamp > %d AND utimestamp <= %d', $id_agent_module, $datelimit, $date @@ -9996,43 +10015,43 @@ function reporting_get_planned_downtimes_intervals($id_agent_module, $start_date } $sql_downtime = ' - SELECT DISTINCT(tpdr.id), - tpdr.name, - '.$tpdr_description.", - tpdr.date_from, - tpdr.date_to, - tpdr.executed, - tpdr.id_group, - tpdr.only_alerts, - tpdr.monday, - tpdr.tuesday, - tpdr.wednesday, - tpdr.thursday, - tpdr.friday, - tpdr.saturday, - tpdr.sunday, - tpdr.periodically_time_from, - tpdr.periodically_time_to, - tpdr.periodically_day_from, - tpdr.periodically_day_to, - tpdr.type_downtime, - tpdr.type_execution, - tpdr.type_periodicity, - tpdr.id_user - FROM ( - SELECT tpd.* - FROM tplanned_downtime tpd, tplanned_downtime_agents tpda, tagente_modulo tam - WHERE tpd.id = tpda.id_downtime - AND tpda.all_modules = 1 - AND tpda.id_agent = tam.id_agente - AND tam.id_agente_modulo = $id_agent_module - UNION ALL - SELECT tpd.* - FROM tplanned_downtime tpd, tplanned_downtime_modules tpdm - WHERE tpd.id = tpdm.id_downtime - AND tpdm.id_agent_module = $id_agent_module - ) tpdr - ORDER BY tpdr.id"; + SELECT DISTINCT(tpdr.id), + tpdr.name, + '.$tpdr_description.", + tpdr.date_from, + tpdr.date_to, + tpdr.executed, + tpdr.id_group, + tpdr.only_alerts, + tpdr.monday, + tpdr.tuesday, + tpdr.wednesday, + tpdr.thursday, + tpdr.friday, + tpdr.saturday, + tpdr.sunday, + tpdr.periodically_time_from, + tpdr.periodically_time_to, + tpdr.periodically_day_from, + tpdr.periodically_day_to, + tpdr.type_downtime, + tpdr.type_execution, + tpdr.type_periodicity, + tpdr.id_user + FROM ( + SELECT tpd.* + FROM tplanned_downtime tpd, tplanned_downtime_agents tpda, tagente_modulo tam + WHERE tpd.id = tpda.id_downtime + AND tpda.all_modules = 1 + AND tpda.id_agent = tam.id_agente + AND tam.id_agente_modulo = $id_agent_module + UNION ALL + SELECT tpd.* + FROM tplanned_downtime tpd, tplanned_downtime_modules tpdm + WHERE tpd.id = tpdm.id_downtime + AND tpdm.id_agent_module = $id_agent_module + ) tpdr + ORDER BY tpdr.id"; $downtimes = db_get_all_rows_sql($sql_downtime); @@ -10241,8 +10260,8 @@ function reporting_get_agentmodule_data_max($id_agent_module, $period=0, $date=0 // Get module data $interval_data = db_get_all_rows_sql( 'SELECT * - FROM tagente_datos - WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', + FROM tagente_datos + WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', $search_in_history_db ); @@ -10347,8 +10366,8 @@ function reporting_get_agentmodule_data_min($id_agent_module, $period=0, $date=0 // Get module data $interval_data = db_get_all_rows_sql( 'SELECT * - FROM tagente_datos - WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', + FROM tagente_datos + WHERE id_agente_modulo = '.(int) $id_agent_module.' AND utimestamp > '.(int) $datelimit.' AND utimestamp < '.(int) $date.' ORDER BY utimestamp ASC', $search_in_history_db ); if ($interval_data === false) { @@ -10473,11 +10492,11 @@ function reporting_get_agentmodule_data_sum( // Get module data $interval_data = db_get_all_rows_sql( ' - SELECT * FROM tagente_datos - WHERE id_agente_modulo = '.(int) $id_agent_module.' - AND utimestamp > '.(int) $datelimit.' - AND utimestamp < '.(int) $date.' - ORDER BY utimestamp ASC', + SELECT * FROM tagente_datos + WHERE id_agente_modulo = '.(int) $id_agent_module.' + AND utimestamp > '.(int) $datelimit.' + AND utimestamp < '.(int) $date.' + ORDER BY utimestamp ASC', $search_in_history_db ); } else { @@ -10572,24 +10591,24 @@ function reporting_get_planned_downtimes($start_date, $end_date, $id_agent_modul // is inside the planned downtime execution. // The start and end time is very important. $periodically_monthly_w = "type_periodicity = 'monthly' - AND (((periodically_day_from > '$start_day' - OR (periodically_day_from = '$start_day' - AND periodically_time_from >= '$start_time')) - AND (periodically_day_to < '$end_day' - OR (periodically_day_to = '$end_day' - AND periodically_time_to <= '$end_time'))) - OR ((periodically_day_from < '$start_day' - OR (periodically_day_from = '$start_day' - AND periodically_time_from <= '$start_time')) - AND (periodically_day_to > '$start_day' - OR (periodically_day_to = '$start_day' - AND periodically_time_to >= '$start_time'))) - OR ((periodically_day_from < '$end_day' - OR (periodically_day_from = '$end_day' - AND periodically_time_from <= '$end_time')) - AND (periodically_day_to > '$end_day' - OR (periodically_day_to = '$end_day' - AND periodically_time_to >= '$end_time'))))"; + AND (((periodically_day_from > '$start_day' + OR (periodically_day_from = '$start_day' + AND periodically_time_from >= '$start_time')) + AND (periodically_day_to < '$end_day' + OR (periodically_day_to = '$end_day' + AND periodically_time_to <= '$end_time'))) + OR ((periodically_day_from < '$start_day' + OR (periodically_day_from = '$start_day' + AND periodically_time_from <= '$start_time')) + AND (periodically_day_to > '$start_day' + OR (periodically_day_to = '$start_day' + AND periodically_time_to >= '$start_time'))) + OR ((periodically_day_from < '$end_day' + OR (periodically_day_from = '$end_day' + AND periodically_time_from <= '$end_time')) + AND (periodically_day_to > '$end_day' + OR (periodically_day_to = '$end_day' + AND periodically_time_to >= '$end_time'))))"; } $periodically_weekly_days = []; @@ -10609,13 +10628,13 @@ function reporting_get_planned_downtimes($start_date, $end_date, $id_agent_modul // the start or end time of the date range. $weekday_actual = strtolower(date('l', $start_date)); $periodically_weekly_days[] = "($weekday_actual = 1 - AND ((periodically_time_from > '$start_time' AND periodically_time_to < '$end_time') - OR (periodically_time_from = '$start_time' - OR (periodically_time_from < '$start_time' - AND periodically_time_to >= '$start_time')) - OR (periodically_time_from = '$end_time' - OR (periodically_time_from < '$end_time' - AND periodically_time_to >= '$end_time'))))"; + AND ((periodically_time_from > '$start_time' AND periodically_time_to < '$end_time') + OR (periodically_time_from = '$start_time' + OR (periodically_time_from < '$start_time' + AND periodically_time_to >= '$start_time')) + OR (periodically_time_from = '$end_time' + OR (periodically_time_from < '$end_time' + AND periodically_time_to >= '$end_time'))))"; } else { while ($date_aux <= $end_date && $i < 7) { $weekday_actual = strtolower(date('l', $date_aux)); @@ -10660,68 +10679,68 @@ function reporting_get_planned_downtimes($start_date, $end_date, $id_agent_modul } $sql_downtime = ' - SELECT - DISTINCT(tpdr.id), - tpdr.name, - '.$tpdr_description.", - tpdr.date_from, - tpdr.date_to, - tpdr.executed, - tpdr.id_group, - tpdr.only_alerts, - tpdr.monday, - tpdr.tuesday, - tpdr.wednesday, - tpdr.thursday, - tpdr.friday, - tpdr.saturday, - tpdr.sunday, - tpdr.periodically_time_from, - tpdr.periodically_time_to, - tpdr.periodically_day_from, - tpdr.periodically_day_to, - tpdr.type_downtime, - tpdr.type_execution, - tpdr.type_periodicity, - tpdr.id_user - FROM ( - SELECT tpd.* - FROM tplanned_downtime tpd, tplanned_downtime_agents tpda, tagente_modulo tam - WHERE (tpd.id = tpda.id_downtime - AND tpda.all_modules = 1 - AND tpda.id_agent = tam.id_agente - AND tam.id_agente_modulo IN ($id_agent_modules_str)) - AND ((type_execution = 'periodically' - AND $periodically_condition) - OR (type_execution = 'once' - AND ((date_from >= '$start_date' AND date_to <= '$end_date') - OR (date_from <= '$start_date' AND date_to >= '$end_date') - OR (date_from <= '$start_date' AND date_to >= '$start_date') - OR (date_from <= '$end_date' AND date_to >= '$end_date')))) - UNION ALL - SELECT tpd.* - FROM tplanned_downtime tpd, tplanned_downtime_modules tpdm - WHERE (tpd.id = tpdm.id_downtime - AND tpdm.id_agent_module IN ($id_agent_modules_str)) - AND ((type_execution = 'periodically' - AND $periodically_condition) - OR (type_execution = 'once' - AND ((date_from >= '$start_date' AND date_to <= '$end_date') - OR (date_from <= '$start_date' AND date_to >= '$end_date') - OR (date_from <= '$start_date' AND date_to >= '$start_date') - OR (date_from <= '$end_date' AND date_to >= '$end_date')))) - ) tpdr - ORDER BY tpdr.id"; + SELECT + DISTINCT(tpdr.id), + tpdr.name, + '.$tpdr_description.", + tpdr.date_from, + tpdr.date_to, + tpdr.executed, + tpdr.id_group, + tpdr.only_alerts, + tpdr.monday, + tpdr.tuesday, + tpdr.wednesday, + tpdr.thursday, + tpdr.friday, + tpdr.saturday, + tpdr.sunday, + tpdr.periodically_time_from, + tpdr.periodically_time_to, + tpdr.periodically_day_from, + tpdr.periodically_day_to, + tpdr.type_downtime, + tpdr.type_execution, + tpdr.type_periodicity, + tpdr.id_user + FROM ( + SELECT tpd.* + FROM tplanned_downtime tpd, tplanned_downtime_agents tpda, tagente_modulo tam + WHERE (tpd.id = tpda.id_downtime + AND tpda.all_modules = 1 + AND tpda.id_agent = tam.id_agente + AND tam.id_agente_modulo IN ($id_agent_modules_str)) + AND ((type_execution = 'periodically' + AND $periodically_condition) + OR (type_execution = 'once' + AND ((date_from >= '$start_date' AND date_to <= '$end_date') + OR (date_from <= '$start_date' AND date_to >= '$end_date') + OR (date_from <= '$start_date' AND date_to >= '$start_date') + OR (date_from <= '$end_date' AND date_to >= '$end_date')))) + UNION ALL + SELECT tpd.* + FROM tplanned_downtime tpd, tplanned_downtime_modules tpdm + WHERE (tpd.id = tpdm.id_downtime + AND tpdm.id_agent_module IN ($id_agent_modules_str)) + AND ((type_execution = 'periodically' + AND $periodically_condition) + OR (type_execution = 'once' + AND ((date_from >= '$start_date' AND date_to <= '$end_date') + OR (date_from <= '$start_date' AND date_to >= '$end_date') + OR (date_from <= '$start_date' AND date_to >= '$start_date') + OR (date_from <= '$end_date' AND date_to >= '$end_date')))) + ) tpdr + ORDER BY tpdr.id"; } else { $sql_downtime = "SELECT * - FROM tplanned_downtime tpd, tplanned_downtime_modules tpdm - WHERE (type_execution = 'periodically' - AND $periodically_condition) - OR (type_execution = 'once' - AND ((date_from >= '$start_date' AND date_to <= '$end_date') - OR (date_from <= '$start_date' AND date_to >= '$end_date') - OR (date_from <= '$start_date' AND date_to >= '$start_date') - OR (date_from <= '$end_date' AND date_to >= '$end_date')))"; + FROM tplanned_downtime tpd, tplanned_downtime_modules tpdm + WHERE (type_execution = 'periodically' + AND $periodically_condition) + OR (type_execution = 'once' + AND ((date_from >= '$start_date' AND date_to <= '$end_date') + OR (date_from <= '$start_date' AND date_to >= '$end_date') + OR (date_from <= '$start_date' AND date_to >= '$start_date') + OR (date_from <= '$end_date' AND date_to >= '$end_date')))"; } $downtimes = db_get_all_rows_sql($sql_downtime); @@ -10789,10 +10808,10 @@ function reporting_get_agentmodule_sla_day($id_agent_module, $period=0, $min_val // Get interval data $sql = sprintf( 'SELECT * - FROM tagente_datos - WHERE id_agente_modulo = %d - AND utimestamp > %d - AND utimestamp <= %d', + FROM tagente_datos + WHERE id_agente_modulo = %d + AND utimestamp > %d + AND utimestamp <= %d', $id_agent_module, $datelimit, $date @@ -11117,7 +11136,7 @@ function reporting_get_stats_servers() $table_srv->data[] = $tdata; $output = '
    - '.__('Server performance').''.html_print_table($table_srv, true).'
    '; + '.__('Server performance').''.html_print_table($table_srv, true).''; $output .= ' diff --git a/pandora_console/index.php b/pandora_console/index.php index 3c95074171..320a33da3b 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -359,12 +359,15 @@ if (! isset($config['id_user'])) { $nick_in_db = $_SESSION['prepared_login_da']['id_user']; $expired_pass = false; } else if (($config['auth'] == 'saml') && ($login_button_saml)) { - include_once ENTERPRISE_DIR.'/include/auth/saml.php'; - - $saml_user_id = saml_process_user_login(); + if (!include_once 'include/auth/saml.php') { + include_once 'general/noaccesssaml.php'; + } else { + $saml_user_id = saml_process_user_login(); + } $nick_in_db = $saml_user_id; if (!$nick_in_db) { + include_once 'general/noaccesssaml.php'; include_once $config['saml_path'].'simplesamlphp/lib/_autoload.php'; $as = new SimpleSAML_Auth_Simple('PandoraFMS'); $as->logout(); From 6d6c8fe197426acb169b5981ecd5c19ad44bff64 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Mon, 8 Jul 2019 17:57:23 +0200 Subject: [PATCH 280/460] Added filter by agent - #4318 --- .../godmode/massive/massive_delete_modules.php | 8 ++++++++ pandora_console/godmode/massive/massive_edit_modules.php | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/pandora_console/godmode/massive/massive_delete_modules.php b/pandora_console/godmode/massive/massive_delete_modules.php index c52878c5da..7d8d64141a 100755 --- a/pandora_console/godmode/massive/massive_delete_modules.php +++ b/pandora_console/godmode/massive/massive_delete_modules.php @@ -501,6 +501,11 @@ $table->data['form_agents_4'][1] = html_print_select( true ); +$table->rowstyle['form_agents_filter'] = 'vertical-align: top;'; +$table->rowclass['form_agents_filter'] = 'select_agents_row select_agents_row_2'; +$table->data['form_agents_filter'][0] = __('Filter Agents'); +$table->data['form_agents_filter'][1] = html_print_input_text('filter_agents', '', '', 20, 255, true); + $table->rowstyle['form_agents_3'] = 'vertical-align: top;'; $table->rowclass['form_agents_3'] = 'select_agents_row select_agents_row_2'; $table->data['form_agents_3'][0] = __('Agents'); @@ -763,6 +768,9 @@ $(document).ready (function () { .html (value["alias"]); $("#id_agents").append (option); }); + //Filter agents. Call the function when the select is fully loaded. + var textNoData = ""; + filterByText($('#id_agents'), $("#text-filter_agents"), textNoData); }, "json" ); diff --git a/pandora_console/godmode/massive/massive_edit_modules.php b/pandora_console/godmode/massive/massive_edit_modules.php index 1a18b410d5..f52707cb2a 100755 --- a/pandora_console/godmode/massive/massive_edit_modules.php +++ b/pandora_console/godmode/massive/massive_edit_modules.php @@ -473,6 +473,11 @@ $table->data['form_agents_4'][1] = html_print_select( true ); +$table->rowstyle['form_agents_filter'] = 'vertical-align: top;'; +$table->rowclass['form_agents_filter'] = 'select_agents_row select_agents_row_2'; +$table->data['form_agents_filter'][0] = __('Filter agents'); +$table->data['form_agents_filter'][1] = html_print_input_text('filter_agents', '', '', 20, 255, true); + $table->rowstyle['form_agents_3'] = 'vertical-align: top;'; $table->rowclass['form_agents_3'] = 'select_agents_row select_agents_row_2'; $table->data['form_agents_3'][0] = __('Agents'); @@ -1638,6 +1643,9 @@ $(document).ready (function () { .html(value["alias"]); $("#id_agents").append (option); }); + //Filter agents. Call the function when the select is fully loaded. + var textNoData = ""; + filterByText($('#id_agents'), $("#text-filter_agents"), textNoData); }, "json" ); From 127f67f2ac92f616fc07b5d3bacdf093d7df51ab Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Mon, 8 Jul 2019 19:33:54 +0200 Subject: [PATCH 281/460] fixed error in network component --- .../godmode/agentes/configurar_agente.php | 14 +++-------- .../include/javascript/pandora_modules.js | 23 +++++++++++++------ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php index d5f6f1fcfd..842f6c3d46 100644 --- a/pandora_console/godmode/agentes/configurar_agente.php +++ b/pandora_console/godmode/agentes/configurar_agente.php @@ -1276,18 +1276,10 @@ if ($update_module || $create_module) { $m_hide = $m['hide']; } - if ($update_module) { - if ($m_hide == '1') { - $macros[$k]['value'] = io_input_password(get_parameter($m['macro'], '')); - } else { - $macros[$k]['value'] = get_parameter($m['macro'], ''); - } + if ($m_hide == '1') { + $macros[$k]['value'] = io_input_password(get_parameter($m['macro'], '')); } else { - if ($m_hide == '1') { - $macros[$k]['value'] = io_input_password($macros_names[$k]); - } else { - $macros[$k]['value'] = $macros_names[$k]; - } + $macros[$k]['value'] = get_parameter($m['macro'], ''); } } diff --git a/pandora_console/include/javascript/pandora_modules.js b/pandora_console/include/javascript/pandora_modules.js index 2795df7bdb..d04c3d2bd6 100644 --- a/pandora_console/include/javascript/pandora_modules.js +++ b/pandora_console/include/javascript/pandora_modules.js @@ -536,7 +536,7 @@ function configure_modules_form() { var obj = jQuery.parseJSON(data["macros"]); $.each(obj, function(k, macro) { - add_macro_field(macro, "simple-macro", "td"); + add_macro_field(macro, "simple-macro", "td", k); }); } @@ -791,7 +791,7 @@ function new_macro(prefix, callback) { } } -function add_macro_field(macro, row_model_id, type_copy) { +function add_macro_field(macro, row_model_id, type_copy, k) { var macro_desc = macro["desc"]; // Change the carriage returns by html returns
    in help var macro_help = macro["help"].replace(/ /g, "
    "); @@ -799,7 +799,6 @@ function add_macro_field(macro, row_model_id, type_copy) { var macro_value = $("
    ") .html(macro["value"]) .text(); - var macro_hide = macro["hide"]; macro_value.type = "password"; @@ -809,6 +808,7 @@ function add_macro_field(macro, row_model_id, type_copy) { // Change attributes to be unique and with identificable class $macro_field.attr("id", row_id); + $macro_field.attr("class", "macro_field"); // Get the number of fields already printed @@ -828,6 +828,19 @@ function add_macro_field(macro, row_model_id, type_copy) { ); } + // Only for create module type plugin need rename + // td id "simple-macro_field" + k + "-1" is horrible. + if (k) { + $("#" + row_model_id + "_field" + k + "_ td:eq(0)").attr( + "id", + "simple-macro_field" + k + "-0" + ); + $("#" + row_model_id + "_field" + k + "_ td:eq(1)").attr( + "id", + "simple-macro_field" + k + "-1" + ); + } + // Change the label if (macro_help == "") { $("#" + row_id) @@ -855,13 +868,11 @@ function add_macro_field(macro, row_model_id, type_copy) { .children() .eq(1) .children() - .eq(0) .attr("id", "text-" + macro_macro); $("#" + row_id) .children() .eq(1) .children() - .eq(0) .attr("name", macro_macro); } else { $("#" + row_id) @@ -893,14 +904,12 @@ function add_macro_field(macro, row_model_id, type_copy) { .children() .eq(1) .children() - .eq(0) .attr("type", "password"); } else { $("#" + row_id) .children() .eq(1) .children() - .eq(0) .val(macro_value); } } else { From 729fb32ffb2c19ec1b3686e7b3672d05d0856980 Mon Sep 17 00:00:00 2001 From: artica Date: Tue, 9 Jul 2019 00:01:10 +0200 Subject: [PATCH 282/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 02a7bdab5f..6f8d1f824d 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190708 +Version: 7.0NG.736-190709 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index cc8929763d..1234a20b06 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190708" +pandora_version="7.0NG.736-190709" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 399559f00b..5be1d49311 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190708'; +use constant AGENT_BUILD => '190709'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 977af1104f..23d3afc120 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190708 +%define release 190709 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 84eac835d9..7320e5a83d 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190708 +%define release 190709 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 02c3728350..ae6028674d 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190708" +PI_BUILD="190709" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index ce66038ef5..7f4138dd8a 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190708} +{190709} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 41ae8eb267..dc6658a299 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190708)") +#define PANDORA_VERSION ("7.0NG.736(Build 190709)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 696d6c34e3..7589ae4e1f 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190708))" + VALUE "ProductVersion", "(7.0NG.736(Build 190709))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 062c14afdc..09c13f639d 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190708 +Version: 7.0NG.736-190709 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 56d98823ac..1e2e36c157 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190708" +pandora_version="7.0NG.736-190709" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 3adcf1f113..57121de09a 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190708'; +$build_version = 'PC190709'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index e22cf98add..1f7283c155 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 9eca22a68f..da6d2103e1 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190708 +%define release 190709 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 92935fbd0d..222a596040 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190708 +%define release 190709 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 1ddc84c2c9..0c14c07255 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190708" +PI_BUILD="190709" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index f4c3a443df..dd4417cb0b 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190708"; +my $version = "7.0NG.736 PS190709"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index cf5bf608e3..6b2567e178 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190708"; +my $version = "7.0NG.736 PS190709"; # save program name for logging my $progname = basename($0); From 0f280494a00a8e5cb6be01459d0a46a618b09a3d Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Tue, 9 Jul 2019 09:33:49 +0200 Subject: [PATCH 283/460] Changed images for divs to show preview in visual styles - #4195 --- .../godmode/setup/setup_visuals.php | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 8b0b2d5486..6e73913b56 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -159,6 +159,16 @@ $table_styles->data[$row][1] = html_print_select( $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'status_set_preview', false, '', 'class="sub camera logo_preview"', true); $row++; +// Divs to show icon status Colours (Default) +$icon_unknown_ball = ui_print_status_image(STATUS_AGENT_UNKNOWN_BALL, '', true); +$icon_unknown = ui_print_status_image(STATUS_AGENT_UNKNOWN, '', true); +$icon_ok_ball = ui_print_status_image(STATUS_AGENT_OK_BALL, '', true); +$icon_ok = ui_print_status_image(STATUS_AGENT_OK, '', true); +$icon_warning_ball = ui_print_status_image(STATUS_AGENT_WARNING_BALL, '', true); +$icon_warning = ui_print_status_image(STATUS_AGENT_WARNING, '', true); +$icon_bad_ball = ui_print_status_image(STATUS_AGENT_CRITICAL_BALL, '', true); +$icon_bad = ui_print_status_image(STATUS_AGENT_CRITICAL, '', true); +// End - Divs to show icon status Colours (Default) $table_styles->data[$row][0] = __('Login background').ui_print_help_tip(__('You can place your custom images into the folder images/backgrounds/'), true); $backgrounds_list_jpg = list_files('images/backgrounds', 'jpg', 1, 0); $backgrounds_list_gif = list_files('images/backgrounds', 'gif', 1, 0); @@ -1635,6 +1645,17 @@ $("#button-status_set_preview").click (function (e) { $icon_bad_ball = $(""); $icon_bad = $(""); + if(icon_dir == 'default'){ + $icon_unknown_ball = ''; + $icon_unknown = ''; + $icon_ok_ball = ''; + $icon_ok = ''; + $icon_warning_ball = ''; + $icon_warning = ''; + $icon_bad_ball = ''; + $icon_bad = ''; + } + try { $dialog .hide() From bd80e013f56330d91e33cdc3cd19b4425cca8582 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 9 Jul 2019 12:02:07 +0200 Subject: [PATCH 284/460] minor fix to avoid log messages --- pandora_console/include/load_session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/load_session.php b/pandora_console/include/load_session.php index 99bae81244..8b243d808a 100644 --- a/pandora_console/include/load_session.php +++ b/pandora_console/include/load_session.php @@ -94,7 +94,7 @@ function pandora_session_write($session_id, $data) if (is_ajax()) { // Avoid session upadte while processing ajax responses - notifications. if (get_parameter('check_new_notifications', false)) { - return false; + return true; } } From 0cabc4d4dac8ac6895b18208ae5cf0177ceeb287 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 9 Jul 2019 12:02:29 +0200 Subject: [PATCH 285/460] Azure discovery task form completed --- .../wizards/DiscoveryTaskList.class.php | 112 +++++++++++------- .../include/functions_snmp_browser.php | 2 - 2 files changed, 70 insertions(+), 44 deletions(-) diff --git a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php index e018ec3d30..586f24335b 100644 --- a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php +++ b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php @@ -501,41 +501,60 @@ class DiscoveryTaskList extends Wizard $data[5] = __('Pending'); } - if ($task['id_recon_script'] == 0) { - // Internal discovery task. - switch ($task['type']) { - case DISCOVERY_CLOUD_AWS_RDS: - // Discovery Applications MySQL. - $data[6] = html_print_image( - 'images/network.png', - true, - ['title' => __('Discovery Cloud RDS')] - ).'  '; - $data[6] .= __('Discovery.Cloud.Aws.RDS'); - break; + switch ($task['type']) { + case DISCOVERY_CLOUD_AZURE_COMPUTE: + // Discovery Applications MySQL. + $data[6] = html_print_image( + 'images/plugin.png', + true, + ['title' => __('Discovery Cloud Azure Compute')] + ).'  '; + $data[6] .= __('Cloud.Azure.Compute'); + break; - case DISCOVERY_APP_MYSQL: - // Discovery Applications MySQL. - $data[6] = html_print_image( - 'images/network.png', - true, - ['title' => __('Discovery Applications MySQL')] - ).'  '; - $data[6] .= __('Discovery.App.MySQL'); - break; + case DISCOVERY_CLOUD_AWS_EC2: + // Discovery Applications MySQL. + $data[6] = html_print_image( + 'images/plugin.png', + true, + ['title' => __('Discovery Cloud AWS EC2')] + ).'  '; + $data[6] .= __('Cloud.AWS.EC2'); + break; - case DISCOVERY_APP_ORACLE: - // Discovery Applications Oracle. - $data[6] = html_print_image( - 'images/network.png', - true, - ['title' => __('Discovery Applications Oracle')] - ).'  '; - $data[6] .= __('Discovery.App.Oracle'); - break; + case DISCOVERY_CLOUD_AWS_RDS: + // Discovery Cloud RDS. + $data[6] = html_print_image( + 'images/network.png', + true, + ['title' => __('Discovery Cloud RDS')] + ).'  '; + $data[6] .= __('Discovery.Cloud.Aws.RDS'); + break; - case DISCOVERY_HOSTDEVICES: - default: + case DISCOVERY_APP_MYSQL: + // Discovery Applications MySQL. + $data[6] = html_print_image( + 'images/network.png', + true, + ['title' => __('Discovery Applications MySQL')] + ).'  '; + $data[6] .= __('Discovery.App.MySQL'); + break; + + case DISCOVERY_APP_ORACLE: + // Discovery Applications Oracle. + $data[6] = html_print_image( + 'images/network.png', + true, + ['title' => __('Discovery Applications Oracle')] + ).'  '; + $data[6] .= __('Discovery.App.Oracle'); + break; + + case DISCOVERY_HOSTDEVICES: + default: + if ($task['id_recon_script'] == 0) { // Discovery NetScan. $data[6] = html_print_image( 'images/network.png', @@ -550,15 +569,15 @@ class DiscoveryTaskList extends Wizard } else { $data[6] .= __('Discovery.NetScan'); } - break; - } - } else { - // APP recon task. - $data[6] = html_print_image( - 'images/plugin.png', - true - ).'  '; - $data[6] .= $recon_script_name; + } else { + // APP or external script recon task. + $data[6] = html_print_image( + 'images/plugin.png', + true + ).'  '; + $data[6] .= $recon_script_name; + } + break; } if ($task['status'] <= 0 || $task['status'] > 100) { @@ -699,7 +718,16 @@ class DiscoveryTaskList extends Wizard if ($script !== false) { switch ($script['type']) { case DISCOVERY_SCRIPT_CLOUD_AWS: - return 'wiz=cloud&mode=amazonws&ki='.$task['auth_strings'].'&page=1'; + switch ($task['type']) { + case DISCOVERY_CLOUD_AWS_EC2: + return 'wiz=cloud&mode=amazonws&ki='.$task['auth_strings'].'&page=1'; + + case DISCOVERY_CLOUD_AZURE_COMPUTE: + return 'wiz=cloud&mode=azure&ki='.$task['auth_strings'].'&sub=compute&page=0'; + + default: + return 'wiz=cloud'; + } case DISCOVERY_SCRIPT_APP_VMWARE: return 'wiz=app&mode=vmware&page=0'; diff --git a/pandora_console/include/functions_snmp_browser.php b/pandora_console/include/functions_snmp_browser.php index dded175af5..5b485d9e54 100644 --- a/pandora_console/include/functions_snmp_browser.php +++ b/pandora_console/include/functions_snmp_browser.php @@ -96,7 +96,6 @@ function snmp_browser_get_html_tree( foreach ($tree['__LEAVES__'] as $level => $sub_level) { // Id used to expand leafs. $sub_id = time().rand(0, getrandmax()); - // Display the branch. $output .= '
  • '; @@ -225,7 +224,6 @@ function snmp_browser_print_tree( $last_array, $sufix, $checked, - $return, $descriptive_ids, $previous_id ); From ab3cfd4cc97f3b2ef8f0552b5571f9b84a2a74ca Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Tue, 9 Jul 2019 14:08:06 +0200 Subject: [PATCH 286/460] new tocken user edit newslatter info --- .../godmode/users/configure_user.php | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 47788284fe..662df7ecee 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -137,6 +137,8 @@ if ($new_user && $config['admin_can_add_user']) { $user_info['not_login'] = false; $user_info['strict_acl'] = false; $user_info['session_time'] = 0; + $user_info['middlename'] = 0; + if ($isFunctionSkins !== ENTERPRISE_NOT_HOOK) { $user_info['id_skin'] = ''; } @@ -218,6 +220,7 @@ if ($create_user) { } $values['not_login'] = (bool) get_parameter('not_login', false); + $values['middlename'] = get_parameter('middlename', 0); $values['strict_acl'] = (bool) get_parameter('strict_acl', false); $values['session_time'] = (int) get_parameter('session_time', 0); @@ -317,12 +320,13 @@ if ($update_user) { $values['timezone'] = (string) get_parameter('timezone'); $values['default_event_filter'] = (int) get_parameter('default_event_filter'); $values['default_custom_view'] = (int) get_parameter('default_custom_view'); - // eHorus user level conf + + // eHorus user level conf. $values['ehorus_user_level_enabled'] = (bool) get_parameter('ehorus_user_level_enabled', false); $values['ehorus_user_level_user'] = (string) get_parameter('ehorus_user_level_user'); $values['ehorus_user_level_pass'] = (string) get_parameter('ehorus_user_level_pass'); - + $values['middlename'] = get_parameter('middlename', 0); $dashboard = get_parameter('dashboard', ''); $visual_console = get_parameter('visual_console', ''); @@ -869,13 +873,27 @@ foreach ($event_filter_data as $filter) { $table->data[16][0] = __('Default event filter'); $table->data[16][1] = html_print_select($event_filter, 'default_event_filter', $user_info['default_event_filter'], '', '', __('None'), true, false, false); +$table->data[17][0] = __('Disabled newsletter'); +if ($user_info['middlename'] >= 0) { + $middlename = false; +} else { + $middlename = true; +} + +$table->data[17][1] = html_print_checkbox( + 'middlename', + -1, + $middlename, + true +); + if ($config['ehorus_user_level_conf']) { - $table->data[17][0] = __('eHorus user acces enabled'); - $table->data[17][1] = html_print_checkbox('ehorus_user_level_enabled', 1, $user_info['ehorus_user_level_enabled'], true); - $table->data[18][0] = __('eHorus user'); - $table->data[19][0] = __('eHorus password'); - $table->data[18][1] = html_print_input_text('ehorus_user_level_user', $user_info['ehorus_user_level_user'], '', 15, 45, true); - $table->data[19][1] = html_print_input_password('ehorus_user_level_pass', io_output_password($user_info['ehorus_user_level_pass']), '', 15, 45, true); + $table->data[18][0] = __('eHorus user acces enabled'); + $table->data[18][1] = html_print_checkbox('ehorus_user_level_enabled', 1, $user_info['ehorus_user_level_enabled'], true); + $table->data[19][0] = __('eHorus user'); + $table->data[20][0] = __('eHorus password'); + $table->data[19][1] = html_print_input_text('ehorus_user_level_user', $user_info['ehorus_user_level_user'], '', 15, 45, true); + $table->data[20][1] = html_print_input_password('ehorus_user_level_pass', io_output_password($user_info['ehorus_user_level_pass']), '', 15, 45, true); } From d05dd7ecbc801f5c15eae822a0e6b3263f61dfc8 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Tue, 9 Jul 2019 14:56:42 +0200 Subject: [PATCH 287/460] fixed minor error --- pandora_console/include/functions_reporting.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 410925fd98..c56c2b85fe 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -6582,6 +6582,7 @@ function reporting_availability_graph($report, $content, $pdf=false) $content, $report['datetime'], $return, + '', $pdf ); } From eaf29b798a4e8a669c7f0f38902692d37b6d363c Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Tue, 9 Jul 2019 15:03:38 +0200 Subject: [PATCH 288/460] Fixed minor visual bugs in black theme- #4194 --- pandora_console/extensions/module_groups.php | 10 ++- .../agentes/module_manager_editor_common.php | 9 ++- .../include/functions_reporting_html.php | 8 ++- .../include/styles/pandora_black.css | 69 ++++++++++++++++++- pandora_console/operation/search_main.php | 2 +- 5 files changed, 92 insertions(+), 6 deletions(-) diff --git a/pandora_console/extensions/module_groups.php b/pandora_console/extensions/module_groups.php index d9843f9860..8b5075f77c 100644 --- a/pandora_console/extensions/module_groups.php +++ b/pandora_console/extensions/module_groups.php @@ -270,6 +270,12 @@ function mainModuleGroups() $table->style[0] = 'color: #ffffff; background-color: #373737; font-weight: bolder; min-width: 230px;'; $table->width = '100%'; + if ($config['style'] === 'pandora_black') { + $background_color = '#333'; + } else { + $background_color = '#fff'; + } + $head[0] = __('Groups'); $headstyle[0] = 'width: 20%; font-weight: bolder;'; foreach ($array_module_group as $key => $value) { @@ -314,7 +320,7 @@ function mainModuleGroups() $data[$i][$j] .= $array_data[$key][$k]['total_count']; $data[$i][$j] .= '
  • '; } else { - $data[$i][$j] = "
    "; + $data[$i][$j] = "
    "; $data[$i][$j] .= 0; $data[$i][$j] .= '
    '; } @@ -323,7 +329,7 @@ function mainModuleGroups() } } else { foreach ($value['gm'] as $k => $v) { - $data[$i][$j] = "
    "; + $data[$i][$j] = "
    "; $data[$i][$j] .= 0; $data[$i][$j] .= '
    '; $j++; diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index fbdd620f77..cc674f3837 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -78,6 +78,13 @@ function push_table_advanced($row, $id=false) function add_component_selection($id_network_component_type) { global $table_simple; + global $config; + + if ($config['style'] === 'pandora_black') { + $background_row = 'background-color: #444'; + } else { + $background_row = 'background-color: #cfcfcf'; + } $data = []; $data[0] = __('Using module component').' '; @@ -116,7 +123,7 @@ function add_component_selection($id_network_component_type) $data[1] .= ''; $table_simple->colspan['module_component'][1] = 3; - $table_simple->rowstyle['module_component'] = 'background-color: #cfcfcf'; + $table_simple->rowstyle['module_component'] = $background_row; prepend_table_simple($data, 'module_component'); } diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index c8d5b3e29e..c6524b4ec3 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -107,9 +107,15 @@ function html_do_report_info($report) { global $config; + if ($config['style'] === 'pandora_black') { + $background_color = '#222'; + } else { + $background_color = '#f5f5f5'; + } + $date_today = date($config['date_format']); - $html = '
    + $html = '
    diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css index 2db907831a..1913f9025d 100644 --- a/pandora_console/include/styles/pandora_black.css +++ b/pandora_console/include/styles/pandora_black.css @@ -55,6 +55,11 @@ table.databox, color: #fff; } +input[readonly] { + background-color: #444 !important; + color: #a2a2a2 !important; +} + .box-shadow { box-shadow: none; } @@ -88,6 +93,37 @@ textarea:disabled { filter: brightness(2.5) contrast(3.5); } +table.widget_list tr.datos, +table.widget_list tr.datos2, +table.widget_list td.datos, +table.widget_list td.datos2 { + background-color: inherit; +} + +/* messages */ +.container { + background-color: #222; +} + +.p-slider { + background-color: #888; +} + +ol.steps li.current { + border-left: 5px solid #82b92e; + background-color: #545454; +} + +ol.steps li { + background-color: #999; +} + +ol.steps li.visited, +ol.steps li.visited span, +ol.steps li.visited a { + color: #eaeaea; +} + /* White text */ a, #menu_tab_left li a, @@ -109,7 +145,9 @@ form.discovery label, .input_label, .pagination, tr.group_view_data, -.group_view_data { +.group_view_data, +ol.steps li span, +ol.steps li a { color: #fff; } @@ -198,6 +236,13 @@ table.table_modal_alternate tr:nth-child(even) td { color: #fff; } +.info_table .datos3, +.datos3, +.info_table .datos4, +.datos4 { + background-color: #444; +} + .action_buttons a[href] img, .action_buttons input[type="image"], .action_button_img { @@ -318,3 +363,25 @@ ul.ui-tabs-nav.ui-corner-all.ui-helper-reset.ui-helper-clearfix.ui-widget-header img { filter: brightness(2); } + +/* notifications */ +#notification-wrapper::before { + border-bottom-color: #111; +} + +#notification-wrapper { + background: #111; +} + +.notification-item { + background: #222; +} + +.notification-subtitle { + color: #fff; +} + +/* update_manager.css */ +div#box_online * { + color: #000; +} diff --git a/pandora_console/operation/search_main.php b/pandora_console/operation/search_main.php index ffc9d93f74..3a0880e348 100644 --- a/pandora_console/operation/search_main.php +++ b/pandora_console/operation/search_main.php @@ -22,7 +22,7 @@ $searchReports = check_acl($config['id_user'], 0, 'RR'); $searchUsers = check_acl($config['id_user'], 0, 'UM'); $searchHelps = true; -echo '
    '; +echo '
    '; $anyfound = false; From ca3b893073db33d06b250250ea6614b34e893392 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 9 Jul 2019 16:08:29 +0200 Subject: [PATCH 289/460] Discovery Cloud Azure --- .../lib/PandoraFMS/DiscoveryServer.pm | 58 ++----------------- pandora_server/lib/PandoraFMS/Tools.pm | 20 +++++++ 2 files changed, 26 insertions(+), 52 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm index 80fcbef8d3..8993826931 100644 --- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm +++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm @@ -56,15 +56,7 @@ my $TaskSem :shared; use constant { OS_OTHER => 10, OS_ROUTER => 17, - OS_SWITCH => 18, - DISCOVERY_HOSTDEVICES => 0, - DISCOVERY_HOSTDEVICES_CUSTOM => 1, - DISCOVERY_CLOUD_AWS => 2, - DISCOVERY_APP_VMWARE => 3, - DISCOVERY_APP_MYSQL => 4, - DISCOVERY_APP_ORACLE => 5, - DISCOVERY_CLOUD_AWS_EC2 => 6, - DISCOVERY_CLOUD_AWS_RDS => 7 + OS_SWITCH => 18 }; ######################################################################################## @@ -196,49 +188,11 @@ sub data_consumer ($$) { my $main_event = pandora_event($pa_config, "[Discovery] Execution summary",$task->{'id_group'}, 0, 0, 0, 0, 'system', 0, $dbh); my %cnf_extra; - if ($task->{'type'} == DISCOVERY_CLOUD_AWS_EC2 - || $task->{'type'} == DISCOVERY_CLOUD_AWS_RDS) { - # auth_strings stores the crential identifier to be used. - my $key = pandora_get_credential($dbh, $task->{'auth_strings'}); - - if (ref($key) eq "HASH") { - $cnf_extra{'aws_access_key_id'} = $key->{'username'}; - $cnf_extra{'aws_secret_access_key'} = $key->{'password'}; - } else { - # Invalid credential. - return; - } - - $cnf_extra{'cloud_util_path'} = pandora_get_config_value($dbh, 'cloud_util_path'); - - # Pass credentials by file due Perl limitations. We cannot update ENV here. - $cnf_extra{'creds_file'} = $pa_config->{'temporal'} . '/tmp_discovery.' . md5($task->{'id_rt'} . $task->{'name'} . time()); - eval { - open(my $__file_cfg, '> '. $cnf_extra{'creds_file'}) or die($!); - print $__file_cfg $cnf_extra{'aws_access_key_id'} . "\n"; - print $__file_cfg $cnf_extra{'aws_secret_access_key'} . "\n"; - close($__file_cfg); - set_file_permissions( - $pa_config, - $cnf_extra{'creds_file'}, - "0600" - ); - }; - if ($@) { - logger( - $pa_config, - 'Cannot instantiate configuration file for task: ' . safe_output($task->{'name'}), - 5 - ); - # A server restart will override ENV definition (see run) - logger( - $pa_config, - 'Cannot execute Discovery task: ' . safe_output($task->{'name'}) . '. Please restart the server.', - 1 - ); - # Skip this task. - return; - } + + my $r = enterprise_hook('discovery_generate_extra_cnf',[$pa_config, $dbh, $task, \%cnf_extra]); + if (isset($r) && $r eq 'ERR') { + # Could not generate extra cnf, skip this task. + return; } my $recon = new PandoraFMS::Recon::Base( diff --git a/pandora_server/lib/PandoraFMS/Tools.pm b/pandora_server/lib/PandoraFMS/Tools.pm index 6271698c03..4a96c5851d 100755 --- a/pandora_server/lib/PandoraFMS/Tools.pm +++ b/pandora_server/lib/PandoraFMS/Tools.pm @@ -72,6 +72,15 @@ our @EXPORT = qw( MIGRATIONSERVER METACONSOLE_LICENSE OFFLINE_LICENSE + DISCOVERY_HOSTDEVICES + DISCOVERY_HOSTDEVICES_CUSTOM + DISCOVERY_CLOUD_AWS + DISCOVERY_APP_VMWARE + DISCOVERY_APP_MYSQL + DISCOVERY_APP_ORACLE + DISCOVERY_CLOUD_AWS_EC2 + DISCOVERY_CLOUD_AWS_RDS + DISCOVERY_CLOUD_AZURE_COMPUTE $DEVNULL $OS $OS_VERSION @@ -172,6 +181,17 @@ use constant OFFLINE_LICENSE => 0x02; use constant RECOVERED_ALERT => 0; use constant FIRED_ALERT => 1; +# Discovery task types +use constant DISCOVERY_HOSTDEVICES => 0; +use constant DISCOVERY_HOSTDEVICES_CUSTOM => 1; +use constant DISCOVERY_CLOUD_AWS => 2; +use constant DISCOVERY_APP_VMWARE => 3; +use constant DISCOVERY_APP_MYSQL => 4; +use constant DISCOVERY_APP_ORACLE => 5; +use constant DISCOVERY_CLOUD_AWS_EC2 => 6; +use constant DISCOVERY_CLOUD_AWS_RDS => 7; +use constant DISCOVERY_CLOUD_AZURE_COMPUTE => 8; + # Set OS, OS version and /dev/null our $OS = $^O; our $OS_VERSION = "unknown"; From 084d1a229e866ccf72cf75d9d21b51c2122c35c0 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Tue, 9 Jul 2019 16:41:00 +0200 Subject: [PATCH 290/460] Added success and error messages when change the event owner - #4309 --- pandora_console/include/functions_events.php | 2 ++ .../include/javascript/pandora_events.js | 36 +++++++++++-------- pandora_console/include/styles/events.css | 4 +-- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 5f83669b4b..24efd1215e 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -4398,6 +4398,8 @@ function events_page_general($event) $data[1] = $user_owner; } + $table_general->cellclass[3][1] = 'general_owner'; + $table_general->data[] = $data; $data = []; diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 94dadb6fbb..c459ab0443 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -475,19 +475,18 @@ function event_change_owner() { var meta = $("#hidden-meta").val(); var history = $("#hidden-history").val(); - var params = []; - params.push("page=include/ajax/events"); - params.push("change_owner=1"); - params.push("event_id=" + event_id); - params.push("new_owner=" + new_owner); - params.push("meta=" + meta); - params.push("history=" + history); - $("#button-owner_button").attr("disabled", "disabled"); $("#response_loading").show(); jQuery.ajax({ - data: params.join("&"), + data: { + page: "include/ajax/events", + change_owner: 1, + event_id: event_id, + new_owner: new_owner, + meta: meta, + history: history + }, type: "POST", url: $("#hidden-ajax_file").val(), async: true, @@ -496,12 +495,19 @@ function event_change_owner() { $("#button-owner_button").removeAttr("disabled"); $("#response_loading").hide(); - show_event_dialog( - event_id, - $("#hidden-group_rep").val(), - "responses", - data - ); + if (data == "owner_ok") { + dt_events.draw(false); + $("#notification_owner_success").show(); + console.log(new_owner); + if (new_owner == -1) { + new_owner = ""; + } + $("#extended_event_general_page table td.general_owner").text( + new_owner + ); + } else { + $("#notification_owner_error").show(); + } } }); diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index fa1aac2e66..1ed0028dc8 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -271,6 +271,7 @@ ul.ui-tabs-nav.ui-corner-all.ui-helper-reset.ui-helper-clearfix.ui-widget-header margin: 0; margin-bottom: -1px; border: none; + border-bottom: 1px solid #a9a9a9; } ul.ui-tabs-nav.ui-corner-all.ui-helper-reset.ui-helper-clearfix.ui-widget-header @@ -298,9 +299,6 @@ li.ui-tabs-tab.ui-corner-top.ui-state-default.ui-tab { li.ui-tabs-tab.ui-corner-top.ui-state-default.ui-tab.ui-tabs-active.ui-state-active { border-bottom: 1px solid #fff; } -div.extended_event_pages.ui-tabs-panel.ui-corner-bottom.ui-widget-content { - border-top: 1px solid #a9a9a9; -} tr.group { padding: 5px; From 6af6aa179b1b19a1c06e0b8456a36710cf37e4a2 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Tue, 9 Jul 2019 16:45:00 +0200 Subject: [PATCH 291/460] Changed background in update manager offline - #4194 --- pandora_console/include/styles/pandora_black.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css index 1913f9025d..4df56da344 100644 --- a/pandora_console/include/styles/pandora_black.css +++ b/pandora_console/include/styles/pandora_black.css @@ -109,6 +109,15 @@ table.widget_list td.datos2 { background-color: #888; } +.fileupload_form { + background-color: #222; +} + +#drop_file { + background-color: #444; + color: #fff; +} + ol.steps li.current { border-left: 5px solid #82b92e; background-color: #545454; From 936a7e839f617e46b7b2964f45d7866d0150ce4d Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Tue, 9 Jul 2019 17:18:37 +0200 Subject: [PATCH 292/460] Added success and error messages when change the event owner - #4309 --- pandora_console/include/javascript/pandora_events.js | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index c459ab0443..2ca786326e 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -498,7 +498,6 @@ function event_change_owner() { if (data == "owner_ok") { dt_events.draw(false); $("#notification_owner_success").show(); - console.log(new_owner); if (new_owner == -1) { new_owner = ""; } From 7fd284f1059d64cfd65e3596daab28a4b7291ff9 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Tue, 9 Jul 2019 17:36:40 +0200 Subject: [PATCH 293/460] Fixed visual bugs in green and black theme - #4194 --- .../include/styles/pandora_black.css | 6 +++--- .../include/styles/pandora_green_old.css | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css index 4df56da344..030eae88ca 100644 --- a/pandora_console/include/styles/pandora_black.css +++ b/pandora_console/include/styles/pandora_black.css @@ -110,12 +110,12 @@ table.widget_list td.datos2 { } .fileupload_form { - background-color: #222; + background-color: #222 !important; } #drop_file { - background-color: #444; - color: #fff; + background-color: #444 !important; + color: #fff !important; } ol.steps li.current { diff --git a/pandora_console/include/styles/pandora_green_old.css b/pandora_console/include/styles/pandora_green_old.css index a9fbdf7f80..4b5c875f83 100644 --- a/pandora_console/include/styles/pandora_green_old.css +++ b/pandora_console/include/styles/pandora_green_old.css @@ -49,16 +49,20 @@ ul.subsubmenu li { } .godmode { - border-top: 1px solid #f1f1f1; + border-top: 1px solid #ddd; } .menu li ul { - border: 1px solid #f1f1f1; + border: 1px solid #eee; } #title_menu, .submenu_text { - color: #9c9c9c; + color: #666; +} +#title_menu:hover, +.submenu_text:hover { + color: #b9b9b9; } .button_collapse, @@ -100,7 +104,6 @@ div#foot span { } /* General styles */ - body, div#page { background: #ecfad6; @@ -123,6 +126,13 @@ div#page { filter: brightness(2.5) contrast(3.5); } +table.widget_list tr.datos, +table.widget_list tr.datos2, +table.widget_list td.datos, +table.widget_list td.datos2 { + background-color: #ecfad6; +} + /* tables.css */ .info_table tr:first-child > th { background-color: #343434; From 85e40b30dceac6bd0a41c365f3d616daaddf6377 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 9 Jul 2019 17:54:23 +0200 Subject: [PATCH 294/460] Fix: user filter load tags --- pandora_console/operation/events/events.php | 85 +++++++++++---------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index da7123e728..9561872288 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -334,6 +334,50 @@ if (is_ajax()) { exit; } +/* + * Load user default form. + */ + +$user_filter = db_get_row_sql( + sprintf( + 'SELECT f.id_filter, f.id_name + FROM tevent_filter f + INNER JOIN tusuario u + ON u.default_event_filter=f.id_filter + WHERE u.id_user = "%s" ', + $config['id_user'] + ) +); +if ($user_filter !== false) { + $filter = events_get_event_filter($user_filter['id_filter']); + if ($filter !== false) { + $id_group = $filter['id_group']; + $event_type = $filter['event_type']; + $severity = $filter['severity']; + $status = $filter['status']; + $search = $filter['search']; + $text_agent = $filter['text_agent']; + $id_agent = $filter['id_agent']; + $id_agent_module = $filter['id_agent_module']; + $pagination = $filter['pagination']; + $event_view_hr = $filter['event_view_hr']; + $id_user_ack = $filter['id_user_ack']; + $group_rep = $filter['group_rep']; + $tag_with = json_decode(io_safe_output($filter['tag_with'])); + $tag_without = json_decode(io_safe_output($filter['tag_without'])); + + $tag_with_base64 = base64_encode(json_encode($tag_with)); + $tag_without_base64 = base64_encode(json_encode($tag_without)); + + $filter_only_alert = $filter['filter_only_alert']; + $id_group_filter = $filter['id_group_filter']; + $date_from = $filter['date_from']; + $date_to = $filter['date_to']; + $source = $filter['source']; + $id_extra = $filter['id_extra']; + $user_comment = $filter['user_comment']; + } +} // TAGS. // Get the tags where the user have permissions in Events reading tasks. @@ -736,47 +780,6 @@ if (is_metaconsole() !== true) { } } -/* - * Load user default form. - */ - -$user_filter = db_get_row_sql( - sprintf( - 'SELECT f.id_filter, f.id_name - FROM tevent_filter f - INNER JOIN tusuario u - ON u.default_event_filter=f.id_filter - WHERE u.id_user = "%s" ', - $config['id_user'] - ) -); -if ($user_filter !== false) { - $filter = events_get_event_filter($user_filter['id_filter']); - if ($filter !== false) { - $id_group = $filter['id_group']; - $event_type = $filter['event_type']; - $severity = $filter['severity']; - $status = $filter['status']; - $search = $filter['search']; - $text_agent = $filter['text_agent']; - $id_agent = $filter['id_agent']; - $id_agent_module = $filter['id_agent_module']; - $pagination = $filter['pagination']; - $event_view_hr = $filter['event_view_hr']; - $id_user_ack = $filter['id_user_ack']; - $group_rep = $filter['group_rep']; - $tag_with = $filter['tag_with']; - $tag_without = $filter['tag_without']; - $filter_only_alert = $filter['filter_only_alert']; - $id_group_filter = $filter['id_group_filter']; - $date_from = $filter['date_from']; - $date_to = $filter['date_to']; - $source = $filter['source']; - $id_extra = $filter['id_extra']; - $user_comment = $filter['user_comment']; - } -} - /* * Load filter form. */ From 5b6e7d13cd8f528cc7a0aaf295b96ba5a32383ea Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Tue, 9 Jul 2019 18:13:46 +0200 Subject: [PATCH 295/460] changed condition for saml no access --- pandora_console/index.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/pandora_console/index.php b/pandora_console/index.php index 22a5f46179..5b724c52dc 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -359,15 +359,21 @@ if (! isset($config['id_user'])) { $nick_in_db = $_SESSION['prepared_login_da']['id_user']; $expired_pass = false; } else if (($config['auth'] == 'saml') && ($login_button_saml)) { - if (!include_once 'include/auth/saml.php') { + $saml_configured = include_once $config['homedir'].'/'.ENTERPRISE_DIR.'/include/auth/saml.php'; + + if (!$saml_configured) { include_once 'general/noaccesssaml.php'; - } else { - $saml_user_id = saml_process_user_login(); } + $saml_user_id = saml_process_user_login(); + + if (!$saml_user_id) { + include_once 'general/noaccesssaml.php'; + } + + $nick_in_db = $saml_user_id; if (!$nick_in_db) { - include_once 'general/noaccesssaml.php'; include_once $config['saml_path'].'simplesamlphp/lib/_autoload.php'; $as = new SimpleSAML_Auth_Simple($config['saml_source']); $as->logout(); From ca237a0fc4ab24bf0a27e4cfec2232ed87d9138e Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 10 Jul 2019 00:01:10 +0200 Subject: [PATCH 296/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 6f8d1f824d..940dfe083f 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190709 +Version: 7.0NG.736-190710 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 1234a20b06..1ff1a4514b 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190709" +pandora_version="7.0NG.736-190710" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 5be1d49311..8a6a6c2643 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190709'; +use constant AGENT_BUILD => '190710'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 23d3afc120..0d413c7fa1 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190709 +%define release 190710 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 7320e5a83d..6ce012ae4f 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190709 +%define release 190710 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index ae6028674d..8434f711d4 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190709" +PI_BUILD="190710" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 7f4138dd8a..f05a229bc3 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190709} +{190710} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index dc6658a299..9790174b11 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190709)") +#define PANDORA_VERSION ("7.0NG.736(Build 190710)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 7589ae4e1f..4e4ab15cf8 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190709))" + VALUE "ProductVersion", "(7.0NG.736(Build 190710))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 09c13f639d..5e26ed9f29 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190709 +Version: 7.0NG.736-190710 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 1e2e36c157..038f128c6f 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190709" +pandora_version="7.0NG.736-190710" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 57121de09a..d5255f5809 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190709'; +$build_version = 'PC190710'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 1f7283c155..e59483e657 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index da6d2103e1..3687124ebb 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190709 +%define release 190710 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 222a596040..4ad259da7e 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190709 +%define release 190710 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 0c14c07255..145ec86518 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190709" +PI_BUILD="190710" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index dd4417cb0b..ea5468bf0f 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190709"; +my $version = "7.0NG.736 PS190710"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 6b2567e178..edee1d5175 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190709"; +my $version = "7.0NG.736 PS190710"; # save program name for logging my $progname = basename($0); From 8c7745768c86e893d3b665d0eb8732a2441fb02b Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Wed, 10 Jul 2019 11:05:06 +0200 Subject: [PATCH 297/460] Added success and error messages when change the event owner - #4309 --- .../include/javascript/pandora_events.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 2ca786326e..5727e200f5 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -495,14 +495,22 @@ function event_change_owner() { $("#button-owner_button").removeAttr("disabled"); $("#response_loading").hide(); + if ($("#notification_owner_success").length) { + $("#notification_owner_success").hide(); + } + + if ($("#notification_owner_error").length) { + $("#notification_owner_error").hide(); + } + if (data == "owner_ok") { dt_events.draw(false); $("#notification_owner_success").show(); if (new_owner == -1) { - new_owner = ""; + new_owner = "N/A"; } - $("#extended_event_general_page table td.general_owner").text( - new_owner + $("#extended_event_general_page table td.general_owner").html( + "" + new_owner + "" ); } else { $("#notification_owner_error").show(); From bfb78971495ef29441f491332c2e0cd9c0fdc333 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Wed, 10 Jul 2019 12:15:41 +0200 Subject: [PATCH 298/460] Added success and error messages when change the event status - #4309 --- pandora_console/include/functions_events.php | 2 + .../include/javascript/pandora_events.js | 53 ++++++++++++------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 24efd1215e..e368651a12 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -4467,6 +4467,8 @@ function events_page_general($event) $data[1] = ''.__('N/A').''; } + $table_general->cellclass[7][1] = 'general_status'; + $table_general->data[] = $data; $data = []; diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 5727e200f5..c50d755fc0 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -437,19 +437,18 @@ function event_change_status(event_ids) { var meta = $("#hidden-meta").val(); var history = $("#hidden-history").val(); - var params = []; - params.push("page=include/ajax/events"); - params.push("change_status=1"); - params.push("event_ids=" + event_ids); - params.push("new_status=" + new_status); - params.push("meta=" + meta); - params.push("history=" + history); - $("#button-status_button").attr("disabled", "disabled"); $("#response_loading").show(); jQuery.ajax({ - data: params.join("&"), + data: { + page: "include/ajax/events", + change_status: 1, + event_ids: event_ids, + new_status: new_status, + meta: meta, + history: history + }, type: "POST", url: $("#hidden-ajax_file").val(), async: true, @@ -457,12 +456,25 @@ function event_change_status(event_ids) { success: function(data) { $("#button-status_button").removeAttr("disabled"); $("#response_loading").hide(); - show_event_dialog( - event_id, - $("#hidden-group_rep").val(), - "responses", - data - ); + + if ($("#notification_status_success").length) { + $("#notification_status_success").hide(); + } + + if ($("#notification_status_error").length) { + $("#notification_status_error").hide(); + } + console.log(data); + if (data == "status_ok") { + dt_events.draw(false); + $("#notification_status_success").show(); + + $("#extended_event_general_page table td.general_status").text( + new_status + ); + } else { + $("#notification_status_error").show(); + } } }); return false; @@ -507,11 +519,14 @@ function event_change_owner() { dt_events.draw(false); $("#notification_owner_success").show(); if (new_owner == -1) { - new_owner = "N/A"; + $("#extended_event_general_page table td.general_owner").html( + "N/A" + ); + } else { + $("#extended_event_general_page table td.general_owner").text( + new_owner + ); } - $("#extended_event_general_page table td.general_owner").html( - "" + new_owner + "" - ); } else { $("#notification_owner_error").show(); } From 1f8e1439634e9f06a9dae6188d36e627110aacd2 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Wed, 10 Jul 2019 13:04:06 +0200 Subject: [PATCH 299/460] Fixed bug to change the event status in modal window - #4309 --- pandora_console/include/ajax/events.php | 3 +++ pandora_console/include/javascript/pandora_events.js | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index a7d23ca015..22eb1d7836 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -1139,6 +1139,7 @@ if ($get_extended_event) { $dialog_page = get_parameter('dialog_page', 'general'); $filter = get_parameter('filter', []); + $similar_ids = get_parameter('similar_ids', $event_id); $group_rep = $filter['group_rep']; $event_rep = $event['event_rep']; $timestamp_first = $event['min_timestamp']; @@ -1146,6 +1147,8 @@ if ($get_extended_event) { $server_id = $event['server_id']; $comments = $event['comments']; + $event['similar_ids'] = $similar_ids; + if (!isset($comments)) { $comments = $event['user_comment']; } diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index c50d755fc0..0fb6c1a6ef 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -464,14 +464,10 @@ function event_change_status(event_ids) { if ($("#notification_status_error").length) { $("#notification_status_error").hide(); } - console.log(data); + if (data == "status_ok") { dt_events.draw(false); $("#notification_status_success").show(); - - $("#extended_event_general_page table td.general_status").text( - new_status - ); } else { $("#notification_status_error").show(); } From 6382cb2abefc0894443c74512352bc1ad7222335 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 10 Jul 2019 14:18:23 +0200 Subject: [PATCH 300/460] fixed errors with graphs in meta --- pandora_console/include/functions_events.php | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index f9a1271c18..b13137c06c 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -25,13 +25,17 @@ * GNU General Public License for more details. * ============================================================================ */ +global $config; require_once $config['homedir'].'/include/functions_ui.php'; require_once $config['homedir'].'/include/functions_tags.php'; require_once $config['homedir'].'/include/functions.php'; +require_once $config['homedir'].'/include/functions_reporting.php'; +enterprise_include_once('include/functions_metaconsole.php'); enterprise_include_once('meta/include/functions_events_meta.php'); enterprise_include_once('meta/include/functions_agents_meta.php'); enterprise_include_once('meta/include/functions_modules_meta.php'); +enterprise_include_once('meta/include/functions_events_meta.php'); /** @@ -4848,10 +4852,6 @@ function events_get_count_events_by_agent( $tagente = 'tagente'; $tevento = 'tevento'; - if ($dbmeta) { - $tagente = 'tmetaconsole_agent'; - $tevento = 'tmetaconsole_event'; - } $sql = sprintf( 'SELECT id_agente, @@ -5028,9 +5028,6 @@ function events_get_count_events_validated_by_user( } $tevento = 'tevento'; - if ($dbmeta) { - $tevento = 'tmetaconsole_event'; - } $sql = sprintf( 'SELECT id_usuario, @@ -5206,9 +5203,6 @@ function events_get_count_events_by_criticity( } $tevento = 'tevento'; - if ($dbmeta) { - $tevento = 'tmetaconsole_event'; - } $sql = sprintf( 'SELECT criticity, @@ -5414,9 +5408,6 @@ function events_get_count_events_validated( } $tevento = 'tevento'; - if ($dbmeta) { - $tevento = 'tmetaconsole_event'; - } $sql = sprintf('SELECT estado, COUNT(*) AS count FROM %s WHERE %s %s GROUP BY estado', $tevento, $sql_filter, $sql_where); From 3b23810323b71a77b51d82dd6effa7d16fe6ddeb Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Wed, 10 Jul 2019 16:37:24 +0200 Subject: [PATCH 301/460] Added filter by agent in massive copy - #4318 --- .../godmode/massive/massive_copy_modules.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/massive/massive_copy_modules.php b/pandora_console/godmode/massive/massive_copy_modules.php index 5ca25ebc11..36ab0c310c 100755 --- a/pandora_console/godmode/massive/massive_copy_modules.php +++ b/pandora_console/godmode/massive/massive_copy_modules.php @@ -273,6 +273,9 @@ $table->data[1][1] = html_print_select( true ); +$table->data['form_agents_filter'][0] = __('Filter Agents'); +$table->data['form_agents_filter'][1] = html_print_input_text('filter_agents', '', '', 20, 255, true); + $table->data[2][0] = __('Agent'); $table->data[2][0] .= '
    '; + echo ''; } } return $output; } - - diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 0050ccdf9d..6a9620f3e8 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3094,38 +3094,7 @@ function ui_print_datatable(array $parameters) $filter .= '
      '; foreach ($parameters['form']['inputs'] as $input) { - $filter .= '
    • '; - $filter .= ''; - if ($input['type'] != 'select') { - $filter .= ''; - } else { - // Select. - $filter .= ''; - } - - $filter .= '
    • '; + $filter .= html_print_input(($input + ['return' => true]), 'li'); } $filter .= '
    • '; diff --git a/pandora_console/include/styles/deployment_list.css b/pandora_console/include/styles/deployment_list.css new file mode 100644 index 0000000000..ca5385f3f5 --- /dev/null +++ b/pandora_console/include/styles/deployment_list.css @@ -0,0 +1,12 @@ +ul.wizard li > label:not(.p-switch) { + width: auto; +} + +ul.wizard { + display: flex; + flex-direction: row; +} + +ul.wizard li { + margin-right: 1em; +} diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 95d6caadfd..ab6cf9a32c 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -810,6 +810,41 @@ CREATE TABLE IF NOT EXISTS `trecon_task` ( KEY `recon_task_daemon` (`id_recon_server`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- ---------------------------------------------------------------------- +-- Table `ttask_credentials` +-- ---------------------------------------------------------------------- +CREATE TABLE `ttask_credentials` ( + `id_rt` int(10) unsigned NOT NULL, + `identifier` varchar(100) NOT NULL, + PRIMARY KEY (`id_rt`,`identifier`), + KEY `identifier` (`identifier`), + FOREIGN KEY (`id_rt`) REFERENCES `trecon_task` (`id_rt`) + ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (`identifier`) REFERENCES `tcredential_store` (`identifier`) + ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------------------------------------------------- +-- Table `tdeployment_hosts` +-- ---------------------------------------------------------------------- +CREATE TABLE `tdeployment_hosts` ( + `id` SERIAL, + `id_cs` VARCHAR(100), + `ip` VARCHAR(100) NOT NULL, + `id_os` INT(10) UNSIGNED DEFAULT 0, + `os_version` VARCHAR(100) DEFAULT '' COMMENT "OS version in STR format", + `arch` ENUM('x64', 'x86') DEFAULT 'x64', + `current_agent_version` VARCHAR(100) DEFAULT '', + `desired_agent_version` VARCHAR(100) DEFAULT '', + `deployed` bigint(20) unsigned COMMENT "When it was deployed", + `last_err` text, + PRIMARY KEY (`id`), + FOREIGN KEY (`id_cs`) REFERENCES `tcredential_store` (`identifier`) + ON UPDATE CASCADE ON DELETE SET NULL, + FOREIGN KEY (`id_os`) REFERENCES tconfig_os(`id_os`) + ON UPDATE CASCADE ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + -- ---------------------------------------------------------------------- -- Table `tmodule_relationship` -- ---------------------------------------------------------------------- diff --git a/pandora_server/lib/PandoraFMS/Recon/Base.pm b/pandora_server/lib/PandoraFMS/Recon/Base.pm index 23532d843b..6c3e1b9ed5 100644 --- a/pandora_server/lib/PandoraFMS/Recon/Base.pm +++ b/pandora_server/lib/PandoraFMS/Recon/Base.pm @@ -31,7 +31,9 @@ use constant { DISCOVERY_APP_MYSQL => 4, DISCOVERY_APP_ORACLE => 5, DISCOVERY_CLOUD_AWS_EC2 => 6, - DISCOVERY_CLOUD_AWS_RDS => 7 + DISCOVERY_CLOUD_AWS_RDS => 7, + DISCOVERY_CLOUD_AZURE_COMPUTE => 8, + DISCOVERY_DEPLOY_AGENTS => 9, }; # /dev/null From 45c9db2b69ef02919cc09746faa479f57120815e Mon Sep 17 00:00:00 2001 From: artica Date: Thu, 11 Jul 2019 00:01:12 +0200 Subject: [PATCH 305/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 940dfe083f..9a0b872a6e 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190710 +Version: 7.0NG.736-190711 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 1ff1a4514b..4d84020703 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190710" +pandora_version="7.0NG.736-190711" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 8a6a6c2643..8a6ac38d5f 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190710'; +use constant AGENT_BUILD => '190711'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 0d413c7fa1..c9f7f10dc0 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190710 +%define release 190711 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 6ce012ae4f..8d1ff4fc15 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190710 +%define release 190711 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 8434f711d4..52b49cca0c 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190710" +PI_BUILD="190711" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index f05a229bc3..efa43a74ee 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190710} +{190711} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 9790174b11..75fb3cbe98 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190710)") +#define PANDORA_VERSION ("7.0NG.736(Build 190711)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 4e4ab15cf8..392c639976 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190710))" + VALUE "ProductVersion", "(7.0NG.736(Build 190711))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 5e26ed9f29..32efed3e39 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190710 +Version: 7.0NG.736-190711 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 038f128c6f..68e0aa147f 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190710" +pandora_version="7.0NG.736-190711" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index d5255f5809..f72acc3ef6 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190710'; +$build_version = 'PC190711'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index e59483e657..e0c24fd2c6 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
      [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 3687124ebb..230fbad5e8 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190710 +%define release 190711 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 4ad259da7e..0cee7965f4 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190710 +%define release 190711 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 145ec86518..48ace9e334 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190710" +PI_BUILD="190711" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index ea5468bf0f..f655b5bcb0 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190710"; +my $version = "7.0NG.736 PS190711"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index edee1d5175..7172389c25 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190710"; +my $version = "7.0NG.736 PS190711"; # save program name for logging my $progname = basename($0); From a8019fd2230b76ce8a1f4a03a0b1cb2baef68d26 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Thu, 11 Jul 2019 10:49:48 +0200 Subject: [PATCH 306/460] Changed images with transparent borders - #4351 --- pandora_console/images/user_email.png | Bin 546 -> 486 bytes .../images/wizard/customnetscan.png | Bin 2477 -> 2929 bytes pandora_console/images/wizard/netscan.png | Bin 9083 -> 9512 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/pandora_console/images/user_email.png b/pandora_console/images/user_email.png index 095b012a5c38adf90de83209e84d39f7b23c0b31..446c90f7604af0f388d5ba700bb9b96b17648a3e 100644 GIT binary patch delta 432 zcmV;h0Z;y-1m**f90dWhvs|r_At--{Nkl)A~G`aKZs^Rl1KyyAO;j= zFeO0nfeA@k03d)EZ~>Uf?~znp0Ad3sELshKSP&q97>EWS=Oh5>`AA}hOi%$qm;ex; zhgo(W>gN3*4hvLJ0oe$E03r#&Jm)}2;qv9n4H~=Hmy#@r-eE@p=0xYKX<5LI?R&ert4-KXVcod#T zPU|2}ASj&C6e=P|6mrHm4|EquLnG9Ug6Lt-f@~c$-+mVpuVAA5=a^I2qkWqkX&>C8Vu`6h&&(xs3XopOAnYi av;zPGvvIx*6!@?J00003#0! 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 diff --git a/pandora_console/images/wizard/netscan.png b/pandora_console/images/wizard/netscan.png index c90f4ddc5da30015144d716d5611d9bf2be96c69..66894fb4467d56b9784d6019d5ae42eff0a3e05c 100644 GIT binary patch literal 9512 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 literal 9083 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 From 467ee5fb8f8760805b4ff8e122bfe49a1bc2df3d Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 11 Jul 2019 12:01:19 +0200 Subject: [PATCH 307/460] Minor errata fix --- pandora_server/lib/PandoraFMS/DiscoveryServer.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm index 8993826931..e70d871042 100644 --- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm +++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm @@ -190,7 +190,7 @@ sub data_consumer ($$) { my %cnf_extra; my $r = enterprise_hook('discovery_generate_extra_cnf',[$pa_config, $dbh, $task, \%cnf_extra]); - if (isset($r) && $r eq 'ERR') { + if (defined($r) && $r eq 'ERR') { # Could not generate extra cnf, skip this task. return; } From 518443ea4eac508039100452f9b7a937ecc9621f Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 11 Jul 2019 12:32:48 +0200 Subject: [PATCH 308/460] Improved menus --- pandora_console/godmode/menu.php | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index 09a2aff770..c9d9902b86 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -24,23 +24,24 @@ $menu_godmode['class'] = 'godmode'; if (check_acl($config['id_user'], 0, 'PM')) { $sub = []; - $sub['godmode/servers/discovery&wiz=main']['text'] = __('Discovery Main'); + $sub['godmode/servers/discovery&wiz=main']['text'] = __('Main'); $sub['godmode/servers/discovery&wiz=main']['id'] = 'Discovery'; $sub['godmode/servers/discovery&wiz=tasklist']['text'] = __('Task list'); $sub['godmode/servers/discovery&wiz=tasklist']['id'] = 'tasklist'; - $sub['godmode/servers/discovery&wiz=app']['text'] = __('Applications'); - $sub['godmode/servers/discovery&wiz=app']['id'] = 'app'; - - $sub['godmode/servers/discovery&wiz=cloud']['text'] = __('Cloud'); - $sub['godmode/servers/discovery&wiz=cloud']['id'] = 'cloud'; - - $sub['godmode/servers/discovery&wiz=ctask']['text'] = __('Console task'); - $sub['godmode/servers/discovery&wiz=ctask']['id'] = 'ctask'; - + $sub2 = []; + $sub2['godmode/servers/discovery&wiz=hd&mode=netscan']['text'] = __('Network scan'); + enterprise_hook('hostdevices_submenu'); + $sub2['godmode/servers/discovery&wiz=hd&mode=customnetscan']['text'] = __('Custom network scan'); + $sub2['godmode/servers/discovery&wiz=hd&mode=managenetscanscripts']['text'] = __('Manage scan scripts'); $sub['godmode/servers/discovery&wiz=hd']['text'] = __('Host & devices'); $sub['godmode/servers/discovery&wiz=hd']['id'] = 'hd'; + $sub['godmode/servers/discovery&wiz=hd']['sub2'] = $sub2; + + enterprise_hook('applications_menu'); + enterprise_hook('cloud_menu'); + enterprise_hook('console_task_menu'); // Add to menu. $menu_godmode['discovery']['text'] = __('Discovery'); From bd070b706bad475c94d758091b9785397aca37f4 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Martin Date: Thu, 11 Jul 2019 12:45:52 +0200 Subject: [PATCH 309/460] fixed minor error --- pandora_console/general/register.php | 32 +++++++++---------- .../include/class/ConsoleSupervisor.php | 2 +- pandora_console/include/functions_config.php | 8 +++++ pandora_console/operation/users/user_edit.php | 31 +++++++++--------- 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/pandora_console/general/register.php b/pandora_console/general/register.php index e6a26bb250..b1d58aada4 100644 --- a/pandora_console/general/register.php +++ b/pandora_console/general/register.php @@ -122,7 +122,6 @@ if (is_ajax()) { exit(); } - ui_require_css_file('register'); $initial = isset($config['initial_wizard']) !== true @@ -150,26 +149,27 @@ if ($initial && users_is_admin()) { ); } -if ($registration && users_is_admin()) { - // Prepare registration wizard, not launch. leave control to flow. - registration_wiz_modal( - false, - // Launch only if not being launch from 'initial'. - !$initial, - (($show_newsletter === true) ? 'force_run_newsletter()' : null) - ); -} else { - if ($show_newsletter) { - // Show newsletter wizard for current user. - newsletter_wiz_modal( +if (!$config['disabled_newsletter']) { + if ($registration && users_is_admin()) { + // Prepare registration wizard, not launch. leave control to flow. + registration_wiz_modal( false, - // Launch only if not being call from 'registration'. - !$registration && !$initial + // Launch only if not being launch from 'initial'. + !$initial, + (($show_newsletter === true) ? 'force_run_newsletter()' : null) ); + } else { + if ($show_newsletter) { + // Show newsletter wizard for current user. + newsletter_wiz_modal( + false, + // Launch only if not being call from 'registration'. + !$registration && !$initial + ); + } } } - $newsletter = null; ?> diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index af688fb5a0..d03b360c16 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -1976,7 +1976,7 @@ class ConsoleSupervisor 'id_user', $config['id_user'] ); - if (license_free() === true + if (!$config['disabled_newsletter'] && $newsletter != 1 && $login === false ) { diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index 0964cf59a3..558260f7a8 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -395,6 +395,10 @@ function config_update_config() $error_update[] = __('Enable Update Manager'); } + if (!config_update_value('disabled_newsletter', get_parameter('disabled_newsletter'))) { + $error_update[] = __('Disabled newsletter'); + } + if (!config_update_value('ipam_ocuppied_critical_treshold', get_parameter('ipam_ocuppied_critical_treshold'))) { $error_update[] = __('Ipam Ocuppied Manager Critical'); } @@ -1723,6 +1727,10 @@ function config_process_config() config_update_value('enable_update_manager', 1); } + if (!isset($config['disabled_newsletter'])) { + config_update_value('disabled_newsletter', 0); + } + if (!isset($config['ipam_ocuppied_critical_treshold'])) { config_update_value('ipam_ocuppied_critical_treshold', 90); } diff --git a/pandora_console/operation/users/user_edit.php b/pandora_console/operation/users/user_edit.php index 9e267c5c2d..b8b42ad945 100644 --- a/pandora_console/operation/users/user_edit.php +++ b/pandora_console/operation/users/user_edit.php @@ -426,24 +426,25 @@ if (check_acl($config['id_user'], 0, 'ER')) { ).''; } +if (!$config['disabled_newsletter']) { + $newsletter = ''; + $newsletter_reminder = '

    '.__('Newsletter Reminder').':

    '; + $newsletter_reminder .= html_print_switch( + [ + 'name' => 'newsletter_reminder', + 'value' => $newsletter_reminder_value, + 'disabled' => false, + ] + ); + } -$newsletter = '

    '.__('Newsletter Subscribed').':

    '; -if ($user_info['middlename'] > 0) { - $newsletter .= ''.__('Already subscribed to %s newsletter', get_product_name()).''; -} else { - $newsletter .= ''.__('Subscribe to our newsletter').'
    '; - $newsletter_reminder = '

    '.__('Newsletter Reminder').':

    '; - $newsletter_reminder .= html_print_switch( - [ - 'name' => 'newsletter_reminder', - 'value' => $newsletter_reminder_value, - 'disabled' => false, - ] - ); + $newsletter_reminder .= '
    '; } -$newsletter_reminder .= '
    '; - $autorefresh_list_out = []; From 7c8cb75fafa417bff8a7893e0c095922ee0ed5e8 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 11 Jul 2019 13:25:29 +0200 Subject: [PATCH 310/460] WIP discovery agent deployment --- pandora_console/godmode/servers/discovery.php | 14 +++++++++++++- .../godmode/wizards/HostDevices.class.php | 2 ++ pandora_console/godmode/wizards/Wizard.main.php | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/servers/discovery.php b/pandora_console/godmode/servers/discovery.php index a2c0abd5d6..edf7cc989e 100755 --- a/pandora_console/godmode/servers/discovery.php +++ b/pandora_console/godmode/servers/discovery.php @@ -42,7 +42,19 @@ function get_wiz_class($str) return 'ConsoleTasks'; default: - // Ignore. + // Main, show header. + ui_print_page_header( + __('Discovery'), + '', + false, + '', + true, + '', + false, + '', + GENERIC_SIZE_TEXT, + '' + ); return null; } } diff --git a/pandora_console/godmode/wizards/HostDevices.class.php b/pandora_console/godmode/wizards/HostDevices.class.php index 8982d76d4b..210717ff1b 100755 --- a/pandora_console/godmode/wizards/HostDevices.class.php +++ b/pandora_console/godmode/wizards/HostDevices.class.php @@ -800,6 +800,7 @@ class HostDevices extends Wizard }).change();'; $this->printFormAsGrid($form); + $this->printGoBackButton($this->url.'&page='.($this->page - 1)); } } @@ -892,6 +893,7 @@ class HostDevices extends Wizard ]; $this->printFormAsList($form); + $this->printGoBackButton($this->url.'&mode=netscan&task='.$this->task['id_rt'].'&page='.($this->page - 1)); } if ($this->page == 2) { diff --git a/pandora_console/godmode/wizards/Wizard.main.php b/pandora_console/godmode/wizards/Wizard.main.php index d6bd9eaee3..a8294d3adb 100644 --- a/pandora_console/godmode/wizards/Wizard.main.php +++ b/pandora_console/godmode/wizards/Wizard.main.php @@ -335,6 +335,7 @@ class Wizard ], 'inputs' => [ [ + 'class' => 'w100p', 'arguments' => [ 'name' => 'submit', 'label' => __('Go back'), From fd24398219c0501c9b5c4f0340dbb027dd98e767 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Thu, 11 Jul 2019 14:46:41 +0200 Subject: [PATCH 311/460] Fixed several minor visual bugs - #4347 --- pandora_console/godmode/massive/massive_add_profiles.php | 4 +++- pandora_console/godmode/massive/massive_delete_profiles.php | 4 +++- pandora_console/godmode/setup/setup_visuals.php | 2 +- pandora_console/include/styles/pandora.css | 5 ++--- .../operation/agentes/pandora_networkmap.editor.php | 4 ++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/pandora_console/godmode/massive/massive_add_profiles.php b/pandora_console/godmode/massive/massive_add_profiles.php index 6000dbe9a6..e337c09f81 100644 --- a/pandora_console/godmode/massive/massive_add_profiles.php +++ b/pandora_console/godmode/massive/massive_add_profiles.php @@ -84,7 +84,9 @@ if ($create_profiles) { ); } -html_print_table($table); +if ($table !== null) { + html_print_table($table); +} unset($table); diff --git a/pandora_console/godmode/massive/massive_delete_profiles.php b/pandora_console/godmode/massive/massive_delete_profiles.php index 068f9ee02d..776e72616d 100644 --- a/pandora_console/godmode/massive/massive_delete_profiles.php +++ b/pandora_console/godmode/massive/massive_delete_profiles.php @@ -92,7 +92,9 @@ if ($delete_profiles) { ); } -html_print_table($table); +if ($table !== null) { + html_print_table($table); +} unset($table); diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 6e73913b56..0e7e41e7d6 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -1505,7 +1505,7 @@ $(document).ready (function () { .prop('checked'); display_custom_report_front(custom_report,$(this).parent().parent().parent().parent().parent().attr('id')); }); - $(".databox.filters").css('margin-bottom','-10px'); + $(".databox.filters").css('margin-bottom','0px'); }); // Change the favicon preview when is changed diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index de13b884ff..f688186567 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -235,11 +235,12 @@ pre { font-family: courier, serif; } fieldset { - background-color: #f9faf9; + background-color: #fff; border: 1px solid #e2e2e2; padding: 0.5em; margin-bottom: 20px; position: relative; + border-radius: 5px; } fieldset legend { font-size: 1.1em; @@ -5791,7 +5792,6 @@ div#status_pie { grid-template-columns: 50px auto; } - /* * --------------------------------------------------------------------- * - IMAGES FOR STATUS. This replaces the images of /images/status_sets/default/ @@ -5834,7 +5834,6 @@ div#status_pie { * --------------------------------------------------------------------- */ - /* Table for show more info in events and config menu in modules graphs. (This class exists in events.css too) */ .table_modal_alternate { border-spacing: 0; diff --git a/pandora_console/operation/agentes/pandora_networkmap.editor.php b/pandora_console/operation/agentes/pandora_networkmap.editor.php index 4ed526a404..f5f5b92be1 100644 --- a/pandora_console/operation/agentes/pandora_networkmap.editor.php +++ b/pandora_console/operation/agentes/pandora_networkmap.editor.php @@ -383,14 +383,14 @@ if ($not_found) { html_print_table($table); - echo "
    "; + echo "
    "; if ($new_networkmap) { html_print_input_hidden('save_networkmap', 1); html_print_submit_button( __('Save networkmap'), 'crt', false, - 'class="sub"' + 'class="sub next"' ); } From 219852283d50057b9cdf183ebdcab74a1e9df570 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 11 Jul 2019 14:53:00 +0200 Subject: [PATCH 312/460] Fix in snmp browser tree --- pandora_console/include/functions_snmp_browser.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_console/include/functions_snmp_browser.php b/pandora_console/include/functions_snmp_browser.php index 5b485d9e54..dc423481f2 100644 --- a/pandora_console/include/functions_snmp_browser.php +++ b/pandora_console/include/functions_snmp_browser.php @@ -173,7 +173,6 @@ function snmp_browser_get_html_tree( $last_array, $sufix, $checked, - $return, $descriptive_ids, $previous_id ); From 1dbf8240c4ba515fd58401f330f1c13029558aaf Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Thu, 11 Jul 2019 15:51:35 +0200 Subject: [PATCH 313/460] deelted duplicated count --- pandora_console/operation/search_policies.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_console/operation/search_policies.php b/pandora_console/operation/search_policies.php index 6277318f66..7e31db1220 100644 --- a/pandora_console/operation/search_policies.php +++ b/pandora_console/operation/search_policies.php @@ -84,7 +84,6 @@ if (!$policies || !$searchpolicies) { $totalPolicies = count($policies); echo '
    '; - ui_pagination($totalPolicies); html_print_table($table); unset($table); ui_pagination($totalPolicies); From f701bcb44ee028445858a1d3627a9f98c26bfa6c Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Thu, 11 Jul 2019 17:00:50 +0200 Subject: [PATCH 314/460] Fixed several minor visual bugs - #4347 --- .../godmode/reporting/reporting_builder.php | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 1e552b112a..d499fc35df 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -774,14 +774,14 @@ switch ($action) { $table->head[1] = __('Description'); $table->head[2] = __('HTML'); $table->head[3] = __('XML'); - $table->size[0] = '60%'; + $table->size[0] = '50%'; $table->size[1] = '20%'; $table->size[2] = '2%'; - $table->headstyle[2] = 'min-width: 35px;text-align: center;'; + $table->headstyle[2] = 'min-width: 35px;text-align: left;'; $table->size[3] = '2%'; - $table->headstyle[3] = 'min-width: 35px;text-align: center;'; + $table->headstyle[3] = 'min-width: 35px;text-align: left;'; $table->size[4] = '2%'; - $table->headstyle[4] = 'min-width: 35px;text-align: center;'; + $table->headstyle[4] = 'min-width: 35px;text-align: left;'; $next = 4; // Calculate dinamically the number of the column. @@ -790,15 +790,16 @@ switch ($action) { } $table->size[$next] = '2%'; - $table->style[$next] = 'text-align: center;'; + $table->style[$next] = 'text-align: left;'; - $table->headstyle[($next + 2)] = 'min-width: 100px;'; - $table->style[($next + 2)] = 'text-align: center;'; + $table->headstyle[($next + 2)] = 'min-width: 130px; text-align:right;'; + $table->style[($next + 2)] = 'text-align: right;'; // Admin options only for RM flag. if (check_acl($config['id_user'], 0, 'RM')) { $table->head[$next] = __('Private'); + $table->headstyle[$next] = 'min-width: 40px;text-align: left;'; $table->size[$next] = '2%'; if (defined('METACONSOLE')) { $table->align[$next] = ''; @@ -808,7 +809,9 @@ switch ($action) { $next++; $table->head[$next] = __('Group'); - $table->size[$next] = '15%'; + $table->headstyle[$next] = 'min-width: 40px;text-align: left;'; + $table->size[$next] = '2%'; + $table->align[$next] = 'left'; $next++; $op_column = false; @@ -826,7 +829,7 @@ switch ($action) { // $table->size = array (); $table->size[$next] = '10%'; - $table->align[$next] = 'left'; + $table->align[$next] = 'right'; } $columnview = false; From 055bafe4d7b68dfe64fd6295004d92bd9ee13c4e Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Thu, 11 Jul 2019 17:28:22 +0200 Subject: [PATCH 315/460] changed UM to AW for search policies --- pandora_console/operation/search_main.php | 2 +- pandora_console/operation/search_policies.getdata.php | 2 +- pandora_console/operation/search_policies.php | 2 +- pandora_console/operation/search_results.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pandora_console/operation/search_main.php b/pandora_console/operation/search_main.php index c269b6481c..718fd45be5 100644 --- a/pandora_console/operation/search_main.php +++ b/pandora_console/operation/search_main.php @@ -20,7 +20,7 @@ $searchGraphs = check_acl($config['id_user'], 0, 'RR'); $searchMaps = check_acl($config['id_user'], 0, 'RR'); $searchReports = check_acl($config['id_user'], 0, 'RR'); $searchUsers = check_acl($config['id_user'], 0, 'UM'); -$searchPolicies = check_acl($config['id_user'], 0, 'UM'); +$searchPolicies = check_acl($config['id_user'], 0, 'AW'); $searchHelps = true; echo '
    '; diff --git a/pandora_console/operation/search_policies.getdata.php b/pandora_console/operation/search_policies.getdata.php index aec8298170..a8c05ea071 100644 --- a/pandora_console/operation/search_policies.getdata.php +++ b/pandora_console/operation/search_policies.getdata.php @@ -16,7 +16,7 @@ global $config; enterprise_include_once('include/functions_policies.php'); -$searchpolicies = check_acl($config['id'], 0, 'UM'); +$searchpolicies = check_acl($config['id'], 0, 'AW'); $selectpolicieIDUp = ''; $selectpolicieIDDown = ''; diff --git a/pandora_console/operation/search_policies.php b/pandora_console/operation/search_policies.php index 7e31db1220..26b3f7737d 100644 --- a/pandora_console/operation/search_policies.php +++ b/pandora_console/operation/search_policies.php @@ -16,7 +16,7 @@ global $config; enterprise_include_once('include/functions_policies.php'); require_once $config['homedir'].'/enterprise/include/functions_groups.php'; -$searchpolicies = check_acl($config['id_user'], 0, 'UM'); +$searchpolicies = check_acl($config['id_user'], 0, 'AW'); if (!$policies || !$searchpolicies) { echo "
    ".__('Zero results found')."
    \n"; diff --git a/pandora_console/operation/search_results.php b/pandora_console/operation/search_results.php index 11b4aedec9..803a92cdd1 100644 --- a/pandora_console/operation/search_results.php +++ b/pandora_console/operation/search_results.php @@ -18,7 +18,7 @@ require_once $config['homedir'].'/include/functions_reporting.php'; enterprise_include('operation/reporting/custom_reporting.php'); $searchAgents = $searchAlerts = $searchModules = check_acl($config['id_user'], 0, 'AR'); -$searchUsers = $searchPolicies = check_acl($config['id_user'], 0, 'UM'); +$searchUsers = $searchPolicies = check_acl($config['id_user'], 0, 'AW'); $searchMaps = $searchReports = $searchGraphs = check_acl($config['id_user'], 0, 'IR'); $searchMain = true; $searchHelps = true; From 1e05f9a3969393a77f6912f139fbd10a170541e1 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 11 Jul 2019 19:25:49 +0200 Subject: [PATCH 316/460] WIP agent deployment --- .../godmode/wizards/Wizard.main.php | 83 ++++++++++++------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/pandora_console/godmode/wizards/Wizard.main.php b/pandora_console/godmode/wizards/Wizard.main.php index a8294d3adb..8f0bb0bbd8 100644 --- a/pandora_console/godmode/wizards/Wizard.main.php +++ b/pandora_console/godmode/wizards/Wizard.main.php @@ -374,13 +374,24 @@ class Wizard if (is_array($input['block_content']) === true) { // Print independent block of inputs. - $output .= '
  • '; + if ($input['wrapper']) { + $output .= '
  • '; + $output .= '<'.$input['wrapper'].' id="'.$input['block_id'].'" class="'.$class.'">'; + } else { + $output .= '
  • '; + } + $output .= '
      '; foreach ($input['block_content'] as $input) { $output .= $this->printBlock($input, $return); } - $output .= '
  • '; + // Close block. + if ($input['wrapper']) { + $output .= ''; + } else { + $output .= ''; + } } else { if ($input['arguments']['type'] != 'hidden') { $output .= '
  • '; @@ -577,6 +588,7 @@ class Wizard $form = $data['form']; $inputs = $data['inputs']; $js = $data['js']; + $rawjs = $data['js_block']; $cb_function = $data['cb_function']; $cb_args = $data['cb_args']; @@ -624,6 +636,9 @@ class Wizard $output .= '
      '.$output_submit.'
    '; $output .= ''; $output .= ''; + if ($rawjs) { + $output .= $rawjs; + } if ($return === false) { echo $output; @@ -649,6 +664,7 @@ class Wizard $rows = $data['rows']; $js = $data['js']; + $rawjs = $data['js_block']; $cb_function = $data['cb_function']; $cb_args = $data['cb_args']; @@ -675,45 +691,47 @@ class Wizard $first_block_printed = false; - foreach ($rows as $row) { - if ($row['new_form_block'] == true) { - if ($first_block_printed === true) { - // If first form block has been placed, then close it before starting a new one. - $output .= '
  • '; - $output .= '
    '; - } else { - $output .= '
    '; + if (is_array($rows)) { + foreach ($rows as $row) { + if ($row['new_form_block'] == true) { + if ($first_block_printed === true) { + // If first form block has been placed, then close it before starting a new one. + $output .= '
    '; + $output .= '
    '; + } else { + $output .= '
    '; + } + + $first_block_printed = true; } - $first_block_printed = true; - } + $output .= '
    '; - $output .= '
    '; + foreach ($row['columns'] as $column) { + $width = isset($column['width']) ? 'width: '.$column['width'].';' : 'width: 100%;'; + $padding_left = isset($column['padding-left']) ? 'padding-left: '.$column['padding-left'].';' : 'padding-left: 0;'; + $padding_right = isset($column['padding-right']) ? 'padding-right: '.$column['padding-right'].';' : 'padding-right: 0;'; + $extra_styles = isset($column['style']) ? $column['style'] : ''; - foreach ($row['columns'] as $column) { - $width = isset($column['width']) ? 'width: '.$column['width'].';' : 'width: 100%;'; - $padding_left = isset($column['padding-left']) ? 'padding-left: '.$column['padding-left'].';' : 'padding-left: 0;'; - $padding_right = isset($column['padding-right']) ? 'padding-right: '.$column['padding-right'].';' : 'padding-right: 0;'; - $extra_styles = isset($column['style']) ? $column['style'] : ''; + $output .= '
    '; - $output .= '
    '; - - foreach ($column['inputs'] as $input) { - if (is_array($input)) { - if ($input['arguments']['type'] != 'submit') { - $output .= $this->printBlockAsGrid($input, true); + foreach ($column['inputs'] as $input) { + if (is_array($input)) { + if ($input['arguments']['type'] != 'submit') { + $output .= $this->printBlockAsGrid($input, true); + } else { + $output_submit .= $this->printBlockAsGrid($input, true); + } } else { - $output_submit .= $this->printBlockAsGrid($input, true); + $output .= $input; } - } else { - $output .= $input; } + + $output .= '
    '; } $output .= '
    '; } - - $output .= '
    '; } $output .= '
    '; @@ -721,6 +739,9 @@ class Wizard $output .= '
      '.$output_submit.'
    '; $output .= ''; $output .= ''; + if ($rawjs) { + $output .= $rawjs; + } if ($return === false) { echo $output; @@ -744,6 +765,7 @@ class Wizard $form = $data['form']; $inputs = $data['inputs']; $js = $data['js']; + $rawjs = $data['js_block']; $cb_function = $data['cb_function']; $cb_args = $data['cb_args']; @@ -781,6 +803,9 @@ class Wizard $output .= '
      '.$output_submit.'
    '; $output .= ''; $output .= ''; + if ($rawjs) { + $output .= $rawjs; + } if ($return === false) { echo $output; From fe981897792312de35a7374200285c8a4c730b15 Mon Sep 17 00:00:00 2001 From: artica Date: Fri, 12 Jul 2019 00:01:08 +0200 Subject: [PATCH 317/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 9a0b872a6e..b6ecacb2b4 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190711 +Version: 7.0NG.736-190712 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 4d84020703..c7f4f3334e 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190711" +pandora_version="7.0NG.736-190712" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 8a6ac38d5f..1298d9c2f9 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190711'; +use constant AGENT_BUILD => '190712'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index c9f7f10dc0..5fdc516b68 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190711 +%define release 190712 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 8d1ff4fc15..891b2769f1 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190711 +%define release 190712 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 52b49cca0c..01d573fb70 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190711" +PI_BUILD="190712" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index efa43a74ee..d20217c6a0 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190711} +{190712} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 75fb3cbe98..51c386db55 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190711)") +#define PANDORA_VERSION ("7.0NG.736(Build 190712)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 392c639976..feb8e814e1 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190711))" + VALUE "ProductVersion", "(7.0NG.736(Build 190712))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 32efed3e39..901b426196 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190711 +Version: 7.0NG.736-190712 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 68e0aa147f..98935e7bf9 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190711" +pandora_version="7.0NG.736-190712" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index f72acc3ef6..ab7acc743d 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190711'; +$build_version = 'PC190712'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index e0c24fd2c6..7b1d4833a6 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 230fbad5e8..388fabbd14 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190711 +%define release 190712 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 0cee7965f4..20093a9ea4 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190711 +%define release 190712 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 48ace9e334..48dd2eaa41 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190711" +PI_BUILD="190712" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index f655b5bcb0..e040b6ea7e 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190711"; +my $version = "7.0NG.736 PS190712"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 7172389c25..172c7ee278 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190711"; +my $version = "7.0NG.736 PS190712"; # save program name for logging my $progname = basename($0); From 46f55c6d65af3ccf7d06fa60bb3688584841d982 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Fri, 12 Jul 2019 08:59:26 +0200 Subject: [PATCH 318/460] Fixed several minor visual bugs - #4347 --- pandora_console/operation/agentes/pandora_networkmap.editor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/operation/agentes/pandora_networkmap.editor.php b/pandora_console/operation/agentes/pandora_networkmap.editor.php index f5f5b92be1..7f698d8653 100644 --- a/pandora_console/operation/agentes/pandora_networkmap.editor.php +++ b/pandora_console/operation/agentes/pandora_networkmap.editor.php @@ -401,7 +401,7 @@ if ($not_found) { __('Update networkmap'), 'crt', false, - 'class="sub"' + 'class="sub upd"' ); } From cac34e33115aa3920441ec67513d96d7d23f8691 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Fri, 12 Jul 2019 10:21:54 +0200 Subject: [PATCH 319/460] Changed gray image in discovery - #4351 --- pandora_console/images/wizard/tasklist.png | Bin 855 -> 926 bytes .../include/styles/pandora_black.css | 5 +++++ 2 files changed, 5 insertions(+) diff --git a/pandora_console/images/wizard/tasklist.png b/pandora_console/images/wizard/tasklist.png index 3250311b69cd02e87ea89b967c4579c3635a3c77..0875145b8ab70ae0188912d1c83087e6680aecfa 100644 GIT binary patch delta 867 zcmV-p1DyQV2A&6yNPh!BNkl=~K6owavA|*#4T?z`gfjEKV%ISh`AWmTC z1hG#5Wn7sX*kwAai0g0!j*wmFF(V7@t^^Mz65ltoBO^dazn-4ndVj4k00000r=X{~ zv9H(H1G{*%EwOE5+x+Ll!xEVlg%**YY#W!}`eemkpS#c(M}HRCF(jUi=__sLheu>b z-teR)E!Q-+SMWwXby#5*b}{q3oi@qQc3Urj6V@7`ZJUdE5b!jU0n(&(Rz$0%nC(nM7{!Gc!pURV=GcOoYuj-V6s7>tmGBj#=*zL-bf_phwiogtv@a6;B2Jl8@-C7Jwv&%g~~K7 zk&_noA_sL#(pp{cfY_;q$b}r=#{906Ix4D>OL=*3MSost?y*GmO^ZZU*8l(j00000 z00000;J?GUj%1(}1Z{t`8$WaY=%K7i@kc8QEfMTSvCEN+KicT~qpQ-zka$+`M@LNP zZd4n8bWCV_&~MQgx%5LO^m!ADSXcbf_BeK|alJs4ZXfz_EUQFQHlaI#UpkU0re#N| zFGtS`B7bjRKNU+h`}b`?L^8>d+hC7p;pc{_ZWXP00000000000Dk}gw1Q*KAH6pJY-Ef;nB&hMU3-+c z>s%;q>(T6v2-hAZ?mB&?XkM82rpO}ehTBS7t|{|JpGs)6=ls#`3-?tHQ87dML|!s~ zbRCaX{pp`J;FJ(fx+eHIp(f3FW7K_b_4? z?p$Uay~mBoMdXBk6o;pO4&d%8R^$dmV$o%|L2?5)LCOgt zPEdM+_y)-h!T~Hncin{*+xiCWyfPLRvds*hu^9Y)l7)m6%zO;bZ{!~nr2qf`z(3>h zcq9iV4t($|IMEMp`Y0r)S(eSvtkkD~l7-P=F!;6G?SA)N^nb^Ik_(2+XQe&|mYnP3 z)up!UhaVC9l<_Wfx!hQb)`OOrI4#xM?HQ6MRe#rjyjBwVJj+*?}Yrt1A$_v~KUT$nQ0^Qp&(YA1?tU7w5i<*|Hw{ z%0+b3jBUCQw11M^%LR*(y|!%6klbcvXlnAy3EAEx>+{{~hsTKg{nX=rZ7n+Rg|F&d ze<6cDw{DW6pLA%|uD9O2<(?S_c2_n2#1_RiEq$$VaPvJ~{~~Sy*0y zXfOF_NhUq0`h0X7$;G)x5zp*xU8!u!N57vj;8v1**WQ(~b~%zeSQ(nHvCS`~yht`b zt9XjYpMTeU^eNfiW^$zY=r2{Ruk*^#M04xPi0^U{<3-SFab=s27TLGz5Js0P>m)!; zjx8UZ^1B@X0000000000008iV++>Y?|2p4<-amSiW!Wv7!|xycm3;J`F7nX{^Z7FK z(a#b4l=048^U-oKdsK(br?+QFp4fy-N<2qCaeu{!ghNxS(osq$$rhF}%evY>x_34D zzT%VWV*lvH6*!$+w|5P-QY1c@uLm>PM<1nA3Zgl zP7MG4NxCq}M=x88?z+3s=lUDrWQ}tF=zcH3OR|ebd=*IY%zPzdSp~9xGynhqTp0fZ a7!?35(r%#v1DIq00000 Date: Fri, 12 Jul 2019 10:23:20 +0200 Subject: [PATCH 320/460] Changed gray image in discovery - #4351 --- pandora_console/include/styles/pandora_black.css | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css index 92912e3c4c..a52c994ed2 100644 --- a/pandora_console/include/styles/pandora_black.css +++ b/pandora_console/include/styles/pandora_black.css @@ -237,19 +237,12 @@ table.table_modal_alternate tr:nth-child(even) td { background-color: #555 !important; } -.info_table .datos3, -.datos3, -.info_table .datos4, -.datos4 { - background-color: #666; - color: #fff; -} - .info_table .datos3, .datos3, .info_table .datos4, .datos4 { background-color: #444; + color: #fff; } .action_buttons a[href] img, From ecaba5ebd3f31e03ffced9c61a1d8d4d85a07195 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Fri, 12 Jul 2019 10:24:46 +0200 Subject: [PATCH 321/460] fixed errorsr macros reports --- pandora_console/extras/mr/30.sql | 2 ++ .../pandoradb_migrate_6.0_to_7.0.mysql.sql | 3 ++- .../reporting_builder.item_editor.php | 26 +++++++++++++++++-- pandora_console/include/styles/pandora.css | 6 +++-- pandora_console/pandoradb.sql | 4 +-- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/pandora_console/extras/mr/30.sql b/pandora_console/extras/mr/30.sql index eeb3b8d797..58abf6c562 100644 --- a/pandora_console/extras/mr/30.sql +++ b/pandora_console/extras/mr/30.sql @@ -10,4 +10,6 @@ ALTER TABLE `treport_content_template` ADD COLUMN `failover_type` tinyint(1) DEF ALTER TABLE `tmodule_relationship` ADD COLUMN `type` ENUM('direct', 'failover') DEFAULT 'direct'; +ALTER TABLE `treport_content` MODIFY COLUMN `name` varchar(300) NULL; + COMMIT; \ No newline at end of file diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql index 60e19998e8..b59a76dfd2 100644 --- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql +++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql @@ -724,7 +724,7 @@ CREATE TABLE IF NOT EXISTS `treport_content_template` ( `type` varchar(30) default 'simple_graph', `period` int(11) NOT NULL default 0, `order` int (11) NOT NULL default 0, - `description` mediumtext, + `description` mediumtext, `text_agent` text, `text` TEXT, `external_source` Text, @@ -1446,6 +1446,7 @@ ALTER TABLE `treport_content` ADD COLUMN `agent_min_value` TINYINT(1) DEFAULT '1 ALTER TABLE `treport_content` ADD COLUMN `current_month` TINYINT(1) DEFAULT '1'; ALTER TABLE `treport_content` ADD COLUMN `failover_mode` tinyint(1) DEFAULT '0'; ALTER TABLE `treport_content` ADD COLUMN `failover_type` tinyint(1) DEFAULT '0'; +ALTER table `treport_content` MODIFY COLUMN `name` varchar(300) NULL; -- --------------------------------------------------------------------- -- Table `tmodule_relationship` diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index ff8ca88e40..d358258e4a 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -865,7 +865,18 @@ $class = 'databox filters';
    @@ -923,7 +934,18 @@ $class = 'databox filters'; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index de13b884ff..a5b96554b6 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -5791,7 +5791,6 @@ div#status_pie { grid-template-columns: 50px auto; } - /* * --------------------------------------------------------------------- * - IMAGES FOR STATUS. This replaces the images of /images/status_sets/default/ @@ -5834,7 +5833,6 @@ div#status_pie { * --------------------------------------------------------------------- */ - /* Table for show more info in events and config menu in modules graphs. (This class exists in events.css too) */ .table_modal_alternate { border-spacing: 0; @@ -5863,3 +5861,7 @@ table.table_modal_alternate tr td:first-child { padding-left: 20px; } /* END - Table for show more info in events and config menu in modules graphs */ + +.fullwidth { + width: 100%; +} diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 95d6caadfd..656a83a3e2 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1402,8 +1402,8 @@ CREATE TABLE IF NOT EXISTS `treport_content` ( `type` varchar(30) default 'simple_graph', `period` int(11) NOT NULL default 0, `order` int (11) NOT NULL default 0, - `name` varchar(150) NULL, - `description` mediumtext, + `name` varchar(300) NULL, + `description` mediumtext, `id_agent` int(10) unsigned NOT NULL default 0, `text` TEXT, `external_source` Text, From 56ef03c27d8def88eb46002727cb68141a274fc6 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 12 Jul 2019 11:36:37 +0200 Subject: [PATCH 322/460] Update index.php metaconsole redirection --- pandora_console/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/index.php b/pandora_console/index.php index 21b5e35eb1..83d017bdab 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -149,7 +149,7 @@ if (isset($config['error'])) { // If metaconsole activated, redirect to it. if (is_metaconsole()) { - header('Location: '.ui_get_full_url('index.php')); + header('Location: '.ui_get_full_url(ENTERPRISE_DIR.'/meta/index.php')); // Always exit after sending location headers. exit; } From 5cfad4587df361fcce6933ffc492155106085c3c Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 12 Jul 2019 12:17:26 +0200 Subject: [PATCH 323/460] Revert "Update index.php metaconsole redirection" This reverts commit 56ef03c27d8def88eb46002727cb68141a274fc6 --- pandora_console/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/index.php b/pandora_console/index.php index 83d017bdab..21b5e35eb1 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -149,7 +149,7 @@ if (isset($config['error'])) { // If metaconsole activated, redirect to it. if (is_metaconsole()) { - header('Location: '.ui_get_full_url(ENTERPRISE_DIR.'/meta/index.php')); + header('Location: '.ui_get_full_url('index.php')); // Always exit after sending location headers. exit; } From cca5c7fcf3758f5ef8b42cfff02817abd43d7ba3 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 12 Jul 2019 12:27:58 +0200 Subject: [PATCH 324/460] Update ui_get_full_url meta with def. target/pandora_console as public_url --- pandora_console/include/functions_ui.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 97c8456c48..0440a234ef 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3799,6 +3799,9 @@ function ui_get_full_url($url='', $no_proxy=false, $add_name_php_file=false, $me if (ui_forced_public_url()) { $proxy = true; $fullurl = $config['public_url']; + if ($url == 'index.php' && is_metaconsole()) { + $fullurl .= ENTERPRISE_DIR.'/meta/index.php'; + } } else if (!empty($config['public_url']) && (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) ) { From e2f3a3fd0c90c509d3435490b8608f47b7c7350d Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 12 Jul 2019 12:35:39 +0200 Subject: [PATCH 325/460] Update functions_ui.php minor adjustment --- pandora_console/include/functions_ui.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 0440a234ef..718fba266a 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3800,7 +3800,7 @@ function ui_get_full_url($url='', $no_proxy=false, $add_name_php_file=false, $me $proxy = true; $fullurl = $config['public_url']; if ($url == 'index.php' && is_metaconsole()) { - $fullurl .= ENTERPRISE_DIR.'/meta/index.php'; + $fullurl .= '/'.ENTERPRISE_DIR.'/meta'; } } else if (!empty($config['public_url']) && (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) From 7288a6e262a1ed170ff20fbe1bbd8989276d489f Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Fri, 12 Jul 2019 13:36:29 +0200 Subject: [PATCH 326/460] fixed errors modules/sec in tactical view --- pandora_console/include/functions_servers.php | 694 +++++++++++------- 1 file changed, 420 insertions(+), 274 deletions(-) diff --git a/pandora_console/include/functions_servers.php b/pandora_console/include/functions_servers.php index 0850dcbfac..c8738b1bdc 100644 --- a/pandora_console/include/functions_servers.php +++ b/pandora_console/include/functions_servers.php @@ -32,9 +32,9 @@ require_once __DIR__.'/constants.php'; /** * Get a server. * - * @param int Server id to get. - * @param array Extra filter. - * @param array Fields to get. + * @param integer $id_server Server id to get. + * @param array $filter Extra filter. + * @param array $fields Fields to get. * * @return Server with the given id. False if not available. */ @@ -61,7 +61,11 @@ function servers_get_server($id_server, $filter=false, $fields=false) */ function servers_get_names() { - $all_servers = @db_get_all_rows_filter('tserver', false, ['DISTINCT(name) as name']); + $all_servers = @db_get_all_rows_filter( + 'tserver', + false, + ['DISTINCT(name) as name'] + ); if ($all_servers === false) { return []; } @@ -76,7 +80,11 @@ function servers_get_names() /** - * This function forces a recon task to be queued by the server asap + * This function forces a recon task to be queued by the server asap. + * + * @param integer $id_recon_task Id. + * + * @return void */ function servers_force_recon_task($id_recon_task) { @@ -141,9 +149,10 @@ function servers_get_total_modules() /** - * This function will get several metrics from the database to get info about server performance + * This function will get several metrics from the database + * to get info about server performance. * - * @return array with several data + * @return array with several data. */ function servers_get_performance() { @@ -161,18 +170,20 @@ function servers_get_performance() if ($config['realtimestats'] == 1) { $counts = db_get_all_rows_sql( - ' - SELECT tagente_modulo.id_modulo, + 'SELECT tagente_modulo.id_modulo, COUNT(tagente_modulo.id_agente_modulo) modules FROM tagente_modulo, tagente_estado, tagente WHERE tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 AND delete_pending = 0 - AND (utimestamp > 0 OR (id_tipo_modulo = 100 OR (id_tipo_modulo > 21 AND id_tipo_modulo < 23))) + AND (utimestamp > 0 + OR (id_tipo_modulo = 100 + OR (id_tipo_modulo > 21 + AND id_tipo_modulo < 23) + ) + ) AND tagente.disabled = 0 - GROUP BY tagente_modulo.id_modulo' ); @@ -205,6 +216,10 @@ function servers_get_performance() case MODULE_WEB: $data['total_web_modules'] = $c['modules']; break; + + default: + // Not possible. + break; } if ($c['id_modulo'] != MODULE_DATA) { @@ -259,6 +274,8 @@ function servers_get_performance() case SERVER_TYPE_EVENT: case SERVER_TYPE_DISCOVERY: case SERVER_TYPE_SYSLOG: + default: + // Nothing. break; } @@ -272,17 +289,22 @@ function servers_get_performance() $interval_avgs = []; - // Avg of modules interval when modules have module_interval > 0 + // Avg of modules interval when modules have module_interval > 0. $interval_avgs_modules = db_get_all_rows_sql( - ' - SELECT count(tagente_modulo.id_modulo) modules , + 'SELECT count(tagente_modulo.id_modulo) modules , tagente_modulo.id_modulo, AVG(tagente_modulo.module_interval) avg_interval FROM tagente_modulo, tagente_estado, tagente WHERE tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo AND tagente_modulo.disabled = 0 AND module_interval > 0 - AND (utimestamp > 0 OR (id_tipo_modulo = 100 OR (id_tipo_modulo > 21 AND id_tipo_modulo < 23))) + AND (utimestamp > 0 OR ( + id_tipo_modulo = 100 + OR (id_tipo_modulo > 21 + AND id_tipo_modulo < 23 + ) + ) + ) AND delete_pending = 0 AND tagente.disabled = 0 AND tagente.id_agente = tagente_estado.id_agente @@ -293,16 +315,15 @@ function servers_get_performance() $interval_avgs_modules = []; } - // Transform into a easily format + // Transform into a easily format. foreach ($interval_avgs_modules as $iamodules) { $interval_avgs[$iamodules['id_modulo']]['avg_interval'] = $iamodules['avg_interval']; $interval_avgs[$iamodules['id_modulo']]['modules'] = $iamodules['modules']; } - // Avg of agents interval when modules have module_interval == 0 + // Avg of agents interval when modules have module_interval == 0. $interval_avgs_agents = db_get_all_rows_sql( - ' - SELECT count(tagente_modulo.id_modulo) modules , + 'SELECT count(tagente_modulo.id_modulo) modules , tagente_modulo.id_modulo, AVG(tagente.intervalo) avg_interval FROM tagente_modulo, tagente_estado, tagente WHERE tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo @@ -319,50 +340,73 @@ function servers_get_performance() $interval_avgs_agents = []; } - // Merge with the previous calculated array + // Merge with the previous calculated array. foreach ($interval_avgs_agents as $iaagents) { if (!isset($interval_avgs[$iaagents['id_modulo']]['modules'])) { $interval_avgs[$iaagents['id_modulo']]['avg_interval'] = $iaagents['avg_interval']; $interval_avgs[$iaagents['id_modulo']]['modules'] = $iaagents['modules']; } else { - $interval_avgs[$iaagents['id_modulo']]['avg_interval'] = servers_get_avg_interval($interval_avgs[$iaagents['id_modulo']], $iaagents); + $interval_avgs[$iaagents['id_modulo']]['avg_interval'] = servers_get_avg_interval( + $interval_avgs[$iaagents['id_modulo']], + $iaagents + ); $interval_avgs[$iaagents['id_modulo']]['modules'] += $iaagents['modules']; } } + $info_servers = servers_get_info(); foreach ($interval_avgs as $id_modulo => $ia) { switch ($id_modulo) { case MODULE_DATA: $data['avg_interval_local_modules'] = $ia['avg_interval']; - $data['local_modules_rate'] = servers_get_rate($data['avg_interval_local_modules'], $data['total_local_modules']); + $data['local_modules_rate'] = servers_get_rate( + ($data['avg_interval_local_modules'] - $info_servers[$id_modulo]['module_lag']), + $data['total_local_modules'] + ); break; case MODULE_NETWORK: $data['avg_interval_network_modules'] = $ia['avg_interval']; $data['network_modules_rate'] = servers_get_rate( - $data['avg_interval_network_modules'], + ($data['avg_interval_network_modules'] - $info_servers[$id_modulo]['module_lag']), $data['total_network_modules'] ); break; case MODULE_PLUGIN: $data['avg_interval_plugin_modules'] = $ia['avg_interval']; - $data['plugin_modules_rate'] = servers_get_rate($data['avg_interval_plugin_modules'], $data['total_plugin_modules']); + $data['plugin_modules_rate'] = servers_get_rate( + ($data['avg_interval_plugin_modules'] - $info_servers[$id_modulo]['module_lag']), + $data['total_plugin_modules'] + ); break; case MODULE_PREDICTION: $data['avg_interval_prediction_modules'] = $ia['avg_interval']; - $data['prediction_modules_rate'] = servers_get_rate($data['avg_interval_prediction_modules'], $data['total_prediction_modules']); + $data['prediction_modules_rate'] = servers_get_rate( + ($data['avg_interval_prediction_modules'] - $info_servers[$id_modulo]['module_lag']), + $data['total_prediction_modules'] + ); break; case MODULE_WMI: $data['avg_interval_wmi_modules'] = $ia['avg_interval']; - $data['wmi_modules_rate'] = servers_get_rate($data['avg_interval_wmi_modules'], $data['total_wmi_modules']); + $data['wmi_modules_rate'] = servers_get_rate( + ($data['avg_interval_wmi_modules'] - $info_servers[$id_modulo]['module_lag']), + $data['total_wmi_modules'] + ); break; case MODULE_WEB: $data['avg_interval_web_modules'] = $ia['avg_interval']; - $data['web_modules_rate'] = servers_get_rate($data['avg_interval_web_modules'], $data['total_web_modules']); + $data['web_modules_rate'] = servers_get_rate( + ($data['avg_interval_web_modules'] - $info_servers[$id_modulo]['module_lag']), + $data['total_web_modules'] + ); + break; + + default: + // Not possible. break; } @@ -385,25 +429,33 @@ function servers_get_performance() $data['avg_interval_total_modules'] = (array_sum($data['avg_interval_total_modules']) / count($data['avg_interval_total_modules'])); } - $data['remote_modules_rate'] = servers_get_rate($data['avg_interval_remote_modules'], $data['total_remote_modules']); - $data['total_modules_rate'] = servers_get_rate($data['avg_interval_total_modules'], $data['total_modules']); + $data['remote_modules_rate'] = servers_get_rate( + $data['avg_interval_remote_modules'], + $data['total_remote_modules'] + ); + $data['total_modules_rate'] = servers_get_rate( + $data['avg_interval_total_modules'], + $data['total_modules'] + ); return ($data); } /** - * Get avg interval + * Get avg interval. * - * @param mixed Array with avg and count data of first part - * @param mixed Array with avg and count data of second part + * @param array $modules_avg_interval1 Array with avg and count + * data of first part. + * @param array $modules_avg_interval2 Array with avg and count + * data of second part. * - * @return float number of avg modules between two parts + * @return float number of avg modules between two parts. */ - - -function servers_get_avg_interval($modules_avg_interval1, $modules_avg_interval2) -{ +function servers_get_avg_interval( + $modules_avg_interval1, + $modules_avg_interval2 +) { $total_modules = ($modules_avg_interval1['modules'] + $modules_avg_interval2['modules']); $parcial1 = ($modules_avg_interval1['avg_interval'] * $modules_avg_interval1['modules']); @@ -416,21 +468,23 @@ function servers_get_avg_interval($modules_avg_interval1, $modules_avg_interval2 /** * Get server rate * - * @param float avg of interval of these modules - * @param int number of modules + * @param float $avg_interval Avg of interval of these modules. + * @param integer $num_modules Number of modules. * * @return float number of modules processed by second */ function servers_get_rate($avg_interval, $num_modules) { - return $avg_interval > 0 ? ($num_modules / $avg_interval) : 0; + return ($avg_interval > 0) ? ($num_modules / $avg_interval) : 0; } /** - * This function will get all the server information in an array or a specific server + * This function will get all the server information in an array + * or a specific server. * - * @param mixed An optional integer or array of integers to select specific servers + * @param integer $id_server An optional integer or array of integers + * to select specific servers. * * @return mixed False in case the server doesn't exist or an array with info. */ @@ -461,127 +515,211 @@ function servers_get_info($id_server=-1) foreach ($result as $server) { switch ($server['server_type']) { case SERVER_TYPE_DATA: - $server['img'] = html_print_image('images/data.png', true, ['title' => __('Data server')]); + $server['img'] = html_print_image( + 'images/data.png', + true, + ['title' => __('Data server')] + ); $server['type'] = 'data'; $id_modulo = 1; break; case SERVER_TYPE_NETWORK: - $server['img'] = html_print_image('images/network.png', true, ['title' => __('Network server')]); + $server['img'] = html_print_image( + 'images/network.png', + true, + ['title' => __('Network server')] + ); $server['type'] = 'network'; $id_modulo = 2; break; case SERVER_TYPE_SNMP: - $server['img'] = html_print_image('images/snmp.png', true, ['title' => __('SNMP Trap server')]); + $server['img'] = html_print_image( + 'images/snmp.png', + true, + ['title' => __('SNMP Trap server')] + ); $server['type'] = 'snmp'; $id_modulo = 0; break; case SERVER_TYPE_DISCOVERY: - $server['img'] = html_print_image('images/recon.png', true, ['title' => __('Discovery server')]); + $server['img'] = html_print_image( + 'images/recon.png', + true, + ['title' => __('Discovery server')] + ); $server['type'] = 'recon'; $id_modulo = 0; break; case SERVER_TYPE_PLUGIN: - $server['img'] = html_print_image('images/plugin.png', true, ['title' => __('Plugin server')]); + $server['img'] = html_print_image( + 'images/plugin.png', + true, + ['title' => __('Plugin server')] + ); $server['type'] = 'plugin'; $id_modulo = 4; break; case SERVER_TYPE_PREDICTION: - $server['img'] = html_print_image('images/chart_bar.png', true, ['title' => __('Prediction server')]); + $server['img'] = html_print_image( + 'images/chart_bar.png', + true, + ['title' => __('Prediction server')] + ); $server['type'] = 'prediction'; $id_modulo = 5; break; case SERVER_TYPE_WMI: - $server['img'] = html_print_image('images/wmi.png', true, ['title' => __('WMI server')]); + $server['img'] = html_print_image( + 'images/wmi.png', + true, + ['title' => __('WMI server')] + ); $server['type'] = 'wmi'; $id_modulo = 6; break; case SERVER_TYPE_EXPORT: - $server['img'] = html_print_image('images/server_export.png', true, ['title' => __('Export server')]); + $server['img'] = html_print_image( + 'images/server_export.png', + true, + ['title' => __('Export server')] + ); $server['type'] = 'export'; $id_modulo = 0; break; case SERVER_TYPE_INVENTORY: - $server['img'] = html_print_image('images/page_white_text.png', true, ['title' => __('Inventory server')]); + $server['img'] = html_print_image( + 'images/page_white_text.png', + true, + ['title' => __('Inventory server')] + ); $server['type'] = 'inventory'; $id_modulo = 0; break; case SERVER_TYPE_WEB: - $server['img'] = html_print_image('images/world.png', true, ['title' => __('Web server')]); + $server['img'] = html_print_image( + 'images/world.png', + true, + ['title' => __('Web server')] + ); $server['type'] = 'web'; $id_modulo = 0; break; case SERVER_TYPE_EVENT: - $server['img'] = html_print_image('images/lightning_go.png', true, ['title' => __('Event server')]); + $server['img'] = html_print_image( + 'images/lightning_go.png', + true, + ['title' => __('Event server')] + ); $server['type'] = 'event'; $id_modulo = 2; break; case SERVER_TYPE_ENTERPRISE_ICMP: - $server['img'] = html_print_image('images/network.png', true, ['title' => __('Enterprise ICMP server')]); + $server['img'] = html_print_image( + 'images/network.png', + true, + ['title' => __('Enterprise ICMP server')] + ); $server['type'] = 'enterprise icmp'; $id_modulo = 2; break; case SERVER_TYPE_ENTERPRISE_SNMP: - $server['img'] = html_print_image('images/network.png', true, ['title' => __('Enterprise SNMP server')]); + $server['img'] = html_print_image( + 'images/network.png', + true, + ['title' => __('Enterprise SNMP server')] + ); $server['type'] = 'enterprise snmp'; $id_modulo = 2; break; case SERVER_TYPE_ENTERPRISE_SATELLITE: - $server['img'] = html_print_image('images/satellite.png', true, ['title' => __('Enterprise Satellite server')]); + $server['img'] = html_print_image( + 'images/satellite.png', + true, + ['title' => __('Enterprise Satellite server')] + ); $server['type'] = 'enterprise satellite'; $id_modulo = 0; break; case SERVER_TYPE_ENTERPRISE_TRANSACTIONAL: - $server['img'] = html_print_image('images/transactional_map.png', true, ['title' => __('Enterprise Transactional server')]); + $server['img'] = html_print_image( + 'images/transactional_map.png', + true, + ['title' => __('Enterprise Transactional server')] + ); $server['type'] = 'enterprise transactional'; $id_modulo = 0; break; case SERVER_TYPE_MAINFRAME: - $server['img'] = html_print_image('images/mainframe.png', true, ['title' => __('Mainframe server')]); + $server['img'] = html_print_image( + 'images/mainframe.png', + true, + ['title' => __('Mainframe server')] + ); $server['type'] = 'mainframe'; $id_modulo = 0; break; case SERVER_TYPE_SYNC: - $server['img'] = html_print_image('images/sync.png', true, ['title' => __('Sync server')]); + $server['img'] = html_print_image( + 'images/sync.png', + true, + ['title' => __('Sync server')] + ); $server['type'] = 'sync'; $id_modulo = 0; break; case SERVER_TYPE_WUX: - $server['img'] = html_print_image('images/icono-wux.png', true, ['title' => __('Wux server')]); + $server['img'] = html_print_image( + 'images/icono-wux.png', + true, + ['title' => __('Wux server')] + ); $server['type'] = 'wux'; $id_modulo = 0; break; case SERVER_TYPE_SYSLOG: - $server['img'] = html_print_image('images/syslog.png', true, ['title' => __('Syslog server')]); + $server['img'] = html_print_image( + 'images/syslog.png', + true, + ['title' => __('Syslog server')] + ); $server['type'] = 'syslog'; $id_modulo = 0; break; case SERVER_TYPE_AUTOPROVISION: - $server['img'] = html_print_image('images/autoprovision.png', true, ['title' => __('Autoprovision server')]); + $server['img'] = html_print_image( + 'images/autoprovision.png', + true, + ['title' => __('Autoprovision server')] + ); $server['type'] = 'autoprovision'; $id_modulo = 0; break; case SERVER_TYPE_MIGRATION: - $server['img'] = html_print_image('images/migration.png', true, ['title' => __('Migration server')]); + $server['img'] = html_print_image( + 'images/migration.png', + true, + ['title' => __('Migration server')] + ); $server['type'] = 'migration'; $id_modulo = 0; break; @@ -594,31 +732,54 @@ function servers_get_info($id_server=-1) } if ($config['realtimestats'] == 0) { - // --------------------------------------------------------------- - // Take data from database if not realtime stats - // --------------------------------------------------------------- - $server['lag'] = db_get_sql('SELECT lag_time FROM tserver WHERE id_server = '.$server['id_server']); - $server['module_lag'] = db_get_sql('SELECT lag_modules FROM tserver WHERE id_server = '.$server['id_server']); - $server['modules'] = db_get_sql('SELECT my_modules FROM tserver WHERE id_server = '.$server['id_server']); - $server['modules_total'] = db_get_sql('SELECT total_modules_running FROM tserver WHERE id_server = '.$server['id_server']); + // Take data from database if not realtime stats. + $server['lag'] = db_get_sql( + 'SELECT lag_time + FROM tserver + WHERE id_server = '.$server['id_server'] + ); + $server['module_lag'] = db_get_sql( + 'SELECT lag_modules + FROM tserver + WHERE id_server = '.$server['id_server'] + ); + $server['modules'] = db_get_sql( + 'SELECT my_modules + FROM tserver + WHERE id_server = '.$server['id_server'] + ); + $server['modules_total'] = db_get_sql( + 'SELECT total_modules_running + FROM tserver + WHERE id_server = '.$server['id_server'] + ); } else { - // --------------------------------------------------------------- - // Take data in realtime - // --------------------------------------------------------------- + // Take data in realtime. $server['module_lag'] = 0; $server['lag'] = 0; - // Inventory server + // Inventory server. if ($server['server_type'] == SERVER_TYPE_INVENTORY) { - // Get modules exported by this server - $server['modules'] = db_get_sql("SELECT COUNT(tagent_module_inventory.id_agent_module_inventory) FROM tagente, tagent_module_inventory WHERE tagente.disabled=0 AND tagent_module_inventory.id_agente = tagente.id_agente AND tagente.server_name = '".$server['name']."'"); + // Get modules exported by this server. + $server['modules'] = db_get_sql( + "SELECT COUNT(tagent_module_inventory.id_agent_module_inventory) + FROM tagente, tagent_module_inventory + WHERE tagente.disabled=0 + AND tagent_module_inventory.id_agente = tagente.id_agente + AND tagente.server_name = '".$server['name']."'" + ); - // Get total exported modules - $server['modules_total'] = db_get_sql('SELECT COUNT(tagent_module_inventory.id_agent_module_inventory) FROM tagente, tagent_module_inventory WHERE tagente.disabled=0 AND tagent_module_inventory.id_agente = tagente.id_agente'); + // Get total exported modules. + $server['modules_total'] = db_get_sql( + 'SELECT COUNT(tagent_module_inventory.id_agent_module_inventory) + FROM tagente, tagent_module_inventory + WHERE tagente.disabled=0 + AND tagent_module_inventory.id_agente = tagente.id_agente' + ); $interval_esc = db_escape_key_identifier('interval'); - // Get the module lag + // Get the module lag. $server['module_lag'] = db_get_sql( 'SELECT COUNT(tagent_module_inventory.id_agent_module_inventory) AS module_lag FROM tagente, tagent_module_inventory @@ -630,7 +791,7 @@ function servers_get_info($id_server=-1) AND (UNIX_TIMESTAMP() - utimestamp) > tagent_module_inventory.'.$interval_esc ); - // Get the lag + // Get the lag. $server['lag'] = db_get_sql( 'SELECT AVG(UNIX_TIMESTAMP() - utimestamp - tagent_module_inventory.'.$interval_esc.') FROM tagente, tagent_module_inventory @@ -641,162 +802,119 @@ function servers_get_info($id_server=-1) AND (UNIX_TIMESTAMP() - utimestamp) < (tagent_module_inventory.".$interval_esc.' * 10) AND (UNIX_TIMESTAMP() - utimestamp) > tagent_module_inventory.'.$interval_esc ); - // Export server + // Export server. } else if ($server['server_type'] == SERVER_TYPE_EXPORT) { - // Get modules exported by this server - $server['modules'] = db_get_sql('SELECT COUNT(tagente_modulo.id_agente_modulo) FROM tagente, tagente_modulo, tserver_export WHERE tagente.disabled=0 AND tagente_modulo.id_agente = tagente.id_agente AND tagente_modulo.id_export = tserver_export.id AND tserver_export.id_export_server = '.$server['id_server']); + // Get modules exported by this server. + $server['modules'] = db_get_sql( + 'SELECT COUNT(tagente_modulo.id_agente_modulo) + FROM tagente, tagente_modulo, tserver_export + WHERE tagente.disabled=0 + AND tagente_modulo.id_agente = tagente.id_agente + AND tagente_modulo.id_export = tserver_export.id + AND tserver_export.id_export_server = '.$server['id_server'] + ); - // Get total exported modules - $server['modules_total'] = db_get_sql('SELECT COUNT(tagente_modulo.id_agente_modulo) FROM tagente, tagente_modulo WHERE tagente.disabled=0 AND tagente_modulo.id_agente = tagente.id_agente AND tagente_modulo.id_export != 0'); + // Get total exported modules. + $server['modules_total'] = db_get_sql( + 'SELECT COUNT(tagente_modulo.id_agente_modulo) + FROM tagente, tagente_modulo + WHERE tagente.disabled=0 + AND tagente_modulo.id_agente = tagente.id_agente + AND tagente_modulo.id_export != 0' + ); $server['lag'] = 0; $server['module_lag'] = 0; - } - // Discovery server - else if ($server['server_type'] == SERVER_TYPE_DISCOVERY) { + } else if ($server['server_type'] == SERVER_TYPE_DISCOVERY) { + // Discovery server. $server['name'] = ''.$server['name'].''; - // Total jobs running on this Discovery server + // Total jobs running on this Discovery server. $server['modules'] = db_get_sql( 'SELECT COUNT(id_rt) FROM trecon_task WHERE id_recon_server = '.$server['id_server'] ); - // Total recon jobs (all servers) - $server['modules_total'] = db_get_sql('SELECT COUNT(status) FROM trecon_task'); + // Total recon jobs (all servers). + $server['modules_total'] = db_get_sql( + 'SELECT COUNT(status) FROM trecon_task' + ); - // Lag (take average active time of all active tasks) + // Lag (take average active time of all active tasks). $server['module_lag'] = 0; - - switch ($config['dbtype']) { - case 'mysql': - $server['lag'] = db_get_sql('SELECT UNIX_TIMESTAMP() - utimestamp from trecon_task WHERE UNIX_TIMESTAMP() > (utimestamp + interval_sweep) AND id_recon_server = '.$server['id_server']); - - $server['module_lag'] = db_get_sql('SELECT COUNT(id_rt) FROM trecon_task WHERE UNIX_TIMESTAMP() > (utimestamp + interval_sweep) AND id_recon_server = '.$server['id_server']); - break; - - case 'postgresql': - $server['lag'] = db_get_sql("SELECT ceil(date_part('epoch', CURRENT_TIMESTAMP)) - utimestamp from trecon_task WHERE ceil(date_part('epoch', CURRENT_TIMESTAMP)) > (utimestamp + interval_sweep) AND id_recon_server = ".$server['id_server']); - - $server['module_lag'] = db_get_sql("SELECT COUNT(id_rt) FROM trecon_task WHERE ceil(date_part('epoch', CURRENT_TIMESTAMP)) > (utimestamp + interval_sweep) AND id_recon_server = ".$server['id_server']); - break; - - case 'oracle': - $server['lag'] = db_get_sql("SELECT ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (".SECONDS_1DAY.")) - utimestamp from trecon_task WHERE ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (".SECONDS_1DAY.')) > (utimestamp + interval_sweep) AND id_recon_server = '.$server['id_server']); - - $server['module_lag'] = db_get_sql("SELECT COUNT(id_rt) FROM trecon_task WHERE ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (".SECONDS_1DAY.')) > (utimestamp + interval_sweep) AND id_recon_server = '.$server['id_server']); - break; - } + $server['lag'] = db_get_sql( + 'SELECT UNIX_TIMESTAMP() - utimestamp + FROM trecon_task + WHERE UNIX_TIMESTAMP() > (utimestamp + interval_sweep) + AND id_recon_server = '.$server['id_server'] + ); + $server['module_lag'] = db_get_sql( + 'SELECT COUNT(id_rt) + FROM trecon_task + WHERE UNIX_TIMESTAMP() > (utimestamp + interval_sweep) + AND id_recon_server = '.$server['id_server'] + ); } else { - // --------------------------------------------------------------- - // Data, Plugin, WMI, Network and Others - $server['modules'] = db_get_sql('SELECT count(tagente_estado.id_agente_modulo) FROM tagente_estado, tagente_modulo, tagente WHERE tagente.disabled=0 AND tagente_modulo.id_agente = tagente.id_agente AND tagente_modulo.disabled = 0 AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo AND tagente_estado.running_by = '.$server['id_server']); + // Data, Plugin, WMI, Network and Others. + $server['modules'] = db_get_sql( + 'SELECT count(tagente_estado.id_agente_modulo) + FROM tagente_estado, tagente_modulo, tagente + WHERE tagente.disabled=0 + AND tagente_modulo.id_agente = tagente.id_agente + AND tagente_modulo.disabled = 0 + AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo + AND tagente_estado.running_by = '.$server['id_server'] + ); - $server['modules_total'] = db_get_sql('SELECT count(tagente_estado.id_agente_modulo) FROM tserver, tagente_estado, tagente_modulo, tagente WHERE tagente.disabled=0 AND tagente_modulo.id_agente = tagente.id_agente AND tagente_modulo.disabled = 0 AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo AND tagente_estado.running_by = tserver.id_server AND tserver.server_type = '.$server['server_type']); + $server['modules_total'] = db_get_sql( + 'SELECT count(tagente_estado.id_agente_modulo) + FROM tserver, tagente_estado, tagente_modulo, tagente + WHERE tagente.disabled=0 + AND tagente_modulo.id_agente = tagente.id_agente + AND tagente_modulo.disabled = 0 + AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo + AND tagente_estado.running_by = tserver.id_server + AND tserver.server_type = '.$server['server_type'] + ); - // Remote servers LAG Calculation (server_type != 0) + // Remote servers LAG Calculation (server_type != 0). if ($server['server_type'] != 0) { - switch ($config['dbtype']) { - case 'mysql': - $result = db_get_row_sql( - 'SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, AVG(UNIX_TIMESTAMP() - utimestamp - current_interval) AS lag FROM tagente_estado, tagente_modulo, tagente - WHERE utimestamp > 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND running_by = '.$server['id_server'].' - AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) - AND (UNIX_TIMESTAMP() - utimestamp) > current_interval' - ); - break; - - case 'postgresql': - $result = db_get_row_sql( - "SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, AVG(ceil(date_part('epoch', CURRENT_TIMESTAMP)) - utimestamp - current_interval) AS lag FROM tagente_estado, tagente_modulo, tagente - WHERE utimestamp > 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND running_by = ".$server['id_server']." - AND (ceil(date_part('epoch', CURRENT_TIMESTAMP)) - utimestamp) < ( current_interval * 10) - AND (ceil(date_part('epoch', CURRENT_TIMESTAMP)) - utimestamp) > current_interval" - ); - break; - - case 'oracle': - $result = db_get_row_sql( - "SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, AVG(ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (".SECONDS_1DAY.')) - utimestamp - current_interval) AS lag FROM tagente_estado, tagente_modulo, tagente - WHERE utimestamp > 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND running_by = '.$server['id_server']." - AND (ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (".SECONDS_1DAY.")) - utimestamp) < ( current_interval * 10) - AND (ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) - utimestamp) * (".SECONDS_1DAY.')) > current_interval' - ); - break; - } + $result = db_get_row_sql( + 'SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - utimestamp - current_interval) AS lag + FROM tagente_estado, tagente_modulo, tagente + WHERE utimestamp > 0 + AND tagente.disabled = 0 + AND tagente.id_agente = tagente_estado.id_agente + AND tagente_modulo.disabled = 0 + AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo + AND current_interval > 0 + AND running_by = '.$server['id_server'].' + AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) + AND (UNIX_TIMESTAMP() - utimestamp) > current_interval' + ); } else { - // Local/Dataserver server LAG calculation: - switch ($config['dbtype']) { - case 'mysql': - $result = db_get_row_sql( - 'SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, AVG(UNIX_TIMESTAMP() - utimestamp - current_interval) AS lag FROM tagente_estado, tagente_modulo, tagente - WHERE utimestamp > 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_tipo_modulo < 5 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) - AND running_by = '.$server['id_server'].' - AND (UNIX_TIMESTAMP() - utimestamp) > (current_interval * 1.1)' - ); - break; - - case 'postgresql': - $result = db_get_row_sql( - "SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, AVG(ceil(date_part('epoch', CURRENT_TIMESTAMP)) - utimestamp - current_interval) AS lag FROM tagente_estado, tagente_modulo, tagente - WHERE utimestamp > 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_tipo_modulo < 5 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND (ceil(date_part('epoch', CURRENT_TIMESTAMP)) - utimestamp) < ( current_interval * 10) - AND running_by = ".$server['id_server']." - AND (ceil(date_part('epoch', CURRENT_TIMESTAMP)) - utimestamp) > (current_interval * 1.1)" - ); - break; - - case 'oracle': - $result = db_get_row_sql( - "SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, AVG(ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (".SECONDS_1DAY.")) - utimestamp - current_interval) AS lag FROM tagente_estado, tagente_modulo, tagente - WHERE utimestamp > 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_tipo_modulo < 5 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND (ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (".SECONDS_1DAY.')) - utimestamp) < ( current_interval * 10) - AND running_by = '.$server['id_server']." - AND (ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (".SECONDS_1DAY.')) - utimestamp) > (current_interval * 1.1)' - ); - break; - } + // Local/Dataserver server LAG calculation. + $result = db_get_row_sql( + 'SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - utimestamp - current_interval) AS lag + FROM tagente_estado, tagente_modulo, tagente + WHERE utimestamp > 0 + AND tagente.disabled = 0 + AND tagente.id_agente = tagente_estado.id_agente + AND tagente_modulo.disabled = 0 + AND tagente_modulo.id_tipo_modulo < 5 + AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo + AND current_interval > 0 + AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) + AND running_by = '.$server['id_server'].' + AND (UNIX_TIMESTAMP() - utimestamp) > (current_interval * 1.1)' + ); } - // Lag over current_interval * 2 is not lag, it's a timed out module + // Lag over current_interval * 2 is not lag, + // it's a timed out module. if (!empty($result['lag'])) { $server['lag'] = $result['lag']; } @@ -805,28 +923,37 @@ function servers_get_info($id_server=-1) $server['module_lag'] = $result['module_lag']; } } - } //end if + } if (isset($server['module_lag'])) { - $server['lag_txt'] = ($server['lag'] == 0 ? '-' : human_time_description_raw($server['lag'])).' / '.$server['module_lag']; + $server['lag_txt'] = (($server['lag'] == 0) ? '-' : human_time_description_raw($server['lag'])).' / '.$server['module_lag']; } else { $server['lag_txt'] = ''; } if ($server['modules_total'] > 0) { - $server['load'] = round(($server['modules'] / $server['modules_total'] * 100)); + $server['load'] = round( + ($server['modules'] / $server['modules_total'] * 100) + ); } else { $server['load'] = 0; } - // Push the raw data on the return stack + // Push the raw data on the return stack. $return[$server['id_server']] = $server; - } //end foreach + } return $return; } +/** + * Get server type + * + * @param integer $type Type. + * + * @return array Result. + */ function servers_get_servers_type($type) { return db_get_all_rows_filter('tserver', ['server_type' => $type]); @@ -836,25 +963,28 @@ function servers_get_servers_type($type) /** * Get the server name. * - * @param int Server id. + * @param integer $id_server Server id. * * @return string Name of the given server */ function servers_get_name($id_server) { - return (string) db_get_value('name', 'tserver', 'id_server', (int) $id_server); + return (string) db_get_value( + 'name', + 'tserver', + 'id_server', + (int) $id_server + ); } /** - * Get the presence of .conf and .md5 into remote_config dir + * Get the presence of .conf and .md5 into remote_config dir. * - * @param string Agent name + * @param string $server_name Agent name. * - * @return true if files exist and are writable + * @return true If files exist and are writable. */ - - function servers_check_remote_config($server_name) { global $config; @@ -862,8 +992,12 @@ function servers_check_remote_config($server_name) $server_md5 = md5($server_name, false); $filenames = []; - $filenames['md5'] = io_safe_output($config['remote_config']).'/md5/'.$server_md5.'.srv.md5'; - $filenames['conf'] = io_safe_output($config['remote_config']).'/conf/'.$server_md5.'.srv.conf'; + $filenames['md5'] = io_safe_output( + $config['remote_config'] + ).'/md5/'.$server_md5.'.srv.md5'; + $filenames['conf'] = io_safe_output( + $config['remote_config'] + ).'/conf/'.$server_md5.'.srv.conf'; if (! isset($filenames['conf'])) { return false; @@ -881,14 +1015,15 @@ function servers_check_remote_config($server_name) /** - * Return a string containing image tag for a given target id (server) - * TODO: Make this print_servertype_icon and move to functions_ui.php. Make XHTML compatible. Make string translatable + * Return a string containing image tag for a given target id (server). + * TODO: Make this print_servertype_icon and move to functions_ui.php. + * Make XHTML compatible. Make string translatable. * - * @deprecated Use print_servertype_icon instead + * @param integer $id Server type id. * - * @param int Server type id + * @deprecated Use print_servertype_icon instead. * - * @return string Fully formatted IMG HTML tag with icon + * @return string Fully formatted IMG HTML tag with icon. */ function servers_show_type($id) { @@ -896,37 +1031,67 @@ function servers_show_type($id) switch ($id) { case 1: - return html_print_image('images/database.png', true, ['title' => get_product_name().' Data server']); + $return = html_print_image( + 'images/database.png', + true, + ['title' => get_product_name().' Data server'] + ); + break; - break; case 2: - return html_print_image('images/network.png', true, ['title' => get_product_name().' Network server']); + $return = html_print_image( + 'images/network.png', + true, + ['title' => get_product_name().' Network server'] + ); + break; - break; case 4: - return html_print_image('images/plugin.png', true, ['title' => get_product_name().' Plugin server']); + $return = html_print_image( + 'images/plugin.png', + true, + ['title' => get_product_name().' Plugin server'] + ); + break; - break; case 5: - return html_print_image('images/chart_bar.png', true, ['title' => get_product_name().' Prediction server']); + $return = html_print_image( + 'images/chart_bar.png', + true, + ['title' => get_product_name().' Prediction server'] + ); + break; - break; case 6: - return html_print_image('images/wmi.png', true, ['title' => get_product_name().' WMI server']); + $return = html_print_image( + 'images/wmi.png', + true, + ['title' => get_product_name().' WMI server'] + ); + break; - break; case 7: - return html_print_image('images/server_web.png', true, ['title' => get_product_name().' WEB server']); + $return = html_print_image( + 'images/server_web.png', + true, + ['title' => get_product_name().' WEB server'] + ); + break; - break; case 8: - return html_print_image('images/module-wux.png', true, ['title' => get_product_name().' WUX server']); + $return = html_print_image( + 'images/module-wux.png', + true, + ['title' => get_product_name().' WUX server'] + ); + break; - break; default: - return '--'; - break; + $return = '--'; + break; } + + return $return; } @@ -941,28 +1106,10 @@ function servers_check_status() { global $config; - switch ($config['dbtype']) { - case 'mysql': - $sql = 'SELECT COUNT(id_server) - FROM tserver - WHERE status = 1 - AND keepalive > NOW() - INTERVAL server_keepalive*2 SECOND'; - break; - - case 'postgresql': - $sql = "SELECT COUNT(id_server) - FROM tserver - WHERE status = 1 - AND keepalive > NOW() - INTERVAL 'server_keepalive*2 SECOND'"; - break; - - case 'oracle': - $sql = "SELECT COUNT(id_server) - FROM tserver - WHERE status = 1 - AND keepalive > systimestamp - INTERVAL 'server_keepalive*2' SECOND"; - break; - } + $sql = 'SELECT COUNT(id_server) + FROM tserver + WHERE status = 1 + AND keepalive > NOW() - INTERVAL server_keepalive*2 SECOND'; $status = (int) db_get_sql($sql); // Cast as int will assure a number value @@ -972,10 +1119,9 @@ function servers_check_status() /** - * @deprecated use servers_get_info instead * Get statistical information for a given server * - * @param int Server id to get status. + * @param integer $id_server Server id to get status. * * @return array Server info array */ From 683059af43a41256bbb6117a849821c70b293026 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Date: Fri, 12 Jul 2019 14:53:44 +0200 Subject: [PATCH 327/460] fixed errors mod/sec tactical view --- pandora_console/include/functions_servers.php | 66 +++++++++++++++---- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/pandora_console/include/functions_servers.php b/pandora_console/include/functions_servers.php index c8738b1bdc..1151db3469 100644 --- a/pandora_console/include/functions_servers.php +++ b/pandora_console/include/functions_servers.php @@ -354,54 +354,70 @@ function servers_get_performance() } } - $info_servers = servers_get_info(); + $info_servers = array_reduce( + servers_get_info(), + function ($carry, $item) { + $carry[$item['server_type']] = $item; + return $carry; + } + ); foreach ($interval_avgs as $id_modulo => $ia) { + $module_lag = 0; switch ($id_modulo) { case MODULE_DATA: + $module_lag = $info_servers[SERVER_TYPE_DATA]['module_lag']; $data['avg_interval_local_modules'] = $ia['avg_interval']; $data['local_modules_rate'] = servers_get_rate( - ($data['avg_interval_local_modules'] - $info_servers[$id_modulo]['module_lag']), - $data['total_local_modules'] + $data['avg_interval_local_modules'], + ($data['total_local_modules'] - $module_lag) ); break; case MODULE_NETWORK: + $module_lag = $info_servers[SERVER_TYPE_NETWORK]['module_lag']; + $module_lag += $info_servers[SERVER_TYPE_SNMP]['module_lag']; + $module_lag += $info_servers[SERVER_TYPE_ENTERPRISE_ICMP]['module_lag']; + $module_lag += $info_servers[SERVER_TYPE_ENTERPRISE_SNMP]['module_lag']; $data['avg_interval_network_modules'] = $ia['avg_interval']; $data['network_modules_rate'] = servers_get_rate( - ($data['avg_interval_network_modules'] - $info_servers[$id_modulo]['module_lag']), - $data['total_network_modules'] + $data['avg_interval_network_modules'], + ($data['total_network_modules'] - $module_lag) ); break; case MODULE_PLUGIN: + $module_lag = $info_servers[SERVER_TYPE_PLUGIN]['module_lag']; $data['avg_interval_plugin_modules'] = $ia['avg_interval']; $data['plugin_modules_rate'] = servers_get_rate( - ($data['avg_interval_plugin_modules'] - $info_servers[$id_modulo]['module_lag']), - $data['total_plugin_modules'] + $data['avg_interval_plugin_modules'], + ($data['total_plugin_modules'] - $module_lag) ); break; case MODULE_PREDICTION: + $module_lag = $info_servers[SERVER_TYPE_PREDICTION]['module_lag']; $data['avg_interval_prediction_modules'] = $ia['avg_interval']; $data['prediction_modules_rate'] = servers_get_rate( - ($data['avg_interval_prediction_modules'] - $info_servers[$id_modulo]['module_lag']), - $data['total_prediction_modules'] + $data['avg_interval_prediction_modules'], + ($data['total_prediction_modules'] - $module_lag) ); break; case MODULE_WMI: + $module_lag = $info_servers[SERVER_TYPE_WMI]['module_lag']; $data['avg_interval_wmi_modules'] = $ia['avg_interval']; $data['wmi_modules_rate'] = servers_get_rate( - ($data['avg_interval_wmi_modules'] - $info_servers[$id_modulo]['module_lag']), - $data['total_wmi_modules'] + $data['avg_interval_wmi_modules'], + ($data['total_wmi_modules'] - $module_lag) ); break; case MODULE_WEB: + $module_lag = $info_servers[SERVER_TYPE_WEB]['module_lag']; $data['avg_interval_web_modules'] = $ia['avg_interval']; $data['web_modules_rate'] = servers_get_rate( - ($data['avg_interval_web_modules'] - $info_servers[$id_modulo]['module_lag']), - $data['total_web_modules'] + $data['avg_interval_web_modules'], + ($data['total_web_modules'] - $module_lag) ); break; @@ -429,13 +445,35 @@ function servers_get_performance() $data['avg_interval_total_modules'] = (array_sum($data['avg_interval_total_modules']) / count($data['avg_interval_total_modules'])); } + $total_modules_lag = 0; + foreach ($info_servers as $key => $value) { + switch ($key) { + case SERVER_TYPE_DATA: + case SERVER_TYPE_NETWORK: + case SERVER_TYPE_SNMP: + case SERVER_TYPE_ENTERPRISE_ICMP: + case SERVER_TYPE_ENTERPRISE_SNMP: + case SERVER_TYPE_PLUGIN: + case SERVER_TYPE_PREDICTION: + case SERVER_TYPE_WMI: + case SERVER_TYPE_WEB: + $total_modules_lag += $value['module_lag']; + break; + + default: + // Not possible. + break; + } + } + $data['remote_modules_rate'] = servers_get_rate( $data['avg_interval_remote_modules'], $data['total_remote_modules'] ); + $data['total_modules_rate'] = servers_get_rate( $data['avg_interval_total_modules'], - $data['total_modules'] + ($data['total_modules'] - $total_modules_lag) ); return ($data); From 9fb32c46991d1f132b72fa50ffbe16efcf390a84 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 12 Jul 2019 18:29:58 +0200 Subject: [PATCH 328/460] Deployment area single targets --- .../godmode/groups/credential_store.php | 2 +- pandora_console/godmode/wizards/Wizard.main.php | 2 +- .../include/functions_credential_store.php | 2 -- pandora_console/include/styles/deployment_list.css | 14 +++++++++++++- pandora_console/include/styles/tables.css | 6 ++++++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/pandora_console/godmode/groups/credential_store.php b/pandora_console/godmode/groups/credential_store.php index 9334cd6065..dd7cc5affb 100644 --- a/pandora_console/godmode/groups/credential_store.php +++ b/pandora_console/godmode/groups/credential_store.php @@ -369,7 +369,7 @@ echo ''; text = err.message; failed = 1; } - if (!failed && data['error']) { + if (!failed && data['error'] != undefined) { title = ""; text = data['error']; failed = 1; diff --git a/pandora_console/godmode/wizards/Wizard.main.php b/pandora_console/godmode/wizards/Wizard.main.php index 8f0bb0bbd8..3292a88ef6 100644 --- a/pandora_console/godmode/wizards/Wizard.main.php +++ b/pandora_console/godmode/wizards/Wizard.main.php @@ -592,7 +592,7 @@ class Wizard $cb_function = $data['cb_function']; $cb_args = $data['cb_args']; - $output_head = '
    '; if ($return === false) { diff --git a/pandora_console/include/functions_credential_store.php b/pandora_console/include/functions_credential_store.php index ea7b3d5c72..048c2bba00 100644 --- a/pandora_console/include/functions_credential_store.php +++ b/pandora_console/include/functions_credential_store.php @@ -56,8 +56,6 @@ function credentials_get_all( global $config; - $user_is_admin = users_is_admin(); - if (!is_array($filter)) { error_log('[credential_get_all] Filter must be an array.'); throw new Exception('[credential_get_all] Filter must be an array.'); diff --git a/pandora_console/include/styles/deployment_list.css b/pandora_console/include/styles/deployment_list.css index ca5385f3f5..c107342246 100644 --- a/pandora_console/include/styles/deployment_list.css +++ b/pandora_console/include/styles/deployment_list.css @@ -2,7 +2,7 @@ ul.wizard li > label:not(.p-switch) { width: auto; } -ul.wizard { +form.top-action-buttons ul.wizard { display: flex; flex-direction: row; } @@ -10,3 +10,15 @@ ul.wizard { ul.wizard li { margin-right: 1em; } + +form.modal ul.wizard li { + display: flex; + flex-direction: row; + width: 90%; + margin: 0.5em auto; + justify-items: center; +} + +form.modal ul.wizard li * { + flex: 1; +} diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index c3e1deb94c..7e49d32c83 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -122,6 +122,7 @@ letter-spacing: 0.3pt; color: #000; background-color: #fff; + cursor: pointer; } .info_table tr th { @@ -341,3 +342,8 @@ a.pandora_pagination.current:hover { background-position-y: center; cursor: pointer; } + +.info_table tr th.sorting_asc, +.info_table tr th.sorting_desc { + padding-left: 15px; +} From 17dcb2feb3d37da5d54a06f510640978671c1a9b Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 13 Jul 2019 00:01:10 +0200 Subject: [PATCH 329/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index b6ecacb2b4..111e21c681 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190712 +Version: 7.0NG.736-190713 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index c7f4f3334e..346b6d7c77 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190712" +pandora_version="7.0NG.736-190713" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 1298d9c2f9..aeb88c14e8 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190712'; +use constant AGENT_BUILD => '190713'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 5fdc516b68..9205df2578 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190712 +%define release 190713 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 891b2769f1..efa996d5f9 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190712 +%define release 190713 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 01d573fb70..20015812b2 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190712" +PI_BUILD="190713" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index d20217c6a0..5e1ad2914a 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190712} +{190713} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 51c386db55..73d5682681 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190712)") +#define PANDORA_VERSION ("7.0NG.736(Build 190713)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index feb8e814e1..09ed42ec64 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190712))" + VALUE "ProductVersion", "(7.0NG.736(Build 190713))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 901b426196..e3e5dcd8eb 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190712 +Version: 7.0NG.736-190713 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 98935e7bf9..1121ae0f22 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190712" +pandora_version="7.0NG.736-190713" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index ab7acc743d..d70b5ed05d 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190712'; +$build_version = 'PC190713'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 7b1d4833a6..e34ce9a6a9 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 388fabbd14..4dec3b0bf7 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190712 +%define release 190713 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 20093a9ea4..238cf017b3 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190712 +%define release 190713 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 48dd2eaa41..ee4a7d4d70 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190712" +PI_BUILD="190713" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index e040b6ea7e..767e5339a7 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190712"; +my $version = "7.0NG.736 PS190713"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 172c7ee278..5a3394609a 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190712"; +my $version = "7.0NG.736 PS190713"; # save program name for logging my $progname = basename($0); From 7a8413154fe2eb781d55e37f46d07cf3c8b5bc88 Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 15 Jul 2019 10:21:25 +0200 Subject: [PATCH 330/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 111e21c681..44d808fbaf 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.736-190713 +Version: 7.0NG.736-190715 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 346b6d7c77..b1476c1cce 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190713" +pandora_version="7.0NG.736-190715" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index aeb88c14e8..632a8139ab 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.736'; -use constant AGENT_BUILD => '190713'; +use constant AGENT_BUILD => '190715'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 9205df2578..396bbf494a 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190713 +%define release 190715 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index efa996d5f9..9c59b4c335 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.736 -%define release 190713 +%define release 190715 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 20015812b2..00d2b0fc86 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190713" +PI_BUILD="190715" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 5e1ad2914a..d07ac42628 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190713} +{190715} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 73d5682681..37df7290d9 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.736(Build 190713)") +#define PANDORA_VERSION ("7.0NG.736(Build 190715)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 09ed42ec64..258a0c6348 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.736(Build 190713))" + VALUE "ProductVersion", "(7.0NG.736(Build 190715))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index e3e5dcd8eb..a042da3590 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.736-190713 +Version: 7.0NG.736-190715 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 1121ae0f22..ff4b1314f2 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.736-190713" +pandora_version="7.0NG.736-190715" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index d70b5ed05d..622b3c5be3 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190713'; +$build_version = 'PC190715'; $pandora_version = 'v7.0NG.736'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index e34ce9a6a9..2553658b2a 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 4dec3b0bf7..67acdab8dd 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190713 +%define release 190715 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 238cf017b3..a90980ca8f 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.736 -%define release 190713 +%define release 190715 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index ee4a7d4d70..f235985de8 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.736" -PI_BUILD="190713" +PI_BUILD="190715" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 767e5339a7..1f34279a01 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.736 PS190713"; +my $version = "7.0NG.736 PS190715"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 5a3394609a..f5a4264243 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.736 PS190713"; +my $version = "7.0NG.736 PS190715"; # save program name for logging my $progname = basename($0); From eb831dbbcd57de965bee3c4e39a498ca2c91cecb Mon Sep 17 00:00:00 2001 From: alejandro-campos Date: Mon, 15 Jul 2019 11:46:35 +0200 Subject: [PATCH 331/460] fixed bug: agent interval not being changed in agent config when changing its value through massive operations --- .../godmode/massive/massive_edit_agents.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pandora_console/godmode/massive/massive_edit_agents.php b/pandora_console/godmode/massive/massive_edit_agents.php index da1a0887b5..668eca53de 100755 --- a/pandora_console/godmode/massive/massive_edit_agents.php +++ b/pandora_console/godmode/massive/massive_edit_agents.php @@ -170,6 +170,8 @@ if ($update_agents) { $n_edited = 0; $result = false; foreach ($id_agents as $id_agent) { + $old_interval_value = db_get_value_filter('intervalo', 'tagente', ['id_agente' => $id_agent]); + if (!empty($values)) { $group_old = false; $disabled_old = false; @@ -196,6 +198,18 @@ if ($update_agents) { $result_metaconsole = agent_update_from_cache($id_agent, $values, $server_name); } + // Update the configuration files. + if ($old_interval_value != $values['intervalo']) { + enterprise_hook( + 'config_agents_update_config_token', + [ + $id_agent, + 'interval', + $values['intervalo'], + ] + ); + } + if ($disabled_old !== false && $disabled_old != $values['disabled']) { enterprise_hook( 'config_agents_update_config_token', From 95254341ce0c3a0c1d732df90dc15df8ee7c81fe Mon Sep 17 00:00:00 2001 From: alejandro-campos Date: Mon, 15 Jul 2019 11:53:25 +0200 Subject: [PATCH 332/460] add condition to check if agent interval token should be updated in massive operations based on previous result --- pandora_console/godmode/massive/massive_edit_agents.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/massive/massive_edit_agents.php b/pandora_console/godmode/massive/massive_edit_agents.php index 668eca53de..ec6c49d8a8 100755 --- a/pandora_console/godmode/massive/massive_edit_agents.php +++ b/pandora_console/godmode/massive/massive_edit_agents.php @@ -199,7 +199,7 @@ if ($update_agents) { } // Update the configuration files. - if ($old_interval_value != $values['intervalo']) { + if ($result && ($old_interval_value != $values['intervalo'])) { enterprise_hook( 'config_agents_update_config_token', [ From 56ddf0700e5eede28e6a15b17a2bb864f40b4a8d Mon Sep 17 00:00:00 2001 From: Daniel Barbero Martin Date: Mon, 15 Jul 2019 11:58:27 +0200 Subject: [PATCH 333/460] fixed error SQL --- pandora_console/operation/agentes/exportdata.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_console/operation/agentes/exportdata.php b/pandora_console/operation/agentes/exportdata.php index 6fbefa93dd..5743084f6a 100644 --- a/pandora_console/operation/agentes/exportdata.php +++ b/pandora_console/operation/agentes/exportdata.php @@ -243,9 +243,10 @@ if (empty($export_btn) || $show_form) { false ); - // Agent selector + // Agent selector. $table->data[1][0] = ''.__('Source agent').''; + $filter = []; if ($group > 0) { $filter['id_grupo'] = (array) $group; } else { From 45e1c324736094056d723023a10d8fd50f549487 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Martin Date: Mon, 15 Jul 2019 15:31:01 +0200 Subject: [PATCH 334/460] fixed events sound --- pandora_console/include/ajax/events.php | 116 ++++++++++++++++++ .../operation/events/sound_events.php | 4 +- 2 files changed, 118 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 22eb1d7836..c891751974 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -83,6 +83,7 @@ $validate_event = get_parameter('validate_event', 0); $delete_event = get_parameter('delete_event', 0); $get_event_filters = get_parameter('get_event_filters', 0); $get_comments = get_parameter('get_comments', 0); +$get_events_fired = (bool) get_parameter('get_events_fired'); if ($get_comments) { $event = get_parameter('event', false); @@ -1695,3 +1696,118 @@ if ($get_table_response_command) { return; } + +if ($get_events_fired) { + $id = get_parameter('id_row'); + $idGroup = get_parameter('id_group'); + $agents = get_parameter('agents', null); + + $query = ' AND id_evento > '.$id; + + $type = []; + $alert = get_parameter('alert_fired'); + if ($alert == 'true') { + $resultAlert = alerts_get_event_status_group( + $idGroup, + [ + 'alert_fired', + 'alert_ceased', + ], + $query, + $agents + ); + } + + $critical = get_parameter('critical'); + if ($critical == 'true') { + $resultCritical = alerts_get_event_status_group( + $idGroup, + 'going_up_critical', + $query, + $agents + ); + } + + $warning = get_parameter('warning'); + if ($warning == 'true') { + $resultWarning = alerts_get_event_status_group( + $idGroup, + 'going_up_warning', + $query, + $agents + ); + } + + $unknown = get_parameter('unknown'); + if ($unknown == 'true') { + $resultUnknown = alerts_get_event_status_group( + $idGroup, + 'going_unknown', + $query, + $agents + ); + } + + if ($resultAlert) { + $return = [ + 'fired' => $resultAlert, + 'sound' => $config['sound_alert'], + ]; + $event = events_get_event($resultAlert); + + $module_name = modules_get_agentmodule_name($event['id_agentmodule']); + $agent_name = agents_get_alias($event['id_agente']); + + $return['message'] = io_safe_output($agent_name).' - '; + $return['message'] .= __('Alert fired in module '); + $return['message'] .= io_safe_output($module_name).' - '; + $return['message'] .= $event['timestamp']; + } else if ($resultCritical) { + $return = [ + 'fired' => $resultCritical, + 'sound' => $config['sound_critical'], + ]; + $event = events_get_event($resultCritical); + + $module_name = modules_get_agentmodule_name($event['id_agentmodule']); + $agent_name = agents_get_alias($event['id_agente']); + + $return['message'] = io_safe_output($agent_name).' - '; + $return['message'] .= __('Module ').io_safe_output($module_name); + $return['message'] .= __(' is going to critical').' - '; + $return['message'] .= $event['timestamp']; + } else if ($resultWarning) { + $return = [ + 'fired' => $resultWarning, + 'sound' => $config['sound_warning'], + ]; + $event = events_get_event($resultWarning); + + $module_name = modules_get_agentmodule_name($event['id_agentmodule']); + $agent_name = agents_get_alias($event['id_agente']); + + $return['message'] = io_safe_output($agent_name).' - '; + $return['message'] .= __('Module ').io_safe_output($module_name); + $return['message'] .= __(' is going to warning').' - '; + $return['message'] .= $event['timestamp']; + } else if ($resultUnknown) { + $return = [ + 'fired' => $resultUnknown, + 'sound' => $config['sound_alert'], + ]; + $event = events_get_event($resultUnknown); + + $module_name = modules_get_agentmodule_name($event['id_agentmodule']); + $agent_name = agents_get_alias($event['id_agente']); + + $return['message'] = io_safe_output($agent_name).' - '; + $return['message'] .= __('Module ').io_safe_output($module_name); + $return['message'] .= __(' is going to unknown').' - '; + $return['message'] .= $event['timestamp']; + } else { + $return = ['fired' => 0]; + } + + echo io_json_mb_encode($return); +} + diff --git a/pandora_console/operation/events/sound_events.php b/pandora_console/operation/events/sound_events.php index 1bd1dcc444..82738f9958 100644 --- a/pandora_console/operation/events/sound_events.php +++ b/pandora_console/operation/events/sound_events.php @@ -196,7 +196,7 @@ function forgetPreviousEvents() { var agents = $("#id_agents").val(); jQuery.post ("../../ajax.php", - {"page" : "operation/events/events", + {"page" : "include/ajax/events", "get_events_fired": 1, "id_group": group, "agents[]" : agents, @@ -222,7 +222,7 @@ function check_event() { if (running) { jQuery.post ("../../ajax.php", - {"page" : "operation/events/events", + {"page" : "include/ajax/events", "get_events_fired": 1, "id_group": group, "agents[]" : agents, From 1323de2097e3e28927b03d4e84452bd90faaeb28 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Martin Date: Mon, 15 Jul 2019 15:43:53 +0200 Subject: [PATCH 335/460] add syncserver conf --- pandora_server/conf/pandora_server.conf.new | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandora_server/conf/pandora_server.conf.new b/pandora_server/conf/pandora_server.conf.new index b81f956577..36540cfad9 100644 --- a/pandora_server/conf/pandora_server.conf.new +++ b/pandora_server/conf/pandora_server.conf.new @@ -601,6 +601,9 @@ syslog_threads 2 # Maximum number of lines queued by the Syslog Server's producer on each run (PANDORA FMS ENTERPRISE ONLY). syslog_max 65535 +# Sync Server +#syncserver + # Port tentacle server #sync_port 41121 @@ -619,7 +622,7 @@ syslog_max 65535 # Sync timeout #sync_timeout 10 -# Address +# Address # sync_address # Target LogStash server, to allow Dataserver and SyslogServer store log information in ElasticSearch From 7d119bfe5a7d6fa88f78fd25cc8ff73247aec08c Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Mon, 15 Jul 2019 17:41:20 +0200 Subject: [PATCH 336/460] Added feature to autorefresh in events view with datatables - #4330 --- pandora_console/general/header.php | 63 +++++++++++++++++---- pandora_console/operation/events/events.php | 20 +++++++ 2 files changed, 73 insertions(+), 10 deletions(-) diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index a093596b2b..cb39abc999 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -670,21 +670,49 @@ if ($config['menu_type'] == 'classic') { + + var autorefresh_draw = ''; $("#header_autorefresh").css('padding-right', '5px'); - var refr_time = ; - var t = new Date(); - t.setTime (t.getTime () + parseInt()); - $("#refrcounter").countdown ({ - until: t, - layout: '%M%nn%M:%S%nn%S', - labels: ['', '', '', '', '', '', ''], - onExpiry: function () { + if(autorefresh_draw == true) { + var refresh_interval = parseInt(''); + var until_time=''; + + function events_refresh() { + until_time = new Date(); + until_time.setTime (until_time.getTime () + parseInt()); + + $("#refrcounter").countdown ({ + until: until_time, + layout: '%M%nn%M:%S%nn%S', + labels: ['', '', '', '', '', '', ''], + onExpiry: function () { + dt_events.draw(true); + } + }); + } + // Start the countdown when page is loaded (first time). + events_refresh(); + // Repeat countdown according to refresh_interval. + setInterval(events_refresh, refresh_interval); + } else { + var refr_time = ; + var t = new Date(); + t.setTime (t.getTime () + parseInt()); + $("#refrcounter").countdown ({ + until: t, + layout: '%M%nn%M:%S%nn%S', + labels: ['', '', '', '', '', '', ''], + onExpiry: function () { href = $("a.autorefresh").attr ("href"); href = href + refr_time; $(document).attr ("location", href); } }); + } @@ -694,8 +722,23 @@ if ($config['menu_type'] == 'classic') { $("#combo_refr").toggle (); $("select#ref").change (function () { href = $("a.autorefresh").attr ("href"); - $(document).attr ("location", href + this.value); - }); + + if(autorefresh_draw == true){ + inputs = $("#events_form :input"); + values = {}; + inputs.each(function() { + values[this.name] = $(this).val(); + }) + + var newValue = btoa(JSON.stringify(values)); + console.log(newValue); + $(document).attr("location", href+'&fb64=' + newValue + '&refr=' + this.value); + + } else { + console.log('recargo'); + $(document).attr ("location", href + this.value); + } + }); return false; }); diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 9561872288..b316bea7ff 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -1469,6 +1469,11 @@ echo "
    '; echo ''; + +if ($_GET['refr'] || $do_refresh === true) { + $autorefresh_draw = true; +} + ?> '."\n\t"; } @@ -1892,7 +1892,7 @@ function ui_process_page_head($string, $bitfield) array_push($loaded, $name); - $url_js = ui_get_full_url($filename); + $url_js = ui_get_full_url($filename, false, false, false); $output .= ''."\n\t"; } @@ -2841,7 +2841,7 @@ function ui_progress( width_interval = '.$ajax['interval'].'; if (last % 10 == 0) { $.post({ - url: "'.ui_get_full_url('ajax.php').'", + url: "'.ui_get_full_url('ajax.php', false, false, false).'", data: {'; if (is_array($ajax['data'])) { foreach ($ajax['data'] as $token => $value) { @@ -3216,7 +3216,7 @@ function ui_print_datatable(array $parameters) ], lengthMenu: '.json_encode($pagination_options).', ajax: { - url: "'.ui_get_full_url('ajax.php').'", + url: "'.ui_get_full_url('ajax.php', false, false, false).'", type: "POST", dataSrc: function (json) { if (json.error) { @@ -3692,7 +3692,7 @@ function ui_get_url_refresh($params=false, $relative=true, $add_post=true) $url = htmlspecialchars($url); if (! $relative) { - return ui_get_full_url($url); + return ui_get_full_url($url, false, false, false); } return $url; @@ -4451,7 +4451,7 @@ function ui_print_agent_autocomplete_input($parameters) // Javascript configurations // ------------------------------------------------------------------. - $javascript_ajax_page = ui_get_full_url('ajax.php', false, false, false, false); + $javascript_ajax_page = ui_get_full_url('ajax.php', false, false, false); // Default value. if (isset($parameters['javascript_ajax_page'])) { $javascript_ajax_page = $parameters['javascript_ajax_page']; diff --git a/pandora_console/include/functions_visual_map.php b/pandora_console/include/functions_visual_map.php index dd4be3c501..56620cda9a 100755 --- a/pandora_console/include/functions_visual_map.php +++ b/pandora_console/include/functions_visual_map.php @@ -3278,7 +3278,12 @@ function visual_map_get_color_line_status($layoutData) */ function visual_map_get_image_status_element($layoutData, $status=false) { - $img = 'images/console/icons/'.$layoutData['image']; + $metaconsole_hack = ''; + if (is_metaconsole()) { + $metaconsole_hack = '../../'; + } + + $img = $metaconsole_hack.'images/console/icons/'.$layoutData['image']; if ($layoutData['type'] == 5) { // ICON ELEMENT @@ -3611,11 +3616,6 @@ function visual_map_print_visual_map( global $config; - $metaconsole_hack = '/'; - if (defined('METACONSOLE')) { - $metaconsole_hack = '../../'; - } - enterprise_include_once('meta/include/functions_ui_meta.php'); include_once $config['homedir'].'/include/functions_custom_graphs.php'; @@ -3681,11 +3681,11 @@ function visual_map_print_visual_map( $mapHeight = $layout['height']; $backgroundImage = ''; if ($layout['background'] != 'None.png') { - $backgroundImage = $metaconsole_hack.'images/console/background/'.$layout['background']; + $backgroundImage = 'images/console/background/'.$layout['background']; } } - if (defined('METACONSOLE')) { + if (is_metaconsole()) { echo "
    "; } @@ -3698,7 +3698,7 @@ function visual_map_print_visual_map( background-color:'.$layout['background_color'].';">'; if ($layout['background'] != 'None.png') { - echo ""; + echo ""; } $layout_datas = db_get_all_rows_field_filter( @@ -3776,7 +3776,7 @@ function visual_map_print_visual_map( // End main div echo '
    '; - if (defined('METACONSOLE')) { + if (is_metaconsole()) { echo ''; } } diff --git a/pandora_console/include/graphs/functions_flot.php b/pandora_console/include/graphs/functions_flot.php index 8e32673b48..309ddf364b 100644 --- a/pandora_console/include/graphs/functions_flot.php +++ b/pandora_console/include/graphs/functions_flot.php @@ -24,7 +24,7 @@ function include_javascript_dependencies_flot_graph($return=false) $is_include_javascript = true; $metaconsole_hack = ''; - if (defined('METACONSOLE')) { + if (is_metaconsole()) { $metaconsole_hack = '../../'; } From ff44666e41bfdd23fe43adbff17384e369640813 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Wed, 21 Aug 2019 09:49:17 +0200 Subject: [PATCH 453/460] fixed visual error2 --- pandora_console/godmode/agentes/agent_manager.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index c4a0bfe8e0..ca72ac286b 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -971,6 +971,8 @@ if (enterprise_installed()) { ); } + echo '
    '; + echo '
    '; } From 1d0875e89ae531144d1e6beaeb87a560e0e293e5 Mon Sep 17 00:00:00 2001 From: artica Date: Thu, 22 Aug 2019 00:01:11 +0200 Subject: [PATCH 454/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 8de0b5d54f..047bb2c0c9 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.738-190821 +Version: 7.0NG.738-190822 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index a26e778649..0b848d2048 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190821" +pandora_version="7.0NG.738-190822" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index ae770d40a8..e83f11e231 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.738'; -use constant AGENT_BUILD => '190821'; +use constant AGENT_BUILD => '190822'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 0e93bba00b..a8d1783d08 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190821 +%define release 190822 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index b3441e3945..405d9a527e 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190821 +%define release 190822 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 7056ce4102..832e17abdf 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190821" +PI_BUILD="190822" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index b5ec69f3d6..aa3d8b1aaa 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190821} +{190822} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 9863811ef2..f549460365 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.738(Build 190821)") +#define PANDORA_VERSION ("7.0NG.738(Build 190822)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index a672879c29..f17a6cfc09 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.738(Build 190821))" + VALUE "ProductVersion", "(7.0NG.738(Build 190822))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 999adf9b50..7c3d72b0fa 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.738-190821 +Version: 7.0NG.738-190822 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 1dd37982e9..aded63bd4d 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190821" +pandora_version="7.0NG.738-190822" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index a084e77246..08ccd024a3 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190821'; +$build_version = 'PC190822'; $pandora_version = 'v7.0NG.738'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index c9b93d5147..e1a30413fd 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 4fe138ff1a..8d7b1ca43d 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190821 +%define release 190822 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index cf930a0ef9..8f71041b54 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190821 +%define release 190822 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index fb7fb32dfe..e6d720030f 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190821" +PI_BUILD="190822" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 7eee0698fa..38f3b6e77d 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.738 PS190821"; +my $version = "7.0NG.738 PS190822"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 79ac99404b..6ddd676c33 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.738 PS190821"; +my $version = "7.0NG.738 PS190822"; # save program name for logging my $progname = basename($0); From 31da17db031830760253b89f37b19d3dabd5cba4 Mon Sep 17 00:00:00 2001 From: Daniel Barbero Martin Date: Thu, 22 Aug 2019 14:27:45 +0200 Subject: [PATCH 455/460] fixed event view metaconsole --- pandora_console/include/ajax/events.php | 8 ++++---- pandora_console/include/functions_events.php | 18 +++++++++--------- pandora_console/include/functions_ui.php | 4 ++-- pandora_console/operation/events/events.php | 2 ++ 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index c891751974..ad9d59a748 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -1290,12 +1290,14 @@ if ($get_extended_event) { $details = events_page_details($event, $server); + if ($meta) { + metaconsole_restore_db(); + } + if (events_has_extended_info($event['id_evento']) === true) { $related = events_page_related($event, $server); } - // Juanma (09/05/2014) Fix: Needs to reconnect to node, in previous funct - // node connection was lost. if ($meta) { $server = metaconsole_get_connection_by_id($server_id); metaconsole_connect($server); @@ -1574,7 +1576,6 @@ if ($get_list_events_agents) { $date_from = get_parameter('date_from'); $date_to = get_parameter('date_to'); $id_user = $config['id_user']; - $server_id = get_parameter('server_id'); $returned_sql = events_sql_events_grouped_agents( $id_agent, @@ -1810,4 +1811,3 @@ if ($get_events_fired) { echo io_json_mb_encode($return); } - diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index bf51bae9c1..1c24eef9b3 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -878,9 +878,11 @@ function events_get_all( $agent_join_filters = []; $tagente_table = 'tagente'; $tagente_field = 'id_agente'; + $conditionMetaconsole = ''; if (is_metaconsole()) { $tagente_table = 'tmetaconsole_agent'; $tagente_field = 'id_tagente'; + $conditionMetaconsole = ' AND ta.id_tmetaconsole_setup = te.server_id '; } // Agent alias. @@ -1214,12 +1216,12 @@ function events_get_all( $server_join = ''; if (is_metaconsole()) { - $server_join = ' INNER JOIN tmetaconsole_setup ts - ON ts.id = te.server_id AND ts.server_name = ta.server_name'; + $server_join = ' LEFT JOIN tmetaconsole_setup ts + ON ts.id = te.server_id'; if (!empty($filter['server_id'])) { $server_join = sprintf( - ' INNER JOIN tmetaconsole_setup ts - ON ts.id = te.server_id AND ts.server_name = ta.server_name AND ts.id= %d', + ' LEFT JOIN tmetaconsole_setup ts + ON ts.id = te.server_id AND ts.id= %d', $filter['server_id'] ); } @@ -1254,6 +1256,7 @@ function events_get_all( %s JOIN %s ta ON ta.%s = te.id_agente %s + %s %s JOIN tgrupo tg ON te.id_grupo = tg.id_grupo %s @@ -1273,6 +1276,7 @@ function events_get_all( $tagente_join, $tagente_table, $tagente_field, + $conditionMetaconsole, join(' ', $agent_join_filters), $tgrupo_join, join(' ', $tgrupo_join_filters), @@ -3883,7 +3887,7 @@ function events_page_details($event, $server='') global $config; // If server is provided, get the hash parameters. - if (!empty($server) && defined('METACONSOLE')) { + if (!empty($server) && is_metaconsole()) { $hashdata = metaconsole_get_server_hashdata($server); $hashstring = '&loginhash=auto&loginhash_data='.$hashdata.'&loginhash_user='.str_rot13($config['id_user']); $serverstring = $server['server_url'].'/'; @@ -4185,10 +4189,6 @@ function events_page_details($event, $server='') $details = '
    '.html_print_table($table_details, true).'
    '; - if (!empty($server) && defined('METACONSOLE')) { - metaconsole_restore_db(); - } - return $details; } diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 7b7170ff09..15a92c3bcf 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -1487,7 +1487,7 @@ function ui_require_javascript_file($name, $path='include/javascript/', $echo_ta $filename = $path.$name.'.js'; if ($echo_tag) { - echo ''; + echo ''; return null; } @@ -1504,7 +1504,7 @@ function ui_require_javascript_file($name, $path='include/javascript/', $echo_ta return false; } - if (defined('METACONSOLE')) { + if (is_metaconsole()) { $config['js'][$name] = '../../'.$filename; } else { $config['js'][$name] = $filename; diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 52eac8b77e..e7f927a3b9 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -246,6 +246,8 @@ if (is_ajax()) { $fields[] = 'ta.server_name as server_name'; } else { $fields[] = 'ts.server_name as server_name'; + $fields[] = 'te.id_agentmodule'; + $fields[] = 'te.server_id'; } $events = events_get_all( From 6a982697d23664217c4805b396ca3b3bcf16b972 Mon Sep 17 00:00:00 2001 From: artica Date: Fri, 23 Aug 2019 00:01:11 +0200 Subject: [PATCH 456/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 047bb2c0c9..08d03aa2cb 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.738-190822 +Version: 7.0NG.738-190823 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 0b848d2048..cbc2443767 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190822" +pandora_version="7.0NG.738-190823" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index e83f11e231..8a5e85fc86 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.738'; -use constant AGENT_BUILD => '190822'; +use constant AGENT_BUILD => '190823'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index a8d1783d08..aa180e4cf5 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190822 +%define release 190823 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 405d9a527e..bda4a011f6 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190822 +%define release 190823 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 832e17abdf..719c877d2f 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190822" +PI_BUILD="190823" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index aa3d8b1aaa..6e5c577420 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190822} +{190823} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index f549460365..99983bb093 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.738(Build 190822)") +#define PANDORA_VERSION ("7.0NG.738(Build 190823)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index f17a6cfc09..a5a963b891 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.738(Build 190822))" + VALUE "ProductVersion", "(7.0NG.738(Build 190823))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 7c3d72b0fa..826c706135 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.738-190822 +Version: 7.0NG.738-190823 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index aded63bd4d..458846bb1e 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190822" +pandora_version="7.0NG.738-190823" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 08ccd024a3..5051d92052 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190822'; +$build_version = 'PC190823'; $pandora_version = 'v7.0NG.738'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index e1a30413fd..d3311baa9f 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 8d7b1ca43d..0030dc084e 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190822 +%define release 190823 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 8f71041b54..0bce047f69 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190822 +%define release 190823 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index e6d720030f..0d2323fa89 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190822" +PI_BUILD="190823" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 38f3b6e77d..7e8e659bf6 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.738 PS190822"; +my $version = "7.0NG.738 PS190823"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 6ddd676c33..f026223ef3 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.738 PS190822"; +my $version = "7.0NG.738 PS190823"; # save program name for logging my $progname = basename($0); From 56da633588b5e771d60f17b7619beb41f69a4830 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 24 Aug 2019 00:01:09 +0200 Subject: [PATCH 457/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 08d03aa2cb..776a3bb076 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.738-190823 +Version: 7.0NG.738-190824 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index cbc2443767..d0d5b488d0 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190823" +pandora_version="7.0NG.738-190824" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 8a5e85fc86..5412ed7acd 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.738'; -use constant AGENT_BUILD => '190823'; +use constant AGENT_BUILD => '190824'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index aa180e4cf5..6c5a208e63 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190823 +%define release 190824 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index bda4a011f6..373671560d 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190823 +%define release 190824 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 719c877d2f..aff292dd9a 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190823" +PI_BUILD="190824" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 6e5c577420..0e90b1f5f1 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190823} +{190824} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 99983bb093..8516961761 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.738(Build 190823)") +#define PANDORA_VERSION ("7.0NG.738(Build 190824)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index a5a963b891..5da94b6d85 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.738(Build 190823))" + VALUE "ProductVersion", "(7.0NG.738(Build 190824))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 826c706135..4fb2edec09 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.738-190823 +Version: 7.0NG.738-190824 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 458846bb1e..ea6b0383a1 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190823" +pandora_version="7.0NG.738-190824" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 5051d92052..47056d919a 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190823'; +$build_version = 'PC190824'; $pandora_version = 'v7.0NG.738'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index d3311baa9f..b06098ad59 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 0030dc084e..259daec722 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190823 +%define release 190824 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 0bce047f69..f6cb0e1bc1 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190823 +%define release 190824 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 0d2323fa89..727db318ae 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190823" +PI_BUILD="190824" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 7e8e659bf6..a6ae2c4575 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.738 PS190823"; +my $version = "7.0NG.738 PS190824"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index f026223ef3..4bee8c7128 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.738 PS190823"; +my $version = "7.0NG.738 PS190824"; # save program name for logging my $progname = basename($0); From 13204266284e53fa201a51b2606c0fb84c1e05b6 Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 25 Aug 2019 00:01:09 +0200 Subject: [PATCH 458/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 776a3bb076..9b2c581c75 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.738-190824 +Version: 7.0NG.738-190825 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index d0d5b488d0..92492f9f56 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190824" +pandora_version="7.0NG.738-190825" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 5412ed7acd..5fcffd9c93 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.738'; -use constant AGENT_BUILD => '190824'; +use constant AGENT_BUILD => '190825'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 6c5a208e63..f69a525b5b 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190824 +%define release 190825 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 373671560d..569acec41b 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190824 +%define release 190825 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index aff292dd9a..e7d42db814 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190824" +PI_BUILD="190825" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 0e90b1f5f1..b1ba0858bc 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190824} +{190825} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 8516961761..23ce35a9a3 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.738(Build 190824)") +#define PANDORA_VERSION ("7.0NG.738(Build 190825)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 5da94b6d85..85f8d086eb 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.738(Build 190824))" + VALUE "ProductVersion", "(7.0NG.738(Build 190825))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 4fb2edec09..2997ff62ae 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.738-190824 +Version: 7.0NG.738-190825 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index ea6b0383a1..25086e1477 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190824" +pandora_version="7.0NG.738-190825" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 47056d919a..8eb36d6f21 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190824'; +$build_version = 'PC190825'; $pandora_version = 'v7.0NG.738'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index b06098ad59..f4f6378c71 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 259daec722..e06d31d125 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190824 +%define release 190825 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index f6cb0e1bc1..88b846bb39 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190824 +%define release 190825 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 727db318ae..849266a173 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190824" +PI_BUILD="190825" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index a6ae2c4575..0b87298c18 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.738 PS190824"; +my $version = "7.0NG.738 PS190825"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 4bee8c7128..bd477f9e2a 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.738 PS190824"; +my $version = "7.0NG.738 PS190825"; # save program name for logging my $progname = basename($0); From a2713517f04e19efcd1394607ff57ac64601696a Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 26 Aug 2019 00:01:08 +0200 Subject: [PATCH 459/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 9b2c581c75..21c8eb1618 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.738-190825 +Version: 7.0NG.738-190826 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 92492f9f56..c1b88bde90 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190825" +pandora_version="7.0NG.738-190826" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 5fcffd9c93..ba3aa81ec4 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.738'; -use constant AGENT_BUILD => '190825'; +use constant AGENT_BUILD => '190826'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index f69a525b5b..f16618c804 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190825 +%define release 190826 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 569acec41b..d1f5f59e3c 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190825 +%define release 190826 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index e7d42db814..94f7220911 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190825" +PI_BUILD="190826" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index b1ba0858bc..3435126db0 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190825} +{190826} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 23ce35a9a3..1d4fe508f1 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.738(Build 190825)") +#define PANDORA_VERSION ("7.0NG.738(Build 190826)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 85f8d086eb..e02c737f1a 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.738(Build 190825))" + VALUE "ProductVersion", "(7.0NG.738(Build 190826))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 2997ff62ae..65772d5f28 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.738-190825 +Version: 7.0NG.738-190826 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 25086e1477..c76bc76501 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190825" +pandora_version="7.0NG.738-190826" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 8eb36d6f21..765bd6ed0b 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190825'; +$build_version = 'PC190826'; $pandora_version = 'v7.0NG.738'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index f4f6378c71..5417e996a2 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index e06d31d125..5df863894a 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190825 +%define release 190826 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 88b846bb39..5ba44ba9ee 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190825 +%define release 190826 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 849266a173..770bd65ff4 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190825" +PI_BUILD="190826" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 0b87298c18..5f2fd40773 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.738 PS190825"; +my $version = "7.0NG.738 PS190826"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index bd477f9e2a..915a3021d9 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.738 PS190825"; +my $version = "7.0NG.738 PS190826"; # save program name for logging my $progname = basename($0); From c06ec0477c6cb78a76f24066d34fdb9ed340277e Mon Sep 17 00:00:00 2001 From: artica Date: Tue, 27 Aug 2019 00:01:10 +0200 Subject: [PATCH 460/460] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 21c8eb1618..683ba31482 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.738-190826 +Version: 7.0NG.738-190827 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index c1b88bde90..19827255c3 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190826" +pandora_version="7.0NG.738-190827" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index ba3aa81ec4..71625bf37b 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.738'; -use constant AGENT_BUILD => '190826'; +use constant AGENT_BUILD => '190827'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index f16618c804..807c21d73e 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190826 +%define release 190827 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index d1f5f59e3c..2becba21bb 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.738 -%define release 190826 +%define release 190827 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 94f7220911..0a59fdcd41 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190826" +PI_BUILD="190827" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 3435126db0..360de002b7 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190826} +{190827} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 1d4fe508f1..f4f042de30 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.738(Build 190826)") +#define PANDORA_VERSION ("7.0NG.738(Build 190827)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index e02c737f1a..34009e3392 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.738(Build 190826))" + VALUE "ProductVersion", "(7.0NG.738(Build 190827))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 65772d5f28..dd1b74c83b 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.738-190826 +Version: 7.0NG.738-190827 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index c76bc76501..88dc8df1e6 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.738-190826" +pandora_version="7.0NG.738-190827" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 765bd6ed0b..c80721b720 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190826'; +$build_version = 'PC190827'; $pandora_version = 'v7.0NG.738'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 5417e996a2..6d1ecf9435 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 5df863894a..8a4fd375f6 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190826 +%define release 190827 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 5ba44ba9ee..1c899363db 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.738 -%define release 190826 +%define release 190827 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 770bd65ff4..960acb6d57 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.738" -PI_BUILD="190826" +PI_BUILD="190827" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 5f2fd40773..0648acc183 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.738 PS190826"; +my $version = "7.0NG.738 PS190827"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 915a3021d9..13ecf4bb32 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.738 PS190826"; +my $version = "7.0NG.738 PS190827"; # save program name for logging my $progname = basename($0);
    '.__('Generated').': '.$date_today.'