From 50adcdec07caee8f10372715baa10cbd9c3ab98b Mon Sep 17 00:00:00 2001 From: zarzuelo Date: Fri, 20 Jan 2012 08:52:17 +0000 Subject: [PATCH] 2012-01-20 Sergio Martin * lib/PandoraFMS/Core.pm util/pandora_manage.pl: Added new options to CLI managing conf files and updating agents... git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@5394 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f --- pandora_server/ChangeLog | 6 + pandora_server/lib/PandoraFMS/Core.pm | 15 +- pandora_server/util/pandora_manage.pl | 302 +++++++++++++++++++++++++- 3 files changed, 314 insertions(+), 9 deletions(-) diff --git a/pandora_server/ChangeLog b/pandora_server/ChangeLog index df964654ac..fa20971672 100644 --- a/pandora_server/ChangeLog +++ b/pandora_server/ChangeLog @@ -1,3 +1,9 @@ +2012-01-20 Sergio Martin + + * lib/PandoraFMS/Core.pm + util/pandora_manage.pl: Added new options to CLI + managing conf files and updating agents... + 2012-01-18 Sergio Martin * util/pandora_manage.pl: Add option to CLI to diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index bbf72cb6b2..d86ad5b522 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -86,6 +86,8 @@ Exported Functions: =item * C +=item * C + =item * C =item * C @@ -164,6 +166,7 @@ our @EXPORT = qw( pandora_update_module_on_error pandora_update_module_from_hash pandora_update_server + pandora_update_table_from_hash pandora_update_template_module pandora_group_statistics pandora_server_statistics @@ -1370,6 +1373,16 @@ sub pandora_update_module_from_hash ($$$$$) { return $module_id; } +########################################################################## +## Update a table from hash +########################################################################## +sub pandora_update_table_from_hash ($$$$$$) { + my ($pa_config, $parameters, $where_column, $where_value, $table, $dbh) = @_; + + my $module_id = db_process_update($dbh, $table, $parameters, $where_column, $where_value); + return $module_id; +} + ########################################################################## ## Create a group ########################################################################## @@ -2310,7 +2323,7 @@ sub pandora_server_statistics ($$) { } ########################################################################## -=head2 C<< pandora_group_statistics (I<$pa_config>, I<$dbh>) >> +=head2 C<< pandora_process_policy_queue (I<$pa_config>, I<$dbh>) >> Process groups statistics for statistics table diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index c7c83d98d9..b657a3a536 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -83,6 +83,7 @@ sub help_screen{ print "Available options for $param:\n\n" unless $param eq ''; print "AGENTS:\n\n" unless $param ne ''; help_screen_line('--create_agent', ' [
]', 'Create agent'); + help_screen_line('--update_agent', ' ', 'Update an agent field. The fields can be the following: agent_name, address, description, group_name, interval, os_name, disabled (0-1), parent_name, cascade_protection (0-1), icon_path, update_gis_data (0-1), custom_id'); help_screen_line('--delete_agent', '', 'Delete agent'); help_screen_line('--disable_group', '', 'Disable agents from an entire group'); help_screen_line('--enable_group', '', 'Enable agents from an entire group'); @@ -90,6 +91,10 @@ sub help_screen{ help_screen_line('--stop_downtime', '', 'Stop a planned downtime'); help_screen_line('--get_agent_group', '', 'Get the group name of an agent'); help_screen_line('--get_agent_modules', '', 'Get the modules of an agent'); + help_screen_line('--get_agents', '[ ]', 'Get list of agents with optative filter parameters'); + help_screen_line('--delete_conf_file', '', 'Delete a local conf of a given agent'); + help_screen_line('--clean_conf_file', '', 'Delete a local conf of a given agent'); + help_screen_line('--get_bad_conf_files', '', 'Get the files bad configured (without essential tokens)'); print "MODULES:\n\n" unless $param ne ''; help_screen_line('--create_data_module', ' [ ]', 'Add data server module to agent'); help_screen_line('--create_network_module', ' [ ]', 'Add not snmp network module to agent'); @@ -462,6 +467,28 @@ sub pandora_get_module_agents ($$) { return \@agents; } +############################################################################### +# Get agent status (critical, warning, unknown or normal) +############################################################################### +sub pandora_get_agent_status ($$) { + my ($dbh,$agent_id) = @_; + + my $critical = get_db_value ($dbh, "SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_agente = $agent_id AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 1 AND (utimestamp >= ( UNIX_TIMESTAMP() - (current_interval * 2)) OR tagente_modulo.id_tipo_modulo IN (21,22,23,100))"); + return 'critical' unless $critical == 0; + + my $warning = get_db_value ($dbh, "SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_agente = $agent_id AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 2 AND (utimestamp >= ( UNIX_TIMESTAMP() - (current_interval * 2)) OR tagente_modulo.id_tipo_modulo IN (21,22,23,100))"); + return 'warning' unless $warning == 0; + + my $unknown = get_db_value ($dbh, "SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_agente = $agent_id AND tagente.disabled = 0 AND tagente.id_agente = tagente_estado.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND tagente_modulo.id_tipo_modulo NOT IN (21,22,23,100) AND utimestamp < ( UNIX_TIMESTAMP() - (current_interval * 2)) AND utimestamp != 0"); + return 'unknown' unless $unknown == 0; + + my $normal = get_db_value ($dbh, "SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_agente = $agent_id AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 0 AND (utimestamp != 0 OR tagente_modulo.id_tipo_modulo IN (21,22,23)) AND (utimestamp >= ( UNIX_TIMESTAMP() - (current_interval * 2)) OR tagente_modulo.id_tipo_modulo IN (21,22,23,100))"); + return 'normal' unless $normal == 0; + return 'normal' unless $normal == 0; + + return ''; +} + ########################################################################## ## Return the modules of a given agent ########################################################################## @@ -1567,6 +1594,81 @@ sub cli_user_update() { pandora_update_user_from_hash ($update, 'id_user', safe_input($user_id), $dbh); } +############################################################################## +# Update an agent field. +# Related option: --update_agent +############################################################################## + +sub cli_agent_update() { + my ($agent_name,$field,$new_value) = @ARGV[2..4]; + + my $id_agent = get_agent_id($dbh,$agent_name); + exist_check($id_agent,'agent',$agent_name); + + # agent_name, address, description, group_name, interval, os_name, disabled, parent_name, cascade_protection, icon_path, update_gis_data, custom_id + + if($field eq 'disabled' || $field eq 'cascade_protection' || $field eq 'icon_path' || + $field eq 'update_gis_data' || $field eq 'custom_id') { + # Fields admited, no changes + } + elsif($field eq 'interval') { + $field = 'intervalo'; + } + elsif($field eq 'description') { + $field = 'comentarios'; + $new_value = safe_input($new_value); + } + elsif($field eq 'parent_name') { + my $id_parent = get_agent_id($dbh,$new_value); + exist_check($id_parent,'agent',$new_value); + $field = 'id_parent'; + $new_value = $id_parent; + } + elsif($field eq 'agent_name') { + my $agent_exists = get_agent_id($dbh,$new_value); + non_exist_check($agent_exists,'agent',$new_value); + $field = 'nombre'; + } + elsif($field eq 'group_name') { + my $id_group = get_group_id($dbh, $new_value); + exist_check($id_group,'group',$new_value); + $new_value = $id_group; + $field = 'id_grupo'; + } + elsif($field eq 'os_name') { + my $id_os = get_os_id($dbh, $new_value); + exist_check($id_os,'operating system',$new_value); + $new_value = $id_os; + $field = 'id_os'; + } + elsif($field eq 'address') { + # Check if the address already exist + my $address_id = get_addr_id($dbh,$new_value); + + # If the addres doesnt exist, we add it to the addresses list + if($address_id == -1) { + $address_id = add_address($dbh,$new_value); + } + + # Add the address to the agent + add_new_address_agent ($dbh, $address_id, $id_agent); + + $field = 'direccion'; + } + else { + print "[ERROR] Field '$field' doesnt exist\n\n"; + exit; + } + + print "[INFO] Updating field '$field' in agent '$agent_name'\n\n"; + + my $update; + + $update->{$field} = $new_value; + + pandora_update_table_from_hash ($conf, $update, 'id_agente', safe_input($id_agent), 'tagente', $dbh); +} + ############################################################################## # Update an alert template. # Related option: --update_alert_template @@ -1598,20 +1700,14 @@ sub cli_alert_template_update() { elsif($field eq 'default_action') { # Check if exist my $id_alert_action = get_action_id ($dbh, safe_input($new_value)); - if($id_alert_action == -1) { - print "[ERROR] Alert action '$new_value' doesnt exist\n\n"; - exit; - } + exist_check($id_alert_action,'alert action',$new_value); $new_value = $id_alert_action; $field = 'id_alert_action'; } elsif($field eq 'group_name') { # Check if exist my $id_group = get_group_id($dbh, $new_value); - if($id_group == -1) { - print "[ERROR] Group '$new_value' doesnt exist\n\n"; - exit; - } + exist_check($id_group,'group',$new_value); $new_value = $id_group; $field = 'id_group'; } @@ -2513,6 +2609,176 @@ sub cli_get_policies() { } } +############################################################################## +# Show all the agents (without parameters) or the agents with a filter parameters +# Related option: --get_agents +############################################################################## + +sub cli_get_agents() { + my ($group_name, $os_name, $status, $max_modules, $filter_substring, $policy_name) = @ARGV[2..7]; + + my $condition = ' 1=1'; + + my $id_group; + my $id_os; + my $policy_id; + + if($group_name ne '') { + $id_group = get_group_id($dbh, $group_name); + exist_check($id_group,'group',$group_name); + + $condition .= " AND id_grupo = $id_group "; + } + + if($os_name ne '') { + $id_os = get_os_id($dbh, $os_name); + exist_check($id_os,'operative system',$os_name); + + $condition .= " AND id_os = $id_os "; + } + + if($policy_name ne '') { + $policy_id = enterprise_hook('get_policy_id',[$dbh, safe_input($policy_name)]); + exist_check($policy_id,'policy',$policy_name); + + $condition .= " AND id_agente IN (SELECT id_agent FROM tpolicy_agents + WHERE id_policy = $policy_id )"; + } + + if($max_modules ne '') { + $condition .= " AND id_agente NOT IN (SELECT id_agente FROM tagente_modulo t1 + WHERE (SELECT count(*) FROM tagente_modulo WHERE id_agente = t1.id_agente) > $max_modules)"; + } + + if($filter_substring ne '') { + $condition .= " AND nombre LIKE '%".safe_input($filter_substring)."%'"; + } + + my @agents = get_db_rows ($dbh, "SELECT * FROM tagente WHERE $condition"); + + if(scalar(@agents) == 0) { + print "[INFO] No agents found\n\n"; + exit; + } + + my $agent_status; + + my $head_print = 0; + foreach my $agent (@agents) { + if($status ne '') { + $agent_status = pandora_get_agent_status($dbh,$agent->{'id_agente'}); + if($status ne $agent_status || $agent_status eq '') { + next; + } + } + if($head_print == 0) { + $head_print = 1; + print "id_agent, agent_name\n"; + } + print $agent->{'id_agente'}.",".safe_output($agent->{'nombre'})."\n"; + } + + if($head_print == 0) { + print "[INFO] No agents found\n\n"; + } +} + +############################################################################## +# Delete agent conf. +# Related option: --delete_conf_file +############################################################################## + +sub cli_delete_conf_file() { + my $agent_name = @ARGV[2]; + + my $conf_deleted = 0; + my $md5_deleted = 0; + + if (-e $conf->{incomingdir}.'/conf/'.md5($agent_name).'.conf') { + unlink($conf->{incomingdir}.'/conf/'.md5($agent_name).'.conf'); + $conf_deleted = 1; + } + if (-e $conf->{incomingdir}.'/md5/'.md5($agent_name).'.md5') { + unlink($conf->{incomingdir}.'/md5/'.md5($agent_name).'.md5'); + $md5_deleted = 1; + } + + if($conf_deleted == 1 || $md5_deleted == 1) { + print "[INFO] Local conf files of the agent '$agent_name' has been deleted succesfully\n\n"; + } + else { + print "[ERROR] Local conf file of the agent '$agent_name' didn't found\n\n"; + exit; + } +} + +############################################################################## +# Delete modules from all conf files (without parameters) or of the conf file of the given agent. +# Related option: --clean_conf_file +############################################################################## + +sub cli_clean_conf_file() { + my $agent_name = @ARGV[2]; + my $result; + + if(defined($agent_name)) { + if (-e $conf->{incomingdir}.'/conf/'.md5($agent_name).'.conf') { + $result = enterprise_hook('pandora_clean_conf_file',[$conf, md5($agent_name)]); + if($result != -1) { + print "[INFO] Conf file '".$conf->{incomingdir}.'/conf/'.md5($agent_name).".conf has been cleaned'\n\n"; + } + } + } + else { + my $list_command = 'ls '.$conf->{incomingdir}.'/conf/'; + my $out = `$list_command`; + my @files = split('\n',$out); + # TODO: FINISH OPTION! NOW ONLY SHOW FILES + foreach my $file (@files) { + # Get the md5 hash + my @filesplit = split('.',$file); + $result = enterprise_hook('pandora_clean_conf_file',[$conf,$filesplit[0]]); + if($result != -1) { + print "[INFO] Conf file '".$conf->{incomingdir}.'/conf/'.$filesplit[0].".conf has been cleaned'\n\n"; + } + } + } +} + +############################################################################## +# Get the files bad configured (without essential tokens) +# Related option: --get_bad_conf_files +############################################################################## + +sub cli_get_bad_conf_files() { + my $list_command = 'ls '.$conf->{incomingdir}.'/conf/'; + my $out = `$list_command`; + my @files = split('\n',$out); + my $bad_files = 0; + + foreach my $file (@files) { + # Check important tokens + my $missings = 0; + my @tokens = ("server_ip","server_path","temporal","logfile","trol"); + + foreach my $token (@tokens) { + if(enterprise_hook('pandora_check_conf_token',[$conf->{incomingdir}.'/conf/'.$file, $token]) == 0) { + $missings++; + } + } + + # If any token of checked is missed we print the file path + if($missings > 0) { + print $conf->{incomingdir}.'/conf/'.$file."\n"; + $bad_files++; + } + } + + if($bad_files == 0) { + print "[INFO] No bad files found\n\n"; + } +} + ############################################################################## # Disable policy alerts. # Related option: --disable_policy_alerts @@ -2997,6 +3263,26 @@ sub pandora_manage_main ($$$) { param_check($ltotal, 1, 1); cli_get_policies(); } + elsif ($param eq '--get_agents') { + param_check($ltotal, 6, 6); + cli_get_agents(); + } + elsif ($param eq '--delete_conf_file') { + param_check($ltotal, 1); + cli_delete_conf_file(); + } + elsif ($param eq '--clean_conf_file') { + param_check($ltotal, 1, 1); + cli_clean_conf_file(); + } + elsif ($param eq '--update_agent') { + param_check($ltotal, 3); + cli_agent_update(); + } + elsif ($param eq '--get_bad_conf_files') { + param_check($ltotal, 0); + cli_get_bad_conf_files(); + } else { print "[ERROR] Invalid option '$param'.\n\n"; $param = '';