WIP:Move inventory to open

This commit is contained in:
Calvo 2022-09-13 12:31:09 +02:00
parent e76e9e94de
commit 067b7a821f
2 changed files with 273 additions and 2 deletions

View File

@ -4987,6 +4987,278 @@ sub process_inc_abs_data ($$$$$$) {
return $diff;
}
################################################################################
################################################################################
## Inventory XML data
################################################################################
################################################################################
################################################################################
# Process inventory data, creating the module if necessary.
################################################################################
sub process_inventory_data ($$$$$$$) {
my ($pa_config, $data, $server_id, $agent_name,
$interval, $timestamp, $dbh) = @_;
foreach my $inventory (@{$data->{'inventory'}}) {
# Process inventory modules
foreach my $module_data (@{$inventory->{'inventory_module'}}) {
my $module_name = get_tag_value ($module_data, 'name', '');
# Unnamed module
next if ($module_name eq '');
# Process inventory data
my $data_list = '';
foreach my $list (@{$module_data->{'datalist'}}) {
# Empty list
next unless defined ($list->{'data'});
foreach my $data (@{$list->{'data'}}) {
$data_list .= $data . "\n";
}
}
next if ($data_list eq '');
process_inventory_module_data ($pa_config, $data_list, $server_id, $agent_name, $module_name, $interval, $timestamp, $dbh);
}
}
}
################################################################################
# Process inventory module data, creating the module if necessary.
################################################################################
sub process_inventory_module_data ($$$$$$$$) {
my ($pa_config, $data, $server_id, $agent_name,
$module_name, $interval, $timestamp, $dbh) = @_;
logger ($pa_config, "Processing inventory module '$module_name' for agent '$agent_name'.", 10);
# Get agent data
my $agent = get_db_single_row ($dbh,
'SELECT * FROM tagente WHERE nombre = ?', safe_input($agent_name));
if (! defined ($agent)) {
logger ($pa_config, "Agent '$agent_name' not found for inventory module '$module_name'.", 3);
return;
}
# Parse the timestamp and process the module
if ($timestamp !~ /(\d+)\/(\d+)\/(\d+) +(\d+):(\d+):(\d+)/ &&
$timestamp !~ /(\d+)\-(\d+)\-(\d+) +(\d+):(\d+):(\d+)/) {
logger($pa_config, "Invalid timestamp '$timestamp' from module '$module_name' agent '$agent_name'.", 3);
return;
}
my $utimestamp;
eval {
$utimestamp = strftime("%s", $6, $5, $4, $3, $2 - 1, $1 - 1900);
};
if ($@) {
logger($pa_config, "Invalid timestamp '$timestamp' from module '$module_name' agent '$agent_name'.", 3);
return;
}
# Get module data or create it if it does not exist
my $inventory_module = get_db_single_row ($dbh,
'SELECT tagent_module_inventory.*, tmodule_inventory.name
FROM tagent_module_inventory, tmodule_inventory
WHERE tagent_module_inventory.id_module_inventory = tmodule_inventory.id_module_inventory
AND id_agente = ? AND name = ?',
$agent->{'id_agente'}, safe_input($module_name));
if (! defined ($inventory_module)) {
# Get the module
my $module_id = get_db_value ($dbh,
'SELECT id_module_inventory FROM tmodule_inventory WHERE name = ? AND id_os = ?',
safe_input($module_name), $agent->{'id_os'});
return unless defined ($module_id);
my $id_agent_module_inventory = 0;
# Update the module data
$id_agent_module_inventory = db_insert ($dbh, 'id_agent_module_inventory',
"INSERT INTO tagent_module_inventory (id_agente, id_module_inventory,
${RDBMS_QUOTE}interval${RDBMS_QUOTE}, data, timestamp, utimestamp, flag)
VALUES (?, ?, ?, ?, ?, ?, ?)",
$agent->{'id_agente'}, $module_id, $interval, safe_input($data), $timestamp, $utimestamp, 0);
return unless ($id_agent_module_inventory > 0);
db_do ($dbh,
'INSERT INTO tagente_datos_inventory (id_agent_module_inventory, data, timestamp, utimestamp)
VALUES (?, ?, ?, ?)',
$id_agent_module_inventory, safe_input($data), $timestamp, $utimestamp);
return;
}
process_inventory_module_diff($pa_config, safe_input($data),
$inventory_module, $timestamp, $utimestamp, $dbh, $interval);
}
################################################################################
# Searching differences between incoming module and stored module,
# creating/updating module and event
################################################################################
sub process_inventory_module_diff ($$$$$$;$) {
my ($pa_config, $incoming_data, $inventory_module, $timestamp, $utimestamp, $dbh, $interval) = @_;
my $stored_data = $inventory_module->{'data'};
my $agent_id = $inventory_module->{'id_agente'};
my $stored_utimestamp = $inventory_module->{'utimestamp'};
my $agent_module_inventory_id = $inventory_module->{'id_agent_module_inventory'};
my $module_inventory_id = $inventory_module->{'id_module_inventory'};
process_inventory_alerts($pa_config, $incoming_data,
$inventory_module, $timestamp, $utimestamp, $dbh, $interval);
# If there were any changes generate an event and save the new data
if (decode('UTF-8', $stored_data) ne $incoming_data) {
my $inventory_db = $stored_data;
my $inventory_new = $incoming_data;
my @inventory = split('\n', $inventory_new);
my $diff_new = "";
my $diff_delete = "";
foreach my $inv (@inventory) {
my $inv_clean = quotemeta($inv);
if($inventory_db =~ m/$inv_clean/) {
$inventory_db =~ s/$inv_clean//g;
$inventory_new =~ s/$inv_clean//g;
}
else {
$diff_new .= "$inv\n";
}
}
# If any register is in the stored yet, we store as deleted
$inventory_db =~ s/\n\n*/\n/g;
$inventory_db =~ s/^\n//g;
$diff_delete = $inventory_db;
if($diff_new ne "") {
$diff_new = " NEW: '$diff_new' ";
}
if($diff_delete ne "") {
$diff_delete = " DELETED: '$diff_delete' ";
}
db_do ($dbh, 'INSERT INTO tagente_datos_inventory (id_agent_module_inventory, data, timestamp, utimestamp) VALUES (?, ?, ?, ?)',
$agent_module_inventory_id, $incoming_data, $timestamp, $utimestamp);
# Do not generate an event the first time the module runs
if ($stored_utimestamp != 0) {
my $inventory_changes_blacklist = pandora_get_config_value ($dbh, 'inventory_changes_blacklist');
my $inventory_module_blocked = 0;
if($inventory_changes_blacklist ne "") {
foreach my $inventory_id_excluded (split (',', $inventory_changes_blacklist)) {
# If the inventory_module_id is in the blacklist, the change will not be processed
if($inventory_module->{'id_module_inventory'} == $inventory_id_excluded) {
logger ($pa_config, "Inventory change omitted on inventory #$inventory_id_excluded due be on the changes blacklist", 10);
$inventory_module_blocked = 1;
}
}
}
# If the inventory_module_id is in the blacklist, the change will not be processed
if ($inventory_module_blocked == 0) {
my $inventory_module_name = get_db_value ($dbh, "SELECT name FROM tmodule_inventory WHERE id_module_inventory = ?", $module_inventory_id);
return unless defined ($inventory_module_name);
my $agent_name = get_agent_name ($dbh, $agent_id);
return unless defined ($agent_name);
my $agent_alias = get_agent_alias ($dbh, $agent_id);
return unless defined ($agent_alias);
my $group_id = get_agent_group ($dbh, $agent_id);
$stored_data =~ s/ / /g;
$incoming_data =~ s/ / /g;
my @values_stored = split('
', $stored_data);
my @finalc_stored = ();
my @values_incoming = split('
', $incoming_data);
my @finalc_incoming = ();
my @finalc_compare_added = ();
my @finalc_compare_deleted = ();
my @finalc_compare_updated = ();
my @finalc_compare_updated_del = ();
my @finalc_compare_updated_add = ();
my $temp_compare = ();
my $final_d = '';
my $final_a = '';
my $final_u = '';
foreach my $i (0 .. $#values_stored) {
$finalc_stored[$i] = $values_stored[$i];
if ( grep $_ eq $values_stored[$i], @values_incoming ) {
} else {
# Use 'safe_output' to avoid double encode the entities when creating the event with 'pandora_event'
$final_d .= "DELETED RECORD: ".safe_output($values_stored[$i])."\n";
}
}
foreach my $i (0 .. $#values_incoming) {
$finalc_incoming[$i] = $values_incoming[$i];
if ( grep $_ eq $values_incoming[$i], @values_stored ) {
} else {
# Use 'safe_output' to avoid double encode the entities when creating the event with 'pandora_event'
$final_a .= "NEW RECORD: ".safe_output($values_incoming[$i])."\n";
}
}
# foreach my $i (0 .. $#finalc_compare_deleted) {
# $finalc_compare_updated_del[$i] = split(';', $finalc_compare_deleted[$i]);
# $finalc_compare_updated_add[$i] = split(';', $finalc_compare_added[$i]);
# if($finalc_compare_updated_del[$i] ~~ @finalc_compare_updated_add){
# $finalc_compare_updated[$i] = $finalc_compare_updated_del[$i];
# }
# $finalc_compare_updated[$i] =~ s/DELETED RECORD:/UPDATED RECORD:/g;
# $finalc_compare_updated[$i] =~ s/NEW RECORD://g;
# }
pandora_event ($pa_config, "Configuration change:\n".$final_d.$final_a." for agent '" . safe_output($agent_alias) . "' module '" . safe_output($inventory_module_name) . "'.", $group_id, $agent_id, 0, 0, 0, "configuration_change", 0, $dbh);
}
}
}
# Update the module data
if (defined($interval)) {
db_do ($dbh, 'UPDATE tagent_module_inventory
SET'. $RDBMS_QUOTE . 'interval' .
$RDBMS_QUOTE . '=?, data=?, timestamp=?, utimestamp=?
WHERE id_agent_module_inventory=?',
$interval, $incoming_data, $timestamp,
$utimestamp, $agent_module_inventory_id);
}
else {
db_do ($dbh, 'UPDATE tagent_module_inventory
SET data = ?, timestamp = ?, utimestamp = ?
WHERE id_agent_module_inventory = ?',
$incoming_data, $timestamp, $utimestamp, $agent_module_inventory_id);
}
}
sub log4x_get_severity_num($) {
my ($data_object) = @_;
my $data = $data_object->{'severity'};

View File

@ -628,8 +628,7 @@ sub process_xml_data ($$$$$) {
# Process inventory modules
enterprise_hook('process_inventory_data', [$pa_config, $data, $server_id, $agent_name,
$interval, $timestamp, $dbh]);
process_inventory_data($pa_config, $data, $server_id, $agent_name, $interval, $timestamp, $dbh);
# Process log modules
enterprise_hook('process_log_data', [$pa_config, $data, $server_id, $agent_name,