Merge branch 'ent-7866-12249-no-se-muestra-valor-de-macro-snmp_f1' into 'develop'

SNMP variable bindings, filter before capture, assign correctly macro values

See merge request artica/pandorafms!4337
This commit is contained in:
Daniel Rodriguez 2021-08-02 08:46:50 +00:00
commit 5d501f3abf
1 changed files with 59 additions and 40 deletions

View File

@ -3983,13 +3983,66 @@ sub pandora_evaluate_snmp_alerts ($$$$$$$$$) {
$alert_data .= " Custom: $trap_custom_oid";
}
# Assign default values to the _snmp_fx_ macros from variable bindings
# Parse variables data.
my @custom_values = split("\t", $trap_custom_oid);
# Evaluate variable filters
my $filter_match = 1;
for (my $i = 1; $i <= 20; $i++) {
my $order_field = $alert->{'order_'.$i} - 1;
# Only values greater than 0 allowed.
next if $order_field < 0;
my $filter_name = '_snmp_f' . $i . '_';
my $filter_regex = safe_output ($alert->{$filter_name});
my $field_value = $custom_values[$order_field];
# No filter for the current binding var
next if ($filter_regex eq '');
# The referenced binding var does not exist
if (! defined ($field_value)) {
$filter_match = 0;
last;
}
# Evaluate the filter
eval {
local $SIG{__DIE__};
if ($field_value !~ m/$filter_regex/) {
$filter_match = 0;
}
};
# Probably an invalid regexp
if ($@) {
# Filter is ignored.
logger($pa_config, "Invalid regex in SNMP alert #".$alert->{'id_as'}.": [".$filter_regex."]", 3);
# Invalid regex are ignored, test next variables.
next;
}
# The filter did not match
last if ($filter_match == 0);
}
# A filter did not match
next if ($filter_match == 0);
# Assign values to _snmp_fx_ macros.
my $count;
my @custom_values = split ("\t", $trap_custom_oid);
for ($count = 1; defined ($custom_values[$count-1]); $count++) {
my $macro_name = '_snmp_f' . $count . '_';
my $order_field = $alert->{'order_'.$count};
if ($custom_values[$count] =~ m/= \S+: (.*)/) {
for ($count = 0; defined ($custom_values[$count]); $count++) {
my $macro_name = '_snmp_f' . ($count+1) . '_';
my $target = $custom_values[$count];
if (!defined($target)) {
# Ignore emtpy data.
$macros{$macro_name} = '';
next;
}
if ($target =~ m/= \S+: (.*)/) {
my $value = $1;
# Strip leading and trailing double quotes
@ -4009,40 +4062,6 @@ sub pandora_evaluate_snmp_alerts ($$$$$$$$$) {
# All variables
$macros{'_snmp_argv_'} = $trap_custom_oid;
# Evaluate _snmp_fx_ filters
my $filter_match = 1;
for (my $i = 1; $i <= 10; $i++) {
my $filter_name = '_snmp_f' . $i . '_';
my $filter_value = safe_output ($alert->{$filter_name});
# No filter for the current binding var
next if ($filter_value eq '');
# The referenced binding var does not exist
if (! defined ($macros{$filter_name})) {
$filter_match = 0;
last;
}
# Evaluate the filter
eval {
if ($macros{$filter_name} !~ m/$filter_value/) {
$filter_match = 0;
}
};
# Probably an invalid regexp
if ($@) {
last;
}
# The filter did not match
last if ($filter_match == 0);
}
# A filter did not match
next if ($filter_match == 0);
# Replace macros
$alert->{'al_field1'} = subst_alert_macros ($alert->{'al_field1'}, \%macros);