Release 20250300 (#5491)

This commit is contained in:
pkippes 2025-03-06 16:20:20 +01:00 committed by GitHub
commit 0634714531
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
120 changed files with 6202 additions and 1495 deletions

View File

@ -0,0 +1,141 @@
name: "test-cpan-libs"
description: "Test packaged CPAN libraries"
inputs:
package_extension:
description: "The package extension (deb or rpm)"
required: true
distrib:
description: "The distribution name"
required: true
arch:
description: "The architecture (amd64 or arm64)"
required: true
runs:
using: "composite"
steps:
- if: ${{ inputs.package_extension == 'rpm' }}
name: Install zstd, perl and Centreon repositories
run: |
dnf install -y zstd perl epel-release 'dnf-command(config-manager)' perl-App-cpanminus
dnf config-manager --set-enabled powertools || true # alma 8
dnf config-manager --set-enabled crb || true # alma 9
# Import Centreon GPG key
GPG_KEY_URL="https://yum-gpg.centreon.com/RPM-GPG-KEY-CES"
curl -sSL $GPG_KEY_URL -o RPM-GPG-KEY-CES
rpm --import RPM-GPG-KEY-CES
shell: bash
- if: ${{ inputs.package_extension == 'deb' }}
name: Install zstd, perl and Centreon repositories
run: |
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y zstd perl wget gpg apt-utils procps build-essential cpanminus
wget -O- https://apt-key.centreon.com | gpg --dearmor | tee /etc/apt/trusted.gpg.d/centreon.gpg > /dev/null 2>&1
# Avoid apt to clean packages cache directory
rm -f /etc/apt/apt.conf.d/docker-clean
apt-get update
shell: bash
- name: Restore packages from cache
uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
with:
path: ./*.${{ inputs.package_extension }}
key: ${{ github.sha }}-${{ github.run_id }}-${{ inputs.package_extension }}-${{ inputs.distrib }}
fail-on-cache-miss: true
- if: ${{ inputs.package_extension == 'rpm' }}
name: Check packages installation / uninstallation
run: |
error_log="install_error_${{ inputs.distrib }}_${{ inputs.arch }}.log"
for package in ./*.rpm; do
echo "Installing package: $package"
# List dependencies, and remove version and comparison operators
dependencies=$(rpm -qpR $package | sed 's/ [0-9.-]*\(\s\|$\)/ /g' | sed 's/ [<>!=]*\(\s\|$\)/ /g')
for dependency in $dependencies; do
# Skip non-perl dependencies
if [[ $dependency != perl* ]]; then
continue
else
echo "Check dependency: $dependency"
# Update the dependency name to match the package name
dependency=$(echo $dependency | sed 's/(/-/g' | sed 's/)//g' | sed 's/::/-/g')
fi
# If the dependency has been built in the same workflow, install it
if [[ -n $(find . -maxdepth 1 -regex "\.\/$dependency-[0-9v].*\.rpm") ]]; then
echo "Installing dependency: $dependency"
error_output=$(dnf install -y ./$dependency*.rpm 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the dependency $dependency" >> $error_log; true; }
fi
done
# Install package, then uninstall it with all his dependencies
echo "Package installation..."
error_output=$(dnf install -y $package 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the package $package" >> $error_log; true; }
echo "Package installation done."
script_name=$(echo $package | tr '[:upper:]' '[:lower:]' | sed 's/\.\/perl-//' | sed 's/-[0-9\.-]*.el[0-9]..*.rpm//')
if [[ -f ./tests/cpan-libraries/$script_name.pl ]]; then
echo "Testing package..."
error_output=$(perl tests/cpan-libraries/$script_name.pl 2>&1) || { echo "$error_output" >> $error_log; echo "Error during the usage test of the package $package" >> $error_log; true; }
echo "Testing done."
else
echo "No test script found for the package $package"
fi
echo "Package uninstallation..."
error_output=$(dnf autoremove --setopt=keepcache=True -y $(echo $package | sed 's/_[0-9].*\.rpm//' | sed 's/.\///') 2>&1) || { echo "$error_output" >> $error_log; echo "Error during autoremove of the package $package" >> $error_log; true; }
echo "Package uninstallation done."
done
# If the file error_log exists and is not empty, the workflow is in error
if [[ -s $error_log ]]; then
cat $error_log
exit 1
fi
shell: bash
- if: ${{ inputs.package_extension == 'deb' }}
name: Check packages installation / uninstallation
run: |
error_log="install_error_${{ inputs.distrib }}_${{ inputs.arch }}.log"
for package in ./*.deb; do
# If the debian package name ends with amd64 or arm64, we only install it if the tested architecture is the same, otherwise we skip it
if [[ $package == *amd64.deb && ${{ inputs.arch }} != "amd64" || $package == *arm64.deb && ${{ inputs.arch }} != "arm64" ]]; then
continue
fi
echo "Installing package: $package"
# List dependencies
dependencies=$(dpkg-deb -I $package | grep Depends | sed 's/Depends: //' | sed 's/,//g' | sed 's/(\(.*\)//g') || { echo "$error_output" >> $error_log; echo "Error while listing dependencies of the package $package" >> $error_log; true; }
for dependency in $dependencies; do
# If the dependency exists in the Debian repository, don't check the local dependencies
dependency_info=$(apt-cache policy $dependency)
if [[ -n $dependency_info ]]; then
echo "Dependency $dependency exists in debian repository."
else
# If the dependency has been built in the same workflow, install it
for dependency_package in $(find . -maxdepth 1 -regex "\.\/${dependency}_[0-9].*all\.deb" -o -regex "\.\/${dependency}_[0-9].*${{ inputs.arch }}\.deb"); do
echo "Installing dependency: $dependency_package"
error_output=$(apt-get install -y ./$dependency_package 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the dependency $dependency" >> $error_log; true; }
done
fi
done
# Install package, then uninstall it with all his dependencies
echo "Package installation..."
error_output=$(apt-get install -y $package 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the package $package" >> $error_log; true; }
echo "Package installation done."
script_name=$(echo $package | sed 's/.\/lib//' | sed 's/-perl_[0-9\.-]*-deb.*\.deb//')
if [[ -f ./tests/cpan-libraries/$script_name.pl ]]; then
echo "Testing package..."
error_output=$(perl tests/cpan-libraries/$script_name.pl 2>&1) || { echo "$error_output" >> $error_log; echo "Error during the usage test of the package $package" >> $error_log; true; }
echo "Testing done."
else
echo "No test script found for the package $package"
fi
echo "Package uninstallation..."
error_output=$(apt-get autoremove -y --purge $(echo $package | sed 's/_[0-9].*\.deb//' | sed 's/.\///') 2>&1) || { echo "$error_output" >> $error_log; echo "Error during autoremove of the package $package" >> $error_log; true; }
echo "Package uninstallation done."
done
# If the file error_log exists and is not empty, the workflow is in error
if [[ -s $error_log ]]; then
cat $error_log
exit 1
fi
shell: bash

View File

@ -4,7 +4,7 @@ updates:
directory: '/'
schedule:
interval: monthly
open-pull-requests-limit: 10
open-pull-requests-limit: 50
labels:
- 'dependencies'
- 'gha'

View File

@ -6,9 +6,9 @@ RUN bash -e <<EOF
dnf install -y \
git \
java-17-openjdk-devel \
wget \
zstd \
java-17-openjdk-devel
zstd
cd /usr/local/src
wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz

View File

@ -6,9 +6,9 @@ RUN bash -e <<EOF
dnf install -y \
git \
java-17-openjdk-devel \
wget \
zstd \
java-17-openjdk-devel
zstd
cd /usr/local/src
wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz

View File

@ -8,9 +8,9 @@ apt-get update
apt-get install -y \
ca-certificates \
git \
zstd \
maven=3.8.7-1 \
openjdk-17-jdk
openjdk-17-jdk \
zstd
echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' | tee /etc/apt/sources.list.d/goreleaser.list

View File

@ -8,9 +8,9 @@ apt-get update
apt-get install -y \
ca-certificates \
git \
zstd \
maven=3.6.3-5 \
openjdk-17-jdk
openjdk-17-jdk \
zstd
echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' | tee /etc/apt/sources.list.d/goreleaser.list

View File

@ -8,9 +8,9 @@ apt-get update
apt-get install -y \
ca-certificates \
git \
openjdk-17-jdk \
wget \
zstd \
openjdk-17-jdk
zstd
cd /usr/local/src
wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz

View File

@ -29,8 +29,8 @@ jobs:
- name: Check workflow files
run: |
${{ steps.get_actionlint.outputs.executable }} \
-ignore 'label "common" is unknown' \
-ignore 'label "veracode" is unknown' \
-ignore 'label "centreon-common" is unknown' \
-ignore 'label "centreon-collect-arm64" is unknown' \
-ignore '"github.head_ref" is potentially untrusted' \
-shellcheck= \
-pyflakes= \

View File

@ -20,7 +20,7 @@ jobs:
get-environment:
uses: ./.github/workflows/get-environment.yml
with:
version_file: as400/packaging/centreon-as400-daemon.yaml
version_file: as400/connector.as400/pom.xml
package:
needs: [get-environment]

View File

@ -45,7 +45,7 @@ jobs:
- runner: ubuntu-22.04
dockerfile: packaging-plugins-bullseye
image: packaging-plugins-bullseye
- runner: ["self-hosted", "collect-arm64"]
- runner: centreon-collect-arm64
dockerfile: packaging-plugins-bullseye
image: packaging-plugins-bullseye-arm64
- runner: ubuntu-22.04
@ -86,7 +86,7 @@ jobs:
- uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0
- uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6.13.0
with:
file: .github/docker/packaging/Dockerfile.${{ matrix.dockerfile }}
context: .

View File

@ -39,7 +39,7 @@ jobs:
- runner: ubuntu-24.04
dockerfile: bullseye
image: bullseye
- runner: ["self-hosted", "collect-arm64"]
- runner: centreon-collect-arm64
dockerfile: bullseye
image: bullseye-arm64
- runner: ubuntu-24.04
@ -71,7 +71,7 @@ jobs:
- uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0
- uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6.13.0
with:
file: .github/docker/testing/Dockerfile.testing-plugins-${{ matrix.dockerfile }}
context: .

View File

@ -39,7 +39,7 @@ jobs:
- runner: ubuntu-22.04
dockerfile: bullseye
image: bullseye
- runner: ["self-hosted", "collect-arm64"]
- runner: centreon-collect-arm64
dockerfile: bullseye
image: bullseye-arm64
- runner: ubuntu-22.04
@ -71,7 +71,7 @@ jobs:
- uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0
- uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6.13.0
with:
file: .github/docker/unit-tests/Dockerfile.unit-tests-${{ matrix.dockerfile }}
context: .

View File

@ -134,7 +134,7 @@ jobs:
- if: ${{ steps.has_skip_label.outputs.result == 'true' }}
name: Get push changes
id: get_push_changes
uses: tj-actions/changed-files@bab30c2299617f6615ec02a68b9a40d10bd21366 # v45.0.5
uses: tj-actions/changed-files@d6e91a2266cdb9d62096cebf1e8546899c6aa18f # v45.0.6
with:
since_last_remote_commit: true
json: true
@ -249,9 +249,11 @@ jobs:
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with:
script: |
const { execSync } = require('child_process');
let version = '';
if ('${{ steps.get_stability.outputs.stability }}' === 'testing') {
if ('${{ inputs.version_file }}'.match(/pom\.xml$/)) {
version = execSync(`grep -m 1 "<version>.*</version>" ${{ inputs.version_file }} | sed 's/.*<version>\\(.*\\)<\\/version>.*/\\1/'`).toString().trim();
} else if ('${{ steps.get_stability.outputs.stability }}' === 'testing') {
const branchName = "${{ github.head_ref || github.ref_name }}";
const matches = branchName.match(/^(?:release|hotfix)-(\d{8})$/);
if (matches) {

View File

@ -43,6 +43,7 @@ jobs:
"Config::AWS",
"Convert::Binary::C",
"Convert::EBCDIC",
"Crypt::Argon2",
"Crypt::Blowfish_PP",
"Crypt::OpenSSL::AES",
"DataStruct::Flat",
@ -52,15 +53,20 @@ jobs:
"Device::Modbus::RTU::Client",
"Device::Modbus::TCP::Client",
"Email::Send::SMTP::Gmail",
"Exporter::Tiny", # Required by JSON::Path: the version available in the official repositories doesn't work with the last version of JSON::Path
"FFI::CheckLib",
"FFI::Platypus",
"File::SearchPath",
"HTTP::ProxyPAC",
"JMX::Jmx4Perl",
"JSON::Path",
"Libssh::Session",
"LV",
"Mojo::IOLoop::Signal",
"MongoDB",
"MooseX::ClassAttribute",
"Net::Amazon::Signature::V4",
"Net::Curl",
"Net::DHCP",
"Net::FTPSSL",
"Net::HTTPTunnel",
@ -93,6 +99,7 @@ jobs:
- version: ""
- spec_file: ""
- no-auto-depends: "false"
- preinstall_cpanlibs: ""
- distrib: el8
package_extension: rpm
image: packaging-plugins-alma8
@ -101,6 +108,8 @@ jobs:
image: packaging-plugins-alma9
- name: "BSON"
rpm_provides: "perl(BSON::Bytes) perl(BSON::Code) perl(BSON::DBRef) perl(BSON::OID) perl(BSON::Raw) perl(BSON::Regex) perl(BSON::Time) perl(BSON::Timestamp) perl(BSON::Types) perl(BSON)"
- name: "Crypt::Argon2"
preinstall_cpanlibs: "Dist::Build"
- name: "DateTime::Format::Duration::ISO8601"
rpm_provides: "perl(DateTime-Format-Duration-ISO8601)"
- name: "Device::Modbus::RTU::Client"
@ -113,10 +122,14 @@ jobs:
rpm_provides: "perl(FFI::Platypus::Buffer) perl(FFI::Platypus::Memory)"
rpm_dependencies: "perl(Capture::Tiny) perl(FFI::CheckLib) perl(File::Spec::Functions) perl(IPC::Cmd) perl(JSON::PP) perl(List::Util) perl(autodie) perl(constant) perl(parent)"
no-auto-depends: "true"
- name: "Libssh::Session"
rpm_dependencies: "libssh"
- name: "Mojo::IOLoop::Signal"
rpm_dependencies: "perl-Mojolicious"
rpm_provides: "perl(Mojo::IOLoop::Signal)"
no-auto-depends: "true"
- name: "Net::Curl"
rpm_dependencies: "libcurl"
- name: "Net::DHCP"
rpm_provides: "perl(Net::DHCP::Constants) perl(Net::DHCP::Packet)"
- name: "Net::SMTPS"
@ -146,7 +159,28 @@ jobs:
steps:
- if: ${{ contains(matrix.build_distribs, matrix.distrib) }}
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- if: ${{ contains(matrix.build_distribs, matrix.distrib) }}
name: Get package infos
id: package-infos
run: |
cpan_info=$(cpanm --info ${{ matrix.name }})
if [ -z "${{ matrix.version }}" ]; then
CPAN_PACKAGE_VERSION=$(echo $cpan_info | sed 's/\.tar\.gz$//' | sed 's/.*\-//')
if [[ ! $CPAN_PACKAGE_VERSION =~ ^[v0-9]+\.[0-9]+ ]]; then
echo "::error::Invalid version number: ${CPAN_PACKAGE_VERSION}"
exit 1
fi
PACKAGE_VERSION="${CPAN_PACKAGE_VERSION}"
else
PACKAGE_VERSION="${{ matrix.version }}"
fi
echo "package_version=$(echo $PACKAGE_VERSION)" >> $GITHUB_OUTPUT
CPAN_PACKAGE_NAME=$(echo $cpan_info | sed 's/.*\///g' | sed 's/-[0-9\.]*\.tar\.gz//g')
PACKAGE_NAME="perl-$CPAN_PACKAGE_NAME"
echo "package_name=$(echo $PACKAGE_NAME)" >> $GITHUB_OUTPUT
shell: bash
- if: ${{ contains(matrix.build_distribs, matrix.distrib) }}
name: Check if package already exists
@ -155,8 +189,8 @@ jobs:
package_info=$(dnf provides 'perl(${{ matrix.name }})' 2>&1 | tr '[:upper:]' '[:lower:]' || true)
do_not_build="false"
if [[ ! $package_info =~ "no matches found" ]]; then
package_version=$(echo $package_info | grep -oP 'perl\(${{ matrix.name }}\) = \K[0-9]+\.[0-9]+')
if [[ -z "${{ matrix.version }}" || "$package_version" == "${{ matrix.version }}" ]]; then
package_version=$(echo $package_info | grep -oP "perl\($(echo ${{ matrix.name }} | tr '[:upper:]' '[:lower:]')\) = \K[0-9]+\.[0-9]+")
if [[ "$package_version" == "${{ steps.package-infos.outputs.package_version }}" || "v$package_version" == "${{ steps.package-infos.outputs.package_version }}" ]]; then
echo "::warning::Package ${{ matrix.name }} already exists in the official ${{ matrix.distrib }} repository with the same version."
do_not_build="true"
else
@ -169,11 +203,7 @@ jobs:
- if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_distribs, matrix.distrib) && matrix.spec_file == '' }}
run: |
if [ -z "${{ matrix.version }}" ]; then
PACKAGE_VERSION=""
else
PACKAGE_VERSION=" -v ${{ matrix.version }}"
fi
PACKAGE_VERSION=" -v ${{ steps.package-infos.outputs.package_version }}"
if [ -z "${{ matrix.rpm_dependencies }}" ]; then
PACKAGE_DEPENDENCIES=""
@ -195,9 +225,14 @@ jobs:
done
fi
for CPANLIB_PREINSTALL in `echo "${{ matrix.preinstall_cpanlibs }}"`; do
cpanm $CPANLIB_PREINSTALL
done
export SYBASE="/usr"
temp_file=$(mktemp)
echo "default.local" | tee /etc/mailname
created_package=$(fpm -s cpan -t ${{ matrix.package_extension }} --rpm-dist ${{ matrix.distrib }} --verbose --cpan-verbose --no-cpan-test$PACKAGE_DEPENDENCIES$PACKAGE_PROVIDES$PACKAGE_VERSION ${{ matrix.name }} | tee "$temp_file" | grep "Created package" | grep -oP '(?<=:path=>").*?(?=")')
# Check package name
if [ -z "$created_package" ]; then
@ -281,7 +316,7 @@ jobs:
- run: apt-get install -y zstd
shell: bash
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
@ -315,6 +350,7 @@ jobs:
"ARGV::Struct",
"Config::AWS",
"Convert::EBCDIC",
"Crypt::Argon2",
"Crypt::Blowfish_PP",
"Crypt::OpenSSL::AES",
"DataStruct::Flat",
@ -327,8 +363,10 @@ jobs:
"Hash::Ordered",
"HTTP::ProxyPAC",
"JMX::Jmx4Perl",
"Libssh::Session",
"Mojo::IOLoop::Signal",
"Net::Amazon::Signature::V4",
"Net::Curl",
"Net::FTPSSL",
"Net::HTTPTunnel",
"Net::MQTT::Simple",
@ -346,6 +384,8 @@ jobs:
- rpm_provides: ""
- version: ""
- use_dh_make_perl: "true"
- no-auto-depends: "false"
- preinstall_cpanlibs: ""
- build_name: bullseye-amd64
distrib: bullseye
package_extension: deb
@ -363,7 +403,13 @@ jobs:
package_extension: deb
image: packaging-plugins-bullseye-arm64
arch: arm64
runner_name: ["self-hosted", "collect-arm64"]
runner_name: centreon-collect-arm64
- name: "Crypt::Argon2"
build_names: "bullseye-amd64,jammy,bullseye-arm64"
preinstall_cpanlibs: "Dist::Build"
use_dh_make_perl: "false"
no-auto-depends: "true"
deb_dependencies: "libexporter-tiny-perl libtime-hires-perl libxsloader-perl"
- name: "Crypt::OpenSSL::AES"
use_dh_make_perl: "false"
deb_dependencies: "libexporter-tiny-perl libxs-install-perl"
@ -375,8 +421,18 @@ jobs:
build_names: "bookworm"
- name: "Digest::SHA1"
build_names: "jammy"
- name: "Libssh::Session"
use_dh_make_perl: "false"
build_names: "bullseye-amd64,bookworm,jammy,bullseye-arm64"
no-auto-depends: "true"
deb_dependencies: "libcarp-assert-perl libdynaloader-functions-perl libexporter-tiny-perl libdevel-overloadinfo-perl libssh-4 libc6"
- name: "Net::Amazon::Signature::V4"
build_names: ["bullseye-amd64", "jammy"]
- name: "Net::Curl"
use_dh_make_perl: "false"
build_names: "bullseye-amd64,bookworm,jammy,bullseye-arm64"
no-auto-depends: "true"
deb_dependencies: "libcarp-assert-perl libdynaloader-functions-perl libexporter-tiny-perl libdevel-overloadinfo-perl libcurl4"
- name: "Net::MQTT::Simple"
version: "1.29"
- name: "Paws"
@ -400,7 +456,7 @@ jobs:
steps:
- if: ${{ contains(matrix.build_names, matrix.build_name) }}
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- if: ${{ contains(matrix.build_names, matrix.build_name) }}
name: Parse distrib name
@ -416,8 +472,8 @@ jobs:
apt-get update
cpan_info=$(cpanm --info ${{ matrix.name }})
if [ -z "${{ matrix.version }}" ]; then
CPAN_PACKAGE_VERSION=$(echo $cpan_info | sed 's/\.tar\.gz$//' | sed 's/.*\-//' | sed 's/v//')
if [[ ! $CPAN_PACKAGE_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then
CPAN_PACKAGE_VERSION=$(echo $cpan_info | sed 's/\.tar\.gz$//' | sed 's/.*\-//')
if [[ ! $CPAN_PACKAGE_VERSION =~ ^[v0-9]+\.[0-9]+ ]]; then
echo "::error::Invalid version number: ${CPAN_PACKAGE_VERSION}"
exit 1
fi
@ -442,7 +498,7 @@ jobs:
do_not_build="false"
if [[ -n $package_info ]]; then
candidate_version=$(echo "$package_info" | grep 'Candidate:' | awk '{print $2}')
if [[ "$candidate_version" == "${{ steps.package-infos.outputs.package_version }}"* ]]; then
if [[ "$candidate_version" == "${{ steps.package-infos.outputs.package_version }}"* || "v$candidate_version" == "${{ steps.package-infos.outputs.package_version }}"* ]]; then
echo "::warning::Package ${{ steps.package-infos.outputs.package_name }} already exists in the official ${{ matrix.distrib }} repository with the same version."
do_not_build="true"
else
@ -455,6 +511,10 @@ jobs:
- if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_names, matrix.build_name) && matrix.use_dh_make_perl == 'false' }}
run: |
# Install needed cpan libs
for CPANLIB_PREINSTALL in `echo "${{ matrix.preinstall_cpanlibs }}"`; do
cpanm $CPANLIB_PREINSTALL
done
if [ -z "${{ matrix.deb_dependencies }}" ]; then
PACKAGE_DEPENDENCIES=""
else
@ -467,6 +527,7 @@ jobs:
fi
temp_file=$(mktemp)
echo "default.local" | tee /etc/mailname
created_package=$(fpm -s cpan -t ${{ matrix.package_extension }} --deb-dist ${{ matrix.distrib }} --iteration ${{ steps.parse-distrib.outputs.package_distrib_name }} --verbose --cpan-verbose --no-cpan-test$PACKAGE_DEPENDENCIES -v ${{ steps.package-infos.outputs.package_version }} ${{ matrix.name }} | tee "$temp_file" | grep "Created package" | grep -oP '(?<=:path=>").*?(?=")') || { echo "Error: fpm command failed"; exit 1; }
# Check package name
if [ -z "$created_package" ]; then
@ -479,11 +540,15 @@ jobs:
- if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_names, matrix.build_name) && matrix.use_dh_make_perl == 'true' }}
run: |
# Install needed cpan libs
for CPANLIB_PREINSTALL in `echo "${{ matrix.preinstall_cpanlibs }}"`; do
cpanm $CPANLIB_PREINSTALL
done
temp_file=$(mktemp)
created_package=$(DEB_BUILD_OPTIONS="nocheck nodocs notest" dh-make-perl make --dist ${{ matrix.distrib }} --build --version ${{ steps.package-infos.outputs.package_version }}${{ steps.parse-distrib.outputs.package_distrib_separator }}${{ steps.parse-distrib.outputs.package_distrib_name }} --cpan ${{ matrix.name }} | tee "$temp_file" | grep "building package" | grep -oP "(?<=in '..\/).*.deb(?=')") || { echo "Error: dh-make-perl command failed"; exit 1; }
# Check package name
if [ -z "$created_package" ]; then
echo "Error: fpm command failed"
echo "Error: dh-make-perl command failed"
exit 1
fi
# Check deb
@ -587,7 +652,7 @@ jobs:
image: debian:bullseye
distrib: bullseye
arch: arm64
runner_name: ["self-hosted", "collect-arm64"]
runner_name: centreon-collect-arm64
runs-on: ${{ matrix.runner_name }}
container:
@ -595,114 +660,15 @@ jobs:
name: Test perl CPAN libs packages on ${{ matrix.package_extension }} ${{ matrix.distrib }} ${{ matrix.arch }}
steps:
- if: ${{ matrix.package_extension == 'rpm' }}
name: Install zstd, perl and Centreon repositories
run: |
dnf install -y zstd perl epel-release 'dnf-command(config-manager)'
dnf config-manager --set-enabled powertools || true # alma 8
dnf config-manager --set-enabled crb || true # alma 9
# Import Centreon GPG key
GPG_KEY_URL="https://yum-gpg.centreon.com/RPM-GPG-KEY-CES"
curl -sSL $GPG_KEY_URL -o RPM-GPG-KEY-CES
rpm --import RPM-GPG-KEY-CES
shell: bash
- if: ${{ matrix.package_extension == 'deb' }}
name: Install zstd, perl and Centreon repositories
run: |
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y zstd perl wget gpg apt-utils procps
wget -O- https://apt-key.centreon.com | gpg --dearmor | tee /etc/apt/trusted.gpg.d/centreon.gpg > /dev/null 2>&1
# Avoid apt to clean packages cache directory
rm -f /etc/apt/apt.conf.d/docker-clean
apt-get update
shell: bash
- uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- name: Restore packages from cache
uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
- name: Test packaged libs
uses: ./.github/actions/test-cpan-libs
with:
path: ./*.${{ matrix.package_extension }}
key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }}
fail-on-cache-miss: true
- if: ${{ matrix.package_extension == 'rpm' }}
name: Install packages
run: |
error_log="install_error_${{ matrix.distrib }}_${{ matrix.arch }}.log"
for package in ./*.rpm; do
echo "Installing package: $package"
# List dependencies, and remove version and comparison operators
dependencies=$(rpm -qpR $package | sed 's/ [0-9.-]*\(\s\|$\)/ /g' | sed 's/ [<>!=]*\(\s\|$\)/ /g')
for dependency in $dependencies; do
# Skip non-perl dependencies
if [[ $dependency != perl* ]]; then
continue
else
echo "Check dependency: $dependency"
# Update the dependency name to match the package name
dependency=$(echo $dependency | sed 's/(/-/g' | sed 's/)//g' | sed 's/::/-/g')
fi
# If the dependency has been built in the same workflow, install it
if [[ -n $(find . -maxdepth 1 -regex "\.\/$dependency-[0-9v].*\.rpm") ]]; then
echo "Installing dependency: $dependency"
error_output=$(dnf install -y ./$dependency*.rpm 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the dependency $dependency" >> $error_log; true; }
fi
done
# Install package, then uninstall it with all his dependencies
echo "Package installation..."
error_output=$(dnf install -y $package 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the package $package" >> $error_log; true; }
echo "Package installation done."
echo "Package uninstallation..."
error_output=$(dnf autoremove --setopt=keepcache=True -y $(echo $package | sed 's/_[0-9].*\.rpm//' | sed 's/.\///') 2>&1) || { echo "$error_output" >> $error_log; echo "Error during autoremove of the package $package" >> $error_log; true; }
echo "Package uninstallation done."
done
# If the file error_log exists and is not empty, the workflow is in error
if [[ -s $error_log ]]; then
cat $error_log
exit 1
fi
shell: bash
- if: ${{ matrix.package_extension == 'deb' }}
name: Install packages
run: |
error_log="install_error_${{ matrix.distrib }}_${{ matrix.arch }}.log"
for package in ./*.deb; do
# If the debian package name ends with amd64 or arm64, we only install it if the tested architecture is the same, otherwise we skip it
if [[ $package == *amd64.deb && ${{ matrix.arch }} != "amd64" || $package == *arm64.deb && ${{ matrix.arch }} != "arm64" ]]; then
continue
fi
echo "Installing package: $package"
# List dependencies
dependencies=$(dpkg-deb -I $package | grep Depends | sed 's/Depends: //' | sed 's/,//g' | sed 's/(\(.*\)//g') || { echo "$error_output" >> $error_log; echo "Error while listing dependencies of the package $package" >> $error_log; true; }
for dependency in $dependencies; do
# If the dependency exists in the Debian repository, don't check the local dependencies
dependency_info=$(apt-cache policy $dependency)
if [[ -n $dependency_info ]]; then
echo "Dependency $dependency exists in debian repository."
else
# If the dependency has been built in the same workflow, install it
for dependency_package in $(find . -maxdepth 1 -regex "\.\/${dependency}_[0-9].*all\.deb" -o -regex "\.\/${dependency}_[0-9].*${{ matrix.arch }}\.deb"); do
echo "Installing dependency: $dependency_package"
error_output=$(apt-get install -y ./$dependency_package 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the dependency $dependency" >> $error_log; true; }
done
fi
done
# Install package, then uninstall it with all his dependencies
echo "Package installation..."
error_output=$(apt-get install -y $package 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the package $package" >> $error_log; true; }
echo "Package installation done."
echo "Package uninstallation..."
error_output=$(apt-get autoremove -y --purge $(echo $package | sed 's/_[0-9].*\.deb//' | sed 's/.\///') 2>&1) || { echo "$error_output" >> $error_log; echo "Error during autoremove of the package $package" >> $error_log; true; }
echo "Package uninstallation done."
done
# If the file error_log exists and is not empty, the workflow is in error
if [[ -s $error_log ]]; then
cat $error_log
exit 1
fi
shell: bash
package_extension: ${{ matrix.package_extension }}
distrib: ${{ matrix.distrib }}
arch: ${{ matrix.arch }}
- name: Upload error log
if: failure()

View File

@ -1,201 +0,0 @@
name: perl-crypt-argon2
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
workflow_dispatch:
pull_request:
paths:
- "dependencies/perl-crypt-argon2/**"
push:
branches:
- develop
- dev-[2-9][0-9].[0-9][0-9].x
- master
- "[2-9][0-9].[0-9][0-9].x"
paths:
- "dependencies/perl-crypt-argon2/**"
tags:
- perl-crypt-argon2-*
jobs:
get-environment:
uses: ./.github/workflows/get-environment.yml
package:
needs: [get-environment]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
needs.get-environment.outputs.stability != 'stable'
strategy:
fail-fast: false
matrix:
include:
- image: packaging-plugins-alma8
distrib: el8
package_extension: rpm
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-alma9
distrib: el9
package_extension: rpm
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-bullseye
distrib: bullseye
package_extension: deb
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-bookworm
distrib: bookworm
package_extension: deb
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-jammy
distrib: jammy
package_extension: deb
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-bullseye-arm64
distrib: bullseye
package_extension: deb
runner: ["self-hosted", "collect-arm64"]
arch: arm64
runs-on: ${{ matrix.runner }}
container:
image: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/${{ matrix.image }}:latest
credentials:
username: ${{ secrets.HARBOR_CENTREON_PULL_USERNAME }}
password: ${{ secrets.HARBOR_CENTREON_PULL_TOKEN }}
name: package ${{ matrix.distrib }} ${{ matrix.arch }}
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Install locally Crypt::Argon2
run: |
if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
apt-get update
apt-get install -y cpanminus gcc
else
dnf install -y cpanminus gcc
fi
cpanm -v -l /tmp Crypt::Argon2@0.020
shell: bash
- name: Set package name and paths according to distrib
run: |
PERL_VERSION=$(perl -E "say $^V" | sed -E "s/v([0-9]+\.[0-9]+).+/\1/g")
echo "Perl version is $PERL_VERSION"
if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
NAME="libcrypt-argon2-perl"
if [ "${{ matrix.arch }}" = "amd64" ]; then
PERL_VENDORARCH="/usr/lib/x86_64-linux-gnu/perl/$PERL_VERSION"
else
PERL_VENDORARCH="/usr/lib/aarch64-linux-gnu/perl/$PERL_VERSION"
fi
else
NAME="perl-Crypt-Argon2"
if [ "${{ matrix.distrib }}" = "el8" ]; then
PERL_VENDORARCH="/usr/local/lib64/perl5"
else
PERL_VENDORARCH="/usr/local/lib64/perl5/$PERL_VERSION"
fi
fi
sed -i "s/@NAME@/$NAME/g" dependencies/perl-crypt-argon2/perl-crypt-argon2.yaml
sed -i "s#@PERL_VENDORARCH@#$PERL_VENDORARCH#g" dependencies/perl-crypt-argon2/perl-crypt-argon2.yaml
cat dependencies/perl-crypt-argon2/perl-crypt-argon2.yaml
shell: bash
- name: Package
uses: ./.github/actions/package-nfpm
with:
nfpm_file_pattern: "dependencies/perl-crypt-argon2/perl-crypt-argon2.yaml"
distrib: ${{ matrix.distrib }}
package_extension: ${{ matrix.package_extension }}
arch: ${{ matrix.arch }}
release: 1
commit_hash: ${{ github.sha }}
cache_key: cache-${{ github.sha }}-${{ matrix.package_extension }}-perl-crypt-argon2-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }}
rpm_gpg_key: ${{ secrets.RPM_GPG_SIGNING_KEY }}
rpm_gpg_signing_key_id: ${{ secrets.RPM_GPG_SIGNING_KEY_ID }}
rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }}
stability: ${{ needs.get-environment.outputs.stability }}
# set condition to true if artifacts are needed
- if: ${{ false }}
name: Upload package artifacts
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
with:
name: packages-${{ matrix.distrib }}-${{ matrix.arch }}
path: ./*.${{ matrix.package_extension}}
retention-days: 1
deliver-packages:
needs: [get-environment, package]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
(contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) || ( needs.get-environment.outputs.stability == 'stable' && github.event_name != 'workflow_dispatch')) &&
! cancelled() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
include:
- distrib: el8
package_extension: rpm
arch: amd64
- distrib: el9
package_extension: rpm
arch: amd64
- distrib: bullseye
package_extension: deb
arch: amd64
- distrib: bullseye
package_extension: deb
arch: arm64
- distrib: bookworm
package_extension: deb
arch: amd64
- distrib: jammy
package_extension: deb
arch: amd64
name: deliver ${{ matrix.distrib }} ${{ matrix.arch }}
steps:
- name: Checkout sources
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- name: Delivery
uses: ./.github/actions/package-delivery
with:
module_name: perl-crypt-argon2-${{ matrix.arch }}
distrib: ${{ matrix.distrib }}
arch: ${{ matrix.arch }}
cache_key: cache-${{ github.sha }}-rpm-perl-crypt-argon2-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }}
stability: ${{ needs.get-environment.outputs.stability }}
release_type: ${{ needs.get-environment.outputs.release_type }}
artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
set-skip-label:
needs: [get-environment, deliver-packages]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
! cancelled() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
uses: ./.github/workflows/set-pull-request-skip-label.yml

View File

@ -1,177 +0,0 @@
name: perl-json-path
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
workflow_dispatch:
pull_request:
paths:
- "dependencies/perl-json-path/**"
- ".github/workflows/perl-json-path.yml"
push:
branches:
- develop
- dev-[2-9][0-9].[0-9][0-9].x
- master
- "[2-9][0-9].[0-9][0-9].x"
paths:
- "dependencies/perl-json-path/**"
- ".github/workflows/perl-json-path.yml"
jobs:
get-environment:
uses: ./.github/workflows/get-environment.yml
package:
needs: [get-environment]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
needs.get-environment.outputs.stability != 'stable'
strategy:
fail-fast: false
matrix:
include:
- image: packaging-plugins-alma8
distrib: el8
package_extension: rpm
- image: packaging-plugins-alma9
distrib: el9
package_extension: rpm
- image: packaging-plugins-bullseye
distrib: bullseye
package_extension: deb
- image: packaging-plugins-bookworm
distrib: bookworm
package_extension: deb
- image: packaging-plugins-jammy
distrib: jammy
package_extension: deb
runs-on: ubuntu-22.04
container:
image: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/${{ matrix.image }}:latest
credentials:
username: ${{ secrets.HARBOR_CENTREON_PULL_USERNAME }}
password: ${{ secrets.HARBOR_CENTREON_PULL_TOKEN }}
name: package ${{ matrix.distrib }}
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Install locally JSON::Path
run: |
if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
apt-get update
apt-get install -y cpanminus gcc
else
dnf install -y cpanminus gcc
fi
cpanm -v -l /tmp JSON::Path@1.0.4
shell: bash
- name: Set package name and paths according to distrib
run: |
VERSION="1.0.4"
PERL_VERSION=$(perl -E "say $^V" | sed -E "s/v([0-9]+\.[0-9]+).+/\1/g")
echo "Perl version is $PERL_VERSION"
if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
NAME="libjson-path-perl"
PERL_VENDORLIB="/usr/share/perl5"
else
NAME="perl-JSON-Path"
if [ "${{ matrix.distrib }}" = "el8" ]; then
PERL_VENDORLIB="/usr/local/share/perl5"
else
PERL_VENDORLIB="/usr/local/share/perl5/$PERL_VERSION"
fi
fi
sed -i "s/@NAME@/$NAME/g" dependencies/perl-json-path/perl-json-path.yaml
sed -i "s/@VERSION@/$VERSION/g" dependencies/perl-json-path/perl-json-path.yaml
sed -i "s#@PERL_VENDORLIB@#$PERL_VENDORLIB#g" dependencies/perl-json-path/perl-json-path.yaml
cat dependencies/perl-json-path/perl-json-path.yaml
shell: bash
- name: Package
uses: ./.github/actions/package-nfpm
with:
nfpm_file_pattern: "dependencies/perl-json-path/perl-json-path.yaml"
distrib: ${{ matrix.distrib }}
package_extension: ${{ matrix.package_extension }}
release: 3
arch: all
commit_hash: ${{ github.sha }}
cache_key: cache-${{ github.sha }}-${{ matrix.package_extension }}-perl-json-path-${{ matrix.distrib }}-${{ github.head_ref || github.ref_name }}
rpm_gpg_key: ${{ secrets.RPM_GPG_SIGNING_KEY }}
rpm_gpg_signing_key_id: ${{ secrets.RPM_GPG_SIGNING_KEY_ID }}
rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }}
stability: ${{ needs.get-environment.outputs.stability }}
# set condition to true if artifacts are needed
- if: ${{ false }}
name: Upload package artifacts
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
with:
name: packages-${{ matrix.distrib }}
path: ./*.${{ matrix.package_extension}}
retention-days: 1
deliver-packages:
needs: [get-environment, package]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
(contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) || ( needs.get-environment.outputs.stability == 'stable' && github.event_name != 'workflow_dispatch')) &&
! cancelled() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
include:
- distrib: el8
package_extension: rpm
- distrib: el9
package_extension: rpm
- distrib: bullseye
package_extension: deb
- distrib: bookworm
package_extension: deb
- distrib: jammy
package_extension: deb
name: deliver ${{ matrix.distrib }}
steps:
- name: Checkout sources
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- name: Delivery
uses: ./.github/actions/package-delivery
with:
module_name: perl-json-path
distrib: ${{ matrix.distrib }}
cache_key: cache-${{ github.sha }}-${{ matrix.package_extension }}-perl-json-path-${{ matrix.distrib }}-${{ github.head_ref || github.ref_name }}
stability: ${{ needs.get-environment.outputs.stability }}
release_type: ${{ needs.get-environment.outputs.release_type }}
artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
set-skip-label:
needs: [get-environment, deliver-packages]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
! cancelled() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
uses: ./.github/workflows/set-pull-request-skip-label.yml

View File

@ -1,199 +0,0 @@
name: perl-libssh-session
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
workflow_dispatch:
pull_request:
paths:
- "dependencies/perl-libssh-session/**"
push:
branches:
- develop
- dev-[2-9][0-9].[0-9][0-9].x
- master
- "[2-9][0-9].[0-9][0-9].x"
paths:
- "dependencies/perl-libssh-session/**"
jobs:
get-environment:
uses: ./.github/workflows/get-environment.yml
package:
needs: [get-environment]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
needs.get-environment.outputs.stability != 'stable'
strategy:
fail-fast: false
matrix:
include:
- image: packaging-plugins-alma8
distrib: el8
package_extension: rpm
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-alma9
distrib: el9
package_extension: rpm
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-bullseye
distrib: bullseye
package_extension: deb
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-bookworm
distrib: bookworm
package_extension: deb
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-jammy
distrib: jammy
package_extension: deb
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-bullseye-arm64
distrib: bullseye
package_extension: deb
runner: ["self-hosted", "collect-arm64"]
arch: arm64
runs-on: ${{ matrix.runner }}
container:
image: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/${{ matrix.image }}:latest
credentials:
username: ${{ secrets.HARBOR_CENTREON_PULL_USERNAME }}
password: ${{ secrets.HARBOR_CENTREON_PULL_TOKEN }}
name: package ${{ matrix.distrib }} ${{ matrix.arch }}
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Install locally Libssh::Session
run: |
if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
apt-get update
apt-get install -y cpanminus gcc libssh-dev
else
dnf install -y cpanminus gcc libssh-devel
fi
cpanm -v -l /tmp Libssh::Session@0.8
shell: bash
- name: Set package name and paths according to distrib
run: |
PERL_VERSION=$(perl -E "say $^V" | sed -E "s/v([0-9]+\.[0-9]+).+/\1/g")
echo "Perl version is $PERL_VERSION"
if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
NAME="libssh-session-perl"
if [ "${{ matrix.arch }}" = "amd64" ]; then
PERL_VENDORARCH="/usr/lib/x86_64-linux-gnu/perl/$PERL_VERSION"
else
PERL_VENDORARCH="/usr/lib/aarch64-linux-gnu/perl/$PERL_VERSION"
fi
else
NAME="perl-Libssh-Session"
if [ "${{ matrix.distrib }}" = "el8" ]; then
PERL_VENDORARCH="/usr/local/lib64/perl5"
else
PERL_VENDORARCH="/usr/local/lib64/perl5/$PERL_VERSION"
fi
fi
sed -i "s/@NAME@/$NAME/g" dependencies/perl-libssh-session/perl-libssh-session.yaml
sed -i "s#@PERL_VENDORARCH@#$PERL_VENDORARCH#g" dependencies/perl-libssh-session/perl-libssh-session.yaml
cat dependencies/perl-libssh-session/perl-libssh-session.yaml
shell: bash
- name: Package
uses: ./.github/actions/package-nfpm
with:
nfpm_file_pattern: "dependencies/perl-libssh-session/perl-libssh-session.yaml"
distrib: ${{ matrix.distrib }}
package_extension: ${{ matrix.package_extension }}
arch: ${{ matrix.arch }}
release: 5
commit_hash: ${{ github.sha }}
cache_key: cache-${{ github.sha }}-${{ matrix.package_extension }}-perl-libssh-session-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }}
rpm_gpg_key: ${{ secrets.RPM_GPG_SIGNING_KEY }}
rpm_gpg_signing_key_id: ${{ secrets.RPM_GPG_SIGNING_KEY_ID }}
rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }}
stability: ${{ needs.get-environment.outputs.stability }}
# set condition to true if artifacts are needed
- if: ${{ false }}
name: Upload package artifacts
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
with:
name: packages-${{ matrix.distrib }}-${{ matrix.arch }}
path: ./*.${{ matrix.package_extension}}
retention-days: 1
deliver-packages:
needs: [get-environment, package]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
(contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) || ( needs.get-environment.outputs.stability == 'stable' && github.event_name != 'workflow_dispatch')) &&
! cancelled() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
include:
- distrib: el8
package_extension: rpm
arch: amd64
- distrib: el9
package_extension: rpm
arch: amd64
- distrib: bullseye
package_extension: deb
arch: amd64
- distrib: bullseye
package_extension: deb
arch: arm64
- distrib: bookworm
package_extension: deb
arch: amd64
- distrib: jammy
package_extension: deb
arch: amd64
name: deliver ${{ matrix.distrib }} ${{ matrix.arch }}
steps:
- name: Checkout sources
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- name: Delivery
uses: ./.github/actions/package-delivery
with:
module_name: perl-libssh-session-${{ matrix.arch }}
distrib: ${{ matrix.distrib }}
arch: ${{ matrix.arch }}
cache_key: cache-${{ github.sha }}-${{ matrix.package_extension }}-perl-libssh-session-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }}
stability: ${{ needs.get-environment.outputs.stability }}
release_type: ${{ needs.get-environment.outputs.release_type }}
artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
set-skip-label:
needs: [get-environment, deliver-packages]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
! cancelled() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
uses: ./.github/workflows/set-pull-request-skip-label.yml

View File

@ -1,199 +0,0 @@
name: perl-net-curl
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
workflow_dispatch:
pull_request:
paths:
- "dependencies/perl-net-curl/**"
push:
branches:
- develop
- dev-[2-9][0-9].[0-9][0-9].x
- master
- "[2-9][0-9].[0-9][0-9].x"
paths:
- "dependencies/perl-net-curl/**"
jobs:
get-environment:
uses: ./.github/workflows/get-environment.yml
package:
needs: [get-environment]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
needs.get-environment.outputs.stability != 'stable'
strategy:
fail-fast: false
matrix:
include:
- image: packaging-plugins-alma8
distrib: el8
package_extension: rpm
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-alma9
distrib: el9
package_extension: rpm
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-bullseye
distrib: bullseye
package_extension: deb
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-bookworm
distrib: bookworm
package_extension: deb
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-jammy
distrib: jammy
package_extension: deb
runner: ubuntu-22.04
arch: amd64
- image: packaging-plugins-bullseye-arm64
distrib: bullseye
package_extension: deb
runner: ["self-hosted", "collect-arm64"]
arch: arm64
runs-on: ${{ matrix.runner }}
container:
image: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/${{ matrix.image }}:latest
credentials:
username: ${{ secrets.HARBOR_CENTREON_PULL_USERNAME }}
password: ${{ secrets.HARBOR_CENTREON_PULL_TOKEN }}
name: package ${{ matrix.distrib }} ${{ matrix.arch }}
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Install locally Net::Curl
run: |
if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
apt-get update
apt-get install -y libcurl4-openssl-dev cpanminus gcc
else
dnf install -y libcurl-devel cpanminus gcc
fi
cpanm -v -l /tmp Net::Curl@0.55
shell: bash
- name: Set package name and paths according to distrib
run: |
PERL_VERSION=$(perl -E "say $^V" | sed -E "s/v([0-9]+\.[0-9]+).+/\1/g")
echo "Perl version is $PERL_VERSION"
if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
NAME="libnet-curl-perl"
if [ "${{ matrix.arch }}" = "amd64" ]; then
PERL_VENDORARCH="/usr/lib/x86_64-linux-gnu/perl/$PERL_VERSION"
else
PERL_VENDORARCH="/usr/lib/aarch64-linux-gnu/perl/$PERL_VERSION"
fi
else
NAME="perl-Net-Curl"
if [ "${{ matrix.distrib }}" = "el8" ]; then
PERL_VENDORARCH="/usr/local/lib64/perl5"
else
PERL_VENDORARCH="/usr/local/lib64/perl5/$PERL_VERSION"
fi
fi
sed -i "s/@NAME@/$NAME/g" dependencies/perl-net-curl/perl-net-curl.yaml
sed -i "s#@PERL_VENDORARCH@#$PERL_VENDORARCH#g" dependencies/perl-net-curl/perl-net-curl.yaml
cat dependencies/perl-net-curl/perl-net-curl.yaml
shell: bash
- name: Package
uses: ./.github/actions/package-nfpm
with:
nfpm_file_pattern: "dependencies/perl-net-curl/perl-net-curl.yaml"
distrib: ${{ matrix.distrib }}
package_extension: ${{ matrix.package_extension }}
arch: ${{ matrix.arch }}
commit_hash: ${{ github.sha }}
release: 1
cache_key: cache-${{ github.sha }}-${{ matrix.package_extension }}-perl-net-curl-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }}
rpm_gpg_key: ${{ secrets.RPM_GPG_SIGNING_KEY }}
rpm_gpg_signing_key_id: ${{ secrets.RPM_GPG_SIGNING_KEY_ID }}
rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }}
stability: ${{ needs.get-environment.outputs.stability }}
# set condition to true if artifacts are needed
- if: ${{ false }}
name: Upload package artifacts
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
with:
name: packages-${{ matrix.distrib }}-${{ matrix.arch }}
path: ./*.${{ matrix.package_extension }}
retention-days: 1
deliver-packages:
needs: [get-environment, package]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
(contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) || ( needs.get-environment.outputs.stability == 'stable' && github.event_name != 'workflow_dispatch')) &&
! cancelled() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
include:
- distrib: el8
package_extension: rpm
arch: amd64
- distrib: el9
package_extension: rpm
arch: amd64
- distrib: bullseye
package_extension: deb
arch: amd64
- distrib: bullseye
package_extension: deb
arch: arm64
- distrib: bookworm
package_extension: deb
arch: amd64
- distrib: jammy
package_extension: deb
arch: amd64
name: deliver ${{ matrix.distrib }}
steps:
- name: Checkout sources
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- name: Delivery
uses: ./.github/actions/package-delivery
with:
module_name: perl-net-curl-${{ matrix.arch }}
distrib: ${{ matrix.distrib }}
arch: ${{ matrix.arch }}
cache_key: cache-${{ github.sha }}-${{ matrix.package_extension }}-perl-net-curl-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }}
stability: ${{ needs.get-environment.outputs.stability }}
release_type: ${{ needs.get-environment.outputs.release_type }}
artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
set-skip-label:
needs: [get-environment, deliver-packages]
if: |
needs.get-environment.outputs.skip_workflow == 'false' &&
! cancelled() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
uses: ./.github/workflows/set-pull-request-skip-label.yml

View File

@ -58,7 +58,7 @@ jobs:
- image: packaging-plugins-bullseye-arm64
distrib: bullseye
package_extension: deb
runner: ["self-hosted", "collect-arm64"]
runner: centreon-collect-arm64
arch: arm64
runs-on: ${{ matrix.runner }}

View File

@ -85,7 +85,7 @@ jobs:
- package_extension: deb
image: packaging-plugins-bullseye-arm64
distrib: bullseye
runner: ["self-hosted", "collect-arm64"]
runner: centreon-collect-arm64
arch: arm64
runs-on: ${{ matrix.runner }}

View File

@ -37,7 +37,7 @@ jobs:
with:
fetch-depth: 0
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0
with:
python-version: '3.9'
@ -112,7 +112,7 @@ jobs:
distrib: bullseye
- package_extension: deb
image: unit-tests-bullseye-arm64
runner_name: ["self-hosted", "collect-arm64"]
runner_name: centreon-collect-arm64
distrib: bullseye
- package_extension: deb
image: unit-tests-bookworm
@ -157,7 +157,7 @@ jobs:
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Prepare FatPacker
uses: shogo82148/actions-setup-perl@98dfedee230bcf1ee68d5b021931fc8d63f2016e # v1.31.4
uses: shogo82148/actions-setup-perl@49c14f24551d2de3bf56fb107a869c3760b1875e # v1.33.0
with:
perl-version: '5.34'
install-modules-with: cpm
@ -333,7 +333,7 @@ jobs:
image: testing-plugins-bullseye-arm64
distrib: bullseye
arch: arm64
runner_name: ["self-hosted", "collect-arm64"]
runner_name: centreon-collect-arm64
runs-on: ${{ matrix.runner_name }}
container:
@ -406,7 +406,7 @@ jobs:
if: |
needs.get-environment.outputs.stability == 'stable' &&
github.event_name == 'push'
runs-on: [self-hosted, common]
runs-on: centreon-common
steps:
- name: Checkout sources

View File

@ -30,7 +30,7 @@ jobs:
- added|modified: 'src/**/*.pm'
- name: Install CPAN Libraries
uses: shogo82148/actions-setup-perl@98dfedee230bcf1ee68d5b021931fc8d63f2016e # v1.31.4
uses: shogo82148/actions-setup-perl@49c14f24551d2de3bf56fb107a869c3760b1875e # v1.33.0
with:
perl-version: '5.34'
install-modules-with: cpm

View File

@ -26,6 +26,7 @@ import java.text.NumberFormat;
import java.util.Locale;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.SecureAS400;
import com.ibm.as400.access.AS400SecurityException;
import com.ibm.as400.access.ConnectionEvent;
import com.ibm.as400.access.ConnectionListener;
@ -44,11 +45,13 @@ public abstract class AbstractHandler {
protected String host = null;
protected String login = null;
protected String password = null;
protected Integer ssl = 0;
public AbstractHandler(final String host, final String login, final String password) {
public AbstractHandler(final String host, final String login, final String password, final Integer ssl) {
this.host = host;
this.login = login;
this.password = password;
this.ssl = ssl;
}
static {
@ -77,7 +80,28 @@ public abstract class AbstractHandler {
properties.setLoginTimeout(Conf.as400LoginTimeout);
properties.setSoTimeout(Conf.as400ReadTimeout);
final AS400 system = new AS400(this.host, this.login, this.password);
if (this.ssl == 1) {
SecureAS400 system = new SecureAS400(this.host, this.login, this.password);
system.setSocketProperties(properties);
system.addConnectionListener(new ConnectionListener() {
@Override
public void connected(final ConnectionEvent event) {
ConnectorLogger.getInstance().getLogger().debug("Connect event service : " + event.getService());
}
@Override
public void disconnected(final ConnectionEvent event) {
ConnectorLogger.getInstance().getLogger().debug("Disconnect event service : " + event.getService());
}
});
system.validateSignon();
return (AS400)system;
}
AS400 system = new AS400(this.host, this.login, this.password);
system.setSocketProperties(properties);
system.addConnectionListener(new ConnectionListener() {
@Override

View File

@ -34,8 +34,8 @@ import com.centreon.connector.as400.dispatcher.check.ResponseData;
*/
public class CommandHandler extends AbstractHandler implements ICommandHandler {
public CommandHandler(final String host, final String login, final String password) {
super(host, login, password);
public CommandHandler(final String host, final String login, final String password, final Integer ssl) {
super(host, login, password, ssl);
}
@Override

View File

@ -38,10 +38,10 @@ public class DiskHandler extends AbstractHandler implements IDiskHandler {
private QyaspolYasp0300PcmlHandler qyaspolPcmlHandler = null;
public DiskHandler(final String host, final String login, final String password)
public DiskHandler(final String host, final String login, final String password, final Integer ssl)
throws AS400SecurityException, IOException {
super(host, login, password);
this.qyaspolPcmlHandler = new QyaspolYasp0300PcmlHandler(host, login, password);
super(host, login, password, ssl);
this.qyaspolPcmlHandler = new QyaspolYasp0300PcmlHandler(host, login, password, ssl);
}
@Override

View File

@ -37,8 +37,8 @@ import com.centreon.connector.as400.dispatcher.check.ResponseData;
public class JobHandler extends AbstractHandler implements IJobHandler {
private final JobCache jobCache;
public JobHandler(final String host, final String login, final String password) {
super(host, login, password);
public JobHandler(final String host, final String login, final String password, final Integer ssl) {
super(host, login, password, ssl);
this.jobCache = new JobCache(this);
}

View File

@ -37,8 +37,8 @@ import com.centreon.connector.as400.dispatcher.check.ResponseData;
*/
public class JobQueueHandler extends AbstractHandler implements IJobQueueHandler {
public JobQueueHandler(final String host, final String login, final String password) {
super(host, login, password);
public JobQueueHandler(final String host, final String login, final String password, final Integer ssl) {
super(host, login, password, ssl);
}
@Override

View File

@ -42,9 +42,9 @@ import com.centreon.connector.as400.dispatcher.check.ResponseData;
*/
public class SubSystemHandler extends AbstractHandler implements ISubSystemHandler {
public SubSystemHandler(final String host, final String login, final String password)
public SubSystemHandler(final String host, final String login, final String password, final Integer ssl)
throws AS400SecurityException, IOException {
super(host, login, password);
super(host, login, password, ssl);
}
@Override

View File

@ -45,14 +45,14 @@ import com.centreon.connector.as400.dispatcher.check.ResponseData;
public class SystemHandler extends AbstractHandler implements ISystemHandler {
private SystemStatus status = null;
public SystemHandler(final String host, final String login, final String password)
public SystemHandler(final String host, final String login, final String password, final Integer ssl)
throws AS400SecurityException, IOException {
this(host, login, password, null);
this(host, login, password, null, ssl);
}
public SystemHandler(final String host, final String login, final String password, SystemStatus as400Status)
public SystemHandler(final String host, final String login, final String password, SystemStatus as400Status, final Integer ssl)
throws AS400SecurityException, IOException {
super(host, login, password);
super(host, login, password, ssl);
this.status = as400Status == null ? new SystemStatus(getNewAs400()) : as400Status;
}

View File

@ -26,6 +26,7 @@ import java.util.LinkedList;
import java.util.List;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.SecureAS400;
import com.ibm.as400.access.AS400Message;
import com.ibm.as400.access.AS400SecurityException;
import com.ibm.as400.access.ConnectionEvent;
@ -61,11 +62,13 @@ public class QyaspolYasp0300PcmlHandler {
String host = null;
String login = null;
String password = null;
Integer ssl = 0;
public QyaspolYasp0300PcmlHandler(final String host, final String login, final String password) {
public QyaspolYasp0300PcmlHandler(final String host, final String login, final String password, final Integer ssl) {
this.host = host;
this.login = login;
this.password = password;
this.ssl = ssl;
}
public void addYasp0300Data(final Yasp0300Data data) {
@ -238,7 +241,27 @@ public class QyaspolYasp0300PcmlHandler {
properties.setLoginTimeout(Conf.as400LoginTimeout);
properties.setSoTimeout(Conf.as400ReadTimeout);
final AS400 system = new AS400(this.host, this.login, this.password);
if (this.ssl == 1) {
SecureAS400 system = new SecureAS400(this.host, this.login, this.password);
system.setSocketProperties(properties);
system.addConnectionListener(new ConnectionListener() {
@Override
public void connected(final ConnectionEvent event) {
ConnectorLogger.getInstance().getLogger().debug("Connect event service : " + event.getService());
}
@Override
public void disconnected(final ConnectionEvent event) {
ConnectorLogger.getInstance().getLogger().debug("Disconnect event service : " + event.getService());
}
});
system.validateSignon();
return (AS400)system;
}
AS400 system = new AS400(this.host, this.login, this.password);
system.setSocketProperties(properties);
system.addConnectionListener(new ConnectionListener() {
@Override

View File

@ -102,8 +102,8 @@ public class CachedMessageQueueHandler extends AbstractHandler implements ICache
return sb.toString();
}
public CachedMessageQueueHandler(final String host, final String login, final String password) {
super(host, login, password);
public CachedMessageQueueHandler(final String host, final String login, final String password, final Integer ssl) {
super(host, login, password, ssl);
}
@Override

View File

@ -42,8 +42,8 @@ import com.centreon.connector.as400.dispatcher.check.ResponseData;
*/
public class MessageQueueHandler extends AbstractHandler implements IMessageQueueHandler {
public MessageQueueHandler(final String host, final String login, final String password) {
super(host, login, password);
public MessageQueueHandler(final String host, final String login, final String password, final Integer ssl) {
super(host, login, password, ssl);
}
@Override

View File

@ -69,8 +69,8 @@ public class WorkWithProblemHandler extends AbstractHandler {
private final boolean SSL = false;
private final String logPrefix;
public WorkWithProblemHandler(final String host, final String login, final String password) {
super(host, login, password);
public WorkWithProblemHandler(final String host, final String login, final String password, final Integer ssl) {
super(host, login, password, ssl);
this.logPrefix = "[" + WorkWithProblemHandler.INSTANCE_ID++ + "]";
}

View File

@ -40,5 +40,7 @@ public interface IClient {
String getAs400CheckType();
Integer getAs400Ssl();
Object getAs400Arg(String key);
}

View File

@ -42,6 +42,7 @@ abstract class AbstractClient implements IClient {
private String as400Password = null;
private String as400CheckType = null;
private String as400Args = null;
private Integer as400Ssl = 0;
private List<Map<String, String>> argList = new ArrayList<Map<String, String>>();
@Override
@ -77,6 +78,11 @@ abstract class AbstractClient implements IClient {
return this.input.getArg(key);
}
@Override
public Integer getAs400Ssl() {
return this.input.getSsl();
}
public List<Map<String , String>> getAs400ArgList(String key) {
Object arg = this.input.getArg(key);
if (arg == null) {

View File

@ -87,6 +87,7 @@ public class CheckDispatcher {
private String host = null;
private String login = null;
private String password = null;
private Integer ssl = 0;
private volatile ConcurrentHashMap<String, Long> filter = new ConcurrentHashMap<String, Long>();
@ -135,10 +136,11 @@ public class CheckDispatcher {
}
}
public CheckDispatcher(final String host, final String login, final String password) {
public CheckDispatcher(final String host, final String login, final String password, final Integer ssl) {
this.host = host;
this.login = login;
this.password = password;
this.ssl = ssl;
this.executorGlobal = new ThreadPoolExecutorPostFilter(5, 10, Conf.workerQueueTimeout, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
@ -165,6 +167,10 @@ public class CheckDispatcher {
return this.password;
}
public Integer getSsl() {
return this.ssl;
}
public synchronized void dispatch(final NetworkClient client) {
if (this.filter.containsKey(client.getRawRequest())) {
@ -190,52 +196,52 @@ public class CheckDispatcher {
public ICommandHandler getCommandHandler() throws AS400SecurityException, IOException {
if (this.commandHandler == null) {
this.commandHandler = new CommandHandler(this.host, this.login, this.password);
this.commandHandler = new CommandHandler(this.host, this.login, this.password, this.ssl);
}
return this.commandHandler;
}
public IDiskHandler getDiskHandler() throws AS400SecurityException, IOException {
if (this.diskHandler == null) {
this.diskHandler = new DiskHandler(this.host, this.login, this.password);
this.diskHandler = new DiskHandler(this.host, this.login, this.password, this.ssl);
}
return this.diskHandler;
}
public IJobHandler getJobHandler() throws AS400SecurityException, IOException {
if (this.jobHandler == null) {
this.jobHandler = new JobHandler(this.host, this.login, this.password);
this.jobHandler = new JobHandler(this.host, this.login, this.password, this.ssl);
}
return this.jobHandler;
}
public ISubSystemHandler getSubSystemHandler() throws AS400SecurityException, IOException {
if (this.subSystemHandler == null) {
this.subSystemHandler = new SubSystemHandler(this.host, this.login, this.password);
this.subSystemHandler = new SubSystemHandler(this.host, this.login, this.password, this.ssl);
}
return this.subSystemHandler;
}
public ISystemHandler getSystemHandler() throws AS400SecurityException, IOException {
if (this.systemHandler == null) {
this.systemHandler = new SystemHandler(this.host, this.login, this.password);
this.systemHandler = new SystemHandler(this.host, this.login, this.password, this.ssl);
}
return this.systemHandler;
}
public ICachedMessageQueueHandler getCachedMessageQueueHandler() throws AS400SecurityException, IOException {
return new CachedMessageQueueHandler(this.host, this.login, this.password);
return new CachedMessageQueueHandler(this.host, this.login, this.password, this.ssl);
}
public IMessageQueueHandler getMessageQueueHandler() throws AS400SecurityException, IOException {
return new MessageQueueHandler(this.host, this.login, this.password);
return new MessageQueueHandler(this.host, this.login, this.password, this.ssl);
}
public IJobQueueHandler getJobQueueHandler() throws AS400SecurityException, IOException {
return new JobQueueHandler(this.host, this.login, this.password);
return new JobQueueHandler(this.host, this.login, this.password, this.ssl);
}
public WorkWithProblemHandler getWrkPrbHandler() throws AS400SecurityException, IOException {
return new WorkWithProblemHandler(this.host, this.login, this.password);
return new WorkWithProblemHandler(this.host, this.login, this.password, this.ssl);
}
}

View File

@ -31,6 +31,7 @@ public class InputData {
private String password = null;
private String host = null;
private String command = null;
private Integer ssl = null;
Map<String, Object> args = null;
public InputData() {
@ -44,6 +45,13 @@ public class InputData {
return this.password;
}
public Integer getSsl() {
if (this.ssl == null || this.ssl == 0) {
return 0;
}
return 1;
}
public String getHost() {
return this.host;
}

View File

@ -52,37 +52,37 @@ public class ClientDispatcherImpl implements ClientDispatcher {
}
private synchronized CheckDispatcher createNewCheckDispatcher(final String host, final String login,
final String password) throws AS400SecurityException, IOException, DelayedConnectionException, Exception {
final String password, final Integer ssl) throws AS400SecurityException, IOException, DelayedConnectionException, Exception {
ConnectorLogger.getInstance().info("create new As400 : " + host);
CheckDispatcher resource = null;
resource = new CheckDispatcher(host, login, password);
resource = new CheckDispatcher(host, login, password, ssl);
this.pool.put(resource, System.currentTimeMillis());
return resource;
}
private CheckDispatcher getAs400(final String host, final String login, final String password)
private CheckDispatcher getAs400(final String host, final String login, final String password, final Integer ssl)
throws AS400SecurityException, IOException, DelayedConnectionException, Exception {
for (final CheckDispatcher resource : this.pool.keySet()) {
if (resource.getHost().equalsIgnoreCase(host) && resource.getLogin().equalsIgnoreCase(login)
&& resource.getPassword().equalsIgnoreCase(password)) {
&& resource.getPassword().equalsIgnoreCase(password) && resource.getSsl() == ssl) {
this.pool.put(resource, System.currentTimeMillis());
return resource;
}
}
return this.createNewCheckDispatcher(host, login, password);
return this.createNewCheckDispatcher(host, login, password, ssl);
}
@Override
public synchronized void dispatch(final NetworkClient client)
throws AS400SecurityException, IOException, DelayedConnectionException, Exception {
final CheckDispatcher checkDispatcher = this.getAs400(client.getAs400Host(), client.getAs400Login(),
client.getAs400Password());
client.getAs400Password(), client.getAs400Ssl());
checkDispatcher.dispatch(client);
}
}

View File

@ -35,7 +35,7 @@ public class SystemHandlerTest {
try {
SystemStatus as400 = mock(SystemStatus.class);
when(as400.getSystemPools()).thenReturn(new Vector<Object>().elements());
SystemHandler sh = new SystemHandler(null, null, null, as400);
SystemHandler sh = new SystemHandler(null, null, null, as400, null);
sh.dumpSystem();
} finally {
System.setOut(originalOut);

View File

@ -1,77 +0,0 @@
name: "@NAME@"
arch: "${ARCH}"
platform: "linux"
version_schema: "none"
version: "0.020"
release: "${RELEASE}${DIST}"
section: "default"
priority: "optional"
maintainer: "Centreon <contact@centreon.com>"
description: |
This module implements the Argon2 key derivation function, which is suitable to convert any password into a cryptographic key.
This is most often used to for secure storage of passwords but can also be used to derive a encryption key from a password.
It offers variable time and memory costs as well as output size.
Commit: @COMMIT_HASH@
vendor: "Centreon"
homepage: "https://www.centreon.com"
license: "Apache-2.0"
contents:
- src: "/tmp/bin/argon2-calibrate"
dst: "/usr/local/bin/"
file_info:
mode: 0755
packager: rpm
- src: "/tmp/bin/argon2-calibrate"
dst: "/usr/bin/"
file_info:
mode: 0755
packager: deb
- src: "/tmp/lib/perl5/*/auto/Crypt/Argon2/"
dst: "@PERL_VENDORARCH@/auto/Crypt/Argon2/"
file_info:
mode: 0644
- src: "/tmp/lib/perl5/*/Crypt/Argon2.pm"
dst: "@PERL_VENDORARCH@/Crypt/"
file_info:
mode: 0644
- src: "/tmp/man/man3/Crypt::Argon2*"
dst: "/usr/share/man/man3/"
file_info:
mode: 0644
overrides:
rpm:
depends:
- perl(Exporter)
- perl(Time::HiRes)
- perl(XSLoader)
- perl(strict)
- perl(warnings)
conflicts:
- perl-Crypt-Argon2-debuginfo
replaces:
- perl-Crypt-Argon2-debuginfo
provides:
- perl-Crypt-Argon2-debuginfo
- perl(Crypt::Argon2)
deb:
depends:
- perl
- libc6
conflicts:
- libcrypt-argon2-perl-dbgsym
replaces:
- libcrypt-argon2-perl-dbgsym
provides:
- libcrypt-argon2-perl-dbgsym
rpm:
summary: Perl interface to the Argon2 key derivation functions
compression: zstd
signature:
key_file: ${RPM_SIGNING_KEY_FILE}
key_id: ${RPM_SIGNING_KEY_ID}

View File

@ -1,63 +0,0 @@
name: "@NAME@"
arch: "${ARCH}"
platform: "linux"
version_schema: "none"
version: "@VERSION@"
release: "${RELEASE}${DIST}"
section: "default"
priority: "optional"
maintainer: "Centreon <contact@centreon.com>"
description: |
This module implements JSONPath, an XPath-like language for searching JSON-like structures.
JSONPath is described at http://goessner.net/articles/JsonPath/.
Commit: @COMMIT_HASH@
vendor: "Centreon"
homepage: "https://www.centreon.com"
license: "Apache-2.0"
contents:
- src: "/tmp/lib/perl5/JSON/Path.pm"
dst: "@PERL_VENDORLIB@/JSON/"
file_info:
mode: 0644
- src: "/tmp/lib/perl5/JSON/Path/"
dst: "@PERL_VENDORLIB@/JSON/Path/"
file_info:
mode: 0644
- src: "/tmp/man/man3/JSON::Path*"
dst: "/usr/share/man/man3/"
file_info:
mode: 0644
overrides:
rpm:
depends:
- perl(Carp::Assert)
- perl(Exporter::Tiny)
- perl(JSON::MaybeXS)
- perl(JSON::Parse)
- perl(LV)
- perl(List::Util)
- perl(Readonly)
- perl(Tie::IxHash)
- perl(Try::Tiny)
provides:
- perl(JSON::Path)
deb:
depends:
- libcarp-assert-perl
- libexporter-tiny-perl
- libjson-parse-perl
- liblv-perl
- libreadonly-perl
- libtie-ixhash-perl
- libtry-tiny-perl
rpm:
summary: This module implements JSONPath, an XPath-like language for searching JSON-like structures
compression: zstd
signature:
key_file: ${RPM_SIGNING_KEY_FILE}
key_id: ${RPM_SIGNING_KEY_ID}

View File

@ -1,64 +0,0 @@
name: "@NAME@"
arch: "${ARCH}"
platform: "linux"
version_schema: "none"
version: "0.8"
release: "${RELEASE}${DIST}"
section: "default"
priority: "optional"
maintainer: "Centreon <contact@centreon.com>"
description: |
Perl interface to the libssh library
Commit: @COMMIT_HASH@
vendor: "Centreon"
homepage: "https://www.centreon.com"
license: "Apache-2.0"
contents:
- src: "/tmp/lib/perl5/*/auto/Libssh/Session/Session.so"
dst: "@PERL_VENDORARCH@/auto/Libssh/Session/"
file_info:
mode: 0644
- src: "/tmp/lib/perl5/*/Libssh/"
dst: "@PERL_VENDORARCH@/Libssh/"
file_info:
mode: 0644
- src: "/tmp/man/man3/Libssh::*"
dst: "/usr/share/man/man3/"
file_info:
mode: 0644
overrides:
rpm:
depends:
- perl-interpreter
- libssh
conflicts:
- perl-Libssh-Session-debuginfo
replaces:
- perl-Libssh-Session-debuginfo
provides:
- perl-Libssh-Session-debuginfo
- perl(Libssh::Session)
- perl(Libssh::Sftp)
deb:
depends:
- perl
- libc6
- libssh-4
conflicts:
- libssh-session-perl-dbgsym
replaces:
- libssh-session-perl-dbgsym
provides:
- libssh-session-perl-dbgsym
- libssh-session-sftp
rpm:
summary: Perl interface to the libssh library
compression: zstd
signature:
key_file: ${RPM_SIGNING_KEY_FILE}
key_id: ${RPM_SIGNING_KEY_ID}

View File

@ -1,78 +0,0 @@
name: "@NAME@"
arch: "${ARCH}"
platform: "linux"
version_schema: "none"
version: "0.55"
release: "${RELEASE}${DIST}"
section: "default"
priority: "optional"
maintainer: "Centreon <contact@centreon.com>"
description: |
Net::Curl provides a Perl interface to libcurl created with object-oriented implementations in mind.
This documentation contains Perl-specific details and quirks.
For more information consult libcurl man pages and documentation at http://curl.haxx.se.
Commit: @COMMIT_HASH@
vendor: "Centreon"
homepage: "https://www.centreon.com"
license: "Apache-2.0"
contents:
- src: "/tmp/lib/perl5/*/auto/Net/Curl/Curl.so"
dst: "@PERL_VENDORARCH@/auto/Net/Curl/"
file_info:
mode: 0644
- src: "/tmp/lib/perl5/*/Net/Curl.pm"
dst: "@PERL_VENDORARCH@/Net/"
file_info:
mode: 0644
- src: "/tmp/lib/perl5/*/Net/Curl/"
dst: "@PERL_VENDORARCH@/Net/Curl/"
file_info:
mode: 0644
- src: "/tmp/man/man3/Net::Curl*"
dst: "/usr/share/man/man3/"
file_info:
mode: 0644
overrides:
rpm:
depends:
- perl-interpreter
- libcurl
conflicts:
- perl-Net-Curl-debuginfo
replaces:
- perl-Net-Curl-debuginfo
provides:
- perl-Net-Curl-debuginfo
- perl(Net::Curl)
- perl(Net::Curl::Compat)
- perl(Net::Curl::Easy)
- perl(Net::Curl::Form)
- perl(Net::Curl::Share)
- perl(Net::Curl::Multi)
deb:
depends:
- perl
- libcurl4
conflicts:
- libnet-curl-perl-dbgsym
replaces:
- libnet-curl-perl-dbgsym
provides:
- libnet-curl-perl-dbgsym
- libnet-curl-compat-perl
- libnet-curl-easy-perl
- libnet-curl-form-perl
- libnet-curl-share-perl
- libnet-curl-multi-perl
rpm:
summary: Perl interface for libcurl
compression: zstd
signature:
key_file: ${RPM_SIGNING_KEY_FILE}
key_id: ${RPM_SIGNING_KEY_ID}

View File

@ -5,9 +5,12 @@
"files": [
"centreon/plugins/script_snmp.pm",
"centreon/plugins/snmp.pm",
"snmp_standard/mode/interfaces.pm",
"snmp_standard/mode/listinterfaces.pm",
"snmp_standard/mode/listspanningtrees.pm",
"snmp_standard/mode/resources/",
"snmp_standard/mode/interfaces.pm",
"snmp_standard/mode/spanningtree.pm",
"snmp_standard/mode/uptime.pm",
"network/aruba/aoscx/snmp/"
]
}

View File

@ -43,7 +43,7 @@ sub prefix_scenario_output {
sub prefix_steps_output {
my ($self, %options) = @_;
return sprintf(" Step: %s, last exec: %s, ", $options{instance_value}->{display}, $options{instance_value}->{last_exec});
return sprintf("Step: %s, last exec: %s, ", $options{instance_value}->{display}, $options{instance_value}->{last_exec});
}
sub set_counters {
@ -61,9 +61,9 @@ sub set_counters {
$self->{maps_counters}->{global} = [
{ label => 'scenario-status',
type => 2,
warning_default => '%{status} =~ /(Aborted|Stopped|Excluded|Degraded)/',
warning_default => '%{status} =~ "Degraded"',
critical_default => '%{status} =~ "Failure"',
unknown_default => '%{status} =~ /(Unknown|No execution)/',
unknown_default => '%{status} =~ /(Unknown|No execution|Aborted|Stopped|Excluded)/',
set => {
key_values => [ { name => 'status' }, { name => 'num_status' }, { name => 'display' } ],
closure_custom_output => $self->can('custom_status_output'),
@ -182,7 +182,7 @@ sub manage_selection {
}
};
if (!defined $scenario_detail->{results} or scalar(@{$scenario_detail->{results}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "Scenario '" . $scenario->{scenarioName} . "' Don't have any performance data, please try to add a bigger timeframe");
$self->{output}->add_option_msg(short_msg => "No execution, please try again with a bigger timeframe");
next;
}
foreach my $kpi (@{$scenario_detail->{kpis}}) {
@ -194,8 +194,17 @@ sub manage_selection {
$self->{scenarios}->{ $scenario->{scenarioName} }->{steps_index}->{$steps->{index} - 1} = $steps->{name};
}
}
# The API is expected to sort the output to get the most recent data at the end of the array.
# We store the last execution date, and check it for every data point sent back by the api.
# If a step has failed, no data is sent by the api for this step, but the results of the previous executions are present.
# This allows to get perfdata for the last execution with a successful first step.
# If the first step fails, the script will take older data.
my $last_execution = @{$scenario_detail->{results}}[-1]->{planningTime};
foreach my $step_metrics (@{$scenario_detail->{results}}) {
if ($step_metrics->{planningTime} ne $last_execution){
$self->{output}->add_option_msg(long_msg => "Execution $step_metrics->{planningTime} of step $step_metrics->{stepId} is older than $last_execution, not taking it into account.", debug => 1);
next;
}
my $exec_time = str2time($step_metrics->{planningTime}, 'GMT');
$self->{scenarios}->{ $scenario->{scenarioName} }->{steps}->{ $self->{scenarios}->{ $scenario->{scenarioName} }->{steps_index}->{ $step_metrics->{stepId} } }->{ $step_metrics->{metric} } = $step_metrics->{value};
$self->{scenarios}->{ $scenario->{scenarioName} }->{steps}->{ $self->{scenarios}->{ $scenario->{scenarioName} }->{steps_index}->{ $step_metrics->{stepId} } }->{last_exec} = POSIX::strftime('%d-%m-%Y %H:%M:%S %Z', localtime($exec_time));

View File

@ -47,7 +47,7 @@ sub custom_select_threshold {
$self->{instance_mode}->{safe}->reval($self->{result_values}->{config}->{warning})) {
$status = 'warning';
} elsif (defined($self->{result_values}->{config}->{unknown}) && $self->{result_values}->{config}->{unknown} &&
$self->{instance_mode}->reval($self->{result_values}->{config}->{unknown})) {
$self->{instance_mode}->{safe}->reval($self->{result_values}->{config}->{unknown})) {
$status = 'unknown';
}
if ($@) {

View File

@ -42,7 +42,7 @@ sub custom_select_threshold {
$self->{instance_mode}->{safe}->reval($self->{result_values}->{config}->{warning})) {
$status = 'warning';
} elsif (defined($self->{result_values}->{config}->{unknown}) && $self->{result_values}->{config}->{unknown} &&
$self->{instance_mode}->reval($self->{result_values}->{config}->{unknown})) {
$self->{instance_mode}->{safe}->reval($self->{result_values}->{config}->{unknown})) {
$status = 'unknown';
}
if ($@) {

View File

@ -1,5 +1,5 @@
#
# Copyright 2024 Centreon (http://www.centreon.com/)
# Copyright 2025 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,7 @@ use strict;
use warnings;
use centreon::plugins::http;
use centreon::plugins::statefile;
use JSON::XS;
use MIME::Base64;
use Digest::MD5 qw(md5_hex);
@ -44,12 +45,14 @@ sub new {
if (!defined($options{noptions})) {
$options{options}->add_options(
arguments => {
'hostname:s' => { name => 'hostname' },
'port:s' => { name => 'port' },
'proto:s' => { name => 'proto' },
'username:s' => { name => 'username' },
'password:s' => { name => 'password' },
'timeout:s' => { name => 'timeout' }
'hostname:s' => { name => 'hostname' },
'port:s' => { name => 'port', default => '443' },
'proto:s' => { name => 'proto', default => 'https' },
'username:s' => { name => 'username' },
'password:s' => { name => 'password' },
'vstats-interval:s' => { name => 'vstats_interval', default => 60 },
'vstats-duration:s' => { name => 'vstats_duration', default => 2764800 }, # 2764800 seconds in 32 days
'timeout:s' => { name => 'timeout', default => 10 }
}
);
}
@ -73,12 +76,14 @@ sub set_defaults {}
sub check_options {
my ($self, %options) = @_;
$self->{hostname} = (defined($self->{option_results}->{hostname})) ? $self->{option_results}->{hostname} : '';
$self->{port} = (defined($self->{option_results}->{port})) ? $self->{option_results}->{port} : 443;
$self->{proto} = (defined($self->{option_results}->{proto})) ? $self->{option_results}->{proto} : 'https';
$self->{timeout} = (defined($self->{option_results}->{timeout})) ? $self->{option_results}->{timeout} : 10;
$self->{username} = (defined($self->{option_results}->{username})) ? $self->{option_results}->{username} : '';
$self->{password} = (defined($self->{option_results}->{password})) ? $self->{option_results}->{password} : '';
$self->{hostname} = (defined($self->{option_results}->{hostname})) ? $self->{option_results}->{hostname} : '';
$self->{port} = $self->{option_results}->{port};
$self->{proto} = $self->{option_results}->{proto};
$self->{timeout} = $self->{option_results}->{timeout};
$self->{username} = (defined($self->{option_results}->{username})) ? $self->{option_results}->{username} : '';
$self->{password} = (defined($self->{option_results}->{password})) ? $self->{option_results}->{password} : '';
$self->{vstats_interval} = $self->{option_results}->{vstats_interval};
$self->{vstats_duration} = $self->{option_results}->{vstats_duration};
if ($self->{hostname} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --hostname option.");
@ -146,15 +151,12 @@ sub get_token {
$self->settings();
my $content = $self->{http}->request(
method => 'POST',
url_path => '/api/session',
method => 'POST',
url_path => '/api/session',
query_form_post => '',
unknown_status => $self->{unknown_http_status},
warning_status => $self->{warning_http_status},
critical_status => $self->{critical_http_status},
header => [
'Authorization: Basic ' . $auth_string,
'Content-Type: application/x-www-form-urlencoded'
header => [
'Authorization: Basic ' . $auth_string,
'Content-Type: application/x-www-form-urlencoded'
]
);
@ -175,22 +177,33 @@ sub try_request_api {
my ($self, %options) = @_;
my $token = $self->get_token(%options);
my $method = centreon::plugins::misc::is_empty($options{method}) ? 'GET' : $options{method};
my $headers = [ 'vmware-api-session-id: ' . $token ];
if ($method =~ /^(PATCH|POST)$/) {
push @$headers, 'content-type: application/json';
}
my $unknown_status = (defined($options{unknown_status})) ? $options{unknown_status} : undef;
my ($content) = $self->{http}->request(
url_path => '/api' . $options{endpoint},
get_param => $options{get_param},
header => [ 'vmware-api-session-id: ' . $token ],
unknown_status => '',
insecure => (defined($self->{option_results}->{insecure}) ? 1 : 0)
method => $method,
url_path => '/api' . $options{endpoint},
get_param => $options{get_param},
header => $headers,
query_form_post => $options{query_form_post},
unknown_status => $unknown_status,
insecure => (defined($self->{option_results}->{insecure}) ? 1 : 0)
);
if (!defined($content) || $content eq '') {
if (!defined($content)) {
$self->{output}->add_option_msg(short_msg => "API returns empty content [code: '"
. $self->{http}->get_code() . "'] [message: '"
. $self->{http}->get_message() . "']");
$self->{output}->option_exit();
}
my $decoded = centreon::plugins::misc::json_decode($content);
my $decoded = ($method eq 'GET') ? centreon::plugins::misc::json_decode($content) : {};
return $decoded;
}
@ -199,14 +212,18 @@ sub request_api {
my ($self, %options) = @_;
$self->settings();
my $api_response = $self->try_request_api(%options);
# first call using the available token with unknown_status = 0 in order to avoid exiting at first attempt in case it has expired
my $api_response = $self->try_request_api(%options, unknown_status => '0');
# if the token is invalid, we try to authenticate again
if (ref($api_response) eq 'HASH'
&& defined($api_response->{error_type})
&& $api_response->{error_type} eq 'UNAUTHENTICATED') {
# if the first attempt failed, try again forcing to authenticate
$api_response = $self->try_request_api('force_authentication' => 1, %options);
}
# if we could not authenticate, we exit
if (ref($api_response) eq 'HASH' && defined($api_response->{error_type})) {
my $full_message = '';
@ -219,6 +236,191 @@ sub request_api {
return $api_response;
}
sub get_all_acq_specs {
my ($self, %options) = @_;
# Get all acq specs and store them in cache
# FIXME: cache management
# FIXME: any pagination issue ?
$self->{all_acq_specs} = $self->request_api(endpoint => '/stats/acq-specs')->{acq_specs} if ( !defined($self->{all_acq_specs}));
return $self->{all_acq_specs};
}
sub compose_type_from_rsrc_id {
my ($self, $rsrc_id) = @_;
if ($rsrc_id =~ /^([a-z]+)-(\d+)$/) {
return uc($1);
} else {
$self->{output}->add_option_msg(short_msg => "compose_type_from_rsrc_id: cannot extract type from '$rsrc_id'");
$self->{output}->option_exit();
}
}
sub compose_acq_specs_json_payload {
my ($self, %options) = @_;
my $payload = {
counters => {
cid_mid => {
cid => $options{cid}
}
},
resources => [
{
predicate => 'EQUAL',
scheme => 'moid',
type => $self->compose_type_from_rsrc_id($options{rsrc_id}),
id_value => $options{rsrc_id}
}
],
expiration => time() + $self->{vstats_duration},
interval => $self->{vstats_interval}
};
return(centreon::plugins::misc::json_encode($payload));
}
sub create_acq_spec {
my ($self, %options) = @_;
if (centreon::plugins::misc::is_empty($options{cid})) {
$self->{output}->add_option_msg(short_msg => "ERR: need a cid to create an acq_spec");
$self->{output}->option_exit();
}
if (centreon::plugins::misc::is_empty($options{rsrc_id})) {
$self->{output}->add_option_msg(short_msg => "ERR: need a rsrc_id to create an acq_spec");
$self->{output}->option_exit();
}
$self->request_api(
method => 'POST',
endpoint => '/stats/acq-specs/',
query_form_post => $self->compose_acq_specs_json_payload(%options)
) or return undef;
$self->{output}->add_option_msg(long_msg => "The counter $options{cid} was not recorded for resource $options{rsrc_id} before. It will now (creating acq_spec).");
return 1;
}
sub extend_acq_spec {
my ($self, %options) = @_;
if (centreon::plugins::misc::is_empty($options{cid})) {
$self->{output}->add_option_msg(short_msg => "ERR: need a cid to extend an acq_spec");
$self->{output}->option_exit();
}
if (centreon::plugins::misc::is_empty($options{rsrc_id})) {
$self->{output}->add_option_msg(short_msg => "ERR: need a rsrc_id to extend an acq_spec");
$self->{output}->option_exit();
}
if (centreon::plugins::misc::is_empty($options{acq_spec_id})) {
$self->{output}->add_option_msg(long_msg => "ERR: need a acq_spec_id to extend an acq_spec_id") ;
$self->{output}->option_exit();
}
$self->{output}->add_option_msg(long_msg => "The acq_spec entry has to be extended to get more stats for $options{rsrc_id} / $options{cid}");
my $json_payload = $self->compose_acq_specs_json_payload(%options);
my $response = $self->request_api(
method => 'PATCH',
endpoint => '/stats/acq-specs/' . $options{acq_spec_id},
query_form_post => $json_payload
);
# The response must be empty if the patch succeeds
return undef if (defined($response) && ref($response) eq 'HASH' && scalar(keys %$response) > 0);
# reset stored acq_specs since it's no longer accurate
$self->{all_acq_specs} = [];
return 1;
}
sub get_acq_spec {
my ($self, %options) = @_;
# If it is not available in cache call get_all_acq_specs()
my $acq_specs = $self->get_all_acq_specs();
# FIXME: opt exit if centreon::plugins::misc::is_empty($options{cid})
for my $spec (@$acq_specs) {
# Ignore acq_specs not related to the counter_id
next if ($options{cid} ne $spec->{counters}->{cid_mid}->{cid});
# Check if this acq_spec is related to the given resource
my @matching_rsrcs = grep {
$_->{id_value} eq $options{rsrc_id}
&& $_->{predicate} eq 'EQUAL'
&& $_->{scheme} eq 'moid'
} @{$spec->{resources}};
return $spec if (@matching_rsrcs > 0);
}
return undef;
}
sub check_acq_spec {
my ($self, %options) = @_;
my $acq_spec = $self->get_acq_spec(%options);
if ( !defined($acq_spec) ) {
# acq_spec not found => we need to create it
$self->create_acq_spec(%options) or return(undef);
# acq_spec is created => check is ok
return 1;
} elsif ($acq_spec->{status} eq 'EXPIRED' || $acq_spec->{expiration} <= time() + 3600) {
# acq_spec exists but expired => we need to extend it
$self->extend_acq_spec(%options, acq_spec_id => $acq_spec->{id}) or return(undef);
# acq_spec is extended => check is ok
return 1;
}
# acq_spec exists and is not expired => check is ok
return 1;
}
sub get_stats {
my ($self, %options) = @_;
if ( centreon::plugins::misc::is_empty($options{rsrc_id})) {
$self->{output}->add_option_msg(short_msg => "get_stats method called without rsrc_id, won't query");
$self->{output}->option_exit();
}
if ( centreon::plugins::misc::is_empty($options{cid}) ) {
$self->{output}->add_option_msg(short_msg => "get_stats method called without cid, will get all available stats for resource");
$self->{output}->option_exit();
}
if ( !$self->check_acq_spec(%options) ) {
$self->{output}->add_option_msg(short_msg => "get_stats method failed to check_acq_spec()");
$self->{output}->option_exit();
}
# compose the endpoint
my $endpoint = '/stats/data/dp?'
. 'rsrcs=type.' . $self->compose_type_from_rsrc_id($options{rsrc_id}) . '.moid=' . $options{rsrc_id}
. '&cid=' . $options{cid}
. '&start=' . (time() - 120); # get the last two minutes to be sure to get at least one value
my $result = $self->request_api(
method => 'GET',
endpoint => $endpoint
);
# FIXME: check if ( !defined($result) || ref($result) ne 'HASH' || scalar(@{ $result->{data_points} }) == 0 ) {
# FIXME: the existence of the resource id must be checked at one moment
# return only the last value (if there are several)
if ( scalar(@{ $result->{data_points} }) == 0 ) {
$self->{output}->add_option_msg(short_msg => "no data for host " . $options{rsrc_id} . " counter " . $options{cid} . " at the moment.");
return undef;
}
# Return the `val` field of the last object of the array
return $result->{data_points}->[ @{ $result->{data_points} } - 1 ]->{val};
# FIXME: handle arrays in get_stats and check_acq_specs
}
1;
__END__
@ -238,6 +440,9 @@ apps::vmware::vsphere8::custom::api - Custom module for VMware vSphere 8 API.
$api->set_options(option_results => $option_results);
$api->check_options();
my $response = $api->request_api(endpoint => '/vcenter/host');
my $host_cpu_capacity = $api->get_stats(
cid => 'cpu.capacity.provisioned.HOST',
rsrc_id => 'host-18');
=head1 DESCRIPTION
@ -249,7 +454,7 @@ This module provides methods to interact with the VMware vSphere 8 REST API. It
my $api = apps::vmware::vsphere8::custom::api->new(%options);
Creates a new `apps::vmware::vsphere8::custom::api` object.
Creates a new C<apps::vmware::vsphere8::custom::api> object.
=over 4
@ -357,6 +562,128 @@ Calls try_request_api and recalls it forcing authentication if the first call fa
=back
=head2 get_acq_spec
my $spec = $self->get_acq_spec(%options);
Retrieves the acquisition specification (acq_spec) for the given counter ID (C<cid>) and resource ID (rsrc_id).
=over 4
=item * C<%options> - A hash of options. The following keys are supported:
=over 8
=item * C<cid> - The counter ID for which to retrieve the acq_spec. This option is required.
=item * C<rsrc_id> - The resource ID for which to retrieve the acq_spec. This option is required.
=back
=back
Returns the matching acq_spec if found, otherwise returns undef.
=cut
=head2 create_acq_spec
$api->create_acq_spec(%options);
Creates a new acquisition specification (acq_spec) for the given options.
=over 4
=item * C<%options> - A hash of options. The following keys are supported:
=over 8
=item * C<cid> - The counter ID for which to create the acq_spec. This option is required.
=item * C<rsrc_id> - The resource ID for which to create the acq_spec. This option is required.
=back
=back
Returns 1 if the acq_spec is successfully created, otherwise returns undef.
=cut
=head2 extend_acq_spec
$api->extend_acq_spec(%options);
Extends the acquisition specification (acq_spec) for the given options.
=over 4
=item * C<%options> - A hash of options. The following keys are supported:
=over 8
=item * C<cid> - The counter ID for which to extend the acq_spec. This option is required.
=item * C<rsrc_id> - The resource ID for which to extend the acq_spec. This option is required.
=item * C<acq_spec_id> - The acquisition specification ID to extend. This option is required.
=back
=back
Returns 1 if the acq_spec is successfully extended, otherwise returns undef.
=cut
=head2 check_acq_spec
$api->check_acq_spec(%options);
Checks the acquisition specification (acq\_spec) for the given options. If the acq\_spec does not exist, it creates a new one. If the acq\_spec exists but is expired or about to expire, it extends the acq\_spec.
=over 4
=item * C<%options> - A hash of options. The following keys are supported:
=over 8
=item * C<cid> - The counter ID for which to check the acq\_spec. This option is required.
=item * C<rsrc_id> - The resource ID for which to check the acq\_spec. This option is required.
=back
=back
Returns 1 if the acq\_spec is valid or has been successfully created/extended, undef otherwise.
=cut
=head2 get_stats
my $value = $api->get_stats(%options);
Retrieves the latest statistics for a given resource and counter.
=over 4
=item * C<%options> - A hash of options. The following keys are supported:
=over 8
=item * C<rsrc_id> - The resource ID for which to retrieve statistics. This option is required.
=item * C<cid> - The counter ID for which to retrieve statistics. This option is required.
=back
=back
Returns the latest value for the specified resource and counter.
=cut
=head1 REST API OPTIONS
Command-line options for VMware vSphere 8 API:
@ -383,6 +710,16 @@ Define the username for authentication.
Define the password for authentication.
=item B<--vstats-interval>
Define the interval (in seconds) at which the C<vstats> must be recorded (default: 300).
Used to create entries at the C</api/stats/acq-specs> endpoint.
=item B<--vstats-duration>
Define the time (in seconds) after which the C<vstats> will stop being recorded (default: 2764800, meaning 32 days).
Used to create entries at the C</api/stats/acq-specs> endpoint.
=item B<--timeout>
Define the timeout for API requests (default: 10 seconds).
@ -397,4 +734,4 @@ Centreon
Licensed under the Apache License, Version 2.0.
=cut
=cut

View File

@ -0,0 +1,176 @@
#
# Copyright 2025 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 apps::vmware::vsphere8::esx::mode;
use strict;
use warnings FATAL => 'all';
use base qw(centreon::plugins::templates::counter);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1);
$options{options}->add_options(
arguments => {
'esx-id:s' => { name => 'esx_id' },
'esx-name:s' => { name => 'esx_name' }
}
);
$options{options}->add_help(package => __PACKAGE__, sections => 'VMWARE 8 HOST OPTIONS', once => 1);
return $self;
}
sub get_esx_id_from_name {
my ($self, %options) = @_;
if ( centreon::plugins::misc::is_empty($self->{esx_name}) ) {
$self->{output}->add_option_msg(short_msg => "get_esx_id_from_name method called without esx_name option. Please check configuration.");
$self->{output}->option_exit();
}
my $response = $options{custom}->request_api(
'endpoint' => '/vcenter/host',
'method' => 'GET'
);
for my $rsrc (@$response) {
next if ($rsrc->{name} ne $self->{esx_name});
$self->{esx_id} = $rsrc->{host};
$self->{output}->add_option_msg(long_msg => "get_esx_id_from_name method called to get " . $self->{esx_name}
. "'s id: " . $self->{esx_id} . ". Prefer using --esx-id to spare a query to the API.");
return $rsrc->{host};
}
return undef;
}
sub get_esx_stats {
my ($self, %options) = @_;
if ( centreon::plugins::misc::is_empty($options{esx_id}) && !$self->get_esx_id_from_name(%options) ) {
$self->{output}->add_option_msg(short_msg => "get_esx_stats method cannot get host ID from host name");
$self->{output}->option_exit();
}
return $options{custom}->get_stats(
%options,
rsrc_id => $self->{esx_id}
);
}
sub request_api {
my ($self, %options) = @_;
return $options{custom}->request_api(%options);
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
if (centreon::plugins::misc::is_empty($self->{option_results}->{esx_id})
&& centreon::plugins::misc::is_empty($self->{option_results}->{esx_name})) {
$self->{output}->add_option_msg(short_msg => 'Need to specify either --esx-id or --esx-name option.');
$self->{output}->option_exit();
}
$self->{esx_id} = $self->{option_results}->{esx_id};
$self->{esx_name} = $self->{option_results}->{esx_name};
}
1;
__END__
=head1 VMWARE 8 HOST OPTIONS
=over 4
=item B<--esx-id>
Define which physical server to monitor based on its resource ID (example: C<host-16>).
=item B<--esx-name>
Define which physical server to monitor based on its name (example: C<esx01.mydomain.tld>).
When possible, it is recommended to use C<--esx-id> instead.
=back
=cut
=head1 NAME
apps::vmware::vsphere8::esx::mode - Template for modes monitoring VMware physical hosts
=head1 SYNOPSIS
use base apps::vmware::vsphere8::esx::mode;
sub set_counters {...}
sub manage_selection {
my ($self, %options) = @_;
$api->set_options(option_results => $option_results);
$api->check_options();
my $response = $api->request_api(endpoint => '/vcenter/host');
my $host_cpu_capacity = $self->get_esx_stats(
cid => 'cpu.capacity.provisioned.HOST',
rsrc_id => 'host-18');
=head1 DESCRIPTION
This module provides methods to interact with the VMware vSphere 8 REST API. It handles authentication, caching, and API requests.
=head1 METHODS
=head2 get_esx_stats
$self->get_esx_stats(%options);
Retrieves the ESX statistics for the given options using package apps::vmware::vsphere8::custom::api::get_stats()
=over 4
=item * C<%options> - A hash of options. The following keys are supported:
=over 8
=item * C<cid> - The C<cid> (counter id) of the desired metric.
=item * C<esx_id> - The ESX's C<rsrc_id> (resource ID) for which to retrieve the statistics. This option is optional if C<esx_name> is provided.
=item * C<esx_name> - The ESX's name for which to retrieve the statistics. This option is not used if C<esx_id> is provided, which is the nominal usage of this function.
=back
=back
Returns the statistics for the specified ESX.
=cut

View File

@ -0,0 +1,398 @@
#
# Copyright 2025 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 apps::vmware::vsphere8::esx::mode::cpu;
use strict;
use warnings;
use base qw(apps::vmware::vsphere8::esx::mode);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
$options{options}->add_options(
arguments => {
'add-contention' => { name => 'add_contention' },
'add-demand' => { name => 'add_demand' },
'add-corecount' => { name => 'add_corecount' }
}
);
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
# If a threshold is given on contention, we enable the corresponding data collection
if (grep {$_ =~ /contention/ && defined($self->{option_results}->{$_}) && $self->{option_results}->{$_} ne ''} keys %{$self->{option_results}}) {
$self->{option_results}->{add_contention} = 1;
}
# If a threshold is given on demand, we enable the corresponding data collection
if (grep {$_ =~ /demand/ && defined($self->{option_results}->{$_}) && $self->{option_results}->{$_} ne ''} keys %{$self->{option_results}}) {
$self->{option_results}->{add_demand} = 1;
}
# If a threshold is given on corecount, we enable the corresponding data collection
if (grep {$_ =~ /corecount/ && defined($self->{option_results}->{$_}) && $self->{option_results}->{$_} ne ''} keys %{$self->{option_results}}) {
$self->{option_results}->{add_corecount} = 1;
}
}
# Skip contention processing if there is no available data
sub skip_contention {
my ($self, %options) = @_;
return 0 if (defined($self->{cpu_contention})
&& ref($self->{cpu_contention}) eq 'HASH'
&& scalar(keys %{$self->{cpu_contention}}) > 0);
return 1;
}
# Skip demand processing if there is no available data
sub skip_demand {
my ($self, %options) = @_;
return 0 if (defined($self->{cpu_demand})
&& ref($self->{cpu_demand}) eq 'HASH'
&& scalar(keys %{$self->{cpu_demand}}) > 0);
return 1;
}
# Skip corecount processing if there is no available data
sub skip_corecount {
my ($self, %options) = @_;
return 0 if (defined($self->{cpu_corecount})
&& ref($self->{cpu_corecount}) eq 'HASH'
&& scalar(keys %{$self->{cpu_corecount}}) > 0);
return 1;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'cpu_usage', type => 0 },
{ name => 'cpu_contention', type => 0, cb_init => 'skip_contention' },
{ name => 'cpu_demand', type => 0, cb_init => 'skip_demand' },
{ name => 'cpu_corecount', type => 0, cb_init => 'skip_corecount' }
];
$self->{maps_counters}->{cpu_usage} = [
{
label => 'usage-percentage',
type => 1,
nlabel => 'cpu.capacity.usage.percentage',
set => {
output_template => 'CPU average usage is %.2f %%',
key_values => [ { name => 'prct_used' } ],
output_use => 'prct_used',
threshold_use => 'prct_used',
perfdatas => [
{
value => 'prct_used',
template => '%.2f',
min => 0,
max => 100,
unit => '%'
}
]
}
},
{
label => 'usage-frequency',
type => 1,
nlabel => 'cpu.capacity.usage.hertz',
set => {
key_values => [ { name => 'cpu.capacity.usage.HOST' }, { name => 'cpu_usage_hertz' }, { name => 'cpu_provisioned_hertz' } ],
output_use => 'cpu.capacity.usage.HOST',
threshold_use => 'cpu.capacity.usage.HOST',
output_template => 'used frequency is %s kHz',
perfdatas => [
{
value => 'cpu_usage_hertz',
template => '%s',
max => 'cpu_provisioned_hertz',
unit => 'Hz'
}
]
}
}
];
$self->{maps_counters}->{cpu_contention} = [
{
label => 'contention-percentage',
type => 1,
nlabel => 'cpu.capacity.contention.percentage',
set => {
output_template => 'CPU average contention is %.2f %%',
key_values => [ { name => 'cpu.capacity.contention.HOST' } ],
output_use => 'cpu.capacity.contention.HOST',
threshold_use => 'cpu.capacity.contention.HOST',
perfdatas => [
{
value => 'cpu.capacity.contention.HOST',
template => '%.2f',
min => 0,
max => 100,
unit => '%'
}
]
}
}
];
$self->{maps_counters}->{cpu_demand} = [
{
label => 'demand-percentage',
type => 1,
nlabel => 'cpu.capacity.demand.percentage',
set => {
output_template => 'CPU average demand is %.2f %%',
key_values => [ { name => 'prct_demand' } ],
output_use => 'prct_demand',
threshold_use => 'prct_demand',
perfdatas => [ { value => 'prct_demand', template => '%s' } ]
}
},
{
label => 'demand-frequency',
type => 1,
nlabel => 'cpu.capacity.demand.hertz',
set => {
key_values => [
{ name => 'cpu.capacity.demand.HOST' },
{ name => 'cpu_demand_hertz' },
{ name => 'cpu_provisioned_hertz' }
],
output_use => 'cpu.capacity.demand.HOST',
threshold_use => 'cpu.capacity.demand.HOST',
output_template => 'demand frequency is %s kHz',
perfdatas => [
{
value => 'cpu_demand_hertz',
template => '%s',
max => 'cpu_provisioned_hertz',
unit => 'Hz'
}
]
}
}
];
$self->{maps_counters}->{cpu_corecount} = [
{
label => 'corecount-usage',
type => 1,
nlabel => 'cpu.corecount.usage.count',
set => {
output_template => 'CPU cores used: %s',
output_use => 'cpu.corecount.usage.HOST',
key_values => [ { name => 'cpu.corecount.usage.HOST' } ],
threshold_use => 'cpu.corecount.usage.HOST',
perfdatas => [
{
value => 'cpu.corecount.usage.HOST',
template => '%s'
}
]
}
}
];
}
sub manage_selection {
my ($self, %options) = @_;
# Set the list of basic counters IDs
my @counters = (
'cpu.capacity.provisioned.HOST',
'cpu.capacity.usage.HOST'
);
# Add some counters depending on the options
push @counters, 'cpu.capacity.contention.HOST' if ($self->{option_results}->{add_contention});
push @counters, 'cpu.capacity.demand.HOST' if ($self->{option_results}->{add_demand});
push @counters, 'cpu.corecount.provisioned.HOST',
'cpu.corecount.usage.HOST' if ($self->{option_results}->{add_corecount});
# The corecount contention is available but does not seem useful atm. Keeping it here for later
#push @counters_list, 'cpu.corecount.contention.HOST' if ($self->{option_results}->{add_contention} && $self->{option_results}->{add_corecount});
# Get all the needed stats
my %results = map {
$_ => $self->get_esx_stats(%options, cid => $_, esx_id => $self->{esx_id}, esx_name => $self->{esx_name} )
} @counters;
# Fill the counter structure depending on their availability
# Fill the basic stats
if (defined($results{'cpu.capacity.usage.HOST'}) && defined($results{'cpu.capacity.provisioned.HOST'})) {
$self->{cpu_usage} = {
'prct_used' => 100 * $results{'cpu.capacity.usage.HOST'} / $results{'cpu.capacity.provisioned.HOST'},
'cpu_usage_hertz' => $results{'cpu.capacity.usage.HOST'} * 1000,
'cpu_provisioned_hertz' => $results{'cpu.capacity.provisioned.HOST'} * 1000,
'cpu.capacity.usage.HOST' => $results{'cpu.capacity.usage.HOST'}
};
}
# Fill the contention stats
if ( defined($results{'cpu.capacity.contention.HOST'}) ) {
$self->{cpu_contention} = {
'cpu.capacity.contention.HOST' => $results{'cpu.capacity.contention.HOST'}
};
}
# Fill the demand stats
if (defined($results{'cpu.capacity.demand.HOST'}) && defined($results{'cpu.capacity.provisioned.HOST'})) {
$self->{cpu_demand} = {
'prct_demand' => 100 * $results{'cpu.capacity.demand.HOST'} / $results{'cpu.capacity.provisioned.HOST'},
'cpu.capacity.demand.HOST' => $results{'cpu.capacity.demand.HOST'},
'cpu_demand_hertz' => $results{'cpu.capacity.demand.HOST'} * 1000,
'cpu_provisioned_hertz' => $results{'cpu.capacity.provisioned.HOST'} * 1000
};
}
# Fill the corecount stats
if (defined($results{'cpu.corecount.usage.HOST'})) {
$self->{cpu_corecount}->{'cpu.corecount.usage.HOST'} = $results{'cpu.corecount.usage.HOST'};
# This counter is the number of physical CPU cores of the ESX, it does not seem worth monitoring
#$self->{cpu_corecount}->{'cpu.corecount.provisioned.HOST'} = $results{'cpu.corecount.provisioned.HOST'};
}
# Example of retrieved stats:
# $VAR1 = {
# 'cpu.capacity.demand.HOST' => '2790',
# 'cpu.capacity.provisioned.HOST' => '50280',
# 'cpu.capacity.usage.HOST' => '3228.36',
# 'cpu.corecount.provisioned.HOST' => '24',
# 'cpu.capacity.contention.HOST' => '0.55',
# 'cpu.corecount.usage.HOST' => '78',
# 'cpu.corecount.contention.HOST' => '0'
# };
return 1;
}
1;
__END__
=head1 MODE
Monitor the status of VMware ESX hosts through vSphere 8 REST API.
Meaning of the available counters in the VMware API:
- cpu.capacity.provisioned.HOST Capacity in kHz of the physical CPU cores.
- cpu.capacity.usage.HOST CPU usage as a percent during the interval.
- cpu.capacity.contention.HOST Percent of time the virtual machine is unable to run because it is contending for access to the physical CPU(s).
- cpu.capacity.demand.HOST The amount of CPU resources a virtual machine would use if there were no CPU contention or CPU limit.
- cpu.corecount.usage.HOST The number of virtual processors running on the host.
- cpu.corecount.provisioned.HOST The number of virtual processors provisioned to the entity.
- cpu.corecount.contention.HOST Time the virtual machine vCPU is ready to run, but is unable to run due to co-scheduling constraints.
The default metrics provided by this plugin are:
- cpu.capacity.usage.hertz based on the API's cpu.capacity.usage.HOST counter
- cpu.capacity.usage.percentage based on 100 * cpu.capacity.usage.HOST / cpu.capacity.provisioned.HOST
=over 8
=item B<--add-demand>
Add counter related to CPU demand:
C<cpu.capacity.demand.HOST>: The amount of CPU resources a virtual machine would use if there were no CPU contention or CPU limit.
=item B<--add-contention>
Add counter related to CPU demand:
C<cpu.capacity.contention.HOST>: Percent of time the virtual machine is unable to run because it is contending for access to the physical CPU(s).
=item B<--add-corecount>
Add counter related to CPU core count:
C<cpu.corecount.usage.HOST>: The number of virtual processors running on the host.
=item B<--warning-usage-percentage>
Threshold in %.
=item B<--critical-usage-percentage>
Threshold in %.
=item B<--warning-usage-frequency>
Threshold in Hz.
=item B<--critical-usage-frequency>
Threshold in Hz.
=item B<--warning-contention-percentage>
Threshold in %.
=item B<--critical-contention-percentage>
Threshold in %.
=item B<--warning-contention-frequency>
Threshold in Hz.
=item B<--critical-contention-frequency>
Threshold in Hz.
=item B<--warning-demand-percentage>
Threshold in %.
=item B<--critical-demand-percentage>
Threshold in %.
=item B<--warning-demand-frequency>
Threshold in Hz.
=item B<--critical-demand-frequency>
Threshold in Hz.
=item B<--warning-corecount-usage>
Threshold in number of cores.
=item B<--critical-corecount-usage>
Threshold in number of cores.
=back
=cut

View File

@ -1,5 +1,5 @@
#
# Copyright 2024 Centreon (http://www.centreon.com/)
# Copyright 2025 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -1,5 +1,5 @@
#
# Copyright 2024 Centreon (http://www.centreon.com/)
# Copyright 2025 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
@ -20,7 +20,7 @@
package apps::vmware::vsphere8::esx::mode::hoststatus;
use base qw(centreon::plugins::templates::counter);
use base qw(apps::vmware::vsphere8::esx::mode);
use strict;
use warnings;
@ -41,31 +41,7 @@ sub custom_connection_status_output {
sub prefix_host_output {
my ($self, %options) = @_;
return "Host '" . $options{instance_value}->{display} . "': ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$options{options}->add_options(
arguments => {
'esx-name:s' => { name => 'esx_name', default => '.*' },
'warning-power-status:s' => { name => 'warning-power-status' },
'critical-power-status:s' => { name => 'critical-power-status', default => '%{power_state} !~ /^powered_on$/i' },
'warning-connection-status:s' => { name => 'warning-connection-status' },
'critical-connection-status:s' => { name => 'critical-connection-status', default => '%{connection_state} !~ /^connected$/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$self->change_macros(macros => ['warning-power-status', 'critical-power-status', 'warning-connection-status', 'critical-connection-status']);
return "Host '" . $options{instance_value}->{display} . "', id: '" . $options{instance_value}->{id} . "': ";
}
sub set_counters {
@ -73,8 +49,8 @@ sub set_counters {
$self->{maps_counters_type} = [
{
name => 'host',
type => 1,
name => 'host',
type => 1,
cb_prefix_output => 'prefix_host_output',
message_multiple => 'All ESX Hosts are ok'
}
@ -84,20 +60,22 @@ sub set_counters {
{
label => 'power-status',
type => 2,
critical_default => '%{power_state} !~ /^powered_on$/i',
set => {
key_values => [ { name => 'display' }, { name => 'power_state' } ],
closure_custom_output => $self->can('custom_power_status_output'),
closure_custom_perfdata => sub { return 0; },
key_values => [ { name => 'display' }, { name => 'power_state' }, { name => 'id' } ],
closure_custom_output => $self->can('custom_power_status_output'),
closure_custom_perfdata => sub {return 0;},
closure_custom_threshold_check => \&catalog_status_threshold_ng
}
},
{
label => 'connection-status',
type => 2,
critical_default => '%{connection_state} !~ /^connected$/i',
set => {
key_values => [{ name => 'display' }, { name => 'connection_state' }],
closure_custom_output => $self->can('custom_connection_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_output => $self->can('custom_connection_status_output'),
closure_custom_perfdata => sub {return 0;},
closure_custom_threshold_check => \&catalog_status_threshold_ng
}
}
@ -107,14 +85,16 @@ sub set_counters {
sub manage_selection {
my ($self, %options) = @_;
my $response = $options{custom}->request_api(
my $response = $self->request_api(
%options,
'endpoint' => '/vcenter/host',
'method' => 'GET'
);
$self->{host} = {};
foreach my $host (@{$response}) {
next if (!defined($host->{name}) || $host->{name} !~ $self->{option_results}->{esx_name});
next if (!defined($host->{name}) || defined($self->{option_results}->{esx_name}) && $host->{name} ne $self->{option_results}->{esx_name});
next if (!defined($host->{host}) || defined($self->{option_results}->{esx_id}) && $host->{host} ne $self->{option_results}->{esx_id});
$self->{host}->{$host->{host}} = {
display => $host->{name},
@ -140,11 +120,6 @@ Monitor the status of VMware ESX hosts through vSphere 8 REST API.
=over 8
=item B<--esx-name>
Define which ESX server to monitor based on their name.
This option will be treated as a regular expression.
=item B<--warning-power-status>
Define the warning threshold for the power status of the ESX host.

View File

@ -0,0 +1,147 @@
#
# Copyright 2025 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 apps::vmware::vsphere8::esx::mode::memory;
use strict;
use warnings;
use base qw(apps::vmware::vsphere8::esx::mode);
my @counters = (
#'mem.reservedCapacityPct.HOST', # Percent of memory that has been reserved either through VMkernel use, by userworlds or due to virtual machine memory reservations.
#'mem.capacity.provisioned.HOST', # Total amount of memory available to the host.
'mem.capacity.usable.HOST', # Amount of physical memory available for use by virtual machines on this host
#'mem.capacity.usage.HOST', # Amount of physical memory actively used
#'mem.capacity.contention.HOST', # Percentage of time VMs are waiting to access swapped, compressed or ballooned memory.
'mem.consumed.vms.HOST', # Amount of physical memory consumed by VMs on this host.
#'mem.consumed.userworlds.HOST' # Amount of physical memory consumed by userworlds on this host
);
sub custom_memory_output {
my ($self, %options) = @_;
return sprintf(
'Memory used: %s %s used - Usable: %s %s',
$self->{perfdata}->change_bytes(value => $self->{result_values}->{used_bytes}),
$self->{perfdata}->change_bytes(value => $self->{result_values}->{max_bytes})
);
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'memory', type => 0, message_separator => ' - '}
];
$self->{maps_counters}->{memory} = [
{
label => 'vms-usage-percentage',
type => 1,
nlabel => 'vms.memory.usage.percentage',
set => {
key_values => [ { name => 'used_prct' } ],
output_template => '%2.f%% of usable memory is used by VMs',
output_use => 'used_prct',
threshold_use => 'used_prct',
perfdatas => [
{
value => 'used_prct',
template => '%.2f',
min => 0,
max => 100,
unit => '%'
}
]
}
},
{
label => 'vms-usage-bytes',
type => 1,
nlabel => 'vms.memory.usage.bytes',
set => {
key_values => [ { name => 'used_bytes' }, { name => 'max_bytes' } ],
closure_custom_output => $self->can('custom_memory_output'),
threshold_use => 'used_bytes',
perfdatas => [
{
value => 'used_bytes',
template => '%d',
max => 'max_bytes',
unit => 'B'
}
]
}
}
];
}
sub manage_selection {
my ($self, %options) = @_;
my %structure = map {
$_ => $self->get_esx_stats(%options, cid => $_, esx_id => $self->{esx_id}, esx_name => $self->{esx_name} )
} @counters;
if (defined($structure{'mem.capacity.usable.HOST'}) && defined($structure{'mem.consumed.vms.HOST'})) {
$self->{output}->add_option_msg(long_msg => 'Retrieved value for mem.capacity.usable.HOST: ' . $structure{'mem.capacity.usable.HOST'});
$self->{output}->add_option_msg(long_msg => 'Retrieved value for mem.consumed.vms.HOST: ' . $structure{'mem.consumed.vms.HOST'});
$self->{memory} = {
used_prct => (100 * $structure{'mem.consumed.vms.HOST'} / $structure{'mem.capacity.usable.HOST'}),
used_bytes => int(1024 * 1024 * $structure{'mem.consumed.vms.HOST'}),
max_bytes => int(1024 * 1024 * $structure{'mem.capacity.usable.HOST'})
};
}
return 1;
}
1;
=head1 MODE
Monitor the memory of VMware ESX hosts consumed by the virtual machines through vSphere 8 REST API.
Meaning of the available counters in the VMware API:
mem.reservedCapacityPct.HOST Percent of memory that has been reserved either through VMkernel use, by userworlds or due to virtual machine memory reservations.
mem.capacity.provisioned.HOST Total amount of memory available to the host.
mem.capacity.usable.HOST Amount of physical memory available for use by virtual machines on this host
mem.capacity.usage.HOST Amount of physical memory actively used
mem.capacity.contention.HOST Percentage of time VMs are waiting to access swapped, compressed or ballooned memory.
mem.consumed.vms.HOST Amount of physical memory consumed by VMs on this host.
mem.consumed.userworlds.HOST Amount of physical memory consumed by userworlds on this host
=over 8
=item B<--warning-vms-usage-percentage>
Thresholds in percentage.
=item B<--critical-vms-usage-percentage>
Thresholds in percentage.
=item B<--warning-vms-usage-bytes>
Thresholds in bytes.
=item B<--critical-vms-usage-bytes>
Thresholds in bytes.

View File

@ -0,0 +1,92 @@
#
# Copyright 2025 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 apps::vmware::vsphere8::esx::mode::power;
use strict;
use warnings;
use base qw(apps::vmware::vsphere8::esx::mode);
my @counters = (
'power.capacity.usage.HOST', # Current power usage.
);
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'power', type => 0 }
];
$self->{maps_counters}->{power} = [
{
label => 'power-usage-watts',
type => 1,
nlabel => 'power.capacity.usage.watts',
output_template => 'Power usage is %d Watts',
set => {
output_template => 'Power usage is %d Watts',
key_values => [ { name => 'power.capacity.usage.HOST' } ],
output_use => 'power.capacity.usage.HOST',
threshold_use => 'power.capacity.usage.HOST',
perfdatas => [ { value => 'power.capacity.usage.HOST', template => '%sW' } ]
}
}
];
}
sub manage_selection {
my ($self, %options) = @_;
my %structure = map {
$_ => $self->get_esx_stats(%options, cid => $_, esx_id => $self->{esx_id}, esx_name => $self->{esx_name} )
} @counters;
$self->{power} = \%structure;
return 1;
}
1;
=head1 MODE
Monitor the power consumption of VMware ESX hosts through vSphere 8 REST API.
Meaning of the available counters in the VMware API:
- power.capacity.usable.HOST Current maximum allowed power usage.
- power.capacity.usage.HOST Current power usage.
- power.capacity.usagePct.HOST Current power usage as a percentage of maximum allowed power.
Since our tests showed that only C<power.capacity.usage.HOST> was different from zero, the other counters are ignored at the moment.
=over 8
=item B<--warning-power-usage-watts>
Threshold in Watts.
=item B<--critical-power-usage-watts>
Threshold in Watts.
=back
=cut

View File

@ -1,5 +1,5 @@
#
# Copyright 2024 Centreon (http://www.centreon.com/)
# Copyright 2025 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
@ -31,8 +31,11 @@ sub new {
$self->{version} = '0.1';
$self->{modes} = {
'discovery' => 'apps::vmware::vsphere8::esx::mode::discovery',
'host-status' => 'apps::vmware::vsphere8::esx::mode::hoststatus'
'cpu' => 'apps::vmware::vsphere8::esx::mode::cpu',
'discovery' => 'apps::vmware::vsphere8::esx::mode::discovery',
'host-status' => 'apps::vmware::vsphere8::esx::mode::hoststatus',
'memory' => 'apps::vmware::vsphere8::esx::mode::memory',
'power' => 'apps::vmware::vsphere8::esx::mode::power',
};
$self->{custom_modes}->{api} = 'apps::vmware::vsphere8::custom::api';

View File

@ -69,6 +69,14 @@ sub set_counters {
{ label => 'active_tunnels', template => '%d', min => 0, unit => 'tunnels', label_extra_instance => 1 }
]
}
},
{ label => 'ipsec-tunnels-count', nlabel => 'vpn.ipsec.tunnels.state.count', set => {
key_values => [ { name => 'ipsec_tunnels_count' } ],
output_template => 'IPSec tunnels state up: %s',
perfdatas => [
{ label => 'ipsec-tunnels-count', template => '%d', min => 0, unit => 'tunnels', label_extra_instance => 1 }
]
}
}
];
@ -186,6 +194,7 @@ sub manage_selection {
$self->{vd} = {};
my $duplicated = {};
my $ipsec_tunnels_counter = 0;
foreach my $oid (keys %{$snmp_result->{ $oid_fgVdEntName }}) {
$oid =~ /^$oid_fgVdEntName\.(.*)$/;
my $vdom_instance = $1;
@ -203,7 +212,8 @@ sub manage_selection {
global => {
users => $result->{fgVpnSslStatsLoginUsers},
tunnels => $result->{fgVpnSslStatsActiveTunnels},
sessions => $result->{fgVpnSslStatsActiveWebSessions}
sessions => $result->{fgVpnSslStatsActiveWebSessions},
ipsec_tunnels_count => $ipsec_tunnels_counter
},
vpn => {},
};
@ -238,8 +248,13 @@ sub manage_selection {
traffic_in => $result->{fgVpnTunEntInOctets} * 8,
traffic_out => $result->{fgVpnTunEntOutOctets} * 8
};
# count tunnels in state up
if ($self->{vd}->{$vdomain_name}->{vpn}->{$name}->{state} eq "up") {
$ipsec_tunnels_counter++;
};
}
}
$self->{vd}->{$vdomain_name}->{global}->{ipsec_tunnels_count} = $ipsec_tunnels_counter;
}
}
1;
@ -258,11 +273,11 @@ Filter name with regexp. Can be ('vdomain', 'vpn')
=item B<--warning-*>
Warning on counters. Can be ('users', 'sessions', 'tunnels', 'traffic-in', 'traffic-out')
Warning on counters. Can be ('users', 'sessions', 'tunnels', 'traffic-in', 'traffic-out', 'ipsec-tunnels-count')
=item B<--critical-*>
Warning on counters. Can be ('users', 'sessions', 'tunnels', 'traffic-in', 'traffic-out')
Critical on counters. Can be ('users', 'sessions', 'tunnels', 'traffic-in', 'traffic-out', 'ipsec-tunnels-count'))
=item B<--warning-status>

View File

@ -43,7 +43,7 @@ sub custom_select_threshold {
$self->{instance_mode}->{safe}->reval($self->{result_values}->{config}->{warning})) {
$status = 'warning';
} elsif (defined($self->{result_values}->{config}->{unknown}) && $self->{result_values}->{config}->{unknown} &&
$self->{instance_mode}->reval($self->{result_values}->{config}->{unknown})) {
$self->{instance_mode}->{safe}->reval($self->{result_values}->{config}->{unknown})) {
$status = 'unknown';
}
if ($@) {

View File

@ -56,22 +56,22 @@ Set resource group (required if resource's name is used).
=item B<--warning-status>
Define the conditions to match for the status to be WARNING (default: '').
You can use the following variables: %{status}, %{summary}
You can use the following variables: C<%{status}>, C<%{summary}>.
=item B<--critical-status>
Define the conditions to match for the status to be CRITICAL (default: '%{status} =~ /^Unavailable$/').
You can use the following variables: %{status}, %{summary}
Define the conditions to match for the status to be CRITICAL (default: C<'%{status} =~ /^Unavailable$/'>).
You can use the following variables: C<%{status}>, C<%{summary}>.
=item B<--unknown-status>
Define the conditions to match for the status to be UNKNOWN (default: '%{status} =~ /^Unknown$/').
You can use the following variables: %{status}, %{summary}
Define the conditions to match for the status to be UNKNOWN (default: C<'%{status} =~ /^Unknown$/'>).
You can use the following variables: C<%{status}>, C<%{summary}>.
=item B<--ok-status>
Define the conditions to match for the status to be OK (default: '%{status} =~ /^Available$/').
You can use the following variables: %{status}, %{summary}
Define the conditions to match for the status to be OK (default: C<'%{status} =~ /^Available$/''>).
You can use the following variables: C<%{status}>, C<%{summary}>.
=back

View File

@ -129,15 +129,11 @@ Example:
Using resource name:
perl centreon_plugins.pl --plugin=cloud::azure::network::vpngateway::plugin --custommode=azcli --mode=site-traffic
--resource=MyResource --resource-group=MYRGROUP --aggregation='average' --aggregation='total' --critical-bandwidth-average='10'
--verbose
C<perl centreon_plugins.pl --plugin=cloud::azure::network::vpngateway::plugin --custommode=azcli --mode=site-traffic --resource=MyResource --resource-group=MYRGROUP --aggregation='average' --aggregation='total' --critical-bandwidth-average='10' --verbose>
Using resource ID:
perl centreon_plugins.pl --plugin=cloud::azure::network::vpngateway::plugin --custommode=azcli --mode=site-traffic
--resource='/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Network/virtualNetworkGateways/xxx'
--aggregation='average' --aggregation='total' --critical-bandwidth-average='10' --verbose
C<perl centreon_plugins.pl --plugin=cloud::azure::network::vpngateway::plugin --custommode=azcli --mode=site-traffic --resource='/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Network/virtualNetworkGateways/xxx' --aggregation='average' --aggregation='total' --critical-bandwidth-average='10' --verbose>
Default aggregation: 'average' (*Bandwidth), 'total' (P2SConnectionCount)
@ -153,18 +149,33 @@ Set resource group (required if resource's name is used).
=item B<--filter-metric>
Filter metrics (can be: 'AverageBandwidth', 'P2SBandwidth', 'P2SConnectionCount')
Filter metrics (can be: C<AverageBandwidth>, C<P2SBandwidth>, C<P2SConnectionCount>)
(can be a regexp).
=item B<--warning-$label$>
Warning thresholds
($label$ can be: 'bandwidth-average', 'p2s-bandwidth', p2s-connections)
=item B<--warning-bandwidth-average>
=item B<--critical-$label$>
Thresholds.
Critical thresholds
($label$ can be: 'bandwidth-average', 'p2s-bandwidth', p2s-connections)
=item B<--critical-bandwidth-average>
Thresholds.
=item B<--warning-p2s-bandwidth>
Thresholds.
=item B<--critical-p2s-bandwidth>
Thresholds.
=item B<--warning-p2s-connections>
Thresholds.
=item B<--critical-p2s-connections>
Thresholds.
=back

View File

@ -1,3 +1,4 @@
#
# Copyright 2024 Centreon (http://www.centreon.com/)
#
@ -175,15 +176,55 @@ Filter metrics (can be: 'TunnelIngressBytes', 'TunnelEgressBytes', 'TunnelIngres
'TunnelEgressPackets', 'TunnelIngressPacketDropTSMismatch', 'TunnelEgressPacketDropTSMismatch')
(can be a regexp).
=item B<--warning-$label$>
=item B<--warning-traffic-in>
Warning thresholds.
($label$ can be traffic-in, traffic-out, packets-in, packets-out, dropped-packets-in, dropped-packets-out)
Thresholds.
=item B<--critical-traffic-in>
Thresholds.
=item B<--warning-traffic-out>
Thresholds.
=item B<--critical-traffic-out>
Thresholds.
=item B<--warning-packets-in>
Thresholds.
=item B<--critical-packets-in>
Thresholds.
=item B<--warning-packets-out>
Thresholds.
=item B<--critical-packets-out>
Thresholds.
=item B<--warning-dropped-packets-in>
Thresholds.
=item B<--critical-dropped-packets-in>
Thresholds.
=item B<--warning-dropped-packets-out>
Thresholds.
=item B<--critical-dropped-packets-out>
Thresholds.
=item B<--critical-$label$>
Critical thresholds
($label$ can be traffic-in, traffic-out, packets-in, packets-out, dropped-packets-in, dropped-packets-out)
=item B<--per-sec>

View File

@ -98,7 +98,7 @@ sub manage_selection {
&& $vpn->{name} !~ /$self->{option_results}->{filter_name}/);
$self->{vpns}->{$vpn->{id}} = {
display => $vpn->{name},
name => $vpn->{name},
provisioning_state => ($vpn->{provisioningState}) ? $vpn->{provisioningState} : $vpn->{properties}->{provisioningState},
gateway_type => ($vpn->{gatewayType}) ? $vpn->{gatewayType} : $vpn->{properties}->{gatewayType},
vpn_type => ($vpn->{vpnType}) ? $vpn->{vpnType} : $vpn->{properties}->{vpnType},
@ -120,8 +120,7 @@ __END__
Check VPN gateways status.
Example:
perl centreon_plugins.pl --plugin=cloud::azure::network::vpngateway::plugin --custommode=azcli --mode=vpn-gateways-status
--resource-group='MYRESOURCEGROUP' --verbose
C<perl centreon_plugins.pl --plugin=cloud::azure::network::vpngateway::plugin --custommode=azcli --mode=vpn-gateways-status --resource-group='MYRESOURCEGROUP' --verbose>
=over 8
@ -131,16 +130,16 @@ Set resource group (required).
=item B<--filter-name>
Filter vpn name (can be a regexp).
Filter VPN Gateways by name (can be a regexp).
=item B<--warning-status>
Define the conditions to match for the status to be WARNING (default: '').
You can use the following variables: %{provisioning_state}, %{gateway_type}, %{vpn_type}, %{display}
You can use the following variables: %{provisioning_state}, %{gateway_type}>, %{vpn_type}, %{display}
=item B<--critical-status>
Define the conditions to match for the status to be CRITICAL (default: '%{provisioning_state} ne "Succeeded"').
Define the conditions to match for the status to be CRITICAL (default: C<'%{provisioning_state} ne "Succeeded"'>).
You can use the following variables: %{provisioning_state}, %{gateway_type}, %{vpn_type}, %{display}
=back

View File

@ -197,6 +197,7 @@ $mapping = {
$thresholds = {
numeric => [
['unavailable', 'UNKNOWN'],
['absent', 'OK'],
['normal', 'OK'],
['belowLowerCritical', 'CRITICAL'],
['belowLowerWarning', 'WARNING'],

View File

@ -43,12 +43,16 @@ sub load {
sub check {
my ($self, %options) = @_;
my $power_factor_dependencies;
foreach my $component (sort keys %raritan_type) {
my $long_msg = 0;
next if ($component !~ /$options{component}/);
if ($options{component} eq 'powerFactor') {
next if ($component !~ /activePower|onOff|powerFactor/);
} elsif ($component !~ /$options{component}/) {
next;
}
$self->{components}->{$component} = { name => $component, total => 0, skip => 0 };
next if ($self->check_filter(section => $component));
my $instance_type = $raritan_type{$component};
my $value_type = $map_type{$instance_type};
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}})) {
@ -77,17 +81,38 @@ sub check {
next if ($self->check_filter(section => $component, instance => $instance));
if ($long_msg == 0) {
$self->{output}->output_add(long_msg => "Checking " . $component);
$long_msg = 1;
if ($component =~ /$options{component}/) {
$self->{components}->{$component}->{total}++;
}
$self->{components}->{$component}->{total}++;
my $value = (defined($result->{Value}) && $result->{Value} ne '') ? $result->{Value} : '-';
if ($value =~ /[0-9]/) {
$value *= 10 ** -int($result->{Decimal});
}
if ($component eq 'activePower' && $value == 0) {
$power_factor_dependencies->{$instance}->{activePower} = 1;
}
if ($component eq 'onOff') {
if ($result->{State} eq 'off') {
$power_factor_dependencies->{$instance}->{absent} = 1;
} elsif (defined($power_factor_dependencies->{$instance}->{activePower})) {
$power_factor_dependencies->{$instance}->{absent} = 1;
}
}
if ($component eq 'powerFactor' && defined($power_factor_dependencies->{$instance}->{absent})) {
$result->{State} = 'absent';
}
next if ($component !~ /$options{component}/);
if ($long_msg == 0) {
$self->{output}->output_add(long_msg => "Checking " . $component);
$long_msg = 1;
}
$self->{output}->output_add(
long_msg => sprintf(
"'%s' %s state is '%s' [instance: %s, value: %s, unit: %s, label: %s, pdu: %s]",
@ -158,7 +183,7 @@ sub check {
my $nunit = (defined($result->{Unit}->{nunit}) ? $result->{Unit}->{nunit} : lc($result->{Unit}->{unit}));
$self->{output}->perfdata_add(
nlabel => 'hardware.sensor.' . $options{type} . '.' . lc($component) . '.' . $nunit,
nlabel => $nunit ne '' ? 'hardware.sensor.' . $options{type} . '.' . lc($component) . '.' . $nunit : 'hardware.sensor.' . $options{type} . '.' . lc($component),
unit => $result->{Unit}->{unit},
instances => [$pduName, $instance],
value => $value,

View File

@ -77,8 +77,10 @@ sub check {
);
next;
}
$self->{components}->{memory}->{total}++;
if($result->{cucsMemoryUnitPresence} eq "equipped") {
$self->{components}->{memory}->{total}++;
}
$exit = $self->get_severity(section => 'memory.operability', label => 'default.operability', value => $result2->{cucsMemoryUnitOperState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {

View File

@ -60,14 +60,14 @@ __END__
=head1 MODE
Check Hardware (Fans, Power supplies, chassis, io cards, blades, fabric extenders).
Check Hardware (Fans, Power supplies, chassis, I/O cards, blades, fabric extenders).
=over 8
=item B<--component>
Which component to check (default: '.*').
Can be: 'fan', 'psu', 'chassis', 'iocard', 'blade', 'fex', 'cpu', 'memory', 'localdisk'.
Can be: C<fan>, C<psu>, C<chassis>, C<iocard>, C<blade>, C<fex>, C<cpu>, C<memory>, C<localdisk>.
=item B<--filter>
@ -89,6 +89,9 @@ Use this option to override the status returned by the plugin when the status la
Example: --threshold-overload='fan.operability,OK,poweredOff|removed'
--threshold-overload='presence,OK,missing'
--threshold-overload='operability,OK,removed'
NB: For the memory component you may need to set this option twice if presence status doesn't
return OK state and you want to override the operability status. Example when memories are missing because of removing.
--threshold-overload='presence,OK,missing' --threshold-overload='operability,OK,removed'
=back

View File

@ -30,14 +30,17 @@ sub new {
bless $self, $class;
$self->{modes} = {
'cpu' => 'network::aruba::aoscx::snmp::mode::cpu',
'hardware' => 'network::aruba::aoscx::snmp::mode::hardware',
'interfaces' => 'snmp_standard::mode::interfaces',
'list-interfaces' => 'snmp_standard::mode::listinterfaces',
'memory' => 'network::aruba::aoscx::snmp::mode::memory',
'stack' => 'network::aruba::aoscx::snmp::mode::stack',
'vsf' => 'network::aruba::aoscx::snmp::mode::vsf',
'vsx' => 'network::aruba::aoscx::snmp::mode::vsx'
'cpu' => 'network::aruba::aoscx::snmp::mode::cpu',
'hardware' => 'network::aruba::aoscx::snmp::mode::hardware',
'interfaces' => 'snmp_standard::mode::interfaces',
'list-interfaces' => 'snmp_standard::mode::listinterfaces',
'list-spanning-trees' => 'snmp_standard::mode::listspanningtrees',
'memory' => 'network::aruba::aoscx::snmp::mode::memory',
'spanning-tree' => 'snmp_standard::mode::spanningtree',
'stack' => 'network::aruba::aoscx::snmp::mode::stack',
'uptime' => 'snmp_standard::mode::uptime',
'vsf' => 'network::aruba::aoscx::snmp::mode::vsf',
'vsx' => 'network::aruba::aoscx::snmp::mode::vsx'
};
return $self;

View File

@ -172,48 +172,68 @@ sub check_options {
}
my $mapping = {
antivirus1 => {
name => '.1.3.6.1.4.1.50853.1.2.6.1.1',
version => '.1.3.6.1.4.1.50853.1.2.6.1.2',
date => '.1.3.6.1.4.1.50853.1.2.6.1.3',
expiration => '.1.3.6.1.4.1.50853.1.2.6.1.4'
new => {
antivirus1 => {
name => '.1.3.6.1.4.1.50853.1.2.6.1.1.0',
version => '.1.3.6.1.4.1.50853.1.2.6.1.2.0',
date => '.1.3.6.1.4.1.50853.1.2.6.1.3.0',
expiration => '.1.3.6.1.4.1.50853.1.2.6.1.4.0'
},
antivirus2 => {
name => '.1.3.6.1.4.1.50853.1.2.6.2.1.0',
version => '.1.3.6.1.4.1.50853.1.2.6.2.2.0',
date => '.1.3.6.1.4.1.50853.1.2.6.2.3.0',
expiration => '.1.3.6.1.4.1.50853.1.2.6.2.4.0'
}
},
antivirus2 => {
name => '.1.3.6.1.4.1.50853.1.2.6.2.1',
version => '.1.3.6.1.4.1.50853.1.2.6.2.2',
date => '.1.3.6.1.4.1.50853.1.2.6.2.3',
expiration => '.1.3.6.1.4.1.50853.1.2.6.2.4'
old => {
antivirus1 => {
name => '.1.3.6.1.4.1.50853.1.2.6.1.1',
version => '.1.3.6.1.4.1.50853.1.2.6.1.2',
date => '.1.3.6.1.4.1.50853.1.2.6.1.3',
expiration => '.1.3.6.1.4.1.50853.1.2.6.1.4'
},
antivirus2 => {
name => '.1.3.6.1.4.1.50853.1.2.6.2.1',
version => '.1.3.6.1.4.1.50853.1.2.6.2.2',
date => '.1.3.6.1.4.1.50853.1.2.6.2.3',
expiration => '.1.3.6.1.4.1.50853.1.2.6.2.4'
}
}
};
sub add_antivirus {
my ($self, %options) = @_;
my $name = $options{snmp_result}->{ $mapping->{ $options{label} }->{name} };
my $antivirus_mapping = defined($options{snmp_result}->{ $mapping->{new}->{ $options{label} }->{name} }) ? $mapping->{new}->{ $options{label} } : $mapping->{old}->{ $options{label} };
my $name = $options{snmp_result}->{ $antivirus_mapping->{name} };
$self->{antivirus}->{$name} = {
name => $name,
version => $options{snmp_result}->{ $mapping->{ $options{label} }->{version} }
version => $options{snmp_result}->{ $antivirus_mapping->{version} }
};
if ($options{snmp_result}->{ $mapping->{ $options{label} }->{expiration} } =~ /permanent/i) {
if ($options{snmp_result}->{ $antivirus_mapping->{expiration} } =~ /permanent/i) {
$self->{antivirus}->{$name}->{expires_seconds} = 'permanent';
$self->{antivirus}->{$name}->{expires_human} = '-';
} else {
my $dt = $self->{ $options{label} . '_strp' }->parse_datetime($options{snmp_result}->{ $mapping->{ $options{label} }->{expiration} });
my $dt = $self->{ $options{label} . '_strp' }->parse_datetime($options{snmp_result}->{ $antivirus_mapping->{expiration} });
if (defined($dt)) {
$self->{antivirus}->{$name}->{expires_seconds} = $dt->epoch() - time();
$self->{antivirus}->{$name}->{expires_seconds} = 0 if ($self->{antivirus}->{$name}->{expires_seconds} < 0);
$self->{antivirus}->{$name}->{expires_human} = centreon::plugins::misc::change_seconds(value => $self->{antivirus}->{$name}->{expires_seconds});
} else {
$self->{output}->output_add(long_msg => "cannot parse date: " . $options{snmp_result}->{ $mapping->{ $options{label} }->{expiration} } . ' (please use option --' . $options{label} . '-date-format)');
$self->{output}->output_add(long_msg => "cannot parse date: " . $options{snmp_result}->{ $antivirus_mapping->{expiration} } . ' (please use option --' . $options{label} . '-date-format)');
}
}
my $dt = $self->{ $options{label} . '_strp' }->parse_datetime($options{snmp_result}->{ $mapping->{ $options{label} }->{date} });
my $dt = $self->{ $options{label} . '_strp' }->parse_datetime($options{snmp_result}->{ $antivirus_mapping->{date} });
if (defined($dt)) {
$self->{antivirus}->{$name}->{db_lastupdate_time} = time() - $dt->epoch();
} else {
$self->{output}->output_add(long_msg => "cannot parse date: " . $options{snmp_result}->{ $mapping->{ $options{label} }->{date} } . ' (please use option --' . $options{label} . '-date-format)');
$self->{output}->output_add(long_msg => "cannot parse date: " . $options{snmp_result}->{ $antivirus_mapping->{date} } . ' (please use option --' . $options{label} . '-date-format)');
}
}
@ -221,7 +241,10 @@ sub manage_selection {
my ($self, %options) = @_;
my $snmp_result = $options{snmp}->get_leef(
oids => [ map($_, values(%{$mapping->{antivirus1}}), values(%{$mapping->{antivirus2}})) ],
oids => [
map($_, values(%{$mapping->{new}->{antivirus1}}), values(%{$mapping->{new}->{antivirus2}})),
map($_, values(%{$mapping->{old}->{antivirus1}}), values(%{$mapping->{old}->{antivirus2}}))
],
nothing_quit => 1
);

View File

@ -24,6 +24,7 @@ use strict;
use warnings;
use centreon::plugins::http;
use JSON::XS;
use Digest::MD5 qw(md5_hex);
sub new {
my ($class, %options) = @_;
@ -52,7 +53,8 @@ sub new {
'critical-http-status:s' => { name => 'critical_http_status' },
'as400-hostname:s' => { name => 'as400_hostname' },
'as400-username:s' => { name => 'as400_username' },
'as400-password:s' => { name => 'as400_password' }
'as400-password:s' => { name => 'as400_password' },
'as400-ssl' => { name => 'as400_ssl' }
});
}
$options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1);
@ -86,6 +88,7 @@ sub check_options {
$self->{as400_hostname} = (defined($self->{option_results}->{as400_hostname})) ? $self->{option_results}->{as400_hostname} : '';
$self->{as400_username} = (defined($self->{option_results}->{as400_username})) ? $self->{option_results}->{as400_username} : '';
$self->{as400_password} = (defined($self->{option_results}->{as400_password})) ? $self->{option_results}->{as400_password} : '';
$self->{as400_ssl} = (defined($self->{option_results}->{as400_ssl})) ? 1 : 0;
if ($self->{connector_hostname} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --connector-hostname option.");
@ -151,9 +154,16 @@ sub request_api {
host => $self->{as400_hostname},
login => $self->{as400_username},
password => $self->{as400_password},
ssl => $self->{as400_ssl},
command => $options{command}
};
$post->{args} = $options{args} if (defined($options{args}));
if (defined($options{args})) {
$post->{args} = $options{args};
if (defined($post->{args}->{uuid})) {
$post->{args}->{uuid} = md5_hex($post->{args}->{uuid});
}
}
my $encoded;
eval {
$encoded = encode_json($post);
@ -240,6 +250,10 @@ AS/400 username (required)
AS/400 password (required)
=item B<--as400-ssl>
Use SSL connection (port: 9475)
=back
=head1 DESCRIPTION

View File

@ -167,6 +167,18 @@ sub new {
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$self->{uuid} = '';
foreach ('filter_counters', 'filter_disk_name') {
if (defined($self->{option_results}->{$_}) && $self->{option_results}->{$_} ne '') {
$self->{uuid} .= $self->{option_results}->{$_};
}
}
}
my $map_disk_status = {
0 => 'noUnitControl', 1 => 'active', 2 => 'failed',
3 => 'otherDiskSubFailed', 4 => 'hwFailurePerf', 5 => 'hwFailureOk',
@ -178,9 +190,12 @@ my $map_disk_status = {
sub manage_selection {
my ($self, %options) = @_;
my %cmd = (command => 'listDisks');
my %cmd = (command => 'listDisks', args => {});
if (defined($self->{option_results}->{disk_name}) && $self->{option_results}->{disk_name} ne '') {
$cmd{args} = { diskName => $self->{option_results}->{disk_name} };
$cmd{args}->{diskName} = $self->{option_results}->{disk_name};
}
if ($self->{uuid} ne '') {
$cmd{args}->{uuid} = $self->{uuid};
}
my $disks = $options{custom}->request_api(%cmd);

View File

@ -59,10 +59,26 @@ sub new {
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$self->{uuid} = '';
foreach ('filter_counters', 'filter_name', 'filter_active_status', 'filter_subsystem') {
if (defined($self->{option_results}->{$_}) && $self->{option_results}->{$_} ne '') {
$self->{uuid} .= $self->{option_results}->{$_};
}
}
}
sub manage_selection {
my ($self, %options) = @_;
my $jobs = $options{custom}->request_api(command => 'listJobs');
my %cmd = (command => 'listJobs', args => {});
if ($self->{uuid} ne '') {
$cmd{args}->{uuid} = $self->{uuid};
}
my $jobs = $options{custom}->request_api(%cmd);
$self->{global} = { total => 0 };
foreach my $entry (@{$jobs->{result}}) {

View File

@ -44,7 +44,7 @@ sub check_options {
sub manage_selection {
my ($self, %options) = @_;
return $options{custom}->request_api(command => 'listDisks');
return $options{custom}->request_api(command => 'listDisks', args => { uuid => 'svc-discovery' });
}
my $map_disk_status = {

View File

@ -44,7 +44,7 @@ sub check_options {
sub manage_selection {
my ($self, %options) = @_;
return $options{custom}->request_api(command => 'listSubsystems');
return $options{custom}->request_api(command => 'listSubsystems', args => { uuid => 'svc-discovery' });
}
my $map_subsys_status = {

View File

@ -128,6 +128,18 @@ sub new {
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$self->{uuid} = '';
foreach ('filter_counters', 'filter_subsystem_name', 'filter_subsystem_library') {
if (defined($self->{option_results}->{$_}) && $self->{option_results}->{$_} ne '') {
$self->{uuid} .= $self->{option_results}->{$_};
}
}
}
my $map_subsys_status = {
'*ACTIVE' => 'active',
'*ENDING' => 'ending',
@ -139,7 +151,11 @@ my $map_subsys_status = {
sub manage_selection {
my ($self, %options) = @_;
my $subsys = $options{custom}->request_api(command => 'listSubsystems');
my %cmd = (command => 'listSubsystems', args => {});
if ($self->{uuid} ne '') {
$cmd{args}->{uuid} = $self->{uuid};
}
my $subsys = $options{custom}->request_api(%cmd);
$self->{global} = { total => 0, active => 0, ending => 0, inactive => 0, restricted => 0, starting => 0 };
$self->{subsys} = {};

View File

@ -82,7 +82,8 @@ sub new {
bless $self, $class;
$options{options}->add_options(arguments => {
'unit:s' => { name => 'unit', default => 'd' }
'unit:s' => { name => 'unit', default => 'd' },
'timezone:s' => { name => 'timezone'}
});
return $self;
@ -95,6 +96,10 @@ sub check_options {
if ($self->{option_results}->{unit} eq '' || !defined($unitdiv->{$self->{option_results}->{unit}})) {
$self->{option_results}->{unit} = 'd';
}
if (defined($self->{option_results}->{timezone}) && $self->{option_results}->{timezone} ne '' && $self->{option_results}->{timezone} !~ /^[A-Za-z_\/0-9-]+$/) {
$self->{output}->add_option_msg(short_msg => "Wrong timezone format '" . $self->{option_results}->{timezone} . "'. (Example format: 'America/Los_Angeles')");
$self->{output}->option_exit();
}
}
sub manage_selection {
@ -112,6 +117,16 @@ sub manage_selection {
foreach my $oid (keys %$snmp_result) {
if ($snmp_result->{$oid} =~ /\s+(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/) {
my $dt = DateTime->new(year => $1, month => $2, day => $3, hour => $4, minute => $5, second => $6);
# if the equipment check is on another timezone than the system where the plugin is executed.
if (defined($self->{option_results}->{timezone})){
eval {
$dt = $dt->set_time_zone($self->{option_results}->{timezone});
};
if ($@) {
$self->{output}->add_option_msg(short_msg => "Invalid timezone provided: '" . $self->{option_results}->{timezone} . "'. Check in /usr/share/zoneinfo for valid time zones.");
$self->{output}->option_exit();
}
}
my $lastExecSeconds = $ctime - $dt->epoch();
if ($self->{global}->{lastExecSeconds} == -1 || $self->{global}->{lastExecSeconds} > $lastExecSeconds) {
$self->{global}->{lastExecSeconds} = $lastExecSeconds;
@ -144,6 +159,11 @@ Check last time filesystems had been cleaned.
Select the time unit for thresholds. May be 's' for seconds, 'm' for minutes, 'h' for hours, 'd' for days, 'w' for weeks (default: 'd').
=item B<--timezone>
Set equipment timezone if different from Europe/London. Valid time zones can be found in C</usr/share/zoneinfo>.
Format example : Europe/Paris and America/Los_Angeles
=item B<--warning-*> B<--critical-*>
Thresholds.

View File

@ -76,7 +76,7 @@ sub get_shelves {
return if (defined($self->{shelves}));
$self->{shelves} = $self->{custom}->request_api(endpoint => '/api/storage/shelves?fields=name,state,serial_number,bay,frus');
$self->{shelves} = $self->{custom}->request_api(endpoint => '/api/storage/shelves?fields=name,state,serial_number,bays,frus');
}
sub save_custom {

View File

@ -58,7 +58,7 @@ sub set_counters {
key_values => [
{ name => 'category' }, { name => 'code' },
{ name => 'severity' }, { name => 'opened' }, { name => 'state' },
{ name => 'component_name' }, { name => 'issue' }
{ name => 'component_name' }, { name => 'issue' }, { name => 'flagged' }
],
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
@ -98,7 +98,7 @@ sub manage_selection {
my $last_time;
if (defined($self->{option_results}->{memory})) {
$self->{statefile_cache}->read(statefile => 'purestorage_' . $self->{mode} . '_' . $options{custom}->get_connection_infos());
$self->{statefile_cache}->read(statefile => 'purestorage_' . $self->{mode} . '_' . $options{custom}->get_connection_info());
$last_time = $self->{statefile_cache}->get(name => 'last_time');
}
@ -166,12 +166,12 @@ Filter by category name (can be a regexp).
=item B<--warning-status>
Define the conditions to match for the status to be WARNING (default: '%{state} ne "closed" and %{severity} =~ /warning/i')
You can use the following variables: %{category}, %{code}, %{severity}, %{opened}, %{state}, %{issue}, %{component_name}
You can use the following variables: %{category}, %{code}, %{severity}, %{opened}, %{state}, %{issue}, %{component_name}, %{flagged}
=item B<--critical-status>
Define the conditions to match for the status to be CRITICAL (default: '%{state} ne "closed" and %{severity} =~ /critical/i').
You can use the following variables: %{category}, %{code}, %{severity}, %{opened}, %{state}, %{issue}, %{component_name}
You can use the following variables: %{category}, %{code}, %{severity}, %{opened}, %{state}, %{issue}, %{component_name}, %{flagged}
=item B<--memory>

View File

@ -262,10 +262,10 @@ Filter arrays by ID (can be a regexp).
Filter arrays by name (can be a regexp).
=item B<--filter-resolution>
=item B<--perf-resolution>
Time resolution for array performance.
Can be: 1s, 30s, 5m, 30m, 2h, 8h, 24h (default: 5m).
Can be: C<1s>, C<30s>, C<5m>, C<30m>, C<2h>, C<8h>, C<24h> (default: C<5m>).
=item B<--warning-*> B<--critical-*>

View File

@ -245,10 +245,10 @@ Filter volumes by ID (can be a regexp).
Filter volumes by name (can be a regexp).
=item B<--filter-resolution>
=item B<--perf-resolution>
Time resolution for array performance.
Can be: 1s, 30s, 5m, 30m, 2h, 8h, 24h (default: 5m).
Time resolution for volumes performance.
Can be: C<1s>, C<30s>, C<5m>, C<30m>, C<2h>, C<8h>, C<24h> (default: C<5m>).
=item B<--warning-*> B<--critical-*>

View File

@ -72,7 +72,7 @@ sub process_test {
sub main {
#process_test('localhost', 443, 'https', '/v2', 10, 'user', 'pass');
process_test('localhost', 443, undef, undef, undef, undef, undef);
process_test('localhost', 3000, 'http', undef, 10, 'login', 'password');
}
main();
@ -111,4 +111,4 @@ eval { $api->check_options() };
like($@, qr/Need to specify --password option/, 'Missing password handled correctly');
done_testing();
done_testing();

View File

@ -0,0 +1,46 @@
*** Settings ***
Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource
Suite Setup Start Mockoon ${MOCKOON_JSON}
Suite Teardown Stop Mockoon
Test Timeout 120s
Test Setup Ctn Cleanup Cache
*** Variables ***
${MOCKOON_JSON} ${CURDIR}${/}vmware8-restapi.mockoon.json
${CMD} ${CENTREON_PLUGINS} --plugin=apps::vmware::vsphere8::esx::plugin
... --mode=cpu
... --password=C3POR2P2
... --username=obi-wan
... --hostname=127.0.0.1
... --proto=http
... --port=3000
... --esx-id=host-22
*** Test Cases ***
Cpu with curl ${tc}
[Tags] apps api vmware vsphere8 esx
${command} Catenate ${CMD} --http-backend=curl ${extraoptions}
Ctn Run Command And Check Result As Strings ${command} ${expected_result}
Examples: tc extraoptions expected_result --
... 1 ${EMPTY} OK: usage-percentage : skipped (no value(s)), usage-frequency : skipped (no value(s)) - no data for host host-22 counter cpu.capacity.provisioned.HOST at the moment.
... 2 ${EMPTY} OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000
... 3 --add-contention OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz - CPU average contention is 0.55 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.contention.percentage'=0.55%;;;0;100
... 4 --add-demand OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz - CPU average demand is 8.36 %, demand frequency is 4201 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;;;; 'cpu.capacity.demand.hertz'=4201000Hz;;;;50280000
... 5 --add-corecount OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz - CPU cores used: 83 | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.corecount.usage.count'=83;;;;
... 6 --add-contention --add-demand --add-corecount OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz - CPU average contention is 0.55 % - CPU average demand is 8.36 %, demand frequency is 4201 kHz - CPU cores used: 83 | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.contention.percentage'=0.55%;;;0;100 'cpu.capacity.demand.percentage'=8.3552108194113;;;; 'cpu.capacity.demand.hertz'=4201000Hz;;;;50280000 'cpu.corecount.usage.count'=83;;;;
... 7 --warning-usage-percentage=5 WARNING: CPU average usage is 9.16 % | 'cpu.capacity.usage.percentage'=9.16%;0:5;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000
... 8 --critical-usage-percentage=5 CRITICAL: CPU average usage is 9.16 % | 'cpu.capacity.usage.percentage'=9.16%;;0:5;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000
... 9 --warning-usage-frequency=5 WARNING: used frequency is 4603.44 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;0:5;;;50280000
... 10 --critical-usage-frequency=5 CRITICAL: used frequency is 4603.44 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;0:5;;50280000
... 11 --warning-demand-percentage=5 WARNING: CPU average demand is 8.36 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;0:5;;; 'cpu.capacity.demand.hertz'=4201000Hz;;;;50280000
... 12 --critical-demand-percentage=5 CRITICAL: CPU average demand is 8.36 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;;0:5;; 'cpu.capacity.demand.hertz'=4201000Hz;;;;50280000
... 13 --warning-demand-frequency=5 WARNING: demand frequency is 4201 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;;;; 'cpu.capacity.demand.hertz'=4201000Hz;0:5;;;50280000
... 14 --critical-demand-frequency=5 CRITICAL: demand frequency is 4201 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;;;; 'cpu.capacity.demand.hertz'=4201000Hz;;0:5;;50280000
... 15 --warning-contention-percentage=5: WARNING: CPU average contention is 0.55 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.contention.percentage'=0.55%;5:;;0;100
... 16 --critical-contention-percentage=5: CRITICAL: CPU average contention is 0.55 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.contention.percentage'=0.55%;;5:;0;100

View File

@ -0,0 +1,46 @@
*** Settings ***
Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource
Suite Setup Start Mockoon ${MOCKOON_JSON}
Suite Teardown Stop Mockoon
Test Timeout 120s
Test Setup Ctn Cleanup Cache
*** Variables ***
${MOCKOON_JSON} ${CURDIR}${/}vmware8-restapi.mockoon.json
${CMD} ${CENTREON_PLUGINS} --plugin=apps::vmware::vsphere8::esx::plugin
... --mode=cpu
... --password=C3POR2P2
... --username=obi-wan
... --hostname=127.0.0.1
... --proto=http
... --port=3000
... --esx-id=host-22
*** Test Cases ***
Cpu with lwp ${tc}
[Tags] apps api vmware vsphere8 esx
${command} Catenate ${CMD} --http-backend=lwp ${extraoptions}
Ctn Run Command And Check Result As Strings ${command} ${expected_result}
Examples: tc extraoptions expected_result --
... 1 ${EMPTY} OK: usage-percentage : skipped (no value(s)), usage-frequency : skipped (no value(s)) - no data for host host-22 counter cpu.capacity.provisioned.HOST at the moment.
... 2 ${EMPTY} OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000
... 3 --add-contention OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz - CPU average contention is 0.55 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.contention.percentage'=0.55%;;;0;100
... 4 --add-demand OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz - CPU average demand is 8.36 %, demand frequency is 4201 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;;;; 'cpu.capacity.demand.hertz'=4201000Hz;;;;50280000
... 5 --add-corecount OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz - CPU cores used: 83 | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.corecount.usage.count'=83;;;;
... 6 --add-contention --add-demand --add-corecount OK: CPU average usage is 9.16 %, used frequency is 4603.44 kHz - CPU average contention is 0.55 % - CPU average demand is 8.36 %, demand frequency is 4201 kHz - CPU cores used: 83 | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.contention.percentage'=0.55%;;;0;100 'cpu.capacity.demand.percentage'=8.3552108194113;;;; 'cpu.capacity.demand.hertz'=4201000Hz;;;;50280000 'cpu.corecount.usage.count'=83;;;;
... 7 --warning-usage-percentage=5 WARNING: CPU average usage is 9.16 % | 'cpu.capacity.usage.percentage'=9.16%;0:5;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000
... 8 --critical-usage-percentage=5 CRITICAL: CPU average usage is 9.16 % | 'cpu.capacity.usage.percentage'=9.16%;;0:5;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000
... 9 --warning-usage-frequency=5 WARNING: used frequency is 4603.44 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;0:5;;;50280000
... 10 --critical-usage-frequency=5 CRITICAL: used frequency is 4603.44 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;0:5;;50280000
... 11 --warning-demand-percentage=5 WARNING: CPU average demand is 8.36 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;0:5;;; 'cpu.capacity.demand.hertz'=4201000Hz;;;;50280000
... 12 --critical-demand-percentage=5 CRITICAL: CPU average demand is 8.36 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;;0:5;; 'cpu.capacity.demand.hertz'=4201000Hz;;;;50280000
... 13 --warning-demand-frequency=5 WARNING: demand frequency is 4201 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;;;; 'cpu.capacity.demand.hertz'=4201000Hz;0:5;;;50280000
... 14 --critical-demand-frequency=5 CRITICAL: demand frequency is 4201 kHz | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.demand.percentage'=8.3552108194113;;;; 'cpu.capacity.demand.hertz'=4201000Hz;;0:5;;50280000
... 15 --warning-contention-percentage=5: WARNING: CPU average contention is 0.55 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.contention.percentage'=0.55%;5:;;0;100
... 16 --critical-contention-percentage=5: CRITICAL: CPU average contention is 0.55 % | 'cpu.capacity.usage.percentage'=9.16%;;;0;100 'cpu.capacity.usage.hertz'=4603440Hz;;;;50280000 'cpu.capacity.contention.percentage'=0.55%;;5:;0;100

View File

@ -22,30 +22,23 @@ ${CMD} ${CENTREON_PLUGINS} --plugin=apps::vmware::vsphere8::esx::pl
*** Test Cases ***
Host-Status ${tc}
[Tags] apps api vmware vsphere8 esx
${command} Catenate ${CMD} --http-backend=${http_backend} --esx-name=${esx_name} ${extraoptions}
# We sort the host names and keep only the last one and make sure it is the expected one
${output} Run ${command}
${output} Strip String ${output}
Should Be Equal As Strings
... ${output}
... ${expected_result}
... Wrong output result for command:\n${command}\n\nObtained:\n${output}\n\nExpected:\n${expected_result}\n
... values=False
... collapse_spaces=True
${command} Catenate ${CMD} ${filter_host} ${extraoptions}
${command_curl} Catenate ${command} --http-backend=curl
${command_lwp} Catenate ${command} --http-backend=lwp
Ctn Run Command And Check Result As Strings ${command_curl} ${expected_result}
Ctn Run Command And Check Result As Strings ${command_lwp} ${expected_result}
Examples: tc http_backend esx_name extraoptions expected_result --
... 1 curl esx1.acme.com ${EMPTY} OK: Host 'esx1.acme.com': power state is POWERED_ON, connection state is CONNECTED
... 2 lwp esx1.acme.com ${EMPTY} OK: Host 'esx1.acme.com': power state is POWERED_ON, connection state is CONNECTED
... 3 curl esx2.acme.com ${EMPTY} CRITICAL: Host 'esx2.acme.com': power state is POWERED_OFF
... 4 lwp esx2.acme.com ${EMPTY} CRITICAL: Host 'esx2.acme.com': power state is POWERED_OFF
... 5 curl esx3.acme.com ${EMPTY} CRITICAL: Host 'esx3.acme.com': connection state is DISCONNECTED
... 6 lwp esx3.acme.com ${EMPTY} CRITICAL: Host 'esx3.acme.com': connection state is DISCONNECTED
... 7 curl esx ${EMPTY} CRITICAL: Host 'esx2.acme.com': power state is POWERED_OFF - Host 'esx3.acme.com': connection state is DISCONNECTED
... 8 lwp esx ${EMPTY} CRITICAL: Host 'esx2.acme.com': power state is POWERED_OFF - Host 'esx3.acme.com': connection state is DISCONNECTED
... 9 curl nothing ${EMPTY} UNKNOWN: No ESX Host found.
... 10 lwp nothing ${EMPTY} UNKNOWN: No ESX Host found.
... 11 curl esx1.acme.com --port=8888 UNKNOWN: curl perform error : Couldn't connect to server
... 12 lwp esx1.acme.com --port=8888 UNKNOWN: 500 Can't connect to 127.0.0.1:8888 (Connection refused)
Examples: tc filter_host extraoptions expected_result --
... 1 --esx-name=esx1.acme.com ${EMPTY} OK: Host 'esx1.acme.com', id: 'host-22': power state is POWERED_ON, connection state is CONNECTED
... 2 --esx-name=esx2.acme.com ${EMPTY} CRITICAL: Host 'esx2.acme.com', id: 'host-28': power state is POWERED_OFF
... 3 --esx-name=esx3.acme.com ${EMPTY} CRITICAL: Host 'esx3.acme.com', id: 'host-35': connection state is DISCONNECTED
... 4 --esx-id=host-35 --esx-name=esx3.acme.com CRITICAL: Host 'esx3.acme.com', id: 'host-35': connection state is DISCONNECTED
... 5 --esx-name=nothing ${EMPTY} UNKNOWN: No ESX Host found.
... 6 --esx-id=host-35 --esx-name=esx2.acme.com UNKNOWN: No ESX Host found.
... 7 --esx-id=host-22 ${EMPTY} OK: Host 'esx1.acme.com', id: 'host-22': power state is POWERED_ON, connection state is CONNECTED
... 8 --esx-id=host-28 ${EMPTY} CRITICAL: Host 'esx2.acme.com', id: 'host-28': power state is POWERED_OFF
... 9 --esx-id=host-35 ${EMPTY} CRITICAL: Host 'esx3.acme.com', id: 'host-35': connection state is DISCONNECTED
... 10 --esx-id=nothing ${EMPTY} UNKNOWN: No ESX Host found.
... 11 --esx-id=host-28 --critical-power-status=0 OK: Host 'esx2.acme.com', id: 'host-28': power state is POWERED_OFF, connection state is CONNECTED
... 12 --esx-id=host-35 --critical-connection-status=0 OK: Host 'esx3.acme.com', id: 'host-35': power state is POWERED_ON, connection state is DISCONNECTED

View File

@ -0,0 +1,36 @@
*** Settings ***
Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource
Suite Setup Start Mockoon ${MOCKOON_JSON}
Suite Teardown Stop Mockoon
Test Timeout 120s
Test Setup Ctn Cleanup Cache
*** Variables ***
${MOCKOON_JSON} ${CURDIR}${/}vmware8-restapi.mockoon.json
${CMD} ${CENTREON_PLUGINS} --plugin=apps::vmware::vsphere8::esx::plugin
... --mode=memory
... --password=C3POR2P2
... --username=obi-wan
... --hostname=127.0.0.1
... --proto=http
... --port=3000
... --esx-id=host-22
*** Test Cases ***
Memory ${tc}
[Tags] apps api vmware vsphere8 esx
${command} Catenate ${CMD} --http-backend=curl ${extraoptions}
Ctn Run Command And Check Result As Strings ${command} ${expected_result}
Examples: tc extraoptions expected_result --
... 1 ${EMPTY} OK: vms-usage-percentage : skipped (no value(s)) - vms-usage-bytes : skipped (no value(s)) - no data for host host-22 counter mem.capacity.usable.HOST at the moment.
... 2 ${EMPTY} OK: 39% of usable memory is used by VMs - Memory used: 100.02 GB used - Usable: 253.97 GB | 'vms.memory.usage.percentage'=39.38%;;;0;100 'vms.memory.usage.bytes'=107400208056B;;;;272694090137
... 3 --warning-vms-usage-percentage=0:0 WARNING: 39% of usable memory is used by VMs | 'vms.memory.usage.percentage'=39.38%;0:0;;0;100 'vms.memory.usage.bytes'=107400208056B;;;;272694090137
... 4 --critical-vms-usage-percentage=0:0 CRITICAL: 39% of usable memory is used by VMs | 'vms.memory.usage.percentage'=39.38%;;0:0;0;100 'vms.memory.usage.bytes'=107400208056B;;;;272694090137
... 5 --warning-vms-usage-bytes=0:0 WARNING: Memory used: 100.02 GB used - Usable: 253.97 GB | 'vms.memory.usage.percentage'=39.38%;;;0;100 'vms.memory.usage.bytes'=107400208056B;0:0;;;272694090137
... 6 --critical-vms-usage-bytes=0:0 CRITICAL: Memory used: 100.02 GB used - Usable: 253.97 GB | 'vms.memory.usage.percentage'=39.38%;;;0;100 'vms.memory.usage.bytes'=107400208056B;;0:0;;272694090137

View File

@ -0,0 +1,34 @@
*** Settings ***
Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource
Suite Setup Start Mockoon ${MOCKOON_JSON}
Suite Teardown Stop Mockoon
Test Timeout 120s
Test Setup Ctn Cleanup Cache
*** Variables ***
${MOCKOON_JSON} ${CURDIR}${/}vmware8-restapi.mockoon.json
${CMD} ${CENTREON_PLUGINS} --plugin=apps::vmware::vsphere8::esx::plugin
... --mode=power
... --password=C3POR2P2
... --username=obi-wan
... --hostname=127.0.0.1
... --proto=http
... --port=3000
... --esx-id=host-22
*** Test Cases ***
Power ${tc}
[Tags] apps api vmware vsphere8 esx
${command} Catenate ${CMD} --http-backend=curl ${extraoptions}
Ctn Run Command And Check Result As Strings ${command} ${expected_result}
Examples: tc extraoptions expected_result --
... 1 ${EMPTY} OK: power-usage-watts : skipped (no value(s)) - no data for host host-22 counter power.capacity.usage.HOST at the moment.
... 2 ${EMPTY} OK: Power usage is 200 Watts | 'power.capacity.usage.watts'=200W;;;;
... 3 --warning-power-usage-watts=0:0 WARNING: Power usage is 200 Watts | 'power.capacity.usage.watts'=200W;0:0;;;
... 4 --critical-power-usage-watts=0:0 CRITICAL: Power usage is 200 Watts | 'power.capacity.usage.watts'=200W;;0:0;;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,125 @@
{
"uuid": "e745f255-dee8-48eb-a952-88bb0f9e5a0c",
"lastMigration": 32,
"name": "Azure vpn gateway",
"endpointPrefix": "",
"latency": 0,
"port": 3004,
"hostname": "",
"folders": [],
"routes": [
{
"uuid": "f8dc6ac1-febc-46a8-be79-9e5e14cedd3a",
"type": "http",
"documentation": "List By Resource Group Reference (reduced reponse info)",
"method": "get",
"endpoint": "subscriptions/:subscriptionId/resourcegroups/:resourceGroup/providers/Microsoft.Network/virtualNetworkGateways",
"responses": [
{
"uuid": "4b0edd9d-2052-45a3-9969-cf0cf461154c",
"body": "{\r\n \"value\": [\r\n {\r\n \"name\": \"gateway1\",\r\n \"id\": \"/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/vpnGateways/gateway1\",\r\n \"type\": \"Microsoft.Network/vpnGateways\",\r\n \"properties\": {\r\n \"provisioningState\": \"Succeeded\"\r\n },\r\n \"gatewayType\": \"ExpressRoute\",\r\n \"vpnType\": \"RouteBased\"\r\n },\r\n {\r\n \"name\": \"gateway2\",\r\n \"id\": \"/subscriptions/subid/resourceGroups/rg2/providers/Microsoft.Network/vpnGateways/gateway2\",\r\n \"type\": \"Microsoft.Network/vpnGateways\",\r\n \"properties\": {\r\n \"provisioningState\": \"Succeeded\"\r\n },\r\n \"gatewayType\": \"ExpressRoute\",\r\n \"vpnType\": \"RouteBased\"\r\n }\r\n ]\r\n}",
"latency": 0,
"statusCode": 200,
"label": "",
"headers": [],
"bodyType": "INLINE",
"filePath": "",
"databucketID": "",
"sendFileAsBody": false,
"rules": [],
"rulesOperator": "OR",
"disableTemplating": false,
"fallbackTo404": false,
"default": true,
"crudKey": "id",
"callbacks": []
}
],
"responseMode": null
},
{
"uuid": "325811e6-6a5d-4906-90a1-3df24183d529",
"type": "http",
"documentation": "Azure login",
"method": "post",
"endpoint": "login/:tenant/oauth2/token",
"responses": [
{
"uuid": "e381c634-cbff-431e-851e-e4631f0f9e2c",
"body": "{\n \"access_token\": \"token\",\n \"expires_on\": \"{{ faker 'string.numeric' 10 }}\"\n}",
"latency": 0,
"statusCode": 200,
"label": "",
"headers": [],
"bodyType": "INLINE",
"filePath": "",
"databucketID": "",
"sendFileAsBody": false,
"rules": [],
"rulesOperator": "OR",
"disableTemplating": false,
"fallbackTo404": false,
"default": true,
"crudKey": "id",
"callbacks": []
}
],
"responseMode": null
}
],
"rootChildren": [
{
"type": "route",
"uuid": "f8dc6ac1-febc-46a8-be79-9e5e14cedd3a"
},
{
"type": "route",
"uuid": "325811e6-6a5d-4906-90a1-3df24183d529"
}
],
"proxyMode": false,
"proxyHost": "",
"proxyRemovePrefix": false,
"tlsOptions": {
"enabled": false,
"type": "CERT",
"pfxPath": "",
"certPath": "",
"keyPath": "",
"caPath": "",
"passphrase": ""
},
"cors": true,
"headers": [
{
"key": "Content-Type",
"value": "application/json"
},
{
"key": "Access-Control-Allow-Origin",
"value": "*"
},
{
"key": "Access-Control-Allow-Methods",
"value": "GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS"
},
{
"key": "Access-Control-Allow-Headers",
"value": "Content-Type, Origin, Accept, Authorization, Content-Length, X-Requested-With"
}
],
"proxyReqHeaders": [
{
"key": "",
"value": ""
}
],
"proxyResHeaders": [
{
"key": "",
"value": ""
}
],
"data": [],
"callbacks": []
}

View File

@ -0,0 +1,38 @@
*** Settings ***
Documentation Azure Network VPN Gateway plugin
Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource
Suite Setup Start Mockoon ${MOCKOON_JSON}
Suite Teardown Stop Mockoon
Test Timeout 120s
*** Variables ***
${MOCKOON_JSON} ${CURDIR}${/}vpngatewaystatus.json
${BASE_URL} http://${HOSTNAME}:${APIPORT}
${LOGIN_ENDPOINT} ${BASE_URL}/login
${CMD} ${CENTREON_PLUGINS} --plugin=cloud::azure::network::vpngateway::plugin --custommode=api --subscription=subscription --tenant=tenant --client-id=client_id --client-secret=secret --resource-group=resource-group --login-endpoint=${LOGIN_ENDPOINT}
*** Test Cases ***
VPN Gateway status ${tc}
[Tags] cloud azure api mockoon
${command} Catenate
... ${CMD}
... --mode=vpn-gateway-status
... --management-endpoint=${BASE_URL}
... ${extra_options}
Ctn Run Command And Check Result As Strings ${command} ${expected_result}
Examples: tc extra_options expected_result --
... 1 ${EMPTY} OK: All VPN gateways are ok
... 2 --warning-status='\\%\{provisioning_state\} eq "Succeeded"' WARNING: VPN Gateway 'gateway1' Provisioning State 'Succeeded' [Gateway type: ExpressRoute] [VPN type: RouteBased] - VPN Gateway 'gateway2' Provisioning State 'Succeeded' [Gateway type: ExpressRoute] [VPN type: RouteBased]
... 3 --critical-status='\\%\{provisioning_state\} eq "Succeeded"' CRITICAL: VPN Gateway 'gateway1' Provisioning State 'Succeeded' [Gateway type: ExpressRoute] [VPN type: RouteBased] - VPN Gateway 'gateway2' Provisioning State 'Succeeded' [Gateway type: ExpressRoute] [VPN type: RouteBased]
... 4 --filter-name='gateway1' OK: VPN Gateway 'gateway1' Provisioning State 'Succeeded' [Gateway type: ExpressRoute] [VPN type: RouteBased]
... 5 --filter-name='gateway1' --warning-status='\\%\{provisioning_state\} eq "Succeeded"' WARNING: VPN Gateway 'gateway1' Provisioning State 'Succeeded' [Gateway type: ExpressRoute] [VPN type: RouteBased]
... 6 --filter-name='gateway1' --critical-status='\\%\{provisioning_state\} eq "Succeeded"' CRITICAL: VPN Gateway 'gateway1' Provisioning State 'Succeeded' [Gateway type: ExpressRoute] [VPN type: RouteBased]

View File

@ -0,0 +1,41 @@
#!/usr/bin/perl
use strict;
use warnings;
use Crypt::Argon2 qw/argon2d_raw argon2i_raw argon2id_raw argon2_pass argon2_verify/;
# Password to hash
my $password = 'my_secure_password';
my $salt = 'random_salt';
my $iterations = 3;
my $memory_cost = 32 * 1024; # in KB
my $parallelism = 1;
my $hash_length = 32;
# Hash with Argon2d
my $argon2d_hash = argon2d_raw($password, $salt, $iterations, $memory_cost, $parallelism, $hash_length);
print("Argon2d hash: " . unpack("H*", $argon2d_hash) . "\n");
# Hash with Argon2i
my $argon2i_hash = argon2i_raw($password, $salt, $iterations, $memory_cost, $parallelism, $hash_length);
print("Argon2i hash: " . unpack("H*", $argon2i_hash) . "\n");
# Hash with Argon2id
my $argon2id_hash = argon2id_raw($password, $salt, $iterations, $memory_cost, $parallelism, $hash_length);
print("Argon2id hash: " . unpack("H*", $argon2id_hash) . "\n");
# Encode password with Argon2d
my $argon2d_encoded = argon2_pass('argon2d', $password, $salt, $iterations, $memory_cost, $parallelism, $hash_length);
print "Argon2d encoded: $argon2d_encoded\n";
# Encode password with Argon2i
my $argon2i_encoded = argon2_pass('argon2i', $password, $salt, $iterations, $memory_cost, $parallelism, $hash_length);
print "Argon2i encoded: $argon2i_encoded\n";
# Encode password with Argon2id
my $argon2id_encoded = argon2_pass('argon2id', $password, $salt, $iterations, $memory_cost, $parallelism, $hash_length);
print "Argon2id encoded: $argon2id_encoded\n";
# Verify password with Argon2d
# print argon2d_verify($argon2d_encoded1, $password) ? "Argon2d password is correct.\n" : "Argon2d password is incorrect.\n";
argon2_verify($argon2d_encoded, $password) ? print "Argon2d password is correct.\n" : exit(1);
# Verify password with Argon2i
argon2_verify($argon2i_encoded, $password) ? print "Argon2i password is correct.\n" : exit(1);
# Verify password with Argon2id
argon2_verify($argon2id_encoded, $password) ? print "Argon2id password is correct.\n" : exit(1);

View File

@ -0,0 +1,32 @@
#!/usr/bin/perl
use strict;
use warnings;
use JSON::Path;
# Sample Perl data structure
my $data = {
store => {
book => [
{ category => "reference", author => "Nigel Rees", title => "Sayings of the Century", price => 8.95 },
{ category => "fiction", author => "Evelyn Waugh", title => "Sword of Honour", price => 12.99 },
{ category => "fiction", author => "Herman Melville", title => "Moby Dick", isbn => "0-553-21311-3", price => 8.99 },
{ category => "fiction", author => "J. R. R. Tolkien", title => "The Lord of the Rings", isbn => "0-395-19395-8", price => 22.99 }
],
bicycle => {
color => "red",
price => 19.95
}
}
};
# Create a JSON::Path object
my $jpath = JSON::Path->new('$.store.book[*].author');
# Find all authors
my @authors = $jpath->values($data);
# Print authors
print "Authors:\n";
foreach my $author (@authors) {
print "$author\n";
}

View File

@ -0,0 +1,111 @@
#!/usr/bin/perl
use strict;
use warnings;
use Libssh::Session qw(:all);
use POSIX qw(WIFEXITED WEXITSTATUS);
# Install SSH server
if (-f "/etc/debian_version") {
system("apt-get update") == 0
or die "apt-update failed: $?";
system("apt-get install -y openssh-server") == 0
or die "Installation failed: $?";
} elsif (-f "/etc/redhat-release") {
system("dnf install -y openssh-server") == 0
or die "Installation failed: $?";
} else {
die "Unsupported operating system";
}
mkdir("/var/run/sshd") unless -d "/var/run/sshd";
system("ssh-keygen -A") == 0
or die "SSH keys generation failed: $?";
if (getpwnam("testuser")) {
print "User testuser already exists\n";
} else {
system("useradd -m testuser") == 0
or die "User creation failed: $?";
}
system("echo 'testuser:testpassword' | chpasswd") == 0
or die "Password configuration failed: $?";
# SSH configuration
open(my $fh, '>', '/etc/ssh/sshd_config')
or die "Cannot open sshd_config: $!";
print $fh "Port 2222\n";
print $fh "PermitRootLogin no\n";
print $fh "AllowUsers testuser\n";
print $fh "PasswordAuthentication yes\n";
close($fh);
# Start SSH server
my $pid = fork();
die "Fork failed: $!" unless defined $pid;
if ($pid == 0) {
exec("/usr/sbin/sshd", "-D")
or die "Cannot start SSH server: $!";
}
# Wait and check the port
sleep(5);
# Check the port with Perl
use IO::Socket::INET;
my $sock = IO::Socket::INET->new(
PeerAddr => '127.0.0.1',
PeerPort => 2222,
Proto => 'tcp'
);
die "Port SSH 2222 is not listening" unless $sock;
$sock->close();
# Connection test with Libssh::Session
eval {
my $session = Libssh::Session->new();
$session->options(
host => "127.0.0.1",
port => 2222,
user => "testuser",
LogVerbosity => 1,
PrintError => 1,
Timeout => 10
);
print "Trying to connect...\n";
$session->connect() == SSH_OK or die "Connection failed: " . $session->get_error();
print "Trying to authenticate...\n";
$session->auth_password(password => "testpassword") == SSH_AUTH_SUCCESS or die "Authentification failed: " . $session->get_error();
print "SSH connection test succeeded\n";
$session->disconnect();
};
if ($@) {
kill 'TERM', $pid;
die "Test failed: $@";
}
# Cleaning
kill 'TERM', $pid;
waitpid($pid, 0);
# Uninstall SSH server
if (-f "/etc/debian_version") {
system("apt-get autoremove -y --purge openssh-server") == 0
or die "Uninstallation failed: $?";
} elsif (-f "/etc/redhat-release") {
system("dnf autoremove --setopt=keepcache=True -y openssh-server") == 0
or die "Uninstallation failed: $?";
} else {
die "Unsupported operating system";
}
system("userdel -r testuser") == 0
or die "Cannot delete user: $?";
print "Test and cleanup succeeded\n";

View File

@ -0,0 +1,27 @@
#!/usr/bin/perl
use strict;
use warnings;
use Net::Curl::Easy qw(:constants);
# URL to fetch
my $url = 'https://www.centreon.com';
# Create a new Curl object
my $curl = Net::Curl::Easy->new();
# Prepare the request
$curl->setopt(CURLOPT_URL, $url);
my $response_body;
$curl->setopt(CURLOPT_WRITEDATA, \$response_body);
# Perform the request
eval {
$curl->perform();
};
die "Unable to fetch URL $url: $@" if $@;
# Print the response body
print "Response body:\n$response_body\n";
print "Test completed successfully.\n";

View File

@ -0,0 +1,33 @@
*** Settings ***
Documentation Check inlet sensors
Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource
Suite Setup Ctn Generic Suite Setup
Test Timeout 120s
*** Variables ***
${CMD} ${CENTREON_PLUGINS} --plugin=hardware::pdu::raritan::snmp::plugin
*** Test Cases ***
inlet ${tc}
[Tags] hardware pdu raritan inlet sensors
${command} Catenate
... ${CMD}
... --mode=inlet-sensors
... --hostname=${HOSTNAME}
... --snmp-version=${SNMPVERSION}
... --snmp-port=${SNMPPORT}
... --snmp-community=hardware/pdu/raritan/snmp/raritan
... --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 7 components are ok [1/1 activeEnergy, 1/1 activePower, 1/1 apparentPower, 1/1 frequency, 1/1 powerFactor, 1/1 rmsCurrent, 1/1 rmsVoltage]. | 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.activeenergy.watthour'=1444088wattHour;;;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.activepower.watt'=242W;;;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.apparentpower.voltamp'=379voltamp;;;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.frequency.hertz'=50Hz;;;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.powerfactor'=0.64;;;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.rmscurrent.ampere'=1.626A;~:10.4;~:12.8;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.rmsvoltage.volt'=233V;194:247;188:254;; 'hardware.activeEnergy.count'=1;;;; 'hardware.activePower.count'=1;;;; 'hardware.apparentPower.count'=1;;;; 'hardware.frequency.count'=1;;;; 'hardware.powerFactor.count'=1;;;; 'hardware.rmsCurrent.count'=1;;;; 'hardware.rmsVoltage.count'=1;;;;
... 2 --filter=powerFactor OK: All 6 components are ok [1/1 activeEnergy, 1/1 activePower, 1/1 apparentPower, 1/1 frequency, 1/1 rmsCurrent, 1/1 rmsVoltage]. | 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.activeenergy.watthour'=1444088wattHour;;;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.activepower.watt'=242W;;;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.apparentpower.voltamp'=379voltamp;;;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.frequency.hertz'=50Hz;;;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.rmscurrent.ampere'=1.626A;~:10.4;~:12.8;; 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.rmsvoltage.volt'=233V;194:247;188:254;; 'hardware.activeEnergy.count'=1;;;; 'hardware.activePower.count'=1;;;; 'hardware.apparentPower.count'=1;;;; 'hardware.frequency.count'=1;;;; 'hardware.rmsCurrent.count'=1;;;; 'hardware.rmsVoltage.count'=1;;;;
... 3 --component=powerFactor OK: All 1 components are ok [1/1 powerFactor]. | 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.powerfactor'=0.64;;;; 'hardware.powerFactor.count'=1;;;;
... 4 --component=powerFactor --threshold-overload='powerFactor,CRITICAL,normal' CRITICAL: 'Anonymized 027' powerFactor state is 'normal' | 'Anonymized 102~Anonymized 027#hardware.sensor.inlet.powerfactor'=0.64;;;; 'hardware.powerFactor.count'=1;;;;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,965 @@
.1.3.6.1.4.1.13742.6.3.2.2.1.13.1 = STRING: Anonymized 102
.1.3.6.1.4.1.13742.6.3.3.3.1.2.1.1 = STRING: Anonymized 027
.1.3.6.1.4.1.13742.6.3.3.4.1.6.1.1.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.3.4.1.6.1.1.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.3.4.1.6.1.1.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.3.4.1.6.1.1.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.3.4.1.6.1.1.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.3.4.1.6.1.1.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.3.4.1.6.1.1.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.3.4.1.7.1.1.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.3.4.1.7.1.1.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.7.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.7.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.7.1.1.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.3.4.1.7.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.7.1.1.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.3.4.1.21.1.1.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.21.1.1.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.3.4.1.21.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.21.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.21.1.1.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.21.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.21.1.1.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.22.1.1.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.22.1.1.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.3.4.1.22.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.22.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.22.1.1.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.22.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.22.1.1.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.23.1.1.1 = Gauge32: 12800
.1.3.6.1.4.1.13742.6.3.3.4.1.23.1.1.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.3.4.1.23.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.23.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.23.1.1.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.23.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.23.1.1.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.24.1.1.1 = Gauge32: 10400
.1.3.6.1.4.1.13742.6.3.3.4.1.24.1.1.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.3.4.1.24.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.24.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.24.1.1.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.24.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.24.1.1.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.3.4.1.25.1.1.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.3.4.1.25.1.1.4 = Hex-STRING: F0
.1.3.6.1.4.1.13742.6.3.3.4.1.25.1.1.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.3.4.1.25.1.1.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.3.4.1.25.1.1.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.3.4.1.25.1.1.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.3.4.1.25.1.1.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.1 = STRING: "1"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.2 = STRING: "2"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.3 = STRING: "3"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.4 = STRING: "4"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.5 = STRING: "5"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.6 = STRING: "6"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.7 = STRING: "7"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.8 = STRING: "8"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.9 = STRING: "9"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.10 = STRING: "10"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.11 = STRING: "11"
.1.3.6.1.4.1.13742.6.3.5.3.1.2.1.12 = STRING: "12"
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.1 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.2 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.3 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.5 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.6 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.7 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.8 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.9 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.10 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.11 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.28.1.12 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.1 = STRING: Anonymized 008
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.2 = STRING: Anonymized 217
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.3 = STRING: Anonymized 184
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.4 = STRING: Anonymized 062
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.5 = STRING: Anonymized 049
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.6 = STRING: Anonymized 018
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.7 = STRING: Anonymized 205
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.8 = STRING: Anonymized 091
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.9 = STRING: Anonymized 156
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.10 = STRING: Anonymized 123
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.11 = STRING: Anonymized 027
.1.3.6.1.4.1.13742.6.3.5.3.1.29.1.12 = STRING: Anonymized 207
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.1.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.1.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.1.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.1.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.1.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.1.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.1.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.1.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.2.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.2.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.2.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.2.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.2.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.2.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.2.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.2.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.3.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.3.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.3.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.3.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.3.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.3.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.3.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.3.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.4.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.4.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.4.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.4.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.4.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.4.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.4.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.4.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.5.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.5.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.5.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.5.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.5.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.5.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.5.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.5.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.6.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.6.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.6.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.6.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.6.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.6.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.6.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.6.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.7.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.7.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.7.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.7.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.7.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.7.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.7.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.7.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.8.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.8.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.8.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.8.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.8.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.8.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.8.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.8.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.9.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.9.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.9.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.9.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.9.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.9.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.9.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.9.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.10.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.10.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.10.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.10.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.10.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.10.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.10.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.10.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.11.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.11.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.11.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.11.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.11.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.11.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.11.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.11.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.12.1 = INTEGER: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.12.4 = INTEGER: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.12.5 = INTEGER: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.12.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.12.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.12.8 = INTEGER: 5
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.12.14 = INTEGER: -1
.1.3.6.1.4.1.13742.6.3.5.4.1.6.1.12.23 = INTEGER: 8
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.1.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.1.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.1.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.1.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.1.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.2.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.2.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.2.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.2.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.2.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.2.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.2.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.2.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.3.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.3.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.3.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.3.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.3.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.3.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.3.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.3.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.4.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.4.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.4.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.4.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.4.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.4.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.4.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.4.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.5.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.5.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.5.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.5.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.5.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.5.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.5.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.5.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.6.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.6.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.6.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.6.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.6.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.6.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.6.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.6.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.7.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.7.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.7.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.7.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.7.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.7.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.7.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.7.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.8.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.8.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.8.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.8.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.8.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.8.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.8.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.8.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.9.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.9.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.9.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.9.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.9.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.9.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.9.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.9.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.10.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.10.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.10.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.10.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.10.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.10.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.10.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.10.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.11.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.11.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.11.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.11.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.11.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.11.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.11.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.11.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.12.1 = Gauge32: 3
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.12.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.12.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.12.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.12.7 = Gauge32: 2
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.12.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.12.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.7.1.12.23 = Gauge32: 1
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.1.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.1.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.1.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.1.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.1.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.2.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.2.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.2.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.2.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.2.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.2.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.2.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.2.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.3.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.3.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.3.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.3.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.3.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.3.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.3.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.3.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.4.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.4.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.4.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.4.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.4.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.4.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.4.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.4.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.5.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.5.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.5.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.5.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.5.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.5.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.5.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.5.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.6.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.6.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.6.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.6.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.6.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.6.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.6.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.6.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.7.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.7.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.7.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.7.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.7.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.7.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.7.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.7.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.8.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.8.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.8.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.8.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.8.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.8.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.8.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.8.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.9.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.9.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.9.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.9.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.9.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.9.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.9.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.9.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.10.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.10.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.10.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.10.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.10.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.10.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.10.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.10.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.11.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.11.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.11.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.11.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.11.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.11.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.11.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.11.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.12.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.12.4 = Gauge32: 188
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.12.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.12.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.12.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.12.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.12.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.21.1.12.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.1.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.1.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.1.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.1.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.1.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.2.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.2.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.2.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.2.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.2.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.2.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.2.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.2.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.3.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.3.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.3.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.3.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.3.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.3.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.3.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.3.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.4.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.4.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.4.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.4.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.4.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.4.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.4.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.4.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.5.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.5.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.5.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.5.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.5.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.5.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.5.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.5.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.6.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.6.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.6.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.6.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.6.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.6.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.6.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.6.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.7.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.7.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.7.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.7.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.7.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.7.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.7.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.7.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.8.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.8.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.8.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.8.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.8.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.8.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.8.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.8.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.9.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.9.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.9.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.9.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.9.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.9.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.9.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.9.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.10.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.10.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.10.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.10.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.10.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.10.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.10.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.10.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.11.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.11.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.11.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.11.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.11.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.11.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.11.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.11.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.12.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.12.4 = Gauge32: 194
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.12.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.12.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.12.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.12.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.12.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.22.1.12.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.1.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.1.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.1.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.1.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.1.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.2.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.2.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.2.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.2.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.2.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.2.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.2.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.2.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.3.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.3.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.3.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.3.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.3.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.3.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.3.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.3.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.4.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.4.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.4.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.4.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.4.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.4.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.4.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.4.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.5.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.5.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.5.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.5.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.5.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.5.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.5.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.5.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.6.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.6.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.6.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.6.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.6.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.6.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.6.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.6.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.7.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.7.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.7.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.7.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.7.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.7.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.7.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.7.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.8.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.8.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.8.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.8.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.8.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.8.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.8.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.8.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.9.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.9.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.9.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.9.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.9.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.9.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.9.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.9.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.10.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.10.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.10.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.10.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.10.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.10.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.10.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.10.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.11.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.11.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.11.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.11.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.11.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.11.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.11.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.11.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.12.1 = Gauge32: 8000
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.12.4 = Gauge32: 254
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.12.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.12.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.12.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.12.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.12.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.23.1.12.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.1.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.1.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.1.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.1.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.1.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.1.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.1.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.1.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.2.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.2.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.2.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.2.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.2.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.2.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.2.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.2.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.3.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.3.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.3.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.3.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.3.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.3.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.3.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.3.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.4.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.4.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.4.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.4.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.4.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.4.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.4.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.4.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.5.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.5.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.5.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.5.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.5.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.5.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.5.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.5.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.6.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.6.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.6.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.6.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.6.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.6.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.6.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.6.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.7.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.7.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.7.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.7.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.7.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.7.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.7.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.7.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.8.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.8.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.8.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.8.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.8.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.8.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.8.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.8.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.9.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.9.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.9.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.9.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.9.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.9.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.9.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.9.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.10.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.10.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.10.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.10.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.10.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.10.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.10.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.10.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.11.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.11.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.11.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.11.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.11.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.11.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.11.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.11.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.12.1 = Gauge32: 6500
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.12.4 = Gauge32: 247
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.12.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.12.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.12.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.12.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.12.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.24.1.12.23 = Gauge32: 0
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.1.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.1.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.1.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.1.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.1.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.1.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.1.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.1.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.2.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.2.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.2.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.2.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.2.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.2.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.2.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.2.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.3.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.3.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.3.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.3.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.3.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.3.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.3.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.3.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.4.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.4.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.4.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.4.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.4.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.4.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.4.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.4.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.5.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.5.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.5.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.5.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.5.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.5.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.5.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.5.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.6.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.6.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.6.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.6.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.6.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.6.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.6.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.6.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.7.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.7.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.7.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.7.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.7.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.7.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.7.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.7.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.8.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.8.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.8.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.8.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.8.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.8.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.8.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.8.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.9.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.9.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.9.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.9.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.9.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.9.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.9.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.9.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.10.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.10.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.10.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.10.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.10.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.10.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.10.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.10.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.11.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.11.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.11.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.11.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.11.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.11.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.11.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.11.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.12.1 = STRING: "0"
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.12.4 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.12.5 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.12.6 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.12.7 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.12.8 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.12.14 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.3.5.4.1.25.1.12.23 = Hex-STRING: 00
.1.3.6.1.4.1.13742.6.5.2.3.1.3.1.1.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.2.3.1.3.1.1.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.2.3.1.3.1.1.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.2.3.1.3.1.1.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.2.3.1.3.1.1.7 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.2.3.1.3.1.1.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.2.3.1.3.1.1.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.2.3.1.4.1.1.1 = Gauge32: 1626
.1.3.6.1.4.1.13742.6.5.2.3.1.4.1.1.4 = Gauge32: 233
.1.3.6.1.4.1.13742.6.5.2.3.1.4.1.1.5 = Gauge32: 242
.1.3.6.1.4.1.13742.6.5.2.3.1.4.1.1.6 = Gauge32: 379
.1.3.6.1.4.1.13742.6.5.2.3.1.4.1.1.7 = Gauge32: 64
.1.3.6.1.4.1.13742.6.5.2.3.1.4.1.1.8 = Gauge32: 1444088
.1.3.6.1.4.1.13742.6.5.2.3.1.4.1.1.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.1.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.1.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.1.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.1.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.1.7 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.1.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.1.14 = INTEGER: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.1.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.2.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.2.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.2.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.2.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.2.7 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.2.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.2.14 = INTEGER: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.2.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.3.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.3.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.3.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.3.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.3.7 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.3.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.3.14 = INTEGER: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.3.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.4.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.4.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.4.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.4.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.4.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.4.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.4.14 = INTEGER: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.4.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.5.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.5.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.5.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.5.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.5.7 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.5.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.5.14 = INTEGER: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.5.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.6.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.6.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.6.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.6.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.6.7 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.6.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.6.14 = INTEGER: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.6.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.7.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.7.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.7.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.7.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.7.7 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.7.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.7.14 = INTEGER: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.7.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.8.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.8.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.8.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.8.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.8.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.8.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.8.14 = INTEGER: 8
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.8.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.9.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.9.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.9.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.9.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.9.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.9.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.9.14 = INTEGER: 8
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.9.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.10.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.10.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.10.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.10.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.10.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.10.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.10.14 = INTEGER: 8
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.10.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.11.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.11.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.11.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.11.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.11.7 = INTEGER: -1
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.11.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.11.14 = INTEGER: 8
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.11.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.12.1 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.12.4 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.12.5 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.12.6 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.12.7 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.12.8 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.12.14 = INTEGER: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.3.1.12.23 = INTEGER: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.1.1 = Gauge32: 74
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.1.4 = Gauge32: 233
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.1.5 = Gauge32: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.1.6 = Gauge32: 17
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.1.7 = Gauge32: 41
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.1.8 = Gauge32: 107881
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.1.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.1.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.2.1 = Gauge32: 303
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.2.4 = Gauge32: 233
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.2.5 = Gauge32: 56
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.2.6 = Gauge32: 71
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.2.7 = Gauge32: 79
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.2.8 = Gauge32: 330830
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.2.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.2.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.3.1 = Gauge32: 91
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.3.4 = Gauge32: 233
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.3.5 = Gauge32: 6
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.3.6 = Gauge32: 21
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.3.7 = Gauge32: 30
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.3.8 = Gauge32: 46648
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.3.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.3.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.4.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.4.4 = Gauge32: 233
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.4.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.4.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.4.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.4.8 = Gauge32: 4
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.4.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.4.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.5.1 = Gauge32: 333
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.5.4 = Gauge32: 233
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.5.5 = Gauge32: 45
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.5.6 = Gauge32: 78
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.5.7 = Gauge32: 58
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.5.8 = Gauge32: 281696
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.5.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.5.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.6.1 = Gauge32: 371
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.6.4 = Gauge32: 233
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.6.5 = Gauge32: 56
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.6.6 = Gauge32: 86
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.6.7 = Gauge32: 65
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.6.8 = Gauge32: 340154
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.6.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.6.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.7.1 = Gauge32: 389
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.7.4 = Gauge32: 234
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.7.5 = Gauge32: 65
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.7.6 = Gauge32: 91
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.7.7 = Gauge32: 72
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.7.8 = Gauge32: 293708
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.7.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.7.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.8.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.8.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.8.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.8.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.8.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.8.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.8.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.8.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.9.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.9.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.9.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.9.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.9.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.9.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.9.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.9.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.10.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.10.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.10.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.10.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.10.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.10.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.10.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.10.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.11.1 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.11.4 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.11.5 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.11.6 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.11.7 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.11.8 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.11.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.11.23 = Gauge32: 500
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.12.1 = Gauge32: 81
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.12.4 = Gauge32: 234
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.12.5 = Gauge32: 7
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.12.6 = Gauge32: 19
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.12.7 = Gauge32: 38
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.12.8 = Gauge32: 43137
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.12.14 = Gauge32: 0
.1.3.6.1.4.1.13742.6.5.4.3.1.4.1.12.23 = Gauge32: 500

View File

@ -0,0 +1,39 @@
*** Settings ***
Documentation Check Hardware (Fans, Power supplies, chassis, io cards, blades, fabric extenders).
Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}..${/}resources/import.resource
Suite Setup Ctn Generic Suite Setup
Test Timeout 120s
*** Variables ***
${CMD} ${CENTREON_PLUGINS} --plugin=hardware::server::cisco::ucs::snmp::plugin
*** Test Cases ***
equipment ${tc}
[Tags] hardware snmp
${command} Catenate
... ${CMD}
... --mode=equipment
... --hostname=${HOSTNAME}
... --snmp-version=${SNMPVERSION}
... --snmp-port=${SNMPPORT}
... --snmp-community=hardware/server/cisco/ucs/snmp/slim-ucs-equipment
... ${extra_options}
Ctn Verify Command Output ${command} ${expected_result}
Examples: tc extra_options expected_result --
... 1 ${EMPTY} WARNING: memory 'Anonymized-001/mem-12' presence is: 'missing' - memory 'Anonymized-001/mem-15' presence is: 'missing'
... 2 --threshold-overload='presence,OK,missing' --threshold-overload='operability,OK,removed' OK: All 100 components are ok [100/100 memories]. | 'hardware.memory.count'=100;;;;
... 3 --threshold-overload='presence,UNKNOWN,missing' --component='memory' UNKNOWN: memory 'Anonymized-001/mem-12' presence is: 'missing' - memory 'Anonymized-001/mem-15' presence is: 'missing'
... 4 --threshold-overload='operability,WARNING,missing' --component='memory' WARNING: memory 'Anonymized-001/mem-12' presence is: 'missing' - memory 'Anonymized-001/mem-15' presence is: 'missing'
... 5 --component='cpu' OK: All 0 components are ok [].
... 6 --filter=fan,/sys/chassis-7/fan-module-1-7/fan-1 WARNING: memory 'Anonymized-001/mem-12' presence is: 'missing' - memory 'Anonymized-001/mem-15' presence is: 'missing'
... 7 --absent-problem=fan,/sys/chassis-7/fan-module-1-7/fan-1 WARNING: memory 'Anonymized-001/mem-12' presence is: 'missing' - memory 'Anonymized-001/mem-15' presence is: 'missing'
... 8 --no-component=UNKNOWN --filter='.*' UNKNOWN: No components are checked.
... 9 --threshold-overload='presence,CRITICAL,equipped' CRITICAL: memory 'Anonymized-001/mem-10' presence is: 'equipped' - memory 'Anonymized-001/mem-11' presence is: 'equipped'
... 10 --filter='.*' OK: All 0 components are ok [].
... 11 --filter WARNING: memory 'Anonymized-001/mem-12' presence is: 'missing' - memory 'Anonymized-001/mem-15' presence is: 'missing'

View File

@ -0,0 +1,576 @@
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190046 = STRING: Anonymized-001/mem-10
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190047 = STRING: Anonymized-001/mem-11
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190048 = STRING: Anonymized-001/mem-12
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190049 = STRING: Anonymized-001/mem-13
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190050 = STRING: Anonymized-001/mem-14
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190051 = STRING: Anonymized-001/mem-15
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190052 = STRING: Anonymized-001/mem-16
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190053 = STRING: Anonymized-001/mem-17
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190054 = STRING: Anonymized-001/mem-18
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190055 = STRING: Anonymized-001/mem-19
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190056 = STRING: Anonymized-001/mem-1
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190057 = STRING: Anonymized-001/mem-2
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190058 = STRING: Anonymized-001/mem-3
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190059 = STRING: Anonymized-001/mem-4
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190060 = STRING: Anonymized-001/mem-5
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190061 = STRING: Anonymized-001/mem-6
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190062 = STRING: Anonymized-001/mem-7
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190063 = STRING: Anonymized-001/mem-8
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190064 = STRING: Anonymized-001/mem-9
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190065 = STRING: Anonymized-001/mem-20
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190066 = STRING: Anonymized-001/mem-21
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190067 = STRING: Anonymized-001/mem-22
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190068 = STRING: Anonymized-001/mem-23
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.190069 = STRING: Anonymized-001/mem-24
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367440 = STRING: Anonymized-002/mem-23
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367441 = STRING: Anonymized-002/mem-15
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367442 = STRING: Anonymized-002/mem-9
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367443 = STRING: Anonymized-002/mem-21
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367444 = STRING: Anonymized-002/mem-16
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367445 = STRING: Anonymized-002/mem-18
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367446 = STRING: Anonymized-002/mem-11
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367447 = STRING: Anonymized-002/mem-22
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367448 = STRING: Anonymized-002/mem-12
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367449 = STRING: Anonymized-002/mem-13
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367450 = STRING: Anonymized-002/mem-7
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367451 = STRING: Anonymized-002/mem-24
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367452 = STRING: Anonymized-002/mem-4
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367453 = STRING: Anonymized-002/mem-14
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367454 = STRING: Anonymized-002/mem-17
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367455 = STRING: Anonymized-002/mem-6
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367456 = STRING: Anonymized-002/mem-3
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367457 = STRING: Anonymized-002/mem-10
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367458 = STRING: Anonymized-002/mem-2
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367459 = STRING: Anonymized-002/mem-8
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367460 = STRING: Anonymized-002/mem-5
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367461 = STRING: Anonymized-002/mem-19
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367462 = STRING: Anonymized-002/mem-20
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.275367463 = STRING: Anonymized-002/mem-1
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769461 = STRING: Anonymized-003/mem--11
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769462 = STRING: Anonymized-003/mem--18
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769463 = STRING: Anonymized-003/mem--10
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769464 = STRING: Anonymized-003/mem--14
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769465 = STRING: Anonymized-003/mem--3
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769466 = STRING: Anonymized-003/mem--13
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769467 = STRING: Anonymized-003/mem--9
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769468 = STRING: Anonymized-003/mem--23
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769469 = STRING: Anonymized-003/mem--24
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769470 = STRING: Anonymized-003/mem--1
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769471 = STRING: Anonymized-003/mem--16
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769472 = STRING: Anonymized-003/mem--17
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769473 = STRING: Anonymized-003/mem--22
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769474 = STRING: Anonymized-003/mem--8
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769475 = STRING: Anonymized-003/mem--21
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769476 = STRING: Anonymized-003/mem--15
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769477 = STRING: Anonymized-003/mem--20
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769478 = STRING: Anonymized-003/mem--7
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769479 = STRING: Anonymized-003/mem--2
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769480 = STRING: Anonymized-003/mem--19
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769481 = STRING: Anonymized-003/mem--5
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769482 = STRING: Anonymized-003/mem--4
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769483 = STRING: Anonymized-003/mem--12
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277769484 = STRING: Anonymized-003/mem--6
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770731 = STRING: Anonymized-004/mem--7
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770732 = STRING: Anonymized-004/mem--9
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770733 = STRING: Anonymized-004/mem--10
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770734 = STRING: Anonymized-004/mem--16
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770735 = STRING: Anonymized-004/mem--3
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770736 = STRING: Anonymized-004/mem--15
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770737 = STRING: Anonymized-004/mem--8
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770738 = STRING: Anonymized-004/mem--14
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770739 = STRING: Anonymized-004/mem--19
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770740 = STRING: Anonymized-004/mem--4
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770741 = STRING: Anonymized-004/mem--12
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770742 = STRING: Anonymized-004/mem--21
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770743 = STRING: Anonymized-004/mem--22
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770744 = STRING: Anonymized-004/mem--18
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770745 = STRING: Anonymized-004/mem--23
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770746 = STRING: Anonymized-004/mem--24
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770747 = STRING: Anonymized-004/mem--20
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770748 = STRING: Anonymized-004/mem--13
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770749 = STRING: Anonymized-004/mem--11
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770750 = STRING: Anonymized-004/mem--6
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770751 = STRING: Anonymized-004/mem--17
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770752 = STRING: Anonymized-004/mem--5
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770753 = STRING: Anonymized-004/mem--2
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.277770754 = STRING: Anonymized-004/mem--1
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261034 = STRING: Anonymized-005/mem--13
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261035 = STRING: Anonymized-005/mem--8
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261036 = STRING: Anonymized-005/mem--5
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261037 = STRING: Anonymized-005/mem--12
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261038 = STRING: Anonymized-005/mem--9
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261039 = STRING: Anonymized-005/mem--16
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261040 = STRING: Anonymized-005/mem--15
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261041 = STRING: Anonymized-005/mem--24
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261042 = STRING: Anonymized-005/mem--22
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261043 = STRING: Anonymized-005/mem--14
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261044 = STRING: Anonymized-005/mem--23
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261045 = STRING: Anonymized-005/mem--3
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261046 = STRING: Anonymized-005/mem--21
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261047 = STRING: Anonymized-005/mem--2
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261048 = STRING: Anonymized-005/mem--11
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261049 = STRING: Anonymized-005/mem--6
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261050 = STRING: Anonymized-005/mem--18
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261051 = STRING: Anonymized-005/mem--19
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261052 = STRING: Anonymized-005/mem--4
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261053 = STRING: Anonymized-005/mem--20
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261054 = STRING: Anonymized-005/mem--10
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261055 = STRING: Anonymized-005/mem--7
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261056 = STRING: Anonymized-005/mem--17
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261057 = STRING: Anonymized-005/mem--1
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261172 = STRING: Anonymized-006/mem--7
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261173 = STRING: Anonymized-006/mem--8
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261174 = STRING: Anonymized-006/mem--9
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261175 = STRING: Anonymized-006/mem--10
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261176 = STRING: Anonymized-006/mem--3
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261177 = STRING: Anonymized-006/mem--12
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261178 = STRING: Anonymized-006/mem--13
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261179 = STRING: Anonymized-006/mem--6
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261180 = STRING: Anonymized-006/mem--19
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261181 = STRING: Anonymized-006/mem--14
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261182 = STRING: Anonymized-006/mem--18
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261183 = STRING: Anonymized-006/mem--15
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261184 = STRING: Anonymized-006/mem--11
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261185 = STRING: Anonymized-006/mem--1
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261186 = STRING: Anonymized-006/mem--2
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261187 = STRING: Anonymized-006/mem--24
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261188 = STRING: Anonymized-006/mem--4
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261189 = STRING: Anonymized-006/mem--5
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261190 = STRING: Anonymized-006/mem--16
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261191 = STRING: Anonymized-006/mem--17
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261192 = STRING: Anonymized-006/mem--20
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261193 = STRING: Anonymized-006/mem--21
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261194 = STRING: Anonymized-006/mem--22
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261195 = STRING: Anonymized-006/mem--23
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261289 = STRING: Anonymized-007/mem-1
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261290 = STRING: Anonymized-007/mem-8
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261291 = STRING: Anonymized-007/mem-2
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261292 = STRING: Anonymized-007/mem-6
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261293 = STRING: Anonymized-007/mem-11
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261294 = STRING: Anonymized-007/mem-10
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261295 = STRING: Anonymized-007/mem-5
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261296 = STRING: Anonymized-007/mem-9
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261297 = STRING: Anonymized-007/mem-24
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261298 = STRING: Anonymized-007/mem-20
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261299 = STRING: Anonymized-007/mem-23
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261300 = STRING: Anonymized-007/mem-17
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261301 = STRING: Anonymized-007/mem-21
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261302 = STRING: Anonymized-007/mem-3
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261303 = STRING: Anonymized-007/mem-4
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261304 = STRING: Anonymized-007/mem-7
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261305 = STRING: Anonymized-007/mem-19
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261306 = STRING: Anonymized-007/mem-13
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261307 = STRING: Anonymized-007/mem-18
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261308 = STRING: Anonymized-007/mem-22
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261309 = STRING: Anonymized-007/mem-16
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261310 = STRING: Anonymized-007/mem-15
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261311 = STRING: Anonymized-007/mem-12
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278261312 = STRING: Anonymized-007/mem-14
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292669 = STRING: Anonymized-008/mem-21
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292670 = STRING: Anonymized-008/mem-2
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292671 = STRING: Anonymized-008/mem-23
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292672 = STRING: Anonymized-008/mem-18
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292673 = STRING: Anonymized-008/mem-17
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292674 = STRING: Anonymized-008/mem-20
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292675 = STRING: Anonymized-008/mem-16
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292676 = STRING: Anonymized-008/mem-22
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292677 = STRING: Anonymized-008/mem-4
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292678 = STRING: Anonymized-008/mem-24
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292679 = STRING: Anonymized-008/mem-15
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292680 = STRING: Anonymized-008/mem-11
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292681 = STRING: Anonymized-008/mem-5
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292682 = STRING: Anonymized-008/mem-10
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292683 = STRING: Anonymized-008/mem-3
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292684 = STRING: Anonymized-008/mem-9
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292685 = STRING: Anonymized-008/mem-8
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292686 = STRING: Anonymized-008/mem-19
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292687 = STRING: Anonymized-008/mem-6
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292688 = STRING: Anonymized-008/mem-1
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292689 = STRING: Anonymized-008/mem-14
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292690 = STRING: Anonymized-008/mem-13
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292691 = STRING: Anonymized-008/mem-7
.1.3.6.1.4.1.9.9.719.1.30.11.1.2.278292692 = STRING: Anonymized-008/mem-12
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190046 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190047 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190048 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190049 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190050 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190051 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190052 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190053 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190054 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190055 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190056 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190057 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190058 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190059 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190060 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190061 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190062 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190063 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190064 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190065 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190066 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190067 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190068 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.190069 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367440 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367441 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367442 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367443 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367444 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367445 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367446 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367447 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367448 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367449 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367450 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367451 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367452 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367453 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367454 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367455 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367456 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367457 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367458 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367459 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367460 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367461 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367462 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.275367463 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769461 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769462 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769463 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769464 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769465 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769466 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769467 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769468 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769469 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769470 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769471 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769472 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769473 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769474 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769475 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769476 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769477 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769478 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769479 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769480 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769481 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769482 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769483 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277769484 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770731 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770732 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770733 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770734 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770735 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770736 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770737 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770738 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770739 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770740 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770741 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770742 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770743 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770744 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770745 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770746 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770747 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770748 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770749 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770750 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770751 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770752 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770753 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.277770754 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261034 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261035 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261036 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261037 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261038 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261039 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261040 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261041 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261042 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261043 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261044 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261045 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261046 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261047 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261048 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261049 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261050 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261051 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261052 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261053 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261054 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261055 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261056 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261057 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261172 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261173 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261174 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261175 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261176 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261177 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261178 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261179 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261180 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261181 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261182 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261183 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261184 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261185 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261186 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261187 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261188 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261189 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261190 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261191 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261192 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261193 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261194 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261195 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261289 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261290 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261291 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261292 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261293 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261294 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261295 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261296 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261297 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261298 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261299 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261300 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261301 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261302 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261303 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261304 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261305 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261306 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261307 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261308 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261309 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261310 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261311 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278261312 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292669 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292670 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292671 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292672 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292673 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292674 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292675 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292676 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292677 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292678 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292679 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292680 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292681 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292682 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292683 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292684 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292685 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292686 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292687 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292688 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292689 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292690 = INTEGER: 1
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292691 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.13.278292692 = INTEGER: 6
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190046 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190047 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190048 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190049 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190050 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190051 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190052 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190053 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190054 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190055 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190056 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190057 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190058 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190059 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190060 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190061 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190062 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190063 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190064 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190065 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190066 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190067 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190068 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.190069 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367440 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367441 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367442 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367443 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367444 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367445 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367446 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367447 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367448 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367449 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367450 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367451 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367452 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367453 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367454 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367455 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367456 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367457 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367458 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367459 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367460 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367461 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367462 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.275367463 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769461 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769462 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769463 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769464 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769465 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769466 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769467 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769468 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769469 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769470 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769471 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769472 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769473 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769474 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769475 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769476 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769477 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769478 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769479 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769480 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769481 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769482 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769483 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277769484 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770731 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770732 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770733 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770734 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770735 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770736 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770737 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770738 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770739 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770740 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770741 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770742 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770743 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770744 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770745 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770746 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770747 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770748 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770749 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770750 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770751 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770752 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770753 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.277770754 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261034 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261035 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261036 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261037 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261038 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261039 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261040 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261041 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261042 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261043 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261044 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261045 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261046 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261047 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261048 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261049 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261050 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261051 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261052 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261053 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261054 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261055 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261056 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261057 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261172 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261173 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261174 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261175 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261176 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261177 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261178 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261179 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261180 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261181 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261182 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261183 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261184 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261185 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261186 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261187 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261188 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261189 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261190 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261191 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261192 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261193 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261194 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261195 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261289 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261290 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261291 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261292 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261293 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261294 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261295 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261296 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261297 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261298 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261299 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261300 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261301 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261302 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261303 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261304 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261305 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261306 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261307 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261308 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261309 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261310 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261311 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278261312 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292669 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292670 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292671 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292672 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292673 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292674 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292675 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292676 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292677 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292678 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292679 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292680 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292681 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292682 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292683 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292684 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292685 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292686 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292687 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292688 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292689 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292690 = INTEGER: 10
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292691 = INTEGER: 11
.1.3.6.1.4.1.9.9.719.1.30.11.1.17.278292692 = INTEGER: 11

File diff suppressed because one or more lines are too long

View File

@ -33,10 +33,20 @@ scenario ${tc}
Examples: tc extra_options expected_result --
... 1 --filter-name='Centreon Demo Navigation|Centreon Demo ping NA' --output-ignore-perfdata CRITICAL: Scenario 'Centreon Demo Navigation': status: Failure (2) WARNING: Scenario 'Centreon Demo ping NA': status: Degraded (8)
... 2 --filter-name='AKILA - Business App' OK: Scenario 'AKILA - Business App': status: Success (1), availability: 100%, time total all steps: 4280ms - All steps are ok | 'AKILA - Business App#scenario.availability.percentage'=100%;;;0;100 'AKILA - Business App#scenario.time.allsteps.total.milliseconds'=4280ms;;;0; 'AKILA - Business App~Dashboard 2#scenario.step.time.milliseconds'=898ms;;;0; 'AKILA - Business App~Dashboard 3#scenario.step.time.milliseconds'=848ms;;;0; 'AKILA - Business App~Run Chrome#scenario.step.time.milliseconds'=2534ms;;;0;
... 3 --filter-name='wrong currentstatus.*' WARNING: Scenario 'wrong currentstatus, no perfdata': status: Unknown (14) - Scenario 'wrong currentstatus, no perfdata' Don't have any performance data, please try to add a bigger timeframe
... 3 --filter-name='wrong currentstatus.*' UNKNOWN: Scenario 'wrong currentstatus, no perfdata': status: Unknown (14) - No execution, please try again with a bigger timeframe
... 4 --filter-name='not a scenario name' UNKNOWN: No scenario found
... 5 --filter-id='09fe2561.*' --warning-time-total-allsteps='30' --output-ignore-perfdata WARNING: Scenario 'AKILA - (Web) ': time total all steps: 5822ms
... 5 --filter-id='127a149b.*' --warning-time-total='30' --output-ignore-perfdata WARNING: Scenario 'AKILA - (Browser Page Load)': Step: Default, last exec: 30-12-2024 10:30:00 UTC, time total: 1097 ms
... 6 --filter-status='2' --output-ignore-perfdata CRITICAL: Scenario 'Centreon Demo Navigation': status: Failure (2)
... 7 --filter-status='2' --filter-siteid='site' --filter-workspaceid='workspace' --output-ignore-perfdata CRITICAL: Scenario 'Centreon Demo Navigation': status: Failure (2)
... 8 --filter-type='not a scenario type' UNKNOWN: No scenario found
... 9 --api-password='Wrongpassword' --api-username='wrongUsername' UNKNOWN: Authentication endpoint returns error code 'Wrong email or password' (add --debug option for detailed message)
# This scenario failed the second step. we show only the first step perfdata, and not the perfdata of the other step for another timestamp.
... 10 --filter-name='AKILA - .Web.' CRITICAL: Scenario 'AKILA - (Web)': status: Failure (2) | 'AKILA - (Web)#scenario.availability.percentage'=45.76%;;;0;100 'AKILA - (Web)#scenario.time.allsteps.total.milliseconds'=4733ms;;;0; 'AKILA - (Web)~Home#scenario.step.time.milliseconds'=2851ms;;;0;
# without any filter-name of filter-id, every scenario are taken into account of this type.
... 11 --filter-type='WEB' --output-ignore-perfdata CRITICAL: Scenario 'AKILA - (Web)': status: Failure (2) - Scenario 'Centreon Demo Navigation': status: Failure (2)
# Check the unknown default parameter. These scenario are not real and go to the same scenarioId, which is not possible in real life.
... 12 --filter-name='unknown Status 0' --output-ignore-perfdata UNKNOWN: Scenario 'unknown Status 0': status: Unknown (0)
... 13 --filter-name='unknown Status 3' --output-ignore-perfdata UNKNOWN: Scenario 'unknown Status 3': status: Aborted (3)
... 14 --filter-name='unknown Status 4' --output-ignore-perfdata UNKNOWN: Scenario 'unknown Status 4': status: No execution (4)
... 15 --filter-name='unknown Status 5' --output-ignore-perfdata UNKNOWN: Scenario 'unknown Status 5': status: No execution (5)
... 16 --filter-name='unknown Status 6' --output-ignore-perfdata UNKNOWN: Scenario 'unknown Status 6': status: Stopped (6)

View File

@ -0,0 +1,35 @@
*** Settings ***
Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource
Test Timeout 120s
Test Setup Ctn Generic Suite Setup
*** Variables ***
${CMD} ${CENTREON_PLUGINS} --plugin=network::aruba::aoscx::snmp::plugin
*** Test Cases ***
hardware ${tc}
[Tags] network aruba
${command} Catenate
... ${CMD}
... --mode=hardware
... --hostname=${HOSTNAME}
... --snmp-version=${SNMPVERSION}
... --snmp-port=${SNMPPORT}
... --snmp-community=network/aruba/aoscx/snmp/slim_aoscx-spanning-tree
... --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 7 components are ok [1/1 psu, 6/6 temperatures]. | 'Anonymized 145#hardware.temperature.celsius'=60.00C;;;; 'Anonymized 096#hardware.temperature.celsius'=58.00C;;;; 'Anonymized 138#hardware.temperature.celsius'=20.50C;;;; 'Anonymized 186#hardware.temperature.celsius'=63.50C;;;; 'Anonymized 159#hardware.temperature.celsius'=63.25C;;;; 'Anonymized 101#hardware.temperature.celsius'=63.75C;;;; 'hardware.psu.count'=1;;;; 'hardware.temperature.count'=6;;;;
... 2 --component='.*' OK: All 7 components are ok [1/1 psu, 6/6 temperatures]. | 'Anonymized 145#hardware.temperature.celsius'=60.00C;;;; 'Anonymized 096#hardware.temperature.celsius'=58.00C;;;; 'Anonymized 138#hardware.temperature.celsius'=20.50C;;;; 'Anonymized 186#hardware.temperature.celsius'=63.50C;;;; 'Anonymized 159#hardware.temperature.celsius'=63.25C;;;; 'Anonymized 101#hardware.temperature.celsius'=63.75C;;;; 'hardware.psu.count'=1;;;; 'hardware.temperature.count'=6;;;;
... 3 --filter='psu' OK: All 6 components are ok [6/6 temperatures]. | 'Anonymized 145#hardware.temperature.celsius'=60.00C;;;; 'Anonymized 096#hardware.temperature.celsius'=58.00C;;;; 'Anonymized 138#hardware.temperature.celsius'=20.50C;;;; 'Anonymized 186#hardware.temperature.celsius'=63.50C;;;; 'Anonymized 159#hardware.temperature.celsius'=63.25C;;;; 'Anonymized 101#hardware.temperature.celsius'=63.75C;;;; 'hardware.temperature.count'=6;;;;
... 4 --no-component='CRITICAL' --filter='.*' CRITICAL: No components are checked.
... 5 --threshold-overload='fan,WARNING,string' OK: All 7 components are ok [1/1 psu, 6/6 temperatures]. | 'Anonymized 145#hardware.temperature.celsius'=60.00C;;;; 'Anonymized 096#hardware.temperature.celsius'=58.00C;;;; 'Anonymized 138#hardware.temperature.celsius'=20.50C;;;; 'Anonymized 186#hardware.temperature.celsius'=63.50C;;;; 'Anonymized 159#hardware.temperature.celsius'=63.25C;;;; 'Anonymized 101#hardware.temperature.celsius'=63.75C;;;; 'hardware.psu.count'=1;;;; 'hardware.temperature.count'=6;;;;
... 6 --warning='temperature,.*,30' WARNING: temperature 'Anonymized 145' is 60.00 C - temperature 'Anonymized 096' is 58.00 C - temperature 'Anonymized 186' is 63.50 C - temperature 'Anonymized 159' is 63.25 C - temperature 'Anonymized 101' is 63.75 C | 'Anonymized 145#hardware.temperature.celsius'=60.00C;0:30;;; 'Anonymized 096#hardware.temperature.celsius'=58.00C;0:30;;; 'Anonymized 138#hardware.temperature.celsius'=20.50C;0:30;;; 'Anonymized 186#hardware.temperature.celsius'=63.50C;0:30;;; 'Anonymized 159#hardware.temperature.celsius'=63.25C;0:30;;; 'Anonymized 101#hardware.temperature.celsius'=63.75C;0:30;;; 'hardware.psu.count'=1;;;; 'hardware.temperature.count'=6;;;;
... 7 --critical='temperature,.*,40' CRITICAL: temperature 'Anonymized 145' is 60.00 C - temperature 'Anonymized 096' is 58.00 C - temperature 'Anonymized 186' is 63.50 C - temperature 'Anonymized 159' is 63.25 C - temperature 'Anonymized 101' is 63.75 C | 'Anonymized 145#hardware.temperature.celsius'=60.00C;;0:40;; 'Anonymized 096#hardware.temperature.celsius'=58.00C;;0:40;; 'Anonymized 138#hardware.temperature.celsius'=20.50C;;0:40;; 'Anonymized 186#hardware.temperature.celsius'=63.50C;;0:40;; 'Anonymized 159#hardware.temperature.celsius'=63.25C;;0:40;; 'Anonymized 101#hardware.temperature.celsius'=63.75C;;0:40;; 'hardware.psu.count'=1;;;; 'hardware.temperature.count'=6;;;;
... 8 --warning='fan.speed,.*,1000' OK: All 7 components are ok [1/1 psu, 6/6 temperatures]. | 'Anonymized 145#hardware.temperature.celsius'=60.00C;;;; 'Anonymized 096#hardware.temperature.celsius'=58.00C;;;; 'Anonymized 138#hardware.temperature.celsius'=20.50C;;;; 'Anonymized 186#hardware.temperature.celsius'=63.50C;;;; 'Anonymized 159#hardware.temperature.celsius'=63.25C;;;; 'Anonymized 101#hardware.temperature.celsius'=63.75C;;;; 'hardware.psu.count'=1;;;; 'hardware.temperature.count'=6;;;;
... 9 --critical='fan.speed,.*,2000' OK: All 7 components are ok [1/1 psu, 6/6 temperatures]. | 'Anonymized 145#hardware.temperature.celsius'=60.00C;;;; 'Anonymized 096#hardware.temperature.celsius'=58.00C;;;; 'Anonymized 138#hardware.temperature.celsius'=20.50C;;;; 'Anonymized 186#hardware.temperature.celsius'=63.50C;;;; 'Anonymized 159#hardware.temperature.celsius'=63.25C;;;; 'Anonymized 101#hardware.temperature.celsius'=63.75C;;;; 'hardware.psu.count'=1;;;; 'hardware.temperature.count'=6;;;;

View File

@ -0,0 +1,44 @@
*** Settings ***
Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource
Test Timeout 120s
Test Setup Ctn Generic Suite Setup
*** Variables ***
${CMD} ${CENTREON_PLUGINS} --plugin=network::aruba::aoscx::snmp::plugin
*** Test Cases ***
interfaces ${tc}
[Tags] network aruba interfaces
${command} Catenate
... ${CMD}
... --mode=interfaces
... --hostname=${HOSTNAME}
... --snmp-version=${SNMPVERSION}
... --snmp-port=${SNMPPORT}
... --snmp-community=network/aruba/aoscx/snmp/slim_aoscx-spanning-tree
... --snmp-timeout=1
... ${extra_options}
Ctn Run Command And Check Result As Strings ${command} ${expected_result}
Examples: tc extra_options expected_result --
... 1 ${EMPTY} CRITICAL: Interface '1/1/10' Status : down (admin: up) - Interface '1/1/11' Status : down (admin: up) - Interface '1/1/12' Status : down (admin: up) - Interface '1/1/13' Status : down (admin: up) - Interface '1/1/14' Status : down (admin: up) - Interface '1/1/2' Status : down (admin: up) - Interface '1/1/4' Status : down (admin: up) - Interface '1/1/5' Status : down (admin: up) - Interface '1/1/6' Status : down (admin: up) - Interface '1/1/7' Status : down (admin: up) - Interface '1/1/8' Status : down (admin: up) - Interface '1/1/9' Status : down (admin: up)
... 2 --add-global OK: Total port : 18, AdminStatus Up : 18, AdminStatus Down : 0, OperStatus Up : 6, OperStatus Down : 12 | 'total_port'=18;;;0;18 'total_admin_up'=18;;;0;18 'total_admin_down'=0;;;0;18 'total_oper_up'=6;;;0;18 'global_oper_down'=12;;;0;18
... 3 --add-status CRITICAL: Interface '1/1/10' Status : down (admin: up) - Interface '1/1/11' Status : down (admin: up) - Interface '1/1/12' Status : down (admin: up) - Interface '1/1/13' Status : down (admin: up) - Interface '1/1/14' Status : down (admin: up) - Interface '1/1/2' Status : down (admin: up) - Interface '1/1/4' Status : down (admin: up) - Interface '1/1/5' Status : down (admin: up) - Interface '1/1/6' Status : down (admin: up) - Interface '1/1/7' Status : down (admin: up) - Interface '1/1/8' Status : down (admin: up) - Interface '1/1/9' Status : down (admin: up)
... 4 --add-duplex-status --warning-status='\\\%{opstatus} eq "warning"' CRITICAL: Interface '1/1/10' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/11' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/12' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/13' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/14' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/2' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/4' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/5' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/6' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/7' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/8' Status : down (admin: up) (duplex: fullDuplex) - Interface '1/1/9' Status : down (admin: up) (duplex: fullDuplex)
... 5 --add-traffic --name --interface='Anonymized 123' --warning-in-traffic=1:1 --speed=1 UNKNOWN: No entry found (maybe you should reload cache file)
... 6 --add-errors OK: All interfaces are ok
... 7 --add-cast --interface='1,1,14' OK: All interfaces are ok
... 8 --add-speed --interface='1,1,16' OK: All interfaces are ok | 'speed_1/1/1'=100000000b/s;;;0; 'speed_1/1/16'=1000000000b/s;;;0;
... 9 --add-volume --interface='1,1,10' --add-status='critical' CRITICAL: Interface '1/1/10' Status : down (admin: up)
... 10 --check-metrics='\\\%{opstatus} eq "up"' CRITICAL: Interface '1/1/10' Status : down (admin: up) - Interface '1/1/11' Status : down (admin: up) - Interface '1/1/12' Status : down (admin: up) - Interface '1/1/13' Status : down (admin: up) - Interface '1/1/14' Status : down (admin: up) - Interface '1/1/2' Status : down (admin: up) - Interface '1/1/4' Status : down (admin: up) - Interface '1/1/5' Status : down (admin: up) - Interface '1/1/6' Status : down (admin: up) - Interface '1/1/7' Status : down (admin: up) - Interface '1/1/8' Status : down (admin: up) - Interface '1/1/9' Status : down (admin: up)
... 11 --warning-status='\\\%{admstatus} eq "up"' --interface='16' WARNING: Interface '1/1/16' Status : up (admin: up)
... 12 --critical-status='\\\%{admstatus} eq "up" and \\\%{opstatus} ne "up"' CRITICAL: Interface '1/1/10' Status : down (admin: up) - Interface '1/1/11' Status : down (admin: up) - Interface '1/1/12' Status : down (admin: up) - Interface '1/1/13' Status : down (admin: up) - Interface '1/1/14' Status : down (admin: up) - Interface '1/1/2' Status : down (admin: up) - Interface '1/1/4' Status : down (admin: up) - Interface '1/1/5' Status : down (admin: up) - Interface '1/1/6' Status : down (admin: up) - Interface '1/1/7' Status : down (admin: up) - Interface '1/1/8' Status : down (admin: up) - Interface '1/1/9' Status : down (admin: up)
... 13 --warning-out-traffic='0' --critical-out-traffic=10 --warning-status='\\\%{opstatus} eq "up"' --interface='16' WARNING: Interface '1/1/16' Status : up (admin: up)
... 14 --warning-in-traffic='0' --critical-in-traffic=10 --critical-status='\\\%{opstatus} eq "up"' CRITICAL: Interface '1/1/1' Status : up (admin: up) - Interface '1/1/15' Status : up (admin: up) - Interface '1/1/16' Status : up (admin: up) - Interface 'Anonymized 124' Status : up (admin: up) - Interface '1/1/3' Status : up (admin: up) - Interface 'Anonymized 066' Status : up (admin: up)
... 15 --units-traffic='12%' CRITICAL: Interface '1/1/10' Status : down (admin: up) - Interface '1/1/11' Status : down (admin: up) - Interface '1/1/12' Status : down (admin: up) - Interface '1/1/13' Status : down (admin: up) - Interface '1/1/14' Status : down (admin: up) - Interface '1/1/2' Status : down (admin: up) - Interface '1/1/4' Status : down (admin: up) - Interface '1/1/5' Status : down (admin: up) - Interface '1/1/6' Status : down (admin: up) - Interface '1/1/7' Status : down (admin: up) - Interface '1/1/8' Status : down (admin: up) - Interface '1/1/9' Status : down (admin: up)
... 16 --units-errors='12%' CRITICAL: Interface '1/1/10' Status : down (admin: up) - Interface '1/1/11' Status : down (admin: up) - Interface '1/1/12' Status : down (admin: up) - Interface '1/1/13' Status : down (admin: up) - Interface '1/1/14' Status : down (admin: up) - Interface '1/1/2' Status : down (admin: up) - Interface '1/1/4' Status : down (admin: up) - Interface '1/1/5' Status : down (admin: up) - Interface '1/1/6' Status : down (admin: up) - Interface '1/1/7' Status : down (admin: up) - Interface '1/1/8' Status : down (admin: up) - Interface '1/1/9' Status : down (admin: up)
... 17 --units-cast='12%' CRITICAL: Interface '1/1/10' Status : down (admin: up) - Interface '1/1/11' Status : down (admin: up) - Interface '1/1/12' Status : down (admin: up) - Interface '1/1/13' Status : down (admin: up) - Interface '1/1/14' Status : down (admin: up) - Interface '1/1/2' Status : down (admin: up) - Interface '1/1/4' Status : down (admin: up) - Interface '1/1/5' Status : down (admin: up) - Interface '1/1/6' Status : down (admin: up) - Interface '1/1/7' Status : down (admin: up) - Interface '1/1/8' Status : down (admin: up) - Interface '1/1/9' Status : down (admin: up)
... 18 --display-transform-src='Anonymized' --display-transform-dst='Interface' --name --interface='Anonymized 124' OK: Interface 'Interface 124' Status : up (admin: up)

Some files were not shown because too many files have changed in this diff Show More