' .
html_print_checkbox_extended
('clippy_is_annoying', 1, $clippy_is_annoying, false,
'set_clippy_annoying()', '', true) .
diff --git a/pandora_console/include/help/en/help_profile.php b/pandora_console/include/help/en/help_profile.php
index 58327eb36a..1222af8668 100644
--- a/pandora_console/include/help/en/help_profile.php
+++ b/pandora_console/include/help/en/help_profile.php
@@ -51,7 +51,7 @@
Downtime Management | AW
diff --git a/pandora_console/include/javascript/functions_pandora_networkmap.js b/pandora_console/include/javascript/functions_pandora_networkmap.js
index 86ab6bd914..0aec15c35d 100644
--- a/pandora_console/include/javascript/functions_pandora_networkmap.js
+++ b/pandora_console/include/javascript/functions_pandora_networkmap.js
@@ -1589,8 +1589,14 @@ function show_menu(item, data) {
name: interface_link_add,
icon: "interface_link_children",
disabled : function() {
+ console.log(data);
if (enterprise_installed) {
- return false;
+ if (data.type == 3) {
+ return true;
+ }
+ else {
+ return false;
+ }
}
else {
return true;
@@ -1657,7 +1663,12 @@ function show_menu(item, data) {
icon: "interface_link_parent",
disabled : function() {
if (enterprise_installed) {
- return false;
+ if (data.type == 3) {
+ return true;
+ }
+ else {
+ return false;
+ }
}
else {
return true;
@@ -1681,7 +1692,12 @@ function show_menu(item, data) {
icon: "interface_link_cancel",
disabled : function() {
if (enterprise_installed) {
- return false;
+ if (data.type == 3) {
+ return true;
+ }
+ else {
+ return false;
+ }
}
else {
return true;
diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css
index c2aede5f8c..905f57d35a 100644
--- a/pandora_console/include/styles/pandora.css
+++ b/pandora_console/include/styles/pandora.css
@@ -4139,6 +4139,8 @@ div#main_help_new_content {
padding-top: 10px;
background: white;
height: 100%;
+ font-size: 12pt;
+ font-family: 'lato-bolder';
}
div#main_help_new_content h1 {
@@ -4150,6 +4152,15 @@ div#main_help_new_content p {
font-family: 'lato-bolder';
font-size: 12pt;
}
+div#main_help_new_content b {
+ font-family: 'lato-bolder';
+ font-size: 12pt;
+}
+
+div#main_help_new_content li {
+ font-family: 'lato-bolder';
+ font-size: 12pt;
+}
div#footer_help{
background: #333;
diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css
index 981b6223fa..3dca8bdbf9 100644
--- a/pandora_console/include/styles/pandora_black.css
+++ b/pandora_console/include/styles/pandora_black.css
@@ -2951,6 +2951,10 @@ table#policy_modules td * {
border-top-right-radius: 2px;
}
+.clippy_body {
+ color: black;
+}
+
#dialog-double_auth-container {
width: 100%;
text-align: center;
diff --git a/pandora_console/install.php b/pandora_console/install.php
index b803306db9..6acecb6d2e 100644
--- a/pandora_console/install.php
+++ b/pandora_console/install.php
@@ -71,7 +71,7 @@
getRequest('agent_id', '0');
$width = $system->getRequest('width', '400');
graph_graphic_agentevents(
- $this->id, $width, 30, SECONDS_1DAY, ui_get_full_url(false));
+ $agent_id, $width, 30, SECONDS_1DAY, ui_get_full_url(false));
exit;
}
}
diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php
index 23b5dabed8..111abffeee 100755
--- a/pandora_console/operation/agentes/estado_generalagente.php
+++ b/pandora_console/operation/agentes/estado_generalagente.php
@@ -601,7 +601,7 @@ $data[0][0] .=
' .
__('Events (24h)') .
' |
---|
' .
- ' ' .
+ ' | ' .
graph_graphic_agentevents ($id_agente, 450, 15, SECONDS_1DAY, '', true, true) .
'
| ' .
'';
diff --git a/pandora_console/operation/agentes/pandora_networkmap.php b/pandora_console/operation/agentes/pandora_networkmap.php
index 85acec24d5..2c1bd6f29c 100644
--- a/pandora_console/operation/agentes/pandora_networkmap.php
+++ b/pandora_console/operation/agentes/pandora_networkmap.php
@@ -207,12 +207,14 @@ else if ($update_networkmap || $copy_networkmap || $delete) {
$recon_task_id = (int) get_parameter(
'recon_task_id', 0);
-
+
$source = (string)get_parameter('source', 'group');
$values = array();
$values['name'] = $name;
$values['id_group'] = $id_group;
+
+ /*
if ($source == 'group') {
$values['source'] = 0;
$values['source_data'] = $id_group;
@@ -225,6 +227,32 @@ else if ($update_networkmap || $copy_networkmap || $delete) {
$values['source'] = 2;
$values['source_data'] = $ip_mask;
}
+ */
+
+ switch ($method) {
+ case 'twopi':
+ $values['generation_method'] = 2;
+ break;
+ case 'dot':
+ $values['generation_method'] = 1;
+ break;
+ case 'circo':
+ $values['generation_method'] = 0;
+ break;
+ case 'neato':
+ $values['generation_method'] = 3;
+ break;
+ case 'fdp':
+ $values['generation_method'] = 4;
+ break;
+ case 'radial_dinamic':
+ $values['generation_method'] = 6;
+ break;
+ default:
+ $values['generation_method'] = 2;
+ break;
+ }
+
$description = get_parameter('description', '');
$values['description'] = $description;
diff --git a/pandora_console/operation/agentes/pandora_networkmap.view.php b/pandora_console/operation/agentes/pandora_networkmap.view.php
index 5b34ee442c..5c5d2969c4 100644
--- a/pandora_console/operation/agentes/pandora_networkmap.view.php
+++ b/pandora_console/operation/agentes/pandora_networkmap.view.php
@@ -756,6 +756,7 @@ else {
}
$nodes_and_relations = networkmap_process_networkmap($id);
+
show_networkmap($id, $user_readonly, $nodes_and_relations, $dash_mode, $map_dash_details);
}
?>
diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php
index 2cc03db08d..58f221bb76 100644
--- a/pandora_console/operation/agentes/status_monitor.php
+++ b/pandora_console/operation/agentes/status_monitor.php
@@ -561,9 +561,8 @@ $selectDataDown = '';
$selectTimestampUp = '';
$selectTimestampDown = '';
$order = null;
-
switch ($sortField) {
- case 'agent_name':
+ case 'agent_alias':
switch ($sort) {
case 'up':
$selectAgentNameUp = $selected;
diff --git a/pandora_console/operation/visual_console/render_view.php b/pandora_console/operation/visual_console/render_view.php
index 4364bfda9f..261205818b 100755
--- a/pandora_console/operation/visual_console/render_view.php
+++ b/pandora_console/operation/visual_console/render_view.php
@@ -282,7 +282,12 @@ $ignored_params['refr'] = '';
$('.item:not(.icon) img:not(.b64img)').each( function() {
if ($(this).css('float')=='left' || $(this).css('float')=='right') {
- $(this).css('margin-top',(parseInt($(this).parent().parent().css('height'))/2-parseInt($(this).css('height'))/2)+'px');
+ if( $(this).parent()[0].tagName == 'DIV'){
+ $(this).css('margin-top',(parseInt($(this).parent().css('height'))/2-parseInt($(this).css('height'))/2)+'px');
+ }
+ else if ( $(this).parent()[0].tagName == 'A') {
+ $(this).css('margin-top',(parseInt($(this).parent().parent().css('height'))/2-parseInt($(this).css('height'))/2)+'px');
+ }
$(this).css('margin-left','');
}
else {
@@ -290,7 +295,12 @@ $ignored_params['refr'] = '';
$(this).css('margin-left','');
$(this).css('margin-top','');
} else {
- $(this).css('margin-left',(parseInt($(this).parent().parent().css('width'))/2-parseInt($(this).css('width'))/2)+'px');
+ if( $(this).parent()[0].tagName == 'DIV'){
+ $(this).css('margin-left',(parseInt($(this).parent().css('width'))/2-parseInt($(this).css('width'))/2)+'px');
+ }
+ else if ( $(this).parent()[0].tagName == 'A') {
+ $(this).css('margin-left',(parseInt($(this).parent().parent().css('width'))/2-parseInt($(this).css('width'))/2)+'px');
+ }
$(this).css('margin-top','');
}
}
diff --git a/pandora_console/pandora_console.redhat.spec b/pandora_console/pandora_console.redhat.spec
index 35af80ae25..733e684376 100644
--- a/pandora_console/pandora_console.redhat.spec
+++ b/pandora_console/pandora_console.redhat.spec
@@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.712
-%define release 170907
+%define release 170919
# User and Group under which Apache is running
%define httpd_name httpd
diff --git a/pandora_console/pandora_console.spec b/pandora_console/pandora_console.spec
index af8fd47960..948cda6ed7 100644
--- a/pandora_console/pandora_console.spec
+++ b/pandora_console/pandora_console.spec
@@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.712
-%define release 170907
+%define release 170919
%define httpd_name httpd
# User and Group under which Apache is running
%define httpd_name apache2
diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql
index 41bb6aae81..3640357a8f 100644
--- a/pandora_console/pandoradb.sql
+++ b/pandora_console/pandoradb.sql
@@ -1355,6 +1355,7 @@ CREATE TABLE IF NOT EXISTS `tlayout_data` (
`label_position` varchar(50) NOT NULL default 'down',
`border_color` varchar(200) DEFAULT "",
`fill_color` varchar(200) DEFAULT "",
+ `show_statistics` tinyint(2) NOT NULL default '0',
PRIMARY KEY(`id`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
diff --git a/pandora_server/DEBIAN/control b/pandora_server/DEBIAN/control
index 31256f7dd4..cc2d4081e1 100644
--- a/pandora_server/DEBIAN/control
+++ b/pandora_server/DEBIAN/control
@@ -1,5 +1,5 @@
package: pandorafms-server
-Version: 7.0NG.712-170907
+Version: 7.0NG.712-170919
Architecture: all
Priority: optional
Section: admin
diff --git a/pandora_server/DEBIAN/make_deb_package.sh b/pandora_server/DEBIAN/make_deb_package.sh
index ef77866e95..643efc757c 100644
--- a/pandora_server/DEBIAN/make_deb_package.sh
+++ b/pandora_server/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.712-170907"
+pandora_version="7.0NG.712-170919"
package_cpan=0
package_pandora=1
diff --git a/pandora_server/bin/pandora_server b/pandora_server/bin/pandora_server
index 709b6c7b04..ef617343aa 100755
--- a/pandora_server/bin/pandora_server
+++ b/pandora_server/bin/pandora_server
@@ -607,7 +607,10 @@ sub main() {
$server->update();
}
- db_do ($DBH, "UPDATE tserver SET status = 0 WHERE now()-keepalive > 2*server_keepalive");
+ db_do ($DBH,
+ "UPDATE tserver SET status = 0
+ WHERE UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(keepalive) > 2*server_keepalive"
+ );
# Set the master server
pandora_set_master(\%Config, $DBH);
diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm
index 7c313a02c1..1891fd9cbf 100644
--- a/pandora_server/lib/PandoraFMS/Config.pm
+++ b/pandora_server/lib/PandoraFMS/Config.pm
@@ -43,7 +43,7 @@ our @EXPORT = qw(
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "7.0NG.712";
-my $pandora_build = "170907";
+my $pandora_build = "170919";
our $VERSION = $pandora_version." ".$pandora_build;
# Setup hash
diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm
index 1e7b6a42ab..88edb0a11a 100644
--- a/pandora_server/lib/PandoraFMS/Core.pm
+++ b/pandora_server/lib/PandoraFMS/Core.pm
@@ -1110,8 +1110,10 @@ sub pandora_execute_action ($$$$$$$$$;$) {
$field3 = subst_alert_macros ($field3, \%macros, $pa_config, $dbh, $agent, $module);
# Check for _module_graph_Xh_ macros
+ # Check for _module_graph_Xh_ macros and _module_graphth_Xh_
my $module_graph_list = {};
my $macro_regexp = "_modulegraph_(\\d+)h_";
+ my $macro_regexp2 = "_modulegraphth_(\\d+)h_";
# API connection
my $ua = new LWP::UserAgent;
@@ -1124,13 +1126,21 @@ sub pandora_execute_action ($$$$$$$$$;$) {
$params->{"op"} = "get";
$params->{"op2"} = "module_graph";
$params->{"id"} = $module->{'id_agente_modulo'};
-
+ my $cid ='';
my $subst_func = sub {
my $hours = shift;
+ my $threshold = shift;
my $period = $hours * 3600; # Hours to seconds
- $params->{"other"} = $period . '%7C0';
+ if($threshold == 0){
+ $params->{"other"} = $period . '%7C0%7C0';
+ $cid = 'module_graph_' . $hours . 'h';
+ }
+ else{
+ $params->{"other"} = $period . '%7C0%7C1';
+ $cid = 'module_graphth_' . $hours . 'h';
+ }
+
$params->{"other_mode"} = 'url_encode_separator_%7C';
- my $cid = 'module_graph_' . $hours . 'h';
if (! exists($module_graph_list->{$cid}) && defined $url) {
# Get the module graph image in base 64
@@ -1150,7 +1160,8 @@ sub pandora_execute_action ($$$$$$$$$;$) {
eval {
no warnings;
local $SIG{__DIE__};
- $field3 =~ s/$macro_regexp/$subst_func->($1)/ige;
+ $field3 =~ s/$macro_regexp/$subst_func->($1, 0)/ige;
+ $field3 =~ s/$macro_regexp2/$subst_func->($1, 1)/ige;
};
# Default content type
diff --git a/pandora_server/lib/PandoraFMS/DataServer.pm b/pandora_server/lib/PandoraFMS/DataServer.pm
index effd0f317a..a9043d3d36 100644
--- a/pandora_server/lib/PandoraFMS/DataServer.pm
+++ b/pandora_server/lib/PandoraFMS/DataServer.pm
@@ -312,7 +312,7 @@ sub process_xml_data ($$$$$) {
# Check some variables
$interval = 300 if (! defined ($interval) || $interval eq '');
- $os_version = 'N/A' if (! defined ($os_version) || $os_version eq '');
+ $os_version = undef if (! defined ($os_version) || $os_version eq '');
# Get agent address from the XML if available
my $address = '' ;
diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec
index dafc26119e..4e178f4c22 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.712
-%define release 170907
+%define release 170919
Summary: Pandora FMS Server
Name: %{name}
diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec
index 8f22818e7c..6f9fe3303c 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.712
-%define release 170907
+%define release 170919
Summary: Pandora FMS Server
Name: %{name}
diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer
index 00f899739d..c195760796 100755
--- a/pandora_server/pandora_server_installer
+++ b/pandora_server/pandora_server_installer
@@ -9,7 +9,7 @@
# **********************************************************************
PI_VERSION="7.0NG.712"
-PI_BUILD="170907"
+PI_BUILD="170919"
MODE=$1
if [ $# -gt 1 ]; then
diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl
index 1e41ccea1e..b56b5b77c4 100644
--- a/pandora_server/util/pandora_db.pl
+++ b/pandora_server/util/pandora_db.pl
@@ -33,7 +33,7 @@ use PandoraFMS::Tools;
use PandoraFMS::DB;
# version: define current version
-my $version = "7.0NG.712 PS170907";
+my $version = "7.0NG.712 PS170919";
# Pandora server configuration
my %conf;
@@ -93,7 +93,7 @@ sub pandora_purgedb ($$) {
}
# Delete old inventory data
- if (defined($conf->{'_inventory_purge'}) && $conf->{'_inventory_purge'} > 0) {
+ if (defined ($conf->{'_inventory_purge'}) && $conf->{'_inventory_purge'} > 0) {
if (enterprise_load (\%conf) != 0) {
my $ulimit_timestamp_inventory = time() - (86400 * $conf->{'_inventory_purge'});
@@ -431,6 +431,9 @@ sub pandora_purgedb ($$) {
WHERE date < CURDATE() - $conf->{'_num_past_special_days'} AND date > '0001-01-01'");
}
}
+
+ # Delete old tgraph_source data
+ db_do ($dbh,"DELETE FROM tgraph_source WHERE id_graph NOT IN (SELECT id_graph FROM tgraph)");
}
###############################################################################
@@ -609,6 +612,7 @@ sub pandora_load_config ($) {
$conf->{'dbengine'} = 'mysql' unless defined ($conf->{'dbengine'});
$conf->{'dbport'} = '3306' unless defined ($conf->{'dbport'});
$conf->{'claim_back_snmp_modules'} = '1' unless defined ($conf->{'claim_back_snmp_modules'});
+ $conf->{'verbosity'} = '3' unless defined ($conf->{'verbosity'});
# Dynamic interval configuration.
$conf->{"dynamic_constant"} = 0.10 unless defined($conf->{"dynamic_constant"});
@@ -784,10 +788,10 @@ sub pandora_checkdb_consistency {
log_message ('CHECKDB', "Ignoring not-init data.");
}
- log_message ('CHECKDB',
- "Deleting unknown data (More than " . $conf{'_days_delete_unknown'} . " days).");
-
if (defined($conf{'_days_delete_unknown'}) && $conf{'_days_delete_unknown'} > 0) {
+ log_message ('CHECKDB',
+ "Deleting unknown data (More than " . $conf{'_days_delete_unknown'} . " days).");
+
my @modules = get_db_rows($dbh,
'SELECT tagente_modulo.id_agente_modulo, tagente_modulo.id_agente
FROM tagente_modulo, tagente_estado
@@ -1057,4 +1061,4 @@ if ($lock == 1) {
db_release_lock ($dbh, 'pandora_db');
}
-exit 0;
+exit 0;
\ No newline at end of file
diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl
index e34c5ca550..ea41ed6a3f 100644
--- a/pandora_server/util/pandora_manage.pl
+++ b/pandora_server/util/pandora_manage.pl
@@ -21,6 +21,7 @@ use JSON qw(decode_json encode_json);
use MIME::Base64;
use Encode qw(decode encode_utf8);
use LWP::Simple;
+use Data::Dumper;
# Default lib dir for RPM and DEB packages
use lib '/usr/lib/perl5';
@@ -35,7 +36,7 @@ use Encode::Locale;
Encode::Locale::decode_argv;
# version: define current version
-my $version = "7.0NG.712 PS170907";
+my $version = "7.0NG.712 PS170919";
# save program name for logging
my $progname = basename($0);
@@ -213,6 +214,15 @@ sub help_screen{
help_screen_line('--create_tag', ' [] []', 'Create a new tag');
help_screen_line('--add_tag_to_user_profile', ' ', 'Add a tag to the given user profile');
help_screen_line('--add_tag_to_module', ' ', 'Add a tag to the given module');
+
+ print "\nVISUAL CONSOLES\n\n" unless $param ne '';
+ help_screen_line('--create_visual_console', ' [] [] []', 'Create a new visual console');
+ help_screen_line('--edit_visual_console', ' [] [] [] [] [] [] [] [] []', 'Edit a visual console');
+ help_screen_line('--delete_visual_console', '', 'Delete a visual console');
+ help_screen_line('--delete_visual_console_objects', ' ', 'Delete a visual console elements');
+ help_screen_line('--duplicate_visual_console', ' []', 'Duplicate a visual console');
+ help_screen_line('--export_json_visual_console', ' []', 'Creates a json with the visual console elements information');
+
print "\n";
exit;
@@ -4753,6 +4763,784 @@ sub cli_delete_special_day() {
exist_check($result,'special day',$special_day);
}
+##############################################################################
+# Creates a new visual console.
+# Related option: --create_visual_console
+##############################################################################
+
+sub cli_create_visual_console() {
+ my ($name,$background,$width,$height,$group,$mode,$element_square_positions,$background_color,$elements) = @ARGV[2..10];
+
+ if($name eq '') {
+ print_log "[ERROR] Name field cannot be empty.\n\n";
+ exit 1;
+ }
+ elsif ($background eq '') {
+ print_log "[ERROR] Background field cannot be empty.\n\n";
+ exit 1;
+ }
+ elsif (($width eq '') || ($height eq '')) {
+ print_log "[ERROR] Please specify size.\n\n";
+ exit 1;
+ }
+ elsif ($group eq '') {
+ print_log "[ERROR] Group field cannot be empty.\n\n";
+ exit 1;
+ }
+ elsif ($mode eq '') {
+ print_log "[ERROR] Mode parameter must be 'static_objects' or 'auto_creation'.\n\n";
+ exit 1;
+ }
+
+ if ($background_color eq '') {
+ $background_color = '#FFF';
+ }
+
+ print_log "[INFO] Creating visual console '$name' \n\n";
+
+ my $vc_id = db_insert ($dbh, 'id', 'INSERT INTO tlayout (name, id_group, background, width, height, background_color)
+ VALUES (?, ?, ?, ?, ?, ?)', safe_input($name), $group, $background, $width, $height, $background_color);
+
+ print_log "[INFO] The visual console id is '$vc_id' \n\n";
+
+ if ($elements ne '') {
+ my $elements_in_array = decode_json($elements);
+
+ if ($mode eq 'static_objects') {
+ my $elem_count = 1;
+
+ foreach my $elem (@$elements_in_array) {
+ my $pos_x = $elem->{'pos_x'};
+ my $pos_y = $elem->{'pos_y'};
+ my $width = $elem->{'width'};
+ my $height = $elem->{'height'};
+ my $label = $elem->{'label'};
+ my $image = $elem->{'image'};
+ my $type = $elem->{'type'};
+ my $period = $elem->{'period'};
+ my $id_agente_modulo = $elem->{'id_agente_modulo'};
+ my $id_agent = $elem->{'id_agent'};
+ my $id_layout_linked = $elem->{'id_layout_linked'};
+ my $parent_item = $elem->{'parent_item'};
+ my $enable_link = $elem->{'enable_link'};
+ my $id_metaconsole = $elem->{'id_metaconsole'};
+ my $id_group = $elem->{'id_group'};
+ my $id_custom_graph = $elem->{'id_custom_graph'};
+ my $border_width = $elem->{'border_width'};
+ my $type_graph = $elem->{'type_graph'};
+ my $label_position = $elem->{'label_position'};
+ my $border_color = $elem->{'border_color'};
+ my $fill_color = $elem->{'fill_color'};
+
+ my $elem_id = db_insert ($dbh, 'id', 'INSERT INTO tlayout_data (id_layout, pos_x, pos_y, height, width, label, image, type, period, id_agente_modulo, id_agent, id_layout_linked, parent_item, enable_link, id_metaconsole, id_group, id_custom_graph, border_width, type_graph, label_position, border_color, fill_color, show_statistics)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $vc_id, $pos_x, $pos_y, $height, $width, $label, $image, $type, $period, $id_agente_modulo, $id_agent, $id_layout_linked, $parent_item, $enable_link, $id_metaconsole, $id_group, $id_custom_graph, $border_width, $type_graph, $label_position, $border_color, $fill_color, 0);
+
+ print_log "[INFO] The element id in position $elem_count is '$elem_id' \n\n";
+
+ $elem_count++;
+ }
+ }
+ elsif ($mode eq 'auto_creation') {
+ if ($element_square_positions eq '') {
+ print_log "[ERROR] With this mode, square positions is obligatory'.\n\n";
+ exit 1;
+ }
+ else {
+ my $positions = decode_json($element_square_positions);
+
+ my $pos1X = $positions->{'pos1x'};
+ my $pos1Y = $positions->{'pos1y'};
+ my $pos2X = $positions->{'pos2x'};
+ my $pos2Y = $positions->{'pos2y'};
+
+ my $number_of_elements = scalar(@$elements_in_array);
+
+ my $x_divider = 4;
+ my $y_divider = 1;
+
+ for (my $i = 1; $i <= 1000; $i++) {
+ if (($i * 4) < $number_of_elements) {
+ $y_divider++;
+ }
+ else {
+ last;
+ }
+ }
+
+ my $elem_width = ($pos2X - $pos1X) / $x_divider;
+ my $elem_height = ($pos2Y - $pos1Y) / $y_divider;
+
+ if ($number_of_elements < 4) {
+ $elem_height = ($pos2Y - $pos1Y) / 3;
+ }
+
+ my $elem_count = 1;
+ my $pos_helper_x = 0;
+ my $pos_helper_y = 0;
+ foreach my $elem (@$elements_in_array) {
+ my $pos_x = $pos_helper_x * $elem_width;
+ my $pos_y = $pos_helper_y * $elem_height;
+ my $width = $elem_width;
+ my $height = $elem_height;
+ my $label = $elem->{'label'};
+ my $image = $elem->{'image'};
+ my $type = $elem->{'type'};
+ my $period = $elem->{'period'};
+ my $id_agente_modulo = $elem->{'id_agente_modulo'};
+ my $id_agent = $elem->{'id_agent'};
+ my $id_layout_linked = $elem->{'id_layout_linked'};
+ my $parent_item = $elem->{'parent_item'};
+ my $enable_link = $elem->{'enable_link'};
+ my $id_metaconsole = $elem->{'id_metaconsole'};
+ my $id_group = $elem->{'id_group'};
+ my $id_custom_graph = $elem->{'id_custom_graph'};
+ my $border_width = $elem->{'border_width'};
+ my $type_graph = $elem->{'type_graph'};
+ my $label_position = $elem->{'label_position'};
+ my $border_color = $elem->{'border_color'};
+ my $fill_color = $elem->{'fill_color'};
+
+ my $elem_id = db_insert ($dbh, 'id', 'INSERT INTO tlayout_data (id_layout, pos_x, pos_y, height, width, label, image, type, period, id_agente_modulo, id_agent, id_layout_linked, parent_item, enable_link, id_metaconsole, id_group, id_custom_graph, border_width, type_graph, label_position, border_color, fill_color, show_statistics)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $vc_id, $pos_x, $pos_y, $height, $width, $label, $image, $type, $period, $id_agente_modulo, $id_agent, $id_layout_linked, $parent_item, $enable_link, $id_metaconsole, $id_group, $id_custom_graph, $border_width, $type_graph, $label_position, $border_color, $fill_color, 0);
+
+ print_log "[INFO] The element id in position $elem_count is '$elem_id' \n\n";
+
+ $elem_count++;
+
+ if ($pos_helper_x == 3) {
+ $pos_helper_x = 0;
+ $pos_helper_y++;
+ }
+ else {
+ $pos_helper_x++;
+ }
+ }
+ }
+ }
+ else {
+ print_log "[ERROR] Mode parameter must be 'static_objects' or 'auto_creation'.\n\n";
+ exit 1;
+ }
+ }
+}
+
+##############################################################################
+# Edit a visual console.
+# Related option: --edit_visual_console
+##############################################################################
+
+sub cli_edit_visual_console() {
+ my ($id,$name,$background,$width,$height,$group,$mode,$element_square_positions,$background_color,$elements) = @ARGV[2..11];
+
+ if($id eq '') {
+ print_log "[ERROR] ID field cannot be empty.\n\n";
+ exit 1;
+ }
+
+ my $console = get_db_single_row ($dbh, "SELECT *
+ FROM tlayout
+ WHERE id = $id");
+
+ my $new_name = $console->{'name'};
+ my $new_background = $console->{'background'};
+ my $new_console_width = $console->{'width'};
+ my $new_console_height = $console->{'height'};
+ my $new_console_id_group = $console->{'id_group'};
+ my $new_background_color = $console->{'background_color'};
+
+ if($name ne '') {
+ $new_name = $name;
+ }
+ if ($background ne '') {
+ $new_background = $background;
+ }
+ if ($width ne '') {
+ $new_console_width = $width;
+ }
+ if ($height ne '') {
+ $new_console_height = $height;
+ }
+ if ($group ne '') {
+ $new_console_id_group = $group;
+ }
+ if ($background_color ne '') {
+ $new_background_color = $background_color;
+ }
+
+ print_log "[INFO] The visual console with id $id is updated \n\n";
+
+ db_update ($dbh, "UPDATE tlayout SET name = '" . $new_name . "', background = '" . $new_background . "', width = " . $new_console_width . ", height = " . $new_console_height . ", id_group = " . $new_console_id_group . ", background_color = '" . $new_background_color . "' WHERE id = " . $id);
+
+ if ($elements ne '') {
+ my $elements_in_array = decode_json($elements);
+
+ if ($mode eq 'static_objects') {
+ foreach my $elem (@$elements_in_array) {
+ if (defined($elem->{'id'})) {
+
+ print_log "[INFO] Edit element with id " . $elem->{'id'} . " \n\n";
+
+ my $element_in_db = get_db_single_row ($dbh, "SELECT *
+ FROM tlayout_data
+ WHERE id = " . $elem->{'id'});
+
+ my $new_pos_x = $element_in_db->{'pos_x'};
+ my $new_pos_y = $element_in_db->{'pos_y'};
+ my $new_width = $element_in_db->{'width'};
+ my $new_height = $element_in_db->{'height'};
+ my $new_label = $element_in_db->{'label'};
+ my $new_image = $element_in_db->{'image'};
+ my $new_type = $element_in_db->{'type'};
+ my $new_period = $element_in_db->{'period'};
+ my $new_id_agente_modulo = $element_in_db->{'id_agente_modulo'};
+ my $new_id_agent = $element_in_db->{'id_agent'};
+ my $new_id_layout_linked = $element_in_db->{'id_layout_linked'};
+ my $new_parent_item = $element_in_db->{'parent_item'};
+ my $new_enable_link = $element_in_db->{'enable_link'};
+ my $new_id_metaconsole = $element_in_db->{'id_metaconsole'};
+ my $new_id_group = $element_in_db->{'id_group'};
+ my $new_id_custom_graph = $element_in_db->{'id_custom_graph'};
+ my $new_border_width = $element_in_db->{'border_width'};
+ my $new_type_graph = $element_in_db->{'type_graph'};
+ my $new_label_position = $element_in_db->{'label_position'};
+ my $new_border_color = $element_in_db->{'border_color'};
+ my $new_fill_color = $element_in_db->{'fill_color'};
+
+ if(defined($elem->{'pos_x'})) {
+ $new_pos_x = $elem->{'pos_x'};
+ }
+ if(defined($elem->{'pos_y'})) {
+ $new_pos_y = $elem->{'pos_y'};
+ }
+ if(defined($elem->{'width'})) {
+ $new_width = $elem->{'width'};
+ }
+ if(defined($elem->{'height'})) {
+ $new_height = $elem->{'height'};
+ }
+ if(defined($elem->{'label'})) {
+ $new_label = $elem->{'label'};
+ }
+ if(defined($elem->{'image'})) {
+ $new_image = $elem->{'image'};
+ }
+ if(defined($elem->{'type'})) {
+ $new_type = $elem->{'type'};
+ }
+ if(defined($elem->{'period'})) {
+ $new_period = $elem->{'period'};
+ }
+ if(defined($elem->{'id_agente_modulo'})) {
+ $new_id_agente_modulo = $elem->{'id_agente_modulo'};
+ }
+ if(defined($elem->{'id_agent'})) {
+ $new_id_agent = $elem->{'id_agent'};
+ }
+ if(defined($elem->{'id_layout_linked'})) {
+ $new_id_layout_linked = $elem->{'id_layout_linked'};
+ }
+ if(defined($elem->{'parent_item'})) {
+ $new_parent_item = $elem->{'parent_item'};
+ }
+ if(defined($elem->{'enable_link'})) {
+ $new_enable_link = $elem->{'enable_link'};
+ }
+ if(defined($elem->{'id_metaconsole'})) {
+ $new_id_metaconsole = $elem->{'id_metaconsole'};
+ }
+ if(defined($elem->{'id_group'})) {
+ $new_id_group = $elem->{'id_group'};
+ }
+ if(defined($elem->{'id_custom_graph'})) {
+ $new_id_custom_graph = $elem->{'id_custom_graph'};
+ }
+ if(defined($elem->{'border_width'})) {
+ $new_border_width = $elem->{'border_width'};
+ }
+ if(defined($elem->{'type_graph'})) {
+ $new_type_graph = $elem->{'type_graph'};
+ }
+ if(defined($elem->{'label_position'})) {
+ $new_label_position = $elem->{'label_position'};
+ }
+ if(defined($elem->{'border_color'})) {
+ $new_border_color = $elem->{'border_color'};
+ }
+ if(defined($elem->{'fill_color'})) {
+ $new_fill_color = $elem->{'fill_color'};
+ }
+
+ db_update ($dbh, "UPDATE tlayout_data SET pos_x = " . $new_pos_x . ", pos_y = " . $new_pos_y . ", width = " . $new_width .
+ ", height = " . $new_height . ", label = '" . $new_label . "', image = '" . $new_image .
+ "', type = " . $new_type . ", period = " . $new_period . ", id_agente_modulo = " . $new_id_agente_modulo .
+ ", id_agent = " . $new_id_agent . ", id_layout_linked = " . $new_id_layout_linked . ", parent_item = " . $new_parent_item .
+ ", enable_link = " . $new_enable_link . ", id_metaconsole = " . $new_id_metaconsole . ", id_group = " . $new_id_group .
+ ", id_custom_graph = " . $new_id_custom_graph . ", border_width = " . $new_border_width . ", type_graph = '" . $new_type_graph .
+ "', label_position = '" . $new_label_position . "', border_color = '" . $new_border_color . "', fill_color = '" . $new_fill_color .
+ "' WHERE id = " . $elem->{'id'});
+
+ print_log "[INFO] Element with id " . $elem->{'id'} . " has been updated \n\n";
+ }
+ else {
+ my $pos_x = $elem->{'pos_x'};
+ my $pos_y = $elem->{'pos_y'};
+ my $width = $elem->{'width'};
+ my $height = $elem->{'height'};
+ my $label = $elem->{'label'};
+ my $image = $elem->{'image'};
+ my $type = $elem->{'type'};
+ my $period = $elem->{'period'};
+ my $id_agente_modulo = $elem->{'id_agente_modulo'};
+ my $id_agent = $elem->{'id_agent'};
+ my $id_layout_linked = $elem->{'id_layout_linked'};
+ my $parent_item = $elem->{'parent_item'};
+ my $enable_link = $elem->{'enable_link'};
+ my $id_metaconsole = $elem->{'id_metaconsole'};
+ my $id_group = $elem->{'id_group'};
+ my $id_custom_graph = $elem->{'id_custom_graph'};
+ my $border_width = $elem->{'border_width'};
+ my $type_graph = $elem->{'type_graph'};
+ my $label_position = $elem->{'label_position'};
+ my $border_color = $elem->{'border_color'};
+ my $fill_color = $elem->{'fill_color'};
+
+ my $new_elem_id = db_insert ($dbh, 'id', 'INSERT INTO tlayout_data (id_layout, pos_x, pos_y, height, width, label, image, type, period, id_agente_modulo, id_agent, id_layout_linked, parent_item, enable_link, id_metaconsole, id_group, id_custom_graph, border_width, type_graph, label_position, border_color, fill_color, show_statistics)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $id, $pos_x, $pos_y, $height, $width, $label, $image, $type, $period, $id_agente_modulo, $id_agent, $id_layout_linked, $parent_item, $enable_link, $id_metaconsole, $id_group, $id_custom_graph, $border_width, $type_graph, $label_position, $border_color, $fill_color, 0);
+
+ print_log "[INFO] New element with id $new_elem_id has been created \n\n";
+ }
+ }
+ }
+ elsif ($mode eq 'auto_creation') {
+ if ($element_square_positions eq '') {
+ print_log "[ERROR] With this mode, square positions is obligatory'.\n\n";
+ exit 1;
+ }
+ else {
+ foreach my $elem (@$elements_in_array) {
+ if (defined($elem->{'id'})) {
+ print_log "[INFO] Edit element with id " . $elem->{'id'} . " \n\n";
+
+ my $element_in_db = get_db_single_row ($dbh, "SELECT *
+ FROM tlayout_data
+ WHERE id = " . $elem->{'id'});
+
+ my $new_pos_x = $element_in_db->{'pos_x'};
+ my $new_pos_y = $element_in_db->{'pos_y'};
+ my $new_width = $element_in_db->{'width'};
+ my $new_height = $element_in_db->{'height'};
+ my $new_label = $element_in_db->{'label'};
+ my $new_image = $element_in_db->{'image'};
+ my $new_type = $element_in_db->{'type'};
+ my $new_period = $element_in_db->{'period'};
+ my $new_id_agente_modulo = $element_in_db->{'id_agente_modulo'};
+ my $new_id_agent = $element_in_db->{'id_agent'};
+ my $new_id_layout_linked = $element_in_db->{'id_layout_linked'};
+ my $new_parent_item = $element_in_db->{'parent_item'};
+ my $new_enable_link = $element_in_db->{'enable_link'};
+ my $new_id_metaconsole = $element_in_db->{'id_metaconsole'};
+ my $new_id_group = $element_in_db->{'id_group'};
+ my $new_id_custom_graph = $element_in_db->{'id_custom_graph'};
+ my $new_border_width = $element_in_db->{'border_width'};
+ my $new_type_graph = $element_in_db->{'type_graph'};
+ my $new_label_position = $element_in_db->{'label_position'};
+ my $new_border_color = $element_in_db->{'border_color'};
+ my $new_fill_color = $element_in_db->{'fill_color'};
+
+ if(defined($elem->{'width'})) {
+ $new_width = $elem->{'width'};
+ }
+ if(defined($elem->{'height'})) {
+ $new_height = $elem->{'height'};
+ }
+ if(defined($elem->{'label'})) {
+ $new_label = $elem->{'label'};
+ }
+ if(defined($elem->{'image'})) {
+ $new_image = $elem->{'image'};
+ }
+ if(defined($elem->{'type'})) {
+ $new_type = $elem->{'type'};
+ }
+ if(defined($elem->{'period'})) {
+ $new_period = $elem->{'period'};
+ }
+ if(defined($elem->{'id_agente_modulo'})) {
+ $new_id_agente_modulo = $elem->{'id_agente_modulo'};
+ }
+ if(defined($elem->{'id_agent'})) {
+ $new_id_agent = $elem->{'id_agent'};
+ }
+ if(defined($elem->{'id_layout_linked'})) {
+ $new_id_layout_linked = $elem->{'id_layout_linked'};
+ }
+ if(defined($elem->{'parent_item'})) {
+ $new_parent_item = $elem->{'parent_item'};
+ }
+ if(defined($elem->{'enable_link'})) {
+ $new_enable_link = $elem->{'enable_link'};
+ }
+ if(defined($elem->{'id_metaconsole'})) {
+ $new_id_metaconsole = $elem->{'id_metaconsole'};
+ }
+ if(defined($elem->{'id_group'})) {
+ $new_id_group = $elem->{'id_group'};
+ }
+ if(defined($elem->{'id_custom_graph'})) {
+ $new_id_custom_graph = $elem->{'id_custom_graph'};
+ }
+ if(defined($elem->{'border_width'})) {
+ $new_border_width = $elem->{'border_width'};
+ }
+ if(defined($elem->{'type_graph'})) {
+ $new_type_graph = $elem->{'type_graph'};
+ }
+ if(defined($elem->{'label_position'})) {
+ $new_label_position = $elem->{'label_position'};
+ }
+ if(defined($elem->{'border_color'})) {
+ $new_border_color = $elem->{'border_color'};
+ }
+ if(defined($elem->{'fill_color'})) {
+ $new_fill_color = $elem->{'fill_color'};
+ }
+
+ db_update ($dbh, "UPDATE tlayout_data SET pos_x = " . $new_pos_x . ", pos_y = " . $new_pos_y . ", width = " . $new_width .
+ ", height = " . $new_height . ", label = '" . $new_label . "', image = '" . $new_image .
+ "', type = " . $new_type . ", period = " . $new_period . ", id_agente_modulo = " . $new_id_agente_modulo .
+ ", id_agent = " . $new_id_agent . ", id_layout_linked = " . $new_id_layout_linked . ", parent_item = " . $new_parent_item .
+ ", enable_link = " . $new_enable_link . ", id_metaconsole = " . $new_id_metaconsole . ", id_group = " . $new_id_group .
+ ", id_custom_graph = " . $new_id_custom_graph . ", border_width = " . $new_border_width . ", type_graph = '" . $new_type_graph .
+ "', label_position = '" . $new_label_position . "', border_color = '" . $new_border_color . "', fill_color = '" . $new_fill_color .
+ "' WHERE id = " . $elem->{'id'});
+
+ print_log "[INFO] Element with id " . $elem->{'id'} . " has been updated \n\n";
+ }
+ else {
+ my $pos_x = 0;
+ my $pos_y = 0;
+ my $width = $elem->{'width'};
+ my $height = $elem->{'height'};
+ my $label = $elem->{'label'};
+ my $image = $elem->{'image'};
+ my $type = $elem->{'type'};
+ my $period = $elem->{'period'};
+ my $id_agente_modulo = $elem->{'id_agente_modulo'};
+ my $id_agent = $elem->{'id_agent'};
+ my $id_layout_linked = $elem->{'id_layout_linked'};
+ my $parent_item = $elem->{'parent_item'};
+ my $enable_link = $elem->{'enable_link'};
+ my $id_metaconsole = $elem->{'id_metaconsole'};
+ my $id_group = $elem->{'id_group'};
+ my $id_custom_graph = $elem->{'id_custom_graph'};
+ my $border_width = $elem->{'border_width'};
+ my $type_graph = $elem->{'type_graph'};
+ my $label_position = $elem->{'label_position'};
+ my $border_color = $elem->{'border_color'};
+ my $fill_color = $elem->{'fill_color'};
+
+ my $new_elem_id = db_insert ($dbh, 'id', 'INSERT INTO tlayout_data (id_layout, pos_x, pos_y, height, width, label, image, type, period, id_agente_modulo, id_agent, id_layout_linked, parent_item, enable_link, id_metaconsole, id_group, id_custom_graph, border_width, type_graph, label_position, border_color, fill_color, show_statistics)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $id, $pos_x, $pos_y, $height, $width, $label, $image, $type, $period, $id_agente_modulo, $id_agent, $id_layout_linked, $parent_item, $enable_link, $id_metaconsole, $id_group, $id_custom_graph, $border_width, $type_graph, $label_position, $border_color, $fill_color, 0);
+
+ print_log "[INFO] New element with id $new_elem_id has been created \n\n";
+ }
+ }
+
+ my $positions = decode_json($element_square_positions);
+
+ my $pos1X = $positions->{'pos1x'};
+ my $pos1Y = $positions->{'pos1y'};
+ my $pos2X = $positions->{'pos2x'};
+ my $pos2Y = $positions->{'pos2y'};
+
+ my @console_elements = get_db_rows ($dbh, "SELECT *
+ FROM tlayout_data
+ WHERE id_layout = $id");
+
+ my $number_of_elements = scalar(@console_elements);
+
+ my $x_divider = 4;
+ my $y_divider = 1;
+
+ for (my $i = 1; $i <= 1000; $i++) {
+ if (($i * 4) < $number_of_elements) {
+ $y_divider++;
+ }
+ else {
+ last;
+ }
+ }
+
+ my $elem_width = ($pos2X - $pos1X) / $x_divider;
+ my $elem_height = ($pos2Y - $pos1Y) / $y_divider;
+
+ if ($number_of_elements < 4) {
+ $elem_height = ($pos2Y - $pos1Y) / 3;
+ }
+
+ my $elem_count = 1;
+ my $pos_helper_x = 0;
+ my $pos_helper_y = 0;
+ foreach my $elem (@console_elements) {
+ my $new_pos_x = $pos_helper_x * $elem_width;
+ my $new_pos_y = $pos_helper_y * $elem_height;
+ my $new_elem_width = $elem_width;
+ my $new_elem_height = $elem_height;
+
+ db_update ($dbh, "UPDATE tlayout_data SET pos_x = " . $new_pos_x . ", pos_y = " . $new_pos_y .
+ ", width = " . $new_elem_width . ", height = " . $new_elem_height .
+ " WHERE id = " . $elem->{'id'});
+
+ print_log "[INFO] Recolocate element with id " . $elem->{'id'} . " \n\n";
+
+ $elem_count++;
+
+ if ($pos_helper_x == 3) {
+ $pos_helper_x = 0;
+ $pos_helper_y++;
+ }
+ else {
+ $pos_helper_x++;
+ }
+ }
+ }
+ }
+ else {
+ print_log "[ERROR] Mode parameter must be 'static_objects' or 'auto_creation'.\n\n";
+ exit 1;
+ }
+ }
+}
+
+##############################################################################
+# Delete a visual console.
+# Related option: --delete_visual_console
+##############################################################################
+
+sub cli_delete_visual_console() {
+ my ($id) = @ARGV[2];
+
+ if($id eq '') {
+ print_log "[ERROR] ID field cannot be empty.\n\n";
+ exit 1;
+ }
+
+ print_log "[INFO] Delete visual console with ID '$id' \n\n";
+
+ my $delete_layout = db_do($dbh, 'DELETE FROM tlayout WHERE id = ?', $id);
+
+ if ($delete_layout eq 1) {
+ db_do($dbh, 'DELETE FROM tlayout_data WHERE id_layout = ?', $id);
+
+ print_log "[INFO] Delete visual console elements with console ID '$id' \n\n";
+ }
+ else {
+ print_log "[ERROR] Error at remove the visual console.\n\n";
+ exit 1;
+ }
+}
+
+##############################################################################
+# Delete a visual console objects.
+# Related option: --delete_visual_console_objects
+##############################################################################
+
+sub cli_delete_visual_console_objects() {
+ my ($id_console,$mode,$id_mode) = @ARGV[2..4];
+
+ if($id_console eq '') {
+ print_log "[ERROR] Console ID field cannot be empty.\n\n";
+ exit 1;
+ }
+ elsif ($mode eq '') {
+ print_log "[ERROR] Mode field cannot be empty.\n\n";
+ exit 1;
+ }
+ elsif ($id_mode eq '') {
+ print_log "[ERROR] Mode index field cannot be empty.\n\n";
+ exit 1;
+ }
+
+ if (($mode eq 'type') || ($mode eq 'image') || ($mode eq 'id_agent') ||
+ ($mode eq 'id_agente_modulo') || ($mode eq 'id_group') || ($mode eq 'type_graph')) {
+ print_log "[INFO] Removind objects with mode '$mode' and id '$id_mode' \n\n";
+
+ db_do($dbh, 'DELETE FROM tlayout_data WHERE id_layout = ' . $id_console . ' AND ' . $mode . ' = "' . $id_mode . '"');
+ }
+ else {
+ print_log "[ERROR] Mode is not correct.\n\n";
+ exit 1;
+ }
+}
+
+##############################################################################
+# Duplicate a visual console.
+# Related option: --duplicate_visual_console
+##############################################################################
+
+sub cli_duplicate_visual_console () {
+ my ($id_console,$prefix) = @ARGV[2..3];
+
+ if($id_console eq '') {
+ print_log "[ERROR] Console ID field cannot be empty.\n\n";
+ exit 1;
+ }
+
+ my $console = get_db_single_row ($dbh, "SELECT *
+ FROM tlayout
+ WHERE id = $id_console");
+
+ my $name_to_compare = $console->{'name'};
+ my $new_name = $console->{'name'} . "_1";
+ my $name_count = 2;
+
+ if ($prefix ne '') {
+ $new_name = $prefix;
+ $name_to_compare = $prefix;
+ $name_count = 1;
+ }
+
+ my $exist = 1;
+ while ($exist == 1) {
+ my $name_in_db = get_db_single_row ($dbh, "SELECT name FROM tlayout WHERE name = '$new_name'");
+
+ if (defined($name_in_db->{'name'}) && ($name_in_db->{'name'} eq $new_name)) {
+ $new_name = $name_to_compare . "_" . $name_count;
+ $name_count++;
+ }
+ else {
+ $exist = 0;
+ }
+ }
+
+ my $new_console_id = db_insert ($dbh, 'id', 'INSERT INTO tlayout (name, id_group, background, width, height, background_color)
+ VALUES (?, ?, ?, ?, ?, ?)', $new_name, $console->{'id_group'}, $console->{'background'}, $console->{'width'}, $console->{'height'}, $console->{'background_color'});
+
+ print_log "[INFO] The new visual console '$new_name' has been created. The new ID is '$new_console_id' \n\n";
+
+ my @console_elements = get_db_rows ($dbh, "SELECT *
+ FROM tlayout_data
+ WHERE id_layout = $id_console");
+
+ foreach my $element (@console_elements) {
+ my $pos_x = $element->{'pos_x'};
+ my $pos_y = $element->{'pos_y'};
+ my $width = $element->{'width'};
+ my $height = $element->{'height'};
+ my $label = $element->{'label'};
+ my $image = $element->{'image'};
+ my $type = $element->{'type'};
+ my $period = $element->{'period'};
+ my $id_agente_modulo = $element->{'id_agente_modulo'};
+ my $id_agent = $element->{'id_agent'};
+ my $id_layout_linked = $element->{'id_layout_linked'};
+ my $parent_item = $element->{'parent_item'};
+ my $enable_link = $element->{'enable_link'};
+ my $id_metaconsole = $element->{'id_metaconsole'};
+ my $id_group = $element->{'id_group'};
+ my $id_custom_graph = $element->{'id_custom_graph'};
+ my $border_width = $element->{'border_width'};
+ my $type_graph = $element->{'type_graph'};
+ my $label_position = $element->{'label_position'};
+ my $border_color = $element->{'border_color'};
+ my $fill_color = $element->{'fill_color'};
+
+ my $element_id = db_insert ($dbh, 'id', 'INSERT INTO tlayout_data (id_layout, pos_x, pos_y, height, width, label, image, type, period, id_agente_modulo, id_agent, id_layout_linked, parent_item, enable_link, id_metaconsole, id_group, id_custom_graph, border_width, type_graph, label_position, border_color, fill_color, show_statistics)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $new_console_id, $pos_x, $pos_y, $height, $width, $label, $image, $type, $period, $id_agente_modulo, $id_agent, $id_layout_linked, $parent_item, $enable_link, $id_metaconsole, $id_group, $id_custom_graph, $border_width, $type_graph, $label_position, $border_color, $fill_color, 0);
+
+ print_log "[INFO] Element with ID " . $element->{"id"} . " has been duplicated to the new console \n\n";
+ }
+}
+
+##############################################################################
+# Export a visual console elements to json.
+# Related option: --export_json_visual_console
+##############################################################################
+
+sub cli_export_visual_console() {
+ my ($id,$path) = @ARGV[2..3];
+
+ if($id eq '') {
+ print_log "[ERROR] ID field cannot be empty.\n\n";
+ exit 1;
+ }
+
+ print_log "[INFO] Exporting visual console elements with ID '$id' \n\n";
+
+ my @console_elements = get_db_rows ($dbh, "SELECT *
+ FROM tlayout_data
+ WHERE id_layout = $id");
+
+ my $data_to_json = '[';
+ my $first = 1;
+
+ foreach my $element (@console_elements) {
+ my $pos_x = $element->{'pos_x'};
+ my $pos_y = $element->{'pos_y'};
+ my $width = $element->{'width'};
+ my $height = $element->{'height'};
+ my $label = $element->{'label'};
+ my $image = $element->{'image'};
+ my $type = $element->{'type'};
+ my $period = $element->{'period'};
+ my $id_agente_modulo = $element->{'id_agente_modulo'};
+ my $id_agent = $element->{'id_agent'};
+ my $id_layout_linked = $element->{'id_layout_linked'};
+ my $parent_item = $element->{'parent_item'};
+ my $enable_link = $element->{'enable_link'};
+ my $id_metaconsole = $element->{'id_metaconsole'};
+ my $id_group = $element->{'id_group'};
+ my $id_custom_graph = $element->{'id_custom_graph'};
+ my $border_width = $element->{'border_width'};
+ my $type_graph = $element->{'type_graph'};
+ my $label_position = $element->{'label_position'};
+ my $border_color = $element->{'border_color'};
+ my $fill_color = $element->{'fill_color'};
+
+ if ($first == 0) {
+ $data_to_json .= ','
+ }
+ else {
+ $first = 0;
+ }
+
+ $data_to_json .= '{"image":"' . $image . '"';
+ $data_to_json .= ',"pos_y":' . $pos_y;
+ $data_to_json .= ',"pos_x":' . $pos_x;
+ $data_to_json .= ',"width":' . $width;
+ $data_to_json .= ',"height":' . $height;
+ $data_to_json .= ',"label":"' . $label . '"';
+ $data_to_json .= ',"type":' . $type;
+ $data_to_json .= ',"period":' . $period;
+ $data_to_json .= ',"id_agente_modulo":' . $id_agente_modulo;
+ $data_to_json .= ',"id_agent":' . $id_agent;
+ $data_to_json .= ',"id_layout_linked":' . $id_layout_linked;
+ $data_to_json .= ',"parent_item":' . $parent_item;
+ $data_to_json .= ',"enable_link":' . $enable_link;
+ $data_to_json .= ',"id_metaconsole":' . $id_metaconsole;
+ $data_to_json .= ',"id_group":' . $id_group;
+ $data_to_json .= ',"id_custom_graph":' . $id_custom_graph;
+ $data_to_json .= ',"border_width":' . $border_width;
+ $data_to_json .= ',"type_graph":"' . $type_graph . '"';
+ $data_to_json .= ',"label_position":"' . $label_position . '"';
+ $data_to_json .= ',"border_color":"' . $border_color . '"';
+ $data_to_json .= ',"fill_color":"' . $fill_color . '"';
+ $data_to_json .= '}';
+ }
+
+ $data_to_json .= ']';
+
+ if ($path eq '') {
+ open(FicheroJSON, ">console_" . $id . "_elements");
+ }
+ else {
+ open(FicheroJSON, ">" . $path . "/console_" . $id . "_elements");
+ }
+
+ print FicheroJSON $data_to_json;
+
+ print_log "[INFO] JSON file now contents: \n" . $data_to_json . "\n\n";
+}
###############################################################################
###############################################################################
@@ -5183,7 +5971,31 @@ sub pandora_manage_main ($$$) {
elsif ($param eq '--locate_agent') {
param_check($ltotal, 1);
cli_locate_agent();
- }
+ }
+ elsif ($param eq '--create_visual_console') {
+ param_check($ltotal, 9, 3);
+ cli_create_visual_console();
+ }
+ elsif ($param eq '--edit_visual_console') {
+ param_check($ltotal, 10, 9);
+ cli_edit_visual_console();
+ }
+ elsif ($param eq '--delete_visual_console') {
+ param_check($ltotal, 1);
+ cli_delete_visual_console();
+ }
+ elsif ($param eq '--delete_visual_console_objects') {
+ param_check($ltotal, 3);
+ cli_delete_visual_console_objects();
+ }
+ elsif ($param eq '--duplicate_visual_console') {
+ param_check($ltotal, 2, 1);
+ cli_duplicate_visual_console();
+ }
+ elsif ($param eq '--export_json_visual_console') {
+ param_check($ltotal, 2, 1);
+ cli_export_visual_console();
+ }
else {
print_log "[ERROR] Invalid option '$param'.\n\n";
$param = '';
|