diff --git a/.githooks/pre-commit.d/20_plugins.sh b/.githooks/pre-commit.d/20_plugins.sh index 8890524c5a..9d19e8f5f6 100755 --- a/.githooks/pre-commit.d/20_plugins.sh +++ b/.githooks/pre-commit.d/20_plugins.sh @@ -43,7 +43,7 @@ function check_constants() { grep -nH -- "-\(1\|2\|10\)[[:space:]]*=>[[:space:]]*1" "$file" > "$tmpfile" grep -nH "\[[:space:]]*[0-9]" "$file" >> "$tmpfile" if [ -s "$tmpfile" ] ; then - error "It seems that some counters are not using constants defined in centreon/plugins/constants.pm. You may also need to add `use centreon::plugins::constants qw(:counters);` in your file." + error "It seems that some counters are not using constants defined in centreon/plugins/constants.pm. You may also need to add 'use centreon::plugins::constants qw(:counters);' in your file." cat $tmpfile fi } @@ -72,7 +72,7 @@ for file in "${committed_files[@]}"; do pm|pl) # check that the perl file compiles info "--> Checking that file compiles" - perl -I ./src -I ./tests/connectors/vmware -I ./connectors/vmware/src -c "$file" >/dev/null 2>&1 || error "File $file does not compile with perl -c" + perl -I ./src -I ./tests/connectors/vmware -I ./connectors/vmware/src -c "$file" >/dev/null 2>&1 || error "File $file does not compile with perl -c $file" # check the copyright year info "--> Checking that file copyright is OK" grep "Copyright 20..-Present Centreon" "$file" >/dev/null || error "Copyright in $file does not contain \"Copyright $(date +%Y)-Present Centreon\"" @@ -81,10 +81,12 @@ for file in "${committed_files[@]}"; do grep -- '--warning-\*\|--critical-\*' "$file" >/dev/null && error "File $file contains help that is written as --warning-* or --critical-*" # check spelling info "--> Checking that spelling in file is OK" - perl .github/scripts/pod_spell_check.t "$file" ./tests/resources/spellcheck/stopwords.txt >$tmpfile 2>&1 + cmd_spell_check='perl .github/scripts/pod_spell_check.t '"$file"' ./tests/resources/spellcheck/stopwords.txt >$tmpfile 2>&1' + eval "$cmd_spell_check" rc=$? if [ $rc -ne 0 ] ; then error "Spellcheck error on file $file" + info "command: $cmd_spell_check" tail -n 2 $tmpfile | head -n 1 | sed 's/^[^:]*:/Invalid words:/' 2>/dev/null fi check_tabs_crlf "$file" diff --git a/.github/docker/testing/Dockerfile.testing-plugins-alma8 b/.github/docker/testing/Dockerfile.testing-plugins-alma8 index 94f6a77e07..ba9336ec66 100644 --- a/.github/docker/testing/Dockerfile.testing-plugins-alma8 +++ b/.github/docker/testing/Dockerfile.testing-plugins-alma8 @@ -17,7 +17,7 @@ dnf clean all dnf install -y python3.11 python3.11-pip pip3.11 install robotframework robotframework-examples # Install snmpsim -pip3.11 install snmpsim pysmi +pip3.11 install snmpsim pysmi cryptography dnf module enable -y nodejs:24 dnf install -y nodejs diff --git a/.github/docker/testing/Dockerfile.testing-plugins-alma9 b/.github/docker/testing/Dockerfile.testing-plugins-alma9 index 0b9b5290da..89615655f9 100644 --- a/.github/docker/testing/Dockerfile.testing-plugins-alma9 +++ b/.github/docker/testing/Dockerfile.testing-plugins-alma9 @@ -22,7 +22,7 @@ dnf clean all dnf install -y python3.11 python3.11-pip pip3.11 install robotframework robotframework-examples # Install snmpsim -pip3.11 install snmpsim pysmi +pip3.11 install snmpsim pysmi cryptography dnf module enable -y nodejs:24 dnf install -y nodejs diff --git a/.github/docker/testing/Dockerfile.testing-plugins-noble b/.github/docker/testing/Dockerfile.testing-plugins-noble index 4a0d1970a4..325bd735ef 100644 --- a/.github/docker/testing/Dockerfile.testing-plugins-noble +++ b/.github/docker/testing/Dockerfile.testing-plugins-noble @@ -41,7 +41,7 @@ python3 -m venv .venv apt-get install -y python3 python3-dev python3-pip pip3 install robotframework robotframework-examples # Install snmpsim -pip3 install snmpsim pysmi +pip3 install snmpsim pysmi cryptography curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - apt-get install -y nodejs diff --git a/packaging/centreon-plugin-Network-Stormshield-Snmp/rpm.json b/packaging/centreon-plugin-Network-Stormshield-Snmp/rpm.json index 418a331fce..ff5e30b76c 100644 --- a/packaging/centreon-plugin-Network-Stormshield-Snmp/rpm.json +++ b/packaging/centreon-plugin-Network-Stormshield-Snmp/rpm.json @@ -1,5 +1,6 @@ { "dependencies": [ + "perl(DateTime)", "perl(SNMP)" ] -} \ No newline at end of file +} diff --git a/src/network/stormshield/snmp/mode/auto_update.pm b/src/network/stormshield/snmp/mode/auto_update.pm new file mode 100644 index 0000000000..9e0407c888 --- /dev/null +++ b/src/network/stormshield/snmp/mode/auto_update.pm @@ -0,0 +1,221 @@ +# Copyright 2026-Present Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::stormshield::snmp::mode::auto_update; + +use base qw(centreon::plugins::templates::counter); +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); +use centreon::plugins::misc qw(is_empty); + +use strict; +use warnings; +use DateTime; +use centreon::plugins::constants qw(:counters); +use centreon::plugins::misc; + +my %STATES_TO_READABLE = ( + 'Uptodate' => 'is up to date', + 'Disabled' => 'is disabled', + 'NeverStarted' => 'never started', + 'Failed' => 'has failed', + 'Broken' => 'is broken', + 'Partially Failed' => 'partially failed', + 'N/A' => 'has no available state' +); + +sub custom_auto_update_output { + my ($self, %options) = @_; + + my $state = $self->{result_values}->{state}; + my $display = $self->{result_values}->{display}; + + return "$display " . $STATES_TO_READABLE{$state} if $STATES_TO_READABLE{$state}; + return "$display " . $state + . " (Last Update: " . ($self->{result_values}->{last_date} // 'N/A') . ")"; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { + name => 'updates', + type => COUNTER_TYPE_INSTANCE, + message_multiple => 'All Updates and Webservices are up to date' + } + ]; + + $self->{maps_counters}->{updates} = [ + { + label => 'status', + type => COUNTER_KIND_TEXT, + warning_default => '%{state} =~ /Partially Failed/i', + critical_default => '%{state} =~ /^(Failed|Broken)$/i', + set => { + key_values => [ + { name => 'display' }, + { name => 'state' }, + { name => 'last_date' } + ], + closure_custom_output => $self->can('custom_auto_update_output'), + closure_custom_threshold_check => \&catalog_status_threshold_ng + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{updates} = {}; + + my $oid_snsAutoupdateEntry = '.1.3.6.1.4.1.11256.1.9.1.1'; + my $oid_snsAutoupdateIndex = '.1.3.6.1.4.1.11256.1.9.1.1.1'; + my $oid_snsAutoupdateSubsys = '.1.3.6.1.4.1.11256.1.9.1.1.2'; + my $oid_snsAutoupdateState = '.1.3.6.1.4.1.11256.1.9.1.1.3'; + my $oid_snsAutoupdateLast = '.1.3.6.1.4.1.11256.1.9.1.1.4'; + + my $oid_snsCustomWebServicesEntry = '.1.3.6.1.4.1.11256.1.9.2.1'; + my $oid_snsCustomWebServicesIndex = '.1.3.6.1.4.1.11256.1.9.2.1.1'; + my $oid_snsCustomWebServicesName = '.1.3.6.1.4.1.11256.1.9.2.1.2'; + my $oid_snsCustomWebServicesState = '.1.3.6.1.4.1.11256.1.9.2.1.3'; + my $oid_snsCustomWebServicesLast = '.1.3.6.1.4.1.11256.1.9.2.1.4'; + + + my $oid_snsVersion = '.1.3.6.1.4.1.11256.1.18.2.0'; + my $snmp_result_version = $options{snmp}->get_leef(oids => [ $oid_snsVersion ], nothing_quit => 1); + my $version_clean = ''; + + if (defined $snmp_result_version && defined $snmp_result_version->{$oid_snsVersion}) { + $version_clean = $snmp_result_version->{$oid_snsVersion}; + $version_clean =~ s/([0-9]+(?:\.[0-9]+)*).*/$1/; + } + + my $snmp_result_update = $options{snmp}->get_table( + oid => $oid_snsAutoupdateEntry, + nothing_quit => 0 + ); + + my $snmp_result_webservice = {}; + + # The MIB WebService is available only starting with version 5.1.0 + if (defined $version_clean && centreon::plugins::misc::minimal_version($version_clean, '5.1.0')) { + $snmp_result_webservice = $options{snmp}->get_table( + oid => $oid_snsCustomWebServicesEntry, + nothing_quit => 0 + ); + } + + $self->process_table( + snmp_result => $snmp_result_update, + index_oid => $oid_snsAutoupdateIndex, + name_oid => $oid_snsAutoupdateSubsys, + state_oid => $oid_snsAutoupdateState, + date_oid => $oid_snsAutoupdateLast, + prefix => 'Update' + ); + + if (scalar(keys %{$snmp_result_webservice}) > 0) { + $self->process_table( + snmp_result => $snmp_result_webservice, + index_oid => $oid_snsCustomWebServicesIndex, + name_oid => $oid_snsCustomWebServicesName, + state_oid => $oid_snsCustomWebServicesState, + date_oid => $oid_snsCustomWebServicesLast, + prefix => 'WebService' + ); + } + + if (scalar(keys %{$self->{updates}}) == 0) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => 'No updates or web services found.' + ); + $self->{updates} = {}; + return; + } +} + +sub process_table { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp_result}; + my $index_oid = $options{index_oid}; + my $name_oid = $options{name_oid}; + my $state_oid = $options{state_oid}; + my $date_oid = $options{date_oid}; + my $prefix = $options{prefix}; + + foreach my $oid (sort keys %{$snmp_result}) { + next unless $oid =~ /^$index_oid\./; + + my $index = $oid; + $index =~ s/^$index_oid\.//; + + my $name = is_empty($snmp_result->{"$name_oid.$index"}) ? 'N/A' : $snmp_result->{"$name_oid.$index"}; + my $state = is_empty($snmp_result->{"$state_oid.$index"}) ? 'N/A' : $snmp_result->{"$state_oid.$index"}; + my $lastDate = is_empty($snmp_result->{"$date_oid.$index"}) ? 'N/A' : $snmp_result->{"$date_oid.$index"}; + + my $normalized_state = ($state =~ /^(Uptodate|Failed|Disabled|Broken|Partially Failed)$/) ? $state : 'NeverStarted'; + + $self->{updates}->{$prefix . '_' . $index} = { + display => $prefix . ': ' . $name, + state => $normalized_state, + last_date => $lastDate + }; + } +} + +1; + +__END__ + +=head1 MODE + +This mode allows you to monitor the status of auto-updates and web services on a Stormshield device. +It checks for failed, broken, or partially failed updates and reports their status. + +=over 8 + +=item B<--unknown-status> + +Define the conditions to match for the status to be UNKNOWN. +You can use the following variables: %{display}, %{state}, %{last_date} + +=item B<--warning-status> + +Define the conditions to match for the status to be WARNING (default: C<%{state} =~ /Partially Failed/i>). +You can use the following variables: %{display}, %{state}, %{last_date} + +=item B<--critical-status> + +Define the conditions to match for the status to be CRITICAL (default: C<%{state} =~ /^(Failed|Broken)$/i>). +You can use the following variables: %{display}, %{state}, %{last_date} + +=back + +=cut \ No newline at end of file diff --git a/src/network/stormshield/snmp/mode/components/disk.pm b/src/network/stormshield/snmp/mode/components/disk.pm index e451770745..f5f3d9c3d6 100644 --- a/src/network/stormshield/snmp/mode/components/disk.pm +++ b/src/network/stormshield/snmp/mode/components/disk.pm @@ -1,5 +1,5 @@ # -# Copyright 2024 Centreon (http://www.centreon.com/) +# Copyright 2026-Present Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -23,17 +23,32 @@ package network::stormshield::snmp::mode::components::disk; use strict; use warnings; -my $mapping = { - name => { oid => '.1.3.6.1.4.1.11256.1.10.5.1.2' }, # snsDiskEntryDiskName - isRaid => { oid => '.1.3.6.1.4.1.11256.1.10.5.1.4' }, # snsDiskEntryIsRaid - raidStatus => { oid => '.1.3.6.1.4.1.11256.1.10.5.1.5' } # snsDiskEntryRaidStatus +# Single-node OIDs — structure: oid. +my $mapping_single = { + name => { oid => '.1.3.6.1.4.1.11256.1.10.5.1.2' }, # snsDiskEntryDiskName + smartResult => { oid => '.1.3.6.1.4.1.11256.1.10.5.1.3' }, # snsDiskEntrySmartResult + isRaid => { oid => '.1.3.6.1.4.1.11256.1.10.5.1.4' }, # snsDiskEntryIsRaid + raidStatus => { oid => '.1.3.6.1.4.1.11256.1.10.5.1.5' }, # snsDiskEntryRaidStatus + position => { oid => '.1.3.6.1.4.1.11256.1.10.5.1.6' } # snsDiskEntryPosition }; -my $oid_diskEntry = '.1.3.6.1.4.1.11256.1.10.5.1'; # snsDiskEntry +my $oid_diskEntry_single = '.1.3.6.1.4.1.11256.1.10.5.1'; # snsDiskEntry + +# HA OIDs — structure: oid.. +my $oid_disk_name_ha = '.1.3.6.1.4.1.11256.1.11.11.1.2'; # snsNodeDiskName +my $oid_disk_smartResult_ha = '.1.3.6.1.4.1.11256.1.11.11.1.3'; # snsNodeDiskSmartResult +my $oid_disk_isRaid_ha = '.1.3.6.1.4.1.11256.1.11.11.1.4'; # snsNodeDiskIsRaid +my $oid_disk_raidStatus_ha = '.1.3.6.1.4.1.11256.1.11.11.1.5'; # snsNodeDiskRaidStatus +my $oid_disk_position_ha = '.1.3.6.1.4.1.11256.1.11.11.1.6'; # snsNodeDiskPosition +my $oid_diskEntry_ha = '.1.3.6.1.4.1.11256.1.11.11.1'; # snsNodeDiskEntry sub load { my ($self) = @_; - - push @{$self->{request}}, { oid => $oid_diskEntry, end => $mapping->{raidStatus}->{oid} }; + + if ($self->{is_ha}) { + push @{$self->{request}}, { oid => $oid_diskEntry_ha }; + } else { + push @{$self->{request}}, { oid => $oid_diskEntry_single, end => $mapping_single->{position}->{oid} }; + } } sub check { @@ -43,44 +58,89 @@ sub check { $self->{components}->{disk} = { name => 'disks', total => 0, skip => 0 }; return if ($self->check_filter(section => 'disk')); - foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{ $oid_diskEntry }})) { - next if ($oid !~ /^$mapping->{name}->{oid}\.(.*)$/); - my $instance = $1; - my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{ $oid_diskEntry }, instance => $instance); - - next if ($self->check_filter(section => 'disk', instance => $instance)); + my $nodes = $self->{is_ha} ? $self->{ha_nodes} : ['0']; + my $serials = $self->{ha_serials}; - $self->{components}->{disk}->{total}++; - if ($result->{isRaid} == 0) { - $self->{output}->output_add( - long_msg => sprintf( - "disk '%s' is not member of a raid [instance: %s]", - $result->{name}, - $instance - ) - ); - next; + foreach my $node_id (@$nodes) { + my $label_prefix = $self->{is_ha} ? $serials->{$node_id} . '_' : ''; + my %disks_data = (); + + if ($self->{is_ha}) { + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_diskEntry_ha}})) { + if ($oid =~ /^$oid_disk_name_ha\.$node_id\.(\d+)$/) { + $disks_data{$1}{name} = $self->{results}->{$oid_diskEntry_ha}->{$oid}; + } elsif ($oid =~ /^$oid_disk_smartResult_ha\.$node_id\.(\d+)$/) { + $disks_data{$1}{smartResult} = $self->{results}->{$oid_diskEntry_ha}->{$oid}; + } elsif ($oid =~ /^$oid_disk_isRaid_ha\.$node_id\.(\d+)$/) { + $disks_data{$1}{isRaid} = $self->{results}->{$oid_diskEntry_ha}->{$oid}; + } elsif ($oid =~ /^$oid_disk_raidStatus_ha\.$node_id\.(\d+)$/) { + $disks_data{$1}{raidStatus} = $self->{results}->{$oid_diskEntry_ha}->{$oid}; + } elsif ($oid =~ /^$oid_disk_position_ha\.$node_id\.(\d+)$/) { + $disks_data{$1}{position} = $self->{results}->{$oid_diskEntry_ha}->{$oid}; + } + } + } else { + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_diskEntry_single}})) { + next if ($oid !~ /^$mapping_single->{name}->{oid}\.(\d+)$/); + my $disk_id = $1; + my $result = $self->{snmp}->map_instance( + mapping => $mapping_single, + results => $self->{results}->{$oid_diskEntry_single}, + instance => $disk_id + ); + $disks_data{$disk_id} = $result; + } } - $self->{output}->output_add( - long_msg => sprintf( - "disk '%s' raid status is '%s' [instance: %s]", - $result->{name}, - $result->{raidStatus}, - $instance - ) - ); - - my $exit = $self->get_severity(section => 'raid', value => $result->{raidStatus}); - if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + foreach my $disk_id (sort { $a <=> $b } keys %disks_data) { + my $disk = $disks_data{$disk_id}; + my $instance = $label_prefix . 'disk' . $disk_id; + + next if ($self->check_filter(section => 'disk', instance => $instance)); + $self->{components}->{disk}->{total}++; + + my $smart = $disk->{smartResult} // 'N/A'; + my $name = $label_prefix . $disk->{name} // $instance; $self->{output}->output_add( - severity => $exit, - short_msg => sprintf( - "Disk '%s' raid status is '%s'", $result->{name}, $result->{raidStatus} + long_msg => sprintf( + "disk '%s' smart result is '%s' [isRaid: %s, raidStatus: %s, position: %s]", + $name, + $smart, + (defined $disk->{isRaid} && $disk->{isRaid} == 1) ? 'true' : 'false', + (defined $disk->{raidStatus} && $disk->{raidStatus} ne '') ? $disk->{raidStatus} : '/', + $disk->{position} // 'N/A' ) ); + + my $exit = $self->get_severity(section => 'disk', value => $smart); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Disk '%s' smart result is '%s'", $name, $smart) + ); + } + + if (defined $disk->{isRaid} && $disk->{isRaid} == 1 + && defined $disk->{raidStatus} && $disk->{raidStatus} ne '') + { + if ($disk->{raidStatus} eq 'missing'){ + $self->{output}->output_add( + severity => 'WARNING', + short_msg => sprintf( + "Disk '%s' RAID status is '%s'", $name, $disk->{raidStatus} + ) + ); + } elsif ($disk->{raidStatus} eq 'degraded') { + $self->{output}->output_add( + severity => 'CRITICAL', + short_msg => sprintf( + "Disk '%s' RAID status is '%s'", $name, $disk->{raidStatus} + ) + ); + } + } } } } -1; +1; \ No newline at end of file diff --git a/src/network/stormshield/snmp/mode/components/fan.pm b/src/network/stormshield/snmp/mode/components/fan.pm index 9dda6a12cc..8018690b17 100644 --- a/src/network/stormshield/snmp/mode/components/fan.pm +++ b/src/network/stormshield/snmp/mode/components/fan.pm @@ -1,5 +1,5 @@ # -# Copyright 2024 Centreon (http://www.centreon.com/) +# Copyright 2026-Present Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -23,20 +23,28 @@ package network::stormshield::snmp::mode::components::fan; use strict; use warnings; -my $mapping = { +# Single-node OIDs — structure: oid. +my $mapping_single = { name => { oid => '.1.3.6.1.4.1.11256.1.10.9.1.2' }, # snsFanName status => { oid => '.1.3.6.1.4.1.11256.1.10.9.1.3' }, # snsFanStatus - rpm => { oid => '.1.3.6.1.4.1.11256.1.10.9.1.4' } # snsFanRpm + rpm => { oid => '.1.3.6.1.4.1.11256.1.10.9.1.4' } # snsFanRpm }; -my $oid_fanEntry = '.1.3.6.1.4.1.11256.1.10.9.1'; # snsFanEntry +my $oid_fanEntry_single = '.1.3.6.1.4.1.11256.1.10.9.1'; # snsFanEntry + +# HA OIDs — structure: oid.. +my $oid_fan_name_ha = '.1.3.6.1.4.1.11256.1.11.13.1.2'; # snsNodeFanName +my $oid_fan_status_ha = '.1.3.6.1.4.1.11256.1.11.13.1.3'; # snsNodeFanStatus +my $oid_fan_rpm_ha = '.1.3.6.1.4.1.11256.1.11.13.1.4'; # snsNodeFanRpm +my $oid_fanEntry_ha = '.1.3.6.1.4.1.11256.1.11.13.1'; # snsNodeFanEntry sub load { my ($self) = @_; - - push @{$self->{request}}, { - oid => $oid_fanEntry, - start => $mapping->{name}->{oid} - }; + + if ($self->{is_ha}) { + push @{$self->{request}}, { oid => $oid_fanEntry_ha }; + } else { + push @{$self->{request}}, { oid => $oid_fanEntry_single }; + } } sub check { @@ -46,51 +54,71 @@ sub check { $self->{components}->{fan} = { name => 'fans', total => 0, skip => 0 }; return if ($self->check_filter(section => 'fan')); - my ($exit, $warn, $crit, $checked); - foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{ $oid_fanEntry }})) { - next if ($oid !~ /^$mapping->{name}->{oid}\.(.*)$/); - my $instance = $1; + my $nodes = $self->{is_ha} ? $self->{ha_nodes} : ['0']; + my $serials = $self->{ha_serials}; - my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{ $oid_fanEntry }, instance => $instance); + foreach my $node_id (@$nodes) { + my $label_prefix = $self->{is_ha} ? $serials->{$node_id} . '_' : ''; + my %fans_data = (); - next if ($self->check_filter(section => 'fan', instance => $instance)); + if ($self->{is_ha}) { + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_fanEntry_ha}})) { + if ($oid =~ /^$oid_fan_name_ha\.$node_id\.(\d+)$/) { + $fans_data{$1}{name} = $self->{results}->{$oid_fanEntry_ha}->{$oid}; + } elsif ($oid =~ /^$oid_fan_status_ha\.$node_id\.(\d+)$/) { + $fans_data{$1}{status} = $self->{results}->{$oid_fanEntry_ha}->{$oid}; + } elsif ($oid =~ /^$oid_fan_rpm_ha\.$node_id\.(\d+)$/) { + $fans_data{$1}{rpm} = $self->{results}->{$oid_fanEntry_ha}->{$oid}; + } + } + } else { + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_fanEntry_single}})) { + next if ($oid !~ /^$mapping_single->{name}->{oid}\.(\d+)$/); + my $fan_id = $1; + my $result = $self->{snmp}->map_instance( + mapping => $mapping_single, + results => $self->{results}->{$oid_fanEntry_single}, + instance => $fan_id + ); + $fans_data{$fan_id} = $result; + } + } - $self->{components}->{fan}->{total}++; - $self->{output}->output_add( - long_msg => sprintf( - "fan '%s' status is '%s' [instance: %s, rpm: %s]", - $result->{name}, $result->{status}, $instance, $result->{rpm} - ) - ); + foreach my $fan_id (sort { $a <=> $b } keys %fans_data) { + my $fan = $fans_data{$fan_id}; + my $instance = $label_prefix . $fan->{name}; - $exit = $self->get_severity(section => 'fan', value => $result->{status}); - if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add( - severity => $exit, - short_msg => sprintf( - "Fan '%s' status is '%s'", $result->{name}, $result->{status} - ) - ); - } + next if ($self->check_filter(section => 'fan', instance => $instance)); + $self->{components}->{fan}->{total}++; + + my $status = $fan->{status} // 'unknown'; - ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'fan', instance => $instance, value => $result->{rpm}); - if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { $self->{output}->output_add( - severity => $exit, - short_msg => sprintf( - "fan '%s' speed is '%s' rpm", $result->{name}, $result->{rpm} + long_msg => sprintf( + "fan '%s' status is '%s'", + $instance, $status ) ); + + if (defined $fan->{rpm}) { + $self->{output}->perfdata_add( + nlabel => 'hardware.fan.speed.rpm', + unit => 'rpm', + instances => $instance, + value => $fan->{rpm}, + min => 0 + ); + } + + my $exit = $self->get_severity(section => 'fan', value => $status); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Fan '%s' status is '%s'", $instance, $status) + ); + } } - $self->{output}->perfdata_add( - nlabel => 'hardware.fan.speed.rpm', - unit => 'rpm', - instances => $result->{fanName}, - value => $result->{fanValue}, - warning => $warn, - critical => $crit, min => 0 - ); } } -1; +1; \ No newline at end of file diff --git a/src/network/stormshield/snmp/mode/components/psu.pm b/src/network/stormshield/snmp/mode/components/psu.pm index feef573266..01b81023e9 100644 --- a/src/network/stormshield/snmp/mode/components/psu.pm +++ b/src/network/stormshield/snmp/mode/components/psu.pm @@ -1,5 +1,5 @@ # -# Copyright 2024 Centreon (http://www.centreon.com/) +# Copyright 2026-Present Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -23,16 +23,26 @@ package network::stormshield::snmp::mode::components::psu; use strict; use warnings; -my $mapping = { +# Single-node OIDs — structure: oid. +my $mapping_single = { powered => { oid => '.1.3.6.1.4.1.11256.1.10.6.1.2' }, # snsPowerSupplyPowered status => { oid => '.1.3.6.1.4.1.11256.1.10.6.1.3' } # snsPowerSupplyStatus }; -my $oid_psuEntry = '.1.3.6.1.4.1.11256.1.10.6.1'; # snsPowerSupplyEntry +my $oid_psuEntry_single = '.1.3.6.1.4.1.11256.1.10.6.1'; # snsPowerSupplyEntry + +# HA OIDs — structure: oid.. +my $oid_psu_powered_ha = '.1.3.6.1.4.1.11256.1.11.10.1.2'; # snsNodePowerSupplyPowered +my $oid_psu_status_ha = '.1.3.6.1.4.1.11256.1.11.10.1.3'; # snsNodePowerSupplyStatus +my $oid_psuEntry_ha = '.1.3.6.1.4.1.11256.1.11.10.1'; # snsNodePowerSupplyEntry sub load { my ($self) = @_; - - push @{$self->{request}}, { oid => $oid_psuEntry }; + + if ($self->{is_ha}) { + push @{$self->{request}}, { oid => $oid_psuEntry_ha }; + } else { + push @{$self->{request}}, { oid => $oid_psuEntry_single }; + } } sub check { @@ -42,33 +52,61 @@ sub check { $self->{components}->{psu} = { name => 'psu', total => 0, skip => 0 }; return if ($self->check_filter(section => 'psu')); - foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{ $oid_psuEntry }})) { - next if ($oid !~ /^$mapping->{status}->{oid}\.(.*)$/); - my $instance = $1; - my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{ $oid_psuEntry }, instance => $instance); - - next if ($self->check_filter(section => 'psu', instance => $instance)); - - $self->{components}->{psu}->{total}++; - $self->{output}->output_add( - long_msg => sprintf( - "power supply '%s' status is '%s' [instance: %s]", - $instance, - $result->{status}, - $instance - ) - ); - - my $exit = $self->get_severity(section => 'psu', value => $result->{status}); - if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + my $nodes = $self->{is_ha} ? $self->{ha_nodes} : ['0']; + my $serials = $self->{ha_serials}; + + foreach my $node_id (@$nodes) { + my $label_prefix = $self->{is_ha} ? $serials->{$node_id} . '_' : ''; + my %psus_data = (); + + if ($self->{is_ha}) { + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_psuEntry_ha}})) { + if ($oid =~ /^$oid_psu_powered_ha\.$node_id\.(\d+)$/) { + $psus_data{$1}{powered} = $self->{results}->{$oid_psuEntry_ha}->{$oid}; + } elsif ($oid =~ /^$oid_psu_status_ha\.$node_id\.(\d+)$/) { + $psus_data{$1}{status} = $self->{results}->{$oid_psuEntry_ha}->{$oid}; + } + } + } else { + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_psuEntry_single}})) { + next if ($oid !~ /^$mapping_single->{status}->{oid}\.(\d+)$/); + my $psu_id = $1; + my $result = $self->{snmp}->map_instance( + mapping => $mapping_single, + results => $self->{results}->{$oid_psuEntry_single}, + instance => $psu_id + ); + $psus_data{$psu_id} = $result; + } + } + + foreach my $psu_id (sort { $a <=> $b } keys %psus_data) { + my $psu = $psus_data{$psu_id}; + my $instance = $label_prefix . 'psu' . $psu_id; + + next if ($self->check_filter(section => 'psu', instance => $instance)); + $self->{components}->{psu}->{total}++; + + my $status = $psu->{status} // 'unknown'; + $self->{output}->output_add( - severity => $exit, - short_msg => sprintf( - "Power supply '%s' status is '%s'", $instance, $result->{status} + long_msg => sprintf( + "power supply '%s' status is '%s' [powered: %s]", + $instance, + $status, + (defined $psu->{powered} && $psu->{powered} == 1) ? 'yes' : 'no' ) ); + + my $exit = $self->get_severity(section => 'psu', value => $status); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Power supply '%s' status is '%s'", $instance, $status) + ); + } } } } -1; +1; \ No newline at end of file diff --git a/src/network/stormshield/snmp/mode/components/temperature.pm b/src/network/stormshield/snmp/mode/components/temperature.pm index 22aa4ad3f9..229820ba33 100644 --- a/src/network/stormshield/snmp/mode/components/temperature.pm +++ b/src/network/stormshield/snmp/mode/components/temperature.pm @@ -1,5 +1,5 @@ # -# Copyright 2024 Centreon (http://www.centreon.com/) +# Copyright 2026-Present Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -23,16 +23,20 @@ package network::stormshield::snmp::mode::components::temperature; use strict; use warnings; -my $mapping = { - cpuTemp => { oid => '.1.3.6.1.4.1.11256.1.10.7.1.2' } # snsCpuTemp -}; +# Single-node OIDs +my $oid_cpu_temp_single = '.1.3.6.1.4.1.11256.1.10.7.1.2'; # snsCpuTemp + +# HA OIDs — structure: oid.. +my $oid_cpu_temp_ha = '.1.3.6.1.4.1.11256.1.11.12.1.2'; # snsNodeCpuTemp sub load { my ($self) = @_; - - push @{$self->{request}}, { - oid => $mapping->{cpuTemp}->{oid} - }; + + if ($self->{is_ha}) { + push @{$self->{request}}, { oid => $oid_cpu_temp_ha }; + } else { + push @{$self->{request}}, { oid => $oid_cpu_temp_single }; + } } sub check { @@ -42,38 +46,84 @@ sub check { $self->{components}->{temperature} = { name => 'temperatures', total => 0, skip => 0 }; return if ($self->check_filter(section => 'temperature')); - foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{ $mapping->{cpuTemp}->{oid} }})) { - next if ($oid !~ /^$mapping->{cpuTemp}->{oid}\.(.*)$/); + my $nodes = $self->{is_ha} ? $self->{ha_nodes} : ['0']; + my $serials = $self->{ha_serials}; - my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{ $mapping->{cpuTemp}->{oid} }, instance => $1); + foreach my $node_id (@$nodes) { + my $label_prefix = $self->{is_ha} ? $serials->{$node_id} . '_' : ''; - my $instance = 'cpu' . $1; - next if ($self->check_filter(section => 'temperature', instance => $instance)); + my @cpu_ids = (); + my %cpu_temps = (); - $self->{components}->{temperature}->{total}++; - $self->{output}->output_add( - long_msg => sprintf( - "temperature '%s' is %s celsius [instance: %s]", - $instance, $result->{cpuTemp}, $instance - ) - ); + if ($self->{is_ha}) { + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cpu_temp_ha}})) { + next if ($oid !~ /^$oid_cpu_temp_ha\.$node_id\.(\d+)$/); + my $cpu_id = $1; + push @cpu_ids, $cpu_id; + $cpu_temps{$cpu_id} = $self->{results}->{$oid_cpu_temp_ha}->{$oid}; + $self->{components}->{temperature}->{total}++; + } + } else { + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cpu_temp_single}})) { + next if ($oid !~ /^$oid_cpu_temp_single\.(\d+)$/); + my $cpu_id = $1; + push @cpu_ids, $cpu_id; + $cpu_temps{$cpu_id} = $self->{results}->{$oid_cpu_temp_single}->{$oid}; + $self->{components}->{temperature}->{total}++; + } + } + + next if (scalar @cpu_ids == 0); + @cpu_ids = sort { $a <=> $b } @cpu_ids; + + my $cpu_sum = 0; + foreach my $cpu_id (@cpu_ids) { + my $temp = $cpu_temps{$cpu_id}; + my $instance = $label_prefix . 'cpu' . $cpu_id; + + next if ($self->check_filter(section => 'temperature', instance => $instance)); + + $cpu_sum += $temp; - my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{cpuTemp}); - if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { $self->{output}->output_add( - severity => $exit, - short_msg => sprintf( - "temperature '%s' is %s celsius", $instance, $result->{cpuTemp} + long_msg => sprintf( + "temperature '%s' is '%s' celsius", + $instance, $temp ) ); + + $self->{output}->perfdata_add( + nlabel => 'hardware.cpu.temperature.celsius', + unit => 'C', + instances => $instance, + value => $temp, + min => 0 + ); + + my ($exit) = $self->get_severity_numeric( + section => 'temperature', + instance => $instance, + value => $temp + ); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Temperature '%s' is '%s' celsius", $instance, $temp + ) + ); + } } + + my $cpu_avg = int($cpu_sum / scalar(@cpu_ids)); + my $avg_instance = $label_prefix . 'cpu_average_temp'; + $self->{output}->perfdata_add( - nlabel => 'hardware.temperature.celsius', - unit => 'C', - instances => $instance, - value => $result->{cpuTemp}, - warning => $warn, - critical => $crit, min => 0 + nlabel => 'hardware.cpu.average.temperature.celsius', + unit => 'C', + instances => $avg_instance, + value => $cpu_avg, + min => 0 ); } } diff --git a/src/network/stormshield/snmp/mode/connections.pm b/src/network/stormshield/snmp/mode/connections.pm index 615b97fbbc..13cccc505a 100644 --- a/src/network/stormshield/snmp/mode/connections.pm +++ b/src/network/stormshield/snmp/mode/connections.pm @@ -1,5 +1,5 @@ # -# Copyright 2024 Centreon (http://www.centreon.com/) +# Copyright 2026-Present Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -24,38 +24,65 @@ use base qw(centreon::plugins::templates::counter); use strict; use warnings; -use Digest::MD5 qw(md5_hex); +use centreon::plugins::constants qw(:counters); sub set_counters { my ($self, %options) = @_; $self->{maps_counters_type} = [ - { name => 'global', type => 0 }, + { name => 'global', type => COUNTER_TYPE_GLOBAL }, + { name => 'policy', type => COUNTER_TYPE_INSTANCE }, ]; $self->{maps_counters}->{global} = [ - { label => 'udp', set => { - key_values => [ { name => 'udp', per_second => 1 } ], - output_template => 'UDP : %d connections/s', + { label => 'udp', nlabel => 'connections.udp.count', set => { + key_values => [ { name => 'udp' } ], + output_template => 'UDP : %d connections', perfdatas => [ - { label => 'udp', template => '%d', min => 0, unit => 'con' } + { template => '%d', min => 0 } ] } }, - { label => 'tcp', set => { - key_values => [ { name => 'tcp', per_second => 1 } ], - output_template => 'TCP : %d connections/s', + { label => 'tcp', nlabel => 'connections.tcp.count', set => { + key_values => [ { name => 'tcp' } ], + output_template => 'TCP : %d connections', perfdatas => [ - { label => 'tcp', template => '%d', min => 0, unit => 'con' } + { template => '%d', min => 0 } + ] + } + }, + { label => 'major', nlabel => 'alarms.major.count', set => { + key_values => [ { name => 'major' } ], + output_template => 'Major Alarms : %d', + perfdatas => [ + { template => '%d', min => 0 } + ] + } + }, + { label => 'minor', nlabel => 'alarms.minor.count', set => { + key_values => [ { name => 'minor' } ], + output_template => 'Minor Alarms : %d', + perfdatas => [ + { template => '%d', min => 0 } ] } } ]; + + $self->{maps_counters}->{policy} = [ + { label => 'policy-dummy', threshold => 0, set => { + key_values => [ { name => 'index' }, { name => 'name' }, { name => 'slot_name' }, + { name => 'active' }, { name => 'sync' } ], + output_template => "Policy: '%{name}', slot: '%{slot_name}', active: '%{active}', sync: %{sync}", + perfdatas => [] + } + } + ]; } sub new { my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); bless $self, $class; $options{options}->add_options(arguments => { @@ -67,20 +94,47 @@ sub new { sub manage_selection { my ($self, %options) = @_; - $self->{cache_name} = 'fw_stormshield_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . md5_hex('all'); + my $oid_snsASQStatsStatefulUdpConn = '.1.3.6.1.4.1.11256.1.12.1.33.0'; + my $oid_snsASQStatsStatefulTcpConn = '.1.3.6.1.4.1.11256.1.12.1.23.0'; + my $oid_snsASQStatsStatefulMajorAlarm = '.1.3.6.1.4.1.11256.1.12.1.12.0'; + my $oid_snsASQStatsStatefulMinorAlarm = '.1.3.6.1.4.1.11256.1.12.1.11.0'; - my $oid_ntqASQStatsStatefulUdpConn = '.1.3.6.1.4.1.11256.1.12.1.33.0'; - my $oid_ntqASQStatsStatefulTcpConn = '.1.3.6.1.4.1.11256.1.12.1.23.0'; - - my $result = $options{snmp}->get_leef( - oids => [ $oid_ntqASQStatsStatefulUdpConn, $oid_ntqASQStatsStatefulTcpConn ], + my $result_asq = $options{snmp}->get_leef( + oids => [ $oid_snsASQStatsStatefulUdpConn, $oid_snsASQStatsStatefulTcpConn, $oid_snsASQStatsStatefulMajorAlarm, $oid_snsASQStatsStatefulMinorAlarm ], nothing_quit => 1 ); $self->{global} = { - udp => $result->{$oid_ntqASQStatsStatefulUdpConn}, - tcp => $result->{$oid_ntqASQStatsStatefulTcpConn} + udp => $result_asq->{$oid_snsASQStatsStatefulUdpConn}, + tcp => $result_asq->{$oid_snsASQStatsStatefulTcpConn}, + major => $result_asq->{$oid_snsASQStatsStatefulMajorAlarm}, + minor => $result_asq->{$oid_snsASQStatsStatefulMinorAlarm} }; + + + my $oid_snsPolicyIndex = '.1.3.6.1.4.1.11256.1.8.1.1.1'; + my $oid_snsPolicyName = '.1.3.6.1.4.1.11256.1.8.1.1.2'; + my $oid_snsPolicySlotName = '.1.3.6.1.4.1.11256.1.8.1.1.3'; + my $oid_snsPolicyActive = '.1.3.6.1.4.1.11256.1.8.1.1.4'; + my $oid_snsPolicySync = '.1.3.6.1.4.1.11256.1.8.1.1.5'; + + my $result_policy = $options{snmp}->get_table( + oid => '.1.3.6.1.4.1.11256.1.8.1.1', + nothing_quit => 1 + ); + + $self->{policy} = {}; + foreach my $oid (keys %{$result_policy}) { + next unless $oid =~ /^$oid_snsPolicyIndex\.(\d+)$/; + my $idx = $1; + $self->{policy}->{$idx} = { + index => $idx, + name => $result_policy->{"$oid_snsPolicyName.$idx"} // '', + slot_name => $result_policy->{"$oid_snsPolicySlotName.$idx"} // '', + active => $result_policy->{"$oid_snsPolicyActive.$idx"} // '', + sync => ($result_policy->{"$oid_snsPolicySync.$idx"} // 0) ? 'True' : 'False', + }; + } } 1; @@ -89,20 +143,42 @@ __END__ =head1 MODE -Check connections setup rate on Stormshield Firewall equipments. +Check connections setup rate and policy table on Stormshield Firewall equipments. =over 8 -=item B<--warning-*> +=item B<--warning-tcp> + +Warning threshold for TCP connections. + +=item B<--warning-udp> + +Warning threshold for UDP connections. + +=item B<--warning-major> + +Warning threshold for Major Alarms. + +=item B<--warning-minor> + +Warning threshold for Minor Alarms. + +=item B<--critical-tcp> + +Critical threshold for TCP connections. + +=item B<--critical-udp> + +Critical threshold for UDP connections. + +=item B<--critical-major> -Warning threshold. -Can be: 'tcp', 'udp' +Critical threshold for Major Alarms. -=item B<--critical-*> +=item B<--critical-minor> -Critical threshold. -Can be: 'tcp', 'udp' +Critical threshold for Minor Alarms. =back -=cut +=cut \ No newline at end of file diff --git a/src/network/stormshield/snmp/mode/ha_cluster.pm b/src/network/stormshield/snmp/mode/ha_cluster.pm new file mode 100644 index 0000000000..da206e5cb7 --- /dev/null +++ b/src/network/stormshield/snmp/mode/ha_cluster.pm @@ -0,0 +1,261 @@ +# Copyright 2026-Present Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::stormshield::snmp::mode::ha_cluster; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::constants qw(:counters :values); +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => COUNTER_TYPE_GLOBAL }, + ]; + + $self->{maps_counters}->{global} = [ + { + label => 'dead-nodes', + nlabel => 'cluster.dead-nodes.count', + type => COUNTER_KIND_METRIC, + warning_default => '50', + critical_default => '100', + set => { + key_values => [ { name => 'dead_pct' }, { name => 'nb_nodes' }, { name => 'dead_nodes' } ], + output_template => 'Dead Nodes: %{dead_nodes}/%{nb_nodes} (%{dead_pct}%%)', + perfdatas => [ + { label => 'ha.dead_nodes.count', value => 'dead_nodes', template => '%s', min => 0, max => 'nb_nodes', threshold_total => 'nb_nodes', cast_int => 1 } + ] + } + }, + { + label => 'faulty-links', + nlabel => 'cluster.faulty-links.count', + type => COUNTER_KIND_METRIC, + warning_default => '50', + critical_default => '100', + set => { + key_values => [ { name => 'faulty_pct' }, { name => 'nb_links' }, { name => 'faulty_links' } ], + output_template => 'Faulty Links: %{faulty_links}/%{nb_links} (%{faulty_pct}%%)', + perfdatas => [ + { label => 'ha.faulty_links.count', value => 'faulty_links', template => '%s', min => 0, max => 'nb_links', threshold_total => 'nb_links', cast_int => 1 } + ] + } + }, + { + label => 'active-firewall', + nlabel => 'cluster.active-firewalls.count', + type => COUNTER_KIND_METRIC, + critical_default => '1:1', + set => { + key_values => [ { name => 'nb_active' } ], + output_template => 'Active Firewalls: %{nb_active}/2', + perfdatas => [ + { label => 'ha.active_firewalls.count', value => 'nb_active', template => '%s', min => 0, max => 2, cast_int => 1 } + ] + } + }, + { + label => 'sync-status', + type => COUNTER_KIND_TEXT, + warning_default => '%{sync_status} eq "False"', + set => { + key_values => [ { name => 'sync_status' } ], + output_template => 'Configuration Synced: %{sync_status}', + closure_custom_threshold_check => \&catalog_status_threshold_ng + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + return $self; +} + +my $oid_snsNode = '.1.3.6.1.4.1.11256.1.11.7.1'; +my $oid_snsNbNode = '.1.3.6.1.4.1.11256.1.11.1.0'; +my $oid_snsNbDeadNode = '.1.3.6.1.4.1.11256.1.11.2.0'; +my $oid_snsNbActiveNode = '.1.3.6.1.4.1.11256.1.11.3.0'; +my $oid_snsNbHALinks = '.1.3.6.1.4.1.11256.1.11.5.0'; +my $oid_snsNbFaultyHALinks = '.1.3.6.1.4.1.11256.1.11.6.0'; +my $oid_snsHASyncStatus = '.1.3.6.1.4.1.11256.1.11.8.0'; + +my %mapping = ( + snsNodeIndex => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.1' }, + snsFwSerial => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.2' }, + snsOnline => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.3' }, + snsModel => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.4' }, + snsVersion => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.5' }, + snsHALicence => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.6' }, + snsHAQuality => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.7' }, + snsHAPriority => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.8' }, + snsHAStatusForced => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.9' }, + snsHAActive => { oid => '.1.3.6.1.4.1.11256.1.11.7.1.10' }, +); + +my %map_online = ( 2 => 'False', 1 => 'True' ); +my %map_status = ( 0 => 'False', 1 => 'True' ); +my %map_act_pass = ( 2 => 'Passive', 1 => 'Active' ); +my %map_sync = ( 0 => 'False', 1 => 'True' ); + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result_scalar = $options{snmp}->get_leef( + oids => [ + $oid_snsNbNode, + $oid_snsNbDeadNode, + $oid_snsNbActiveNode, + $oid_snsNbHALinks, + $oid_snsNbFaultyHALinks, + $oid_snsHASyncStatus, + ], + nothing_quit => 0 + ); + + my $nb_nodes = $snmp_result_scalar->{$oid_snsNbNode} // 0; + my $dead_nodes = $snmp_result_scalar->{$oid_snsNbDeadNode} // 0; + my $nb_active = $snmp_result_scalar->{$oid_snsNbActiveNode} // 0; + my $nb_links = $snmp_result_scalar->{$oid_snsNbHALinks} // 0; + my $faulty_links = $snmp_result_scalar->{$oid_snsNbFaultyHALinks} // 0; + my $sync_raw = $snmp_result_scalar->{$oid_snsHASyncStatus} // -1; + + $self->{output}->option_exit(severity => 'UNKNOWN', short_msg => 'No HA cluster detected') + unless $nb_nodes; + + my $dead_pct = ($nb_nodes > 0) ? int(($dead_nodes / $nb_nodes) * 100) : 0; + my $faulty_pct = ($nb_links > 0) ? int(($faulty_links / $nb_links) * 100) : 0; + my $sync_str = $map_sync{$sync_raw} // 'UNKNOWN'; + + $self->{global} = { + dead_nodes => $dead_nodes, + nb_nodes => $nb_nodes, + dead_pct => $dead_pct, + faulty_links => $faulty_links, + nb_links => $nb_links, + faulty_pct => $faulty_pct, + nb_active => $nb_active, + sync_status => $sync_str, + }; + + my $snmp_result_table = $options{snmp}->get_table( + oid => $oid_snsNode, + nothing_quit => 1 + ); + + my %nodes; + foreach my $oid (sort keys %{$snmp_result_table}) { + foreach my $field (keys %mapping) { + my $col_oid = $mapping{$field}->{oid}; + next if !defined($col_oid); + if ($oid =~ /^\Q$col_oid\E\.(\d+)$/) { + my $idx = $1; + $nodes{$idx}->{$field} = $snmp_result_table->{$oid}; + } + } + } + + my $cluster_desc = "---- Cluster Description ----\n"; + + foreach my $idx (sort { $a <=> $b } keys %nodes) { + my $n = $nodes{$idx}; + + my $serial = $n->{snsFwSerial} // 'N/A'; + my $model = $n->{snsModel} // 'N/A'; + my $version = $n->{snsVersion} // 'N/A'; + my $status_f = $map_status{ $n->{snsHAStatusForced} // 0 } // 'UNKNOWN'; + my $act_pass = $map_act_pass{ $n->{snsHAActive} // 0 } // 'UNKNOWN'; + my $online = $map_online{ $n->{snsOnline} // 0 } // 'UNKNOWN'; + my $licence = $n->{snsHALicence} // 'N/A'; + my $quality = $n->{snsHAQuality} // 'N/A'; + my $priority = $n->{snsHAPriority} // 'N/A'; + + $cluster_desc .= sprintf( + "Serial: %s\nModel: %s\nVersion: %s\nStatus Forced: %s\nActive/Passive: %s\nOnline: %s\nLicense: %s\nQuality: %s\nPriority: %s\n%s\n", + $serial, + $model, + $version, + $status_f, + $act_pass, + $online, + $licence, + $quality, + $priority, + '-' x 25 + ); + } + + $self->{output}->output_add(long_msg => $cluster_desc); +} + +1; + +__END__ + +=head1 MODE + +Check Stormshield HA cluster global status. + +=over 8 + +=item B<--warning-active-firewall> + +Threshold. + +=item B<--critical-active-firewall> + +Threshold. Default: C<1:1> since there must be only one active firewall per cluster. + +=item B<--warning-dead-nodes> + +Threshold in percentage of the total number of nodes. Default: 50. + +=item B<--critical-dead-nodes> + +Threshold in percentage of the total number of nodes. Default: 100. + +=item B<--warning-faulty-links> + +Threshold in percentage of the total number of links. Default: 50. + +=item B<--critical-faulty-links> + +Threshold in percentage of the total number of links. Default: 100. + +=item B<--warning-sync-status> + +Define the conditions to match for the status to be WARNING (default: C<%{sync_status} eq "False">). +You can use the following variables: %{sync_status}. + +=item B<--critical-sync-status> + +Define the conditions to match for the status to be CRITICAL. +You can use the following variables: %{sync_status}. + +=back + +=cut diff --git a/src/network/stormshield/snmp/mode/hardware.pm b/src/network/stormshield/snmp/mode/hardware.pm index dc337cfb95..226da7db57 100644 --- a/src/network/stormshield/snmp/mode/hardware.pm +++ b/src/network/stormshield/snmp/mode/hardware.pm @@ -1,5 +1,5 @@ # -# Copyright 2024 Centreon (http://www.centreon.com/) +# Copyright 2026-Present Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -25,36 +25,79 @@ use base qw(centreon::plugins::templates::hardware); use strict; use warnings; +my $oid_snsNodeIndex = '.1.3.6.1.4.1.11256.1.11.7.1.1'; +my $oid_snsFwSerial = '.1.3.6.1.4.1.11256.1.11.7.1.2'; + sub set_system { my ($self, %options) = @_; $self->{regexp_threshold_numeric_check_section_option} = '^(?:fan|temperature)$'; - + + $self->{cb_hook1} = 'detect_topology'; $self->{cb_hook2} = 'snmp_execute'; - + $self->{thresholds} = { fan => [ ['running', 'OK'], - ['.*', 'CRITICAL'] + ['.*', 'CRITICAL'] ], psu => [ - ['OK', 'OK'], - ['.*', 'CRITICAL'] + ['FAILED', 'CRITICAL'], + ['NOTFOUND', 'WARNING'], + ['.*', 'OK'] ], - raid => [ - ['optimal', 'OK'], - ['.*', 'CRITICAL'] + disk => [ + ['PASSED', 'OK'], + ['NotSupported', 'OK'], + ['.*', 'CRITICAL'] ] }; - - $self->{components_path} = 'network::stormshield::snmp::mode::components'; - $self->{components_module} = ['disk', 'fan', 'psu', 'temperature']; + + $self->{components_path} = 'network::stormshield::snmp::mode::components'; + $self->{components_module} = ['temperature', 'fan', 'psu', 'disk']; } -sub snmp_execute { +sub detect_topology { my ($self, %options) = @_; - + $self->{snmp} = $options{snmp}; + + my $ha_result = $options{snmp}->get_table( + oid => $oid_snsNodeIndex, + nothing_quit => 0 + ); + + $self->{ha_nodes} = []; + $self->{ha_serials} = {}; + + if (!defined $ha_result || scalar(keys %$ha_result) == 0) { + # Single Node + $self->{is_ha} = 0; + push @{$self->{ha_nodes}}, '0'; + $self->{ha_serials}->{'0'} = 'single'; + return; + } + + # HA + $self->{is_ha} = 1; + foreach my $oid (sort keys %$ha_result) { + if ($oid =~ /^$oid_snsNodeIndex\.(\d+)$/) { + push @{$self->{ha_nodes}}, $1; + } + } + + my @serial_oids = map { "$oid_snsFwSerial.$_" } @{$self->{ha_nodes}}; + my $serial_res = $options{snmp}->get_leef(oids => \@serial_oids, nothing_quit => 0); + foreach my $node_id (@{$self->{ha_nodes}}) { + my $s = $serial_res->{"$oid_snsFwSerial.$node_id"}; + $self->{ha_serials}->{$node_id} = defined $s ? $s : "node$node_id"; + } +} + +sub snmp_execute { + my ($self, %options) = @_; + + $self->{snmp} = $options{snmp}; $self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request}); } @@ -74,7 +117,8 @@ __END__ =head1 MODE -Check hardware. +Check hardware components (temperature, fan, PSU, disk). +Automatically detects single-node and high-availability (HA) cluster configurations. =over 8 @@ -85,13 +129,14 @@ Can be: 'disk', 'fan', 'psu', 'temperature'. =item B<--filter> -Exclude the items given as a comma-separated list (example: --filter=fan). -You can also exclude items from specific instances: --filter=fan,1 +Exclude items given as a comma-separated list (example: --filter=fan). +You can also exclude specific instances: --filter=fan,1 =item B<--absent-problem> -Return an error if a component is not 'present' (default is skipping). -It can be set globally or for a specific instance: --absent-problem='component_name' or --absent-problem='component_name,instance_value'. +Return an error if a component is not present (default: skip). +Can be set globally or per instance: --absent-problem='component_name' or +--absent-problem='component_name,instance_value'. =item B<--no-component> @@ -99,27 +144,30 @@ Define the expected status if no components are found (default: critical). =item B<--threshold-overload> -Use this option to override the status returned by the plugin when the status label matches a regular expression (syntax: section,[instance,]status,regexp). +Override the status returned by the plugin when the status label matches a +regular expression (syntax: section,[instance,]status,regexp). Example: --threshold-overload='disk,WARNING,missing' =item B<--warning> -Set warning threshold for 'temperature', 'fan' (syntax: type,regexp,threshold) -Example: --warning='temperature,.*,40' +Set warning threshold for 'temperature' or 'fan' (syntax: type,regexp,threshold). +Example: --warning='temperature,.*,60' =item B<--critical> -Set critical threshold for 'temperature', 'fan' (syntax: type,regexp,threshold) -Example: --critical='temperature,.*,50' +Set critical threshold for 'temperature' or 'fan' (syntax: type,regexp,threshold). +Example: --critical='temperature,.*,70' =item B<--warning-count-*> -Define the warning threshold for the number of components of one type (replace '*' with the component type). +Define the warning threshold for the number of components of one type +(replace '*' with the component type). =item B<--critical-count-*> -Define the critical threshold for the number of components of one type (replace '*' with the component type). +Define the critical threshold for the number of components of one type +(replace '*' with the component type). =back -=cut +=cut \ No newline at end of file diff --git a/src/network/stormshield/snmp/mode/health.pm b/src/network/stormshield/snmp/mode/health.pm index 7fab848355..3cf2f7571f 100644 --- a/src/network/stormshield/snmp/mode/health.pm +++ b/src/network/stormshield/snmp/mode/health.pm @@ -1,5 +1,5 @@ # -# Copyright 2024 Centreon (http://www.centreon.com/) +# Copyright 2026-Present Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -25,6 +25,8 @@ use base qw(centreon::plugins::templates::counter); use strict; use warnings; use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); +use centreon::plugins::constants qw/:counters :values/; + sub custom_service_status_output { my ($self, %options) = @_; @@ -35,32 +37,33 @@ sub custom_service_status_output { ); } -sub firewall_long_output { - my ($self, %options) = @_; - - return "checking firewall '" . $options{instance_value}->{display} . "'"; -} - sub prefix_firewall_output { my ($self, %options) = @_; - return "firewall '" . $options{instance_value}->{display} . "' "; + return "firewall '" . $options{instance_value}->{display} . "': "; } sub prefix_service_output { my ($self, %options) = @_; - return "service '" . $options{instance_value}->{service} . "' "; + return "firewall '" . $options{instance_value}->{firewall} . "' service '" . $options{instance_value}->{service} . "' "; } sub set_counters { my ($self, %options) = @_; $self->{maps_counters_type} = [ - { name => 'firewalls', type => 3, cb_prefix_output => 'prefix_firewall_output', cb_long_output => 'firewall_long_output', - indent_long_output => ' ', message_multiple => 'All firewalls are ok', + { name => 'firewalls', type => COUNTER_TYPE_GROUP, + cb_prefix_output => 'prefix_firewall_output', + indent_long_output => ' ', + message_multiple => 'All firewalls are ok', group => [ - { name => 'services', display_long => 1, cb_prefix_output => 'prefix_service_output', message_multiple => 'All services are ok', type => 1, skipped_code => { -10 => 1 } } + { + name => 'services', + cb_prefix_output => 'prefix_service_output', + message_multiple => 'All services are ok', + type => COUNTER_TYPE_INSTANCE, + skipped_code => { NO_VALUE => 1 } } ] } ]; @@ -68,11 +71,11 @@ sub set_counters { $self->{maps_counters}->{services} = [ { label => 'service-status', - type => 2, + type => COUNTER_KIND_TEXT, warning_default => '%{health} =~ /minor/i', critical_default => '%{health} =~ /major/i', set => { - key_values => [ { name => 'health' }, { name => 'service' } ], + key_values => [ { name => 'health' }, { name => 'service' }, { name => 'firewall' } ], closure_custom_output => $self->can('custom_service_status_output'), closure_custom_perfdata => sub { return 0; }, closure_custom_threshold_check => \&catalog_status_threshold_ng @@ -94,18 +97,21 @@ sub new { } my $mapping = { - link => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.4' }, # snsHaLinkHealth + hamode => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.3' }, # snsHaModeHealth + halink => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.4' }, # snsHaLinkHealth powersupply => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.5' }, # snsPowerSupplyHealth fan => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.6' }, # snsFanHealth - cpu => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.7' }, # snsFanHealth + cpu => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.7' }, # snsCpuHealth memory => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.8' }, # snsMemHealth disk => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.9' }, # snsDiskHealth raid => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.10' }, # snsRaidHealth certificate => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.11' }, # snsCertHealth CRL => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.12' }, # snsCRLHealth - #password => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.13' }, # snsPasswdHealth - #cpu_temperature => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.14' }, # snsCpuTempHealth - #TPM => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.15' } # snsTPMHealth + TPM => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.13' }, # snsTPMHealth + password => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.14' }, # snsPasswdHealth + cpu_temperature => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.15' }, # snsCpuTempHealth + router => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.16' }, # snsRouterHealth + NTP => { oid => '.1.3.6.1.4.1.11256.1.16.2.1.17' }, # snsNTPHealth }; my $oid_snsSerialHealth = '.1.3.6.1.4.1.11256.1.16.2.1.2'; @@ -130,12 +136,15 @@ sub manage_selection { } $self->{firewalls}->{$instance} = { - display => $serial, + display => $serial, services => {} }; } - return if (scalar(keys %{$self->{firewalls}}) <= 0); + if (scalar(keys %{$self->{firewalls}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No firewall found with accepted serial."); + $self->{output}->option_exit(); + } $options{snmp}->load( oids => [ map($_->{oid}, values(%$mapping)) ], @@ -148,8 +157,9 @@ sub manage_selection { foreach my $service (keys %$result) { $self->{firewalls}->{$_}->{services}->{$service} = { - service => $service, - health => $result->{$service} + service => $service, + health => $result->{$service}, + firewall => $self->{firewalls}->{$_}->{display} }; } } diff --git a/src/network/stormshield/snmp/mode/interfaces_disco.pm b/src/network/stormshield/snmp/mode/interfaces_disco.pm new file mode 100644 index 0000000000..60cd79ec29 --- /dev/null +++ b/src/network/stormshield/snmp/mode/interfaces_disco.pm @@ -0,0 +1,510 @@ +# +# Copyright 2026-Present Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::stormshield::snmp::mode::interfaces_disco; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::constants qw/:counters :values/; + +sub generic_interface_output { + my ($self, %options) = @_; + return sprintf("Interface %s, Address: %s, Mask: %s, Type: %s, Is Protected: %s", + $self->{result_values}->{if_name}, + $self->{result_values}->{if_address}, + $self->{result_values}->{if_mask}, + $self->{result_values}->{if_type}, + $self->{result_values}->{if_protected}, + ); +} + + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { + name => 'interfaces', + type => COUNTER_TYPE_INSTANCE, + message_multiple => 'All interfaces are OK', + display_long => 1, + skipped_code => { -10 => 1 } + } + ]; + + $self->{maps_counters}->{interfaces} = [ + { + label => 'textual-info', + type => COUNTER_KIND_TEXT, + set => { + key_values => [ + { name => 'if_name' }, + { name => 'if_address' }, + { name => 'if_mask' }, + { name => 'if_type' }, + { name => 'if_protected' } + ], + closure_custom_output => $self->can('generic_interface_output'), + } + }, + { + label => 'throughput-in', + nlabel => 'interface.throughput.in.bytespersecond', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_throughput_in' }, + { name => 'if_name' } + ], + output_template => 'Throughput In: %s B/s', + perfdatas => [ + { + label => 'throughput_in', + value => 'if_throughput_in', + template => '%s', + unit => 'B/s', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-throughput-in'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-throughput-in'), + instance_use => 'if_name' + } + ] + } + }, + { + label => 'throughput-out', + nlabel => 'interface.throughput.out.bytespersecond', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_throughput_out' }, + { name => 'if_name' } + ], + output_template => 'Throughput Out: %s B/s', + perfdatas => [ + { + label => 'throughput_out', + value => 'if_throughput_out', + template => '%s', + unit => 'B/s', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-throughput-out'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-throughput-out'), + instance_use => 'if_name' + } + ] + } + }, + { + label => 'current-tcp', + nlabel => 'interface.connections.tcp.count', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_current_tcp' }, + { name => 'if_name' } + ], + output_template => 'Current TCP Connections: %s', + perfdatas => [ + { + label => 'current_tcp_con', + value => 'if_current_tcp', + template => '%s', + unit => 'con', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-current-tcp'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-current-tcp'), + instance_use => 'if_name' + } + ] + } + }, + { + label => 'current-udp', + nlabel => 'interface.connections.udp.count', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_current_udp' }, + { name => 'if_name' } + ], + output_template => 'Current UDP Connections: %s', + perfdatas => [ + { + label => 'current_udp_con', + value => 'if_current_udp', + template => '%s', + unit => 'con', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-current-udp'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-current-udp'), + instance_use => 'if_name' + } + ] + } + }, + { + label => 'tcp-in', + nlabel => 'interface.traffic.tcp.in.bytes', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_tcp_in' }, + { name => 'if_name' } + ], + output_template => 'TCP In: %s bytes', + perfdatas => [ + { + label => 'tcp_in', + value => 'if_tcp_in', + template => '%s', + unit => 'bytes', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-tcp-in'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-tcp-in'), + instance_use => 'if_name' + } + ] + } + }, + { + label => 'tcp-out', + nlabel => 'interface.traffic.tcp.out.bytes', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_tcp_out' }, + { name => 'if_name' } + ], + output_template => 'TCP Out: %s bytes', + perfdatas => [ + { + label => 'tcp_out', + value => 'if_tcp_out', + template => '%s', + unit => 'bytes', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-tcp-out'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-tcp-out'), + instance_use => 'if_name' + } + ] + } + }, + { + label => 'udp-in', + nlabel => 'interface.traffic.udp.in.bytes', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_udp_in' }, + { name => 'if_name' } + ], + output_template => 'UDP In: %s bytes', + perfdatas => [ + { + label => 'udp_in', + value => 'if_udp_in', + template => '%s', + unit => 'bytes', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-udp-in'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-udp-in'), + instance_use => 'if_name' + } + ] + } + }, + { + label => 'udp-out', + nlabel => 'interface.traffic.udp.out.bytes', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_udp_out' }, + { name => 'if_name' } + ], + output_template => 'UDP Out: %s bytes', + perfdatas => [ + { + label => 'udp_out', + value => 'if_udp_out', + template => '%s', + unit => 'bytes', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-udp-out'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-udp-out'), + instance_use => 'if_name' + } + ] + } + }, + { + label => 'packets-accepted', + nlabel => 'interface.packets.accepted.count', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_pack_accepted' }, + { name => 'if_name' } + ], + output_template => 'Packets Accepted: %s', + perfdatas => [ + { + label => 'pack_accepted', + value => 'if_pack_accepted', + template => '%s', + unit => 'packets', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-packets-accepted'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-packets-accepted'), + instance_use => 'if_name' + } + ] + } + }, + { + label => 'packets-blocked', + nlabel => 'interface.packets.blocked.count', + type => COUNTER_KIND_METRIC, + set => { + key_values => [ + { name => 'if_pack_blocked' }, + { name => 'if_name' } + ], + output_template => 'Packets Blocked: %s', + perfdatas => [ + { + label => 'pack_blocked', + value => 'if_pack_blocked', + template => '%s', + unit => 'packets', + min => 0, + label_extra_instance => 1, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-packets-blocked'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-packets-blocked'), + instance_use => 'if_name' + } + ] + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'filter-name:s' => { name => 'filter_name' }, + }); + + return $self; +} + +my $mapping = { + snsifName => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.2' }, + snsifAddr => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.4' }, + snsifMask => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.5' }, + snsifType => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.6' }, + snsifProtected => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.37' }, + snsifPktAccepted => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.11' }, + snsifPktBlocked => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.12' }, + snsifTcpConnCount => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.23' }, + snsifUdpConnCount => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.24' }, + snsifInCurThroughput => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.25' }, + snsifOutCurThroughput => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.26' }, + snsifInTcpBytes => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.31' }, + snsifOutTcpBytes => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.32' }, + snsifInUdpBytes => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.33' }, + snsifOutUdpBytes => { oid => '.1.3.6.1.4.1.11256.1.4.1.1.34' } +}; +my $oid_snsifEntry = '.1.3.6.1.4.1.11256.1.4.1.1'; + + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_table( + oid => $oid_snsifEntry, + start => $mapping->{snsifName}->{oid}, + end => $mapping->{snsifProtected}->{oid}, + ); + + + $self->{interfaces} = {}; + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{snsifName}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); + if ((defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && $result->{snsifName} ne $self->{option_results}->{filter_name}) || ($result->{snsifName} =~ /^mgmt/)) { + next; + } + + $self->{interfaces}->{$instance} = { + if_name => $result->{snsifName} // '-', + if_address => $result->{snsifAddr} // '-', + if_mask => $result->{snsifMask} // '-', + if_type => $result->{snsifType} // '-', + if_protected => ($result->{snsifProtected} ? 'true' : 'false'), + if_throughput_in => $result->{snsifInCurThroughput} // 0, + if_throughput_out => $result->{snsifOutCurThroughput} // 0, + if_current_tcp => $result->{snsifTcpConnCount} // 0, + if_current_udp => $result->{snsifUdpConnCount} // 0, + if_tcp_in => $result->{snsifInTcpBytes} // 0, + if_tcp_out => $result->{snsifOutTcpBytes} // 0, + if_udp_in => $result->{snsifInUdpBytes} // 0, + if_udp_out => $result->{snsifOutUdpBytes} // 0, + if_pack_accepted => $result->{snsifPktAccepted} // 0, + if_pack_blocked => $result->{snsifPktBlocked} // 0, + }; + } + + if (scalar(keys %{$self->{interfaces}}) <= 0) { + $self->{output}->add_option_msg( + short_msg => 'No interface found matching: ' . ($self->{option_results}->{filter_name} // '') + ); + $self->{output}->option_exit(); + } +} + +sub disco_format { + my ($self, %options) = @_; + + $self->{output}->add_disco_format(elements => ['if_name', 'if_address', 'if_mask', 'if_type', 'if_protected', 'if_throughput_in', 'if_throughput_out', 'if_current_tcp', 'if_current_udp', 'if_tcp_in', 'if_tcp_out', 'if_udp_in', 'if_udp_out', 'if_pack_accepted', 'if_pack_blocked']); +} + +sub disco_show { + my ($self, %options) = @_; + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{interfaces}}) { + $self->{output}->add_disco_entry(%{$self->{interfaces}->{$instance}}); + } +} + +1; + +__END__ + +=head1 MODE + +This mode retrieves and displays the status of interfaces on the Stormshield device, including their name, global in/out traffic, TCP/UDP in/out traffic, and packet acceptance/blocking statistics. + +=over 8 + +=item B<--filter-name> + +Filter by name to only display this interface + +=item B<--warning-throughput-in> + +Set the warning threshold for throughput in (bytes per second). + +=item B<--critical-throughput-in> + +Set the critical threshold for throughput in (bytes per second). + +=item B<--warning-throughput-out> + +Set the warning threshold for throughput out (bytes per second). + +=item B<--critical-throughput-out> + +Set the critical threshold for throughput out (bytes per second). + +=item B<--warning-current-tcp> + +Set the warning threshold for current TCP connections. + +=item B<--critical-current-tcp> + +Set the critical threshold for current TCP connections. + +=item B<--warning-current-udp> + +Set the warning threshold for current UDP connections. + +=item B<--critical-current-udp> + +Set the critical threshold for current UDP connections. + +=item B<--warning-tcp-in> + +Set the warning threshold for TCP in traffic (bytes). + +=item B<--critical-tcp-in> + +Set the critical threshold for TCP in traffic (bytes). + +=item B<--warning-tcp-out> + +Set the warning threshold for TCP out traffic (bytes). + +=item B<--critical-tcp-out> + +Set the critical threshold for TCP out traffic (bytes). + +=item B<--warning-udp-in> + +Set the warning threshold for UDP in traffic (bytes). + +=item B<--critical-udp-in> + +Set the critical threshold for UDP in traffic (bytes). + +=item B<--warning-udp-out> + +Set the warning threshold for UDP out traffic (bytes). + +=item B<--critical-udp-out> + +Set the critical threshold for UDP out traffic (bytes). + +=item B<--warning-packets-accepted> + +Set the warning threshold for packets accepted. + +=item B<--critical-packets-accepted> + +Set the critical threshold for packets accepted. + +=item B<--warning-packets-blocked> + +Set the warning threshold for packets blocked. + +=item B<--critical-packets-blocked> + +Set the critical threshold for packets blocked. + +=back + +=cut \ No newline at end of file diff --git a/src/network/stormshield/snmp/mode/licenses.pm b/src/network/stormshield/snmp/mode/licenses.pm new file mode 100644 index 0000000000..26ebaf2f69 --- /dev/null +++ b/src/network/stormshield/snmp/mode/licenses.pm @@ -0,0 +1,320 @@ +# +# Copyright 2026-Present Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::stormshield::snmp::mode::licenses; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::constants qw/:counters :values/; +use centreon::plugins::misc qw(is_empty); +use DateTime; + +sub firewall_long_output { + my ($self, %options) = @_; + my $display = $options{instance_value}->{display}; + + if (defined $display && $display ne '') { + return "--------------Firewall $display--------------"; + } + return "------------------------------------------------------------"; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { + name => 'firewalls', + type => COUNTER_TYPE_MULTIPLE, + cb_long_output => 'firewall_long_output', + message_multiple => 'All licences of the cluster are up to date', + group => [ + { + name => 'licences', + display_long => 1, + #cb_prefix_output => sub { return ''; }, + message_multiple => 'All licences are up to date', + type => COUNTER_MULTIPLE_SUBINSTANCE, + } + ] + } + ]; + + $self->{maps_counters}->{licences} = [ + { + label => 'expires-days', + nlabel => 'license.expiration.days', + type => COUNTER_KIND_METRIC, + warning_default => '60:', + critical_default => '0:', + set => { + key_values => [ + { name => 'days_left' }, + { name => 'name' }, + { name => 'exp_date' }, + { name => 'seconds_left' } + ], + output_template => "Licence: %{name} (Expires in %{days_left} days: %{exp_date})", + perfdatas => [ + { template => '%s', unit => 'd', cast_int => 1, label_extra_instance => 1 } + ] + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'timezone:s' => { name => 'timezone', default => 'CET' } + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{firewalls} = {}; + + my $oid_snsNode = '.1.3.6.1.4.1.11256.1.11.7.1.1'; + my $oid_snsFwSerial = '.1.3.6.1.4.1.11256.1.11.7.1.2'; + my $oid_snsVersion = '.1.3.6.1.4.1.11256.1.18.2.0'; + + my $snmp_result_version = $options{snmp}->get_leef( + oids => [ $oid_snsVersion ], + nothing_quit => 0, + ); + + if (defined $snmp_result_version && defined $snmp_result_version->{$oid_snsVersion}) { + my $version_clean = $snmp_result_version->{$oid_snsVersion}; + # Extract major.minor.patch version number + $version_clean =~ s/([0-9]+(?:\.[0-9]+)*).*/$1/; + + if (!centreon::plugins::misc::minimal_version($version_clean, '5.1.0')) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => 'Firmware version too old. Minimum required: 5.1.0' + ); + return; + } + } + + # Detect if the device is in High Availability (HA) mode or Single Node + my $ha_instances = []; + my $ha_error = 0; + my $ha_result = undef; + my $serials = {}; + + eval { + $ha_result = $options{snmp}->get_table( + oid => $oid_snsNode, + nothing_quit => 0 + ); + }; + if ($@) { + $ha_error = 1; + } + + my $is_ha = 0; + if ($ha_error || !defined $ha_result || scalar(keys %$ha_result) == 0) { + # No data returned from HA OID, assume Single Node mode + push @$ha_instances, '0'; + $is_ha = 0; + } else { + # Data returned, parse instances to determine HA cluster members + foreach my $oid (sort keys %$ha_result) { + if ($oid =~ /^$oid_snsNode\.(.*)/) { + my $instance = $1; + push @$ha_instances, $instance; + } + } + + if (scalar(@$ha_instances) == 0) { + push @$ha_instances, '0'; + } + $is_ha = 1; + } + + # Fetch serial numbers for each detected instance (useful for display in HA) + my @serial_oids = map { "$oid_snsFwSerial.$_" } @$ha_instances; + my $serial_res = $options{snmp}->get_leef(oids => \@serial_oids, nothing_quit => 0); + foreach my $inst (@$ha_instances) { + my $oid_serial = "$oid_snsFwSerial.$inst"; + if (defined $serial_res && defined $serial_res->{$oid_serial}) { + $serials->{$inst} = $serial_res->{$oid_serial}; + } else { + $serials->{$inst} = "Unknown"; + } + } + + my $tz = centreon::plugins::misc::set_timezone(name => $self->{option_results}->{timezone}); + my $licence_count_total = 0; + + # Define OIDs based on HA or non-HA mode + # Stormshield uses different MIB for HA clusters vs standalone devices + my $oid_table; + my $oid_index_base; + my $oid_name_base; + my $oid_exp_base; + + if ($is_ha) { + $oid_table = '.1.3.6.1.4.1.11256.1.11.14.1'; # oid_snsNodeLicenceOptionEntry + $oid_index_base = '.1.3.6.1.4.1.11256.1.11.14.1.1'; # oid_snsNodeLicenceOptionIndex + $oid_name_base = '.1.3.6.1.4.1.11256.1.11.14.1.2'; # oid_snsNodeLicenceOptionName + $oid_exp_base = '.1.3.6.1.4.1.11256.1.11.14.1.3'; # oid_snsNodeLicenceExpirationDate + } else { + $oid_table = '.1.3.6.1.4.1.11256.1.21.1.1'; # oid_snsLicenceOptionEntry + $oid_index_base = '.1.3.6.1.4.1.11256.1.21.1.1.1'; # oid_snsLicenceOptionIndex + $oid_name_base = '.1.3.6.1.4.1.11256.1.21.1.1.2'; # oid_snsLicenceOptionName + $oid_exp_base = '.1.3.6.1.4.1.11256.1.21.1.1.3'; # oid_snsLicenceExpirationDate + } + + my $snmp_lic_result = $options{snmp}->get_table( + oid => $oid_table, + nothing_quit => 0 + ); + + if (!defined $snmp_lic_result || scalar(keys %{$snmp_lic_result}) == 0) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => 'No valid licences found (SNMP table empty)' + ); + return; + } + + # Iterate over each firewall instance (HA node or single node) + foreach my $fw_instance (@$ha_instances) { + my $fw_key = $serials->{$fw_instance} // 'Unknown'; + my $display_name = ''; + if (scalar(@$ha_instances) > 1) { + $display_name = $fw_key; + } + + $self->{firewalls}->{$fw_key} = { + display => $display_name, + licences => {} + }; + + foreach my $oid (sort keys %{$snmp_lic_result}) { + my $index; + my $instance_id; + + if ($is_ha) { + # In HA mode, OID structure is: base.instance.index + # We must filter to ensure we only process licenses for the current $fw_instance + if ($oid =~ /^$oid_index_base\.(\d+)\.(\d+)$/) { + $instance_id = $1; + $index = $2; + next unless $instance_id eq $fw_instance; + } else { + next; + } + } else { + # In Single Node mode, OID structure is: base.index + if ($oid =~ /^$oid_index_base\.(.*)$/) { + $index = $1; + } else { + next; + } + } + + my $name_oid = $is_ha ? "$oid_name_base.$fw_instance.$index" : "$oid_name_base.$index"; + my $exp_oid = $is_ha ? "$oid_exp_base.$fw_instance.$index" : "$oid_exp_base.$index"; + + my $name = $snmp_lic_result->{$name_oid}; + my $exp_date = $snmp_lic_result->{$exp_oid}; + + if (is_empty($name) || is_empty($exp_date) || $exp_date eq 'N/A' || $exp_date eq '0000-00-00') { + next; + } + + my ($year, $month, $day); + if ($exp_date =~ /^\s*(\d{4})-(\d{2})-(\d{2})\s*$/) { + ($year, $month, $day) = ($1, $2, $3); + } else { + next; + } + + my $dt = DateTime->new( + year => $year, + month => $month, + day => $day, + hour => 0, + minute => 0, + second => 0, + %$tz + ); + + my $seconds_left = $dt->epoch - time(); + my $days_left = int($seconds_left / 86400); + + $self->{firewalls}->{$fw_key}->{licences}->{$name} = { + name => $name, + exp_date => $exp_date, + days_left => $days_left, + seconds_left => $seconds_left + }; + $licence_count_total++; + } + } + + if ($licence_count_total == 0) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => 'No valid licences found' + ); + $self->{firewalls} = {}; + return; + } + +} + +1; + +__END__ + +=head1 MODE + +This mode allows you to retrieve and display the licenses for the Stormshield device, as well as their expiration dates. +It automatically supports high-availability (HA) configurations by detecting the nodes in the cluster. + +=over 8 + +=item B<--warning-expires-days> + +Threshold in days (default: 60). + +=item B<--critical-expires-days> + +Threshold in days (default: 0). + +=item B<--timezone> + +Timezone options. Default is C. + +=back + +=cut diff --git a/src/network/stormshield/snmp/mode/memorydetailed.pm b/src/network/stormshield/snmp/mode/memorydetailed.pm index 36fc7b46b3..b64d28c2a7 100644 --- a/src/network/stormshield/snmp/mode/memorydetailed.pm +++ b/src/network/stormshield/snmp/mode/memorydetailed.pm @@ -1,5 +1,5 @@ # -# Copyright 2024 Centreon (http://www.centreon.com/) +# Copyright 2026-Present Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -24,6 +24,8 @@ use base qw(centreon::plugins::templates::counter); use strict; use warnings; +use centreon::plugins::constants qw/:counters :values/; +use centreon::plugins::misc; sub prefix_memory_output { my ($self, %options) = @_; @@ -33,11 +35,11 @@ sub prefix_memory_output { sub set_counters { my ($self, %options) = @_; - + $self->{maps_counters_type} = [ - { name => 'global', type => 0, cb_prefix_output => 'prefix_memory_output', skipped_code => { -10 => 1 } } + { name => 'global', type => COUNTER_TYPE_GLOBAL, cb_prefix_output => 'prefix_memory_output', skipped_code => { NO_VALUE() => 1 } } ]; - + $self->{maps_counters}->{global} = [ { label => 'total', nlabel => 'memory.usage.percentage', set => { key_values => [ { name => 'total' } ], @@ -65,7 +67,7 @@ sub set_counters { }, { label => 'conn', nlabel => 'memory.connections.percentage', set => { key_values => [ { name => 'conn' } ], - output_template => 'connections: %.2f %%', + output_template => "ASQ connections: %.2f%%", perfdatas => [ { template => '%.2f', min => 0, max => 100, unit => '%' } ] @@ -81,7 +83,7 @@ sub set_counters { }, { label => 'dtrack', nlabel => 'memory.data_tracking.percentage', set => { key_values => [ { name => 'dtrack' } ], - output_template => 'data tracking: %.2f %%', + output_template => "Data Tracking: %.2f%%", perfdatas => [ { template => '%.2f', min => 0, max => 100, unit => '%' } ] @@ -96,13 +98,45 @@ sub set_counters { } }, { label => 'etherstate', nlabel => 'memory.ether_state.percentage', set => { - key_values => [ { name => 'ether_state' } ], - output_template => 'ether state: %.2f %%', + key_values => [ { name => 'etherstate' } ], + output_template => "EtherState: %s%%", perfdatas => [ { template => '%.2f', min => 0, max => 100, unit => '%' } ] } }, + { label => 'socket',nlabel => 'memory.socket.percentage', set => { + key_values => [ { name => 'socket' } ], + output_template => "Socket: %s%%", + perfdatas => [ + { + label => 'mem_socket', + value => 'socket', + template => '%s', + unit => '%', + min => 0, + max => 100, + } + ] + } + }, + + # only for version >= 4.8.9 + { label => 'user', nlabel => 'memory.user.percentage', set => { + key_values => [ { name => 'user' } ], + output_template => "User: %s%%", + perfdatas => [ + { + label => 'mem_user', + value => 'user', + template => '%s', + unit => '%', + min => 0, + max => 100, + } + ] + } + } ]; } @@ -110,48 +144,93 @@ sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); bless $self, $class; - + $options{options}->add_options(arguments => {}); - + return $self; } sub manage_selection { my ($self, %options) = @_; - my $oid_snsMem = '.1.3.6.1.4.1.11256.1.10.3.0'; - my $snmp_result = $options{snmp}->get_leef( - oids => [ $oid_snsMem ], - nothing_quit => 1 - ); - - # host,frag,icmp,conn,dtrack,dyn - # host,frag,icmp,conn,ether_state,dtrack,dyn - - my @values = split(/,/, $snmp_result->{$oid_snsMem}); - my $fields = scalar(@values); - if ($fields == 7) { - $self->{global} = { - total => $values[0] + $values[1] + $values[2] + $values[3] + $values[4] + $values[5] + $values[6], - host => $values[0], - frag => $values[1], - icmp => $values[2], - conn => $values[3], - ether_state => $values[4], - dtrack => $values[5], - dyn => $values[6] - }; - } elsif ($fields == 6) { - $self->{global} = { - total => $values[0] + $values[1] + $values[2] + $values[3] + $values[4] + $values[5], - host => $values[0], - frag => $values[1], - icmp => $values[2], - conn => $values[3], - dtrack => $values[4], - dyn => $values[5] - }; + my $oid_os_version = '.1.3.6.1.4.1.11256.1.0.2.0'; + + # Récupération de la version pour déterminer quel OID utiliser + my $snmp_result = $options{snmp}->get_leef(oids => [ $oid_os_version ], nothing_quit => 1); + my $version_raw = $snmp_result->{$oid_os_version}; + my $version_clean = $version_raw; + $version_clean =~ s/([0-9]+(?:\.[0-9]+)*).*/$1/; + + my %mem_values; + my $is_new_version = centreon::plugins::misc::minimal_version($version_clean, '4.8.9'); + + if ($is_new_version) { + # version >= 4.8.9 + my $oids = [ + '.1.3.6.1.4.1.11256.1.10.10.1.2.1', # snsMemHost + '.1.3.6.1.4.1.11256.1.10.10.1.3.1', # snsMemFrag + '.1.3.6.1.4.1.11256.1.10.10.1.4.1', # snsMemIcmp + '.1.3.6.1.4.1.11256.1.10.10.1.5.1', # snsMemConn + '.1.3.6.1.4.1.11256.1.10.10.1.6.1', # snsMemEther + '.1.3.6.1.4.1.11256.1.10.10.1.7.1', # snsMemDataTrack + '.1.3.6.1.4.1.11256.1.10.10.1.8.1', # snsMemSystem + '.1.3.6.1.4.1.11256.1.10.10.1.9.1', # snsMemUser + '.1.3.6.1.4.1.11256.1.10.10.1.10.1' # snsMemMbuf + ]; + + $snmp_result = $options{snmp}->get_leef(oids => $oids, nothing_quit => 1); + + $mem_values{'host'} = $snmp_result->{'.1.3.6.1.4.1.11256.1.10.10.1.2.1'}; + $mem_values{'frag'} = $snmp_result->{'.1.3.6.1.4.1.11256.1.10.10.1.3.1'}; + $mem_values{'icmp'} = $snmp_result->{'.1.3.6.1.4.1.11256.1.10.10.1.4.1'}; + $mem_values{'conn'} = $snmp_result->{'.1.3.6.1.4.1.11256.1.10.10.1.5.1'}; + $mem_values{'etherstate'} = $snmp_result->{'.1.3.6.1.4.1.11256.1.10.10.1.6.1'}; + $mem_values{'dtrack'} = $snmp_result->{'.1.3.6.1.4.1.11256.1.10.10.1.7.1'}; + $mem_values{'dyn'} = $snmp_result->{'.1.3.6.1.4.1.11256.1.10.10.1.8.1'}; + $mem_values{'user'} = $snmp_result->{'.1.3.6.1.4.1.11256.1.10.10.1.9.1'}; + $mem_values{'socket'} = $snmp_result->{'.1.3.6.1.4.1.11256.1.10.10.1.10.1'}; + + } else { + # oid for version < 4.8.9 + my $oid_snsMem = '.1.3.6.1.4.1.11256.1.10.3.0'; + $snmp_result = $options{snmp}->get_leef(oids => [ $oid_snsMem ], nothing_quit => 1); + + my @values = split(/,/, $snmp_result->{$oid_snsMem}); + my $fields = scalar(@values); + if ($fields >= 7) { + $mem_values{'host'} = $values[0]; + $mem_values{'frag'} = $values[1]; + $mem_values{'icmp'} = $values[2]; + $mem_values{'conn'} = $values[3]; + $mem_values{'etherstate'} = $values[4]; + $mem_values{'dtrack'} = $values[5]; + $mem_values{'dyn'} = $values[6]; + + if ($fields == 8) { + $mem_values{'socket'} = $values[7]; + } + } + } + + # Cleaning and Converting Values + my $total = 0; + foreach my $key (keys %mem_values) { + if (defined $mem_values{$key}) { + $mem_values{$key} =~ s/%//g; + $mem_values{$key} =~ s/^\s+|\s+$//g; + # If the value is not a number, it is removed + if ($mem_values{$key} !~ /^\d+\.?\d*$/) { + delete $mem_values{$key}; + next; + } + $total += $mem_values{$key}; + } else { + delete $mem_values{$key}; + } } + $mem_values{total} = $total; + + $self->{global} = \%mem_values; } 1; @@ -160,15 +239,88 @@ __END__ =head1 MODE -Check memory detailed. +Check memory utilization on Stormshield firewalls. =over 8 -=item B<--warning-*> B<--critical-*> +=item B<--warning-total> + +Threshold. + +=item B<--warning-host> + +Threshold. + +=item B<--warning-frag> + +Threshold. + +=item B<--warning-conn> + +Threshold. + +=item B<--warning-icmp> + +Threshold. + +=item B<--warning-dtrack> + +Threshold. + +=item B<--warning-dyn> + +Threshold. + +=item B<--warning-etherstate> + +Threshold. + +=item B<--warning-socket> + +Threshold. +=item B<--warning-user> + +Threshold. only for version >= 4.8.9 + +=item B<--critical-total> + +Threshold. + +=item B<--critical-host> + +Threshold. + +=item B<--critical-frag> + +Threshold. + +=item B<--critical-conn> + +Threshold. + +=item B<--critical-icmp> + +Threshold. + +=item B<--critical-dtrack> + +Threshold. + +=item B<--critical-dyn> + +Threshold. + +=item B<--critical-etherstate> + +Threshold. + +=item B<--critical-socket> + +Threshold. + +=item B<--critical-user> -Thresholds. -Can be: 'total', 'host', 'frag', 'conn', 'icmp', -'dtrack', 'dyn', 'etherstate'. +Threshold. only for version >= 4.8.9 =back diff --git a/src/network/stormshield/snmp/mode/router_disco.pm b/src/network/stormshield/snmp/mode/router_disco.pm new file mode 100644 index 0000000000..aee939a05d --- /dev/null +++ b/src/network/stormshield/snmp/mode/router_disco.pm @@ -0,0 +1,792 @@ +# +# Copyright 2026-Present Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::stormshield::snmp::mode::router_disco; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); +use centreon::plugins::constants qw/:counters :values/; +use centreon::plugins::misc; + + +sub build_gateways_detail { + my ($self, %options) = @_; + + my @lines = "----------------------------List of the Gateways----------------------------"; + + foreach my $gateway (@{ $options{gateways} }) { + my $packet_loss_str = defined($gateway->{packet_loss_prct}) + ? sprintf('%s %%', $gateway->{packet_loss_prct}) + : 'not monitored'; + my $active_str = $gateway->{active} == 1 ? 'yes' : 'no'; + + if ($gateway->{latency} == 0) { + push @lines, sprintf( + "Gateway '%s' (%s - %s) state: %s, active: %s, unreachable (latency: 0 ms), packet loss: %s.", + $gateway->{display}, $gateway->{gateway_type}, $gateway->{address}, + $gateway->{state}, $active_str, $packet_loss_str + ); + } else { + push @lines, sprintf( + "Gateway '%s' (%s - %s) state: %s, active: %s, latency: %s ms, jitter: %s ms, packet loss: %s.", + $gateway->{display}, $gateway->{gateway_type}, $gateway->{address}, + $gateway->{state}, $active_str, $gateway->{latency}, $gateway->{jitter}, $packet_loss_str + ); + } + } + + return join("\n", @lines); +} + +sub custom_router_status_output { + my ($self, %options) = @_; + + my $principal_total = $self->{result_values}->{principal_total}; + my $principal_down = $self->{result_values}->{principal_down}; + my $backup_total = $self->{result_values}->{backup_total}; + my $backup_down = $self->{result_values}->{backup_down}; + + if ($principal_down == 0 && $backup_down == 0) { + return sprintf( + 'All gateways are working (%d/%d principal, %d/%d backup).', + $principal_total, $principal_total, $backup_total, $backup_total + ); + } + + my $principal_seg = ($principal_total > 0) + ? ($principal_down > 0 + ? sprintf('%d/%d principal down', $principal_down, $principal_total) + : sprintf('%d/%d principal up', $principal_total, $principal_total)) + : ''; + my $backup_seg = ($backup_total > 0) + ? ($backup_down > 0 + ? sprintf('%d/%d backup down', $backup_down, $backup_total) + : sprintf('%d/%d backup up', $backup_total, $backup_total)) + : ''; + + if ($principal_down > 0 && $backup_down > 0) { + return sprintf(join(', ', grep { $_ ne '' } ($principal_seg, $backup_seg)) . '.'); + } + + if ($principal_seg ne '' && $backup_seg ne '') { + return sprintf('%s (%s).', $principal_seg, $backup_seg); + } + return $principal_seg ne '' ? $principal_seg . '.' : $backup_seg . '.'; +} + +sub custom_gateways_calc { + my ($self, %options) = @_; + + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{gateways} = $options{new_datas}->{$self->{instance} . '_gateways'}; + + return 0; +} + +sub custom_packetloss_threshold { + my ($self, %options) = @_; + + my $severity_rank = { ok => 0, warning => 1, unknown => 2, critical => 3 }; + my $worst_status = 'ok'; + + foreach my $gateway (@{ $self->{result_values}->{gateways} }) { + next if (!defined($gateway->{packet_loss_prct})); + + my $gw_status = $self->{perfdata}->threshold_check( + value => $gateway->{packet_loss_prct}, + threshold => [ + { label => 'critical-packet-loss', exit_litteral => 'critical' }, + { label => 'warning-packet-loss', exit_litteral => 'warning' } + ] + ); + + if ($severity_rank->{$gw_status} > $severity_rank->{$worst_status}) { + $worst_status = $gw_status; + } + } + + return $worst_status; +} + +sub custom_packetloss_output { + my ($self, %options) = @_; + + my @bad; + foreach my $gateway (@{ $self->{result_values}->{gateways} }) { + next if (!defined($gateway->{packet_loss_prct})); + + my $gw_status = $self->{perfdata}->threshold_check( + value => $gateway->{packet_loss_prct}, + threshold => [ + { label => 'critical-packet-loss', exit_litteral => 'critical' }, + { label => 'warning-packet-loss', exit_litteral => 'warning' } + ] + ); + next if ($gw_status eq 'ok'); + + push @bad, sprintf( + "packet loss: gateway '%s' %s%% (%s)", + $gateway->{display}, $gateway->{packet_loss_prct}, $gw_status + ); + } + + return join(', ', @bad) . '.'; +} + +sub custom_packetloss_perfdata { + my ($self, %options) = @_; + + foreach my $gateway (@{ $self->{result_values}->{gateways} }) { + next if (!defined($gateway->{packet_loss_prct})); + + $self->{output}->perfdata_add( + nlabel => 'router.gateway.packetloss.percentage', + instances => [$self->{result_values}->{display}, $gateway->{display}], + value => $gateway->{packet_loss_prct}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-packet-loss'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-packet-loss'), + unit => '%', + min => 0, + max => 100 + ); + } +} + +sub custom_latency_threshold { + my ($self, %options) = @_; + + my $severity_rank = { ok => 0, warning => 1, unknown => 2, critical => 3 }; + my $worst_status = 'ok'; + + foreach my $gateway (@{ $self->{result_values}->{gateways} }) { + # latency 0 means unreachable: already covered by router-status, not a latency problem + next if ($gateway->{latency} == 0); + + my $gw_status = $self->{perfdata}->threshold_check( + value => $gateway->{latency}, + threshold => [ + { label => 'critical-latency', exit_litteral => 'critical' }, + { label => 'warning-latency', exit_litteral => 'warning' } + ] + ); + + if ($severity_rank->{$gw_status} > $severity_rank->{$worst_status}) { + $worst_status = $gw_status; + } + } + + return $worst_status; +} + +sub custom_latency_output { + my ($self, %options) = @_; + + my @bad; + foreach my $gateway (@{ $self->{result_values}->{gateways} }) { + next if ($gateway->{latency} == 0); + + my $gw_status = $self->{perfdata}->threshold_check( + value => $gateway->{latency}, + threshold => [ + { label => 'critical-latency', exit_litteral => 'critical' }, + { label => 'warning-latency', exit_litteral => 'warning' } + ] + ); + next if ($gw_status eq 'ok'); + + push @bad, sprintf( + "latency: gateway '%s' %s ms (%s)", + $gateway->{display}, $gateway->{latency}, $gw_status + ); + } + + return join(', ', @bad) . '.'; +} + +sub custom_latency_perfdata { + my ($self, %options) = @_; + + foreach my $gateway (@{ $self->{result_values}->{gateways} }) { + next if ($gateway->{latency} == 0); + + $self->{output}->perfdata_add( + nlabel => 'router.gateway.latency.milliseconds', + instances => [$self->{result_values}->{display}, $gateway->{display}], + value => $gateway->{latency}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-latency'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-latency'), + unit => 'ms', + min => 0 + ); + } +} + + +sub custom_jitter_threshold { + my ($self, %options) = @_; + + my $severity_rank = { ok => 0, warning => 1, unknown => 2, critical => 3 }; + my $worst_status = 'ok'; + + foreach my $gateway (@{ $self->{result_values}->{gateways} }) { + # if latency 0 jitter is not valid + next if ($gateway->{latency} == 0); + + my $gw_status = $self->{perfdata}->threshold_check( + value => $gateway->{jitter}, + threshold => [ + { label => 'critical-jitter', exit_litteral => 'critical' }, + { label => 'warning-jitter', exit_litteral => 'warning' } + ] + ); + + if ($severity_rank->{$gw_status} > $severity_rank->{$worst_status}) { + $worst_status = $gw_status; + } + } + + return $worst_status; +} + +sub custom_jitter_output { + my ($self, %options) = @_; + + my @bad; + foreach my $gateway (@{ $self->{result_values}->{gateways} }) { + next if ($gateway->{latency} == 0); + + my $gw_status = $self->{perfdata}->threshold_check( + value => $gateway->{jitter}, + threshold => [ + { label => 'critical-jitter', exit_litteral => 'critical' }, + { label => 'warning-jitter', exit_litteral => 'warning' } + ] + ); + next if ($gw_status eq 'ok'); + + push @bad, sprintf( + "jitter: gateway '%s' %s ms (%s)", + $gateway->{display}, $gateway->{jitter}, $gw_status + ); + } + + return join(', ', @bad) . '.'; +} + +sub custom_jitter_perfdata { + my ($self, %options) = @_; + + foreach my $gateway (@{ $self->{result_values}->{gateways} }) { + next if ($gateway->{latency} == 0); + + $self->{output}->perfdata_add( + nlabel => 'router.gateway.jitter.milliseconds', + instances => [$self->{result_values}->{display}, $gateway->{display}], + value => $gateway->{jitter}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-jitter'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-jitter'), + unit => 'ms', + min => 0 + ); + } +} + + +sub custom_principal_count_calc { + my ($self, %options) = @_; + + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{down} = $options{new_datas}->{$self->{instance} . '_principal_down'}; + $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_principal_total'}; + + return 0; +} + +sub custom_principal_count_threshold { + my ($self, %options) = @_; + + return $self->{perfdata}->threshold_check( + value => $self->{result_values}->{down}, + threshold => [ + { label => 'critical-principal-count', exit_litteral => 'critical' }, + { label => 'warning-principal-count', exit_litteral => 'warning' } + ] + ); +} + +# silent: the down count is already shown in the router-status line, this counter +# only exists to drive warning/critical off a user-defined numeric threshold +sub custom_principal_count_output { + my ($self, %options) = @_; + + return ''; +} + +sub custom_principal_count_perfdata { + my ($self, %options) = @_; + + $self->{output}->perfdata_add( + nlabel => 'router.gateway.principal.down.count', + instances => [$self->{result_values}->{display}], + value => $self->{result_values}->{down}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-principal-count'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-principal-count'), + min => 0, + max => $self->{result_values}->{total} + ); +} + +sub custom_backup_count_calc { + my ($self, %options) = @_; + + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{down} = $options{new_datas}->{$self->{instance} . '_backup_down'}; + $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_backup_total'}; + + return 0; +} + +sub custom_backup_count_threshold { + my ($self, %options) = @_; + + return $self->{perfdata}->threshold_check( + value => $self->{result_values}->{down}, + threshold => [ + { label => 'critical-backup-count', exit_litteral => 'critical' }, + { label => 'warning-backup-count', exit_litteral => 'warning' } + ] + ); +} + +sub custom_backup_count_output { + my ($self, %options) = @_; + + return ''; +} + +sub custom_backup_count_perfdata { + my ($self, %options) = @_; + + $self->{output}->perfdata_add( + nlabel => 'router.gateway.backup.down.count', + instances => [$self->{result_values}->{display}], + value => $self->{result_values}->{down}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-backup-count'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-backup-count'), + min => 0, + max => $self->{result_values}->{total} + ); +} + + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { + name => 'router', + type => COUNTER_TYPE_INSTANCE, + message_multiple => 'All gateways are ok', + display_long => 0, + message_separator => ' ', + skipped_code => { -10 => 1 } + } + ]; + + $self->{maps_counters}->{router} = [ + { + label => 'router-status', + type => 2, + warning_default => '%{one_principal_down} == 1', + critical_default => '%{all_down} == 1', + set => { + key_values => [ + { name => 'one_principal_down' }, { name => 'all_down' }, { name => 'display' }, + { name => 'principal_down' }, { name => 'principal_total' }, + { name => 'backup_down' }, { name => 'backup_total' } + ], + closure_custom_output => $self->can('custom_router_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => \&catalog_status_threshold_ng + } + }, + { + label => 'packet-loss', + nlabel => 'router.gateway.packetloss.percentage', + type => COUNTER_KIND_METRIC, + threshold => 0, + set => { + key_values => [ { name => 'display' }, { name => 'gateways' } ], + closure_custom_calc => $self->can('custom_gateways_calc'), + closure_custom_output => $self->can('custom_packetloss_output'), + closure_custom_perfdata => $self->can('custom_packetloss_perfdata'), + closure_custom_threshold_check => $self->can('custom_packetloss_threshold') + } + }, + { + label => 'latency', + nlabel => 'router.gateway.latency.milliseconds', + type => COUNTER_KIND_METRIC, + threshold => 0, + set => { + key_values => [ { name => 'display' }, { name => 'gateways' } ], + closure_custom_calc => $self->can('custom_gateways_calc'), + closure_custom_output => $self->can('custom_latency_output'), + closure_custom_perfdata => $self->can('custom_latency_perfdata'), + closure_custom_threshold_check => $self->can('custom_latency_threshold') + } + }, + { + label => 'jitter', + nlabel => 'router.gateway.jitter.milliseconds', + type => COUNTER_KIND_METRIC, + threshold => 0, + set => { + key_values => [ { name => 'display' }, { name => 'gateways' } ], + closure_custom_calc => $self->can('custom_gateways_calc'), + closure_custom_output => $self->can('custom_jitter_output'), + closure_custom_perfdata => $self->can('custom_jitter_perfdata'), + closure_custom_threshold_check => $self->can('custom_jitter_threshold') + } + }, + { + label => 'principal-down-count', + nlabel => 'router.gateway.principal.down.count', + type => COUNTER_KIND_METRIC, + threshold => 0, + set => { + key_values => [ { name => 'display' }, { name => 'principal_down' }, { name => 'principal_total' } ], + closure_custom_calc => $self->can('custom_principal_count_calc'), + closure_custom_output => $self->can('custom_principal_count_output'), + closure_custom_perfdata => $self->can('custom_principal_count_perfdata'), + closure_custom_threshold_check => $self->can('custom_principal_count_threshold') + } + }, + { + label => 'backup-down-count', + nlabel => 'router.gateway.backup.down.count', + type => COUNTER_KIND_METRIC, + threshold => 0, + set => { + key_values => [ { name => 'display' }, { name => 'backup_down' }, { name => 'backup_total' } ], + closure_custom_calc => $self->can('custom_backup_count_calc'), + closure_custom_output => $self->can('custom_backup_count_output'), + closure_custom_perfdata => $self->can('custom_backup_count_perfdata'), + closure_custom_threshold_check => $self->can('custom_backup_count_threshold') + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'warning-packet-loss:s' => { name => 'warning_packet_loss' }, + 'critical-packet-loss:s' => { name => 'critical_packet_loss' }, + 'warning-latency:s' => { name => 'warning_latency' }, + 'critical-latency:s' => { name => 'critical_latency' }, + 'warning-jitter:s' => { name => 'warning_jitter' }, + 'critical-jitter:s' => { name => 'critical_jitter' }, + 'warning-principal-count:s' => { name => 'warning_principal_count' }, + 'critical-principal-count:s' => { name => 'critical_principal_count' }, + 'warning-backup-count:s' => { name => 'warning_backup_count' }, + 'critical-backup-count:s' => { name => 'critical_backup_count' }, + 'filter-name:s' => { name => 'filter_name' } + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + my @thresholds = ( + ['warning-packet-loss', 'warning_packet_loss'], + ['critical-packet-loss', 'critical_packet_loss'], + ['warning-latency', 'warning_latency'], + ['critical-latency', 'critical_latency'], + ['warning-jitter', 'warning_jitter'], + ['critical-jitter', 'critical_jitter'], + ['warning-principal-count', 'warning_principal_count'], + ['critical-principal-count', 'critical_principal_count'], + ['warning-backup-count', 'warning_backup_count'], + ['critical-backup-count', 'critical_backup_count'] + ); + + foreach my $threshold (@thresholds) { + my ($label, $option_name) = @$threshold; + + if (($self->{perfdata}->threshold_validate(label => $label, value => $self->{option_results}->{$option_name})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold '" . $label . "' value '" . $self->{option_results}->{$option_name} . "'."); + $self->{output}->option_exit(); + } + } +} + +my $mapping = { + snsRouteRouterName => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.4' }, + snsRouteGatewayName => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.5' }, + snsRouteGatewayAddr => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.6' }, + snsRouteGatewayType => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.7' }, + snsRouteState => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.9' }, + snsRouteActive => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.11' }, + snsRouteLatency => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.18' }, + snsRouteJitter => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.19' }, + snsRoutePacketLossPrctOld => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.20' }, + snsRoutePacketLossPrctRaw => { oid => '.1.3.6.1.4.1.11256.1.14.1.1.23' } +}; + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_snsVersion = '.1.3.6.1.4.1.11256.1.18.2.0'; + + my $snmp_result_version = $options{snmp}->get_leef( + oids => [ $oid_snsVersion ], + nothing_quit => 0, + ); + + my $use_old_packet_loss_oid = 0; + my $version_clean = ''; + + if (defined $snmp_result_version && defined $snmp_result_version->{$oid_snsVersion}) { + $version_clean = $snmp_result_version->{$oid_snsVersion}; + $version_clean =~ s/([0-9]+(?:\.[0-9]+)*).*/$1/; + + if (!centreon::plugins::misc::minimal_version($version_clean, '5.1.0')) { + $use_old_packet_loss_oid = 1; + } + } else { + $use_old_packet_loss_oid = 1; + } + + my %packet_loss_oid_map = ( + use_old => $mapping->{snsRoutePacketLossPrctOld}->{oid}, + use_new => $mapping->{snsRoutePacketLossPrctRaw}->{oid} + ); + + my $packet_loss_oid = $use_old_packet_loss_oid ? $packet_loss_oid_map{use_old} : $packet_loss_oid_map{use_new}; + + my $snmp_result = $options{snmp}->get_multiple_table( + oids => [ + { oid => $mapping->{snsRouteRouterName}->{oid} }, + { oid => $mapping->{snsRouteGatewayName}->{oid} }, + { oid => $mapping->{snsRouteGatewayAddr}->{oid} }, + { oid => $mapping->{snsRouteGatewayType}->{oid} }, + { oid => $mapping->{snsRouteState}->{oid} }, + { oid => $mapping->{snsRouteActive}->{oid} }, + { oid => $mapping->{snsRouteLatency}->{oid} }, + { oid => $mapping->{snsRouteJitter}->{oid} }, + { oid => $packet_loss_oid } + ], + nothing_quit => 1 + ); + + $self->{router} = {}; + foreach my $oid (keys %{$snmp_result->{ $mapping->{snsRouteRouterName}->{oid} }}) { + next if ($oid !~ /^$mapping->{snsRouteRouterName}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); + + next if ( + defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' + && lc($result->{snsRouteRouterName}) ne lc($self->{option_results}->{filter_name}) + ); + + my $router_name = $result->{snsRouteRouterName}; + if (!defined($self->{router}->{$router_name})) { + $self->{router}->{$router_name} = { + display => $router_name, + gateways => [] + }; + } + + my $is_principal = ($result->{snsRouteGatewayType} =~ /^principal$/i) ? 1 : 0; + my $is_down; + if ($is_principal) { + # for a principal gateway, active=no while state=up is itself a problem + # it's ready/up but not actually carrying traffic -> counted as down + $is_down = ( + $result->{snsRouteState} =~ /^(down|undef)$/i + || $result->{snsRouteActive} == 0 + || $result->{snsRouteLatency} == 0 + ) ? 1 : 0; + } else { + # for a backup gateway, active=no is the normal/expected state when it's + # not currently taking over -> it does not make the gateway "down" + $is_down = ( + $result->{snsRouteState} =~ /^(down|undef)$/i + || $result->{snsRouteLatency} == 0 + ) ? 1 : 0; + } + + my $packet_loss_value; + my $raw = $result->{ $use_old_packet_loss_oid ? 'snsRoutePacketLossPrctOld' : 'snsRoutePacketLossPrctRaw' }; + + if (defined $raw) { + if ($use_old_packet_loss_oid) { + if ($raw =~ /^-?[0-9]+(\.[0-9]+)?$/) { + $packet_loss_value = $raw; + } else { + $packet_loss_value = undef; + } + } else { + $packet_loss_value = ($raw < 0 ? undef : $raw / 10); + } + } else { + $packet_loss_value = undef; + } + + push @{ $self->{router}->{$router_name}->{gateways} }, { + display => $result->{snsRouteGatewayName}, + address => $result->{snsRouteGatewayAddr}, + gateway_type => $result->{snsRouteGatewayType}, + state => $result->{snsRouteState}, + active => $result->{snsRouteActive}, + latency => $result->{snsRouteLatency}, + jitter => $result->{snsRouteJitter}, + packet_loss_prct => $packet_loss_value, + is_down => $is_down + }; + } + + if (scalar(keys %{$self->{router}}) <= 0) { + $self->{output}->add_option_msg(short_msg => 'No routes found matching filters.'); + $self->{output}->option_exit(); + } + + foreach my $router_name (keys %{$self->{router}}) { + my @gateways = @{ $self->{router}->{$router_name}->{gateways} }; + my @principal_gateways = grep { $_->{gateway_type} =~ /^principal$/i } @gateways; + my @backup_gateways = grep { $_->{gateway_type} =~ /^backup$/i } @gateways; + + my $principal_total = scalar(@principal_gateways); + my $principal_down = scalar(grep { $_->{is_down} == 1 } @principal_gateways); + my $backup_total = scalar(@backup_gateways); + my $backup_down = scalar(grep { $_->{is_down} == 1 } @backup_gateways); + + $self->{router}->{$router_name}->{principal_total} = $principal_total; + $self->{router}->{$router_name}->{principal_down} = $principal_down; + $self->{router}->{$router_name}->{backup_total} = $backup_total; + $self->{router}->{$router_name}->{backup_down} = $backup_down; + + $self->{router}->{$router_name}->{one_principal_down} = ($principal_down > 0) ? 1 : 0; + $self->{router}->{$router_name}->{all_down} = ( + scalar(@gateways) > 0 && $principal_down == $principal_total && $backup_down == $backup_total + ) ? 1 : 0; + + $self->{output}->output_add( + long_msg => $self->build_gateways_detail(gateways => $self->{router}->{$router_name}->{gateways}) + ); + } +} + +sub disco_format { + my ($self, %options) = @_; + + $self->{output}->add_disco_format(elements => ['display', 'gateway_count', 'principal_count', 'backup_count', 'gateways_summary']); +} + +sub disco_show { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $router_name (sort keys %{$self->{router}}) { + my $router = $self->{router}->{$router_name}; + my @gateways = @{ $router->{gateways} }; + + $self->{output}->add_disco_entry( + display => $router->{display}, + gateway_count => scalar(@gateways), + principal_count => scalar(grep { $_->{gateway_type} =~ /^principal$/i } @gateways), + backup_count => scalar(grep { $_->{gateway_type} =~ /^backup$/i } @gateways), + gateways_summary => join(', ', map { $_->{display} . '(' . $_->{gateway_type} . ')' } @gateways) + ); + } +} + +1; + +__END__ + +=head1 MODE + +Discovery mode for Stormshield SD-WAN/VPN routes, grouped by router. +This mode produces a single Centreon service per router, with every gateway of that router (latency, jitter, packet loss, reachability state) +folded into that one service's output and perfdata, plus an aggregated router-level status. + +=over 8 + +=item B<--warning-principal-count> + +Warning threshold on the number of Principal gateways currently DOWN for the router. + +=item B<--critical-principal-count> + +Critical threshold on the number of Principal gateways currently DOWN for the router. + +=item B<--warning-backup-count> + +Warning threshold on the number of Backup gateways currently DOWN for the router. + +=item B<--critical-backup-count> + +Critical threshold on the number of Backup gateways currently DOWN for the router. + +=item B<--warning-packet-loss> + +Warning threshold on packet loss (in percent), applied to C / C for each gateway of the router. + +=item B<--critical-packet-loss> + +Critical threshold on packet loss (in percent), applied to C / C for each gateway of the router. + +=item B<--warning-latency> + +Warning threshold on latency (in milliseconds), applied to C for each gateway of the router. +Gateways with a latency of 0 (unreachable) are excluded from this check, since they are already covered by the down logic above. + +=item B<--critical-latency> + +Critical threshold on latency (in milliseconds), applied to C for each gateway of the router. +Gateways with a latency of 0 (unreachable) are excluded from this check, since they are already covered by the down logic above. + +=item B<--warning-jitter> + +Warning threshold on jitter (in milliseconds), applied to C for each gateway of the router. + +=item B<--critical-jitter> + +Critical threshold on jitter (in milliseconds), applied to C for each gateway of the router. + +=item B<--filter-name> + +Filter routers on the exact router name (for discovery). + +=back + +=cut diff --git a/src/network/stormshield/snmp/mode/uptime.pm b/src/network/stormshield/snmp/mode/uptime.pm new file mode 100644 index 0000000000..c24f744491 --- /dev/null +++ b/src/network/stormshield/snmp/mode/uptime.pm @@ -0,0 +1,181 @@ +# +# Copyright 2026-Present Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::stormshield::snmp::mode::uptime; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::constants qw/:counters :values/; +use centreon::plugins::misc qw(is_not_empty); + + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + {name => 'global', type => COUNTER_TYPE_GLOBAL, skipped_code => { NO_VALUE() => 1 }} + ]; + + $self->{maps_counters}->{global} = [ + { label => 'uptime', nlabel => 'system.uptime.seconds', set => { + key_values => [ { name => 'uptime' } ], + closure_custom_output => $self->can('custom_uptime_output'), + perfdatas => [ + { template => '%s', unit => 's', min => 0 } + ] + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + + my $oid_snsSystemName = '.1.3.6.1.4.1.11256.1.18.4.0'; + my $oid_snsSystemNodeName = '.1.3.6.1.4.1.11256.1.18.16.0'; + my $oid_snsBiosVersion = '.1.3.6.1.4.1.11256.1.18.17.0'; + my $oid_snsModel = '.1.3.6.1.4.1.11256.1.18.1.0'; + my $oid_snsVersion = '.1.3.6.1.4.1.11256.1.18.2.0'; + my $oid_snsSerialNumber = '.1.3.6.1.4.1.11256.1.18.3.0'; + my $oid_snsDate = '.1.3.6.1.4.1.11256.1.10.1.0'; + my $oid_snsUptime = '.1.3.6.1.4.1.11256.1.10.2.0'; # version < 5.1.0 + my $oid_snsSysUptime = '.1.3.6.1.4.1.11256.1.10.11.0'; # version >= 5.1.0 + + my $result = $options{snmp}->get_leef( + oids => [ $oid_snsSystemName, $oid_snsSystemNodeName, $oid_snsBiosVersion, $oid_snsModel, $oid_snsVersion, $oid_snsSerialNumber, $oid_snsDate, $oid_snsUptime, $oid_snsSysUptime ], + nothing_quit => 1 + ); + + my $version = $result->{$oid_snsVersion}; + + # Add 'System node Name' if Stormshield firmware version >= 4.8.6 or 4.3.x with x>=40 + # This field was introduced in firmware version 4.8.6 and in 4.3.40 + my $system_node_name = $result->{$oid_snsSystemNodeName}; + if (!centreon::plugins::misc::minimal_version($version, '4.8.6') + && !(centreon::plugins::misc::minimal_version($version, '4.3.40') && !centreon::plugins::misc::minimal_version($version, '4.4.0'))) { + $system_node_name = undef; + } + + # Add 'Bios Version' if Stormshield firmware version >= 4.8.15 or 4.3.x with x>=42 + # This field was introduced in firmware version 4.8.15 and in 4.3.42 + my $bios_version = $result->{$oid_snsBiosVersion}; + if (!centreon::plugins::misc::minimal_version($version, '4.8.15') + && !(centreon::plugins::misc::minimal_version($version, '4.3.42') && !centreon::plugins::misc::minimal_version($version, '4.4.0'))) { + $bios_version = undef; + } + + # $oid_snsUptime is deprecated in version >= 5.1.0 and is replaced by $oid_snsSysUptime which is in TimeTicks instead of String + my $uptime_seconds = 0; + if (!centreon::plugins::misc::minimal_version($version, '5.1.0')) { + my $uptime_raw = $result->{$oid_snsUptime}; + $uptime_seconds = 0; + + if (is_not_empty($uptime_raw)) { + my @parts = split(/:/, $uptime_raw); + + if (scalar(@parts) == 4) { + my ($days, $hours, $minutes, $seconds) = @parts; + $uptime_seconds = ($days * 86400) + ($hours * 3600) + ($minutes * 60) + $seconds; + } else { + $self->{output}->output_add(severity => 'CRITICAL', short_msg => "Unexpected uptime format: $uptime_raw"); + } + } + } else { + my $uptime_raw = $result->{$oid_snsSysUptime}; + $uptime_seconds = $uptime_raw / 100; + } + + my $long_msg = "System Name: " . $result->{$oid_snsSystemName} . "\n"; + $long_msg .= "Model: " . $result->{$oid_snsModel} . "\n"; + $long_msg .= "Serial Number: " . $result->{$oid_snsSerialNumber} . "\n"; + $long_msg .= "Version: " . $version . "\n"; + $long_msg .= "Date: " . $result->{$oid_snsDate} . "\n"; + + if (defined($system_node_name)) { + $long_msg .= "System Node Name: " . $system_node_name . "\n"; + } + + if (defined($bios_version)) { + $long_msg .= "Bios Version: " . $bios_version . "\n"; + } + + $self->{output}->output_add( + long_msg => $long_msg, + ); + + $self->{global} = { + uptime => $uptime_seconds, + }; +} + +sub custom_uptime_output { + my ($self, %options) = @_; + + my $uptime_seconds = $self->{result_values}->{uptime}; + + my $days = $uptime_seconds / 86400; + my $hours = ($uptime_seconds % 86400) / 3600; + my $minutes = ($uptime_seconds % 3600) / 60; + my $seconds = $uptime_seconds % 60; + + my $msg = sprintf( + "Uptime: %d days %02d hours %02d minutes %02d seconds", + $days, $hours, $minutes, $seconds + ); + + return $msg; +} + +1; + +__END__ + +=head1 MODE + +This mode monitors the uptime and retrieves and displays basic properties of the Stormshield device such as system name, +model, version, serial number, and date. + +=over 8 + +=item B<--warning-uptime> + +Threshold (in seconds). + +=item B<--critical-uptime> + +Threshold (in seconds). + +=back + +=cut diff --git a/src/network/stormshield/snmp/plugin.pm b/src/network/stormshield/snmp/plugin.pm index 068b62a77d..7d0f186178 100644 --- a/src/network/stormshield/snmp/plugin.pm +++ b/src/network/stormshield/snmp/plugin.pm @@ -31,13 +31,17 @@ sub new { $self->{version} = '1.0'; $self->{modes} = { + 'auto-update' => 'network::stormshield::snmp::mode::auto_update', 'cpu' => 'snmp_standard::mode::cpu', 'cpu-detailed' => 'snmp_standard::mode::cpudetailed', 'connections' => 'network::stormshield::snmp::mode::connections', + 'interfaces-disco' => 'network::stormshield::snmp::mode::interfaces_disco', 'interfaces' => 'snmp_standard::mode::interfaces', + 'licenses' => 'network::stormshield::snmp::mode::licenses', 'list-interfaces' => 'snmp_standard::mode::listinterfaces', 'load' => 'snmp_standard::mode::loadaverage', 'ha-nodes' => 'network::stormshield::snmp::mode::hanodes', + 'ha-cluster' => 'network::stormshield::snmp::mode::ha_cluster', 'hardware' => 'network::stormshield::snmp::mode::hardware', 'health' => 'network::stormshield::snmp::mode::health', 'memory' => 'os::freebsd::snmp::mode::memory', @@ -45,7 +49,10 @@ sub new { 'qos' => 'network::stormshield::snmp::mode::qos', 'storage' => 'snmp_standard::mode::storage', 'swap' => 'snmp_standard::mode::swap', - 'vpn-status' => 'network::stormshield::snmp::mode::vpnstatus' + 'vpn-status' => 'network::stormshield::snmp::mode::vpnstatus', + 'uptime' => 'network::stormshield::snmp::mode::uptime', + 'router-disco' => 'network::stormshield::snmp::mode::router_disco' + }; return $self; diff --git a/tests/network/stormshield/snmp/auto-update.robot b/tests/network/stormshield/snmp/auto-update.robot new file mode 100644 index 0000000000..0187def2d1 --- /dev/null +++ b/tests/network/stormshield/snmp/auto-update.robot @@ -0,0 +1,49 @@ +*** Settings *** +Documentation network::stormshield::snmp::plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Ctn Generic Suite Setup +Suite Teardown Ctn Generic Suite Teardown +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} +... --plugin=network::stormshield::snmp::plugin +... --mode=auto-update +... --hostname=${HOSTNAME} +... --snmp-port=${SNMPPORT} +... --snmp-version=${SNMPVERSION} +... --snmp-community=network/stormshield/snmp/sn910 + + +*** Test Cases *** +Auto-update ${tc} + [Tags] network stormshield snmp + ${command} Catenate + ... ${CMD} + ... ${extra_options} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... ${EMPTY} + ... CRITICAL: Update: Patterns is broken - Update: CustomPatterns has failed + ... 2 + ... --unknown-status='${PERCENT}\\{state\\} eq "Failed"' --warning-status= --critical-status= + ... UNKNOWN: Update: CustomPatterns has failed + ... 3 + ... --warning-status='${PERCENT}\\{state\\} eq "Failed"' --critical-status= --unknown-status= + ... WARNING: Update: CustomPatterns has failed + ... 4 + ... --critical-status='${PERCENT}\\{state\\} eq "Failed"' --unknown-status= --warning-status= + ... CRITICAL: Update: CustomPatterns has failed + ... 5 + ... --critical-status= --unknown-status= --warning-status= --verbose + ... OK: All Updates and Webservices are up to date Update: Antispam never started Update: Metadata never started Update: CustomWebServices is disabled Update: Patterns is broken Update: CustomPatterns has failed Update: AdvancedAV never started Update: URLFiltering never started Update: CompromisedUrls never started Update: Vaderetro never started Update: RootCertificates never started Update: IPData never started diff --git a/tests/network/stormshield/snmp/connections.robot b/tests/network/stormshield/snmp/connections.robot new file mode 100644 index 0000000000..f51af955a4 --- /dev/null +++ b/tests/network/stormshield/snmp/connections.robot @@ -0,0 +1,61 @@ +*** Settings *** +Documentation network::stormshield::snmp::plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Ctn Generic Suite Setup +Suite Teardown Ctn Generic Suite Teardown +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} +... --plugin=network::stormshield::snmp::plugin +... --mode=connections +... --hostname=${HOSTNAME} +... --snmp-port=${SNMPPORT} +... --snmp-version=${SNMPVERSION} + + +*** Test Cases *** +Connections SN910 ${tc} + [Tags] network stormshield snmp + ${command} Catenate + ... ${CMD} + ... --snmp-community=network/stormshield/snmp/sn910 + ... ${extra_options} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... ${EMPTY} + ... OK: UDP : 318 connections, TCP : 0 connections, Major Alarms : 0, Minor Alarms : 0 | 'connections.udp.count'=318;;;0; 'connections.tcp.count'=0;;;0; 'alarms.major.count'=0;;;0; 'alarms.minor.count'=0;;;0; + ... 2 + ... --warning-tcp=1: + ... WARNING: TCP : 0 connections | 'connections.udp.count'=318;;;0; 'connections.tcp.count'=0;1:;;0; 'alarms.major.count'=0;;;0; 'alarms.minor.count'=0;;;0; + ... 3 + ... --warning-udp=1 + ... WARNING: UDP : 318 connections | 'connections.udp.count'=318;0:1;;0; 'connections.tcp.count'=0;;;0; 'alarms.major.count'=0;;;0; 'alarms.minor.count'=0;;;0; + ... 4 + ... --warning-major=1: + ... WARNING: Major Alarms : 0 | 'connections.udp.count'=318;;;0; 'connections.tcp.count'=0;;;0; 'alarms.major.count'=0;1:;;0; 'alarms.minor.count'=0;;;0; + ... 5 + ... --warning-minor=1: + ... WARNING: Minor Alarms : 0 | 'connections.udp.count'=318;;;0; 'connections.tcp.count'=0;;;0; 'alarms.major.count'=0;;;0; 'alarms.minor.count'=0;1:;;0; + ... 6 + ... --critical-tcp=1: + ... CRITICAL: TCP : 0 connections | 'connections.udp.count'=318;;;0; 'connections.tcp.count'=0;;1:;0; 'alarms.major.count'=0;;;0; 'alarms.minor.count'=0;;;0; + ... 7 + ... --critical-udp=1 + ... CRITICAL: UDP : 318 connections | 'connections.udp.count'=318;;0:1;0; 'connections.tcp.count'=0;;;0; 'alarms.major.count'=0;;;0; 'alarms.minor.count'=0;;;0; + ... 8 + ... --critical-major=1: + ... CRITICAL: Major Alarms : 0 | 'connections.udp.count'=318;;;0; 'connections.tcp.count'=0;;;0; 'alarms.major.count'=0;;1:;0; 'alarms.minor.count'=0;;;0; + ... 9 + ... --critical-minor=1: + ... CRITICAL: Minor Alarms : 0 | 'connections.udp.count'=318;;;0; 'connections.tcp.count'=0;;;0; 'alarms.major.count'=0;;;0; 'alarms.minor.count'=0;;1:;0; diff --git a/tests/network/stormshield/snmp/fixed_date.pm b/tests/network/stormshield/snmp/fixed_date.pm new file mode 100644 index 0000000000..9c36f00927 --- /dev/null +++ b/tests/network/stormshield/snmp/fixed_date.pm @@ -0,0 +1,14 @@ +package fixed_date; + +# Copyright 2026-Present Centreon +# Always use the same fixed date so licence expiration tests keep a stable output + +use DateTime; + +BEGIN { + $now = 1785448800; + *CORE::GLOBAL::time = sub { $now }; + *DateTime::now = sub { DateTime->from_epoch(epoch => $now) }; +} + +1 diff --git a/tests/network/stormshield/snmp/ha-cluster.robot b/tests/network/stormshield/snmp/ha-cluster.robot new file mode 100644 index 0000000000..630a7ff039 --- /dev/null +++ b/tests/network/stormshield/snmp/ha-cluster.robot @@ -0,0 +1,79 @@ +*** Settings *** +Documentation network::stormshield::snmp::plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Ctn Generic Suite Setup +Suite Teardown Ctn Generic Suite Teardown +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} +... --plugin=network::stormshield::snmp::plugin +... --mode=ha-cluster +... --hostname=${HOSTNAME} +... --snmp-port=${SNMPPORT} +... --snmp-version=${SNMPVERSION} + + +*** Test Cases *** +Ha-cluster SN910 ${tc} + [Tags] network stormshield snmp + ${command} Catenate + ... ${CMD} + ... --snmp-community=network/stormshield/snmp/sn910 + ... ${extra_options} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... ${EMPTY} + ... WARNING: Configuration Synced: False | 'ha.dead_nodes.count'=0;0:1;0:2;0;2 'ha.faulty_links.count'=0;0:1;0:2;0;2 'ha.active_firewalls.count'=1;;1:1;0;2 + ... 2 + ... --warning-active-firewall=0:0 --warning-sync-status=0 + ... WARNING: Active Firewalls: 1/2 | 'ha.dead_nodes.count'=0;0:1;0:2;0;2 'ha.faulty_links.count'=0;0:1;0:2;0;2 'ha.active_firewalls.count'=1;0:0;1:1;0;2 + ... 3 + ... --critical-active-firewall=0:0 --warning-sync-status=0 + ... CRITICAL: Active Firewalls: 1/2 | 'ha.dead_nodes.count'=0;0:1;0:2;0;2 'ha.faulty_links.count'=0;0:1;0:2;0;2 'ha.active_firewalls.count'=1;;0:0;0;2 + ... 4 + ... --warning-dead-nodes=1: --warning-sync-status=0 + ... WARNING: Dead Nodes: 0/2 (0%) | 'ha.dead_nodes.count'=0;0:;0:2;0;2 'ha.faulty_links.count'=0;0:1;0:2;0;2 'ha.active_firewalls.count'=1;;1:1;0;2 + ... 5 + ... --critical-dead-nodes=1: --warning-sync-status=0 + ... CRITICAL: Dead Nodes: 0/2 (0%) | 'ha.dead_nodes.count'=0;0:1;0:;0;2 'ha.faulty_links.count'=0;0:1;0:2;0;2 'ha.active_firewalls.count'=1;;1:1;0;2 + ... 6 + ... --warning-faulty-links=1: --warning-sync-status=0 + ... WARNING: Faulty Links: 0/2 (0%) | 'ha.dead_nodes.count'=0;0:1;0:2;0;2 'ha.faulty_links.count'=0;0:;0:2;0;2 'ha.active_firewalls.count'=1;;1:1;0;2 + ... 7 + ... --critical-faulty-links=1: --warning-sync-status=0 + ... CRITICAL: Faulty Links: 0/2 (0%) | 'ha.dead_nodes.count'=0;0:1;0:2;0;2 'ha.faulty_links.count'=0;0:1;0:;0;2 'ha.active_firewalls.count'=1;;1:1;0;2 + ... 8 + ... --warning-sync-status='${PERCENT}\\{sync_status\\} eq "False"' + ... WARNING: Configuration Synced: False | 'ha.dead_nodes.count'=0;0:1;0:2;0;2 'ha.faulty_links.count'=0;0:1;0:2;0;2 'ha.active_firewalls.count'=1;;1:1;0;2 + ... 9 + ... --critical-sync-status='${PERCENT}\\{sync_status\\} eq "False"' + ... CRITICAL: Configuration Synced: False | 'ha.dead_nodes.count'=0;0:1;0:2;0;2 'ha.faulty_links.count'=0;0:1;0:2;0;2 'ha.active_firewalls.count'=1;;1:1;0;2 + +Ha-cluster fake ${tc} + [Tags] network stormshield snmp + ${command} Catenate + ... ${CMD} + ... --snmp-community=network/stormshield/snmp/stormshield-fake + ... ${extra_options} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... ${EMPTY} + ... UNKNOWN: No HA cluster detected diff --git a/tests/network/stormshield/snmp/hardware.robot b/tests/network/stormshield/snmp/hardware.robot index 8c0497be76..3a93b18a1d 100644 --- a/tests/network/stormshield/snmp/hardware.robot +++ b/tests/network/stormshield/snmp/hardware.robot @@ -27,10 +27,64 @@ hardware ${tc} Ctn Run Command And Check Result As Strings ${command} ${expected_result} - Examples: tc extra_options expected_result -- - ... 1 --critical='temperature,.*,50' CRITICAL: temperature 'cpu1' is 70 celsius | 'cpu1#hardware.temperature.celsius'=70C;;0:50;0; 'cpu2#hardware.temperature.celsius'=30C;;0:50;0; 'cpu3#hardware.temperature.celsius'=0C;;0:50;0; 'hardware.temperature.count'=3;;;; - ... 2 --threshold-overload='disk,WARNING,missing' OK: All 3 components are ok [3/3 temperatures]. | 'cpu1#hardware.temperature.celsius'=70C;;;0; 'cpu2#hardware.temperature.celsius'=30C;;;0; 'cpu3#hardware.temperature.celsius'=0C;;;0; 'hardware.temperature.count'=3;;;; - ... 3 --warning='temperature,.*,40' WARNING: temperature 'cpu1' is 70 celsius | 'cpu1#hardware.temperature.celsius'=70C;0:40;;0; 'cpu2#hardware.temperature.celsius'=30C;0:40;;0; 'cpu3#hardware.temperature.celsius'=0C;0:40;;0; 'hardware.temperature.count'=3;;;; - ... 4 --warning='temperature,cpu1,60' WARNING: temperature 'cpu1' is 70 celsius | 'cpu1#hardware.temperature.celsius'=70C;0:60;;0; 'cpu2#hardware.temperature.celsius'=30C;;;0; 'cpu3#hardware.temperature.celsius'=0C;;;0; 'hardware.temperature.count'=3;;;; - ... 5 --critical='temperature,cpu1,75' OK: All 3 components are ok [3/3 temperatures]. | 'cpu1#hardware.temperature.celsius'=70C;;0:75;0; 'cpu2#hardware.temperature.celsius'=30C;;;0; 'cpu3#hardware.temperature.celsius'=0C;;;0; 'hardware.temperature.count'=3;;;; - ... 6 --warning='temperature,cpu1,300' --critical='temperature,cpu1,17' CRITICAL: temperature 'cpu1' is 70 celsius | 'cpu1#hardware.temperature.celsius'=70C;0:300;0:17;0; 'cpu2#hardware.temperature.celsius'=30C;;;0; 'cpu3#hardware.temperature.celsius'=0C;;;0; 'hardware.temperature.count'=3;;;; + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... --critical='temperature,.*,50' + ... CRITICAL: Temperature 'cpu1' is '70' celsius | 'cpu1#hardware.cpu.temperature.celsius'=70C;;;0; 'cpu2#hardware.cpu.temperature.celsius'=30C;;;0; 'cpu3#hardware.cpu.temperature.celsius'=0C;;;0; 'cpu_average_temp#hardware.cpu.average.temperature.celsius'=33C;;;0; 'hardware.temperature.count'=3;;;; + ... 2 + ... --threshold-overload='disk,WARNING,missing' + ... OK: All 3 components are ok [3/3 temperatures]. | 'cpu1#hardware.cpu.temperature.celsius'=70C;;;0; 'cpu2#hardware.cpu.temperature.celsius'=30C;;;0; 'cpu3#hardware.cpu.temperature.celsius'=0C;;;0; 'cpu_average_temp#hardware.cpu.average.temperature.celsius'=33C;;;0; 'hardware.temperature.count'=3;;;; + ... 3 + ... --warning='temperature,.*,40' + ... WARNING: Temperature 'cpu1' is '70' celsius | 'cpu1#hardware.cpu.temperature.celsius'=70C;;;0; 'cpu2#hardware.cpu.temperature.celsius'=30C;;;0; 'cpu3#hardware.cpu.temperature.celsius'=0C;;;0; 'cpu_average_temp#hardware.cpu.average.temperature.celsius'=33C;;;0; 'hardware.temperature.count'=3;;;; + ... 4 + ... --warning='temperature,cpu1,60' + ... WARNING: Temperature 'cpu1' is '70' celsius | 'cpu1#hardware.cpu.temperature.celsius'=70C;;;0; 'cpu2#hardware.cpu.temperature.celsius'=30C;;;0; 'cpu3#hardware.cpu.temperature.celsius'=0C;;;0; 'cpu_average_temp#hardware.cpu.average.temperature.celsius'=33C;;;0; 'hardware.temperature.count'=3;;;; + ... 5 + ... --critical='temperature,cpu1,75' + ... OK: All 3 components are ok [3/3 temperatures]. | 'cpu1#hardware.cpu.temperature.celsius'=70C;;;0; 'cpu2#hardware.cpu.temperature.celsius'=30C;;;0; 'cpu3#hardware.cpu.temperature.celsius'=0C;;;0; 'cpu_average_temp#hardware.cpu.average.temperature.celsius'=33C;;;0; 'hardware.temperature.count'=3;;;; + ... 6 + ... --warning='temperature,cpu1,300' --critical='temperature,cpu1,17' + ... CRITICAL: Temperature 'cpu1' is '70' celsius | 'cpu1#hardware.cpu.temperature.celsius'=70C;;;0; 'cpu2#hardware.cpu.temperature.celsius'=30C;;;0; 'cpu3#hardware.cpu.temperature.celsius'=0C;;;0; 'cpu_average_temp#hardware.cpu.average.temperature.celsius'=33C;;;0; 'hardware.temperature.count'=3;;;; + +hardware SN910 ${tc} + [Tags] network stormshield + ${command} Catenate + ... ${CMD} + ... --mode=hardware + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=network/stormshield/snmp/sn910 + ... --snmp-timeout=1 + ... ${extra_options} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... ${EMPTY} + ... OK: All 2 components are ok [2/2 temperatures]. | 'fw_2_cpu0#hardware.cpu.temperature.celsius'=45C;;;0; 'fw_2_cpu1#hardware.cpu.temperature.celsius'=46C;;;0; 'fw_2_cpu_average_temp#hardware.cpu.average.temperature.celsius'=45C;;;0; 'hardware.temperature.count'=2;;;; + ... 2 + ... --warning='temperature,.*,10' + ... WARNING: Temperature 'fw_2_cpu0' is '45' celsius - Temperature 'fw_2_cpu1' is '46' celsius | 'fw_2_cpu0#hardware.cpu.temperature.celsius'=45C;;;0; 'fw_2_cpu1#hardware.cpu.temperature.celsius'=46C;;;0; 'fw_2_cpu_average_temp#hardware.cpu.average.temperature.celsius'=45C;;;0; 'hardware.temperature.count'=2;;;; + ... 3 + ... --critical='temperature,.*,10' + ... CRITICAL: Temperature 'fw_2_cpu0' is '45' celsius - Temperature 'fw_2_cpu1' is '46' celsius | 'fw_2_cpu0#hardware.cpu.temperature.celsius'=45C;;;0; 'fw_2_cpu1#hardware.cpu.temperature.celsius'=46C;;;0; 'fw_2_cpu_average_temp#hardware.cpu.average.temperature.celsius'=45C;;;0; 'hardware.temperature.count'=2;;;; + ... 4 + ... --warning='temperature,cpu1,10' + ... WARNING: Temperature 'fw_2_cpu1' is '46' celsius | 'fw_2_cpu0#hardware.cpu.temperature.celsius'=45C;;;0; 'fw_2_cpu1#hardware.cpu.temperature.celsius'=46C;;;0; 'fw_2_cpu_average_temp#hardware.cpu.average.temperature.celsius'=45C;;;0; 'hardware.temperature.count'=2;;;; + ... 5 + ... --critical='temperature,cpu1,10' + ... CRITICAL: Temperature 'fw_2_cpu1' is '46' celsius | 'fw_2_cpu0#hardware.cpu.temperature.celsius'=45C;;;0; 'fw_2_cpu1#hardware.cpu.temperature.celsius'=46C;;;0; 'fw_2_cpu_average_temp#hardware.cpu.average.temperature.celsius'=45C;;;0; 'hardware.temperature.count'=2;;;; + ... 6 + ... --warning='temperature,cpu1,300' --critical='temperature,cpu1,17' + ... CRITICAL: Temperature 'fw_2_cpu1' is '46' celsius | 'fw_2_cpu0#hardware.cpu.temperature.celsius'=45C;;;0; 'fw_2_cpu1#hardware.cpu.temperature.celsius'=46C;;;0; 'fw_2_cpu_average_temp#hardware.cpu.average.temperature.celsius'=45C;;;0; 'hardware.temperature.count'=2;;;; diff --git a/tests/network/stormshield/snmp/health.robot b/tests/network/stormshield/snmp/health.robot new file mode 100644 index 0000000000..3cad4eb21a --- /dev/null +++ b/tests/network/stormshield/snmp/health.robot @@ -0,0 +1,49 @@ +*** Settings *** +Documentation Check Stormshield health equipment + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Ctn Generic Suite Setup +Suite Teardown Ctn Generic Suite Teardown +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=network::stormshield::snmp::plugin + + +*** Test Cases *** +hardware ${tc} + [Tags] network stormshield + ${command} Catenate + ... ${CMD} + ... --mode=health + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=network/stormshield/snmp/sn910 + ... --snmp-timeout=1 + ... ${extra_options} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... --filter-serial='notfoundSerial' + ... UNKNOWN: No firewall found with accepted serial. + ... 2 + ... --critical-service-status="" --warning-service-status="" + ... OK: All firewalls are ok + ... 3 + ... --verbose + ... CRITICAL: 2 problem(s) detected \ncritical: firewall 'Firewall_1_serial_number' service 'cpu' health: Major\nwarning: firewall 'Firewall_2_serial_number' service 'NTP' health: Minor + ... 4 + ... --warning-service-status="" + ... CRITICAL: 1 problem(s) detected + ... 5 + ... --critical-service-status="" + ... WARNING: 1 problem(s) detected diff --git a/tests/network/stormshield/snmp/help.robot b/tests/network/stormshield/snmp/help.robot new file mode 100644 index 0000000000..8ae3de575e --- /dev/null +++ b/tests/network/stormshield/snmp/help.robot @@ -0,0 +1,86 @@ +*** Settings *** +Documentation network::stormshield::snmp::plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Ctn Generic Suite Setup +Suite Teardown Ctn Generic Suite Teardown +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=network::stormshield::snmp::plugin + + +*** Test Cases *** +Standard ${tc} - ${mode} + [Tags] network stormshield snmp + ${command} Catenate + ... ${CMD} + ... --mode=${mode} + ... --help + + Ctn Run Command And Check Result As Regexp ${command} ${expected_result} flags=IGNORECASE + + Examples: + ... tc + ... mode + ... expected_result + ... -- + ... 1 + ... connections + ... Mode:\n.*connections + ... 2 + ... cpu + ... Mode:\n.*cpu + ... 3 + ... cpu-detailed + ... Mode:\n.*Check system CPUs + ... 4 + ... ha-nodes + ... Mode:\n.*Check Stormshield nodes status + ... 5 + ... hardware + ... Mode:\n.*hardware + ... 6 + ... health + ... Mode:\n.*health + ... 7 + ... interfaces + ... Mode:\n.*interfaces + ... 8 + ... list-interfaces + ... Mode:\n.*--interface + ... 9 + ... load + ... Mode:\n.*load + ... 10 + ... memory + ... Mode:\n.*memory + ... 11 + ... memory-detailed + ... Mode:\n.*memory + ... 12 + ... qos + ... Mode:\n.*qos + ... 13 + ... storage + ... Mode:\n.*--warning-usage + ... 14 + ... swap + ... Mode:\n.*swap + ... 15 + ... uptime + ... Mode:\n.*uptime + ... 16 + ... vpn-status + ... Mode:\n.*Check vpn + ... 17 + ... licenses + ... Mode:\n.*licenses + ... 18 + ... auto-update + ... Mode:\n.*auto.update + ... 19 + ... ha-cluster + ... Mode:\n.*ha.cluster diff --git a/tests/network/stormshield/snmp/licenses.robot b/tests/network/stormshield/snmp/licenses.robot new file mode 100644 index 0000000000..d6889af05f --- /dev/null +++ b/tests/network/stormshield/snmp/licenses.robot @@ -0,0 +1,50 @@ +*** Settings *** +Documentation network::stormshield::snmp::plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Ctn Generic Suite Setup +Suite Teardown Ctn Generic Suite Teardown +Test Timeout 120s + + +*** Variables *** +${INJECT_PERL} -Mfixed_date -I${CURDIR} +${CMD} ${CENTREON_PLUGINS} +... --plugin=network::stormshield::snmp::plugin +... --mode=licenses +... --hostname=${HOSTNAME} +... --snmp-port=${SNMPPORT} +... --snmp-version=${SNMPVERSION} +... --snmp-community=network/stormshield/snmp/sn910 + + +*** Test Cases *** +Licenses ${tc} + [Tags] network stormshield snmp + ${OLD_PERL5OPT}= Get Environment Variable PERL5OPT default=${EMPTY} + Set Environment Variable PERL5OPT ${INJECT_PERL} ${OLD_PERL5OPT} + + ${command}= Catenate + ... ${CMD} + ... ${extra_options} + + Ctn Run Command Without Connector And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... ${EMPTY} + ... OK: All licences of the cluster are up to date | 'fw_1~Industrial#license.expiration.days'=1285d;60:;0:;; 'fw_1~NotAfter#license.expiration.days'=4171d;60:;0:;; 'fw_1~Pattern#license.expiration.days'=1285d;60:;0:;; 'fw_1~SPAMVendor#license.expiration.days'=1285d;60:;0:;; 'fw_1~Sandboxing#license.expiration.days'=1285d;60:;0:;; 'fw_1~URLVendor#license.expiration.days'=1285d;60:;0:;; 'fw_1~Update#license.expiration.days'=1285d;60:;0:;; 'fw_1~VirusVendor#license.expiration.days'=1285d;60:;0:;; 'fw_1~Warranty#license.expiration.days'=1285d;60:;0:;; 'fw_2~Industrial#license.expiration.days'=1285d;60:;0:;; 'fw_2~NotAfter#license.expiration.days'=4171d;60:;0:;; 'fw_2~Pattern#license.expiration.days'=1285d;60:;0:;; 'fw_2~SPAMVendor#license.expiration.days'=1285d;60:;0:;; 'fw_2~Sandboxing#license.expiration.days'=1285d;60:;0:;; 'fw_2~URLVendor#license.expiration.days'=1285d;60:;0:;; 'fw_2~Update#license.expiration.days'=1285d;60:;0:;; 'fw_2~VirusVendor#license.expiration.days'=1285d;60:;0:;; 'fw_2~Warranty#license.expiration.days'=1285d;60:;0:;; + ... 2 + ... --warning-expires-days=1 + ... WARNING: Licence: Industrial (Expires in 1285 days: 2030-02-05) - Licence: NotAfter (Expires in 4171 days: 2037-12-31) - Licence: Pattern (Expires in 1285 days: 2030-02-05) - Licence: SPAMVendor (Expires in 1285 days: 2030-02-05) - Licence: Sandboxing (Expires in 1285 days: 2030-02-05) - Licence: URLVendor (Expires in 1285 days: 2030-02-05) - Licence: Update (Expires in 1285 days: 2030-02-05) - Licence: VirusVendor (Expires in 1285 days: 2030-02-05) - Licence: Warranty (Expires in 1285 days: 2030-02-05) - Licence: Industrial (Expires in 1285 days: 2030-02-05) - Licence: NotAfter (Expires in 4171 days: 2037-12-31) - Licence: Pattern (Expires in 1285 days: 2030-02-05) - Licence: SPAMVendor (Expires in 1285 days: 2030-02-05) - Licence: Sandboxing (Expires in 1285 days: 2030-02-05) - Licence: URLVendor (Expires in 1285 days: 2030-02-05) - Licence: Update (Expires in 1285 days: 2030-02-05) - Licence: VirusVendor (Expires in 1285 days: 2030-02-05) - Licence: Warranty (Expires in 1285 days: 2030-02-05) | 'fw_1~Industrial#license.expiration.days'=1285d;0:1;0:;; 'fw_1~NotAfter#license.expiration.days'=4171d;0:1;0:;; 'fw_1~Pattern#license.expiration.days'=1285d;0:1;0:;; 'fw_1~SPAMVendor#license.expiration.days'=1285d;0:1;0:;; 'fw_1~Sandboxing#license.expiration.days'=1285d;0:1;0:;; 'fw_1~URLVendor#license.expiration.days'=1285d;0:1;0:;; 'fw_1~Update#license.expiration.days'=1285d;0:1;0:;; 'fw_1~VirusVendor#license.expiration.days'=1285d;0:1;0:;; 'fw_1~Warranty#license.expiration.days'=1285d;0:1;0:;; 'fw_2~Industrial#license.expiration.days'=1285d;0:1;0:;; 'fw_2~NotAfter#license.expiration.days'=4171d;0:1;0:;; 'fw_2~Pattern#license.expiration.days'=1285d;0:1;0:;; 'fw_2~SPAMVendor#license.expiration.days'=1285d;0:1;0:;; 'fw_2~Sandboxing#license.expiration.days'=1285d;0:1;0:;; 'fw_2~URLVendor#license.expiration.days'=1285d;0:1;0:;; 'fw_2~Update#license.expiration.days'=1285d;0:1;0:;; 'fw_2~VirusVendor#license.expiration.days'=1285d;0:1;0:;; 'fw_2~Warranty#license.expiration.days'=1285d;0:1;0:;; + ... 3 + ... --critical-expires-days=1 + ... CRITICAL: Licence: Industrial (Expires in 1285 days: 2030-02-05) - Licence: NotAfter (Expires in 4171 days: 2037-12-31) - Licence: Pattern (Expires in 1285 days: 2030-02-05) - Licence: SPAMVendor (Expires in 1285 days: 2030-02-05) - Licence: Sandboxing (Expires in 1285 days: 2030-02-05) - Licence: URLVendor (Expires in 1285 days: 2030-02-05) - Licence: Update (Expires in 1285 days: 2030-02-05) - Licence: VirusVendor (Expires in 1285 days: 2030-02-05) - Licence: Warranty (Expires in 1285 days: 2030-02-05) - Licence: Industrial (Expires in 1285 days: 2030-02-05) - Licence: NotAfter (Expires in 4171 days: 2037-12-31) - Licence: Pattern (Expires in 1285 days: 2030-02-05) - Licence: SPAMVendor (Expires in 1285 days: 2030-02-05) - Licence: Sandboxing (Expires in 1285 days: 2030-02-05) - Licence: URLVendor (Expires in 1285 days: 2030-02-05) - Licence: Update (Expires in 1285 days: 2030-02-05) - Licence: VirusVendor (Expires in 1285 days: 2030-02-05) - Licence: Warranty (Expires in 1285 days: 2030-02-05) | 'fw_1~Industrial#license.expiration.days'=1285d;60:;0:1;; 'fw_1~NotAfter#license.expiration.days'=4171d;60:;0:1;; 'fw_1~Pattern#license.expiration.days'=1285d;60:;0:1;; 'fw_1~SPAMVendor#license.expiration.days'=1285d;60:;0:1;; 'fw_1~Sandboxing#license.expiration.days'=1285d;60:;0:1;; 'fw_1~URLVendor#license.expiration.days'=1285d;60:;0:1;; 'fw_1~Update#license.expiration.days'=1285d;60:;0:1;; 'fw_1~VirusVendor#license.expiration.days'=1285d;60:;0:1;; 'fw_1~Warranty#license.expiration.days'=1285d;60:;0:1;; 'fw_2~Industrial#license.expiration.days'=1285d;60:;0:1;; 'fw_2~NotAfter#license.expiration.days'=4171d;60:;0:1;; 'fw_2~Pattern#license.expiration.days'=1285d;60:;0:1;; 'fw_2~SPAMVendor#license.expiration.days'=1285d;60:;0:1;; 'fw_2~Sandboxing#license.expiration.days'=1285d;60:;0:1;; 'fw_2~URLVendor#license.expiration.days'=1285d;60:;0:1;; 'fw_2~Update#license.expiration.days'=1285d;60:;0:1;; 'fw_2~VirusVendor#license.expiration.days'=1285d;60:;0:1;; 'fw_2~Warranty#license.expiration.days'=1285d;60:;0:1;; + ... 4 + ... --timezone=Asia/Tokyo + ... OK: All licences of the cluster are up to date | 'fw_1~Industrial#license.expiration.days'=1284d;60:;0:;; 'fw_1~NotAfter#license.expiration.days'=4170d;60:;0:;; 'fw_1~Pattern#license.expiration.days'=1284d;60:;0:;; 'fw_1~SPAMVendor#license.expiration.days'=1284d;60:;0:;; 'fw_1~Sandboxing#license.expiration.days'=1284d;60:;0:;; 'fw_1~URLVendor#license.expiration.days'=1284d;60:;0:;; 'fw_1~Update#license.expiration.days'=1284d;60:;0:;; 'fw_1~VirusVendor#license.expiration.days'=1284d;60:;0:;; 'fw_1~Warranty#license.expiration.days'=1284d;60:;0:;; 'fw_2~Industrial#license.expiration.days'=1284d;60:;0:;; 'fw_2~NotAfter#license.expiration.days'=4170d;60:;0:;; 'fw_2~Pattern#license.expiration.days'=1284d;60:;0:;; 'fw_2~SPAMVendor#license.expiration.days'=1284d;60:;0:;; 'fw_2~Sandboxing#license.expiration.days'=1284d;60:;0:;; 'fw_2~URLVendor#license.expiration.days'=1284d;60:;0:;; 'fw_2~Update#license.expiration.days'=1284d;60:;0:;; 'fw_2~VirusVendor#license.expiration.days'=1284d;60:;0:;; 'fw_2~Warranty#license.expiration.days'=1284d;60:;0:;; diff --git a/tests/network/stormshield/snmp/memory-detailed.robot b/tests/network/stormshield/snmp/memory-detailed.robot new file mode 100644 index 0000000000..649b5b4b14 --- /dev/null +++ b/tests/network/stormshield/snmp/memory-detailed.robot @@ -0,0 +1,43 @@ +*** Settings *** +Documentation network::stormshield::snmp::plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Ctn Generic Suite Setup +Suite Teardown Ctn Generic Suite Teardown +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} +... --plugin=network::stormshield::snmp::plugin +... --mode=memory-detailed +... --hostname=${HOSTNAME} +... --snmp-port=${SNMPPORT} +... --snmp-version=${SNMPVERSION} + + +*** Test Cases *** +Connections SN910 ${tc} + [Tags] network stormshield snmp + ${command} Catenate + ... ${CMD} + ... --snmp-community=network/stormshield/snmp/sn910 + ... ${extra_options} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... ${EMPTY} + ... OK: Memory usage total: 15.00 %, protected host: 0.00 %, fragmented: 0.00 %, ASQ connections: 0.00%, icmp: 7.00 %, Data Tracking: 0.00%, dynamic: 1.00 %, EtherState: 0%, Socket: 0%, User: 7% | 'memory.usage.percentage'=15.00%;;;0;100 'memory.protected_host.percentage'=0.00%;;;0;100 'memory.fragmented.percentage'=0.00%;;;0;100 'memory.connections.percentage'=0.00%;;;0;100 'memory.icmp.percentage'=7.00%;;;0;100 'memory.data_tracking.percentage'=0.00%;;;0;100 'memory.dynamic.percentage'=1.00%;;;0;100 'memory.ether_state.percentage'=0.00%;;;0;100 'memory.socket.percentage'=0%;;;0;100 'memory.user.percentage'=7%;;;0;100 + ... 2 + ... --warning-total=4 + ... WARNING: Memory usage total: 15.00 % | 'memory.usage.percentage'=15.00%;0:4;;0;100 'memory.protected_host.percentage'=0.00%;;;0;100 'memory.fragmented.percentage'=0.00%;;;0;100 'memory.connections.percentage'=0.00%;;;0;100 'memory.icmp.percentage'=7.00%;;;0;100 'memory.data_tracking.percentage'=0.00%;;;0;100 'memory.dynamic.percentage'=1.00%;;;0;100 'memory.ether_state.percentage'=0.00%;;;0;100 'memory.socket.percentage'=0%;;;0;100 'memory.user.percentage'=7%;;;0;100 + ... 3 + ... --critical-dyn=4: + ... CRITICAL: Memory usage dynamic: 1.00 % | 'memory.usage.percentage'=15.00%;;;0;100 'memory.protected_host.percentage'=0.00%;;;0;100 'memory.fragmented.percentage'=0.00%;;;0;100 'memory.connections.percentage'=0.00%;;;0;100 'memory.icmp.percentage'=7.00%;;;0;100 'memory.data_tracking.percentage'=0.00%;;;0;100 'memory.dynamic.percentage'=1.00%;;4:;0;100 'memory.ether_state.percentage'=0.00%;;;0;100 'memory.socket.percentage'=0%;;;0;100 'memory.user.percentage'=7%;;;0;100 diff --git a/tests/network/stormshield/snmp/sn910.snmpwalk b/tests/network/stormshield/snmp/sn910.snmpwalk new file mode 100644 index 0000000000..c241072bcf --- /dev/null +++ b/tests/network/stormshield/snmp/sn910.snmpwalk @@ -0,0 +1,1302 @@ +.1.3.6.1.4.1.11256.1.0.1.0 = STRING: "SN910" +.1.3.6.1.4.1.11256.1.0.2.0 = STRING: "5.2.0.dev" +.1.3.6.1.4.1.11256.1.0.3.0 = STRING: "fw_1" +.1.3.6.1.4.1.11256.1.0.4.0 = STRING: "fw_2" +.1.3.6.1.4.1.11256.1.0.5.0 = STRING: "fr" +.1.3.6.1.4.1.11256.1.0.6.0 = INTEGER: 10 +.1.3.6.1.4.1.11256.1.0.7.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.0.8.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.0.9.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.0.10.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.0.11.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.0.12.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.0.13.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.0.14.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.0.15.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.0.16.0 = STRING: "None" +.1.3.6.1.4.1.11256.1.3.1.1.1.1 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.2 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.3 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.4 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.5 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.6 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.7 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.8 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.9 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.10 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.11 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.12 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.1.13 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.2.1 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.2.2 = STRING: "netasq_dns2" +.1.3.6.1.4.1.11256.1.3.1.1.2.3 = STRING: "sandboxing2.stormshieldcs.eu" +.1.3.6.1.4.1.11256.1.3.1.1.2.4 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.2.5 = STRING: "update4-sns.stormshieldcs.eu" +.1.3.6.1.4.1.11256.1.3.1.1.2.6 = STRING: "sandboxing1.stormshieldcs.eu" +.1.3.6.1.4.1.11256.1.3.1.1.2.7 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.2.8 = STRING: "fw_gateway" +.1.3.6.1.4.1.11256.1.3.1.1.2.9 = STRING: "update1-sns.stormshieldcs.eu" +.1.3.6.1.4.1.11256.1.3.1.1.2.10 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.2.11 = STRING: "update2-sns.stormshieldcs.eu" +.1.3.6.1.4.1.11256.1.3.1.1.2.12 = STRING: "netasq_dns1" +.1.3.6.1.4.1.11256.1.3.1.1.2.13 = STRING: "" +.1.3.6.1.4.1.11256.1.3.1.1.3.1 = STRING: "HA" +.1.3.6.1.4.1.11256.1.3.1.1.3.2 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.3 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.4 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.5 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.6 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.7 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.8 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.9 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.10 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.11 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.12 = STRING: "out" +.1.3.6.1.4.1.11256.1.3.1.1.3.13 = STRING: "ha2" +.1.3.6.1.4.1.11256.1.3.1.1.4.1 = Counter64: 22357 +.1.3.6.1.4.1.11256.1.3.1.1.4.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.4.13 = Counter64: 15814 +.1.3.6.1.4.1.11256.1.3.1.1.5.1 = Counter64: 3454771 +.1.3.6.1.4.1.11256.1.3.1.1.5.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.5.13 = Counter64: 2644250 +.1.3.6.1.4.1.11256.1.3.1.1.7.1 = Counter64: 6290 +.1.3.6.1.4.1.11256.1.3.1.1.7.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.7.13 = Counter64: 5059 +.1.3.6.1.4.1.11256.1.3.1.1.8.1 = Counter64: 34636 +.1.3.6.1.4.1.11256.1.3.1.1.8.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.8.13 = Counter64: 38092 +.1.3.6.1.4.1.11256.1.3.1.1.9.1 = Counter64: 1695957 +.1.3.6.1.4.1.11256.1.3.1.1.9.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.9.13 = Counter64: 1275084 +.1.3.6.1.4.1.11256.1.3.1.1.10.1 = Counter64: 1758814 +.1.3.6.1.4.1.11256.1.3.1.1.10.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.10.13 = Counter64: 1369166 +.1.3.6.1.4.1.11256.1.3.1.1.11.1 = Counter64: 3356 +.1.3.6.1.4.1.11256.1.3.1.1.11.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.11.13 = Counter64: 2219 +.1.3.6.1.4.1.11256.1.3.1.1.12.1 = Counter64: 2934 +.1.3.6.1.4.1.11256.1.3.1.1.12.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.12.13 = Counter64: 2840 +.1.3.6.1.4.1.11256.1.3.1.1.13.1 = Counter64: 15074 +.1.3.6.1.4.1.11256.1.3.1.1.13.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.13.13 = Counter64: 13834 +.1.3.6.1.4.1.11256.1.3.1.1.14.1 = Counter64: 19562 +.1.3.6.1.4.1.11256.1.3.1.1.14.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.3.1.1.14.13 = Counter64: 24258 +.1.3.6.1.4.1.11256.1.4.1.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.1.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.4.1.1.1.3 = INTEGER: 3 +.1.3.6.1.4.1.11256.1.4.1.1.1.4 = INTEGER: 4 +.1.3.6.1.4.1.11256.1.4.1.1.1.5 = INTEGER: 5 +.1.3.6.1.4.1.11256.1.4.1.1.1.6 = INTEGER: 6 +.1.3.6.1.4.1.11256.1.4.1.1.1.7 = INTEGER: 7 +.1.3.6.1.4.1.11256.1.4.1.1.1.8 = INTEGER: 8 +.1.3.6.1.4.1.11256.1.4.1.1.1.9 = INTEGER: 9 +.1.3.6.1.4.1.11256.1.4.1.1.1.10 = INTEGER: 10 +.1.3.6.1.4.1.11256.1.4.1.1.1.11 = INTEGER: 11 +.1.3.6.1.4.1.11256.1.4.1.1.1.12 = INTEGER: 12 +.1.3.6.1.4.1.11256.1.4.1.1.1.13 = INTEGER: 13 +.1.3.6.1.4.1.11256.1.4.1.1.1.14 = INTEGER: 14 +.1.3.6.1.4.1.11256.1.4.1.1.2.1 = STRING: "sslvpn_dco" +.1.3.6.1.4.1.11256.1.4.1.1.2.2 = STRING: "sslvpn_udp" +.1.3.6.1.4.1.11256.1.4.1.1.2.3 = STRING: "sslvpn" +.1.3.6.1.4.1.11256.1.4.1.1.2.4 = STRING: "ipsec" +.1.3.6.1.4.1.11256.1.4.1.1.2.5 = STRING: "dmz8" +.1.3.6.1.4.1.11256.1.4.1.1.2.6 = STRING: "dmz7" +.1.3.6.1.4.1.11256.1.4.1.1.2.7 = STRING: "in" +.1.3.6.1.4.1.11256.1.4.1.1.2.8 = STRING: "out" +.1.3.6.1.4.1.11256.1.4.1.1.2.9 = STRING: "server1" +.1.3.6.1.4.1.11256.1.4.1.1.2.10 = STRING: "client1" +.1.3.6.1.4.1.11256.1.4.1.1.2.11 = STRING: "server0" +.1.3.6.1.4.1.11256.1.4.1.1.2.12 = STRING: "client0" +.1.3.6.1.4.1.11256.1.4.1.1.2.13 = STRING: "ha2" +.1.3.6.1.4.1.11256.1.4.1.1.2.14 = STRING: "HA" +.1.3.6.1.4.1.11256.1.4.1.1.3.1 = STRING: "sslvpn_dco0" +.1.3.6.1.4.1.11256.1.4.1.1.3.2 = STRING: "sslvpn1" +.1.3.6.1.4.1.11256.1.4.1.1.3.3 = STRING: "sslvpn0" +.1.3.6.1.4.1.11256.1.4.1.1.3.4 = STRING: "ipsec" +.1.3.6.1.4.1.11256.1.4.1.1.3.5 = STRING: "Ethernet9" +.1.3.6.1.4.1.11256.1.4.1.1.3.6 = STRING: "Ethernet8" +.1.3.6.1.4.1.11256.1.4.1.1.3.7 = STRING: "Ethernet1" +.1.3.6.1.4.1.11256.1.4.1.1.3.8 = STRING: "Ethernet0" +.1.3.6.1.4.1.11256.1.4.1.1.3.9 = STRING: "Ethernet7" +.1.3.6.1.4.1.11256.1.4.1.1.3.10 = STRING: "Ethernet6" +.1.3.6.1.4.1.11256.1.4.1.1.3.11 = STRING: "Ethernet5" +.1.3.6.1.4.1.11256.1.4.1.1.3.12 = STRING: "Ethernet4" +.1.3.6.1.4.1.11256.1.4.1.1.3.13 = STRING: "Ethernet3" +.1.3.6.1.4.1.11256.1.4.1.1.3.14 = STRING: "Ethernet2" +.1.3.6.1.4.1.11256.1.4.1.1.4.1 = "" +.1.3.6.1.4.1.11256.1.4.1.1.4.2 = "" +.1.3.6.1.4.1.11256.1.4.1.1.4.3 = "" +.1.3.6.1.4.1.11256.1.4.1.1.4.4 = "" +.1.3.6.1.4.1.11256.1.4.1.1.4.5 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.4.6 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.4.7 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.4.8 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.4.9 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.4.10 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.4.11 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.4.12 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.4.13 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.4.14 = STRING: "" +.1.3.6.1.4.1.11256.1.4.1.1.5.1 = "" +.1.3.6.1.4.1.11256.1.4.1.1.5.2 = "" +.1.3.6.1.4.1.11256.1.4.1.1.5.3 = "" +.1.3.6.1.4.1.11256.1.4.1.1.5.4 = "" +.1.3.6.1.4.1.11256.1.4.1.1.5.5 = STRING: "255.255.255.0" +.1.3.6.1.4.1.11256.1.4.1.1.5.6 = STRING: "255.255.255.0" +.1.3.6.1.4.1.11256.1.4.1.1.5.7 = STRING: "255.255.255.0" +.1.3.6.1.4.1.11256.1.4.1.1.5.8 = STRING: "255.255.0.0" +.1.3.6.1.4.1.11256.1.4.1.1.5.9 = STRING: "255.255.0.0" +.1.3.6.1.4.1.11256.1.4.1.1.5.10 = STRING: "255.255.0.0" +.1.3.6.1.4.1.11256.1.4.1.1.5.11 = STRING: "255.255.0.0" +.1.3.6.1.4.1.11256.1.4.1.1.5.12 = STRING: "255.255.0.0" +.1.3.6.1.4.1.11256.1.4.1.1.5.13 = STRING: "255.255.255.0" +.1.3.6.1.4.1.11256.1.4.1.1.5.14 = STRING: "255.255.255.0" +.1.3.6.1.4.1.11256.1.4.1.1.6.1 = STRING: "sslvpn_dco" +.1.3.6.1.4.1.11256.1.4.1.1.6.2 = STRING: "sslvpn" +.1.3.6.1.4.1.11256.1.4.1.1.6.3 = STRING: "sslvpn" +.1.3.6.1.4.1.11256.1.4.1.1.6.4 = STRING: "ipsec" +.1.3.6.1.4.1.11256.1.4.1.1.6.5 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.6.6 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.6.7 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.6.8 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.6.9 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.6.10 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.6.11 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.6.12 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.6.13 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.6.14 = STRING: "Ethernet" +.1.3.6.1.4.1.11256.1.4.1.1.7.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.2 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.3 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.7 = INTEGER: 4227200 +.1.3.6.1.4.1.11256.1.4.1.1.7.8 = INTEGER: 8388672 +.1.3.6.1.4.1.11256.1.4.1.1.7.9 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.10 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.12 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.13 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.7.14 = INTEGER: 16744512 +.1.3.6.1.4.1.11256.1.4.1.1.8.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.7 = Counter64: 1000000000 +.1.3.6.1.4.1.11256.1.4.1.1.8.8 = Counter64: 1000000000 +.1.3.6.1.4.1.11256.1.4.1.1.8.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.8.13 = Counter64: 1000000000 +.1.3.6.1.4.1.11256.1.4.1.1.8.14 = Counter64: 1000000000 +.1.3.6.1.4.1.11256.1.4.1.1.9.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.8 = Counter64: 775 +.1.3.6.1.4.1.11256.1.4.1.1.9.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.9.13 = Counter64: 14725 +.1.3.6.1.4.1.11256.1.4.1.1.9.14 = Counter64: 17464 +.1.3.6.1.4.1.11256.1.4.1.1.10.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.8 = Counter64: 48206 +.1.3.6.1.4.1.11256.1.4.1.1.10.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.10.13 = Counter64: 43442 +.1.3.6.1.4.1.11256.1.4.1.1.10.14 = Counter64: 42500 +.1.3.6.1.4.1.11256.1.4.1.1.11.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.8 = Counter64: 1407 +.1.3.6.1.4.1.11256.1.4.1.1.11.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.11.13 = Counter64: 10923 +.1.3.6.1.4.1.11256.1.4.1.1.11.14 = Counter64: 16688 +.1.3.6.1.4.1.11256.1.4.1.1.12.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.12.14 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.13.14 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.8 = Counter64: 30 +.1.3.6.1.4.1.11256.1.4.1.1.14.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.14.14 = Counter64: 5763 +.1.3.6.1.4.1.11256.1.4.1.1.15.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.8 = Counter64: 1209 +.1.3.6.1.4.1.11256.1.4.1.1.15.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.15.13 = Counter64: 10923 +.1.3.6.1.4.1.11256.1.4.1.1.15.14 = Counter64: 10925 +.1.3.6.1.4.1.11256.1.4.1.1.16.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.8 = Counter64: 168 +.1.3.6.1.4.1.11256.1.4.1.1.16.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.16.14 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.8 = Counter64: 424251 +.1.3.6.1.4.1.11256.1.4.1.1.17.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.17.13 = Counter64: 2548188 +.1.3.6.1.4.1.11256.1.4.1.1.17.14 = Counter64: 3284391 +.1.3.6.1.4.1.11256.1.4.1.1.18.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.8 = Counter64: 25792 +.1.3.6.1.4.1.11256.1.4.1.1.18.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.18.14 = Counter64: 698729 +.1.3.6.1.4.1.11256.1.4.1.1.19.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.8 = Counter64: 382927 +.1.3.6.1.4.1.11256.1.4.1.1.19.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.19.13 = Counter64: 2420212 +.1.3.6.1.4.1.11256.1.4.1.1.19.14 = Counter64: 2456206 +.1.3.6.1.4.1.11256.1.4.1.1.20.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.8 = Counter64: 15532 +.1.3.6.1.4.1.11256.1.4.1.1.20.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.20.13 = Counter64: 127976 +.1.3.6.1.4.1.11256.1.4.1.1.20.14 = Counter64: 127976 +.1.3.6.1.4.1.11256.1.4.1.1.21.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.21.14 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.8 = Counter64: 281 +.1.3.6.1.4.1.11256.1.4.1.1.22.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.22.14 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.2 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.3 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.7 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.8 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.9 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.10 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.12 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.13 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.23.14 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.4.1.1.24.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.2 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.3 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.7 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.8 = INTEGER: 90 +.1.3.6.1.4.1.11256.1.4.1.1.24.9 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.10 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.12 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.24.13 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.4.1.1.24.14 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.4.1.1.25.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.2 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.3 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.7 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.8 = INTEGER: 91 +.1.3.6.1.4.1.11256.1.4.1.1.25.9 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.10 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.12 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.25.13 = INTEGER: 6536 +.1.3.6.1.4.1.11256.1.4.1.1.25.14 = INTEGER: 8200 +.1.3.6.1.4.1.11256.1.4.1.1.26.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.2 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.3 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.7 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.8 = INTEGER: 684 +.1.3.6.1.4.1.11256.1.4.1.1.26.9 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.10 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.12 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.26.13 = INTEGER: 8189 +.1.3.6.1.4.1.11256.1.4.1.1.26.14 = INTEGER: 9264 +.1.3.6.1.4.1.11256.1.4.1.1.27.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.2 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.3 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.7 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.8 = INTEGER: 29404 +.1.3.6.1.4.1.11256.1.4.1.1.27.9 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.10 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.12 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.27.13 = INTEGER: 24258 +.1.3.6.1.4.1.11256.1.4.1.1.27.14 = INTEGER: 19562 +.1.3.6.1.4.1.11256.1.4.1.1.28.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.2 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.3 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.7 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.8 = INTEGER: 18802 +.1.3.6.1.4.1.11256.1.4.1.1.28.9 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.10 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.12 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.28.13 = INTEGER: 19184 +.1.3.6.1.4.1.11256.1.4.1.1.28.14 = INTEGER: 22938 +.1.3.6.1.4.1.11256.1.4.1.1.29.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.8 = Counter64: 210312 +.1.3.6.1.4.1.11256.1.4.1.1.29.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.29.13 = Counter64: 1221210 +.1.3.6.1.4.1.11256.1.4.1.1.29.14 = Counter64: 1573800 +.1.3.6.1.4.1.11256.1.4.1.1.30.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.8 = Counter64: 213939 +.1.3.6.1.4.1.11256.1.4.1.1.30.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.30.13 = Counter64: 1326978 +.1.3.6.1.4.1.11256.1.4.1.1.30.14 = Counter64: 1710591 +.1.3.6.1.4.1.11256.1.4.1.1.31.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.8 = Counter64: 22104 +.1.3.6.1.4.1.11256.1.4.1.1.31.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.31.14 = Counter64: 329676 +.1.3.6.1.4.1.11256.1.4.1.1.32.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.8 = Counter64: 3688 +.1.3.6.1.4.1.11256.1.4.1.1.32.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.32.14 = Counter64: 369053 +.1.3.6.1.4.1.11256.1.4.1.1.33.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.8 = Counter64: 180442 +.1.3.6.1.4.1.11256.1.4.1.1.33.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.33.13 = Counter64: 1221210 +.1.3.6.1.4.1.11256.1.4.1.1.33.14 = Counter64: 1244124 +.1.3.6.1.4.1.11256.1.4.1.1.34.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.8 = Counter64: 202485 +.1.3.6.1.4.1.11256.1.4.1.1.34.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.34.13 = Counter64: 1199002 +.1.3.6.1.4.1.11256.1.4.1.1.34.14 = Counter64: 1212082 +.1.3.6.1.4.1.11256.1.4.1.1.35.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.8 = Counter64: 7766 +.1.3.6.1.4.1.11256.1.4.1.1.35.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.13 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.35.14 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.8 = Counter64: 7766 +.1.3.6.1.4.1.11256.1.4.1.1.36.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.12 = Counter64: 0 +.1.3.6.1.4.1.11256.1.4.1.1.36.13 = Counter64: 127976 +.1.3.6.1.4.1.11256.1.4.1.1.36.14 = Counter64: 127976 +.1.3.6.1.4.1.11256.1.4.1.1.37.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.37.2 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.37.3 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.37.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.37.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.37.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.37.7 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.37.8 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.37.9 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.37.10 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.37.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.37.12 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.37.13 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.37.14 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.4.1.1.38.1 = STRING: "tun2" +.1.3.6.1.4.1.11256.1.4.1.1.38.2 = STRING: "tun1" +.1.3.6.1.4.1.11256.1.4.1.1.38.3 = STRING: "tun0" +.1.3.6.1.4.1.11256.1.4.1.1.38.4 = STRING: "enc0" +.1.3.6.1.4.1.11256.1.4.1.1.38.5 = STRING: "igb9" +.1.3.6.1.4.1.11256.1.4.1.1.38.6 = STRING: "igb8" +.1.3.6.1.4.1.11256.1.4.1.1.38.7 = STRING: "igb7" +.1.3.6.1.4.1.11256.1.4.1.1.38.8 = STRING: "igb6" +.1.3.6.1.4.1.11256.1.4.1.1.38.9 = STRING: "igb5" +.1.3.6.1.4.1.11256.1.4.1.1.38.10 = STRING: "igb4" +.1.3.6.1.4.1.11256.1.4.1.1.38.11 = STRING: "igb3" +.1.3.6.1.4.1.11256.1.4.1.1.38.12 = STRING: "igb2" +.1.3.6.1.4.1.11256.1.4.1.1.38.13 = STRING: "igb1" +.1.3.6.1.4.1.11256.1.4.1.1.38.14 = STRING: "igb0" +.1.3.6.1.4.1.11256.1.4.1.1.39.1 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.2 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.3 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.4 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.5 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.6 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.7 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.8 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.9 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.10 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.11 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.12 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.13 = "" +.1.3.6.1.4.1.11256.1.4.1.1.39.14 = "" +.1.3.6.1.4.1.11256.1.4.1.1.40.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.2 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.3 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.7 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.8 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.9 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.10 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.12 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.13 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.40.14 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.2 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.3 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.4 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.5 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.6 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.7 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.8 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.9 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.10 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.11 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.12 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.13 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.4.1.1.41.14 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.7.1.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.1.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.7.1.1.1.3 = INTEGER: 3 +.1.3.6.1.4.1.11256.1.7.1.1.1.4 = INTEGER: 4 +.1.3.6.1.4.1.11256.1.7.1.1.1.5 = INTEGER: 5 +.1.3.6.1.4.1.11256.1.7.1.1.1.6 = INTEGER: 6 +.1.3.6.1.4.1.11256.1.7.1.1.1.7 = INTEGER: 7 +.1.3.6.1.4.1.11256.1.7.1.1.1.8 = INTEGER: 8 +.1.3.6.1.4.1.11256.1.7.1.1.1.9 = INTEGER: 9 +.1.3.6.1.4.1.11256.1.7.1.1.1.10 = INTEGER: 10 +.1.3.6.1.4.1.11256.1.7.1.1.1.11 = INTEGER: 11 +.1.3.6.1.4.1.11256.1.7.1.1.1.12 = INTEGER: 12 +.1.3.6.1.4.1.11256.1.7.1.1.1.13 = INTEGER: 13 +.1.3.6.1.4.1.11256.1.7.1.1.1.14 = INTEGER: 14 +.1.3.6.1.4.1.11256.1.7.1.1.1.15 = INTEGER: 15 +.1.3.6.1.4.1.11256.1.7.1.1.1.16 = INTEGER: 16 +.1.3.6.1.4.1.11256.1.7.1.1.1.17 = INTEGER: 17 +.1.3.6.1.4.1.11256.1.7.1.1.1.18 = INTEGER: 18 +.1.3.6.1.4.1.11256.1.7.1.1.2.1 = STRING: "alived" +.1.3.6.1.4.1.11256.1.7.1.1.2.2 = STRING: "asqd" +.1.3.6.1.4.1.11256.1.7.1.1.2.3 = STRING: "authd" +.1.3.6.1.4.1.11256.1.7.1.1.2.4 = STRING: "certreqd" +.1.3.6.1.4.1.11256.1.7.1.1.2.5 = STRING: "corosync" +.1.3.6.1.4.1.11256.1.7.1.1.2.6 = STRING: "eventd" +.1.3.6.1.4.1.11256.1.7.1.1.2.7 = STRING: "gatewayd" +.1.3.6.1.4.1.11256.1.7.1.1.2.8 = STRING: "hardwared" +.1.3.6.1.4.1.11256.1.7.1.1.2.9 = STRING: "logd" +.1.3.6.1.4.1.11256.1.7.1.1.2.10 = STRING: "monitord" +.1.3.6.1.4.1.11256.1.7.1.1.2.11 = STRING: "routerd" +.1.3.6.1.4.1.11256.1.7.1.1.2.12 = STRING: "serverd" +.1.3.6.1.4.1.11256.1.7.1.1.2.13 = STRING: "sld" +.1.3.6.1.4.1.11256.1.7.1.1.2.14 = STRING: "snmpd" +.1.3.6.1.4.1.11256.1.7.1.1.2.15 = STRING: "sshd" +.1.3.6.1.4.1.11256.1.7.1.1.2.16 = STRING: "stated" +.1.3.6.1.4.1.11256.1.7.1.1.2.17 = STRING: "thind" +.1.3.6.1.4.1.11256.1.7.1.1.2.18 = STRING: "userreqd" +.1.3.6.1.4.1.11256.1.7.1.1.3.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.2 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.3 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.4 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.5 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.6 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.7 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.8 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.9 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.10 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.11 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.12 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.13 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.14 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.15 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.16 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.17 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.3.18 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.7.1.1.4.1 = INTEGER: 6208658 +.1.3.6.1.4.1.11256.1.7.1.1.4.2 = INTEGER: 6208675 +.1.3.6.1.4.1.11256.1.7.1.1.4.3 = INTEGER: 6208669 +.1.3.6.1.4.1.11256.1.7.1.1.4.4 = INTEGER: 6208667 +.1.3.6.1.4.1.11256.1.7.1.1.4.5 = INTEGER: 6208662 +.1.3.6.1.4.1.11256.1.7.1.1.4.6 = INTEGER: 6208650 +.1.3.6.1.4.1.11256.1.7.1.1.4.7 = INTEGER: 6208664 +.1.3.6.1.4.1.11256.1.7.1.1.4.8 = INTEGER: 6208677 +.1.3.6.1.4.1.11256.1.7.1.1.4.9 = INTEGER: 6208679 +.1.3.6.1.4.1.11256.1.7.1.1.4.10 = INTEGER: 6208677 +.1.3.6.1.4.1.11256.1.7.1.1.4.11 = INTEGER: 6208656 +.1.3.6.1.4.1.11256.1.7.1.1.4.12 = INTEGER: 6208671 +.1.3.6.1.4.1.11256.1.7.1.1.4.13 = INTEGER: 6208653 +.1.3.6.1.4.1.11256.1.7.1.1.4.14 = INTEGER: 1389236 +.1.3.6.1.4.1.11256.1.7.1.1.4.15 = INTEGER: 6208673 +.1.3.6.1.4.1.11256.1.7.1.1.4.16 = INTEGER: 6208660 +.1.3.6.1.4.1.11256.1.7.1.1.4.17 = INTEGER: 6208648 +.1.3.6.1.4.1.11256.1.7.1.1.4.18 = INTEGER: 6208675 +.1.3.6.1.4.1.11256.1.7.1.1.5.1 = 620865800 +.1.3.6.1.4.1.11256.1.7.1.1.5.2 = 620867500 +.1.3.6.1.4.1.11256.1.7.1.1.5.3 = 620866900 +.1.3.6.1.4.1.11256.1.7.1.1.5.4 = 620866700 +.1.3.6.1.4.1.11256.1.7.1.1.5.5 = 620866200 +.1.3.6.1.4.1.11256.1.7.1.1.5.6 = 620865000 +.1.3.6.1.4.1.11256.1.7.1.1.5.7 = 620866400 +.1.3.6.1.4.1.11256.1.7.1.1.5.8 = 620867700 +.1.3.6.1.4.1.11256.1.7.1.1.5.9 = 620867900 +.1.3.6.1.4.1.11256.1.7.1.1.5.10 = 620867700 +.1.3.6.1.4.1.11256.1.7.1.1.5.11 = 620865600 +.1.3.6.1.4.1.11256.1.7.1.1.5.12 = 620867100 +.1.3.6.1.4.1.11256.1.7.1.1.5.13 = 620865300 +.1.3.6.1.4.1.11256.1.7.1.1.5.14 = 138923600 +.1.3.6.1.4.1.11256.1.7.1.1.5.15 = 620867300 +.1.3.6.1.4.1.11256.1.7.1.1.5.16 = 620866000 +.1.3.6.1.4.1.11256.1.7.1.1.5.17 = 620864800 +.1.3.6.1.4.1.11256.1.7.1.1.5.18 = 620867500 +.1.3.6.1.4.1.11256.1.8.1.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.8.1.1.1.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.8.1.1.1.3 = INTEGER: 3 +.1.3.6.1.4.1.11256.1.8.1.1.2.1 = STRING: "globalfilter" +.1.3.6.1.4.1.11256.1.8.1.1.2.2 = STRING: "filter" +.1.3.6.1.4.1.11256.1.8.1.1.2.3 = STRING: "vpn" +.1.3.6.1.4.1.11256.1.8.1.1.3.1 = STRING: "No broadcast on out interface" +.1.3.6.1.4.1.11256.1.8.1.1.3.2 = STRING: "Pass all High" +.1.3.6.1.4.1.11256.1.8.1.1.3.3 = "" +.1.3.6.1.4.1.11256.1.8.1.1.4.1 = STRING: "09" +.1.3.6.1.4.1.11256.1.8.1.1.4.2 = STRING: "09" +.1.3.6.1.4.1.11256.1.8.1.1.4.3 = STRING: "00" +.1.3.6.1.4.1.11256.1.8.1.1.5.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.8.1.1.5.2 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.8.1.1.5.3 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.9.1.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.9.1.1.1.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.9.1.1.1.3 = INTEGER: 3 +.1.3.6.1.4.1.11256.1.9.1.1.1.4 = INTEGER: 4 +.1.3.6.1.4.1.11256.1.9.1.1.1.5 = INTEGER: 5 +.1.3.6.1.4.1.11256.1.9.1.1.1.6 = INTEGER: 6 +.1.3.6.1.4.1.11256.1.9.1.1.1.7 = INTEGER: 7 +.1.3.6.1.4.1.11256.1.9.1.1.1.8 = INTEGER: 8 +.1.3.6.1.4.1.11256.1.9.1.1.1.9 = INTEGER: 9 +.1.3.6.1.4.1.11256.1.9.1.1.1.10 = INTEGER: 10 +.1.3.6.1.4.1.11256.1.9.1.1.1.11 = INTEGER: 11 +.1.3.6.1.4.1.11256.1.9.1.1.2.1 = STRING: "Antispam" +.1.3.6.1.4.1.11256.1.9.1.1.2.2 = STRING: "Patterns" +.1.3.6.1.4.1.11256.1.9.1.1.2.3 = STRING: "CustomPatterns" +.1.3.6.1.4.1.11256.1.9.1.1.2.4 = STRING: "AdvancedAV" +.1.3.6.1.4.1.11256.1.9.1.1.2.5 = STRING: "URLFiltering" +.1.3.6.1.4.1.11256.1.9.1.1.2.6 = STRING: "CompromisedUrls" +.1.3.6.1.4.1.11256.1.9.1.1.2.7 = STRING: "Vaderetro" +.1.3.6.1.4.1.11256.1.9.1.1.2.8 = STRING: "RootCertificates" +.1.3.6.1.4.1.11256.1.9.1.1.2.9 = STRING: "IPData" +.1.3.6.1.4.1.11256.1.9.1.1.2.10 = STRING: "Metadata" +.1.3.6.1.4.1.11256.1.9.1.1.2.11 = STRING: "CustomWebServices" +.1.3.6.1.4.1.11256.1.9.1.1.3.1 = STRING: "Never started" +.1.3.6.1.4.1.11256.1.9.1.1.3.2 = STRING: "Broken" +.1.3.6.1.4.1.11256.1.9.1.1.3.3 = STRING: "Failed" +.1.3.6.1.4.1.11256.1.9.1.1.3.4 = STRING: "Never started" +.1.3.6.1.4.1.11256.1.9.1.1.3.5 = STRING: "Never started" +.1.3.6.1.4.1.11256.1.9.1.1.3.6 = STRING: "Never started" +.1.3.6.1.4.1.11256.1.9.1.1.3.7 = STRING: "Never started" +.1.3.6.1.4.1.11256.1.9.1.1.3.8 = STRING: "Never started" +.1.3.6.1.4.1.11256.1.9.1.1.3.9 = STRING: "Never started" +.1.3.6.1.4.1.11256.1.9.1.1.3.10 = STRING: "Never started" +.1.3.6.1.4.1.11256.1.9.1.1.3.11 = STRING: "Disabled" +.1.3.6.1.4.1.11256.1.9.1.1.4.1 = "" +.1.3.6.1.4.1.11256.1.9.1.1.4.2 = STRING: "2026-02-16 18:29:14" +.1.3.6.1.4.1.11256.1.9.1.1.4.3 = "" +.1.3.6.1.4.1.11256.1.9.1.1.4.4 = STRING: "2025-12-08 16:44:58" +.1.3.6.1.4.1.11256.1.9.1.1.4.5 = "" +.1.3.6.1.4.1.11256.1.9.1.1.4.6 = "" +.1.3.6.1.4.1.11256.1.9.1.1.4.7 = STRING: "2025-12-08 16:42:28" +.1.3.6.1.4.1.11256.1.9.1.1.4.8 = "" +.1.3.6.1.4.1.11256.1.9.1.1.4.9 = "" +.1.3.6.1.4.1.11256.1.9.1.1.4.10 = "" +.1.3.6.1.4.1.11256.1.9.1.1.4.11 = "" +.1.3.6.1.4.1.11256.1.10.1.0 = STRING: "2026-04-29 17:29:10" +.1.3.6.1.4.1.11256.1.10.2.0 = STRING: "71:20:39:47" +.1.3.6.1.4.1.11256.1.10.3.0 = STRING: "0,0,7,0,0,0,1,0" +.1.3.6.1.4.1.11256.1.10.4.0 = STRING: "2026-02-16 19:49:53" +.1.3.6.1.4.1.11256.1.10.5.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.10.5.1.2.1 = STRING: "ada0" +.1.3.6.1.4.1.11256.1.10.5.1.3.1 = STRING: "PASSED" +.1.3.6.1.4.1.11256.1.10.5.1.4.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.10.5.1.5.1 = "" +.1.3.6.1.4.1.11256.1.10.5.1.6.1 = STRING: "internal" +.1.3.6.1.4.1.11256.1.10.7.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.10.7.1.1.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.10.7.1.2.1 = INTEGER: 45 +.1.3.6.1.4.1.11256.1.10.7.1.2.2 = INTEGER: 46 +.1.3.6.1.4.1.11256.1.10.10.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.10.10.1.2.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.10.10.1.3.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.10.10.1.4.1 = INTEGER: 7 +.1.3.6.1.4.1.11256.1.10.10.1.5.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.10.10.1.6.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.10.10.1.7.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.10.10.1.8.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.10.10.1.9.1 = INTEGER: 7 +.1.3.6.1.4.1.11256.1.10.10.1.10.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.10.11.0 = 620878700 +.1.3.6.1.4.1.11256.1.11.1.0 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.11.2.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.3.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.11.5.0 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.11.6.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.7.1.1.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.7.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.11.7.1.2.0 = STRING: "fw_1" +.1.3.6.1.4.1.11256.1.11.7.1.2.1 = STRING: "fw_2" +.1.3.6.1.4.1.11256.1.11.7.1.3.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.11.7.1.3.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.11.7.1.4.0 = STRING: "SN910" +.1.3.6.1.4.1.11256.1.11.7.1.4.1 = STRING: "SN910" +.1.3.6.1.4.1.11256.1.11.7.1.5.0 = STRING: "5.0.2" +.1.3.6.1.4.1.11256.1.11.7.1.5.1 = STRING: "5.2.0.dev" +.1.3.6.1.4.1.11256.1.11.7.1.6.0 = STRING: "Master" +.1.3.6.1.4.1.11256.1.11.7.1.6.1 = STRING: "Master" +.1.3.6.1.4.1.11256.1.11.7.1.7.0 = INTEGER: 100 +.1.3.6.1.4.1.11256.1.11.7.1.7.1 = INTEGER: 33 +.1.3.6.1.4.1.11256.1.11.7.1.8.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.7.1.8.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.7.1.9.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.7.1.9.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.11.7.1.10.0 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.11.7.1.10.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.11.7.1.11.0 = INTEGER: 6492561 +.1.3.6.1.4.1.11256.1.11.7.1.11.1 = INTEGER: 6208757 +.1.3.6.1.4.1.11256.1.11.7.1.12.0 = 649256100 +.1.3.6.1.4.1.11256.1.11.7.1.12.1 = 620875700 +.1.3.6.1.4.1.11256.1.11.8.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.9.0 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.11.12.1.1.1.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.12.1.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.11.12.1.2.1.0 = INTEGER: 45 +.1.3.6.1.4.1.11256.1.11.12.1.2.1.1 = INTEGER: 46 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.3 = INTEGER: 3 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.4 = INTEGER: 4 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.5 = INTEGER: 5 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.6 = INTEGER: 6 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.7 = INTEGER: 7 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.8 = INTEGER: 8 +.1.3.6.1.4.1.11256.1.11.14.1.1.0.9 = INTEGER: 9 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.3 = INTEGER: 3 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.4 = INTEGER: 4 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.5 = INTEGER: 5 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.6 = INTEGER: 6 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.7 = INTEGER: 7 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.8 = INTEGER: 8 +.1.3.6.1.4.1.11256.1.11.14.1.1.1.9 = INTEGER: 9 +.1.3.6.1.4.1.11256.1.11.14.1.2.0.0 = STRING: "Update" +.1.3.6.1.4.1.11256.1.11.14.1.2.0.1 = STRING: "Pattern" +.1.3.6.1.4.1.11256.1.11.14.1.2.0.2 = STRING: "VirusVendor" +.1.3.6.1.4.1.11256.1.11.14.1.2.0.3 = STRING: "URLVendor" +.1.3.6.1.4.1.11256.1.11.14.1.2.0.4 = STRING: "SPAMVendor" +.1.3.6.1.4.1.11256.1.11.14.1.2.0.5 = STRING: "Sandboxing" +.1.3.6.1.4.1.11256.1.11.14.1.2.0.6 = STRING: "Warranty" +.1.3.6.1.4.1.11256.1.11.14.1.2.0.7 = STRING: "ExpressWarranty" +.1.3.6.1.4.1.11256.1.11.14.1.2.0.8 = STRING: "NotAfter" +.1.3.6.1.4.1.11256.1.11.14.1.2.0.9 = STRING: "Industrial" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.0 = STRING: "Update" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.1 = STRING: "Pattern" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.2 = STRING: "VirusVendor" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.3 = STRING: "URLVendor" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.4 = STRING: "SPAMVendor" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.5 = STRING: "Sandboxing" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.6 = STRING: "Warranty" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.7 = STRING: "ExpressWarranty" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.8 = STRING: "NotAfter" +.1.3.6.1.4.1.11256.1.11.14.1.2.1.9 = STRING: "Industrial" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.0 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.1 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.2 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.3 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.4 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.5 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.6 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.7 = STRING: "0000-00-00" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.8 = STRING: "2037-12-31" +.1.3.6.1.4.1.11256.1.11.14.1.3.0.9 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.0 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.1 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.2 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.3 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.4 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.5 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.6 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.7 = STRING: "0000-00-00" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.8 = STRING: "2037-12-31" +.1.3.6.1.4.1.11256.1.11.14.1.3.1.9 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.12.1.1.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.2.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.3.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.4.0 = Counter64: 33565 +.1.3.6.1.4.1.11256.1.12.1.5.0 = Counter64: 318 +.1.3.6.1.4.1.11256.1.12.1.6.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.7.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.8.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.9.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.10.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.11.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.12.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.13.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.14.0 = STRING: "3.29M" +.1.3.6.1.4.1.11256.1.12.1.15.0 = STRING: "3.54M" +.1.3.6.1.4.1.11256.1.12.1.16.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.17.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.18.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.19.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.20.0 = Counter64: 6654 +.1.3.6.1.4.1.11256.1.12.1.21.0 = STRING: "394K" +.1.3.6.1.4.1.11256.1.12.1.22.0 = STRING: "418K" +.1.3.6.1.4.1.11256.1.12.1.23.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.24.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.25.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.26.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.27.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.28.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.29.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.30.0 = Counter64: 26721 +.1.3.6.1.4.1.11256.1.12.1.31.0 = STRING: "2.89M" +.1.3.6.1.4.1.11256.1.12.1.32.0 = STRING: "2.84M" +.1.3.6.1.4.1.11256.1.12.1.33.0 = Counter64: 318 +.1.3.6.1.4.1.11256.1.12.1.34.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.35.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.36.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.37.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.38.0 = Counter64: 190 +.1.3.6.1.4.1.11256.1.12.1.39.0 = STRING: "8.46K" +.1.3.6.1.4.1.11256.1.12.1.40.0 = STRING: "295K" +.1.3.6.1.4.1.11256.1.12.1.41.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.42.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.43.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.44.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.45.0 = STRING: "0.00 " +.1.3.6.1.4.1.11256.1.12.1.46.0 = STRING: "0.00 " +.1.3.6.1.4.1.11256.1.12.1.47.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.48.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.12.1.49.0 = STRING: "0.00 " +.1.3.6.1.4.1.11256.1.12.1.50.0 = STRING: "0.00 " +.1.3.6.1.4.1.11256.1.12.2.1.0 = Counter32: 432 +.1.3.6.1.4.1.11256.1.13.1.1.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.13.1.2.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.13.2.1.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.13.2.2.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.13.2.3.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.13.2.4.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.13.3.1.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.13.3.2.0 = Counter64: 0 +.1.3.6.1.4.1.11256.1.14.1.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.14.1.1.2.1 = STRING: "DefaultRoute" +.1.3.6.1.4.1.11256.1.14.1.1.3.1 = INTEGER: 4 +.1.3.6.1.4.1.11256.1.14.1.1.4.1 = STRING: "dr4_router" +.1.3.6.1.4.1.11256.1.14.1.1.5.1 = STRING: "fw_gateway" +.1.3.6.1.4.1.11256.1.14.1.1.6.1 = STRING: "" +.1.3.6.1.4.1.11256.1.14.1.1.7.1 = STRING: "Principal" +.1.3.6.1.4.1.11256.1.14.1.1.8.1 = STRING: "2026-04-29 17:29:09" +.1.3.6.1.4.1.11256.1.14.1.1.9.1 = STRING: "UP" +.1.3.6.1.4.1.11256.1.14.1.1.10.1 = STRING: "2026-04-21 20:22:23" +.1.3.6.1.4.1.11256.1.14.1.1.11.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.14.1.1.12.1 = STRING: "2026-02-16 19:51:34" +.1.3.6.1.4.1.11256.1.14.1.1.13.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.14.1.1.14.1 = STRING: "2026-02-16 19:51:34" +.1.3.6.1.4.1.11256.1.14.1.1.15.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.14.1.1.16.1 = STRING: "100.0" +.1.3.6.1.4.1.11256.1.14.1.1.17.1 = STRING: "icmp" +.1.3.6.1.4.1.11256.1.14.1.1.18.1 = Gauge32: 1 +.1.3.6.1.4.1.11256.1.14.1.1.19.1 = Gauge32: 0 +.1.3.6.1.4.1.11256.1.14.1.1.20.1 = STRING: "0.0" +.1.3.6.1.4.1.11256.1.14.1.1.21.1 = STRING: "0.0" +.1.3.6.1.4.1.11256.1.14.1.1.22.1 = INTEGER: 1000 +.1.3.6.1.4.1.11256.1.14.1.1.23.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.14.1.1.24.1 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.15.1.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.15.1.1.1.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.15.1.1.1.3 = INTEGER: 3 +.1.3.6.1.4.1.11256.1.15.1.1.1.4 = INTEGER: 4 +.1.3.6.1.4.1.11256.1.15.1.1.1.5 = INTEGER: 5 +.1.3.6.1.4.1.11256.1.15.1.1.1.6 = INTEGER: 6 +.1.3.6.1.4.1.11256.1.15.1.1.1.7 = INTEGER: 7 +.1.3.6.1.4.1.11256.1.15.1.1.1.8 = INTEGER: 8 +.1.3.6.1.4.1.11256.1.15.1.1.1.9 = INTEGER: 9 +.1.3.6.1.4.1.11256.1.15.1.1.1.10 = INTEGER: 10 +.1.3.6.1.4.1.11256.1.15.1.1.1.11 = INTEGER: 11 +.1.3.6.1.4.1.11256.1.15.1.1.2.1 = STRING: "BYPASS_HA" +.1.3.6.1.4.1.11256.1.15.1.1.2.2 = STRING: "BYPASS_ha2" +.1.3.6.1.4.1.11256.1.15.1.1.2.3 = STRING: "BYPASS_client0" +.1.3.6.1.4.1.11256.1.15.1.1.2.4 = STRING: "BYPASS_server0" +.1.3.6.1.4.1.11256.1.15.1.1.2.5 = STRING: "BYPASS_client1" +.1.3.6.1.4.1.11256.1.15.1.1.2.6 = STRING: "BYPASS_server1" +.1.3.6.1.4.1.11256.1.15.1.1.2.7 = STRING: "BYPASS_out" +.1.3.6.1.4.1.11256.1.15.1.1.2.8 = STRING: "BYPASS_in" +.1.3.6.1.4.1.11256.1.15.1.1.2.9 = STRING: "BYPASS_dmz7" +.1.3.6.1.4.1.11256.1.15.1.1.2.10 = STRING: "BYPASS_dmz8" +.1.3.6.1.4.1.11256.1.15.1.1.2.11 = STRING: "BYPASS_ipsec" +.1.3.6.1.4.1.11256.1.15.1.1.3.1 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.2 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.3 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.4 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.5 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.6 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.7 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.8 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.9 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.10 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.3.11 = STRING: "CBQ" +.1.3.6.1.4.1.11256.1.15.1.1.4.1 = Counter64: 1813802 +.1.3.6.1.4.1.11256.1.15.1.1.4.2 = Counter64: 1512728 +.1.3.6.1.4.1.11256.1.15.1.1.4.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.4.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.4.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.4.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.4.7 = Counter64: 13886 +.1.3.6.1.4.1.11256.1.15.1.1.4.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.4.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.4.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.4.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.5.1 = Counter64: 22643 +.1.3.6.1.4.1.11256.1.15.1.1.5.2 = Counter64: 19184 +.1.3.6.1.4.1.11256.1.15.1.1.5.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.5.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.5.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.5.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.5.7 = Counter64: 1258 +.1.3.6.1.4.1.11256.1.15.1.1.5.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.5.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.5.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.5.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.6.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.7.1 = Counter64: 127738 +.1.3.6.1.4.1.11256.1.15.1.1.7.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.7.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.7.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.7.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.7.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.7.7 = Counter64: 303844 +.1.3.6.1.4.1.11256.1.15.1.1.7.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.7.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.7.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.7.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.8.1 = Counter64: 531 +.1.3.6.1.4.1.11256.1.15.1.1.8.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.8.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.8.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.8.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.8.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.8.7 = Counter64: 26641 +.1.3.6.1.4.1.11256.1.15.1.1.8.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.8.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.8.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.8.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.1 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.2 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.3 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.4 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.5 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.6 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.7 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.8 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.9 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.10 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.9.11 = Counter64: 0 +.1.3.6.1.4.1.11256.1.15.1.1.10.1 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.2 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.3 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.4 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.5 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.6 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.7 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.8 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.9 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.10 = "" +.1.3.6.1.4.1.11256.1.15.1.1.10.11 = "" +.1.3.6.1.4.1.11256.1.16.1.0 = STRING: "Major" +.1.3.6.1.4.1.11256.1.16.2.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.16.2.1.1.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.16.2.1.2.1 = STRING: "Firewall_1_serial_number" +.1.3.6.1.4.1.11256.1.16.2.1.2.2 = STRING: "Firewall_2_serial_number" +.1.3.6.1.4.1.11256.1.16.2.1.3.1 = STRING: "Active" +.1.3.6.1.4.1.11256.1.16.2.1.3.2 = STRING: "Active" +.1.3.6.1.4.1.11256.1.16.2.1.4.1 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.4.2 = STRING: "Active" +.1.3.6.1.4.1.11256.1.16.2.1.5.1 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.5.2 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.6.1 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.6.2 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.7.1 = STRING: "Major" +.1.3.6.1.4.1.11256.1.16.2.1.7.2 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.8.1 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.8.2 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.9.1 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.9.2 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.10.1 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.10.2 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.11.1 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.11.2 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.12.1 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.12.2 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.13.1 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.13.2 = STRING: "N/A" +.1.3.6.1.4.1.11256.1.16.2.1.14.1 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.15.2 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.14.1 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.16.2 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.16.1 = STRING: "Good" +.1.3.6.1.4.1.11256.1.16.2.1.17.2 = STRING: "Minor" +.1.3.6.1.4.1.11256.1.16.2.1.17.1 = STRING: "Good" +.1.3.6.1.4.1.11256.1.18.1.0 = STRING: "SN910" +.1.3.6.1.4.1.11256.1.18.2.0 = STRING: "5.2.0.dev" +.1.3.6.1.4.1.11256.1.18.3.0 = STRING: "" +.1.3.6.1.4.1.11256.1.18.4.0 = STRING: "" +.1.3.6.1.4.1.11256.1.18.5.0 = STRING: "fr" +.1.3.6.1.4.1.11256.1.18.6.0 = INTEGER: 10 +.1.3.6.1.4.1.11256.1.18.7.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.18.8.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.18.9.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.18.10.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.18.11.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.18.12.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.18.13.0 = INTEGER: 0 +.1.3.6.1.4.1.11256.1.18.14.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.18.15.0 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.18.16.0 = STRING: "None" +.1.3.6.1.4.1.11256.1.18.17.0 = STRING: "4.6.5" +.1.3.6.1.4.1.11256.1.21.1.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11256.1.21.1.1.1.2 = INTEGER: 2 +.1.3.6.1.4.1.11256.1.21.1.1.1.3 = INTEGER: 3 +.1.3.6.1.4.1.11256.1.21.1.1.1.4 = INTEGER: 4 +.1.3.6.1.4.1.11256.1.21.1.1.1.5 = INTEGER: 5 +.1.3.6.1.4.1.11256.1.21.1.1.1.6 = INTEGER: 6 +.1.3.6.1.4.1.11256.1.21.1.1.1.7 = INTEGER: 7 +.1.3.6.1.4.1.11256.1.21.1.1.1.8 = INTEGER: 8 +.1.3.6.1.4.1.11256.1.21.1.1.1.9 = INTEGER: 9 +.1.3.6.1.4.1.11256.1.21.1.1.1.10 = INTEGER: 10 +.1.3.6.1.4.1.11256.1.21.1.1.2.1 = STRING: "Update" +.1.3.6.1.4.1.11256.1.21.1.1.2.2 = STRING: "Pattern" +.1.3.6.1.4.1.11256.1.21.1.1.2.3 = STRING: "VirusVendor" +.1.3.6.1.4.1.11256.1.21.1.1.2.4 = STRING: "URLVendor" +.1.3.6.1.4.1.11256.1.21.1.1.2.5 = STRING: "SPAMVendor" +.1.3.6.1.4.1.11256.1.21.1.1.2.6 = STRING: "Sandboxing" +.1.3.6.1.4.1.11256.1.21.1.1.2.7 = STRING: "Warranty" +.1.3.6.1.4.1.11256.1.21.1.1.2.8 = STRING: "ExpressWarranty" +.1.3.6.1.4.1.11256.1.21.1.1.2.9 = STRING: "NotAfter" +.1.3.6.1.4.1.11256.1.21.1.1.2.10 = STRING: "Industrial" +.1.3.6.1.4.1.11256.1.21.1.1.3.1 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.21.1.1.3.2 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.21.1.1.3.3 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.21.1.1.3.4 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.21.1.1.3.5 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.21.1.1.3.6 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.21.1.1.3.7 = STRING: "2030-02-05" +.1.3.6.1.4.1.11256.1.21.1.1.3.8 = STRING: "0000-00-00" +.1.3.6.1.4.1.11256.1.21.1.1.3.9 = STRING: "2037-12-31" +.1.3.6.1.4.1.11256.1.21.1.1.3.10 = STRING: "2030-02-05" diff --git a/tests/network/stormshield/snmp/uptime.robot b/tests/network/stormshield/snmp/uptime.robot new file mode 100644 index 0000000000..69ceb2fc24 --- /dev/null +++ b/tests/network/stormshield/snmp/uptime.robot @@ -0,0 +1,46 @@ +*** Settings *** +Documentation network::stormshield::snmp::plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Ctn Generic Suite Setup +Suite Teardown Ctn Generic Suite Teardown +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} +... --plugin=network::stormshield::snmp::plugin +... --mode=uptime +... --hostname=${HOSTNAME} +... --snmp-port=${SNMPPORT} +... --snmp-version=${SNMPVERSION} +... --snmp-community=network/stormshield/snmp/sn910 + + +*** Test Cases *** +Uptime ${tc} + [Tags] network stormshield snmp + ${command} Catenate + ... ${CMD} + ... ${extra_options} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc + ... extra_options + ... expected_result + ... -- + ... 1 + ... ${EMPTY} + ... OK: Uptime: 71 days 20 hours 39 minutes 47 seconds | 'system.uptime.seconds'=6208787s;;;0; + ... 2 + ... --warning-uptime=1 + ... WARNING: Uptime: 71 days 20 hours 39 minutes 47 seconds | 'system.uptime.seconds'=6208787s;0:1;;0; + ... 3 + ... --critical-uptime=1 + ... CRITICAL: Uptime: 71 days 20 hours 39 minutes 47 seconds | 'system.uptime.seconds'=6208787s;;0:1;0; + ... 4 + ... --verbose + ... OK: Uptime: 71 days 20 hours 39 minutes 47 seconds | 'system.uptime.seconds'=6208787s;;;0; System Name: Model: SN910 Serial Number: Version: 5.2.0.dev Date: 2026-04-29 17:29:10 System Node Name: None Bios Version: 4.6.5 diff --git a/tests/resources/spellcheck/stopwords.txt b/tests/resources/spellcheck/stopwords.txt index e9375126d4..4a632542a3 100644 --- a/tests/resources/spellcheck/stopwords.txt +++ b/tests/resources/spellcheck/stopwords.txt @@ -237,6 +237,7 @@ nagios Nagios NagVis --nagvis-perfdata +Netasq Netconf Netscaler net-snmp