fix(plugin) cifs,sftp,ftp plugin now check recursively folders (#5015)

REF:CTOR-258
This commit is contained in:
Evan-Adam 2024-05-14 10:37:40 +02:00 committed by GitHub
parent 1fb1647965
commit 30286395ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 52 additions and 47 deletions

View File

@ -106,27 +106,28 @@ sub countFiles {
# Cannot list we skip # Cannot list we skip
next; next;
} }
# this loop is recursive, when we find a directory we add it to the list used by the for loop.
# max_depth is used to limit the depth we search.
# same behaviour as ftp and sftp protocol.
foreach my $file (@$files) { foreach my $file (@$files) {
next if ($file->[0] != SMBC_FILE && $file->[0] != SMBC_DIR); next if ($file->[0] != SMBC_FILE && $file->[0] != SMBC_DIR);
next if ($file->[1] eq '.' || $file->[1] eq '..'); next if ($file->[1] eq '.' || $file->[1] eq '..');
my $name = $dir . '/' . $file->[1]; my $name = $dir . '/' . $file->[1];
if (defined($self->{option_results}->{filter_file}) && $self->{option_results}->{filter_file} ne '' &&
$name !~ /$self->{option_results}->{filter_file}/) {
$self->{output}->output_add(long_msg => sprintf("skipping '%s'", $name), debug => 1);
next;
}
if ($file->[0] == SMBC_DIR) { if ($file->[0] == SMBC_DIR) {
if (defined($self->{option_results}->{max_depth}) && $level + 1 <= $self->{option_results}->{max_depth}) { if (defined($self->{option_results}->{max_depth}) && $level + 1 <= $self->{option_results}->{max_depth}) {
push @$list, { name => $name, level => $level + 1 }; push @$list, { name => $name, level => $level + 1 };
} }
} else { next;
$self->{output}->output_add(long_msg => sprintf("Match '%s'", $name)); } elsif (!centreon::plugins::misc::is_empty($self->{option_results}->{filter_file})
$self->{global}->{detected}++; # if this is a file check the filter_file regex
&& $name !~ /$self->{option_results}->{filter_file}/) {
$self->{output}->output_add(long_msg => sprintf("skipping '%s'", $name), debug => 1);
next;
} }
$self->{output}->output_add(long_msg => sprintf("Match '%s'", $name));
$self->{global}->{detected}++;
} }
} }
} }

View File

@ -126,30 +126,33 @@ sub countFiles {
# Cannot list we skip # Cannot list we skip
next; next;
} }
# this loop is recursive, when we find a directory we add it to the list used by the for loop.
# max_depth is used to limit the depth we search.
# same behaviour as cifs(samba) and sftp protocol.
foreach my $line (@files) { foreach my $line (@files) {
# IIS: 05-13-15 10:59AM 1184403 test.jpg # IIS: 05-13-15 10:59AM 1184403 test.jpg
next if ($line !~ /(\S+)\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(.*)/ && next if ($line !~ /(\S+)\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(.*)/ &&
$line !~ /^\s*\S+\s*\S+\s*(\S+)\s+(.*)/); $line !~ /^\s*\S+\s*\S+\s*(\S+)\s+(.*)/);
my ($rights, $filename) = ($1, $2); my ($rights, $filename) = ($1, $2);
my $bname = basename($filename); my $bname = basename($filename);
next if ($bname eq '.' || $bname eq '..'); next if ($bname eq '.' || $bname eq '..');
my $name = $dir . '/' . $bname; my $name = $dir . '/' . $bname;
if (defined($self->{option_results}->{filter_file}) && $self->{option_results}->{filter_file} ne '' && if ($rights =~ /^(d|<DIR>)/i) {
$name !~ /$self->{option_results}->{filter_file}/) { # in the case of a directory and the max level is not reached yet, we add it to the recursive browsing
if (defined($self->{option_results}->{max_depth})
&& $level + 1 <= $self->{option_results}->{max_depth}) {
push @$list, { name => $name, level => $level + 1 };
}
next;
} elsif (!centreon::plugins::misc::is_empty($self->{option_results}->{filter_file})
&& $name !~ /$self->{option_results}->{filter_file}/) {
$self->{output}->output_add(long_msg => sprintf("Skipping '%s'", $name)); $self->{output}->output_add(long_msg => sprintf("Skipping '%s'", $name));
# in the case of a file that does not match the filter, we skip
next; next;
} }
$self->{output}->output_add(long_msg => sprintf("Match '%s'", $name));
if ($rights =~ /^(d|<DIR>)/i) { $count++;
if (defined($self->{option_results}->{max_depth}) && $level + 1 <= $self->{option_results}->{max_depth}) {
push @$list, { name => $name, level => $level + 1};
}
} else {
$self->{output}->output_add(long_msg => sprintf("Match '%s'", $name));
$count++;
}
} }
} }
} }

View File

@ -34,12 +34,12 @@ sub set_counters {
$self->{maps_counters}->{global} = [ $self->{maps_counters}->{global} = [
{ label => 'files-detected', nlabel => 'files.detected.count', set => { { label => 'files-detected', nlabel => 'files.detected.count', set => {
key_values => [ { name => 'detected' } ], key_values => [ { name => 'detected' } ],
output_template => 'number of files: %s', output_template => 'number of files: %s',
perfdatas => [ perfdatas => [
{ template => '%s', min => 0 } { template => '%s', min => 0 }
] ]
} }
} }
]; ];
} }
@ -111,25 +111,26 @@ sub countFiles {
# Cannot list we skip # Cannot list we skip
next; next;
} }
# this loop is recursive, when we find a directory we add it to the list used by the for loop.
# max_depth is used to limit the depth we search.
# same behaviour as cifs(samba) and ftp protocol.
foreach my $file (@{$rv->{files}}) { foreach my $file (@{$rv->{files}}) {
next if ($file->{name} eq '.' || $file->{name} eq '..'); next if ($file->{name} eq '.' || $file->{name} eq '..');
my $name = $dir . '/' . $file->{name}; my $name = $dir . '/' . $file->{name};
if (defined($self->{option_results}->{filter_file}) && $self->{option_results}->{filter_file} ne '' &&
$name !~ /$self->{option_results}->{filter_file}/) {
$self->{output}->output_add(long_msg => sprintf("skipping '%s'", $name), debug => 1);
next;
}
if ($file->{type} == 2) { if ($file->{type} == 2) {
# case of a directory
if (defined($self->{option_results}->{max_depth}) && $level + 1 <= $self->{option_results}->{max_depth}) { if (defined($self->{option_results}->{max_depth}) && $level + 1 <= $self->{option_results}->{max_depth}) {
push @$list, { name => $name, level => $level + 1 }; push @$list, { name => $name, level => $level + 1 };
} }
} else { next;
$self->{output}->output_add(long_msg => sprintf("Match '%s'", $name)); } elsif (!centreon::plugins::misc::is_empty($self->{option_results}->{filter_file})
$self->{global}->{detected}++; && $name !~ /$self->{option_results}->{filter_file}/) {
$self->{output}->output_add(long_msg => sprintf("skipping '%s'", $name), debug => 1);
next;
} }
$self->{output}->output_add(long_msg => sprintf("Match '%s'", $name));
$self->{global}->{detected}++;
} }
} }
} }