diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9470036c4a..093e82d155 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,22 +1,23 @@ -* @centreon/owners-connectors +* @centreon/owners-connectors -*.md @centreon/owners-doc -*.mdx @centreon/owners-doc +*.md @centreon/owners-doc +*.mdx @centreon/owners-doc -*.cmake @centreon/owners-cpp -CMakeLists.txt @centreon/owners-cpp -Makefile @centreon/owners-cpp +*.cmake @centreon/owners-cpp +CMakeLists.txt @centreon/owners-cpp +Makefile @centreon/owners-cpp -*.pm @centreon/owners-perl -*.pl @centreon/owners-perl +*.pm @centreon/owners-perl +*.pl @centreon/owners-perl +*.t @centreon/owners-perl -*.py @centreon/owners-python +*.py @centreon/owners-python -*.sh @centreon/owners-bash +*.sh @centreon/owners-bash -tests/** @centreon/owners-robot-e2e +tests/** @centreon/owners-robot-e2e -.github/** @centreon/owners-pipelines -packaging/** @centreon/owners-pipelines -selinux/** @centreon/owners-pipelines +.github/** @centreon/owners-pipelines +packaging/** @centreon/owners-perl +selinux/** @centreon/owners-pipelines .github/scripts/pod_spell_check.t @centreon/owners-perl diff --git a/.github/actions/deb-delivery-legacy/action.yml b/.github/actions/deb-delivery-legacy/action.yml deleted file mode 100644 index dd70aaab9c..0000000000 --- a/.github/actions/deb-delivery-legacy/action.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: "deb-delivery-legacy" -description: "Deliver legacy DEB packages" -inputs: - module_name: - description: "The package module name" - required: true - distrib: - description: "The distribution used for packaging" - required: true - major_version: - description: "The major version" - required: true - cache_key: - description: "The cached package key" - required: true - stability: - description: "The package stability (stable, testing, unstable)" - required: true - artifactory_token: - description: "token for artifactory" - required: true - -runs: - using: "composite" - steps: - - name: Use cache DEB files - uses: actions/cache/restore@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0 - with: - path: ./*.deb - key: ${{ inputs.cache_key }} - fail-on-cache-miss: true - - - uses: jfrog/setup-jfrog-cli@26da2259ee7690e63b5410d7451b2938d08ce1f9 # v4.0.0 - env: - JF_URL: https://centreon.jfrog.io - JF_ACCESS_TOKEN: ${{ inputs.artifactory_token }} - - - name: Publish DEBs to artifactory - run: | - FILES="*.deb" - - for FILE in $FILES; do - echo "[DEBUG] - File: $FILE" - - ARCH=$(echo $FILE | cut -d '_' -f3 | cut -d '.' -f1) - - jf rt upload "$FILE" "apt-standard-${{ inputs.major_version }}-${{ inputs.stability }}/pool/${{ inputs.module_name }}/" --deb "${{ inputs.distrib }}/main/$ARCH" - done - shell: bash diff --git a/.github/actions/deb-delivery/action.yml b/.github/actions/deb-delivery/action.yml deleted file mode 100644 index 0a3fc332aa..0000000000 --- a/.github/actions/deb-delivery/action.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: "deb-delivery" -description: "Deliver DEB packages" -inputs: - module_name: - description: "The package module name" - required: true - distrib: - description: "The distribution used for packaging" - required: true - cache_key: - description: "The cached package key" - required: true - stability: - description: "The package stability (stable, testing, unstable)" - required: true - artifactory_token: - description: "token for artifactory" - required: true - -runs: - using: "composite" - steps: - - name: Remove previously delivered DEBs - if: ${{ ! (inputs.distrib == 'jammy' && inputs.stability == 'stable') }} - run: rm -f ./*.deb - shell: bash - - - name: Use cache DEB files - if: ${{ ! (inputs.distrib == 'jammy' && inputs.stability == 'stable') }} - uses: actions/cache/restore@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0 - with: - path: ./*.deb - key: ${{ inputs.cache_key }} - fail-on-cache-miss: true - - - if: ${{ ! (inputs.distrib == 'jammy' && inputs.stability == 'stable') }} - uses: jfrog/setup-jfrog-cli@26da2259ee7690e63b5410d7451b2938d08ce1f9 # v4.0.0 - env: - JF_URL: https://centreon.jfrog.io - JF_ACCESS_TOKEN: ${{ inputs.artifactory_token }} - - - name: Publish DEBs to artifactory - if: ${{ ! (inputs.distrib == 'jammy' && inputs.stability == 'stable') }} - run: | - FILES="*.deb" - - if [[ "${{ inputs.distrib }}" == "jammy" ]]; then - REPO_PREFIX="ubuntu" - else - REPO_PREFIX="apt" - fi - - for FILE in $FILES; do - echo "[DEBUG] - File: $FILE" - - ARCH=$(echo $FILE | cut -d '_' -f3 | cut -d '.' -f1) - - jf rt upload "$FILE" "${REPO_PREFIX}-plugins-${{ inputs.stability }}/pool/${{ inputs.module_name }}/" --deb "${{ inputs.distrib }}/main/$ARCH" - done - shell: bash diff --git a/.github/actions/package-delivery/action.yml b/.github/actions/package-delivery/action.yml new file mode 100644 index 0000000000..1ba3006a18 --- /dev/null +++ b/.github/actions/package-delivery/action.yml @@ -0,0 +1,200 @@ +name: "package-delivery" +description: "Deliver packages" +inputs: + module_name: + description: "The package module name" + required: true + distrib: + description: "The distribution used for packaging" + required: true + arch: + description: "The target distribution architecture" + required: false + cache_key: + description: "The cached package key" + required: true + stability: + description: "The package stability (stable, testing, unstable)" + required: true + release_type: + description: "Type of release (hotfix, release)" + required: true + artifactory_token: + description: "token for artifactory" + required: true + +runs: + using: "composite" + steps: + - name: Validate inputs + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + if ('${{ inputs.module_name }}' === '') { + throw new Error('module_name input must be defined'); + } + + if (! ['stable', 'testing', 'unstable'].includes('${{ inputs.stability }}')) { + throw new Error(`Stability ${{ inputs.stability }} should not deliver packages`); + } + + if ('${{ inputs.stability }}' === 'testing' && ! ['release', 'hotfix'].includes('${{ inputs.release_type }}')) { + throw new Error('release_type input must be defined when stability is testing'); + } + + - name: Parse distrib name + id: parse-distrib + uses: ./.github/actions/parse-distrib + with: + distrib: ${{ inputs.distrib }} + + - name: Get repository stability path + id: get_repository_stability_path + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + let stabilitySubdirectory = '${{ inputs.stability }}'; + + if ('${{ inputs.stability }}' === 'testing' && '${{ inputs.release_type }}' === 'hotfix') { + stabilitySubdirectory = '${{ inputs.stability }}-${{ inputs.release_type }}'; + } + + let repositoryStabilityPath = ''; + if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'el') { + repositoryStabilityPath = `rpm-plugins/${{ inputs.distrib }}/${stabilitySubdirectory}`; + } else if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'ubuntu') { + repositoryStabilityPath = `ubuntu-plugins-${{ inputs.stability }}`; + } else if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'debian') { + repositoryStabilityPath = `apt-plugins-${{ inputs.stability }}`; + } else { + throw new Error(`Repository cannot be find for distribution: ${{ inputs.distrib }}`); + } + + core.setOutput( + 'repository_stability_path', + repositoryStabilityPath, + ); + + - if: ${{ inputs.stability != 'stable' }} + name: Restore packages from cache + uses: actions/cache/restore@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 + with: + path: ./*.${{ steps.parse-distrib.outputs.package_extension }} + key: ${{ inputs.cache_key }} + fail-on-cache-miss: true + + - uses: jfrog/setup-jfrog-cli@9fe0f98bd45b19e6e931d457f4e98f8f84461fb5 # v4.4.1 + with: + disable-job-summary: true + disable-auto-build-publish: true + env: + JF_URL: https://centreon.jfrog.io + JF_ACCESS_TOKEN: ${{ inputs.artifactory_token }} + + - if: ${{ inputs.stability == 'testing' }} + name: Clean existing testing packages + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'el') { + await exec.exec( + `jf rt del "${{ steps.get_repository_stability_path.outputs.repository_stability_path }}/*/${{ inputs.module_name }}/*.rpm" --exclusions "*/RPMS/*" --quiet` + ); + } else if ('${{ steps.parse-distrib.outputs.package_extension }}' === 'deb') { + await exec.exec( + `jf rt del "${{ steps.get_repository_stability_path.outputs.repository_stability_path }}/pool/${{ inputs.module_name }}/*${{ steps.parse-distrib.outputs.package_distrib_name }}*.deb" --quiet --props "release_type=${{ inputs.release_type }}"` + ); + } + + - name: Download packages from testing + if: ${{ inputs.stability == 'stable' && github.event_name == 'push' && inputs.distrib != 'jammy' }} + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const warningNoPromote = 'No packages are promoted because push is not related to a hotfix/release pull request.'; + const commitSha = context.sha; + + const pulls = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + sort: 'updated', + direction: 'desc', + state: 'closed', + per_page: 100 + }); + + const pr = pulls.data.find(p => p.merge_commit_sha === commitSha); + if (!pr) { + core.warning(warningNoPromote); + return; + } + + const prBaseRef = pr?.base?.ref || 'unknown'; + let releaseType = ''; + switch (true) { + case /^release.+/.test(prBaseRef): + releaseType = 'release'; + break; + case /^hotfix.+/.test(prBaseRef): + releaseType = 'hotfix'; + break; + default: + core.warning(warningNoPromote); + return; + } + + let fromStabilitySubdirectory = 'testing'; + if (releaseType === 'hotfix' ) { + fromStabilitySubdirectory = `testing-${releaseType}`; + } + + if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'el') { + await exec.exec( + `jf rt download "rpm-plugins/${{ inputs.distrib }}/${fromStabilitySubdirectory}/*/${{ inputs.module_name }}/*.rpm" --flat` + ); + } else if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'ubuntu') { + await exec.exec( + `jf rt download "ubuntu-plugins-testing/pool/${{ inputs.module_name }}/*${{ steps.parse-distrib.outputs.package_distrib_name }}*.deb" --props "release_type=${{ inputs.release_type }}" --flat` + ); + } else if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'debian') { + await exec.exec( + `jf rt download "apt-plugins-testing/pool/${{ inputs.module_name }}/*${{ steps.parse-distrib.outputs.package_distrib_name }}*.deb" --props "release_type=${{ inputs.release_type }}" --flat` + ); + } + + - name: Publish packages to ${{ inputs.stability }} + if: | + contains(fromJson('["testing", "unstable"]'), inputs.stability) || + (inputs.stability == 'stable' && github.event_name == 'push' && inputs.distrib != 'jammy') + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const path = require('path'); + const globber = await glob.create('*.${{ steps.parse-distrib.outputs.package_extension }}'); + + const debTargetProps = '${{ inputs.stability }}' == 'testing' ? '--target-props "release_type=${{ inputs.release_type }}"' : ''; + + for await (const file of globber.globGenerator()) { + const fileName = path.basename(file); + + if ('${{ steps.parse-distrib.outputs.package_extension }}' === 'rpm') { + let arch = 'noarch'; + if (/x86_64/.test(fileName)) { + arch = 'x86_64'; + } + await exec.exec( + `jf rt upload "${fileName}" "${{ steps.get_repository_stability_path.outputs.repository_stability_path }}/${arch}/${{ inputs.module_name }}/" --flat` + ); + } else if ('${{ steps.parse-distrib.outputs.package_extension }}' === 'deb') { + let arch = 'all'; + const matches = fileName.match(/_([^_]+)\.deb/); + if (matches !== null && matches.length > 1) { + arch = matches[1]; + } + if ('${{ inputs.arch }}' === '' || '${{ inputs.arch }}' === arch) { + await exec.exec( + `jf rt upload "${fileName}" "${{ steps.get_repository_stability_path.outputs.repository_stability_path }}/pool/${{ inputs.module_name }}/" --deb "${{ inputs.distrib }}/main/${arch}" ${debTargetProps} --flat` + ); + } + } + } diff --git a/.github/actions/package-nfpm/action.yml b/.github/actions/package-nfpm/action.yml index 1aca021b83..189b5fdd9c 100644 --- a/.github/actions/package-nfpm/action.yml +++ b/.github/actions/package-nfpm/action.yml @@ -48,12 +48,6 @@ runs: using: composite steps: - - name: Remove previously packaged DEBs and RPMs - run: | - rm -f ./*.deb - rm -f ./*.rpm - shell: bash - - name: Parse distrib name id: parse-distrib uses: ./.github/actions/parse-distrib @@ -128,14 +122,7 @@ runs: done shell: bash - - if: ${{ inputs.distrib == 'el7' }} - uses: actions/cache/save@704facf57e6136b1bc63b828d79edcd491f0ee84 # v3.3.2 - with: - path: ./*.${{ inputs.package_extension }} - key: ${{ inputs.cache_key }} - - - if: ${{ inputs.distrib != 'el7' }} - uses: actions/cache/save@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0 + - uses: actions/cache/save@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0 with: path: ./*.${{ inputs.package_extension }} key: ${{ inputs.cache_key }} diff --git a/.github/actions/parse-distrib/action.yml b/.github/actions/parse-distrib/action.yml index bf79d00056..790c889d9f 100644 --- a/.github/actions/parse-distrib/action.yml +++ b/.github/actions/parse-distrib/action.yml @@ -11,6 +11,12 @@ outputs: package_distrib_name: description: "Distribution suffix in package name" value: ${{ steps.parse-distrib.outputs.package_distrib_name }} + package_extension: + description: "Package extension (rpm or deb)" + value: ${{ steps.parse-distrib.outputs.package_extension }} + distrib_family: + description: "Distrib family (el, debian, ubuntu)" + value: ${{ steps.parse-distrib.outputs.distrib_family }} runs: using: "composite" @@ -21,26 +27,39 @@ runs: if [[ "${{ inputs.distrib }}" == "centos7" || "${{ inputs.distrib }}" == "el7" ]]; then PACKAGE_DISTRIB_SEPARATOR="." PACKAGE_DISTRIB_NAME="el7" + PACKAGE_EXTENSION="rpm" + DISTRIB_FAMILY="el" elif [[ "${{ inputs.distrib }}" == "alma8" || "${{ inputs.distrib }}" == "el8" ]]; then PACKAGE_DISTRIB_SEPARATOR="." PACKAGE_DISTRIB_NAME="el8" + PACKAGE_EXTENSION="rpm" + DISTRIB_FAMILY="el" elif [[ "${{ inputs.distrib }}" == "alma9" || "${{ inputs.distrib }}" == "el9" ]]; then PACKAGE_DISTRIB_SEPARATOR="." PACKAGE_DISTRIB_NAME="el9" + PACKAGE_EXTENSION="rpm" + DISTRIB_FAMILY="el" elif [[ "${{ inputs.distrib }}" == "bullseye" ]]; then PACKAGE_DISTRIB_SEPARATOR="+" PACKAGE_DISTRIB_NAME="deb11u1" + PACKAGE_EXTENSION="deb" + DISTRIB_FAMILY="debian" elif [[ "${{ inputs.distrib }}" == "bookworm" ]]; then PACKAGE_DISTRIB_SEPARATOR="+" PACKAGE_DISTRIB_NAME="deb12u1" + PACKAGE_EXTENSION="deb" + DISTRIB_FAMILY="debian" elif [[ "${{ inputs.distrib }}" == "jammy" ]]; then PACKAGE_DISTRIB_SEPARATOR="-" PACKAGE_DISTRIB_NAME="0ubuntu.22.04" + PACKAGE_EXTENSION="deb" + DISTRIB_FAMILY="ubuntu" else echo "::error::Distrib ${{ inputs.distrib }} cannot be parsed" exit 1 fi - echo "package_distrib_separator=$PACKAGE_DISTRIB_SEPARATOR" >> $GITHUB_OUTPUT echo "package_distrib_name=$PACKAGE_DISTRIB_NAME" >> $GITHUB_OUTPUT + echo "package_extension=$PACKAGE_EXTENSION" >> $GITHUB_OUTPUT + echo "distrib_family=$DISTRIB_FAMILY" >> $GITHUB_OUTPUT shell: bash diff --git a/.github/actions/rpm-delivery-legacy/action.yml b/.github/actions/rpm-delivery-legacy/action.yml deleted file mode 100644 index 1f801a510e..0000000000 --- a/.github/actions/rpm-delivery-legacy/action.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: "rpm-delivery-legacy" -description: "rpm delivery in legacy repositories" -inputs: - module_name: - description: "The package module name" - required: true - major_version: - description: "The major version" - required: true - distrib: - description: "The distribution used for packaging" - required: true - cache_key: - description: "The cached package key" - required: true - stability: - description: "The package stability (stable, testing, unstable)" - required: true - artifactory_token: - description: "token for artifactory" - required: true - -runs: - using: "composite" - steps: - - name: Use cache RPM files - uses: actions/cache/restore@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0 - with: - path: ./*.rpm - key: ${{ inputs.cache_key }} - fail-on-cache-miss: true - - - uses: jfrog/setup-jfrog-cli@26da2259ee7690e63b5410d7451b2938d08ce1f9 # v4.0.0 - env: - JF_URL: https://centreon.jfrog.io - JF_ACCESS_TOKEN: ${{ inputs.artifactory_token }} - - - name: Publish RPMs to standard repository - run: | - FILES="*.rpm" - - echo "[DEBUG] - Distrib: ${{ inputs.distrib }}" - - if [ -z "${{ inputs.module_name }}" ]; then - echo "::error::Module name is required" - exit 1 - fi - - if [ -z "${{ inputs.distrib }}" ]; then - echo "::error::Distrib is required" - exit 1 - fi - - mkdir noarch x86_64 - - for FILE in $FILES; do - echo "[DEBUG] - File: $FILE" - - ARCH=$(echo $FILE | grep -oP '(x86_64|noarch)') - - echo "[DEBUG] - Arch: $ARCH" - - cp "$FILE" "$ARCH" - done - - for ARCH in "noarch" "x86_64"; do - if [ "$(ls -A $ARCH)" ]; then - if [ "${{ inputs.stability }}" == "stable" ]; then - jf rt upload "$ARCH/*.rpm" "rpm-standard/${{ inputs.major_version }}/${{ inputs.distrib }}/${{ inputs.stability }}/$ARCH/RPMS/${{ inputs.module_name }}/" --flat - else - jf rt upload "$ARCH/*.rpm" "rpm-standard/${{ inputs.major_version }}/${{ inputs.distrib }}/${{ inputs.stability }}/$ARCH/${{ inputs.module_name }}/" --flat - fi - fi - done - shell: bash diff --git a/.github/actions/rpm-delivery/action.yml b/.github/actions/rpm-delivery/action.yml deleted file mode 100644 index b5eef4f1bd..0000000000 --- a/.github/actions/rpm-delivery/action.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: "rpm-delivery" -description: "rpm delivery" -inputs: - module_name: - description: "The package module name" - required: true - distrib: - description: "The distribution used for packaging" - required: true - cache_key: - description: "The cached package key" - required: true - stability: - description: "The package stability (stable, testing, unstable)" - required: true - artifactory_token: - description: "token for artifactory" - required: true - -runs: - using: "composite" - steps: - - name: Remove previously delivered RPMs - run: rm -f ./*.rpm - shell: bash - - - name: Use cache RPM files - uses: actions/cache/restore@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0 - with: - path: ./*.rpm - key: ${{ inputs.cache_key }} - fail-on-cache-miss: true - - - uses: jfrog/setup-jfrog-cli@26da2259ee7690e63b5410d7451b2938d08ce1f9 # v4.0.0 - env: - JF_URL: https://centreon.jfrog.io - JF_ACCESS_TOKEN: ${{ inputs.artifactory_token }} - - - name: Publish RPMs to plugins repository - run: | - FILES="*.rpm" - - echo "[DEBUG] - Distrib: ${{ inputs.distrib }}" - - if [ -z "${{ inputs.module_name }}" ]; then - echo "module name is required" - exit 1 - fi - - if [ -z "${{ inputs.distrib }}" ]; then - echo "distrib is required" - exit 1 - fi - - rm -rf noarch x86_64 - mkdir noarch x86_64 - - for FILE in $FILES; do - echo "[DEBUG] - File: $FILE" - - ARCH=$(echo $FILE | grep -oP '(x86_64|noarch)') - - echo "[DEBUG] - Arch: $ARCH" - - cp "$FILE" "$ARCH" - done - - for ARCH in "noarch" "x86_64"; do - if [ "$(ls -A $ARCH)" ]; then - if [ "${{ inputs.stability }}" == "stable" ]; then - jf rt upload "$ARCH/*.rpm" "rpm-plugins/${{ inputs.distrib }}/${{ inputs.stability }}/$ARCH/RPMS/${{ inputs.module_name }}/" --flat - else - jf rt upload "$ARCH/*.rpm" "rpm-plugins/${{ inputs.distrib }}/${{ inputs.stability }}/$ARCH/${{ inputs.module_name }}/" --flat - fi - fi - done - shell: bash diff --git a/.github/docker/packaging/Dockerfile.packaging-plugins-alma8 b/.github/docker/packaging/Dockerfile.packaging-plugins-alma8 index c8f2f43e77..e9fe67b494 100644 --- a/.github/docker/packaging/Dockerfile.packaging-plugins-alma8 +++ b/.github/docker/packaging/Dockerfile.packaging-plugins-alma8 @@ -10,7 +10,7 @@ baseurl=https://repo.goreleaser.com/yum/ enabled=1 gpgcheck=0' | tee /etc/yum.repos.d/goreleaser.repo -dnf -y install gcc git gettext rpm-build dos2unix python3 epel-release nfpm openssl-devel jq zstd selinux-policy-devel +dnf -y install gcc git gettext rpm-build dos2unix python3 epel-release nfpm-2.41.0 openssl-devel jq zstd selinux-policy-devel dnf -y install perl-App-cpanminus perl-JSON cpanm App::FatPacker cpanm File::Copy::Recursive diff --git a/.github/docker/packaging/Dockerfile.packaging-plugins-alma9 b/.github/docker/packaging/Dockerfile.packaging-plugins-alma9 index bb4edb2293..23bd219eb5 100644 --- a/.github/docker/packaging/Dockerfile.packaging-plugins-alma9 +++ b/.github/docker/packaging/Dockerfile.packaging-plugins-alma9 @@ -10,7 +10,7 @@ baseurl=https://repo.goreleaser.com/yum/ enabled=1 gpgcheck=0' | tee /etc/yum.repos.d/goreleaser.repo -dnf -y install gcc git gettext rpm-build dos2unix python3 epel-release nfpm openssl-devel jq zstd selinux-policy-devel +dnf -y install gcc git gettext rpm-build dos2unix python3 epel-release nfpm-2.41.0 openssl-devel jq zstd selinux-policy-devel dnf -y install perl-App-cpanminus perl-JSON cpanm App::FatPacker cpanm File::Copy::Recursive diff --git a/.github/docker/packaging/Dockerfile.packaging-plugins-bookworm b/.github/docker/packaging/Dockerfile.packaging-plugins-bookworm index 5927c55b83..9b7f90b073 100644 --- a/.github/docker/packaging/Dockerfile.packaging-plugins-bookworm +++ b/.github/docker/packaging/Dockerfile.packaging-plugins-bookworm @@ -59,7 +59,7 @@ gem install fpm echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' | tee /etc/apt/sources.list.d/goreleaser.list apt-get update -apt-get install -y nfpm +apt-get install -y nfpm=2.41.0 apt-get clean diff --git a/.github/docker/packaging/Dockerfile.packaging-plugins-bullseye b/.github/docker/packaging/Dockerfile.packaging-plugins-bullseye index 06acc0571b..39881c897f 100644 --- a/.github/docker/packaging/Dockerfile.packaging-plugins-bullseye +++ b/.github/docker/packaging/Dockerfile.packaging-plugins-bullseye @@ -61,7 +61,7 @@ gem install fpm echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' | tee /etc/apt/sources.list.d/goreleaser.list apt-get update -apt-get install -y nfpm +apt-get install -y nfpm=2.41.0 apt-get clean diff --git a/.github/docker/packaging/Dockerfile.packaging-plugins-centos7 b/.github/docker/packaging/Dockerfile.packaging-plugins-centos7 deleted file mode 100644 index 3fd80dd488..0000000000 --- a/.github/docker/packaging/Dockerfile.packaging-plugins-centos7 +++ /dev/null @@ -1,19 +0,0 @@ -ARG REGISTRY_URL=docker.io - -FROM ${REGISTRY_URL}/centos:7 - -RUN bash -e < { + if (headRef === prPath[prPath.length - 1] && ! prPath.includes(baseRef)) { + found = true; + prPath.push(baseRef); + } + }); + } + + return prPath; + + - name: Get stability + id: get_stability + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const getStability = (branchName) => { + switch (true) { + case /(^develop$)|(^dev-\d{2}\.\d{2}\.x$)|(^prepare-release-cloud.*)/.test(branchName): + return 'unstable'; + case /(^release.+)|(^hotfix.+)/.test(branchName): + return 'testing'; + case /(^master$)|(^\d{2}\.\d{2}\.x$)/.test(branchName): + return 'stable'; + default: + return 'canary'; + } + }; + + core.setOutput('stability', getStability('${{ github.head_ref || github.ref_name }}')); + + let isTargetingFeatureBranch = false; + if ("${{ github.event_name }}" === "pull_request") { + let targetStability = 'canary'; + const prPath = ${{ steps.pr_path.outputs.result || '[]' }}; + prPath.shift(); // remove current branch + + if (prPath.length && getStability(prPath[0]) === 'canary') { + isTargetingFeatureBranch = true; + } + + prPath.every((branchName) => { + console.log(`checking stability of ${branchName}`) + targetStability = getStability(branchName); - case "$BRANCHNAME" in - develop) - STABILITY="unstable" - ;; - release* | hotfix*) - STABILITY="testing" - ;; - master) - STABILITY="stable" - ;; - *) - STABILITY="canary" - ;; - esac - - echo "stability=$STABILITY" >> $GITHUB_OUTPUT + if (targetStability !== 'canary') { + return false; + } + return true; + }); + + core.setOutput('target_stability', targetStability); + } + + core.setOutput('is_targeting_feature_branch', isTargetingFeatureBranch); + + - name: Get version + id: get_version + run: | if [[ "${{ inputs.version_file }}" == "" ]]; then VERSION=$(date '+%Y%m%d') elif [[ "${{ inputs.version_file }}" == */*.yaml ]]; then @@ -60,7 +124,62 @@ jobs: VERSION=$(grep VERSION ${{ inputs.version_file }} | cut -d "'" -f 2) fi echo "version=$(echo $VERSION)" >> $GITHUB_OUTPUT + shell: bash + - name: "Get release: 1 for testing / stable, . for others" + id: get_release + run: | RELEASE=$(date '+%H%M%S') - echo "release=$(echo $RELEASE)" >> $GITHUB_OUTPUT + + echo "release=$RELEASE" >> $GITHUB_OUTPUT shell: bash + + - name: "Get release type: hotfix, release or not defined if not a release" + id: get_release_type + run: | + RELEASE_TYPE=$(echo "${{ github.head_ref || github.ref_name }}" | cut -d '-' -f 1) + if [[ "$RELEASE_TYPE" == "hotfix" || "$RELEASE_TYPE" == "release" ]]; then + echo "release_type=$RELEASE_TYPE" >> $GITHUB_OUTPUT + fi + shell: bash + + - name: Display info in job summary + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const outputTable = [ + [{data: 'Name', header: true}, {data: 'Value', header: true}], + ['version', '${{ steps.get_version.outputs.version }}'], + ['release', '${{ steps.get_release.outputs.release }}'], + ['stability', '${{ steps.get_stability.outputs.stability }}'], + ['release_type', '${{ steps.get_release_type.outputs.release_type || 'not defined because this is not a release' }}'], + ['is_targeting_feature_branch', '${{ steps.get_stability.outputs.is_targeting_feature_branch }}'], + ['target_stability', '${{ steps.get_stability.outputs.target_stability || 'not defined because current run is not triggered by pull request event' }}'], + ]; + core.summary + .addHeading(`${context.workflow} environment outputs`) + .addTable(outputTable); + + if ("${{ github.event_name }}" === "pull_request") { + const prPath = ${{ steps.pr_path.outputs.result || '[]' }}; + const mainBranchName = prPath.pop(); + let codeBlock = ` + %%{ init: { 'gitGraph': { 'mainBranchName': '${mainBranchName}', 'showCommitLabel': false } } }%% + gitGraph + commit`; + prPath.reverse().forEach((branchName) => { + codeBlock = `${codeBlock} + branch ${branchName} + checkout ${branchName} + commit`; + }); + + core.summary + .addHeading('Git workflow') + .addCodeBlock( + codeBlock, + "mermaid" + ); + } + + core.summary.write(); diff --git a/.github/workflows/nrpe.yml b/.github/workflows/nrpe.yml index 4d53620364..88e06dacac 100644 --- a/.github/workflows/nrpe.yml +++ b/.github/workflows/nrpe.yml @@ -24,7 +24,7 @@ jobs: package: needs: [get-environment] - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: @@ -114,46 +114,40 @@ jobs: rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }} stability: ${{ needs.get-environment.outputs.stability }} - deliver-rpm: + deliver-packages: needs: [get-environment, package] - if: ${{ contains(fromJson('["stable", "testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: nrpe - distrib: ${{ matrix.distrib }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - - deliver-deb: - needs: [get-environment, package] - if: ${{ contains(fromJson('["stable", "testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + if: | + (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: - distrib: [bullseye, bookworm, jammy] - + 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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/deb-delivery + uses: ./.github/actions/package-delivery with: module_name: nrpe distrib: ${{ matrix.distrib }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }} + cache_key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }} stability: ${{ needs.get-environment.outputs.stability }} + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} diff --git a/.github/workflows/perl-cpan-libraries.yml b/.github/workflows/perl-cpan-libraries.yml index 75ab46d1a4..ac9114f7c4 100644 --- a/.github/workflows/perl-cpan-libraries.yml +++ b/.github/workflows/perl-cpan-libraries.yml @@ -36,13 +36,8 @@ jobs: "ARGV::Struct", "Authen::SASL::SASLprep", "Authen::SCRAM::Client", - "boolean", "BSON", "BSON::XS", - "Carp::Assert", - "Clone", - "Clone::Choose", - "common::sense", "Config::AWS", "Convert::Binary::C", "Convert::EBCDIC", @@ -54,24 +49,12 @@ jobs: "Device::Modbus", "Device::Modbus::RTU::Client", "Device::Modbus::TCP::Client", - "Digest::MD5::File", - "Digest::SHA1", "Email::Send::SMTP::Gmail", - "Exporter::Shiny", - "EV", "FFI::CheckLib", "FFI::Platypus", "File::SearchPath", - "Hash::Merge", - "Hash::Ordered", - "HTTP::Daemon", - "HTTP::Daemon::SSL", "HTTP::ProxyPAC", "JMX::Jmx4Perl", - "JSON::Parse", - "JSON::WebToken", - "LV", - "MIME::Types", "Mojo::IOLoop::Signal", "MongoDB", "MooseX::ClassAttribute", @@ -79,7 +62,6 @@ jobs: "Net::DHCP", "Net::FTPSSL", "Net::HTTPTunnel", - "Net::MQTT::Simple", "Net::NTP", "Net::SMTPS", "Net::SMTP_auth", @@ -87,23 +69,17 @@ jobs: "Net::TFTP", "Paws", "PBKDF2::Tiny", - "Schedule::Cron", "Statistics::Descriptive", "Statistics::Regression", - "Sys::SigAction", "Term::Clui", - "Term::ShellUI", "Unicode::Stringprep", - "URI::Encode", "URI::Template", "URL::Encode", "URL::Encode::XS", "UUID", "UUID::URandom", "WWW::Selenium", - "XML::Filter::BufferText", "XML::LibXML::Simple", - "XML::SAX::Writer", "ZMQ::Constants", "ZMQ::FFI", "ZMQ::LibZMQ4" @@ -128,9 +104,6 @@ jobs: version: "0.022" - name: "Device::Modbus::TCP::Client" version: "0.026" - - name: "Exporter::Shiny" - build_distribs: el8 - rpm_provides: "perl(Exporter::Shiny) perl(Exporter::Tiny)" - name: "FFI::CheckLib" rpm_dependencies: "perl(Env)" - name: "FFI::Platypus" @@ -139,6 +112,10 @@ jobs: no-auto-depends: true - name: "Net::DHCP" rpm_provides: "perl(Net::DHCP::Constants) perl(Net::DHCP::Packet)" + - name: "Net::SMTPS" + build_distribs: el9 + - name: "Statistics::Descriptive" + build_distribs: el9 - name: "Statistics::Regression" version: "0.53" - name: "URL::Encode::XS" @@ -319,28 +296,6 @@ jobs: path: ./*.rpm key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }} - deliver-rpm: - needs: [get-environment, sign-rpm] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: perl-cpan-libraries - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} - package-deb: needs: [get-environment] if: ${{ needs.get-environment.outputs.stability != 'stable' }} @@ -403,6 +358,8 @@ jobs: runner_name: ["self-hosted", "collect-arm64"] - name: "Net::Amazon::Signature::V4" build_distribs: ["bullseye", "jammy"] + - name: "Net::MQTT::Simple" + version: "1.29" - name: "Paws" use_dh_make_perl: "false" deb_dependencies: "libmoose-perl libmoosex-classattribute-perl libjson-maybexs-perl liburl-encode-perl libargv-struct-perl libmoo-perl libtype-tiny-perl libdatastruct-flat-perl libmodule-find-perl libthrowable-perl liburi-template-perl libnet-amazon-signature-v4-perl" @@ -545,44 +502,40 @@ jobs: path: ./*.deb key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }} - deliver-deb: - needs: [get-environment, download-and-cache-deb] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + deliver-packages: + needs: [get-environment, sign-rpm, download-and-cache-deb] + if: | + (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: - distrib: [bullseye, bookworm, jammy] + 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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/deb-delivery + uses: ./.github/actions/package-delivery with: module_name: perl-cpan-libraries distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }} + cache_key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }} stability: ${{ needs.get-environment.outputs.stability }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - strategy: - matrix: - distrib: [el8, el9, bullseye, bookworm] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Promote ${{ matrix.distrib }} to stable - uses: ./.github/actions/promote-to-stable - with: + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: perl-cpan-libraries - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/perl-crypt-argon2.yml b/.github/workflows/perl-crypt-argon2.yml index bf682d8349..78b6b23abf 100644 --- a/.github/workflows/perl-crypt-argon2.yml +++ b/.github/workflows/perl-crypt-argon2.yml @@ -141,88 +141,49 @@ jobs: path: ./*.${{ matrix.package_extension}} retention-days: 1 - deliver-rpm: + deliver-packages: needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - name: Deliver ${{ matrix.distrib }} - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: perl-crypt-argon2-amd64 - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-rpm-perl-crypt-argon2-${{ matrix.distrib }}-amd64-${{ github.head_ref || github.ref_name }} - stability: ${{ needs.get-environment.outputs.stability }} - - deliver-deb: - needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + if: | + (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 - - distrib: bullseye - arch: arm64 - - name: Deliver ${{ matrix.distrib }} ${{ matrix.arch }} + name: deliver ${{ matrix.distrib }} ${{ matrix.arch }} steps: - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/deb-delivery + uses: ./.github/actions/package-delivery with: module_name: perl-crypt-argon2-${{ matrix.arch }} distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-deb-perl-crypt-argon2-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }} + 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 }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - strategy: - matrix: - include: - - distrib: el8 - arch: amd64 - - distrib: el9 - arch: amd64 - - distrib: bullseye - arch: amd64 - - distrib: bookworm - arch: amd64 - - distrib: bullseye - arch: arm64 - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Promote ${{ matrix.distrib }} ${{ matrix.arch }} to stable - uses: ./.github/actions/promote-to-stable - with: + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: perl-crypt-argon2-${{ matrix.arch }} - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/perl-filesys-smbclient.yml b/.github/workflows/perl-filesys-smbclient.yml index b29617db49..626b663f2b 100644 --- a/.github/workflows/perl-filesys-smbclient.yml +++ b/.github/workflows/perl-filesys-smbclient.yml @@ -153,66 +153,40 @@ jobs: path: ./*.deb key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }} - deliver-rpm: - needs: [get-environment, sign-rpm] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: perl-filesys-smbclient - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} - - deliver-deb: - needs: [get-environment, package-deb] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + deliver-packages: + needs: [get-environment, sign-rpm, package-deb] + if: | + (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: - distrib: [bullseye, bookworm, jammy] - + 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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/deb-delivery + uses: ./.github/actions/package-delivery with: module_name: perl-filesys-smbclient distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }} + cache_key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }} stability: ${{ needs.get-environment.outputs.stability }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - strategy: - matrix: - distrib: [el8, el9, bullseye, bookworm] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Promote ${{ matrix.distrib }} to stable - uses: ./.github/actions/promote-to-stable - with: + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: perl-filesys-smbclient - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/perl-json-path.yml b/.github/workflows/perl-json-path.yml index cbe8e5d178..a53855a48c 100644 --- a/.github/workflows/perl-json-path.yml +++ b/.github/workflows/perl-json-path.yml @@ -126,70 +126,40 @@ jobs: path: ./*.${{ matrix.package_extension}} retention-days: 1 - deliver-rpm: + deliver-packages: needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - name: Deliver ${{ matrix.distrib }} - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: perl-json-path - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-rpm-perl-json-path-${{ matrix.distrib }}-${{ github.head_ref || github.ref_name }} - stability: ${{ needs.get-environment.outputs.stability }} - - deliver-deb: - needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + if: | + (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: - distrib: [bullseye, bookworm, jammy] - - name: Deliver ${{ matrix.distrib }} + 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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/deb-delivery + uses: ./.github/actions/package-delivery with: module_name: perl-json-path distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-deb-perl-json-path-${{ matrix.distrib }}-${{ github.head_ref || github.ref_name }} + 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 }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - strategy: - matrix: - distrib: [el8, el9, bullseye, bookworm] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Promote ${{ matrix.distrib }} to stable - uses: ./.github/actions/promote-to-stable - with: + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: perl-json-path - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/perl-keepass-reader.yml b/.github/workflows/perl-keepass-reader.yml index c219f4bdcd..9a5016b795 100644 --- a/.github/workflows/perl-keepass-reader.yml +++ b/.github/workflows/perl-keepass-reader.yml @@ -117,71 +117,40 @@ jobs: rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }} stability: ${{ needs.get-environment.outputs.stability }} - - deliver-rpm: + deliver-packages: needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - name: Deliver ${{ matrix.distrib }} - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: ${{ env.module_name }} - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.run_id }}-rpm-${{ env.module_name }}-${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} - - deliver-deb: - needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + if: | + (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: - distrib: [bullseye, bookworm, jammy] - - name: Deliver ${{ matrix.distrib }} + 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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/deb-delivery + uses: ./.github/actions/package-delivery with: module_name: ${{ env.module_name }} distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.run_id }}-deb-${{ env.module_name }}-${{ matrix.distrib }} + cache_key: cache-${{ github.run_id }}-${{ matrix.package_extension }}-${{ env.module_name }}-${{ matrix.distrib }} stability: ${{ needs.get-environment.outputs.stability }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - strategy: - matrix: - distrib: [bullseye, bookworm] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Promote ${{ matrix.distrib }} to stable - uses: ./.github/actions/promote-to-stable - with: + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: ${{ env.module_name }} - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/perl-libssh-session.yml b/.github/workflows/perl-libssh-session.yml index d894f4aac6..d56ac394df 100644 --- a/.github/workflows/perl-libssh-session.yml +++ b/.github/workflows/perl-libssh-session.yml @@ -139,88 +139,49 @@ jobs: path: ./*.${{ matrix.package_extension}} retention-days: 1 - deliver-rpm: + deliver-packages: needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - name: Deliver ${{ matrix.distrib }} - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: perl-libssh-session-amd64 - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-rpm-perl-libssh-session-${{ matrix.distrib }}-amd64-${{ github.head_ref || github.ref_name }} - stability: ${{ needs.get-environment.outputs.stability }} - - deliver-deb: - needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + if: | + (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 }} - + name: deliver ${{ matrix.distrib }} ${{ matrix.arch }} steps: - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/deb-delivery + uses: ./.github/actions/package-delivery with: module_name: perl-libssh-session-${{ matrix.arch }} distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-deb-perl-libssh-session-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }} + 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 }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - strategy: - matrix: - include: - - distrib: el8 - arch: amd64 - - distrib: el9 - arch: amd64 - - distrib: bullseye - arch: amd64 - - distrib: bookworm - arch: amd64 - - distrib: bullseye - arch: arm64 - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Promote ${{ matrix.distrib }} ${{ matrix.arch }} to stable - uses: ./.github/actions/promote-to-stable - with: + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: perl-libssh-session-${{ matrix.arch }} - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/perl-net-curl.yml b/.github/workflows/perl-net-curl.yml index 55d7365b6b..64b85d5e34 100644 --- a/.github/workflows/perl-net-curl.yml +++ b/.github/workflows/perl-net-curl.yml @@ -139,88 +139,49 @@ jobs: path: ./*.${{ matrix.package_extension }} retention-days: 1 - deliver-rpm: + deliver-packages: needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - name: Deliver ${{ matrix.distrib }} - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: perl-net-curl-amd64 - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-rpm-perl-net-curl-${{ matrix.distrib }}-amd64-${{ github.head_ref || github.ref_name }} - stability: ${{ needs.get-environment.outputs.stability }} - - deliver-deb: - needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + if: | + (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 - - distrib: bullseye - arch: arm64 - - name: Deliver ${{ matrix.distrib }} ${{ matrix.arch }} + name: deliver ${{ matrix.distrib }} steps: - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/deb-delivery + uses: ./.github/actions/package-delivery with: module_name: perl-net-curl-${{ matrix.arch }} distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-deb-perl-net-curl-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }} + 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 }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - strategy: - matrix: - include: - - distrib: el8 - arch: amd64 - - distrib: el9 - arch: amd64 - - distrib: bullseye - arch: amd64 - - distrib: bookworm - arch: amd64 - - distrib: bullseye - arch: arm64 - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Promote ${{ matrix.distrib }} ${{ matrix.arch }} to stable - uses: ./.github/actions/promote-to-stable - with: + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: perl-net-curl-${{ matrix.arch }} - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/perl-openwsman.yml b/.github/workflows/perl-openwsman.yml index 2367a2e774..c578ce7681 100644 --- a/.github/workflows/perl-openwsman.yml +++ b/.github/workflows/perl-openwsman.yml @@ -206,132 +206,54 @@ jobs: rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }} stability: ${{ needs.get-environment.outputs.stability }} - deliver-rpm: - needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - name: Deliver ${{ matrix.distrib }} - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery libwsman - uses: ./.github/actions/rpm-delivery + - uses: actions/cache/save@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: - module_name: libwsman-amd64 - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-rpm-libwsman-${{ matrix.distrib }}-amd64-${{ github.head_ref || github.ref_name }} - stability: ${{ needs.get-environment.outputs.stability }} - - - name: Delivery perl-openwsman - uses: ./.github/actions/rpm-delivery - with: - module_name: perl-openwsman-amd64 - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-rpm-perl-openwsman-${{ matrix.distrib }}-amd64-${{ github.head_ref || github.ref_name }} - stability: ${{ needs.get-environment.outputs.stability }} + path: ./*.${{ matrix.package_extension }} + key: cache-${{ github.sha }}-${{ matrix.package_extension }}-wsman-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }} - deliver-deb: + deliver-packages: needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - include: - - distrib: bullseye - arch: amd64 - - distrib: bookworm - arch: amd64 - - distrib: jammy - arch: amd64 - - distrib: bullseye - arch: arm64 - - name: Deliver ${{ matrix.distrib }} ${{ matrix.arch }} - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery sblim-sfcc - uses: ./.github/actions/deb-delivery - with: - module_name: sblim-sfcc-${{ matrix.arch }} - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-deb-sblim-sfcc-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }} - stability: ${{ needs.get-environment.outputs.stability }} - - - name: Delivery libwsman - uses: ./.github/actions/deb-delivery - with: - module_name: libwsman-${{ matrix.arch }} - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-deb-libwsman-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }} - stability: ${{ needs.get-environment.outputs.stability }} - - - name: Delivery perl-openwsman - uses: ./.github/actions/deb-delivery - with: - module_name: perl-openwsman-${{ matrix.arch }} - distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: cache-${{ github.sha }}-deb-perl-openwsman-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }} - stability: ${{ needs.get-environment.outputs.stability }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] + if: | + (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 - arch: amd64 - - distrib: bookworm + 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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - - name: Promote sblim-sfcc ${{ matrix.distrib }} ${{ matrix.arch }} to stable - if: ${{ contains(fromJSON('["bullseye", "bookworm", "jammy"]'), matrix.distrib) }} - uses: ./.github/actions/promote-to-stable + - name: Delivery + uses: ./.github/actions/package-delivery with: - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: sblim-sfcc-${{ matrix.arch }} - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} - - - name: Promote libwsman ${{ matrix.distrib }} ${{ matrix.arch }} to stable - uses: ./.github/actions/promote-to-stable - with: - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: libwsman-${{ matrix.arch }} + module_name: wsman-${{ matrix.arch }} distrib: ${{ matrix.distrib }} + arch: ${{ matrix.arch }} + cache_key: cache-${{ github.sha }}-${{ matrix.package_extension }}-wsman-${{ matrix.distrib }}-${{ matrix.arch }}-${{ github.head_ref || github.ref_name }} stability: ${{ needs.get-environment.outputs.stability }} - - - name: Promote perl-openwsman ${{ matrix.distrib }} ${{ matrix.arch }} to stable - uses: ./.github/actions/promote-to-stable - with: + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: perl-openwsman-${{ matrix.arch }} - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/perl-vmware-vsphere.yml b/.github/workflows/perl-vmware-vsphere.yml index 65140448c3..65f83d0e5b 100644 --- a/.github/workflows/perl-vmware-vsphere.yml +++ b/.github/workflows/perl-vmware-vsphere.yml @@ -145,84 +145,49 @@ jobs: rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }} stability: ${{ needs.get-environment.outputs.stability }} - deliver-rpm: + deliver-packages: needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - - strategy: - matrix: - distrib: [el8, el9] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: perl-vmware-vsphere-amd64 - distrib: ${{ matrix.distrib }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }}-amd64 - stability: ${{ needs.get-environment.outputs.stability }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - - deliver-deb: - needs: [get-environment, package] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + if: | + (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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/deb-delivery + uses: ./.github/actions/package-delivery with: module_name: perl-vmware-vsphere-${{ matrix.arch }} distrib: ${{ matrix.distrib }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }}-${{ matrix.arch }} + arch: ${{ matrix.arch }} + cache_key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }}-${{ matrix.arch }} stability: ${{ needs.get-environment.outputs.stability }} + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - strategy: - matrix: - include: - - distrib: el8 - arch: amd64 - - distrib: el9 - arch: amd64 - - distrib: bullseye - arch: amd64 - - distrib: bookworm - arch: amd64 - - distrib: bullseye - arch: arm64 - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Promote ${{ matrix.distrib }} ${{ matrix.arch }} to stable - uses: ./.github/actions/promote-to-stable - with: - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: perl-vmware-vsphere-${{ matrix.arch }} - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/plink.yml b/.github/workflows/plink.yml index 4eba681e39..80ad2d9d23 100644 --- a/.github/workflows/plink.yml +++ b/.github/workflows/plink.yml @@ -108,44 +108,34 @@ jobs: path: ./*.rpm retention-days: 1 - deliver-rpm: + deliver-packages: needs: [get-environment, sign-rpm] - if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + if: | + (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: - distrib: [el8, el9] + include: + - distrib: el8 + package_extension: rpm + - distrib: el9 + package_extension: rpm + name: deliver ${{ matrix.distrib }} steps: - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/rpm-delivery + uses: ./.github/actions/package-delivery with: module_name: plink distrib: ${{ matrix.distrib }} - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }} + cache_key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }} stability: ${{ needs.get-environment.outputs.stability }} - - promote: - needs: [get-environment] - if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - strategy: - matrix: - distrib: [el8, el9] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Promote ${{ matrix.distrib }} to stable - uses: ./.github/actions/promote-to-stable - with: + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - module: plink - distrib: ${{ matrix.distrib }} - stability: ${{ needs.get-environment.outputs.stability }} diff --git a/.github/workflows/plugin-delivery.yml b/.github/workflows/plugin-delivery.yml deleted file mode 100644 index 9f80aaaf4f..0000000000 --- a/.github/workflows/plugin-delivery.yml +++ /dev/null @@ -1,160 +0,0 @@ -on: - workflow_call: - inputs: - version: - description: The package version - type: string - required: true - release: - description: The package release - type: string - required: true - stability: - description: The package stability (stable, testing, unstable) - type: string - required: true - secrets: - artifactory_token: - description: "The artifactory token" - required: true - token_download_centreon_com: - description: "The token to call download.centreon.com api" - required: true - -jobs: - deliver-sources: - runs-on: [self-hosted, common] - if: ${{ contains(fromJson('["stable"]'), inputs.stability) && github.event_name != 'workflow_dispatch' }} - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - with: - path: ./build/ - key: fatpacked-plugins-${{ github.sha }}-${{ github.run_id }} - fail-on-cache-miss: true - - - name: Deliver sources - uses: ./.github/actions/release-sources - with: - bucket_directory: centreon-plugins - module_directory: build - module_name: centreon-plugins - version: ${{ inputs.version }} - release: ${{ inputs.release }} - token_download_centreon_com: ${{ secrets.token_download_centreon_com }} - - deliver-rpm: - if: ${{ github.event_name != 'workflow_dispatch' }} - runs-on: [self-hosted, common] - strategy: - fail-fast: false - matrix: - distrib: [el7, el8, el9] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery - with: - module_name: plugins - distrib: ${{ matrix.distrib }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }} - stability: ${{ inputs.stability }} - artifactory_token: ${{ secrets.artifactory_token }} - - deliver-rpm-legacy: - if: ${{ inputs.stability == 'stable' && github.event_name != 'workflow_dispatch' }} - runs-on: [self-hosted, common] - strategy: - fail-fast: false - matrix: - distrib: [el7, el8] - major_version: ["21.10", "22.04", "22.10"] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/rpm-delivery-legacy - with: - module_name: plugins - major_version: ${{ matrix.major_version }} - distrib: ${{ matrix.distrib }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }} - stability: ${{ inputs.stability }} - artifactory_token: ${{ secrets.artifactory_token }} - - deliver-deb: - if: ${{ github.event_name != 'workflow_dispatch' }} - runs-on: [self-hosted, common] - strategy: - fail-fast: false - matrix: - distrib: [bullseye, bookworm, jammy] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/deb-delivery - with: - module_name: plugins - distrib: ${{ matrix.distrib }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }} - stability: ${{ inputs.stability }} - artifactory_token: ${{ secrets.artifactory_token }} - - deliver-deb-legacy: - if: ${{ inputs.stability == 'stable' && github.event_name != 'workflow_dispatch' }} - runs-on: [self-hosted, common] - strategy: - fail-fast: false - matrix: - distrib: [bullseye] - major_version: ["22.04", "22.10"] - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Delivery - uses: ./.github/actions/deb-delivery-legacy - with: - module_name: plugins - distrib: ${{ matrix.distrib }} - major_version: ${{ matrix.major_version }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }} - stability: ${{ inputs.stability }} - artifactory_token: ${{ secrets.artifactory_token }} - - release-tag: - if: ${{ inputs.stability == 'stable' && github.event_name == 'push' }} - runs-on: ubuntu-22.04 - - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Push git release tag - run: | - RELEASE=plugins-$(date '+%Y%m%d') - - EXISTING_TAG=$(git tag --list "$RELEASE" | head -n 1) - - git config --global user.email "release@centreon.com" - git config --global user.name "Centreon" - - if [ -z "$EXISTING_TAG" ]; then - git tag -a "$RELEASE" -m "release $RELEASE" - git push --follow-tags - else - echo "::warning::Release tag $RELEASE already exists" - fi - shell: bash diff --git a/.github/workflows/plugins-selinux.yml b/.github/workflows/plugins-selinux.yml index 130e23ec72..355958558c 100644 --- a/.github/workflows/plugins-selinux.yml +++ b/.github/workflows/plugins-selinux.yml @@ -69,24 +69,34 @@ jobs: rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }} stability: ${{ needs.get-environment.outputs.stability }} - deliver-rpm: + deliver-packages: needs: [get-environment, package] - if: ${{ contains(fromJson('["stable", "testing", "unstable"]'), needs.get-environment.outputs.stability) }} - runs-on: [self-hosted, common] - + if: | + (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: - distrib: [el8, el9] + include: + - distrib: el8 + package_extension: rpm + - distrib: el9 + package_extension: rpm + name: deliver ${{ matrix.distrib }} steps: - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery - uses: ./.github/actions/rpm-delivery + uses: ./.github/actions/package-delivery with: module_name: plugins-selinux distrib: ${{ matrix.distrib }} - cache_key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }} + cache_key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }} stability: ${{ needs.get-environment.outputs.stability }} + release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} diff --git a/.github/workflows/plugins.yml b/.github/workflows/plugins.yml index e765a4722e..0af936c663 100644 --- a/.github/workflows/plugins.yml +++ b/.github/workflows/plugins.yml @@ -158,13 +158,13 @@ jobs: COMMIT=$(git log -1 HEAD --pretty=format:%h) perl .github/scripts/plugins-source.container.pl "${{ needs.get-plugins.outputs.plugins }}" "${{ needs.get-environment.outputs.version }} ($COMMIT)" - - uses: actions/cache/save@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + - uses: actions/cache/save@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: ./build/ key: fatpacked-plugins-${{ github.sha }}-${{ github.run_id }} package: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: [get-environment, get-plugins, fatpacker] strategy: @@ -200,24 +200,9 @@ jobs: steps: - name: Checkout sources - if: ${{ matrix.distrib == 'el7' }} - # el7 is not compatible with checkout v4 which uses node20 - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - - - name: Checkout sources - if: ${{ matrix.distrib != 'el7' }} uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - if: ${{ matrix.distrib == 'el7' }} - # el7 is not compatible with checkout v4 which uses node20 - uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - with: - path: ./build/ - key: fatpacked-plugins-${{ github.sha }}-${{ github.run_id }} - fail-on-cache-miss: true - - - if: ${{ matrix.distrib != 'el7' }} - uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + - uses: actions/cache/restore@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: ./build/ key: fatpacked-plugins-${{ github.sha }}-${{ github.run_id }} @@ -304,7 +289,7 @@ jobs: matrix: image: [testing-plugins-alma8, testing-plugins-alma9, testing-plugins-jammy, testing-plugins-bullseye, testing-plugins-bookworm] include: - - runner_name: ubuntu-22.04 + - runner_name: ubuntu-24.04 - package_extension: rpm image: testing-plugins-alma8 distrib: el8 @@ -350,14 +335,94 @@ jobs: path: /var/log/robot-plugins-installation-tests.log retention-days: 1 - deliver: - needs: [get-environment, package, test-plugins] - if: ${{ contains(fromJson('["stable", "testing", "unstable"]'), needs.get-environment.outputs.stability) }} - uses: ./.github/workflows/plugin-delivery.yml - with: - version: ${{ needs.get-environment.outputs.version }} - release: ${{ needs.get-environment.outputs.release }} - stability: ${{ needs.get-environment.outputs.stability }} - secrets: - artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} - token_download_centreon_com: ${{ secrets.TOKEN_DOWNLOAD_CENTREON_COM }} + deliver-packages: + needs: [get-environment, get-plugins, test-plugins] + if: | + needs.get-plugins.outputs.plugins != '' && + (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: el7 + package_extension: rpm + - 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: plugins + distrib: ${{ matrix.distrib }} + cache_key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }} + stability: ${{ needs.get-environment.outputs.stability }} + release_type: ${{ needs.get-environment.outputs.release_type }} + artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} + + deliver-sources: + needs: [get-environment] + if: ${{ needs.get-environment.outputs.stability == 'stable' && github.event_name == 'push' }} + runs-on: [self-hosted, common] + + steps: + - name: Checkout sources + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 + + - uses: actions/cache/restore@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 + with: + path: ./build/ + key: fatpacked-plugins-${{ github.sha }}-${{ github.run_id }} + fail-on-cache-miss: true + + - name: Deliver sources + uses: ./.github/actions/release-sources + with: + bucket_directory: centreon-plugins + module_directory: build + module_name: centreon-plugins + version: ${{ needs.get-environment.outputs.version }} + release: ${{ needs.get-environment.outputs.release }} + token_download_centreon_com: ${{ secrets.TOKEN_DOWNLOAD_CENTREON_COM }} + + release-tag: + needs: [get-environment] + if: ${{ needs.get-environment.outputs.stability == 'stable' && github.event_name == 'push' }} + runs-on: ubuntu-24.04 + + steps: + - name: Checkout sources + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 + + - name: Push git release tag + run: | + RELEASE=plugins-$(date '+%Y%m%d') + + EXISTING_TAG=$(git tag --list "$RELEASE" | head -n 1) + + git config --global user.email "release@centreon.com" + git config --global user.name "Centreon" + + if [ -z "$EXISTING_TAG" ]; then + git tag -a "$RELEASE" -m "release $RELEASE" + git push --follow-tags + else + echo "::warning::Release tag $RELEASE already exists" + fi + shell: bash diff --git a/connectors/vmware/changelog b/connectors/vmware/changelog index f77e4006f8..d571bb1d9c 100644 --- a/connectors/vmware/changelog +++ b/connectors/vmware/changelog @@ -1,3 +1,11 @@ +2024-12-05 Olivier Mercier - 3.4.0 + * Enhancement: systemd service now takes its options from + /etc/(default|sysconfig)/centreon_vmware. + * Enhancement: the existing .pm config file is converted into a .json file + during upgrade. + * Breaking: the default config file is now the JSON one. + * Fix: added the 'perl(Text::Template)' missing dependency for AlmaLinux. + 2024-10-18 Olivier Mercier - 3.3.2 * Fix: regression of case sensitiveness for container names fixed * Enhancement: log messages related to the vault have been downgraded from error to info level or explained as safe to ignore if not using the vault diff --git a/connectors/vmware/packaging/centreon-plugin-virtualization-vmware-daemon.yaml b/connectors/vmware/packaging/centreon-plugin-virtualization-vmware-daemon.yaml index 75f9d4bca1..3596690b67 100644 --- a/connectors/vmware/packaging/centreon-plugin-virtualization-vmware-daemon.yaml +++ b/connectors/vmware/packaging/centreon-plugin-virtualization-vmware-daemon.yaml @@ -69,18 +69,16 @@ contents: - src: "redhat/centreon_vmware-sysconfig" dst: "/etc/sysconfig/centreon_vmware" + type: config|noreplace packager: rpm - src: "debian/centreon_vmware-default" dst: "/etc/default/centreon_vmware" + type: config|noreplace packager: deb - - src: "config/centreon_vmware-conf.pm" - dst: "/etc/centreon/centreon_vmware.pm" + - src: "config/centreon_vmware-conf.json" + dst: "/etc/centreon/centreon_vmware.json" type: config|noreplace - packager: rpm - - src: "config/centreon_vmware-conf.pm" - dst: "/etc/centreon/centreon_vmware.pm.new" - packager: deb scripts: postinstall: ./scripts/postinstall.sh @@ -92,6 +90,7 @@ overrides: - perl(IO::Socket::INET6) - perl(JSON::XS) - perl(LWP::Protocol::https) + - perl(Text::Template) - perl(ZMQ::Constants) - perl(ZMQ::LibZMQ4) - perl-Net-Curl diff --git a/connectors/vmware/packaging/debian/centreon_vmware-default b/connectors/vmware/packaging/debian/centreon_vmware-default index e670532994..d94dfeb4e5 100644 --- a/connectors/vmware/packaging/debian/centreon_vmware-default +++ b/connectors/vmware/packaging/debian/centreon_vmware-default @@ -1,2 +1,2 @@ # centreon_vmware command line options -OPTIONS="--logfile=/var/log/centreon_vmware.log --severity=error" \ No newline at end of file +OPTIONS="--config-extra=/etc/centreon/centreon_vmware.json --logfile=/var/log/centreon/centreon_vmware.log --severity=info" diff --git a/connectors/vmware/packaging/debian/centreon_vmware-systemd b/connectors/vmware/packaging/debian/centreon_vmware-systemd index 519ed51de5..d1b6557855 100644 --- a/connectors/vmware/packaging/debian/centreon_vmware-systemd +++ b/connectors/vmware/packaging/debian/centreon_vmware-systemd @@ -19,7 +19,8 @@ Description=Centreon VMWare [Service] -ExecStart=/usr/bin/perl /usr/bin/centreon_vmware.pl --logfile=/var/log/centreon/centreon_vmware.log --severity=error +EnvironmentFile=-/etc/default/centreon_vmware +ExecStart=/usr/bin/perl /usr/bin/centreon_vmware.pl $OPTIONS Type=simple User=centreon diff --git a/connectors/vmware/packaging/redhat/centreon_vmware-sysconfig b/connectors/vmware/packaging/redhat/centreon_vmware-sysconfig index 0d8a63ddb3..d94dfeb4e5 100644 --- a/connectors/vmware/packaging/redhat/centreon_vmware-sysconfig +++ b/connectors/vmware/packaging/redhat/centreon_vmware-sysconfig @@ -1,2 +1,2 @@ # centreon_vmware command line options -OPTIONS="--logfile=/var/log/centreon/centreon_vmware.log --severity=error" \ No newline at end of file +OPTIONS="--config-extra=/etc/centreon/centreon_vmware.json --logfile=/var/log/centreon/centreon_vmware.log --severity=info" diff --git a/connectors/vmware/packaging/redhat/centreon_vmware-systemd b/connectors/vmware/packaging/redhat/centreon_vmware-systemd index 519ed51de5..ca22a3c54d 100644 --- a/connectors/vmware/packaging/redhat/centreon_vmware-systemd +++ b/connectors/vmware/packaging/redhat/centreon_vmware-systemd @@ -19,7 +19,8 @@ Description=Centreon VMWare [Service] -ExecStart=/usr/bin/perl /usr/bin/centreon_vmware.pl --logfile=/var/log/centreon/centreon_vmware.log --severity=error +EnvironmentFile=-/etc/sysconfig/centreon_vmware +ExecStart=/usr/bin/perl /usr/bin/centreon_vmware.pl $OPTIONS Type=simple User=centreon diff --git a/connectors/vmware/packaging/scripts/postinstall.sh b/connectors/vmware/packaging/scripts/postinstall.sh index 33b8a2557c..afd22bdd15 100644 --- a/connectors/vmware/packaging/scripts/postinstall.sh +++ b/connectors/vmware/packaging/scripts/postinstall.sh @@ -1,7 +1,49 @@ -#!/bin/sh +#!/bin/bash -if [ "$1" = "configure" ]; then # deb - if [ ! -f "/etc/centreon/centreon_vmware.pm" ]; then - mv /etc/centreon/centreon_vmware.pm.new /etc/centreon/centreon_vmware.pm - fi +json_config_file_path='/etc/centreon/centreon_vmware.json' +perl_config_file_path='/etc/centreon/centreon_vmware.pm' + +function migrateConfigFromPmToJson() { + # If the legacy config file exists, we migrate it into a JSON config file + if [[ -f "$perl_config_file_path" ]] ; then + /usr/bin/centreon_vmware_convert_config_file "$perl_config_file_path" > "$json_config_file_path" + mv "$perl_config_file_path" "${perl_config_file_path}.deprecated" + fi + chown centreon: "$json_config_file_path" + chmod 640 "$json_config_file_path" +} + +function applyToSystemD() { + systemctl daemon-reload + systemctl restart centreon_vmware.service +} + +action="$1" +version="$2" + +if [[ "$1" == "configure" ]]; then # deb + if [[ -z "$version" ]]; then + # Alpine linux does not pass args, and deb passes $1=configure + action="install" + elif [[ -n "$version" ]]; then + # deb passes $1=configure $2= + action="upgrade" + fi fi + + +case "$action" in + "1" | "install") + migrateConfigFromPmToJson + applyToSystemD + ;; + "2" | "upgrade") + migrateConfigFromPmToJson + applyToSystemD + ;; + *) + # $1 == version being installed + applyToSystemD + ;; +esac + diff --git a/connectors/vmware/src/centreon/script/centreon_vmware.pm b/connectors/vmware/src/centreon/script/centreon_vmware.pm index 90b73c3f90..4aa2fa6f18 100644 --- a/connectors/vmware/src/centreon/script/centreon_vmware.pm +++ b/connectors/vmware/src/centreon/script/centreon_vmware.pm @@ -54,7 +54,7 @@ BEGIN { use base qw(centreon::vmware::script); -my $VERSION = '3.3.2'; +my $VERSION = '3.4.0'; my %handlers = (TERM => {}, HUP => {}, CHLD => {}); my @load_modules = ( diff --git a/connectors/vmware/src/centreon/script/centreon_vmware_convert_config_file b/connectors/vmware/src/centreon/script/centreon_vmware_convert_config_file index 1c9a599167..9cbadc012e 100644 --- a/connectors/vmware/src/centreon/script/centreon_vmware_convert_config_file +++ b/connectors/vmware/src/centreon/script/centreon_vmware_convert_config_file @@ -19,7 +19,7 @@ use strict; use warnings FATAL => 'all'; -use JSON::XS; +use JSON; use Data::Dumper; die "Usage: centreon_vmware_convert_config_file /etc/centreon/centreon_vmware.pm > /etc/centreon/centreon_vmware.json" if (scalar(@ARGV) < 1); @@ -34,7 +34,6 @@ my $new_config_structure = { vsphere_server => [] }; - for my $config_entry_key (keys %centreon_vmware_config){ if ($config_entry_key eq 'vsphere_server') { for my $server_config_entry_key (keys %{$centreon_vmware_config{vsphere_server}}) { @@ -45,11 +44,11 @@ for my $config_entry_key (keys %centreon_vmware_config){ } else { $new_config_structure->{$config_entry_key} = $centreon_vmware_config{$config_entry_key}; } - - } -my $new_json_config = encode_json($new_config_structure) or die "Unable to convert this object to JSON:\n" . Dumper($new_config_structure); +my $new_json_config = JSON->new->utf8(1)->pretty(1)->encode($new_config_structure) or die "Unable to convert this object to JSON:\n" . Dumper($new_config_structure); + print($new_json_config); exit(0); + diff --git a/connectors/vmware/src/centreon/script/centreonvault.pm b/connectors/vmware/src/centreon/script/centreonvault.pm index 47164af79e..dc255cc1c2 100644 --- a/connectors/vmware/src/centreon/script/centreonvault.pm +++ b/connectors/vmware/src/centreon/script/centreonvault.pm @@ -335,7 +335,7 @@ Centreon Vault password manager =head1 SYNOPSIS -Allows to retrieve secrets (usually username and password) from a Hashicorp vault compatible api given a config file as constructor. +Allows to retrieve secrets (usually username and password) from a Hashicorp vault compatible API. use centreon::vmware::logger; use centreon::script::centreonvault; @@ -364,8 +364,8 @@ The expected file format for Centreon Vault is: { "name": "hashicorp_vault", - "url": "vault-server.mydomain.com", - "salt": "", + "url": "vault-server.my-domain.com", + "salt": "", "port": 443, "root_path": "vmware_daemon", "role_id": ")", diff --git a/connectors/vmware/src/centreon/vmware/common.pm b/connectors/vmware/src/centreon/vmware/common.pm index bf5aac9c54..a37bfe5ab1 100644 --- a/connectors/vmware/src/centreon/vmware/common.pm +++ b/connectors/vmware/src/centreon/vmware/common.pm @@ -45,7 +45,7 @@ sub init_response { my (%options) = @_; $manager_response->{code} = 0; - $manager_response->{vmware_connector_version} = '3.3.2'; + $manager_response->{vmware_connector_version} = '3.4.0'; $manager_response->{short_message} = 'OK'; $manager_response->{extra_message} = ''; $manager_response->{identity} = $options{identity} if (defined($options{identity})); diff --git a/packaging/centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp/deb.json b/packaging/centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp/deb.json new file mode 100644 index 0000000000..5a9cbc0d76 --- /dev/null +++ b/packaging/centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp/deb.json @@ -0,0 +1,7 @@ +{ + "dependencies": [ + "libdigest-md5-perl", + "libsnmp-perl", + "libdatetime-perl" + ] +} diff --git a/packaging/centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp/pkg.json b/packaging/centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp/pkg.json new file mode 100644 index 0000000000..c82815f500 --- /dev/null +++ b/packaging/centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp/pkg.json @@ -0,0 +1,10 @@ +{ + "pkg_name": "centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp", + "pkg_summary": "Centreon Plugin to monitor Sky High Web Gateway application using SNMP", + "plugin_name": "centreon_skyhigh_webgateway_snmp.pl", + "files": [ + "centreon/plugins/script_snmp.pm", + "centreon/plugins/snmp.pm", + "apps/antivirus/skyhigh/webgateway/snmp/" + ] +} diff --git a/packaging/centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp/rpm.json b/packaging/centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp/rpm.json new file mode 100644 index 0000000000..25a7787aa3 --- /dev/null +++ b/packaging/centreon-plugin-Applications-Antivirus-Skyhigh-Webgateway-Snmp/rpm.json @@ -0,0 +1,7 @@ +{ + "dependencies": [ + "perl(SNMP)", + "perl(Digest::MD5)", + "perl(DateTime)" + ] +} diff --git a/packaging/centreon-plugin-Applications-Jmeter/deb.json b/packaging/centreon-plugin-Applications-Jmeter/deb.json new file mode 100644 index 0000000000..63fd185e3e --- /dev/null +++ b/packaging/centreon-plugin-Applications-Jmeter/deb.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "libxml-xpath-perl" + ] +} \ No newline at end of file diff --git a/packaging/centreon-plugin-Applications-Jmeter/pkg.json b/packaging/centreon-plugin-Applications-Jmeter/pkg.json new file mode 100644 index 0000000000..cb84de645d --- /dev/null +++ b/packaging/centreon-plugin-Applications-Jmeter/pkg.json @@ -0,0 +1,12 @@ +{ + "pkg_name": "centreon-plugin-Applications-Jmeter", + "pkg_summary": "Centreon Plugin Jmeter", + "plugin_name": "centreon_jmeter.pl", + "files": [ + "centreon/plugins/script_custom.pm", + "centreon/plugins/script_custom/cli.pm", + "centreon/plugins/backend/ssh/", + "centreon/plugins/ssh.pm", + "apps/jmeter/" + ] +} \ No newline at end of file diff --git a/packaging/centreon-plugin-Applications-Jmeter/rpm.json b/packaging/centreon-plugin-Applications-Jmeter/rpm.json new file mode 100644 index 0000000000..6e9a5f4343 --- /dev/null +++ b/packaging/centreon-plugin-Applications-Jmeter/rpm.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "perl(XML::XPath)" + ] +} \ No newline at end of file diff --git a/packaging/centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp/deb.json b/packaging/centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp/deb.json new file mode 100644 index 0000000000..663aaacebf --- /dev/null +++ b/packaging/centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp/deb.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "libsnmp-perl" + ] +} \ No newline at end of file diff --git a/packaging/centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp/pkg.json b/packaging/centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp/pkg.json new file mode 100644 index 0000000000..616908ac45 --- /dev/null +++ b/packaging/centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp/pkg.json @@ -0,0 +1,10 @@ +{ + "pkg_name": "centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp", + "pkg_summary": "Centreon Plugin to monitor Appear TV using SNMP", + "plugin_name": "centreon_video_appeartv_snmp.pl", + "files": [ + "centreon/plugins/script_snmp.pm", + "centreon/plugins/snmp.pm", + "hardware/devices/video/appeartv/snmp/" + ] +} diff --git a/packaging/centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp/rpm.json b/packaging/centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp/rpm.json new file mode 100644 index 0000000000..418a331fce --- /dev/null +++ b/packaging/centreon-plugin-Hardware-Devices-Video-Appeartv-Snmp/rpm.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "perl(SNMP)" + ] +} \ No newline at end of file diff --git a/packaging/centreon-plugin-Notification-Slack/deb.json b/packaging/centreon-plugin-Notification-Slack/deb.json new file mode 100644 index 0000000000..540c269f3b --- /dev/null +++ b/packaging/centreon-plugin-Notification-Slack/deb.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "libjson-perl" + ] +} diff --git a/packaging/centreon-plugin-Notification-Slack/pkg.json b/packaging/centreon-plugin-Notification-Slack/pkg.json new file mode 100644 index 0000000000..224594f6cb --- /dev/null +++ b/packaging/centreon-plugin-Notification-Slack/pkg.json @@ -0,0 +1,9 @@ +{ + "pkg_name": "centreon-plugin-Notification-Slack", + "pkg_summary": "Centreon Plugin to send notifications by Slack", + "plugin_name": "centreon_notification_slack.pl", + "files": [ + "centreon/plugins/script_simple.pm", + "notification/slack" + ] +} diff --git a/packaging/centreon-plugin-Notification-Slack/rpm.json b/packaging/centreon-plugin-Notification-Slack/rpm.json new file mode 100644 index 0000000000..1869614605 --- /dev/null +++ b/packaging/centreon-plugin-Notification-Slack/rpm.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "perl(JSON)" + ] +} diff --git a/packaging/centreon-plugin-Virtualization-Vmware8-Esx-Restapi/deb.json b/packaging/centreon-plugin-Virtualization-Vmware8-Esx-Restapi/deb.json new file mode 100644 index 0000000000..540c269f3b --- /dev/null +++ b/packaging/centreon-plugin-Virtualization-Vmware8-Esx-Restapi/deb.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "libjson-perl" + ] +} diff --git a/packaging/centreon-plugin-Virtualization-Vmware8-Esx-Restapi/pkg.json b/packaging/centreon-plugin-Virtualization-Vmware8-Esx-Restapi/pkg.json new file mode 100644 index 0000000000..cb4fc0157d --- /dev/null +++ b/packaging/centreon-plugin-Virtualization-Vmware8-Esx-Restapi/pkg.json @@ -0,0 +1,10 @@ +{ + "pkg_name": "centreon-plugin-Virtualization-Vmware8-Esx-Restapi", + "pkg_summary": "Centreon Plugin to monitor VMware ESX physical servers using vSphere 8 REST API", + "plugin_name": "centreon_vmware8_esx_restapi.pl", + "files": [ + "centreon/plugins/script_custom.pm", + "apps/vmware/vsphere8/esx/", + "apps/vmware/vsphere8/custom/" + ] +} diff --git a/packaging/centreon-plugin-Virtualization-Vmware8-Esx-Restapi/rpm.json b/packaging/centreon-plugin-Virtualization-Vmware8-Esx-Restapi/rpm.json new file mode 100644 index 0000000000..1869614605 --- /dev/null +++ b/packaging/centreon-plugin-Virtualization-Vmware8-Esx-Restapi/rpm.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "perl(JSON)" + ] +} diff --git a/src/apps/antivirus/skyhigh/webgateway/snmp/mode/clients.pm b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/clients.pm new file mode 100644 index 0000000000..0533fce22d --- /dev/null +++ b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/clients.pm @@ -0,0 +1,111 @@ +# +# Copyright 2024 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::antivirus::skyhigh::webgateway::snmp::mode::clients; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'clients', nlabel => 'clients.connected.count', set => { + key_values => [ { name => 'stClientCount' } ], + output_template => 'Connected clients: %d', + perfdatas => [ + { label => 'connected_clients', template => '%d', + min => 0, unit => 'clients' } + ] + } + }, + { label => 'sockets', nlabel => 'sockets.connected.count', set => { + key_values => [ { name => 'stConnectedSockets' } ], + output_template => 'Open network sockets: %d', + perfdatas => [ + { label => 'open_sockets', template => '%d', + min => 0, unit => 'sockets' } + ] + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + return $self; +} + +my $oid_stClientCount = '.1.3.6.1.4.1.59732.2.7.2.5.2.0'; +my $oid_stConnectedSockets = '.1.3.6.1.4.1.59732.2.7.2.5.3.0'; + +sub manage_selection { + my ($self, %options) = @_; + + my $results = $options{snmp}->get_leef( + oids => [ $oid_stClientCount, $oid_stConnectedSockets ], + nothing_quit => 1 + ); + + $self->{global} = { + stClientCount => $results->{$oid_stClientCount}, + stConnectedSockets => $results->{$oid_stConnectedSockets}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check connected clients and open network sockets. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +(example: --filter-counters='clients') + +=item B<--warning-*> + +Warning threshold. +Can be: 'clients', 'sockets'. + +=item B<--critical-*> + +Critical threshold. +Can be: 'clients', 'sockets'. + +=back + +=cut diff --git a/src/apps/antivirus/skyhigh/webgateway/snmp/mode/connections.pm b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/connections.pm new file mode 100644 index 0000000000..9c95b41977 --- /dev/null +++ b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/connections.pm @@ -0,0 +1,157 @@ +# +# Copyright 2024 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::antivirus::skyhigh::webgateway::snmp::mode::connections; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_connection_output' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'legitimate', nlabel => 'connections.legitimate.persecond', set => { + key_values => [ { name => 'stConnectionsLegitimate', per_second => 1 } ], + output_template => 'Legitimate: %d', + perfdatas => [ + { label => 'legitimate_connections', template => '%d', min => 0, unit => 'connections/s' } + ] + } + }, + { label => 'blocked', nlabel => 'connections.blocked.persecond', set => { + key_values => [ { name => 'stConnectionsBlocked', per_second => 1 } ], + output_template => 'Blocked: %d', + perfdatas => [ + { label => 'blocked_connections', template => '%d', min => 0, unit => 'connections/s' } + ] + } + }, + { label => 'blocked-by-am', nlabel => 'connections.antimalware.blocked.persecond', set => { + key_values => [ { name => 'stBlockedByAntiMalware', per_second => 1 } ], + output_template => 'Blocked by Anti Malware: %d', + perfdatas => [ + { label => 'blocked_by_am', template => '%d', min => 0, unit => 'connections/s' } + ] + } + }, + { label => 'blocked-by-mf', nlabel => 'connections.mediafilter.blocked.persecond', set => { + key_values => [ { name => 'stBlockedByMediaFilter', per_second => 1 } ], + output_template => 'Blocked by Media Filter: %d', + perfdatas => [ + { label => 'blocked_by_mf', template => '%d', min => 0, unit => 'connections/s' } + ] + } + }, + { label => 'blocked-by-uf', nlabel => 'connections.urlfilter.blocked.persecond', set => { + key_values => [ { name => 'stBlockedByURLFilter', per_second => 1 } ], + output_template => 'Blocked by URL Filter: %d', + perfdatas => [ + { label => 'blocked_by_uf', template => '%d', min => 0, unit => 'connections/s' } + ] + } + } + ]; +} + +sub prefix_connection_output { + my ($self, %options) = @_; + + return 'Connections (per sec) '; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + return $self; +} + +my $oid_stConnectionsLegitimate = '.1.3.6.1.4.1.59732.2.7.2.1.3.0'; +my $oid_stBlockedByAntiMalware = '.1.3.6.1.4.1.59732.2.7.2.1.4.0'; +my $oid_stConnectionsBlocked = '.1.3.6.1.4.1.59732.2.7.2.1.5.0'; +my $oid_stBlockedByMediaFilter = '.1.3.6.1.4.1.59732.2.7.2.1.6.0'; +my $oid_stBlockedByURLFilter = '.1.3.6.1.4.1.59732.2.7.2.1.7.0'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache_name} = 'skyhigh_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); + + my $results = $options{snmp}->get_leef( + oids => [ + $oid_stConnectionsLegitimate, $oid_stBlockedByAntiMalware, + $oid_stConnectionsBlocked, $oid_stBlockedByMediaFilter, + $oid_stBlockedByURLFilter + ], + nothing_quit => 1 + ); + + $self->{global} = { + stConnectionsLegitimate => $results->{$oid_stConnectionsLegitimate}, + stBlockedByAntiMalware => $results->{$oid_stBlockedByAntiMalware}, + stConnectionsBlocked => $results->{$oid_stConnectionsBlocked}, + stBlockedByMediaFilter => $results->{$oid_stBlockedByMediaFilter}, + stBlockedByURLFilter => $results->{$oid_stBlockedByURLFilter}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check connections statistics. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +(example: --filter-counters='blocked') + +=item B<--warning-*> + +Warning threshold. +Can be: 'legitimate', 'blocked', 'blocked-by-am' for blocked by anti malware , +'blocked-by-mf' for blocked by media Filter, 'blocked-by-uf' for blocked by URL filter. + +=item B<--critical-*> + +Critical threshold. +Can be: 'legitimate', 'blocked', 'blocked-by-am' for blocked by anti malware , +'blocked-by-mf' for blocked by media Filter, 'blocked-by-uf' for blocked by URL filter. + +=back + +=cut diff --git a/src/apps/antivirus/skyhigh/webgateway/snmp/mode/detections.pm b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/detections.pm new file mode 100644 index 0000000000..3d69f11341 --- /dev/null +++ b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/detections.pm @@ -0,0 +1,157 @@ +# +# Copyright 2024 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::antivirus::skyhigh::webgateway::snmp::mode::detections; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + { name => 'categories', type => 1, cb_prefix_output => 'prefix_categories_output', + message_multiple => 'All categories are ok' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'malware-detected', nlabel => 'malwares.detected.persecond', set => { + key_values => [ { name => 'stMalwareDetected', per_second => 1 } ], + output_template => 'Malware detected (per sec): %d', + perfdatas => [ + { label => 'malware_detected', template => '%d', min => 0, unit => 'detections/s' } + ] + } + } + ]; + $self->{maps_counters}->{categories} = [ + { label => 'category', nlabel => 'category.malwares.detected.persecond', set => { + key_values => [ { name => 'stCategoryCount', per_second => 1 }, { name => 'stCategoryName' } ], + output_template => 'detections (per sec): %d', + perfdatas => [ + { label => 'category', template => '%d', + min => 0, unit => 'detections/s', label_extra_instance => 1, + instance_use => 'stCategoryName' } + ] + } + } + ]; +} + +sub prefix_categories_output { + my ($self, %options) = @_; + + return "Category '" . $options{instance_value}->{stCategoryName} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'filter-name:s' => { name => 'filter_name' } + }); + + return $self; +} + +my $oid_stMalwareDetected = '.1.3.6.1.4.1.59732.2.7.2.1.2.0'; + +my $mapping = { + stCategoryName => { oid => '.1.3.6.1.4.1.59732.2.7.2.1.10.1.1' }, + stCategoryCount => { oid => '.1.3.6.1.4.1.59732.2.7.2.1.10.1.2' }, +}; +my $oid_stCategoriesEntry = '.1.3.6.1.4.1.59732.2.7.2.1.10.1'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache_name} = 'skyhigh_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); + + my $results = $options{snmp}->get_leef(oids => [ $oid_stMalwareDetected ], nothing_quit => 1); + my $results2 = $options{snmp}->get_table(oid => $oid_stCategoriesEntry, nothing_quit => 1); + + $self->{global} = { + stMalwareDetected => $results->{$oid_stMalwareDetected}, + }; + + $self->{categories} = {}; + foreach my $oid (keys %{$results2}) { + next if ($oid !~ /^$mapping->{stCategoryName}->{oid}\.(\d+)/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $results2, instance => $instance); + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $result->{stCategoryName} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $result->{stCategoryName} . "': no matching filter name.", debug => 1); + next; + } + + $self->{categories}->{ $result->{stCategoryName} } = { + stCategoryName => $result->{stCategoryName}, + stCategoryCount => $result->{stCategoryCount} + } + } + + if (scalar(keys %{$self->{categories}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No categories found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check detections statistics. + +=over 8 + +=item B<--filter-name> + +Filter category name (can be a regexp). + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +(example: --filter-counters='^(?!(category)$)') + +=item B<--warning-*> + +Warning threshold. +Can be: 'malware-detected', 'category' + +=item B<--critical-*> + +Critical threshold. +Can be: 'malware-detected', 'category' + +=back + +=cut diff --git a/src/apps/antivirus/skyhigh/webgateway/snmp/mode/ftpstatistics.pm b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/ftpstatistics.pm new file mode 100644 index 0000000000..9405e97f7d --- /dev/null +++ b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/ftpstatistics.pm @@ -0,0 +1,150 @@ +# +# Copyright 2024 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::antivirus::skyhigh::webgateway::snmp::mode::ftpstatistics; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'traffics', type => 0, cb_prefix_output => 'prefix_traffic_output' } + ]; + + $self->{maps_counters}->{traffics} = [ + { label => 'client-to-proxy', nlabel => 'ftp.traffic.client2proxy.bitspersecond', set => { + key_values => [ { name => 'stFtpBytesFromClient', per_second => 1 } ], + output_template => 'from client to proxy: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'ftp_traffic_client_to_proxy', template => '%d', min => 0, unit => 'b/s' } + ] + } + }, + { label => 'server-to-proxy', nlabel => 'ftp.traffic.server2proxy.bitspersecond', set => { + key_values => [ { name => 'stFtpBytesFromServer', per_second => 1 } ], + output_template => 'from server to proxy: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'ftp_traffic_server_to_proxy', template => '%d', min => 0, unit => 'b/s' } + ] + } + }, + { label => 'proxy-to-client', nlabel => 'ftp.traffic.proxy2client.bitspersecond', set => { + key_values => [ { name => 'stFtpBytesToClient', per_second => 1 } ], + output_template => 'from proxy to client: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'ftp_traffic_proxy_to_client', template => '%d', min => 0, unit => 'b/s' } + ] + } + }, + { label => 'proxy-to-server', nlabel => 'ftp.traffic.proxy2server.bitspersecond', set => { + key_values => [ { name => 'stFtpBytesToServer', per_second => 1 } ], + output_template => 'from proxy to server: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'ftp_traffic_proxy_to_server', template => '%d', min => 0, unit => 'b/s' } + ] + } + } + ]; +} + +sub prefix_traffic_output { + my ($self, %options) = @_; + + return "FTP Traffic "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + return $self; +} + +my $oid_stFtpBytesFromClient = '.1.3.6.1.4.1.59732.2.7.2.4.2.0'; +my $oid_stFtpBytesFromServer = '.1.3.6.1.4.1.59732.2.7.2.4.3.0'; +my $oid_stFtpBytesToClient = '.1.3.6.1.4.1.59732.2.7.2.4.4.0'; +my $oid_stFtpBytesToServer = '.1.3.6.1.4.1.59732.2.7.2.4.5.0'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache_name} = 'skyhigh_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); + + my $results = $options{snmp}->get_leef( + oids => [ + $oid_stFtpBytesFromClient, $oid_stFtpBytesFromServer, + $oid_stFtpBytesToClient, $oid_stFtpBytesToServer + ], + nothing_quit => 1 + ); + + $self->{traffics} = { + stFtpBytesFromClient => $results->{$oid_stFtpBytesFromClient} * 8, + stFtpBytesFromServer => $results->{$oid_stFtpBytesFromServer} * 8, + stFtpBytesToClient => $results->{$oid_stFtpBytesToClient} * 8, + stFtpBytesToServer => $results->{$oid_stFtpBytesToServer} * 8, + }; +} + +1; + +__END__ + +=head1 MODE + +Check FTP statistics. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +(example: --filter-counters='^proxy') + +=item B<--warning-*> + +Warning threshold. +Can be: 'client-to-proxy', 'server-to-proxy', +'proxy-to-client', 'proxy-to-server'. + +=item B<--critical-*> + +Critical threshold. +Can be: 'client-to-proxy', 'server-to-proxy', +'proxy-to-client', 'proxy-to-server'. + +=back + +=cut diff --git a/src/apps/antivirus/skyhigh/webgateway/snmp/mode/httpsstatistics.pm b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/httpsstatistics.pm new file mode 100644 index 0000000000..86588fa6fb --- /dev/null +++ b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/httpsstatistics.pm @@ -0,0 +1,166 @@ +# +# Copyright 2024 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::antivirus::skyhigh::webgateway::snmp::mode::httpsstatistics; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + { name => 'traffics', type => 0, cb_prefix_output => 'prefix_traffic_output' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'requests', nlabel => 'https.requests.persecond', set => { + key_values => [ { name => 'stHttpsRequests', per_second => 1 } ], + output_template => 'HTTPS Requests (per sec): %d', + perfdatas => [ + { label => 'https_requests', template => '%d', min => 0, unit => 'requests/s' } + ] + } + } + ]; + $self->{maps_counters}->{traffics} = [ + { label => 'client-to-proxy', nlabel => 'https.traffic.client2proxy.bitspersecond', set => { + key_values => [ { name => 'stHttpsBytesFromClient', per_second => 1 } ], + output_template => 'from client to proxy: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'https_traffic_client_to_proxy', template => '%d', min => 0, unit => 'b/s' } + ] + } + }, + { label => 'server-to-proxy', nlabel => 'https.traffic.server2proxy.bitspersecond', set => { + key_values => [ { name => 'stHttpsBytesFromServer', per_second => 1 } ], + output_template => 'from server to proxy: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'https_traffic_server_to_proxy', template => '%d', min => 0, unit => 'b/s' } + ] + } + }, + { label => 'proxy-to-client', nlabel => 'https.traffic.proxy2client.bitspersecond', set => { + key_values => [ { name => 'stHttpsBytesToClient', per_second => 1 } ], + output_template => 'from proxy to client: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'https_traffic_proxy_to_client', template => '%d', min => 0, unit => 'b/s' } + ] + } + }, + { label => 'proxy-to-server', nlabel => 'https.traffic.proxy2server.bitspersecond', set => { + key_values => [ { name => 'stHttpsBytesToServer', per_second => 1 } ], + output_template => 'from proxy to server: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'https_traffic_proxy_to_server', template => '%d', min => 0, unit => 'b/s' } + ] + } + } + ]; +} + +sub prefix_traffic_output { + my ($self, %options) = @_; + + return "HTTPS Traffic "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + return $self; +} + +my $oid_stHttpsRequests = '.1.3.6.1.4.1.59732.2.7.2.3.1.0'; +my $oid_stHttpsBytesFromClient = '.1.3.6.1.4.1.59732.2.7.2.3.3.0'; +my $oid_stHttpsBytesFromServer = '.1.3.6.1.4.1.59732.2.7.2.3.4.0'; +my $oid_stHttpsBytesToClient = '.1.3.6.1.4.1.59732.2.7.2.3.5.0'; +my $oid_stHttpsBytesToServer = '.1.3.6.1.4.1.59732.2.7.2.3.6.0'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache_name} = 'skyhigh_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); + + my $results = $options{snmp}->get_leef( + oids => [ + $oid_stHttpsRequests, $oid_stHttpsBytesFromClient, + $oid_stHttpsBytesFromServer, $oid_stHttpsBytesToClient, + $oid_stHttpsBytesToServer + ], + nothing_quit => 1 + ); + + $self->{global} = { + stHttpsRequests => $results->{$oid_stHttpsRequests} + }; + $self->{traffics} = { + stHttpsBytesFromClient => $results->{$oid_stHttpsBytesFromClient} * 8, + stHttpsBytesFromServer => $results->{$oid_stHttpsBytesFromServer} * 8, + stHttpsBytesToClient => $results->{$oid_stHttpsBytesToClient} * 8, + stHttpsBytesToServer => $results->{$oid_stHttpsBytesToServer} * 8 + }; +} + +1; + +__END__ + +=head1 MODE + +Check HTTPS statistics. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +(example: --filter-counters='^proxy') + +=item B<--warning-*> + +Warning threshold. +Can be: 'request', 'client-to-proxy', 'server-to-proxy', +'proxy-to-client', 'proxy-to-server'. + +=item B<--critical-*> + +Critical threshold. +Can be: 'request', 'client-to-proxy', 'server-to-proxy', +'proxy-to-client', 'proxy-to-server'. + +=back + +=cut diff --git a/src/apps/antivirus/skyhigh/webgateway/snmp/mode/httpstatistics.pm b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/httpstatistics.pm new file mode 100644 index 0000000000..5d1d0577c8 --- /dev/null +++ b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/httpstatistics.pm @@ -0,0 +1,167 @@ +# +# Copyright 2024 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::antivirus::skyhigh::webgateway::snmp::mode::httpstatistics; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + { name => 'traffics', type => 0, cb_prefix_output => 'prefix_traffic_output' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'requests', nlabel => 'http.requests.persecond', set => { + key_values => [ { name => 'stHttpRequests', per_second => 1 } ], + output_template => 'HTTP Requests (per sec): %d', + perfdatas => [ + { label => 'http_requests', template => '%d', min => 0, unit => 'requests/s' } + ] + } + } + ]; + + $self->{maps_counters}->{traffics} = [ + { label => 'client-to-proxy', nlabel => 'http.traffic.client2proxy.bitspersecond', set => { + key_values => [ { name => 'stHttpBytesFromClient', per_second => 1 } ], + output_template => 'from client to proxy: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'http_traffic_client_to_proxy', template => '%d', min => 0, unit => 'b/s' } + ] + } + }, + { label => 'server-to-proxy', nlabel => 'http.traffic.server2proxy.bitspersecond', set => { + key_values => [ { name => 'stHttpBytesFromServer', per_second => 1 } ], + output_template => 'from server to proxy: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'http_traffic_server_to_proxy', template => '%d', min => 0, unit => 'b/s' } + ] + } + }, + { label => 'proxy-to-client', nlabel => 'http.traffic.proxy2client.bitspersecond', set => { + key_values => [ { name => 'stHttpBytesToClient', per_second => 1 } ], + output_template => 'from proxy to client: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'http_traffic_proxy_to_client', template => '%d', min => 0, unit => 'b/s' } + ] + } + }, + { label => 'proxy-to-server', nlabel => 'http.traffic.proxy2server.bitspersecond', set => { + key_values => [ { name => 'stHttpBytesToServer', per_second => 1 } ], + output_template => 'from proxy to server: %s %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'http_traffic_proxy_to_server', template => '%d', min => 0, unit => 'b/s' } + ] + } + } + ]; +} + +sub prefix_traffic_output { + my ($self, %options) = @_; + + return "HTTP Traffic "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + return $self; +} + +my $oid_stHttpRequests = '.1.3.6.1.4.1.59732.2.7.2.2.1.0'; +my $oid_stHttpBytesFromClient = '.1.3.6.1.4.1.59732.2.7.2.2.3.0'; +my $oid_stHttpBytesFromServer = '.1.3.6.1.4.1.59732.2.7.2.2.4.0'; +my $oid_stHttpBytesToClient = '.1.3.6.1.4.1.59732.2.7.2.2.5.0'; +my $oid_stHttpBytesToServer = '.1.3.6.1.4.1.59732.2.7.2.2.6.0'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache_name} = 'skyhigh_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); + + my $results = $options{snmp}->get_leef( + oids => [ + $oid_stHttpRequests, $oid_stHttpBytesFromClient, + $oid_stHttpBytesFromServer, $oid_stHttpBytesToClient, + $oid_stHttpBytesToServer + ], + nothing_quit => 1 + ); + + $self->{global} = { + stHttpRequests => $results->{$oid_stHttpRequests} + }; + $self->{traffics} = { + stHttpBytesFromClient => $results->{$oid_stHttpBytesFromClient} * 8, + stHttpBytesFromServer => $results->{$oid_stHttpBytesFromServer} * 8, + stHttpBytesToClient => $results->{$oid_stHttpBytesToClient} * 8, + stHttpBytesToServer => $results->{$oid_stHttpBytesToServer} * 8 + }; +} + +1; + +__END__ + +=head1 MODE + +Check HTTP statistics. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +(example: --filter-counters='^proxy') + +=item B<--warning-*> + +Warning threshold. +Can be: 'request', 'client-to-proxy', 'server-to-proxy', +'proxy-to-client', 'proxy-to-server'. + +=item B<--critical-*> + +Critical threshold. +Can be: 'request', 'client-to-proxy', 'server-to-proxy', +'proxy-to-client', 'proxy-to-server'. + +=back + +=cut diff --git a/src/apps/antivirus/skyhigh/webgateway/snmp/mode/system.pm b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/system.pm new file mode 100644 index 0000000000..ce00ec43b0 --- /dev/null +++ b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/system.pm @@ -0,0 +1,104 @@ +# +# Copyright 2024 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::antivirus::skyhigh::webgateway::snmp::mode::system; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'cpu-utilization', nlabel => 'system.cpu.utilization.percentage', set => { + key_values => [ { name => 'cpu_util' } ], + output_template => 'cpu usage: %.2f%%', + perfdatas => [ + { template => '%.2f', unit => '%', min => 0, max => 100 } + ] + } + }, + { label => 'dns-resolve-time', nlabel => 'system.dns.resolve.time.milliseconds', set => { + key_values => [ { name => 'dns_time' } ], + output_template => 'time to resolve dns: %sms', + perfdatas => [ + { template => '%s', unit => 'ms', min => 0 } + ] + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + return $self; +} + +my $oid_stCPULoad = '.1.3.6.1.4.1.59732.2.7.2.5.1.0'; +my $oid_stResolveHostViaDNS = '.1.3.6.1.4.1.59732.2.7.2.5.6.0'; + +sub manage_selection { + my ($self, %options) = @_; + + my $results = $options{snmp}->get_leef( + oids => [ $oid_stCPULoad, $oid_stResolveHostViaDNS ], + nothing_quit => 1 + ); + + $self->{global} = { + cpu_util => $results->{$oid_stCPULoad}, + dns_time => $results->{$oid_stResolveHostViaDNS} + }; +} + +1; + +__END__ + +=head1 MODE + +Check system. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +(example: --filter-counters='cpu') + +=item B<--warning-*> B<--critical-*> + +Thresholds. +Can be: 'cpu-utilization', 'dns-resolve-time'. + +=back + +=cut diff --git a/src/apps/antivirus/skyhigh/webgateway/snmp/mode/versions.pm b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/versions.pm new file mode 100644 index 0000000000..c2d652cf78 --- /dev/null +++ b/src/apps/antivirus/skyhigh/webgateway/snmp/mode/versions.pm @@ -0,0 +1,182 @@ +# +# Copyright 2024 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::antivirus::skyhigh::webgateway::snmp::mode::versions; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::statefile; +use Digest::MD5 qw(md5_hex); + +sub custom_version_calc { + my ($self, %options) = @_; + + $self->{result_values}->{output} = $options{extra_options}->{output_ref}; + $self->{result_values}->{version} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{label_ref}}; + $self->{result_values}->{timestamp} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{label_ref} . '_timestamp'}; + $self->{result_values}->{since} = time() - $self->{result_values}->{timestamp}; + + return 0; +} + +sub custom_version_threshold { + my ($self, %options) = @_; + + return $self->{perfdata}->threshold_check( + value => $self->{result_values}->{since}, + threshold => [ + { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, + { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } + ] + ); +} + +sub custom_version_output { + my ($self, %options) = @_; + + return sprintf( + "%s: %s [Last update: %s]", + $self->{result_values}->{output}, + $self->{result_values}->{version}, + centreon::plugins::misc::change_seconds(value => $self->{result_values}->{since}) + ); +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, skipped_code => { -10 => 1 } } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'dat-version', set => { + key_values => [ { name => 'pMFEDATVersion' }, { name => 'pMFEDATVersion_timestamp' } ], + closure_custom_calc => $self->can('custom_version_calc'), + closure_custom_calc_extra_options => { label_ref => 'pMFEDATVersion', output_ref => 'DAT Version' }, + closure_custom_output => $self->can('custom_version_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_version_threshold') + } + }, + { label => 'tsdb-version', set => { + key_values => [ { name => 'pTSDBVersion' }, { name => 'pTSDBVersion_timestamp' } ], + closure_custom_calc => $self->can('custom_version_calc'), + closure_custom_calc_extra_options => { label_ref => 'pTSDBVersion', output_ref => 'TrustedSource Database Version' }, + closure_custom_output => $self->can('custom_version_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_version_threshold') + } + }, + { label => 'proactive-version', set => { + key_values => [ { name => 'pAMProactiveVersion' }, { name => 'pAMProactiveVersion_timestamp' } ], + closure_custom_calc => $self->can('custom_version_calc'), + closure_custom_calc_extra_options => { label_ref => 'pAMProactiveVersion', output_ref => 'ProActive Database Version' }, + closure_custom_output => $self->can('custom_version_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_version_threshold') + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + $self->{cache} = centreon::plugins::statefile->new(%options); + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->{cache}->check_options(%options); +} + +my $oid_pMFEDATVersion = '.1.3.6.1.4.1.59732.2.7.1.20.4.0'; +my $oid_pAMProactiveVersion = '.1.3.6.1.4.1.59732.2.7.1.20.5.0'; +my $oid_pTSDBVersion = '.1.3.6.1.4.1.59732.2.7.1.20.6.0'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache}->read(statefile => 'skyhigh_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all'))); + + my $results = $options{snmp}->get_leef( + oids => [ $oid_pMFEDATVersion, $oid_pAMProactiveVersion, $oid_pTSDBVersion ], + nothing_quit => 1 + ); + + $self->{new_datas} = { + pMFEDATVersion => $results->{$oid_pMFEDATVersion}, + pAMProactiveVersion => $results->{$oid_pAMProactiveVersion}, + pTSDBVersion => $results->{$oid_pTSDBVersion} + }; + + foreach my $version (('pMFEDATVersion', 'pAMProactiveVersion', 'pTSDBVersion')) { + next if (!defined($self->{new_datas}->{$version}) || $self->{new_datas}->{$version} eq ''); + $self->{new_datas}->{$version . '_timestamp'} = ($self->{new_datas}->{$version} > $self->{cache}->{datas}->{$version}) ? time() : $self->{cache}->{datas}->{$version . '_timestamp'}; + $self->{new_datas}->{$version . '_timestamp'} = time() if (!defined($self->{new_datas}->{$version . '_timestamp'})); + } + + $self->{global} = { %{$self->{new_datas}} }; + + $self->{cache}->write(data => $self->{new_datas}); +} + +1; + +__END__ + +=head1 MODE + +Check signature databases versions +(last update is only guessed by version's change, +it does not appear clearly in the MIB). + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +(example: --filter-counters='dat') + +=item B<--warning-*> + +Warning threshold on last update. +Can be: 'dat-version', 'tsdb-version' for TrustedSource Database Version, 'proactive-version' for ProActive Database Version. + +=item B<--critical-*> + +Critical threshold on last update. +Can be: 'dat-version', 'tsdb-version' for TrustedSource Database Version, 'proactive-version' for ProActive Database Version. + +=back + +=cut diff --git a/src/apps/antivirus/skyhigh/webgateway/snmp/plugin.pm b/src/apps/antivirus/skyhigh/webgateway/snmp/plugin.pm new file mode 100644 index 0000000000..f4dc8ad62e --- /dev/null +++ b/src/apps/antivirus/skyhigh/webgateway/snmp/plugin.pm @@ -0,0 +1,57 @@ +# +# Copyright 2024 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::antivirus::skyhigh::webgateway::snmp::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_snmp); + +sub new { + my ($class, %options) = @_; + + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '0.1'; + $self->{modes} = { + 'clients' => 'apps::antivirus::skyhigh::webgateway::snmp::mode::clients', + 'connections' => 'apps::antivirus::skyhigh::webgateway::snmp::mode::connections', + 'detections' => 'apps::antivirus::skyhigh::webgateway::snmp::mode::detections', + 'ftp-statistics' => 'apps::antivirus::skyhigh::webgateway::snmp::mode::ftpstatistics', + 'http-statistics' => 'apps::antivirus::skyhigh::webgateway::snmp::mode::httpstatistics', + 'https-statistics' => 'apps::antivirus::skyhigh::webgateway::snmp::mode::httpsstatistics', + 'system' => 'apps::antivirus::skyhigh::webgateway::snmp::mode::system', + 'versions' => 'apps::antivirus::skyhigh::webgateway::snmp::mode::versions', + }; + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check SkyHigh Security Web Gateway through SNMP. +This product is the successor to McAfee Web Gateway for versions higher than 11. + +=cut diff --git a/src/apps/backup/commvault/commserve/restapi/mode/storagepools.pm b/src/apps/backup/commvault/commserve/restapi/mode/storagepools.pm index 94fa5a7a4c..fbe7c7c9e3 100644 --- a/src/apps/backup/commvault/commserve/restapi/mode/storagepools.pm +++ b/src/apps/backup/commvault/commserve/restapi/mode/storagepools.pm @@ -128,14 +128,16 @@ sub manage_selection { } my ($total, $free) = ($_->{totalCapacity} * 1024 * 1024, $_->{totalFreeSpace} * 1024 * 1024); + my $fixed_total = ($total == 0) ? 1 : $total; + $self->{sp}->{ $_->{storagePoolEntity}->{storagePoolName} } = { - display => $_->{storagePoolEntity}->{storagePoolName}, - status => defined($map_status_code->{ $_->{statusCode} }) ? $map_status_code->{ $_->{statusCode} } : lc($_->{status}), - total_space => $total, - used_space => $total - $free, - free_space => $free, - prct_used_space => 100 - ($free * 100 / $total), - prct_free_space => $free * 100 / $total + display => $_->{storagePoolEntity}->{storagePoolName}, + status => defined($map_status_code->{ $_->{statusCode} }) ? $map_status_code->{ $_->{statusCode} } : lc($_->{status}), + total_space => $total, + used_space => $total - $free, + free_space => $free, + prct_used_space => 100 - ($free * 100 / $fixed_total), + prct_free_space => $free * 100 / $fixed_total }; } diff --git a/src/apps/jmeter/mode/scenario.pm b/src/apps/jmeter/mode/scenario.pm index da6f0f1d9a..1b27000554 100644 --- a/src/apps/jmeter/mode/scenario.pm +++ b/src/apps/jmeter/mode/scenario.pm @@ -20,7 +20,7 @@ package apps::jmeter::mode::scenario; -use base qw(centreon::plugins::mode); +use base qw(centreon::plugins::templates::counter); use strict; use warnings; @@ -33,12 +33,10 @@ sub new { bless $self, $class; $options{options}->add_options(arguments => { - 'command-extra-options:s' => { name => 'command_extra_options' }, - 'timeout:s' => { name => 'timeout', default => 50 }, - 'directory:s' => { name => 'directory' }, - 'scenario:s' => { name => 'scenario' }, - 'warning:s' => { name => 'warning' }, - 'critical:s' => { name => 'critical' } + 'command-extra-options:s' => { name => 'command_extra_options' }, + 'timeout:s' => { name => 'timeout', default => 50 }, + 'directory:s' => { name => 'directory' }, + 'scenario:s' => { name => 'scenario' } }); return $self; @@ -46,21 +44,13 @@ sub new { sub check_options { my ($self, %options) = @_; - $self->SUPER::init(%options); + $self->SUPER::check_options(%options); - if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); - $self->{output}->option_exit(); - } - if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); - $self->{output}->option_exit(); - } - if (!defined($self->{option_results}->{scenario})) { + if (!defined($self->{option_results}->{scenario})) { $self->{output}->add_option_msg(short_msg => "Please specify a scenario name."); $self->{output}->option_exit(); } - if (!defined($self->{option_results}->{directory})) { + if (!defined($self->{option_results}->{directory})) { $self->{output}->add_option_msg(short_msg => "Please specify a directory."); $self->{output}->option_exit(); } @@ -70,30 +60,110 @@ sub check_options { $self->{option_results}->{command_extra_options} = centreon::plugins::misc::sanitize_command_param(value => $self->{option_results}->{command_extra_options}); } -sub run { +sub custom_steps_output { + my ($self, %options) = @_; + + my $msg = sprintf("Steps: %s/%s", $self->{result_values}->{steps_ok}, $self->{result_values}->{steps_total}); + return $msg; +} + +sub custom_steps_threshold { + my ($self, %options) = @_; + + return 'ok' if ($self->{result_values}->{steps_ok} == $self->{result_values}->{steps_total}); + return 'critical'; +} + +sub suffix_output { my ($self, %options) = @_; + my $msg = ''; + if (defined($options{instance_value}->{first_failed_label})) { + $msg .= ' - First failed: ' . $options{instance_value}->{first_failed_label}; + } + return $msg; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_suffix_output => 'suffix_output' } + ]; + + $self->{maps_counters}->{global} = [ + { + label => 'time', + nlabel => 'scenario.time.seconds', + set => { + key_values => [ { name => 'time' } ], + output_template => 'Elapsed Time: %.3fs', + perfdatas => [ + { template => '%.3f', + min => 0, + unit => 's', + label_extra_instance => 1 + } + ] + } + }, + { + label => 'steps', + nlabel => 'scenario.steps.count', + set => { + key_values => [ { name => 'steps_ok' }, { name => 'steps_total' } ], + closure_custom_output => $self->can('custom_steps_output'), + perfdatas => [ + { value => 'steps_ok', + template => '%d', + min => 0, + max => 'steps_total' } + ], + closure_custom_threshold_check => $self->can('custom_steps_threshold') + } + }, + { + label => 'availability', + nlabel => 'scenario.availability.percentage', + set => { + key_values => [ { name => 'availability' } ], + output_template => 'Availability: %d%%', + perfdatas => [ + { value => 'availability', + template => '%d', + min => 0, + max => 100, + unit => '%' + } + ] + } + } + ]; +} + +sub manage_selection { + my ($self, %options) = @_; + + # Specify test plan file path my $filename = $self->{option_results}->{directory} . '/' . $self->{option_results}->{scenario} . '.jmx'; my $command_options = '-t ' . $filename; - # Temporary write result on stderr $command_options .= ' -l /dev/stderr'; - # Write logs to trash $command_options .= ' -j /dev/null'; - + # Non-GUI mode $command_options .= ' -n'; + # XML output format $command_options .= ' -J jmeter.save.saveservice.output_format=xml'; - + # Extra options if (defined($self->{option_results}->{command_extra_options})) { $command_options .= ' ' . $self->{option_results}->{command_extra_options}; } - # Redirect result on stdout and default stdout to trash $command_options .= ' 2>&1 >/dev/null'; my ($stdout) = $options{custom}->execute_command( - command => 'jmeter', + command => 'jmeter', command_options => $command_options ); @@ -102,16 +172,13 @@ sub run { my $listHttpSampleNode = $xp->findnodes('/testResults/httpSample|/testResults/sample'); - my $timing0 = 0; - my $timing1 = 0; - my $step = $listHttpSampleNode->get_nodelist; - my $stepOk = 0; + my $start_time = 0; + my $end_time = 0; + my $steps = $listHttpSampleNode->get_nodelist; + my $steps_ok = 0; my $first_failed_label; - my $exit1 = 'OK'; foreach my $httpSampleNode ($listHttpSampleNode->get_nodelist) { - my $temp_exit = 'OK'; - my $elapsed_time = $httpSampleNode->getAttribute('t'); my $timestamp = $httpSampleNode->getAttribute('ts'); my $success = $httpSampleNode->getAttribute('s'); @@ -119,93 +186,56 @@ sub run { my $response_code = $httpSampleNode->getAttribute('rc'); my $response_message = $httpSampleNode->getAttribute('rm'); - $self->{output}->output_add(long_msg => "* Sample: " . $label); - $self->{output}->output_add(long_msg => " - Success: " . $success); - $self->{output}->output_add(long_msg => " - Elapsed Time: " . $elapsed_time / 1000 . "s"); - $self->{output}->output_add(long_msg => " - Response Code: " . $response_code); - $self->{output}->output_add(long_msg => " - Response Message: " . $response_message); - - if ($success ne 'true') { - $temp_exit = 'CRITICAL'; + if ($self->{output}->is_verbose()) { + $self->{output}->output_add(long_msg => "* Sample: " . $label); + $self->{output}->output_add(long_msg => " - Success: " . $success); + $self->{output}->output_add(long_msg => " - Elapsed Time: " . $elapsed_time / 1000 . "s"); + $self->{output}->output_add(long_msg => " - Response Code: " . $response_code); + $self->{output}->output_add(long_msg => " - Response Message: " . $response_message); } my $listAssertionResultNode = $xp->findnodes('./assertionResult', $httpSampleNode); foreach my $assertionResultNode ($listAssertionResultNode->get_nodelist) { my $name = $xp->findvalue('./name', $assertionResultNode); - my $failure = $xp->findvalue('./failure', $assertionResultNode); - my $error = $xp->findvalue('./error', $assertionResultNode); - $self->{output}->output_add(long_msg => " - Assertion: " . $name); - if (($failure eq 'true') || ($error eq 'true')) { - my $failure_message = $xp->findvalue('./failureMessage', $assertionResultNode); - $self->{output}->output_add(long_msg => " + Failure Message: " . $failure_message); - - $temp_exit = 'CRITICAL'; + if ($self->{output}->is_verbose()) { + my $failure = $xp->findvalue('./failure', $assertionResultNode); + my $error = $xp->findvalue('./error', $assertionResultNode); + if (($failure eq 'true') || ($error eq 'true')) { + my $failure_message = $xp->findvalue('./failureMessage', $assertionResultNode); + $self->{output}->output_add(long_msg => " + Failure Message: " . $failure_message); + } } } - if ($temp_exit eq 'OK') { - $stepOk++; + if ($success eq 'true') { + $steps_ok++; } else { if (!defined($first_failed_label)) { $first_failed_label = $label . " (" . $response_code . " " . $response_message . ")"; } - - $exit1 = $self->{output}->get_most_critical(status => [ $exit1, $temp_exit ]); } if ($timestamp > 0) { - if ($timing0 == 0) { - $timing0 = $timestamp; + if ($timestamp < $start_time || $start_time == 0) { + $start_time = $timestamp; + } + my $current_time = $timestamp + $elapsed_time; + if ($current_time > $end_time) { + $end_time = $current_time; } - - $timing1 = $timestamp + $elapsed_time; } } - - my $timeelapsed = ($timing1 - $timing0) / 1000; - my $availability = sprintf("%d", $stepOk * 100 / $step); - - my $exit2 = $self->{perfdata}->threshold_check( - value => $timeelapsed, - threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ] - ); - my $exit = $self->{output}->get_most_critical(status => [ $exit1, $exit2 ]); - if (!defined($first_failed_label)) { - $self->{output}->output_add( - severity => $exit, - short_msg => sprintf("%d/%d steps (%.3fs)", $stepOk, $step, $timeelapsed) - ); - } else { - $self->{output}->output_add( - severity => $exit, - short_msg => sprintf("%d/%d steps (%.3fs) - %s", $stepOk, $step, $timeelapsed, $first_failed_label) - ); - } - $self->{output}->perfdata_add( - label => "time", unit => 's', - value => sprintf('%.3f', $timeelapsed), - min => 0, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical') - ); - $self->{output}->perfdata_add( - label => "steps", - value => sprintf('%d', $stepOk), - min => 0, - max => $step - ); - $self->{output}->perfdata_add( - label => "availability", unit => '%', - value => sprintf('%d', $availability), - min => 0, - max => 100 - ); - - $self->{output}->display(); - $self->{output}->exit(); + my $timeelapsed = ($end_time - $start_time) / 1000; + my $availability = sprintf("%d", $steps_ok * 100 / $steps); + + $self->{global}->{time} = $timeelapsed; + $self->{global}->{steps_ok} = $steps_ok; + $self->{global}->{steps_total} = $steps; + $self->{global}->{first_failed_label} = $first_failed_label; + $self->{global}->{availability} = $availability; } 1; @@ -222,7 +252,7 @@ Command used: 'jmeter -t %(directory)/%(scenario).jmx -l /dev/stderr -j /dev/nul =item B<--command-extra-options> -Command extra options. +JMeter command extra options. =item B<--directory> @@ -232,11 +262,11 @@ Directory where scenarii are stored. Scenario used by JMeter (without extension). -=item B<--warning> +=item B<--warning-time> Warning threshold in seconds (scenario execution time). -=item B<--critical> +=item B<--critical-time> Critical threshold in seconds (scenario execution time). diff --git a/src/apps/vmware/vsphere8/custom/api.pm b/src/apps/vmware/vsphere8/custom/api.pm new file mode 100644 index 0000000000..0b9fb2d240 --- /dev/null +++ b/src/apps/vmware/vsphere8/custom/api.pm @@ -0,0 +1,400 @@ +# +# Copyright 2024 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::custom::api; + +use strict; +use warnings; +use centreon::plugins::http; +use centreon::plugins::statefile; +use MIME::Base64; +use Digest::MD5 qw(md5_hex); + +sub new { + my ($class, %options) = @_; + my $self = {}; + bless $self, $class; + + if (!defined($options{output})) { + print "Class Custom: Need to specify 'output' argument.\n"; + exit 3; + } + if (!defined($options{options})) { + $options{output}->add_option_msg(short_msg => "Class Custom: Need to specify 'options' argument."); + $options{output}->option_exit(); + } + + 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' } + } + ); + } + $options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1); + + $self->{output} = $options{output}; + $self->{http} = centreon::plugins::http->new(%options, 'default_backend' => 'curl'); + $self->{cache} = centreon::plugins::statefile->new(%options); + + return $self; +} + +sub set_options { + my ($self, %options) = @_; + + $self->{option_results} = $options{option_results}; +} + +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} : ''; + + if ($self->{hostname} eq '') { + $self->{output}->add_option_msg(short_msg => "Need to specify --hostname option."); + $self->{output}->option_exit(); + } + if ($self->{username} eq '') { + $self->{output}->add_option_msg(short_msg => "Need to specify --username option."); + $self->{output}->option_exit(); + } + if ($self->{password} eq '') { + $self->{output}->add_option_msg(short_msg => "Need to specify --password option."); + $self->{output}->option_exit(); + } + + $self->{cache}->check_options(option_results => $self->{option_results}); + + return 0; +} + +sub build_options_for_httplib { + my ($self, %options) = @_; + + $self->{option_results}->{hostname} = $self->{hostname}; + $self->{option_results}->{timeout} = $self->{timeout}; + $self->{option_results}->{port} = $self->{port}; + $self->{option_results}->{proto} = $self->{proto}; + # add options of this api + $self->{option_results}->{username} = $self->{username}; + $self->{option_results}->{password} = $self->{password}; + $self->{option_results}->{warning_status} = ''; + $self->{option_results}->{critical_status} = ''; + $self->{option_results}->{unknown_status} = $self->{http_unknown_status}; +} + +sub settings { + my ($self, %options) = @_; + + return 1 if (defined($self->{settings_done})); + $self->build_options_for_httplib(); + + $self->{http}->set_options(%{$self->{option_results}}); + $self->{settings_done} = 1; + + return 1; +} + +sub get_token { + my ($self, %options) = @_; + + my $has_cache_file = $self->{cache}->read( + statefile => 'vsphere8_api_' . md5_hex( + $self->{hostname} + . ':' . $self->{port} + . '_' . $self->{username}) + ); + my $token = $self->{cache}->get(name => 'token'); + + if ( + $has_cache_file == 0 + || !defined($token) + || $options{force_authentication} + ) { + my $auth_string = MIME::Base64::encode_base64($self->{username} . ':' . $self->{password}); + chomp $auth_string; + + $self->settings(); + my $content = $self->{http}->request( + 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' + ] + ); + + $content =~ s/^"(.*)"$/$1/; + $token = $content; + + my $data = { + updated => time(), + token => $token + }; + $self->{cache}->write(data => $data); + } + + return $token; +} + +sub try_request_api { + my ($self, %options) = @_; + + my $token = $self->get_token(%options); + 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) + ); + + if (!defined($content) || $content eq '') { + $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); + + return $decoded; +} + +sub request_api { + my ($self, %options) = @_; + + $self->settings(); + my $api_response = $self->try_request_api(%options); + + # 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') { + $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 = ''; + for my $error_item (@{$api_response->{messages}}) { + $full_message .= '[Id: ' . $error_item->{id} . ' - Msg: ' . $error_item->{default_message} . ' (' . join(', ', @{$error_item->{args}}) . ')]'; + } + $self->{output}->add_option_msg(short_msg => "API returns error of type " . $api_response->{error_type} . ": " . $full_message); + $self->{output}->option_exit(); + } + return $api_response; +} + +1; +__END__ + +=head1 NAME + +apps::vmware::vsphere8::custom::api - Custom module for VMware vSphere 8 API. + +=head1 SYNOPSIS + + use apps::vmware::vsphere8::custom::api; + + my $api = apps::vmware::vsphere8::custom::api->new( + output => $output, + options => $options + ); + + $api->set_options(option_results => $option_results); + $api->check_options(); + my $response = $api->request_api(endpoint => '/vcenter/host'); + +=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 new + + my $api = apps::vmware::vsphere8::custom::api->new(%options); + +Creates a new `apps::vmware::vsphere8::custom::api` object. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - An output object for messages. + +=item * C - An options object for adding command-line options. + +=back + +=back + +=head2 set_options + + $api->set_options(option_results => $option_results); + +Sets the options for the API module. + +=over 4 + +=item * C - A hash of option results. + +=back + +=head2 set_defaults + + $api->set_defaults(); + +Sets the default options for the API module. + +=head2 check_options + + $api->check_options(); + +Checks and processes the provided options. + +=head2 build_options_for_httplib + + $api->build_options_for_httplib(); + +Builds the options for the HTTP library. + +=head2 settings + + $api->settings(); + +Configures the HTTP settings for the API requests. + +=head2 get_token + + my $token = $api->get_token(%options); + +Retrieves the authentication token from the cache or requests a new one if necessary. + +=over 4 + +=item * C<%options> - A hash of options. + +=back + +=head2 try_request_api + + my $response = $api->try_request_api(%options); + +Attempts to make an API request with the provided options. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The API endpoint to request. + +=item * C - Additional GET parameters for the request. + +=item * C - Force re-authentication if set to true. + +=back + +=back + +=head2 request_api + + my $response = $api->request_api(%options); + +Calls try_request_api and recalls it forcing authentication if the first call fails. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The HTTP method to use (examples: GET, POST). + +=item * C - The API endpoint to request. + +=item * C - Additional GET parameters for the request. + +=back + +=back + +=head1 REST API OPTIONS + +Command-line options for VMware vSphere 8 API: + +=over 8 + +=item B<--hostname> + +Define the hostname of the vSphere server. + +=item B<--port> + +Define the port of the vSphere server (default: 443). + +=item B<--proto> + +Define the protocol to use (default: https). + +=item B<--username> + +Define the username for authentication. + +=item B<--password> + +Define the password for authentication. + +=item B<--timeout> + +Define the timeout for API requests (default: 10 seconds). + +=back + +=head1 AUTHOR + +Centreon + +=head1 LICENSE + +Licensed under the Apache License, Version 2.0. + +=cut \ No newline at end of file diff --git a/src/apps/vmware/vsphere8/esx/mode/discovery.pm b/src/apps/vmware/vsphere8/esx/mode/discovery.pm new file mode 100644 index 0000000000..52c3643b7d --- /dev/null +++ b/src/apps/vmware/vsphere8/esx/mode/discovery.pm @@ -0,0 +1,101 @@ +# +# Copyright 2024 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::discovery; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use JSON::XS; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'prettify' => { name => 'prettify' } + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub run { + my ($self, %options) = @_; + + my $disco_stats; + $disco_stats->{start_time} = time(); + + # Retrieve the data + my $response = $options{custom}->request_api('endpoint' => '/vcenter/host', 'method' => 'GET'); + + # Format the data for host discovery + my @results = map { + 'host_name' => $_->{name}, + 'vmw_host_id' => $_->{host}, + 'power_state' => $_->{power_state}, + 'connection_state' => $_->{connection_state}, + }, @{$response}; + + # Record the metadata + $disco_stats->{end_time} = time(); + $disco_stats->{duration} = $disco_stats->{end_time} - $disco_stats->{start_time}; + $disco_stats->{discovered_items} = scalar(@results); + $disco_stats->{results} = \@results; + + my $encoded_data; + eval { + if (defined($self->{option_results}->{prettify})) { + $encoded_data = JSON::XS->new->utf8->canonical(1)->pretty->encode($disco_stats); + } else { + $encoded_data = JSON::XS->new->utf8->canonical(1)->encode($disco_stats); + } + }; + if ($@) { + $encoded_data = '{"code":"encode_error","message":"Cannot encode discovered data into JSON format"}'; + } + + $self->{output}->output_add(short_msg => $encoded_data); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1); +} + +1; + +__END__ + +=head1 MODE + +Resources discovery. + +=over 8 + +=item B<--prettify> + +Prettify JSON output. + +=back + +=cut diff --git a/src/apps/vmware/vsphere8/esx/mode/hoststatus.pm b/src/apps/vmware/vsphere8/esx/mode/hoststatus.pm new file mode 100644 index 0000000000..6d86c2e6e5 --- /dev/null +++ b/src/apps/vmware/vsphere8/esx/mode/hoststatus.pm @@ -0,0 +1,172 @@ +# +# Copyright 2024 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::hoststatus; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); + +sub custom_power_status_output { + my ($self, %options) = @_; + + return 'power state is ' . $self->{result_values}->{power_state}; +} + +sub custom_connection_status_output { + my ($self, %options) = @_; + + return 'connection state is ' . $self->{result_values}->{connection_state}; +} + +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']); +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { + name => 'host', + type => 1, + cb_prefix_output => 'prefix_host_output', + message_multiple => 'All ESX Hosts are ok' + } + ]; + + $self->{maps_counters}->{host} = [ + { + label => 'power-status', + type => 2, + set => { + key_values => [ { name => 'display' }, { name => 'power_state' } ], + 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, + 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_threshold_check => \&catalog_status_threshold_ng + } + } + ]; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $response = $options{custom}->request_api( + 'endpoint' => '/vcenter/host', + 'method' => 'GET' + ); + + $self->{host} = {}; + foreach my $host (@{$response}) { + next if (!defined($host->{name}) || $host->{name} !~ $self->{option_results}->{esx_name}); + + $self->{host}->{$host->{host}} = { + display => $host->{name}, + power_state => $host->{power_state}, + connection_state => $host->{connection_state}, + id => $host->{host}, + }; + } + if (scalar(keys %{$self->{host}}) == 0) { + $self->{output}->add_option_msg(short_msg => "No ESX Host found."); + $self->{output}->option_exit(); + } + return 1; +} + +1; + +__END__ + +=head1 MODE + +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. +The value should be a Perl expression using the %{power_state} macro. + +=item B<--critical-power-status> + +Define the critical threshold for the power status of the ESX host. +The value should be a Perl expression using the %{power_state} macro. +Default: '%{power_state} !~ /^powered_on$/i' + +=item B<--warning-connection-status> + +Define the warning threshold for the connection status of the ESX host. +The value should be a Perl expression using the %{connection_state} macro. + +=item B<--critical-connection-status> + +Define the critical threshold for the connection status of the ESX host. +The value should be a Perl expression using the %{connection_state} macro. +Default: '%{connection_state} !~ /^connected$/i' + +=back + +=cut diff --git a/src/apps/vmware/vsphere8/esx/plugin.pm b/src/apps/vmware/vsphere8/esx/plugin.pm new file mode 100644 index 0000000000..e73ef136aa --- /dev/null +++ b/src/apps/vmware/vsphere8/esx/plugin.pm @@ -0,0 +1,50 @@ +# +# Copyright 2024 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::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_custom); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '0.1'; + $self->{modes} = { + 'discovery' => 'apps::vmware::vsphere8::esx::mode::discovery', + 'host-status' => 'apps::vmware::vsphere8::esx::mode::hoststatus' + }; + + $self->{custom_modes}->{api} = 'apps::vmware::vsphere8::custom::api'; + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Monitor VMware physical hosts through vSphere 8 REST API. + +=cut diff --git a/src/centreon/plugins/misc.pm b/src/centreon/plugins/misc.pm index 29d4f7df4f..b44cd710c1 100644 --- a/src/centreon/plugins/misc.pm +++ b/src/centreon/plugins/misc.pm @@ -745,6 +745,546 @@ sub check_security_whitelist { return 0; } +sub json_decode { + my ($content) = @_; + + $content =~ s/\r//mg; + my $object; + eval { + $object = JSON::XS->new->utf8->decode($content); + }; + if ($@) { + print STDERR "Cannot decode JSON string: $@" . "\n"; + return undef; + } + + return $object; +} + +sub json_encode { + my ($object) = @_; + + $object =~ s/\r//mg; + my $encoded; + eval { + $encoded = encode_json($object); + }; + if ($@) { + print STDERR 'Cannot encode object to JSON. Error message: ' . $@; + return undef; + } + + return $encoded; +} + + 1; __END__ + +=head1 NAME + +centreon::plugins::misc - A collection of miscellaneous utility functions for Centreon plugins. + +=head1 SYNOPSIS + + use centreon::plugins::misc; + + my $result = centreon::plugins::misc::execute( + command => 'ls', + command_options => '-l' + ); + +=head1 DESCRIPTION + +The `centreon::plugins::misc` module provides a variety of utility functions that can be used in Centreon plugins. These functions include command execution, string manipulation, file handling, and more. + +=head1 METHODS + +=head2 execute + + my $result = centreon::plugins::misc::execute(%options); + +Executes a command and returns the result. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The command to execute. + +=item * C - Options for the command. + +=item * C - Timeout for the command execution. + +=back + +=back + +=head2 windows_execute + + my ($stdout, $exit_code) = centreon::plugins::misc::windows_execute(%options); + +Executes a command on Windows and returns the output and exit code. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The command to execute. + +=item * C - Options for the command. + +=item * C - Timeout for the command execution. + +=back + +=back + +=head2 unix_execute + + my $stdout = centreon::plugins::misc::unix_execute(%options); + +Executes a command on Unix and returns the output. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The command to execute. + +=item * C - Options for the command. + +=item * C - Timeout for the command execution. + +=back + +=back + +=head2 mymodule_load + + my $result = centreon::plugins::misc::mymodule_load(%options); + +Loads a Perl module dynamically. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The module to load. + +=item * C - Error message to display if the module cannot be loaded. + +=back + +=back + +=head2 backtick + + my ($status, $output, $exit_code) = centreon::plugins::misc::backtick(%options); + +Executes a command using backticks and returns the status, output, and exit code. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The command to execute. + +=item * C - Arguments for the command. + +=item * C - Timeout for the command execution. + +=back + +=back + +=head2 is_empty + + my $is_empty = centreon::plugins::misc::is_empty($value); + +Checks if a value is empty. + +=over 4 + +=item * C<$value> - The value to check. + +=back + +=head2 trim + + my $trimmed_value = centreon::plugins::misc::trim($value); + +Trims whitespace from a string. + +=over 4 + +=item * C<$value> - The string to trim. + +=back + +=head2 powershell_encoded + + my $encoded = centreon::plugins::misc::powershell_encoded($value); + +Encodes a string for use in PowerShell. + +=over 4 + +=item * C<$value> - The string to encode. + +=back + +=head2 powershell_escape + + my $escaped = centreon::plugins::misc::powershell_escape($value); + +Escapes special characters in a string for use in PowerShell. + +=over 4 + +=item * C<$value> - The string to escape. + +=back + +=head2 minimal_version + + my $is_minimal = centreon::plugins::misc::minimal_version($version_src, $version_dst); + +Checks if a version is at least a specified version. + +=over 4 + +=item * C<$version_src> - The source version. + +=item * C<$version_dst> - The destination version. + +=back + +=head2 change_seconds + + my $formatted_time = centreon::plugins::misc::change_seconds(%options); + +Converts seconds into a human-readable format. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The number of seconds. + +=item * C - The starting unit. + +=back + +=back + +=head2 scale_bytesbit + + my $scaled_value = centreon::plugins::misc::scale_bytesbit(%options); + +Scales a value between bytes and bits. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The value to scale. + +=item * C - The source unit. + +=item * C - The destination unit. + +=back + +=back + +=head2 convert_bytes + + my $bytes = centreon::plugins::misc::convert_bytes(%options); + +Converts a value to bytes. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The value to convert. + +=item * C - The unit of the value. + +=back + +=back + +=head2 convert_fahrenheit + + my $celsius = centreon::plugins::misc::convert_fahrenheit(%options); + +Converts a temperature from Fahrenheit to Celsius. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The temperature in Fahrenheit. + +=back + +=back + +=head2 expand_exponential + + my $expanded = centreon::plugins::misc::expand_exponential(%options); + +Expands an exponential value to its full form. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The exponential value. + +=back + +=back + +=head2 alert_triggered + + my $is_triggered = centreon::plugins::misc::alert_triggered(%options); + +Checks if an alert is triggered based on thresholds. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The value to check. + +=item * C - The warning threshold. + +=item * C - The critical threshold. + +=back + +=back + +=head2 parse_threshold + + my ($status, $threshold) = centreon::plugins::misc::parse_threshold(%options); + +Parses a threshold string. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The threshold string. + +=back + +=back + +=head2 get_threshold_litteral + + my $threshold_str = centreon::plugins::misc::get_threshold_litteral(%options); + +Returns the literal representation of a threshold. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - Indicates if the threshold is inclusive. + +=item * C - The start of the threshold. + +=item * C - The end of the threshold. + +=back + +=back + +=head2 set_timezone + + my $timezone = centreon::plugins::misc::set_timezone(%options); + +Sets the timezone. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The name of the timezone. + +=back + +=back + +=head2 uniq + + my @unique = centreon::plugins::misc::uniq(@values); + +Returns a list of unique values. + +=over 4 + +=item * C<@values> - The list of values. + +=back + +=head2 eval_ssl_options + + my $ssl_context = centreon::plugins::misc::eval_ssl_options(%options); + +Evaluates SSL options. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The SSL options. + +=back + +=back + +=head2 slurp_file + + my $content = centreon::plugins::misc::slurp_file(%options); + +Reads the content of a file. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The file to read. + +=back + +=back + +=head2 sanitize_command_param + + my $sanitized = centreon::plugins::misc::sanitize_command_param(%options); + +Sanitizes a command parameter. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The value to sanitize. + +=back + +=back + +=head2 check_security_command + + my $status = centreon::plugins::misc::check_security_command(%options); + +Checks the security of a command. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The command to check. + +=item * C - Options for the command. + +=back + +=back + +=head2 check_security_whitelist + + my $status = centreon::plugins::misc::check_security_whitelist(%options); + +Checks if a command is in the security whitelist. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The command to check. + +=item * C - Options for the command. + +=back + +=back + +=head2 json_decode + + my $decoded = centreon::plugins::misc::json_decode($content); + +Decodes a JSON string. + +=over 4 + +=item * C<$content> - The JSON string to decode and transform into an object. + +=back + +=head2 json_encode + + my $encoded = centreon::plugins::misc::json_encode($object); + +Encodes an object to a JSON string. + +=over 4 + +=item * C<$object> - The object to encode. + +=back + +=head1 AUTHOR + +Centreon + +=head1 LICENSE + +Licensed under the Apache License, Version 2.0. + +=cut diff --git a/src/centreon/plugins/passwordmgr/centreonvault.pm b/src/centreon/plugins/passwordmgr/centreonvault.pm index 555cc6cc66..c42a2a8032 100644 --- a/src/centreon/plugins/passwordmgr/centreonvault.pm +++ b/src/centreon/plugins/passwordmgr/centreonvault.pm @@ -25,6 +25,11 @@ use warnings; use Data::Dumper; use centreon::plugins::http; use JSON::XS; +use MIME::Base64; +use Crypt::OpenSSL::AES; +use centreon::plugins::statefile; + +my $VAULT_PATH_REGEX = qr/^secret::hashicorp_vault::([^:]+)::(.+)$/; sub new { my ($class, %options) = @_; @@ -32,21 +37,29 @@ sub new { bless $self, $class; if (!defined($options{output})) { - print "Class PasswordMgr: Need to specify 'output' argument.\n"; + print "Class PasswordMgr needs an 'output' argument that must be of type centreon::plugins::output.\n"; exit 3; } if (!defined($options{options})) { - $options{output}->add_option_msg(short_msg => "Class PasswordMgr: Need to specify 'options' argument."); + print "Class PasswordMgr needs an 'options' argument that must be of type centreon::plugins::options.\n"; $options{output}->option_exit(); } $options{options}->add_options(arguments => { - 'vault-config:s' => { name => 'vault_config', default => '/etc/centreon-engine/centreonvault.json'}, + 'vault-config:s' => { name => 'vault_config', default => '/etc/centreon-engine/centreonvault.json'}, + 'vault-cache:s' => { name => 'vault_cache', default => '/var/lib/centreon/centplugins/centreonvault_session'}, + 'vault-env-file:s' => { name => 'vault_env_file', default => '/usr/share/centreon/.env'}, }); + $options{options}->add_help(package => __PACKAGE__, sections => 'VAULT OPTIONS'); $self->{output} = $options{output}; - $self->{http} = centreon::plugins::http->new(%options, noptions => 1, default_backend => 'curl'); + + # to access the vault, http protocol management is needed + $self->{http} = centreon::plugins::http->new(%options, noptions => 1, default_backend => 'curl', insecure => 1); + + # to store the token and its expiration date, a statefile is needed + $self->{cache} = centreon::plugins::statefile->new(); return $self; } @@ -56,20 +69,21 @@ sub extract_map_options { $self->{map_option} = []; - # Parse all options to find '/\{.*\:\:secret\:\:(.*)\}/' dedicated patern in value and add entries in map_option + # Parse all options to find '/# .*\:\:secret\:\:(.*)/' pattern in the options values and add entries in map_option foreach my $option (keys %{$options{option_results}}) { if (defined($options{option_results}{$option})) { next if ($option eq 'map_option'); if (ref($options{option_results}{$option}) eq 'ARRAY') { foreach (@{$options{option_results}{$option}}) { - if ($_ =~ /\{.*\:\:secret\:\:(.*)\:\:(.*)\}/i) { - push (@{$self->{request_endpoint}}, "$1::/v1/".$2); + if ($_ =~ $VAULT_PATH_REGEX) { + push (@{$self->{request_endpoint}}, "/v1/$1::$2"); push (@{$self->{map_option}}, $option."=%".$_); } } } else { - if ($options{option_results}{$option} =~ /\{.*\:\:secret\:\:(.*)\:\:(.*)\}/i) { - push (@{$self->{request_endpoint}}, "$1::/v1/".$2); + + if (my ($path, $secret) = $options{option_results}{$option} =~ $VAULT_PATH_REGEX) { + push (@{$self->{request_endpoint}}, "/v1/" . $path . "::" . $secret); push (@{$self->{map_option}}, $option."=%".$options{option_results}{$option}); } } @@ -80,95 +94,280 @@ sub extract_map_options { sub vault_settings { my ($self, %options) = @_; - if (!defined($options{option_results}->{vault_config}) - || $options{option_results}->{vault_config} eq '') { - $self->{output}->add_option_msg(short_msg => "Please set --vault-config option"); + if (centreon::plugins::misc::is_empty($options{option_results}->{vault_config})) { + $self->{output}->add_option_msg(short_msg => "Please provide a Centreon Vault configuration file path with --vault-config option"); $self->{output}->option_exit(); } if (! -f $options{option_results}->{vault_config}) { - $self->{output}->add_option_msg(short_msg => "Cannot find file '$options{option_results}->{vault_config}'"); + $self->{output}->add_option_msg(short_msg => "File '$options{option_results}->{vault_config}' could not be found."); $self->{output}->option_exit(); } - + $self->{vault_cache} = $options{option_results}->{vault_cache}; + $self->{vault_env_file} = $options{option_results}->{vault_env_file}; + $self->{vault_config} = $options{option_results}->{vault_config}; + + my $file_content = do { local $/ = undef; if (!open my $fh, "<", $options{option_results}->{vault_config}) { - $self->{output}->add_option_msg(short_msg => "Could not open file $options{option_results}->{vault_config}: $!"); + $self->{output}->add_option_msg(short_msg => "Could not read file $options{option_results}->{vault_config}: $!"); $self->{output}->option_exit(); } <$fh>; }; - my $json; + # decode the JSON content of the file + my $json = centreon::plugins::misc::json_decode($file_content); + if (!defined($json)) { + $self->{output}->add_option_msg(short_msg => "Cannot decode JSON : $file_content\n"); + $self->{output}->option_exit(); + } + + # set the default values + $self->{vault}->{protocol} = 'https'; + $self->{vault}->{url} = '127.0.0.1'; + $self->{vault}->{port} = '8100'; + + # define the list of expected attributes in the JSON file + my @valid_json_options = ( + 'protocol', + 'url', + 'port', + 'root_path', + 'token', + 'secret_id', + 'role_id' + ); + + # set the object fields when the json fields are not empty + foreach my $valid_option (@valid_json_options) { + $self->{vault}->{$valid_option} = $json->{$valid_option} + if ( !centreon::plugins::misc::is_empty( $json->{ $valid_option } ) ); + } + + return 1; +} + +sub get_decryption_key { + my ($self, %options) = @_; + + # try getting APP_SECRET from the environment variables + if ( !centreon::plugins::misc::is_empty($ENV{'APP_SECRET'}) ) { + return $ENV{'APP_SECRET'}; + } + + # try getting APP_SECRET defined in the env file (default: /usr/share/centreon/.env) file + my $fh; + return undef if (!open $fh, "<", $self->{vault_env_file}); + for my $line (<$fh>) { + if ($line =~ /^APP_SECRET=(.*)$/) { + return $1; + } + } + + return undef; +} + +sub extract_and_decrypt { + my ($self, %options) = @_; + + my $input = decode_base64($options{data}); + my $key = $options{key}; + + # with AES-256, the IV length must 16 bytes + my $iv_length = 16; + # extract the IV, the hashed data, the encrypted data + my $iv = substr($input, 0, $iv_length); # initialization vector + my $hashed_data = substr($input, $iv_length, 64); # hmac of the original data, for integrity control + my $encrypted_data = substr($input, $iv_length + 64); # data to decrypt + + # Creating the AES decryption object + my $cipher; eval { - $json = JSON::XS->new->utf8->decode($file_content); + $cipher = Crypt::OpenSSL::AES->new( + $key, + { + 'cipher' => 'AES-256-CBC', + 'iv' => $iv + } + ); }; if ($@) { - $self->{output}->add_option_msg(short_msg => "Cannot decode json file"); + $self->{output}->add_option_msg(short_msg => "There was an error while creating the AES object: " . $@); $self->{output}->option_exit(); } - foreach my $vault_name (keys %$json) { - $self->{$vault_name}->{vault_protocol} = 'https'; - $self->{$vault_name}->{vault_address} = '127.0.0.1'; - $self->{$vault_name}->{vault_port} = '8100'; + # Decrypting the data + my $decrypted_data; + eval {$decrypted_data = $cipher->decrypt($encrypted_data);}; + if ($@) { + $self->{output}->add_option_msg(short_msg => "There was an error while decrypting an AES-encrypted data: " . $@); + $self->{output}->option_exit(); + } - $self->{$vault_name}->{vault_protocol} = $json->{$vault_name}->{'vault-protocol'} - if ($json->{$vault_name}->{'vault-protocol'} && $json->{$vault_name}->{'vault-protocol'} ne ''); - $self->{$vault_name}->{vault_address} = $json->{$vault_name}->{'vault-address'} - if ($json->{$vault_name}->{'vault-address'} && $json->{$vault_name}->{'vault-address'} ne ''); - $self->{$vault_name}->{vault_port} = $json->{$vault_name}->{'vault-port'} - if ($json->{$vault_name}->{'vault-port'} && $json->{$vault_name}->{'vault-port'} ne ''); - $self->{$vault_name}->{vault_token} = $json->{$vault_name}->{'vault-token'} - if ($json->{$vault_name}->{'vault-token'} && $json->{$vault_name}->{'vault-token'} ne ''); + return $decrypted_data; +} + +sub is_token_still_valid { + my ($self) = @_; + if ( + !defined($self->{auth}) + || centreon::plugins::misc::is_empty($self->{auth}->{token}) + || centreon::plugins::misc::is_empty($self->{auth}->{expiration_epoch}) + || $self->{auth}->{expiration_epoch} !~ /\d+/ + || $self->{auth}->{expiration_epoch} <= time() + ) { + $self->{output}->output_add(long_msg => "The token is missing or has expired or is invalid.", debug => 1); + return undef; } + $self->{output}->output_add(long_msg => "The cached token is still valid.", debug => 1); + # Possible enhancement: check the token validity by calling this endpoint: /v1/auth/token/lookup-self + # {"request_id":"XXXXX","lease_id":"","renewable":false,"lease_duration":0,"data":{"accessor":"XXXXXXX","creation_time":1732294406,"creation_ttl":2764800,"display_name":"approle","entity_id":"XXX","expire_time":"2024-12-24T16:53:26.932122122Z","explicit_max_ttl":0,"id":"hvs.secretToken","issue_time":"2024-11-22T16:53:26.932129132Z","meta":{"role_name":"myvault"},"num_uses":0,"orphan":true,"path":"auth/approle/login","policies":["default","myvault"],"renewable":true,"ttl":2764724,"type":"service"},"wrap_info":null,"warnings":null,"auth":null,"mount_type":"token"} + + return 1; } +sub check_authentication { + my ($self, %options) = @_; + + # prepare the cache (aka statefile) + $self->{cache}->check_options(option_results => $options{option_results}); + my ($dir, $file, $suffix) = $options{option_results}->{vault_cache} =~ /^(.*\/)([^\/]+)(_.*)?$/; + + # Try reading the cache file + if ($self->{cache}->read( + statefile => $file, + statefile_suffix => defined($suffix) ? $suffix : '', + statefile_dir => $dir, + statefile_format => 'json' + )) { + # if the cache file could be read, get the token and its expiration date + $self->{auth} = { + token => $self->{cache}->get(name => 'token'), + expiration_epoch => $self->{cache}->get(name => 'expiration_epoch') + }; + } + + # if it is not valid, authenticate to get a new token + if ( !$self->is_token_still_valid() ) { + return $self->authenticate(); + } + + return 1; +} + +sub authenticate { + my ($self) = @_; + + # initial value: assuming the role and secret id might not be encrypted + my $role_id = $self->{vault}->{role_id}; + my $secret_id = $self->{vault}->{secret_id}; + if (centreon::plugins::misc::is_empty($role_id) || centreon::plugins::misc::is_empty($secret_id)) { + $self->{output}->add_option_msg(short_msg => "Unable to authenticate to the vault: role_id or secret_id is empty."); + $self->{output}->option_exit(); + } + my $decryption_key = $self->get_decryption_key(); + + # Decrypt the role_id and the secret_id if we have a decryption key + if ( !centreon::plugins::misc::is_empty($decryption_key) ) { + $role_id = $self->extract_and_decrypt( + data => $role_id, + key => $decryption_key + ); + $secret_id = $self->extract_and_decrypt( + data => $secret_id, + key => $decryption_key + ); + } + + # Authenticate to get the token + my ($auth_result_json) = $self->{http}->request( + hostname => $self->{vault}->{url}, + port => $self->{vault}->{port}, + proto => $self->{vault}->{protocol}, + method => 'POST', + url_path => "/v1/auth/approle/login", + query_form_post => "role_id=$role_id&secret_id=$secret_id", + header => [ + 'Content-Type: application/x-www-form-urlencoded', + 'Accept: */*', + 'X-Vault-Request: true', + 'User-Agent: Centreon-Plugins' + ] + ); + + # Convert the response into a JSON object + my $auth_result_obj = centreon::plugins::misc::json_decode($auth_result_json); + if (!defined($auth_result_obj)) { + # exit with UNKNOWN status + $self->{output}->add_option_msg(short_msg => "Cannot decode JSON response from the vault server: $auth_result_json."); + $self->{output}->option_exit(); + } + # Authentication to the vault has passed + # store the token (.auth.client_token) and its expiration date (current date + .lease_duration) + my $expiration_epoch = -1; + my $lease_duration = $auth_result_obj->{auth}->{lease_duration}; + if ( defined($lease_duration) + && $lease_duration =~ /\d+/ + && $lease_duration > 0 ) { + $expiration_epoch = time() + $lease_duration; + } + $self->{auth} = { + 'token' => $auth_result_obj->{auth}->{client_token}, + 'expiration_epoch' => $expiration_epoch + }; + $self->{cache}->write(data => $self->{auth}, name => 'auth'); + + $self->{output}->output_add(long_msg => "Authenticating worked. Token valid until " + . localtime($self->{auth}->{expiration_epoch}), debug => 1); + + return 1; +} + + + sub request_api { my ($self, %options) = @_; $self->vault_settings(%options); + # check the authentication + if (!$self->check_authentication(%options)) { + $self->{output}->add_option_msg(short_msg => "Unable to authenticate to the vault."); + $self->{output}->option_exit(); + } + $self->{lookup_values} = {}; + foreach my $item (@{$self->{request_endpoint}}) { # Extract vault name configuration from endpoint # 'vault::/v1//monitoring/hosts/7ad55afc-fa9e-4851-85b7-e26f47e421d7' - my ($vault_name, $endpoint); - if ($item =~ /(.*)\:\:(.*)/i) { - $vault_name = $1; - $endpoint = $2; - } + my ($endpoint, $secret) = $item =~ /^(.*)\:\:(.*)$/; - if (!defined($self->{$vault_name})) { - $self->{output}->add_option_msg(short_msg => "Cannot get vault access for: $vault_name"); - $self->{output}->option_exit(); - } - - my $headers = ['Accept: application/json']; - if (defined($self->{$vault_name}->{vault_token})) { - push @$headers, 'X-Vault-Token: ' . $self->{$vault_name}->{vault_token}; - } my ($response) = $self->{http}->request( - hostname => $self->{$vault_name}->{vault_address}, - port => $self->{$vault_name}->{vault_port}, - proto => $self->{$vault_name}->{vault_protocol}, + hostname => $self->{vault}->{url}, + port => $self->{vault}->{port}, + proto => $self->{vault}->{protocol}, method => 'GET', url_path => $endpoint, - header => $headers + header => [ + 'Accept: application/json', + 'User-Agent: Centreon-Plugins', + 'X-Vault-Request: true', + 'X-Vault-Token: ' . $self->{auth}->{token} + ] ); - - my $json; - eval { - $json = JSON::XS->new->utf8->decode($response); - }; - if ($@) { - $self->{output}->add_option_msg(short_msg => "Cannot decode Vault JSON response: $@"); + + my $json = centreon::plugins::misc::json_decode($response); + if (!defined($json->{data})) { + $self->{output}->add_option_msg(short_msg => "Cannot decode Vault JSON response: $response"); $self->{output}->option_exit(); }; - foreach (keys %{$json->{data}}) { - $self->{lookup_values}->{'{' . $_ . '::secret::' . $vault_name . '::' . substr($endpoint, index($endpoint, '/', 1) + 1) . '}'} = $json->{data}->{$_}; + foreach my $secret_name (keys %{$json->{data}->{data}}) { + # e.g. secret::hashicorp_vault::myspace/data/snmp::PubCommunity + $self->{lookup_values}->{'secret::hashicorp_vault::' . substr($endpoint, index($endpoint, '/', 1) + 1) . '::' . $secret_name} = $json->{data}->{data}->{$secret_name}; } } } @@ -176,16 +375,11 @@ sub request_api { sub do_map { my ($self, %options) = @_; - foreach (@{$self->{map_option}}) { - next if (! /^(.+?)=%(.+)$/); - - my ($option, $map) = ($1, $2); - - $map = $self->{lookup_values}->{$2} if (defined($self->{lookup_values}->{$2})); - $option =~ s/-/_/g; - $options{option_results}->{$option} = $map; + foreach my $mapping (@{$self->{map_option}}) { + my ($opt_name, $opt_value) = $mapping =~ /^(.+?)=%(.+)$/ or next; + $opt_name =~ s/-/_/g; + $options{option_results}->{$opt_name} = defined($self->{lookup_values}->{$opt_value}) ? $self->{lookup_values}->{$opt_value} : $opt_value; } - } sub manage_options { @@ -219,7 +413,15 @@ To be used with an array containing keys/values saved in a secret path by resour =item B<--vault-config> -The path to the file defining access to the Centreon vault (/etc/centreon-engine/centreonvault.json by default) +Path to the file defining access to the Centreon vault (default: C). + +=item B<--vault-cache> + +Path to the file where the token to access the Centreon vault will be stored (default: C). + +=item B<--vault-env-file> + +Path to the file containing the APP_SECRET variable (default: C). =back @@ -228,3 +430,129 @@ The path to the file defining access to the Centreon vault (/etc/centreon-engine B. =cut + +=head1 NAME + +centreon::plugins::passwordmgr::centreonvault - Module for getting secrets from Centreon Vault. + +=head1 SYNOPSIS + + use centreon::plugins::passwordmgr::centreonvault; + + my $vault = centreon::plugins::passwordmgr::centreonvault->new(output => $output, options => $options); + $vault->manage_options(option_results => \%option_results); + +=head1 DESCRIPTION + +This module provides methods to retrieve secrets (passwords, SNMP communities, ...) from Centreon Vault (adequately +configured HashiCorp Vault). +It extracts and decrypt the information required to login to the vault from the vault configuration file, authenticates +to the vault, retrieves secrets, and maps them to the corresponding options for the centreon-plugins to work with. + +=head1 METHODS + +=head2 new + + my $vault = centreon::plugins::passwordmgr::centreonvault->new(%options); + +Creates a new `centreon::plugins::passwordmgr::centreonvault` object. The `%options` hash can include: + +=over 4 + +=item * output + +The output object for displaying debug and error messages. + +=item * options + +The options object for handling command-line options. + +=back + +=head2 extract_map_options + + $vault->extract_map_options(option_results => \%option_results); + +Extracts and maps options that match the Vault path regex pattern (C). The +`%option_results` hash should include the command-line options. + +=head2 vault_settings + + $vault->vault_settings(option_results => \%option_results); + +Loads and validates the Vault configuration from the specified file. +The `%option_results` hash should include the command-line options. + +=head2 get_decryption_key + + my $key = $vault->get_decryption_key(); + +Retrieves the decryption key from C environment variable. It will look for it in the the specified +environment file if it is not available in the environment variables. + +=head2 extract_and_decrypt + + my $decrypted_data = $vault->extract_and_decrypt(data => $data, key => $key); + +Decrypts the given data using the specified key. The options must include: + +=over 4 + +=item * data + +The base64-encoded data to decrypt. + +=item * key + +The base64-encoded decryption key. + +=back + +=head2 is_token_still_valid + + my $is_valid = $vault->is_token_still_valid(); + +Checks if there is a token in the cache and if it is still valid based on its expiration date. Returns 1 if valid, otherwise undef. + +=head2 check_authentication + + $vault->check_authentication(option_results => \%option_results); + +Checks the authentication status and retrieves a new token if necessary. The `%option_results` hash should include the command-line options. + +=head2 authenticate + + $vault->authenticate(); + +Authenticates to the Vault, retrieves a new token and stores it in the dedicated cache file. + +=head2 request_api + + $vault->request_api(option_results => \%option_results); + +Sends requests to the Vault API to retrieve secrets. The `%option_results` hash should include the command-line options. + +=head2 do_map + + $vault->do_map(option_results => \%option_results); + +Maps the retrieved secrets to the corresponding options. The `%option_results` hash should include the command-line options. +Calling this method will update the `%option_results` hash replacing vault paths with the retrieved secrets. + +=head2 manage_options + + $vault->manage_options(option_results => \%option_results); + +Manages the options by extracting, requesting, and mapping secrets. The `%option_results` hash should include the command-line options. + +NB: This is the main method to be called from outside the module. All other methods are intended to be used internally. + +=head1 AUTHOR + +Centreon + +=head1 LICENSE + +Licensed under the Apache License, Version 2.0. + +=cut diff --git a/src/centreon/plugins/statefile.pm b/src/centreon/plugins/statefile.pm index 62b58c99bf..f09bb32a74 100644 --- a/src/centreon/plugins/statefile.pm +++ b/src/centreon/plugins/statefile.pm @@ -170,7 +170,10 @@ sub check_options { } $self->{statefile_dir} = $options{option_results}->{statefile_dir}; - if ($self->{statefile_dir} ne $default_dir && defined($options{option_results}->{statefile_concat_cwd})) { + if (defined($self->{statefile_dir}) + && $self->{statefile_dir} ne $default_dir + && defined($options{option_results}->{statefile_concat_cwd}) + ) { centreon::plugins::misc::mymodule_load( output => $self->{output}, module => 'Cwd', @@ -443,11 +446,185 @@ __END__ =head1 NAME -Statefile class +centreon::plugins::statefile - A module for managing state files with various storage backends. =head1 SYNOPSIS -- + use centreon::plugins::statefile; + + my $statefile = centreon::plugins::statefile->new( + output => $output, + options => $options + ); + + $statefile->check_options(option_results => $option_results); + $statefile->read(statefile => 'my_statefile'); + my $data = $statefile->get(name => 'some_key'); + $statefile->write(data => { some_key => 'some_value' }); + +=head1 DESCRIPTION + +The `centreon::plugins::statefile` module provides methods to manage state files (files storing the data to keep from an +execution to the next one), supporting various storage backends such as local files, Memcached, and Redis. It also supports encryption and different serialization formats. + +=head1 METHODS + +=head2 new + + my $statefile = centreon::plugins::statefile->new(%options); + +Creates a new `centreon::plugins::statefile` object. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - An C object to log error messages. + +=item * C - A C object to add command-line options. + +=back + +=back + +=head2 check_options + + $statefile->check_options(%options); + +Checks and processes the provided options. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - A hash of option results. + +=back + +=back + +=head2 read + + $statefile->read(%options); + +Reads the state file. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The name of the state file to read. + +=item * C - An optional suffix for the state file name. + +=item * C - An optional directory for the state file. + +=item * C - An optional flag to prevent the program from exiting on error. + +=back + +=back + +=head2 write + + $statefile->write(%options); + +Writes data to the state file. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - A hash reference containing the data to write. + +=back + +=back + +=head2 get + + my $value = $statefile->get(%options); + +Retrieves a value from the state file data. + +=over 4 + +=item * C<%options> - A hash of options. The following keys are supported: + +=over 8 + +=item * C - The key name of the value to retrieve. + +=back + +=back + +=head2 get_string_content + + my $string = $statefile->get_string_content(); + +Returns the state file data as a string. + +=head2 error + + my $error = $statefile->error(); + +Gets or sets the error state. + +=over 4 + +=item * C<$error> - An optional error value to set. + +=back + +=head1 EXAMPLES + +=head2 Creating a Statefile Object + + use centreon::plugins::statefile; + + my $statefile = centreon::plugins::statefile->new( + output => $output, + options => $options + ); + +=head2 Checking Options + + $statefile->check_options(option_results => $option_results); + +=head2 Reading a Statefile + + $statefile->read(statefile => 'my_statefile'); + +=head2 Writing to a Statefile + + $statefile->write(data => { some_key => 'some_value' }); + +=head2 Retrieving a Value + + my $value = $statefile->get(name => 'some_key'); + +=head2 Getting Statefile Data as a String + + my $string = $statefile->get_string_content(); + +=head1 AUTHOR + +Centreon + +=head1 LICENSE + +Licensed under the Apache License, Version 2.0. + +=cut =head1 RETENTION OPTIONS @@ -471,7 +648,7 @@ Set Redis database index. =item B<--failback-file> -Failback on a local file if Redis connection fails. +Fall back on a local file if Redis connection fails. =item B<--memexpiration> diff --git a/src/cloud/azure/database/elasticpool/mode/storage.pm b/src/cloud/azure/database/elasticpool/mode/storage.pm index 8be2a73c7e..dd150fbf87 100644 --- a/src/cloud/azure/database/elasticpool/mode/storage.pm +++ b/src/cloud/azure/database/elasticpool/mode/storage.pm @@ -56,8 +56,9 @@ sub custom_metric_calc { my ($self, %options) = @_; $self->{result_values}->{timeframe} = $options{new_datas}->{$self->{instance} . '_timeframe'}; - $self->{result_values}->{value} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{metric}}; - $self->{result_values}->{metric} = $options{extra_options}->{metric}; + $self->{result_values}->{value} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{metric}}; + $self->{result_values}->{metric} = $options{extra_options}->{metric}; + return 0; } @@ -67,8 +68,8 @@ sub custom_metric_threshold { my $exit = $self->{perfdata}->threshold_check( value => $self->{result_values}->{value}, threshold => [ - { label => 'critical-' . $metrics_mapping{$self->{result_values}->{metric}}->{label} , exit_litteral => 'critical' }, - { label => 'warning-' . $metrics_mapping{$self->{result_values}->{metric}}->{label}, exit_litteral => 'warning' } + { label => 'critical-' . $self->{thlabel}, exit_litteral => 'critical' }, + { label => 'warning-' . $self->{thlabel}, exit_litteral => 'warning' } ] ); return $exit; @@ -82,8 +83,8 @@ sub custom_metric_perfdata { nlabel => $metrics_mapping{$self->{result_values}->{metric}}->{nlabel}, unit => $metrics_mapping{$self->{result_values}->{metric}}->{unit}, value => sprintf('%.2f', $self->{result_values}->{value}), - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $metrics_mapping{$self->{result_values}->{metric}}->{label}), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $metrics_mapping{$self->{result_values}->{metric}}->{label}) + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{thlabel}), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{thlabel}) ); } @@ -112,7 +113,7 @@ sub prefix_statistics_output { sub long_output { my ($self, %options) = @_; - return "Checking Pool'" . $options{instance_value}->{display} . "' "; + return "Checking Pool '" . $options{instance_value}->{display} . "' "; } sub set_counters { @@ -128,7 +129,7 @@ sub set_counters { } ]; - foreach my $metric (keys %metrics_mapping) { + foreach my $metric (sort keys %metrics_mapping) { my $entry = { label => $metrics_mapping{$metric}->{label}, nlabel => $metrics_mapping{$metric}->{nlabel}, @@ -186,8 +187,8 @@ sub check_options { } foreach my $metric (keys %metrics_mapping) { - next if (defined($self->{option_results}->{filter_metric}) && $self->{option_results}->{filter_metric} ne '' - && $metric !~ /$self->{option_results}->{filter_metric}/); + next if ( !centreon::plugins::misc::is_empty($self->{option_results}->{filter_metric}) + && $metric !~ /$self->{option_results}->{filter_metric}/ ); push @{$self->{az_metrics}}, $metric; } @@ -254,48 +255,72 @@ __END__ =head1 MODE -Check Azure SQL Elastic Pool Storage metrics. +Monitor Azure SQL Elastic Pool Storage metrics. Example: Using resource name: -perl centreon_plugins.pl --plugin=cloud::azure::database::elasticpool::plugin --custommode=azcli --mode=storage ---resource=/elasticpools/ --resource-group= --aggregation='average' ---allocated-data-storage-percent='90' --verbose + perl centreon_plugins.pl --plugin=cloud::azure::database::elasticpool::plugin --custommode=azcli --mode=storage + --resource=/elasticpools/ --resource-group= --aggregation='average' + --allocated-data-storage-percent='90' --verbose Using resource ID: -perl centreon_plugins.pl --plugin=cloud::azure::compute::virtualmachine::plugin --custommode=azcli --mode=sessions ---resource='/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Sql/servers/xxx/elasticpools/xxx' ---aggregation='average' --allocated-data-storage-percent='90' --verbose + perl centreon_plugins.pl --plugin=cloud::azure::compute::virtualmachine::plugin --custommode=azcli --mode=sessions + --resource='/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Sql/servers/xxx/elasticpools/xxx' + --aggregation='average' --allocated-data-storage-percent='90' --verbose -Default aggregation: 'average' / 'minimum' and 'maximum' are valid. +Available aggregations: 'average' (default) 'minimum' and 'maximum'. =over 8 =item B<--resource> -Set resource name or ID (required). +Define the resource name or ID (required). =item B<--resource-group> -Set resource group (required if resource's name is used). +Define the resource group to monitor (required if the resource name is used). =item B<--filter-metric> Filter on specific metrics. The Azure format must be used, for example: 'allocated_data_storage_percent' (can be a regexp). -=item B<--warning-*> +=item B<--warning-allocated-data-storage> + +Thresholds. + +=item B<--critical-allocated-data-storage> + +Thresholds. + +=item B<--warning-allocated-data-storage-percent> + +Thresholds. + +=item B<--critical-allocated-data-storage-percent> + +Thresholds. + + +=item B<--warning-storage-percent> + +Thresholds. + +=item B<--critical-storage-percent> + +Thresholds. + +=item B<--warning-storage-used> + +Thresholds. -Warning threshold where * can be: 'allocated-data-storage', allocated-data-storage-percent', -'storage-percent', 'storage-used'. +=item B<--critical-storage-used> -=item B<--critical-*> +Thresholds. -Critical threshold where * can be: 'allocated-data-storage', allocated-data-storage-percent', -'storage-percent', 'storage-used'. =back diff --git a/src/hardware/devices/video/appeartv/snmp/mode/alarms.pm b/src/hardware/devices/video/appeartv/snmp/mode/alarms.pm index fc682e0002..30cd192736 100644 --- a/src/hardware/devices/video/appeartv/snmp/mode/alarms.pm +++ b/src/hardware/devices/video/appeartv/snmp/mode/alarms.pm @@ -30,15 +30,15 @@ use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold) sub custom_status_output { my ($self, %options) = @_; - + my $msg = sprintf("alarm [severity: %s] [source: %s] [text: %s] %s", $self->{result_values}->{severity}, - $self->{result_values}->{source}, $self->{result_values}->{text}, $self->{result_values}->{generation_time}); + $self->{result_values}->{source}, $self->{result_values}->{text}, $self->{result_values}->{generation_time}); return $msg; } sub custom_status_calc { my ($self, %options) = @_; - + $self->{result_values}->{source} = $options{new_datas}->{$self->{instance} . '_msgSourceName'}; $self->{result_values}->{text} = $options{new_datas}->{$self->{instance} . '_msgText'}; $self->{result_values}->{severity} = $options{new_datas}->{$self->{instance} . '_msgSeverity'}; @@ -47,24 +47,25 @@ sub custom_status_calc { return 0; } - sub set_counters { my ($self, %options) = @_; - + $self->{maps_counters_type} = [ - { name => 'alarms', type => 2, message_multiple => '0 problem(s) detected', display_counter_problem => { label => 'alerts', min => 0 }, - group => [ { name => 'alarm', skipped_code => { -11 => 1 } } ] + { name => 'alarms', type => 2, message_multiple => '0 problem(s) detected', display_counter_problem => { label => 'alerts', min => 0 }, + group => [ { name => 'alarm', skipped_code => { -11 => 1 } } ] } ]; - + $self->{maps_counters}->{alarm} = [ - { label => 'status', threshold => 0, set => { - key_values => [ { name => 'msgSourceName' }, { name => 'msgText' }, { name => 'since' }, { name => 'msgSeverity' }, { name => 'msgGenerationTime' } ], - closure_custom_calc => $self->can('custom_status_calc'), - closure_custom_output => $self->can('custom_status_output'), - closure_custom_perfdata => sub { return 0; }, - closure_custom_threshold_check => \&catalog_status_threshold, - } + { label => 'status', + threshold => 0, + set => { + key_values => [ { name => 'msgSourceName' }, { name => 'msgText' }, { name => 'since' }, { name => 'msgSeverity' }, { name => 'msgGenerationTime' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => \&catalog_status_threshold, + } }, ]; } @@ -73,16 +74,16 @@ sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options); bless $self, $class; - + $options{options}->add_options(arguments => - { - "filter-msg:s" => { name => 'filter_msg' }, - "warning-status:s" => { name => 'warning_status', default => '%{severity} =~ /minor|warning/i' }, - "critical-status:s" => { name => 'critical_status', default => '%{severity} =~ /critical|major/i' }, - "memory" => { name => 'memory' }, - }); - - centreon::plugins::misc::mymodule_load(output => $self->{output}, module => 'Date::Parse', + { + "filter-msg:s" => { name => 'filter_msg' }, + "warning-status:s" => { name => 'warning_status', default => '%{severity} =~ /minor|warning/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{severity} =~ /critical|major/i' }, + "memory" => { name => 'memory' }, + }); + + centreon::plugins::misc::mymodule_load(output => $self->{output}, module => 'Date::Parse', error_msg => "Cannot load module 'Date::Parse'."); $self->{statefile_cache} = centreon::plugins::statefile->new(%options); return $self; @@ -92,70 +93,76 @@ sub check_options { my ($self, %options) = @_; $self->SUPER::check_options(%options); - $self->change_macros(macros => ['warning_status', 'critical_status']); + $self->change_macros(macros => [ 'warning_status', 'critical_status' ]); if (defined($self->{option_results}->{memory})) { $self->{statefile_cache}->check_options(%options); } } -my %map_severity = (0 => 'indeterminate', 1 => 'critical', 2 => 'major', 3 => 'minor', - 4 => 'warning', 5 => 'cleared', 6 => 'notify'); +my %map_severity = (0 => 'indeterminate', + 1 => 'critical', + 2 => 'major', + 3 => 'minor', + 4 => 'warning', + 5 => 'cleared', + 6 => 'notify'); my $mapping = { - msgSourceName => { oid => '.1.3.6.1.4.1.23916.3.1.4.1.3' }, - msgText => { oid => '.1.3.6.1.4.1.23916.3.1.4.1.4' }, - msgGenerationTime => { oid => '.1.3.6.1.4.1.23916.3.1.4.1.6' }, # 2016-12-16 14:49:18 - msgSeverity => { oid => '.1.3.6.1.4.1.23916.3.1.4.1.13', map => \%map_severity }, + msgSourceName => { oid => '.1.3.6.1.4.1.23916.3.1.4.1.3' }, + msgText => { oid => '.1.3.6.1.4.1.23916.3.1.4.1.4' }, + msgGenerationTime => { oid => '.1.3.6.1.4.1.23916.3.1.4.1.6' }, # 2016-12-16 14:49:18 + msgSeverity => { oid => '.1.3.6.1.4.1.23916.3.1.4.1.13', map => \%map_severity }, }; sub manage_selection { my ($self, %options) = @_; $self->{alarms}->{global} = { alarm => {} }; - my $snmp_result = $options{snmp}->get_multiple_table(oids => [ - { oid => $mapping->{msgSourceName}->{oid} }, - { oid => $mapping->{msgText}->{oid} }, - { oid => $mapping->{msgGenerationTime}->{oid} }, - { oid => $mapping->{msgSeverity}->{oid} }, - ], return_type => 1); + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $mapping->{msgSourceName}->{oid} }, + { oid => $mapping->{msgText}->{oid} }, + { oid => $mapping->{msgGenerationTime}->{oid} }, + { oid => $mapping->{msgSeverity}->{oid} }, + ], + return_type => 1); my $last_time; if (defined($self->{option_results}->{memory})) { - $self->{statefile_cache}->read(statefile => "cache_appeartv_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port(). '_' . $self->{mode}); + $self->{statefile_cache}->read(statefile => "cache_appeartv_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode}); $last_time = $self->{statefile_cache}->get(name => 'last_time'); } - + my ($i, $current_time) = (1, time()); foreach my $oid (keys %{$snmp_result}) { next if ($oid !~ /^$mapping->{msgSeverity}->{oid}\.(.*)$/); my $instance = $1; my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); - + my $create_time = Date::Parse::str2time($result->{msgGenerationTime}); if (!defined($create_time)) { - $self->{output}->output_add(severity => 'UNKNOWN', - short_msg => "Can't Parse date '" . $result->{msgGenerationTime} . "'"); + $self->{output}->output_add(severity => 'UNKNOWN', + short_msg => "Can't Parse date '" . $result->{msgGenerationTime} . "'"); next; } - + next if (defined($self->{option_results}->{memory}) && defined($last_time) && $last_time > $create_time); if (defined($self->{option_results}->{filter_msg}) && $self->{option_results}->{filter_msg} ne '' && $result->{msgText} !~ /$self->{option_results}->{filter_msg}/) { $self->{output}->output_add(long_msg => "skipping '" . $result->{msgText} . "': no matching filter.", debug => 1); next; } - + my $diff_time = $current_time - $create_time; - + $self->{alarms}->{global}->{alarm}->{$i} = { %$result, since => $diff_time }; $i++; } - + if (defined($self->{option_results}->{memory})) { $self->{statefile_cache}->write(data => { last_time => $current_time }); } } - + 1; __END__ @@ -166,21 +173,21 @@ Check alarms. =over 8 -=item B<--filter-msg> +=item C<--filter-msg> Filter by message (can be a regexp). -=item B<--warning-status> +=item C<--warning-status> Define the conditions to match for the status to be WARNING (default: '%{severity} =~ /minor|warning/i') You can use the following variables: %{severity}, %{text}, %{source}, %{since} -=item B<--critical-status> +=item C<--critical-status> Define the conditions to match for the status to be CRITICAL (default: '%{severity} =~ /critical|major/i'). You can use the following variables: %{severity}, %{text}, %{source}, %{since} -=item B<--memory> +=item C<--memory> Only check new alarms. diff --git a/src/hardware/devices/video/appeartv/snmp/plugin.pm b/src/hardware/devices/video/appeartv/snmp/plugin.pm index 865f54e199..7cbeb18cf3 100644 --- a/src/hardware/devices/video/appeartv/snmp/plugin.pm +++ b/src/hardware/devices/video/appeartv/snmp/plugin.pm @@ -28,10 +28,10 @@ sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options); bless $self, $class; - + $self->{version} = '0.1'; %{$self->{modes}} = ( - 'alarms' => 'hardware::devices::video::appeartv::snmp::mode::alarms', + 'alarms' => 'hardware::devices::video::appeartv::snmp::mode::alarms', ); return $self; @@ -43,6 +43,6 @@ __END__ =head1 PLUGIN DESCRIPTION -Check AppeartTV in SNMP. +Check AppearTV in SNMP. =cut diff --git a/src/network/hp/procurve/snmp/mode/stack.pm b/src/network/hp/procurve/snmp/mode/stack.pm new file mode 100644 index 0000000000..290d790e27 --- /dev/null +++ b/src/network/hp/procurve/snmp/mode/stack.pm @@ -0,0 +1,312 @@ +# +# Copyright 2023 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::hp::procurve::snmp::mode::stack; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold catalog_status_calc); + +sub custom_member_status_output { + my ($self, %options) = @_; + + my $msg = sprintf( + 'role: %s [state: %s]', + $self->{result_values}->{role}, + $self->{result_values}->{state}, + ); + return $msg; +} + +sub custom_member_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{roleLast} = $options{old_datas}->{$self->{instance} . '_role'}; + $self->{result_values}->{role} = $options{new_datas}->{$self->{instance} . '_role'}; + + $self->{result_values}->{stateLast} = $options{old_datas}->{$self->{instance} . '_state'}; + $self->{result_values}->{state} = $options{new_datas}->{$self->{instance} . '_state'}; + if (!defined($options{old_datas}->{$self->{instance} . '_role'})) { + $self->{error_msg} = "buffer creation"; + return -2; + } + + return 0; +} + +sub custom_port_status_output { + my ($self, %options) = @_; + + my $msg = sprintf( + 'operational status: %s [admin status: %s]', + $self->{result_values}->{oper_status}, + $self->{result_values}->{admin_status} + ); + return $msg; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'member', + type => 3, + cb_prefix_output => 'prefix_member_output', + cb_long_output => 'member_long_output', + indent_long_output => ' ', + message_multiple => 'All stack members are ok', + group => + [ + { name => 'global', type => 0, skipped_code => { -10 => 1 } }, + { name => 'port', + display_long => 1, + cb_prefix_output => 'prefix_port_output', + message_multiple => 'All ports are ok', + type => 1, + skipped_code => { -10 => 1 } }, + ] + } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'member-status', threshold => 0, set => { + key_values => [ { name => 'role' }, { name => 'display' }, { name => 'state'} ], + closure_custom_calc => $self->can('custom_member_status_calc'), + closure_custom_output => $self->can('custom_member_status_output'), + closure_custom_perfdata => sub {return 0;}, + closure_custom_threshold_check => \&catalog_status_threshold, + } + }, + ]; + + $self->{maps_counters}->{port} = [ + { label => 'port-status', threshold => 0, set => { + key_values => + [ { name => 'oper_status' }, { name => 'admin_status' }, { name => 'display' } ], + closure_custom_calc => \&catalog_status_calc, + closure_custom_output => $self->can('custom_port_status_output'), + closure_custom_perfdata => sub {return 0;}, + closure_custom_threshold_check => \&catalog_status_threshold, + } + }, + ]; +} + +sub member_long_output { + my ($self, %options) = @_; + + return "checking stack member '" . $options{instance_value}->{display} . "'"; +} + +sub prefix_member_output { + my ($self, %options) = @_; + + return "Stack member '" . $options{instance_value}->{display} . "' "; +} + +sub prefix_port_output { + my ($self, %options) = @_; + + return "port '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'unknown-member-status:s' => { name => 'unknown_member_status', default => '' }, + 'warning-member-status:s' => { name => 'warning_member_status', default => '' }, + 'critical-member-status:s' => { name => 'critical_member_status', default => '%{role} ne %{roleLast}' }, + 'unknown-port-status:s' => { name => 'unknown_port_status', default => '' }, + 'warning-port-status:s' => { name => 'warning_port_status', default => '' }, + 'critical-port-status:s' => { + name => 'critical_port_status', + default => '%{admin_status} eq "up" and %{oper_status} ne "up"' + }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->change_macros( + macros => [ + 'unknown_member_status', 'warning_member_status', 'critical_member_status', + 'unknown_port_status', 'warning_port_status', 'critical_port_status' + ] + ); +} + +my $map_member_state = { + 0 => 'unusedId', + 1 => 'missing', + 2 => 'provision', + 3 => 'commander', + 4 => 'standby', + 5 => 'member', + 6 => 'shutdown', + 7 => 'booting', + 8 => 'communicationFailure', + 9 => 'incompatibleOs', + 10 => 'unknownState', + 11 => 'standbyBooting' +}; +my $map_member_role_status = { + 1 => 'active', + 2 => 'notInService', + 3 => 'notReady', + 4 => 'createAndGo', + 5 => 'createAndWait', + 6 => 'destroy' +}; +my $map_port_admin_status = { + 1 => 'enabled', + 2 => 'disabled' +}; +my $map_port_operation_status = { + 1 => 'up', + 2 => 'down', + 3 => 'disabled', + 4 => 'blocked' +}; + +my $mapping_member_table = { + stackMemberSerialNum => { oid => '.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.14' }, + stackMemberRoleStatus => { oid => '.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.7', map => $map_member_role_status }, + stackMemberState => { oid => '.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.9', map => $map_member_state }, +}; +my $mapping_port_table = { + stackPortAdminStatus => { oid => '.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.8', map => $map_port_admin_status }, + stackPortOperStatus => { oid => '.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.3', map => $map_port_operation_status } +}; + +my $oid_memberTableEntry = '.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1'; +my $oid_portTableEntry = '.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{member} = {}; + my $snmp_result = $options{snmp}->get_multiple_table( + oids => [ + { oid => $oid_memberTableEntry }, + { oid => $mapping_member_table->{stackMemberSerialNum}->{oid} }, + { oid => $mapping_member_table->{stackMemberRoleStatus}->{oid} }, + { oid => $mapping_member_table->{stackMemberState}->{oid} } + , + { oid => $oid_portTableEntry }, + { oid => $mapping_port_table->{stackPortAdminStatus}->{oid} }, + { oid => $mapping_port_table->{stackPortOperStatus}->{oid} }, + , + ], + nothing_quit => 1 + ); + + foreach my $oid (keys %{$snmp_result->{$oid_memberTableEntry}}) { + next if ($oid !~ /^$mapping_member_table->{stackMemberRoleStatus}->{oid}\.(.*)$/); + my $instance_id = $1; + my $result = $options{snmp}->map_instance( + mapping => $mapping_member_table, + results => $snmp_result->{$oid_memberTableEntry}, + instance => $instance_id); + + $self->{member}->{$result->{stackMemberSerialNum}} = { + display => $result->{stackMemberSerialNum}, + global => { + display => $result->{stackMemberSerialNum}, + role => $result->{stackMemberRoleStatus}, + state => $result->{stackMemberState}, + }, + port => {}, + }; + + foreach (keys %{$snmp_result->{$oid_portTableEntry}}) { + next if (!/^$mapping_port_table->{stackPortOperStatus}->{oid}\.$instance_id\.(.*?)\.(.*)$/); + my $port_name = $1; + my $result2 = $options{snmp}->map_instance( + mapping => $mapping_port_table, + results => $snmp_result->{$oid_portTableEntry}, + instance => $instance_id . '.' . $port_name . '.1'); + + $self->{member}->{$result->{stackMemberSerialNum}}->{port}->{$port_name} = { + display => $port_name, + admin_status => $result2->{stackPortAdminStatus}, + oper_status => $result2->{stackPortOperStatus}, + }; + } + } + + $self->{cache_name} = "hp_procurve_" . $self->{mode} . '_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . + (defined($self->{option_results}->{filter_counters}) ? + md5_hex($self->{option_results}->{filter_counters}) : + md5_hex('all')); +} + +1; + +__END__ + +=head1 MODE + +Check stack members. + +=over 8 + +=item B<--unknown-member-status> + +Define the conditions to match for the status to be UNKNOWN (Default: ''). +You can use the following variables: %{role}, %{roleLast}, %{state}, %{stateLast} + +=item B<--warning-member-status> + +Define the conditions to match for the status to be WARNING (Default: ''). +You can use the following variables: %{role}, %{roleLast}, %{state}, %{stateLast} + +=item B<--critical-member-status> + +Define the conditions to match for the status to be CRITICAL (Default: '%{role} ne %{roleLast}'). +You can use the following variables: %{role}, %{roleLast}, %{state}, %{stateLast} + +=item B<--unknown-port-status> + +Define the conditions to match for the status to be UNKNOWN (Default: ''). +You can use the following variables: %{admin_status}, %{oper_status}, %{display} + +=item B<--warning-port-status> + +Define the conditions to match for the status to be WARNING (Default: ''). +You can use the following variables: %{admin_status}, %{oper_status}, %{display} + +=item B<--critical-port-status> + +Define the conditions to match for the status to be CRITICAL (Default: '%{admin_status} eq "up" and %{oper_status} ne "up"'). +You can use the following variables: %{admin_status}, %{oper_status}, %{display} + +=back + +=cut diff --git a/src/network/hp/procurve/snmp/plugin.pm b/src/network/hp/procurve/snmp/plugin.pm index 3a4116a012..f58bd40db3 100644 --- a/src/network/hp/procurve/snmp/plugin.pm +++ b/src/network/hp/procurve/snmp/plugin.pm @@ -36,6 +36,7 @@ sub new { 'interfaces' => 'network::hp::procurve::snmp::mode::interfaces', 'list-interfaces' => 'snmp_standard::mode::listinterfaces', 'memory' => 'network::hp::procurve::snmp::mode::memory', + 'stack' => 'network::hp::procurve::snmp::mode::stack', 'virtual-chassis' => 'network::hp::procurve::snmp::mode::virtualchassis' }; diff --git a/src/network/keysight/nvos/restapi/mode/license.pm b/src/network/keysight/nvos/restapi/mode/license.pm new file mode 100644 index 0000000000..27607b88b2 --- /dev/null +++ b/src/network/keysight/nvos/restapi/mode/license.pm @@ -0,0 +1,110 @@ +# +# Copyright 2024 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::keysight::nvos::restapi::mode::license; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); + +sub custom_status_output { + my ($self, %options) = @_; + + return 'License expiration status: ' . $self->{result_values}->{status} . ' [info: ' . $self->{result_values}->{info} . ']'; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 } + ]; + + $self->{maps_counters}->{global} = [ + { + label => 'status', + type => 2, + warning_default => '%{status} =~ /MINOR/i', + critical_default => '%{status} =~ /MAJOR|CRITICAL/i', + set => { + key_values => [ { name => 'status' }, { name => 'info' } ], + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => \&catalog_status_threshold_ng + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $result = $options{custom}->request_api( + method => 'GET', + endpoint => '/api/system/', + ); + + $self->{global} = { + status => $result->{subsystem_alarms}->{subsystem_alarms}->{'License Expiration Status'}->{state}, + info => $result->{subsystem_alarms}->{subsystem_alarms}->{'License Expiration Status'}->{info}->[0] + }; +} + +1; + +__END__ + +=head1 MODE + +Check Keysight license status. + +=over 8 + +=item B<--unknown-status> + +Define the conditions to match for the status to be UNKNOWN. +You can use the following variables: %{status} + +=item B<--warning-status> + +Define the conditions to match for the status to be WARNING (default: '%{status} =~ /MINOR/i'). +You can use the following variables: %{status} + +=item B<--critical-status> + +Define the conditions to match for the status to be CRITICAL (default: '%{status} =~ /MAJOR|CRITICAL/i'). +You can use the following variables: %{status} + +=back + +=cut \ No newline at end of file diff --git a/src/network/keysight/nvos/restapi/mode/listdynamicfilters.pm b/src/network/keysight/nvos/restapi/mode/listdynamicfilters.pm index a2b85982be..7fbf34343c 100644 --- a/src/network/keysight/nvos/restapi/mode/listdynamicfilters.pm +++ b/src/network/keysight/nvos/restapi/mode/listdynamicfilters.pm @@ -87,7 +87,7 @@ sub run { sub disco_format { my ($self, %options) = @_; - $self->{output}->add_disco_format(elements => ['name', 'type', 'folder', 'application', 'ctm', 'status']); + $self->{output}->add_disco_format(elements => ['name']); } sub disco_show { diff --git a/src/network/keysight/nvos/restapi/mode/listports.pm b/src/network/keysight/nvos/restapi/mode/listports.pm index 7e25ec011b..e8f075d8eb 100644 --- a/src/network/keysight/nvos/restapi/mode/listports.pm +++ b/src/network/keysight/nvos/restapi/mode/listports.pm @@ -52,17 +52,42 @@ sub manage_selection { my $results = []; foreach (@{$ports->{stats_snapshot}}) { - next if ($_->{type} ne 'Port'); - - my $info = $options{custom}->request_api( - method => 'GET', - endpoint => '/api/ports/' . $_->{default_name}, - get_param => ['properties=enabled,license_status,link_status'] - ); + next if ($_->{type} !~ /Port/i); + + my $type; + if ($_->{type} eq 'Port Group') { + $type = $_->{type}; + } elsif (defined($_->{tp_total_tx_count_bytes})) { + $type = "Tool Port"; + } else { + $type = "Network Port"; + } + + my $info; + if ($_->{type} eq 'Port Group') { + $info = $options{custom}->request_api( + method => 'GET', + endpoint => '/internal/port_groups/' . $_->{id}, + get_param => ['properties=name,link_status'] + ); + } else { + $info = $options{custom}->request_api( + method => 'GET', + endpoint => '/api/ports/' . $_->{id}, + get_param => ['properties=name,enabled,license_status,link_status'] + ); + } + + my $adminStatus = 'none'; + if (defined($info->{enabled})) { + $adminStatus = $info->{enabled} =~ /true|1/i ? 'enabled' : 'disabled'; + } push @$results, { - name => $_->{default_name}, - adminStatus => $info->{enabled} =~ /true|1/i ? 'enabled' : 'disabled', + defaultName => $_->{default_name}, + name => $info->{name}, + type => $type, + adminStatus => $adminStatus, operationalStatus => $info->{link_status}->{link_up} =~ /true|1/i ? 'up' : 'down' }; } @@ -77,8 +102,10 @@ sub run { foreach (@$results) { $self->{output}->output_add( long_msg => sprintf( - '[name: %s][adminStatus: %s][operationalStatus: %s]', + '[defaultName: %s][name: %s][type: %s][adminStatus: %s][operationalStatus: %s]', + $_->{defaultName}, $_->{name}, + $_->{type}, $_->{adminStatus}, $_->{operationalStatus} ) @@ -97,7 +124,7 @@ sub run { sub disco_format { my ($self, %options) = @_; - $self->{output}->add_disco_format(elements => ['name', 'type', 'folder', 'application', 'ctm', 'status']); + $self->{output}->add_disco_format(elements => ['defaultName', 'name', 'type', 'adminStatus', 'operationalStatus']); } sub disco_show { diff --git a/src/network/keysight/nvos/restapi/mode/ports.pm b/src/network/keysight/nvos/restapi/mode/ports.pm index bf3cf19756..3c227d9e4f 100644 --- a/src/network/keysight/nvos/restapi/mode/ports.pm +++ b/src/network/keysight/nvos/restapi/mode/ports.pm @@ -41,8 +41,9 @@ sub port_long_output { my ($self, %options) = @_; return sprintf( - "checking port '%s'", - $options{instance_value}->{name} + "checking port '%s' [type: %s]", + $options{instance_value}->{name}, + $options{instance_value}->{type} ); } @@ -50,23 +51,54 @@ sub prefix_port_output { my ($self, %options) = @_; return sprintf( - "port '%s' ", - $options{instance_value}->{name} + "port '%s' [type: %s] ", + $options{instance_value}->{name}, + $options{instance_value}->{type} ); } -sub prefix_traffic_output { +sub prefix_traffic_in_output { + my ($self, %options) = @_; + + return 'traffic in: '; +} + +sub prefix_traffic_out_output { my ($self, %options) = @_; return 'traffic out: '; } -sub prefix_packet_output { +sub prefix_packet_other_port_output { + my ($self, %options) = @_; + + return 'packets '; +} + +sub prefix_packet_network_port_output { my ($self, %options) = @_; return 'packets '; } +sub custom_signal_perfdata { + my ($self) = @_; + + my $instances = []; + foreach (@{$self->{instance_mode}->{custom_perfdata_instances}}) { + push @$instances, $self->{result_values}->{$_}; + } + + $self->{output}->perfdata_add( + nlabel => $self->{nlabel}, + instances => $instances, + value => $self->{result_values}->{ $self->{key_values}->[0]->{name} }, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{thlabel}), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{thlabel}), + min => 0 + ); +} + sub set_counters { my ($self, %options) = @_; @@ -76,8 +108,10 @@ sub set_counters { group => [ { name => 'license', type => 0, skipped_code => { -10 => 1 } }, { name => 'link', type => 0, skipped_code => { -10 => 1 } }, - { name => 'traffic', type => 0, cb_prefix_output => 'prefix_traffic_output', skipped_code => { -10 => 1 } }, - { name => 'packet', type => 0, cb_prefix_output => 'prefix_packet_output', skipped_code => { -10 => 1 } } + { name => 'traffic_in', type => 0, cb_prefix_output => 'prefix_traffic_in_output', skipped_code => { -10 => 1 } }, + { name => 'traffic_out', type => 0, cb_prefix_output => 'prefix_traffic_out_output', skipped_code => { -10 => 1 } }, + { name => 'packet_network_port', type => 0, cb_prefix_output => 'prefix_packet_network_port_output', skipped_code => { -10 => 1 } }, + { name => 'packet_other_port', type => 0, cb_prefix_output => 'prefix_packet_other_port_output', skipped_code => { -10 => 1 } } ] } ]; @@ -105,7 +139,7 @@ sub set_counters { critical_default => '%{adminStatus} eq "enabled" and %{operationalStatus} ne "up"', set => { key_values => [ - { name => 'adminStatus' }, { name => 'operationalStatus' } , { name => 'name' } + { name => 'adminStatus' }, { name => 'operationalStatus' } , { name => 'name' }, { name => 'type' } ], closure_custom_output => $self->can('custom_link_output'), closure_custom_perfdata => sub { return 0; }, @@ -114,7 +148,27 @@ sub set_counters { } ]; - $self->{maps_counters}->{traffic} = [ + $self->{maps_counters}->{traffic_in} = [ + { label => 'traffic-in-prct', nlabel => 'port.traffic.in.percentage', set => { + key_values => [ { name => 'traffic_in_util' } ], + output_template => '%.2f%%', + perfdatas => [ + { template => '%.2f', unit => '%', min => 0, max => 100, label_extra_instance => 1 } + ] + } + }, + { label => 'traffic-in', nlabel => 'port.traffic.in.bytespersecond', set => { + key_values => [ { name => 'traffic_in', per_second => 1 } ], + output_template => '%.2f %s/s', + output_change_bytes => 1, + perfdatas => [ + { template => '%.2f', unit => 'B/s', min => 0, label_extra_instance => 1 } + ] + } + } + ]; + + $self->{maps_counters}->{traffic_out} = [ { label => 'traffic-out-prct', nlabel => 'port.traffic.out.percentage', set => { key_values => [ { name => 'traffic_out_util' } ], output_template => '%.2f%%', @@ -134,7 +188,7 @@ sub set_counters { } ]; - $self->{maps_counters}->{packet} = [ + $self->{maps_counters}->{packet_other_port} = [ { label => 'packets-out', nlabel => 'port.packets.out.count', set => { key_values => [ { name => 'packets_out', diff => 1 } ], output_template => 'out: %s', @@ -168,6 +222,49 @@ sub set_counters { } } ]; + + $self->{maps_counters}->{packet_network_port} = [ + { label => 'packets-in', nlabel => 'port.packets.in.count', set => { + key_values => [ { name => 'packets_in', diff => 1 } ], + output_template => 'in: %s', + perfdatas => [ + { template => '%s', min => 0, label_extra_instance => 1 } + ] + } + }, + { label => 'packets-pass', nlabel => 'port.packets.pass.count', set => { + key_values => [ { name => 'packets_pass', diff => 1 } ], + output_template => 'pass: %s', + perfdatas => [ + { template => '%s', min => 0, label_extra_instance => 1 } + ] + } + }, + { label => 'packets-invalid', nlabel => 'port.packets.invalid.count', set => { + key_values => [ { name => 'packets_invalid', diff => 1 } ], + output_template => 'invalid: %s', + perfdatas => [ + { template => '%s', min => 0, label_extra_instance => 1 } + ] + } + }, + { label => 'packets-deny', nlabel => 'port.packets.deny.count', set => { + key_values => [ { name => 'packets_deny', diff => 1 } ], + output_template => 'deny: %s', + perfdatas => [ + { template => '%s', min => 0, label_extra_instance => 1 } + ] + } + }, + { label => 'packets-crc-alignment-errors', nlabel => 'port.crc.alignment.errors.count', set => { + key_values => [ { name => 'packets_crc_alignment_errors', diff => 1 } ], + output_template => 'crc alignment errors: %s', + perfdatas => [ + { template => '%s', min => 0, label_extra_instance => 1 } + ] + } + } + ]; } sub new { @@ -176,7 +273,9 @@ sub new { bless $self, $class; $options{options}->add_options(arguments => { - 'filter-name:s' => { name => 'filter_name' } + 'filter-default-name:s' => { name => 'filter_default_name' }, + 'filter-name:s' => { name => 'filter_name' }, + 'filter-type:s' => { name => 'filter_type' } }); return $self; @@ -194,45 +293,101 @@ sub manage_selection { $self->{ports} = {}; foreach (@{$result->{stats_snapshot}}) { - next if ($_->{type} ne 'Port'); + # Only need 'Port Group' and 'Port' + next if ($_->{type} !~ /Port/i); + + my $type; + if ($_->{type} eq 'Port Group') { + $type = $_->{type}; + } elsif (defined($_->{tp_total_tx_count_bytes})) { + $type = "Tool Port"; + } else { + $type = "Network Port"; + } + + next if (defined($self->{option_results}->{filter_default_name}) && $self->{option_results}->{filter_default_name} ne '' && + $_->{default_name} !~ /$self->{option_results}->{filter_default_name}/); + next if (defined($self->{option_results}->{filter_type}) && $self->{option_results}->{filter_type} ne '' && + $type !~ /$self->{option_results}->{filter_type}/); + + my $info; + if ($_->{type} eq 'Port Group') { + $info = $options{custom}->request_api( + method => 'GET', + endpoint => '/internal/port_groups/' . $_->{id}, + get_param => ['properties=name,link_status'] + ); + } else { + $info = $options{custom}->request_api( + method => 'GET', + endpoint => '/api/ports/' . $_->{id}, + get_param => ['properties=name,enabled,license_status,link_status'] + ); + } next if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && - $_->{default_name} !~ /$self->{option_results}->{filter_name}/); - - my $info = $options{custom}->request_api( - method => 'GET', - endpoint => '/api/ports/' . $_->{default_name}, - get_param => ['properties=enabled,license_status,link_status'] - ); - - $self->{ports}->{ $_->{default_name} } = { - name => $_->{default_name}, - license => { - name => $_->{default_name}, - status => lc($info->{license_status}), - }, - link => { - name => $_->{default_name}, - adminStatus => $info->{enabled} =~ /true|1/i ? 'enabled' : 'disabled', + $info->{name} !~ /$self->{option_results}->{filter_name}/); + + my $name = $_->{default_name}; + if (defined($info->{name}) && $info->{name} ne '') { + $name = $info->{name}; + } + + my $adminStatus = 'none'; + if (defined($info->{enabled})) { + $adminStatus = $info->{enabled} =~ /true|1/i ? 'enabled' : 'disabled'; + } + + $self->{ports}->{$name} = { + name => $name, + type => $type, + link => { + name => $name, + type => $type, + adminStatus => $adminStatus, operationalStatus => $info->{link_status}->{link_up} =~ /true|1/i ? 'up' : 'down' - }, - traffic => { + } + }; + + if (defined($info->{license_status})) { + $self->{ports}->{$name}->{license} = { + name => $name, + status => lc($info->{license_status}) + }; + } + + if ($type eq 'Port Group' || $type eq 'Tool Port') { + $self->{ports}->{$name}->{traffic_out} = { traffic_out => $_->{tp_total_tx_count_bytes}, traffic_out_util => $_->{tp_current_tx_utilization} - }, - packet => { + }; + $self->{ports}->{$name}->{packet_other_port} = { packets_out => $_->{tp_total_tx_count_packets}, packets_dropped => $_->{tp_total_drop_count_packets}, packets_insp => $_->{tp_total_insp_count_packets}, packets_pass => $_->{tp_total_pass_count_packets} - } - }; + }; + } else { + $self->{ports}->{$name}->{traffic_in} = { + traffic_in => $_->{np_total_rx_count_bytes}, + traffic_in_util => $_->{np_current_rx_utilization} + }; + $self->{ports}->{$name}->{packet_network_port} = { + packets_in => $_->{np_total_rx_count_packets}, + packets_pass => $_->{np_total_pass_count_packets}, + packets_invalid => $_->{np_total_rx_count_invalid_packets}, + packets_deny => $_->{np_total_deny_count_packets}, + packets_crc_alignment_errors => $_->{np_total_rx_count_crc_alignment_errors} + }; + } } $self->{cache_name} = 'keysight_nvos_' . $self->{mode} . '_' . $options{custom}->get_hostname() . '_' . $options{custom}->get_port() . '_' . md5_hex( (defined($self->{option_results}->{filter_counters}) ? $self->{option_results}->{filter_counters} : '') . '_' . - (defined($self->{option_results}->{filter_name}) ? $self->{option_results}->{filter_name} : '') + (defined($self->{option_results}->{filter_default_name}) ? $self->{option_results}->{filter_default_name} : '') . '_' . + (defined($self->{option_results}->{filter_name}) ? $self->{option_results}->{filter_name} : '') . '_' . + (defined($self->{option_results}->{filter_type}) ? $self->{option_results}->{filter_type} : '') ); } @@ -246,10 +401,19 @@ Check ports. =over 8 +=item B<--filter-default-name> + +Filter ports by default name (can be a regexp). + =item B<--filter-name> Filter ports by name (can be a regexp). +=item B<--filter-type> + +Filter ports by type (can be a regexp). +You can use the following types: 'Network Port', 'Port Group' and 'Tool Port' + =item B<--unknown-license-status> Define the conditions to match for the status to be UNKNOWN. @@ -283,7 +447,7 @@ You can use the following variables: %{adminStatus}, %{operationalStatus}, %{nam =item B<--warning-*> B<--critical-*> Thresholds. -Can be: 'traffic-out-prct', 'traffic-out', 'packets-out', 'packets-dropped', +Can be: 'traffic-in-prct', 'traffic-in', 'traffic-out-prct', 'traffic-out', 'packets-out', 'packets-in', 'packets-dropped', 'packets-pass', 'packets-insp'. =back diff --git a/src/network/keysight/nvos/restapi/plugin.pm b/src/network/keysight/nvos/restapi/plugin.pm index 710e5b154a..08cb606d8f 100644 --- a/src/network/keysight/nvos/restapi/plugin.pm +++ b/src/network/keysight/nvos/restapi/plugin.pm @@ -32,6 +32,7 @@ sub new { $self->{modes} = { 'dynamic-filters' => 'network::keysight::nvos::restapi::mode::dynamicfilters', 'hardware' => 'network::keysight::nvos::restapi::mode::hardware', + 'license' => 'network::keysight::nvos::restapi::mode::license', 'list-dynamic-filters' => 'network::keysight::nvos::restapi::mode::listdynamicfilters', 'list-ports' => 'network::keysight::nvos::restapi::mode::listports', 'ports' => 'network::keysight::nvos::restapi::mode::ports', diff --git a/src/network/nokia/timos/snmp/mode/sasalarm.pm b/src/network/nokia/timos/snmp/mode/sasalarm.pm new file mode 100644 index 0000000000..b8a237cc73 --- /dev/null +++ b/src/network/nokia/timos/snmp/mode/sasalarm.pm @@ -0,0 +1,207 @@ +# +# Copyright 2023 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::nokia::timos::snmp::mode::sasalarm; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold); + +sub prefix_output { + my ($self, %options) = @_; + + return "Alarm input '" . $options{instance_value}->{display} . "' "; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = 'Alarm input status : ' . $self->{result_values}->{alarm_input_status} + . ' (Alarm input admin state: ' . $self->{result_values}->{alarm_input_admin_state} + . ' (Alarm output severity: ' . $self->{result_values}->{alarm_output_severity} + . ')'; + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{alarm_output_severity} = $options{new_datas}->{$self->{instance} . '_alarm_output_severity'}; + $self->{result_values}->{alarm_input_status} = $options{new_datas}->{$self->{instance} . '_alarm_input_status'}; + $self->{result_values}->{alarm_input_admin_state} = $options{new_datas}->{$self->{instance} . '_alarm_input_admin_state'}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { + name => 'sas_alarm_input', + type => 1, + cb_prefix_output => 'prefix_output', + message_multiple => 'All sas alarm inputs are ok' + } + ]; + + $self->{maps_counters}->{sas_alarm_input} = [ + { label => 'status', threshold => 0, set => { + key_values => + [ + { name => 'alarm_output_severity' }, + { name => 'alarm_input_status' }, + { name => 'alarm_input_admin_state' }, + { name => 'display' } + ], + closure_custom_calc => + $self->can('custom_status_calc'), + closure_custom_output => + $self->can('custom_status_output'), + closure_custom_perfdata => + sub {return 0;}, + closure_custom_threshold_check => + \&catalog_status_threshold, + } + }, + ] +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => + { + "filter-name:s" => + { name => 'filter_name' }, + "warning-status:s" => + { name => + 'warning_status', + default => + '%{alarm_input_admin_state} eq "up" and %{alarm_input_status} eq "alarm" and %{alarm_output_severity} =~ /minor/' }, + "critical-status:s" => + { name => + 'critical_status', + default => + '%{alarm_input_admin_state} eq "up" and %{alarm_input_status} eq "alarm" and %{alarm_output_severity} =~ /major|critical/' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->change_macros(macros => [ 'warning_status', 'critical_status' ]); +} + +my %alarm_output_severity = (1 => 'none', 2 => 'minor', 3 => 'major', 4 => 'critical'); +my %alarm_input_status = (1 => 'noAlarm', 2 => 'alarm'); +my %alarm_input_admin_state = (1 => 'up', 2 => 'down'); + +my $mapping = { + tmnxSasAlarmOutputSeverity => { oid => '.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.5', map => \%alarm_output_severity }, + tmnxSasAlarmInputDescription => { oid => '.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.2' }, + tmnxSasAlarmInputStatus => { oid => '.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.6', map => \%alarm_input_status }, + tmnxSasAlarmInputAdminState => { oid => '.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.3', map => \%alarm_input_admin_state }, +}; + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $mapping->{tmnxSasAlarmInputDescription}->{oid} }, + { oid => $mapping->{tmnxSasAlarmInputStatus}->{oid} }, + { oid => $mapping->{tmnxSasAlarmInputAdminState}->{oid} }, + { oid => $mapping->{tmnxSasAlarmOutputSeverity}->{oid} } + ], + return_type => 1, + nothing_quit => 1 + ); + + $self->{sas_alarm_input} = {}; + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{tmnxSasAlarmOutputSeverity}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); + + if (!defined($result->{tmnxSasAlarmInputDescription}) || $result->{tmnxSasAlarmInputDescription} eq '') { + $result->{tmnxSasAlarmInputDescription} = "AlarmInput-Instance-$instance"; + } + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $result->{tmnxSasAlarmInputDescription} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => + "skipping Input '" . $result->{tmnxSasAlarmInputDescription} . "'.", + debug => + 1); + next; + } + + $self->{sas_alarm_input}->{$instance} = { + display => $result->{tmnxSasAlarmInputDescription}, + alarm_output_severity => $result->{tmnxSasAlarmOutputSeverity}, + alarm_input_status => $result->{tmnxSasAlarmInputStatus}, + alarm_input_admin_state => $result->{tmnxSasAlarmInputAdminState} + }; + + $self->{cache_name} = "nokia_timos_" . $self->{mode} . '_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . + (defined($self->{option_results}->{filter_counters}) ? + md5_hex($self->{option_results}->{filter_counters}) : + md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_name}) ? + md5_hex($self->{option_results}->{filter_name}) : + md5_hex('all')); + } +} + +1; + +__END__ + +=head1 MODE + +Check SAS alarm input usage. + + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status. (Default: '%{alarm_input_admin_state} eq "up" and %{alarm_input_status} eq "alarm" and %{alarm_output_severity} =~ /minor/') +You can use the following variables: %{alarm_input_admin_state}, %{alarm_input_status}, %{alarm_output_severity} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{alarm_input_admin_state} eq "up" and %{alarm_input_status} eq "alarm" and %{alarm_output_severity} =~ /major|critical/'). +You can use the following variables: %{ipv4_oper_state}, %{admin_state}, %{display} + +=item B<--filter-name> + +Filter alarm input (tmnxSasAlarmInputDescription) (can be a regexp). + +=back + +=cut diff --git a/src/network/nokia/timos/snmp/plugin.pm b/src/network/nokia/timos/snmp/plugin.pm index fd9b688c03..ca2321a968 100644 --- a/src/network/nokia/timos/snmp/plugin.pm +++ b/src/network/nokia/timos/snmp/plugin.pm @@ -46,6 +46,7 @@ sub new { 'list-vrtr' => 'network::nokia::timos::snmp::mode::listvrtr', 'memory' => 'network::nokia::timos::snmp::mode::memory', 'sap-usage' => 'network::nokia::timos::snmp::mode::sapusage', + 'sas-alarm' => 'network::nokia::timos::snmp::mode::sasalarm', 'uptime' => 'snmp_standard::mode::uptime', ); diff --git a/src/os/linux/local/mode/process.pm b/src/os/linux/local/mode/process.pm index 63c00f7cdd..268266f479 100644 --- a/src/os/linux/local/mode/process.pm +++ b/src/os/linux/local/mode/process.pm @@ -199,7 +199,7 @@ sub parse_output { my ($stdout) = $options{custom}->execute_command( command => 'ps', - command_options => '-e -o state -o etime -o pid -o ppid -o comm:50 -o %a -w 2>&1' + command_options => '-e -o state -o etime:15 -o pid:10 -o ppid:10 -o comm:50 -o args -w 2>&1' ); $self->{global} = { processes => 0 }; @@ -394,35 +394,116 @@ Monitor disk I/O. =item B<--filter-command> -Filter process commands (regexp can be used). +Define which processes should be included based on the name of the executable. +This option will be treated as a regular expression. =item B<--exclude-command> -Exclude process commands (regexp can be used). +Define which processes should be excluded based on the name of the executable. +This option will be treated as a regular expression. =item B<--filter-arg> -Filter process arguments (regexp can be used). +Define which processes should be included based on the arguments of the executable. +This option will be treated as a regular expression. =item B<--exclude-arg> -Exclude process arguments (regexp can be used). +Define which processes should be excluded based on the arguments of the executable. +This option will be treated as a regular expression. =item B<--filter-ppid> -Filter process ppid (regexp can be used). +Define which processes should be excluded based on the process's parent process ID (PPID). +This option will be treated as a regular expression. + =item B<--filter-state> -Filter process states (regexp can be used). +Define which processes should be excluded based on the process state. +This option will be treated as a regular expression. You can use: 'zombie', 'dead', 'paging', 'stopped', 'InterrupibleSleep', 'running', 'UninterrupibleSleep'. -=item B<--warning-*> B<--critical-*> +=item B<--warning-total> + +Thresholds. + +=item B<--critical-total> + +Thresholds. + +=item B<--warning-total-memory-usage> + +Thresholds. + +=item B<--critical-total-memory-usage> + +Thresholds. + +=item B<--warning-total-cpu-utilization> + +Thresholds. + +=item B<--critical-total-cpu-utilization> + +Thresholds. + +=item B<--warning-total-disks-read> + +Thresholds. + +=item B<--critical-total-disks-read> + +Thresholds. + +=item B<--warning-total-disks-write> + +Thresholds. + +=item B<--critical-total-disks-write> + +Thresholds. + +=item B<--warning-time> + +Thresholds. + +=item B<--critical-time> + +Thresholds. + +=item B<--warning-memory-usage> + +Thresholds. + +=item B<--critical-memory-usage> + +Thresholds. + +=item B<--warning-cpu-utilization> + +Thresholds. + +=item B<--critical-cpu-utilization> + +Thresholds. + +=item B<--warning-disks-read> + +Thresholds. + +=item B<--critical-disks-read> + +Thresholds. + +=item B<--warning-disks-write> + +Thresholds. + +=item B<--critical-disks-write> Thresholds. -Can be: 'total', 'total-memory-usage', 'total-cpu-utilization', 'total-disks-read', -'total-disks-write', 'time', 'memory-usage', 'cpu-utilization', 'disks-read', 'disks-write'. =back diff --git a/tests/apps/eclipse/mosquitto/mqtt/clients.robot b/tests/apps/eclipse/mosquitto/mqtt/clients.robot new file mode 100644 index 0000000000..bf06db72cb --- /dev/null +++ b/tests/apps/eclipse/mosquitto/mqtt/clients.robot @@ -0,0 +1,30 @@ +*** Settings *** +Documentation Eclipse Mosquitto MQTT plugin tests + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + +Keyword Tags notauto + + +*** Variables *** +${HOSTNAME} mosquitto_openssl +${MQTT_PORT} 8883 +${MQTT_CA_CERTIFICATE} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/ca.crt +${MQTT_SSL_CERTIFICATE} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/client.crt +${MQTT_SSL_KEY} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/client.key +${CMD} ${CENTREON_PLUGINS} --plugin=apps::eclipse::mosquitto::mqtt::plugin --hostname=${HOSTNAME} --mqtt-port=${MQTT_PORT} --mqtt-ca-certificate=${MQTT_CA_CERTIFICATE} --mqtt-ssl-certificate=${MQTT_SSL_CERTIFICATE} --mqtt-ssl-key=${MQTT_SSL_KEY} + + +*** Test Cases *** +Mosquitto MQTT clients + [Documentation] Check Mosquitto MQTT uptime + [Tags] eclipse mosquitto mqtt + ${command} Catenate + ... ${CMD} + ... --mode=clients + ... --help + + ${output} Run ${command} + ${output} Strip String ${output} \ No newline at end of file diff --git a/tests/apps/eclipse/mosquitto/mqtt/messages.robot b/tests/apps/eclipse/mosquitto/mqtt/messages.robot new file mode 100644 index 0000000000..8addc34ae3 --- /dev/null +++ b/tests/apps/eclipse/mosquitto/mqtt/messages.robot @@ -0,0 +1,30 @@ +*** Settings *** +Documentation Eclipse Mosquitto MQTT plugin tests + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + +Keyword Tags notauto + + +*** Variables *** +${HOSTNAME} mosquitto_openssl +${MQTT_PORT} 8883 +${MQTT_CA_CERTIFICATE} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/ca.crt +${MQTT_SSL_CERTIFICATE} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/client.crt +${MQTT_SSL_KEY} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/client.key +${CMD} ${CENTREON_PLUGINS} --plugin=apps::eclipse::mosquitto::mqtt::plugin --hostname=${HOSTNAME} --mqtt-port=${MQTT_PORT} --mqtt-ca-certificate=${MQTT_CA_CERTIFICATE} --mqtt-ssl-certificate=${MQTT_SSL_CERTIFICATE} --mqtt-ssl-key=${MQTT_SSL_KEY} + + +*** Test Cases *** +Mosquitto MQTT messages + [Documentation] Check Mosquitto MQTT uptime + [Tags] eclipse mosquitto mqtt + ${command} Catenate + ... ${CMD} + ... --mode=messages + ... --help + + ${output} Run ${command} + ${output} Strip String ${output} \ No newline at end of file diff --git a/tests/apps/eclipse/mosquitto/mqtt/numeric-value.robot b/tests/apps/eclipse/mosquitto/mqtt/numeric-value.robot new file mode 100644 index 0000000000..6209ed6d6a --- /dev/null +++ b/tests/apps/eclipse/mosquitto/mqtt/numeric-value.robot @@ -0,0 +1,30 @@ +*** Settings *** +Documentation Eclipse Mosquitto MQTT plugin tests + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + +Keyword Tags notauto + + +*** Variables *** +${HOSTNAME} mosquitto_openssl +${MQTT_PORT} 8883 +${MQTT_CA_CERTIFICATE} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/ca.crt +${MQTT_SSL_CERTIFICATE} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/client.crt +${MQTT_SSL_KEY} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/client.key +${CMD} ${CENTREON_PLUGINS} --plugin=apps::eclipse::mosquitto::mqtt::plugin --hostname=${HOSTNAME} --mqtt-port=${MQTT_PORT} --mqtt-ca-certificate=${MQTT_CA_CERTIFICATE} --mqtt-ssl-certificate=${MQTT_SSL_CERTIFICATE} --mqtt-ssl-key=${MQTT_SSL_KEY} + + +*** Test Cases *** +Mosquitto MQTT numeric-value + [Documentation] Check Mosquitto MQTT uptime + [Tags] eclipse mosquitto mqtt + ${command} Catenate + ... ${CMD} + ... --mode=numeric-value + ... --help + + ${output} Run ${command} + ${output} Strip String ${output} \ No newline at end of file diff --git a/tests/apps/eclipse/mosquitto/mqtt/eclipse-mosquitto-mqtt.robot b/tests/apps/eclipse/mosquitto/mqtt/string-value.robot similarity index 50% rename from tests/apps/eclipse/mosquitto/mqtt/eclipse-mosquitto-mqtt.robot rename to tests/apps/eclipse/mosquitto/mqtt/string-value.robot index 3109cc677e..179f968321 100644 --- a/tests/apps/eclipse/mosquitto/mqtt/eclipse-mosquitto-mqtt.robot +++ b/tests/apps/eclipse/mosquitto/mqtt/string-value.robot @@ -18,50 +18,6 @@ ${CMD} ${CENTREON_PLUGINS} --plugin=apps::eclipse::mosquitt *** Test Cases *** -Mosquitto MQTT uptime - [Documentation] Check Mosquitto MQTT uptime - [Tags] eclipse mosquitto mqtt - ${command} Catenate - ... ${CMD} - ... --mode=uptime - ... --help - - ${output} Run ${command} - ${output} Strip String ${output} - -Mosquitto MQTT clients - [Documentation] Check Mosquitto MQTT uptime - [Tags] eclipse mosquitto mqtt - ${command} Catenate - ... ${CMD} - ... --mode=clients - ... --help - - ${output} Run ${command} - ${output} Strip String ${output} - -Mosquitto MQTT messages - [Documentation] Check Mosquitto MQTT uptime - [Tags] eclipse mosquitto mqtt - ${command} Catenate - ... ${CMD} - ... --mode=messages - ... --help - - ${output} Run ${command} - ${output} Strip String ${output} - -Mosquitto MQTT numeric-value - [Documentation] Check Mosquitto MQTT uptime - [Tags] eclipse mosquitto mqtt - ${command} Catenate - ... ${CMD} - ... --mode=numeric-value - ... --help - - ${output} Run ${command} - ${output} Strip String ${output} - Mosquitto MQTT string-value [Documentation] Check Mosquitto MQTT uptime [Tags] eclipse mosquitto mqtt diff --git a/tests/apps/eclipse/mosquitto/mqtt/uptime.robot b/tests/apps/eclipse/mosquitto/mqtt/uptime.robot new file mode 100644 index 0000000000..b95b082114 --- /dev/null +++ b/tests/apps/eclipse/mosquitto/mqtt/uptime.robot @@ -0,0 +1,30 @@ +*** Settings *** +Documentation Eclipse Mosquitto MQTT plugin tests + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + +Keyword Tags notauto + + +*** Variables *** +${HOSTNAME} mosquitto_openssl +${MQTT_PORT} 8883 +${MQTT_CA_CERTIFICATE} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/ca.crt +${MQTT_SSL_CERTIFICATE} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/client.crt +${MQTT_SSL_KEY} /home/code/tests/robot/apps/eclipse/mosquitto/mqtt/certs/client.key +${CMD} ${CENTREON_PLUGINS} --plugin=apps::eclipse::mosquitto::mqtt::plugin --hostname=${HOSTNAME} --mqtt-port=${MQTT_PORT} --mqtt-ca-certificate=${MQTT_CA_CERTIFICATE} --mqtt-ssl-certificate=${MQTT_SSL_CERTIFICATE} --mqtt-ssl-key=${MQTT_SSL_KEY} + + +*** Test Cases *** +Mosquitto MQTT uptime + [Documentation] Check Mosquitto MQTT uptime + [Tags] eclipse mosquitto mqtt + ${command} Catenate + ... ${CMD} + ... --mode=uptime + ... --help + + ${output} Run ${command} + ${output} Strip String ${output} \ No newline at end of file diff --git a/tests/apps/jmeter/jmeter b/tests/apps/jmeter/jmeter new file mode 100755 index 0000000000..c3787846ce --- /dev/null +++ b/tests/apps/jmeter/jmeter @@ -0,0 +1,30 @@ +#!/bin/bash + +# Process all options +while getopts ":t:" opt; do + case $opt in + t) + filedir=$(dirname "$OPTARG") + filename=$(basename "$OPTARG") + if [[ "$filename" =~ ^test_2_2\.jmx$ ]]; then + # Output the content of test_2_2.xml + cat $filedir/test_2_2.xml >&2 + elif [[ "$filename" =~ ^test_1_2\.jmx$ ]]; then + # Output the content of test_1_2.xml + cat $filedir/test_1_2.xml >&2 + elif [[ "$filename" =~ ^test_0_2\.jmx$ ]]; then + # Output the content of test_0_2.xml + cat $filedir/test_0_2.xml >&2 + else + echo "Invalid parameter value: $filename" >&2 + exit 1 + fi + ;; + *) + # Ignore other options + ;; + esac +done + +# Shift off the options and optional --. +shift "$((OPTIND-1))" \ No newline at end of file diff --git a/tests/apps/jmeter/scenario.robot b/tests/apps/jmeter/scenario.robot new file mode 100644 index 0000000000..c4be3ccf60 --- /dev/null +++ b/tests/apps/jmeter/scenario.robot @@ -0,0 +1,36 @@ +*** Settings *** +Documentation Apache Jmeter scenario + +Resource ${CURDIR}${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=apps::jmeter::plugin + +*** Test Cases *** +Scenario ${tc} + [Documentation] Scenario + [Tags] apps jmeter scenario + + ${command} Catenate + ... ${CMD} + ... --mode=scenario + ... --directory=${CURDIR} + ... --scenario=${scenario} + ... --command-path=${CURDIR} + ... ${extraoptions} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: + ... tc scenario extraoptions expected_result -- + ... 1 test_2_2 ${EMPTY} OK: Elapsed Time: 1.690s, Steps: 4/4, Availability: 100% | 'time'=1.690s;;;0; 'steps'=4;;;0;4 'availability'=100%;;;0;100 + ... 2 test_2_2 --warning-time=1 WARNING: Elapsed Time: 1.690s | 'time'=1.690s;0:1;;0; 'steps'=4;;;0;4 'availability'=100%;;;0;100 + ... 3 test_2_2 --critical-time=1 CRITICAL: Elapsed Time: 1.690s | 'time'=1.690s;;0:1;0; 'steps'=4;;;0;4 'availability'=100%;;;0;100 + ... 4 test_1_2 ${EMPTY} CRITICAL: Steps: 1/2 - First failed: Sample Label 2 (404 Not Found) | 'time'=0.457s;;;0; 'steps'=1;;;0;2 'availability'=50%;;;0;100 + ... 5 test_0_2 ${EMPTY} CRITICAL: Steps: 0/2 - First failed: Sample Label (404 Not Found) | 'time'=0.457s;;;0; 'steps'=0;;;0;2 'availability'=0%;;;0;100 + ... 6 test_2_2 --verbose OK: Elapsed Time: 1.690s, Steps: 4/4, Availability: 100% | 'time'=1.690s;;;0; 'steps'=4;;;0;4 'availability'=100%;;;0;100\n* Sample: Sample Label\n- Success: true\n- Elapsed Time: 0.123s\n- Response Code: 200\n- Response Message: OK\n- Assertion: Response Assertion\n* Sample: Sample Label\n- Success: true\n- Elapsed Time: 0.234s\n- Response Code: 200\n- Response Message: OK\n- Assertion: Response Assertion\n* Sample: Sample Label 2\n- Success: true\n- Elapsed Time: 1.456s\n- Response Code: 200\n- Response Message: OK\n- Assertion: Response 2 Assertion\n* Sample: Sample Label 2\n- Success: true\n- Elapsed Time: 0.345s\n- Response Code: 200\n- Response Message: OK\n- Assertion: Response 2 Assertion + ... 7 test_1_2 --verbose CRITICAL: Steps: 1/2 - First failed: Sample Label 2 (404 Not Found) | 'time'=0.457s;;;0; 'steps'=1;;;0;2 'availability'=50%;;;0;100\n* Sample: Sample Label\n- Success: true\n- Elapsed Time: 0.123s\n- Response Code: 200\n- Response Message: OK\n- Assertion: Response Assertion\n* Sample: Sample Label 2\n- Success: false\n- Elapsed Time: 0.456s\n- Response Code: 404\n- Response Message: Not Found\n- Assertion: Response 2 Assertion\n+ Failure Message: Test failed + ... 8 test_0_2 --verbose CRITICAL: Steps: 0/2 - First failed: Sample Label (404 Not Found) | 'time'=0.457s;;;0; 'steps'=0;;;0;2 'availability'=0%;;;0;100\n* Sample: Sample Label\n- Success: false\n- Elapsed Time: 0.123s\n- Response Code: 404\n- Response Message: Not Found\n- Assertion: Response Assertion\n+ Failure Message: Test failed\n* Sample: Sample Label 2\n- Success: false\n- Elapsed Time: 0.456s\n- Response Code: 404\n- Response Message: Not Found\n- Assertion: Response 2 Assertion\n+ Failure Message: Test 2 failed diff --git a/tests/apps/jmeter/test_0_2.xml b/tests/apps/jmeter/test_0_2.xml new file mode 100644 index 0000000000..2e2d38407e --- /dev/null +++ b/tests/apps/jmeter/test_0_2.xml @@ -0,0 +1,18 @@ + + + + Response Assertion + true + true + Test failed + + + + + Response 2 Assertion + true + false + Test 2 failed + + + \ No newline at end of file diff --git a/tests/apps/jmeter/test_1_2.xml b/tests/apps/jmeter/test_1_2.xml new file mode 100644 index 0000000000..987e046c1e --- /dev/null +++ b/tests/apps/jmeter/test_1_2.xml @@ -0,0 +1,17 @@ + + + + Response Assertion + false + false + + + + + Response 2 Assertion + true + false + Test failed + + + \ No newline at end of file diff --git a/tests/apps/jmeter/test_2_2.xml b/tests/apps/jmeter/test_2_2.xml new file mode 100644 index 0000000000..7184d0dcd0 --- /dev/null +++ b/tests/apps/jmeter/test_2_2.xml @@ -0,0 +1,30 @@ + + + + Response Assertion + false + false + + + + + Response Assertion + false + false + + + + + Response 2 Assertion + false + false + + + + + Response 2 Assertion + false + false + + + \ No newline at end of file diff --git a/tests/apps/microsoft/hyperv/2012/local/node-integration-service.robot b/tests/apps/microsoft/hyperv/2012/local/node-integration-service.robot new file mode 100644 index 0000000000..11d211ce71 --- /dev/null +++ b/tests/apps/microsoft/hyperv/2012/local/node-integration-service.robot @@ -0,0 +1,32 @@ +*** Settings *** +Documentation Application Microsoft HyperV 2022 + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} +... --plugin=apps::microsoft::hyperv::2012::local::plugin +... --mode=node-integration-service +... --command=cat +... --command-path=/usr/bin +... --no-ps + + +*** Test Cases *** +HyperV 2022-1 ${tc} + [Documentation] Apps Microsoft HyperV 2022 + [Tags] applications microsoft hyperv virtualization + ${command} Catenate + ... ${CMD} + ... --command-options=${CURDIR}/nodeintegrationservice-2022-1.json + ... --filter-vm='${filter_vm}' + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc filter_vm expected_result -- + ... 1 ${EMPTY} CRITICAL: 1 problem(s) detected + ... 2 VSERVER05 OK: VM 'VSERVER05' 0 problem(s) detected - VM 'VSERVER05' 0 problem(s) detected + ... 3 VSERVER07 CRITICAL: VM 'VSERVER07' 1 problem(s) detected \ No newline at end of file diff --git a/tests/apps/microsoft/hyperv/2012/local/nodeintegrationservice.robot b/tests/apps/microsoft/hyperv/2012/local/node-integration-service2.robot similarity index 62% rename from tests/apps/microsoft/hyperv/2012/local/nodeintegrationservice.robot rename to tests/apps/microsoft/hyperv/2012/local/node-integration-service2.robot index 656d11eaf3..97cc3d21af 100644 --- a/tests/apps/microsoft/hyperv/2012/local/nodeintegrationservice.robot +++ b/tests/apps/microsoft/hyperv/2012/local/node-integration-service2.robot @@ -16,20 +16,6 @@ ${CMD} ${CENTREON_PLUGINS} *** Test Cases *** -HyperV 2022-1 ${tc} - [Documentation] Apps Microsoft HyperV 2022 - [Tags] applications microsoft hyperv virtualization - ${command} Catenate - ... ${CMD} - ... --command-options=${CURDIR}/nodeintegrationservice-2022-1.json - ... --filter-vm='${filter_vm}' - - Ctn Run Command And Check Result As Strings ${command} ${expected_result} - - Examples: tc filter_vm expected_result -- - ... 1 ${EMPTY} CRITICAL: 1 problem(s) detected - ... 2 VSERVER05 OK: VM 'VSERVER05' 0 problem(s) detected - VM 'VSERVER05' 0 problem(s) detected - ... 3 VSERVER07 CRITICAL: VM 'VSERVER07' 1 problem(s) detected HyperV 2022-2 ${tc} [Documentation] Apps Microsoft HyperV 2022 [Tags] applications microsoft hyperv virtualization diff --git a/tests/apps/vmware/vsphere8/api.t b/tests/apps/vmware/vsphere8/api.t new file mode 100644 index 0000000000..ddc2168bd0 --- /dev/null +++ b/tests/apps/vmware/vsphere8/api.t @@ -0,0 +1,114 @@ +use strict; +use warnings; +use Test2::V0; +use FindBin; +use lib "$FindBin::RealBin/../../../../src"; +use apps::vmware::vsphere8::custom::api; + + +# Mock options class +{ + package MockOptions; + sub new { bless {}, shift } + sub add_options { } + sub add_help { } +} + +{ + package MockOutput; + sub new { bless {}, shift } + sub add_option_msg { } + sub option_exit { } + +} + +sub process_test { + my ($hostname, $port, $proto, $url_path, $timeout, $username, $password) = @_; + + # Create mock object + my $options = MockOptions->new(); + my $output = MockOutput->new(); + + # Add options to the $options hashref + $options->{hostname} = $hostname; + $options->{port} = $port; + $options->{proto} = $proto; + $options->{timeout} = $timeout; + $options->{username} = $username; + $options->{password} = $password; + + # Test object creation + my $api; + eval { + $api = apps::vmware::vsphere8::custom::api->new( + options => $options, + output => $output + ); + }; + ok(!$@, 'Object creation without errors'); + + # Test if the object is blessed correctly + is(ref($api), 'apps::vmware::vsphere8::custom::api', 'Object is of correct class'); + + # Test if the object has the expected attributes + can_ok($api, qw(new set_options check_options)); + + $api->set_options(option_results => $options); + # Verify that option_results is set correctly + is($api->{option_results}, $options, 'option_results set correctly'); + + # Test check_options method + eval { $api->check_options(option_results => $options) }; + ok(!$@, 'check_options method executed without errors'); + + is($api->{hostname}, $hostname, 'hostname set correctly'); + is($api->{port}, defined($port) ? $port : 443, 'port set correctly'); + is($api->{proto}, defined($proto) ? $proto : 'https', 'proto set correctly'); + is($api->{timeout}, defined($timeout) ? $timeout : 10, 'timeout set correctly'); + is($api->{username}, defined($username) ? $username : '', 'username set correctly'); + is($api->{password}, defined($password) ? $password : '', 'password set correctly'); + +} + +sub main { + #process_test('localhost', 443, 'https', '/v2', 10, 'user', 'pass'); + process_test('localhost', 443, undef, undef, undef, undef, undef); +} + +main(); + +done_testing(); + + +__END__ + + + +# Test check_options method with missing username +$option_results = { + hostname => 'localhost', + port => 443, + proto => 'https', + url_path => '/v2', + timeout => 10, + password => 'pass' +}; +$api->set_options(option_results => $option_results); +eval { $api->check_options() }; +like($@, qr/Need to specify --username option/, 'Missing username handled correctly'); + +# Test check_options method with missing password +$option_results = { + hostname => 'localhost', + port => 443, + proto => 'https', + url_path => '/v2', + timeout => 10, + username => 'user' +}; +$api->set_options(option_results => $option_results); +eval { $api->check_options() }; +like($@, qr/Need to specify --password option/, 'Missing password handled correctly'); + + +done_testing(); \ No newline at end of file diff --git a/tests/apps/vmware/vsphere8/esx/discovery.robot b/tests/apps/vmware/vsphere8/esx/discovery.robot new file mode 100644 index 0000000000..002003c036 --- /dev/null +++ b/tests/apps/vmware/vsphere8/esx/discovery.robot @@ -0,0 +1,43 @@ +*** 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 +... --password=C3POR2P2 +... --username=obi-wan +... --mode=discovery +... --hostname=127.0.0.1 +... --proto=http +... --port=3000 + +*** Test Cases *** +Discovery ${tc} + [Tags] apps api vmware vsphere8 esx discovery + ${command} Catenate ${CMD} --http-backend=${http_backend} + + # We sort the host names and keep only the last one and make sure it is the expected one + ${output} Run ${command} | jq -r '.results | .[].host_name' | sort | tail -1 + + ${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 + + + Examples: tc http_backend expected_result -- + ... 1 curl esx3.acme.com + ... 2 lwp esx3.acme.com + diff --git a/tests/apps/vmware/vsphere8/esx/host-status.robot b/tests/apps/vmware/vsphere8/esx/host-status.robot new file mode 100644 index 0000000000..f0ac4a625d --- /dev/null +++ b/tests/apps/vmware/vsphere8/esx/host-status.robot @@ -0,0 +1,51 @@ +*** 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=host-status +... --password=C3POR2P2 +... --username=obi-wan +... --hostname=127.0.0.1 +... --proto=http +... --port=3000 + +*** 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 + + + 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) diff --git a/tests/apps/vmware/vsphere8/esx/vmware8-restapi.mockoon.json b/tests/apps/vmware/vsphere8/esx/vmware8-restapi.mockoon.json new file mode 100644 index 0000000000..91b9a2f356 --- /dev/null +++ b/tests/apps/vmware/vsphere8/esx/vmware8-restapi.mockoon.json @@ -0,0 +1,183 @@ +{ + "uuid": "dd7d9589-c42b-42e9-8790-f11c8a0f344d", + "lastMigration": 32, + "name": "Vmware8 restapi.mockoon", + "endpointPrefix": "", + "latency": 0, + "port": 3000, + "hostname": "", + "folders": [], + "routes": [ + { + "uuid": "24bee589-6166-4849-bc82-937ea7a5480c", + "type": "http", + "documentation": "", + "method": "post", + "endpoint": "api/session", + "responses": [ + { + "uuid": "d037b485-9952-467c-985c-415b9033e4d9", + "body": "\"32c9819179813376a9bbda43e9c84165\"", + "latency": 0, + "statusCode": 201, + "label": "", + "headers": [ + { + "key": "access-control-allow-headers", + "value": "Content-Type, Origin, Accept, Authorization, Content-Length, X-Requested-With" + }, + { + "key": "access-control-allow-methods", + "value": "GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS" + }, + { + "key": "access-control-allow-origin", + "value": "*" + }, + { + "key": "content-security-policy", + "value": "default-src 'none'" + }, + { + "key": "content-type", + "value": "text/html; charset=utf-8" + }, + { + "key": "x-content-type-options", + "value": "nosniff" + } + ], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [] + } + ], + "responseMode": null + }, + { + "uuid": "68acba14-1ccf-4597-a90c-69264b07d558", + "type": "http", + "documentation": "", + "method": "get", + "endpoint": "api/vcenter/host", + "responses": [ + { + "uuid": "cc160130-c765-4a8a-ba09-0ad544ef956f", + "latency": 0, + "statusCode": 200, + "label": "", + "headers": [ + { + "key": "access-control-allow-headers", + "value": "Content-Type, Origin, Accept, Authorization, Content-Length, X-Requested-With" + }, + { + "key": "access-control-allow-methods", + "value": "GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS" + }, + { + "key": "access-control-allow-origin", + "value": "*" + }, + { + "key": "content-security-policy", + "value": "default-src 'none'" + }, + { + "key": "content-type", + "value": "text/html; charset=utf-8" + }, + { + "key": "x-content-type-options", + "value": "nosniff" + } + ], + "bodyType": "DATABUCKET", + "filePath": "", + "databucketID": "7kak", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [], + "body": "{}" + } + ], + "responseMode": null + } + ], + "rootChildren": [ + { + "type": "route", + "uuid": "24bee589-6166-4849-bc82-937ea7a5480c" + }, + { + "type": "route", + "uuid": "68acba14-1ccf-4597-a90c-69264b07d558" + } + ], + "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": [ + { + "uuid": "a438d9f3-8360-49c3-9d1f-d2f6d202513d", + "id": "7kak", + "name": "/api/vcenter/host", + "documentation": "Complete response", + "value": "[{\"host\":\"host-22\",\"name\":\"esx1.acme.com\",\"connection_state\":\"CONNECTED\",\"power_state\":\"POWERED_ON\"},{\"host\":\"host-28\",\"name\":\"esx2.acme.com\",\"connection_state\":\"CONNECTED\",\"power_state\":\"POWERED_OFF\"},{\"host\":\"host-35\",\"name\":\"esx3.acme.com\",\"connection_state\":\"DISCONNECTED\",\"power_state\":\"POWERED_ON\"}]\n" + } + ], + "callbacks": [] +} \ No newline at end of file diff --git a/tests/centreon/plugins/passwordmgr/centreonvault.mockoon.json b/tests/centreon/plugins/passwordmgr/centreonvault.mockoon.json new file mode 100644 index 0000000000..0161765966 --- /dev/null +++ b/tests/centreon/plugins/passwordmgr/centreonvault.mockoon.json @@ -0,0 +1,239 @@ +{ + "uuid": "5beab5e3-1b32-4ec1-a6d9-18c546c2d894", + "lastMigration": 33, + "name": "Centreonvault", + "endpointPrefix": "", + "latency": 0, + "port": 3000, + "hostname": "", + "folders": [], + "routes": [ + { + "uuid": "9623237f-f204-4972-ac46-8cfaadfa975a", + "type": "http", + "documentation": "", + "method": "post", + "endpoint": "v1/auth/approle/login", + "responses": [ + { + "uuid": "3bb67f80-c60a-41a9-b071-f5a559f19613", + "body": "{\n \"request_id\": \"r2p2c3po-b013-723a-24c7-ad80aa1fbddb\",\n \"lease_id\": \"\",\n \"renewable\": false,\n \"lease_duration\": 0,\n \"data\": null,\n \"wrap_info\": null,\n \"warnings\": null,\n \"auth\": {\n \"client_token\": \"hvs.thistokenisafakeonebutwillworkwiththetests\",\n \"accessor\": \"7PjTD&rpX53oqLRNa4C5t\",\n \"policies\": [\n \"default\",\n \"centreon-plugins\"\n ],\n \"token_policies\": [\n \"default\",\n \"omercier\"\n ],\n \"metadata\": {\n \"role_name\": \"centreon-plugins\"\n },\n \"lease_duration\": 2764800,\n \"renewable\": true,\n \"entity_id\": \"bbdov2-0dd9-97e8-66d6-3db885ccffd8\",\n \"token_type\": \"service\",\n \"orphan\": true,\n \"mfa_requirement\": null,\n \"num_uses\": 0\n },\n \"mount_type\": \"\"\n}", + "latency": 0, + "statusCode": 200, + "label": "", + "headers": [ + { + "key": "access-control-allow-headers", + "value": "Content-Type, Origin, Accept, Authorization, Content-Length, X-Requested-With" + }, + { + "key": "access-control-allow-methods", + "value": "GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS" + }, + { + "key": "access-control-allow-origin", + "value": "*" + }, + { + "key": "content-security-policy", + "value": "default-src 'none'" + }, + { + "key": "content-type", + "value": "text/html; charset=utf-8" + }, + { + "key": "x-content-type-options", + "value": "nosniff" + } + ], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [ + { + "target": "query", + "modifier": "role_id", + "value": "thisroleidisinplaintext", + "invert": false, + "operator": "equals" + }, + { + "target": "query", + "modifier": "secret_id", + "value": "thissecretidisinplaintext", + "invert": false, + "operator": "equals" + } + ], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [] + }, + { + "uuid": "bba1ccb5-9415-4630-a82e-ff192b1f5680", + "body": "{\"errors\":[\"invalid role or secret ID\"]}", + "latency": 0, + "statusCode": 400, + "label": "", + "headers": [], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [] + } + ], + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "5378cdb8-7126-4b58-aa23-ef79f5b06ba4", + "type": "http", + "documentation": "", + "method": "get", + "endpoint": "v1/myvault/data/snmp", + "responses": [ + { + "uuid": "ca08be91-0f07-42e1-8119-c2510c1b31f4", + "body": "{\"request_id\":\"bbdo2cbd-e3f0-d84c-b668-65416f0b9d97\",\"lease_id\":\"\",\"renewable\":false,\"lease_duration\":0,\"data\":{\"data\":{\"Linux\":\"os/linux/snmp/linux\"},\"metadata\":{\"created_time\":\"2024-11-21T12:34:26.606125626Z\",\"custom_metadata\":null,\"deletion_time\":\"\",\"destroyed\":false,\"version\":1}},\"wrap_info\":null,\"warnings\":null,\"auth\":null,\"mount_type\":\"kv\"}\n", + "latency": 0, + "statusCode": 200, + "label": "", + "headers": [], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [ + { + "target": "header", + "modifier": "X-Vault-Token", + "value": "hvs.thistokenisafakeonebutwillworkwiththetests", + "invert": false, + "operator": "equals" + } + ], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [] + }, + { + "uuid": "9bab45de-a545-4863-a8f6-7613a1d2ad64", + "latency": 0, + "statusCode": 404, + "label": "", + "headers": [ + { + "key": "access-control-allow-headers", + "value": "Content-Type, Origin, Accept, Authorization, Content-Length, X-Requested-With" + }, + { + "key": "access-control-allow-methods", + "value": "GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS" + }, + { + "key": "access-control-allow-origin", + "value": "*" + }, + { + "key": "content-security-policy", + "value": "default-src 'none'" + }, + { + "key": "content-type", + "value": "text/html; charset=utf-8" + }, + { + "key": "x-content-type-options", + "value": "nosniff" + } + ], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": true, + "crudKey": "id", + "callbacks": [] + } + ], + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 + } + ], + "rootChildren": [ + { + "type": "route", + "uuid": "9623237f-f204-4972-ac46-8cfaadfa975a" + }, + { + "type": "route", + "uuid": "5378cdb8-7126-4b58-aa23-ef79f5b06ba4" + } + ], + "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": [] +} \ No newline at end of file diff --git a/tests/centreon/plugins/passwordmgr/env b/tests/centreon/plugins/passwordmgr/env new file mode 100644 index 0000000000..2e79ece4df --- /dev/null +++ b/tests/centreon/plugins/passwordmgr/env @@ -0,0 +1 @@ +APP_SECRET=thiskeyismadefortestspurpose1234 diff --git a/tests/centreon/plugins/passwordmgr/vault_config_encrypted.json b/tests/centreon/plugins/passwordmgr/vault_config_encrypted.json new file mode 100644 index 0000000000..450465f2d1 --- /dev/null +++ b/tests/centreon/plugins/passwordmgr/vault_config_encrypted.json @@ -0,0 +1,10 @@ +{ + "name": "hashicorp_vault", + "url": "127.0.0.1", + "protocol": "http", + "salt": "controlhmachashingkeyforcontrols", + "port": 3000, + "root_path": "", + "role_id": "FO7/tbXY90gg+9igMXhLI2BYrGiRxOtmsgY8GlSVO0DHTO0DYGFnExCAuqPyVLoyvvjdba7Crl7TOb73H/QGMlFkfbE4/qAeiTF9ReMS1TnsUoxfTLKqCXERXGApkxOrSIhv/z6+UBKmQwPVhLwD7w==", + "secret_id": "odQ16TYwubSSi/m4mo88D8Trupbf+3ehgmfxA7wrEtbCEDciZciBRY2cc9Yb2yD+ivR64WR8RsPVPpGbPj1AFpu1TIwL88ic7zjGZaZiIr5kZenoi6xJquxQZbNW5t2N8JaUb/Qupp2wvQ2rxv9zoQ==" +} \ No newline at end of file diff --git a/tests/centreon/plugins/passwordmgr/vault_config_incomplete.json b/tests/centreon/plugins/passwordmgr/vault_config_incomplete.json new file mode 100644 index 0000000000..43e44a2fc9 --- /dev/null +++ b/tests/centreon/plugins/passwordmgr/vault_config_incomplete.json @@ -0,0 +1,10 @@ +{ + "name": "hashicorp_vault", + "url": "127.0.0.1", + "salt": "cetteclenestpasutiliseeinthetest", + "port": 3001, + "root_path": "", + "role_id": "", + "secret_id": "" +} + diff --git a/tests/centreon/plugins/passwordmgr/vault_config_plain.json b/tests/centreon/plugins/passwordmgr/vault_config_plain.json new file mode 100644 index 0000000000..2de5c21e6b --- /dev/null +++ b/tests/centreon/plugins/passwordmgr/vault_config_plain.json @@ -0,0 +1,11 @@ +{ + "name": "hashicorp_vault", + "url": "127.0.0.1", + "protocol": "http", + "salt": "", + "port": 3000, + "root_path": "", + "role_id": "thisroleidisinplaintext", + "secret_id": "thissecretidisinplaintext" +} + diff --git a/tests/centreon/plugins/statefile.t b/tests/centreon/plugins/statefile.t new file mode 100644 index 0000000000..cdebfb6e38 --- /dev/null +++ b/tests/centreon/plugins/statefile.t @@ -0,0 +1,84 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Test::More; + +use FindBin; +use lib "$FindBin::RealBin/../../../src"; +use centreon::plugins::statefile; + +# Mock options class +{ + package MockOptions; + sub new { bless {}, shift } + sub add_options { } + sub add_help { } +} + +sub process_test { + my ($dir, $filename, $suffix, $format, $crypt_algo, $crypt_key) = @_; + + # Create mock objects + my $options = MockOptions->new(); + my $expected_statefile = $dir . '/' . $filename . $suffix; + unlink $expected_statefile if (-e $expected_statefile); + + # Options to create a statefile object + $options->{statefile_dir} = $dir; + $options->{statefile_suffix} = $suffix; + $options->{statefile_format} = $format; + $options->{statefile_cipher} = $crypt_algo; + $options->{statefile_key} = $crypt_key; + + # Test object creation + my $statefile; + eval { $statefile = centreon::plugins::statefile->new(options => $options) }; + ok(!$@, 'Object creation without errors'); + + $statefile->check_options(option_results => $options); + + # Test if the object is blessed correctly + is(ref($statefile), 'centreon::plugins::statefile', 'Object is of correct class'); + + # Test if the object has the expected attributes + can_ok($statefile, qw(new check_options read write get get_string_content error)); + + # Try a first read to initiate a session + is( $statefile->read(statefile => 'test_statefile'), 0, 'State file read.' ); + ok(!$@, 'Read method executed without errors'); + + # Test write method + is( $statefile->write(data => { some_key => 'some_value' }), 1, 'State file written.' ); + ok(!$@, 'Write method executed with plain text data without errors'); + + # Test if the statefile was created + ok(-e $expected_statefile, 'File ' . $expected_statefile . ' exists'); + + + # Test read method + eval { $statefile->read(statefile => 'test_statefile') }; + ok(!$@, 'Read method executed without errors'); + + # Test get method + my $value = $statefile->get(name => 'some_key'); + #use Data::Dumper; + #is($value, 'some_value', 'Get method with plain text data retrieves correct value' . Dumper($statefile->{datas})); + is($value, 'some_value', 'Get method with plain text data retrieves correct value'); + + # Test get_string_content method + my $string_content = $statefile->get_string_content(); + like($string_content, qr/some_key/, 'Get plain text string content method works correctly'); + + # cleanup the mess + unlink $expected_statefile; +} + +sub main { + process_test('/tmp', 'test_statefile', '_plaintext', 'json', undef, undef); + process_test('/tmp', 'test_statefile', '_encrypted', 'json', 'AES', 'mellon'); + done_testing(); +} + +main(); + + diff --git a/tests/cloud/azure/database/elasticpool/mockoon.json b/tests/cloud/azure/database/elasticpool/mockoon.json new file mode 100644 index 0000000000..266fa9eb17 --- /dev/null +++ b/tests/cloud/azure/database/elasticpool/mockoon.json @@ -0,0 +1,270 @@ +{ + "uuid": "101906e9-f832-416c-8781-880c33a0a778", + "lastMigration": 33, + "name": "Azure Elasticpool", + "endpointPrefix": "", + "latency": 0, + "port": 3000, + "hostname": "", + "folders": [], + "routes": [ + { + "uuid": "433aa2a7-20df-4682-88ef-4c87bd0882e1", + "documentation": "Azure login", + "method": "post", + "endpoint": "login/:tenant/oauth2/token", + "responses": [ + { + "uuid": "0c775d57-8661-4c4f-9f30-a3a134d6d09c", + "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, + "type": "http", + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "3f190dd9-690a-413a-bafa-5c9d369b7d22", + "documentation": "", + "method": "post", + "endpoint": "ok/subscriptions/:subscriptionId/providers/Microsoft.PolicyInsights/policyStates/:policyStatesResource/queryResults", + "responses": [ + { + "uuid": "06ebc038-a4f5-48d5-8fb8-2403915a9754", + "body": "{\r\n \"@odata.nextLink\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest\",\r\n \"@odata.count\": 2,\r\n \"value\": [\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/resourceGroups/myrg1/providers/Microsoft.Network/publicIPAddresses/mypubip1\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/Enable Monitoring in Azure Security Center\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": true,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"Enable Monitoring in Azure Security Center\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"Compliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\r\n },\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/resourceGroups/myrg1/providers/Microsoft.Network/publicIPAddresses/mypubip2\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/9ac09b0657d942e5ad4041a6\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": true,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"9ac09b0657d942e5ad4041a6\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"Compliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\r\n },\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"mypubip3\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/9ac09b0657d942e5ad4041a6\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": true,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"9ac09b0657d942e5ad4041a6\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"Compliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\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, + "type": "http", + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "31c8940d-4623-444c-92e1-f340fe74b5b3", + "documentation": "", + "method": "post", + "endpoint": "nok1/subscriptions/:subscriptionId/providers/Microsoft.PolicyInsights/policyStates/:policyStatesResource/queryResults", + "responses": [ + { + "uuid": "64c245ca-0190-4b2e-89d5-87383148286c", + "body": "{\r\n \"@odata.nextLink\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest\",\r\n \"@odata.count\": 2,\r\n \"value\": [\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/resourceGroups/myrg1/providers/Microsoft.Network/publicIPAddresses/mypubip1\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/Enable Monitoring in Azure Security Center\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": false,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"Enable Monitoring in Azure Security Center\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"NonCompliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\r\n },\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/resourceGroups/myrg1/providers/Microsoft.Network/publicIPAddresses/mypubip2\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/9ac09b0657d942e5ad4041a6\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": true,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"9ac09b0657d942e5ad4041a6\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"Compliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\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, + "type": "http", + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "13bf6e0e-8843-4681-942e-404b01326f32", + "documentation": "", + "method": "post", + "endpoint": "nok2/subscriptions/:subscriptionId/providers/Microsoft.PolicyInsights/policyStates/:policyStatesResource/queryResults", + "responses": [ + { + "uuid": "709a35af-cf2b-41f7-a224-3a946ffce703", + "body": "{\r\n \"@odata.nextLink\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest\",\r\n \"@odata.count\": 2,\r\n \"value\": [\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/resourceGroups/myrg1/providers/Microsoft.Network/publicIPAddresses/mypubip1\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/Enable Monitoring in Azure Security Center\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": false,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"Enable Monitoring in Azure Security Center\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"NonCompliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\r\n },\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/resourceGroups/myrg1/providers/Microsoft.Network/publicIPAddresses/mypubip2\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/9ac09b0657d942e5ad4041a6\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": false,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"9ac09b0657d942e5ad4041a6\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"NonCompliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\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, + "type": "http", + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "1eb461f8-c128-432b-a7ca-7ddd71c28fa4", + "documentation": "", + "method": "post", + "endpoint": "oknextlink/subscriptions/:subscriptionId/providers/Microsoft.PolicyInsights/policyStates/:policyStatesResource/queryResults", + "responses": [ + { + "uuid": "a0daaaa4-9c21-4d4d-aa0a-a99da2de7479", + "body": "{\r\n \"@odata.nextLink\": \"http://localhost:3000/ok/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults\",\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest\",\r\n \"@odata.count\": 2,\r\n \"value\": [\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/resourceGroups/myrg1/providers/Microsoft.Network/publicIPAddresses/mypubip1\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/Enable Monitoring in Azure Security Center\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": true,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"Enable Monitoring in Azure Security Center\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"Compliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\r\n },\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/resourceGroups/myrg1/providers/Microsoft.Network/publicIPAddresses/mypubip2\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/9ac09b0657d942e5ad4041a6\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": true,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"9ac09b0657d942e5ad4041a6\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"Compliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\r\n },\r\n {\r\n \"@odata.id\": null,\r\n \"@odata.context\": \"https://management.azure.com/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity\",\r\n \"timestamp\": \"2019-10-09T17:48:05Z\",\r\n \"resourceId\": \"mypubip3\",\r\n \"policyAssignmentId\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852/providers/Microsoft.Authorization/policyAssignments/9ac09b0657d942e5ad4041a6\",\r\n \"policyDefinitionId\": \"/providers/Microsoft.Authorization/policyDefinitions/9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"effectiveParameters\": null,\r\n \"isCompliant\": true,\r\n \"subscriptionId\": \"fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"resourceType\": \"/Microsoft.Network/publicIPAddresses\",\r\n \"resourceLocation\": \"eastus\",\r\n \"resourceGroup\": \"myrg1\",\r\n \"resourceTags\": \"tbd\",\r\n \"policyAssignmentName\": \"9ac09b0657d942e5ad4041a6\",\r\n \"policyAssignmentOwner\": \"tbd\",\r\n \"policyAssignmentParameters\": \"{}\",\r\n \"policyAssignmentScope\": \"/subscriptions/fffedd8f-ffff-fffd-fffd-fffed2f84852\",\r\n \"policyDefinitionName\": \"9daedab3-fb2d-461e-b861-71790eead4f6\",\r\n \"policyDefinitionAction\": \"AuditIfNotExists\",\r\n \"policyDefinitionCategory\": \"tbd\",\r\n \"policySetDefinitionId\": \"/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionName\": \"1f3afdf9-d0c9-4c3d-847f-89da613e70a8\",\r\n \"policySetDefinitionOwner\": null,\r\n \"policySetDefinitionCategory\": null,\r\n \"policySetDefinitionParameters\": null,\r\n \"managementGroupIds\": \"mymg,fff988bf-fff1-ffff-fffb-fffcd011db47\",\r\n \"policyDefinitionReferenceId\": null,\r\n \"complianceState\": \"Compliant\",\r\n \"policyDefinitionGroupNames\": [\r\n \"myGroup\"\r\n ],\r\n \"policyDefinitionVersion\": \"1.0.0-preview\",\r\n \"policySetDefinitionVersion\": \"2.0.1\",\r\n \"policyAssignmentVersion\": \"1.0.0\"\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, + "type": "http", + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "17207a2f-0876-4f3c-ac6a-4fc70288983b", + "type": "http", + "documentation": "", + "method": "get", + "endpoint": "subscriptions/subscription/resourceGroups/emsp-tf-prod-va-rg/providers/Microsoft.Sql/servers/sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do/providers/microsoft.insights/metrics", + "responses": [ + { + "uuid": "83989c8e-65f5-4688-914e-282ade263af7", + "body": "{\n \"cost\": 56,\n \"timespan\": \"2024-08-22T07:50:45Z/2024-08-22T08:05:45Z\",\n \"interval\": \"PT5M\",\n \"value\": [\n {\n \"id\": \"/subscriptions/c0502582-e12d-4e8d-a67b-55b5b08e3e68/resourceGroups/emsp-tf-prod-va-rg/providers/Microsoft.Sql/servers/sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do/providers/Microsoft.Insights/metrics/allocated_data_storage\",\n \"type\": \"Microsoft.Insights/metrics\",\n \"name\": {\n \"value\": \"allocated_data_storage\",\n \"localizedValue\": \"Data space allocated\"\n },\n \"displayDescription\": \"Data space allocated\",\n \"unit\": \"Bytes\",\n \"timeseries\": [\n {\n \"metadatavalues\": [],\n \"data\": [\n {\n \"timeStamp\": \"2024-08-22T07:50:00Z\",\n \"average\": 215822106624\n },\n {\n \"timeStamp\": \"2024-08-22T07:55:00Z\",\n \"average\": 215822106624\n },\n {\n \"timeStamp\": \"2024-08-22T08:00:00Z\",\n \"average\": 215822106624\n }\n ]\n }\n ],\n \"errorCode\": \"Success\"\n },\n {\n \"id\": \"/subscriptions/c0502582-e12d-4e8d-a67b-55b5b08e3e68/resourceGroups/emsp-tf-prod-va-rg/providers/Microsoft.Sql/servers/sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do/providers/Microsoft.Insights/metrics/storage_percent\",\n \"type\": \"Microsoft.Insights/metrics\",\n \"name\": {\n \"value\": \"storage_percent\",\n \"localizedValue\": \"Data space used percent\"\n },\n \"displayDescription\": \"Data space used percent. Not applicable to hyperscale\",\n \"unit\": \"Percent\",\n \"timeseries\": [\n {\n \"metadatavalues\": [],\n \"data\": [\n {\n \"timeStamp\": \"2024-08-22T07:50:00Z\",\n \"average\": 38\n },\n {\n \"timeStamp\": \"2024-08-22T07:55:00Z\",\n \"average\": 38\n },\n {\n \"timeStamp\": \"2024-08-22T08:00:00Z\",\n \"average\": 38\n }\n ]\n }\n ],\n \"errorCode\": \"Success\"\n },\n {\n \"id\": \"/subscriptions/c0502582-e12d-4e8d-a67b-55b5b08e3e68/resourceGroups/emsp-tf-prod-va-rg/providers/Microsoft.Sql/servers/sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do/providers/Microsoft.Insights/metrics/storage_used\",\n \"type\": \"Microsoft.Insights/metrics\",\n \"name\": {\n \"value\": \"storage_used\",\n \"localizedValue\": \"Data space used\"\n },\n \"displayDescription\": \"Data space used\",\n \"unit\": \"Bytes\",\n \"timeseries\": [\n {\n \"metadatavalues\": [],\n \"data\": [\n {\n \"timeStamp\": \"2024-08-22T07:50:00Z\",\n \"average\": 122406567936\n },\n {\n \"timeStamp\": \"2024-08-22T07:55:00Z\",\n \"average\": 122406567936\n },\n {\n \"timeStamp\": \"2024-08-22T08:00:00Z\",\n \"average\": 122406567936\n }\n ]\n }\n ],\n \"errorCode\": \"Success\"\n },\n {\n \"id\": \"/subscriptions/c0502582-e12d-4e8d-a67b-55b5b08e3e68/resourceGroups/emsp-tf-prod-va-rg/providers/Microsoft.Sql/servers/sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do/providers/Microsoft.Insights/metrics/allocated_data_storage_percent\",\n \"type\": \"Microsoft.Insights/metrics\",\n \"name\": {\n \"value\": \"allocated_data_storage_percent\",\n \"localizedValue\": \"Data space allocated percent\"\n },\n \"displayDescription\": \"Data space allocated percent. Not applicable to hyperscale\",\n \"unit\": \"Percent\",\n \"timeseries\": [\n {\n \"metadatavalues\": [],\n \"data\": [\n {\n \"timeStamp\": \"2024-08-22T07:50:00Z\",\n \"average\": 67\n },\n {\n \"timeStamp\": \"2024-08-22T07:55:00Z\",\n \"average\": 67\n },\n {\n \"timeStamp\": \"2024-08-22T08:00:00Z\",\n \"average\": 67\n }\n ]\n }\n ],\n \"errorCode\": \"Success\"\n }\n ],\n \"namespace\": \"Microsoft.Sql/servers/elasticpools\",\n \"resourceregion\": \"francecentral\"\n}\n", + "latency": 0, + "statusCode": 200, + "label": "", + "headers": [ + { + "key": "content-security-policy", + "value": "default-src 'none'" + }, + { + "key": "content-type", + "value": "text/html; charset=utf-8" + }, + { + "key": "x-content-type-options", + "value": "nosniff" + } + ], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [] + } + ], + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 + } + ], + "rootChildren": [ + { + "type": "route", + "uuid": "433aa2a7-20df-4682-88ef-4c87bd0882e1" + }, + { + "type": "route", + "uuid": "3f190dd9-690a-413a-bafa-5c9d369b7d22" + }, + { + "type": "route", + "uuid": "1eb461f8-c128-432b-a7ca-7ddd71c28fa4" + }, + { + "type": "route", + "uuid": "31c8940d-4623-444c-92e1-f340fe74b5b3" + }, + { + "type": "route", + "uuid": "13bf6e0e-8843-4681-942e-404b01326f32" + }, + { + "type": "route", + "uuid": "17207a2f-0876-4f3c-ac6a-4fc70288983b" + } + ], + "proxyMode": false, + "proxyHost": "", + "proxyRemovePrefix": false, + "tlsOptions": { + "enabled": false, + "type": "CERT", + "pfxPath": "", + "certPath": "", + "keyPath": "", + "caPath": "", + "passphrase": "" + }, + "cors": true, + "headers": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "proxyReqHeaders": [ + { + "key": "", + "value": "" + } + ], + "proxyResHeaders": [ + { + "key": "", + "value": "" + } + ], + "data": [], + "callbacks": [] +} \ No newline at end of file diff --git a/tests/cloud/azure/database/elasticpool/storage.robot b/tests/cloud/azure/database/elasticpool/storage.robot new file mode 100644 index 0000000000..7566fbd4ca --- /dev/null +++ b/tests/cloud/azure/database/elasticpool/storage.robot @@ -0,0 +1,40 @@ +*** Settings *** +Documentation Azure Database Elasticpool plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Start Mockoon ${MOCKOON_JSON} +Suite Teardown Stop Mockoon +Test Timeout 120s + + +*** Variables *** +${MOCKOON_JSON} ${CURDIR}${/}mockoon.json + +${BASE_URL} http://${HOSTNAME}:${APIPORT} +${LOGIN_ENDPOINT} ${BASE_URL}/login +${CMD} ${CENTREON_PLUGINS} --plugin=cloud::azure::database::elasticpool::plugin --custommode=api --mode=storage --subscription=subscription --tenant=tenant --client-id=client_id --client-secret=secret --login-endpoint=${LOGIN_ENDPOINT} --management-endpoint=${BASE_URL} + + +*** Test Cases *** +Storage ${tc} + [Tags] cloud azure api mockoon + ${command} Catenate + ... ${CMD} + ... --resource=${resource} + ... --resource-group=${resource_group} + ... ${thresholds} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc resource resource_group thresholds expected_result -- + ... 1 sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do emsp-tf-prod-va-rg ${EMPTY} OK: Elastic Pool 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do' Statistic 'average' Metrics Allocated data storage: 201.00 GB, Allocated data storage percentage: 67.00 %, Storage usage percentage: 38.00 %, Storage usage: 114.00 GB | 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.bytes'=215822106624.00B;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.percentage'=67.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.usage.percentage'=38.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.used.bytes'=122406567936.00B;;;; + ... 2 sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do emsp-tf-prod-va-rg --warning-allocated-data-storage-percent=0.01 WARNING: Elastic Pool 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do' Statistic 'average' Metrics Allocated data storage percentage: 67.00 % | 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.bytes'=215822106624.00B;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.percentage'=67.00%;0:0.01;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.usage.percentage'=38.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.used.bytes'=122406567936.00B;;;; + ... 3 sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do emsp-tf-prod-va-rg --critical-allocated-data-storage-percent=0.01 CRITICAL: Elastic Pool 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do' Statistic 'average' Metrics Allocated data storage percentage: 67.00 % | 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.bytes'=215822106624.00B;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.percentage'=67.00%;;0:0.01;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.usage.percentage'=38.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.used.bytes'=122406567936.00B;;;; + ... 4 sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do emsp-tf-prod-va-rg --warning-allocated-data-storage=0.01 WARNING: Elastic Pool 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do' Statistic 'average' Metrics Allocated data storage: 201.00 GB | 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.bytes'=215822106624.00B;0:0.01;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.percentage'=67.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.usage.percentage'=38.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.used.bytes'=122406567936.00B;;;; + ... 5 sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do emsp-tf-prod-va-rg --critical-allocated-data-storage=0.01 CRITICAL: Elastic Pool 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do' Statistic 'average' Metrics Allocated data storage: 201.00 GB | 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.bytes'=215822106624.00B;;0:0.01;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.percentage'=67.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.usage.percentage'=38.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.used.bytes'=122406567936.00B;;;; + ... 6 sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do emsp-tf-prod-va-rg --warning-storage-percent=0.01 WARNING: Elastic Pool 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do' Statistic 'average' Metrics Storage usage percentage: 38.00 % | 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.bytes'=215822106624.00B;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.percentage'=67.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.usage.percentage'=38.00%;0:0.01;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.used.bytes'=122406567936.00B;;;; + ... 7 sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do emsp-tf-prod-va-rg --critical-storage-percent=0.01 CRITICAL: Elastic Pool 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do' Statistic 'average' Metrics Storage usage percentage: 38.00 % | 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.bytes'=215822106624.00B;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.percentage'=67.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.usage.percentage'=38.00%;;0:0.01;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.used.bytes'=122406567936.00B;;;; + ... 8 sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do emsp-tf-prod-va-rg --warning-storage-used=0.01 WARNING: Elastic Pool 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do' Statistic 'average' Metrics Storage usage: 114.00 GB | 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.bytes'=215822106624.00B;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.percentage'=67.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.usage.percentage'=38.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.used.bytes'=122406567936.00B;0:0.01;;; + ... 9 sql-bb-stsw-prod-do/elasticpools/sql-epool-bb-psme-prod-do emsp-tf-prod-va-rg --critical-storage-used=0.01 CRITICAL: Elastic Pool 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do' Statistic 'average' Metrics Storage usage: 114.00 GB | 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.bytes'=215822106624.00B;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.data.allocated.percentage'=67.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.usage.percentage'=38.00%;;;; 'sql-bb-stsw-prod-do/sql-epool-bb-psme-prod-do~average#elasticpool.storage.used.bytes'=122406567936.00B;;0:0.01;; + ... 10 ${EMPTY} ${EMPTY} ${EMPTY} UNKNOWN: Incorrect resource format diff --git a/tests/cloud/azure/policyinsights/policystates/cloud-azure-policyinsights-policystates.robot b/tests/cloud/azure/policyinsights/policystates/cloud-azure-policyinsights-policystates.robot index 8b7c3d58d1..3787517911 100644 --- a/tests/cloud/azure/policyinsights/policystates/cloud-azure-policyinsights-policystates.robot +++ b/tests/cloud/azure/policyinsights/policystates/cloud-azure-policyinsights-policystates.robot @@ -13,7 +13,7 @@ ${MOCKOON_JSON} ${CURDIR}${/}cloud-azure-policyinsights-policystates.jso ${BASE_URL} http://${HOSTNAME}:${APIPORT} ${LOGIN_ENDPOINT} ${BASE_URL}/login -${CMD} ${CENTREON_PLUGINS} --plugin=cloud::azure::policyinsights::policystates::plugin --subscription=subscription --tenant=tenant --client-id=client_id --client-secret=secret --statefile-dir=/dev/shm/ --login-endpoint=${LOGIN_ENDPOINT} +${CMD} ${CENTREON_PLUGINS} --plugin=cloud::azure::policyinsights::policystates::plugin --subscription=subscription --tenant=tenant --client-id=client_id --client-secret=secret --login-endpoint=${LOGIN_ENDPOINT} *** Test Cases *** @@ -31,4 +31,4 @@ Azure PolicyInsights PolicyStates compliance ${tc} ... 1 ${BASE_URL}/ok ${EMPTY} ${EMPTY} ${EMPTY} OK: Number of non compliant policies: 0 - All compliances states are ok | 'policies.non_compliant.count'=0;;;0; ... 2 ${BASE_URL}/oknextlink 9daedab3-fb2d-461e-b861-71790eead4f6 ${EMPTY} ${EMPTY} OK: Number of non compliant policies: 0 - All compliances states are ok | 'policies.non_compliant.count'=0;;;0; ... 3 ${BASE_URL}/nok1 9daedab3-fb2d-461e-b861-71790eead4f6 fr ${EMPTY} CRITICAL: Compliance state for policy '9daedab3-fb2d-461e-b861-71790eead4f6' on resource 'mypubip1' is 'NonCompliant' | 'policies.non_compliant.count'=1;;;0; - ... 4 ${BASE_URL}/nok2 9daedab3-fb2d-461e-b861-71790eead4f6 fr ip CRITICAL: Compliance state for policy '9daedab3-fb2d-461e-b861-71790eead4f6' on resource 'mypubip1' is 'NonCompliant' - Compliance state for policy '9daedab3-fb2d-461e-b861-71790eead4f6' on resource 'mypubip2' is 'NonCompliant' | 'policies.non_compliant.count'=2;;;0; \ No newline at end of file + ... 4 ${BASE_URL}/nok2 9daedab3-fb2d-461e-b861-71790eead4f6 fr ip CRITICAL: Compliance state for policy '9daedab3-fb2d-461e-b861-71790eead4f6' on resource 'mypubip1' is 'NonCompliant' - Compliance state for policy '9daedab3-fb2d-461e-b861-71790eead4f6' on resource 'mypubip2' is 'NonCompliant' | 'policies.non_compliant.count'=2;;;0; diff --git a/tests/cloud/vmware/velocloud/restapi/edgestatus.robot b/tests/cloud/vmware/velocloud/restapi/edgestatus.robot index 5855369f9f..d30f1be4e2 100644 --- a/tests/cloud/vmware/velocloud/restapi/edgestatus.robot +++ b/tests/cloud/vmware/velocloud/restapi/edgestatus.robot @@ -21,7 +21,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ *** Test Cases *** Edge Status ${tc} @@ -40,4 +39,4 @@ Edge Status ${tc} Examples: tc extraoptions expected_result -- ... 1 ${EMPTY} CRITICAL: Edge 'MYEDGE#02' State is 'OFFLINE', Service State is 'IN_SERVICE', HA State is 'READY', Activation State is 'ACTIVATED' - ... 2 --critical-status='' OK: All edges status are ok \ No newline at end of file + ... 2 --critical-status='' OK: All edges status are ok diff --git a/tests/cloud/vmware/velocloud/restapi/listedges.robot b/tests/cloud/vmware/velocloud/restapi/listedges.robot index 32ac04c176..646a473ed8 100644 --- a/tests/cloud/vmware/velocloud/restapi/listedges.robot +++ b/tests/cloud/vmware/velocloud/restapi/listedges.robot @@ -21,7 +21,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ *** Test Cases *** List Edges ${tc} diff --git a/tests/hardware/devices/video/appeartv/snmp/alarms.robot b/tests/hardware/devices/video/appeartv/snmp/alarms.robot new file mode 100644 index 0000000000..dc396ac1f6 --- /dev/null +++ b/tests/hardware/devices/video/appeartv/snmp/alarms.robot @@ -0,0 +1,36 @@ +*** Settings *** +Documentation Hardware Video Appeartv Alarms + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Ctn Generic Suite Setup +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} +... --plugin=hardware::devices::video::appeartv::snmp::plugin +... --mode=alarms +... --hostname=${HOSTNAME} +... --snmp-port=${SNMPPORT} +... --snmp-community=hardware/devices/video/appeartv/snmp/appeartv + +*** Test Cases *** +AppearTV Alarms ${tc} + [Documentation] Hardware Video AppeartTV Alarms + [Tags] hardware appeartv alarms + ${command} Catenate + ... ${CMD} + ... ${extraoptions} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc extraoptions expected_result -- + ... 1 ${EMPTY} WARNING: 1 problem(s) detected | 'alerts'=1;;;0; + ... 2 --warning-status='\\\%{severity} =~ /minor/i' WARNING: 1 problem(s) detected | 'alerts'=1;;;0; + ... 3 --critical-status='\\\%{severity} =~ /critical|major|minor/i' CRITICAL: 1 problem(s) detected | 'alerts'=1;;;0; + ... 4 --filter-msg='Error' OK: 0 problem(s) detected | 'alerts'=0;;;0; + ... 5 --filter-msg='Disconnected' WARNING: 1 problem(s) detected | 'alerts'=1;;;0; + ... 6 --filter-msg='Disconnected' --critical-status='\\\%{severity} =~ /minor/i' CRITICAL: 1 problem(s) detected | 'alerts'=1;;;0; + ... 7 --memory WARNING: 1 problem(s) detected | 'alerts'=1;;;0; + ... 8 --memory OK: 0 problem(s) detected | 'alerts'=0;;;0; diff --git a/tests/hardware/devices/video/appeartv/snmp/appeartv.snmpwalk b/tests/hardware/devices/video/appeartv/snmp/appeartv.snmpwalk new file mode 100644 index 0000000000..428fbb9874 --- /dev/null +++ b/tests/hardware/devices/video/appeartv/snmp/appeartv.snmpwalk @@ -0,0 +1,4 @@ +.1.3.6.1.4.1.23916.3.1.4.1.3.0 = STRING: "Alarm 1" +.1.3.6.1.4.1.23916.3.1.4.1.4.0 = STRING: "Disconnected sound" +.1.3.6.1.4.1.23916.3.1.4.1.6.0 = STRING: "2024-09-16 14:49:18" +.1.3.6.1.4.1.23916.3.1.4.1.13.0 = INTEGER: 3 diff --git a/tests/hardware/kvm/avocent/acs/8000/Hardware_kvm.robot b/tests/hardware/kvm/avocent/acs/8000/Hardware_kvm.robot new file mode 100644 index 0000000000..0f9f2e821e --- /dev/null +++ b/tests/hardware/kvm/avocent/acs/8000/Hardware_kvm.robot @@ -0,0 +1,37 @@ +*** Settings *** +Documentation hardware mode +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${SNMPCOMMUNITY} hardware/kvm/avocent/acs/8000/avocent8000 + + +*** Test Cases *** +Hardware + [Tags] hardware kvm avocent hardware-mode snmp + ${output} Run Avocent 8000 Plugin "hardware" "" + + ${output} Strip String ${output} + Should Be Equal As Strings + ... ${output} + ... OK: All 2 components are ok [2/2 psus]. | 'hardware.psu.count'=2;;;; + ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} + +*** Keywords *** +Run Avocent 8000 Plugin + [Arguments] ${mode} ${extraoptions} + ${command} Catenate + ... ${CENTREON_PLUGINS} + ... --plugin=hardware::kvm::avocent::acs::8000::snmp::plugin + ... --mode=${mode} + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=${SNMPCOMMUNITY} + ... ${extraoptions} + + ${output} Run ${command} + RETURN ${output} \ No newline at end of file diff --git a/tests/hardware/kvm/avocent/acs/8000/cpu_detailed.robot b/tests/hardware/kvm/avocent/acs/8000/cpu_detailed.robot new file mode 100644 index 0000000000..bb719d7fa1 --- /dev/null +++ b/tests/hardware/kvm/avocent/acs/8000/cpu_detailed.robot @@ -0,0 +1,48 @@ +*** Settings *** +Documentation cpu-detailed mode + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${SNMPCOMMUNITY} hardware/kvm/avocent/acs/8000/avocent8000 + + +*** Test Cases *** +Cpu-Detailed + [Tags] hardware kvm avocent cpu snmp + Remove File /dev/shm/snmpstandard_127.0.0.1_2024_cpu-detailed* + ${output} Run Avocent 8000 Plugin "cpu-detailed" --statefile-dir=/dev/shm/ + ${output} Strip String ${output} + Should Be Equal As Strings + ... ${output} + ... OK: CPU Usage: user : Buffer creation, nice : Buffer creation, system : Buffer creation, idle : Buffer creation, wait : Buffer creation, kernel : Buffer creation, interrupt : Buffer creation, softirq : Buffer creation, steal : Buffer creation, guest : Buffer creation, guestnice : Buffer creation + ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} + + ${output} Run Avocent 8000 Plugin "cpu-detailed" --statefile-dir=/dev/shm/ + ${output} Strip String ${output} + Remove File /dev/shm/snmpstandard_127.0.0.1_2024_cpu-detailed* + Should Be Equal As Strings + ... ${output} + ... OK: CPU Usage: user : counter not moved, nice : counter not moved, system : counter not moved, idle : counter not moved, wait : counter not moved, kernel : counter not moved, interrupt : counter not moved, softirq : counter not moved, steal : counter not moved, guest : counter not moved, guestnice : counter not moved + ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} + + + +*** Keywords *** +Run Avocent 8000 Plugin + [Arguments] ${mode} ${extraoptions} + ${command} Catenate + ... ${CENTREON_PLUGINS} + ... --plugin=hardware::kvm::avocent::acs::8000::snmp::plugin + ... --mode=${mode} + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=${SNMPCOMMUNITY} + ... ${extraoptions} + + ${output} Run ${command} + RETURN ${output} diff --git a/tests/hardware/kvm/avocent/acs/8000/load.robot b/tests/hardware/kvm/avocent/acs/8000/load.robot new file mode 100644 index 0000000000..c90b715da0 --- /dev/null +++ b/tests/hardware/kvm/avocent/acs/8000/load.robot @@ -0,0 +1,38 @@ +*** Settings *** +Documentation load mode + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${SNMPCOMMUNITY} hardware/kvm/avocent/acs/8000/avocent8000 + + +*** Test Cases *** +Load + [Tags] hardware kvm avocent load snmp + ${output} Run Avocent 8000 Plugin "load" "" + + ${output} Strip String ${output} + Should Be Equal As Strings + ... ${output} + ... OK: Load average: 0.04, 0.10, 0.15 | 'load1'=0.04;;;0; 'load5'=0.10;;;0; 'load15'=0.15;;;0; + ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} + +*** Keywords *** +Run Avocent 8000 Plugin + [Arguments] ${mode} ${extraoptions} + ${command} Catenate + ... ${CENTREON_PLUGINS} + ... --plugin=hardware::kvm::avocent::acs::8000::snmp::plugin + ... --mode=${mode} + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=${SNMPCOMMUNITY} + ... ${extraoptions} + + ${output} Run ${command} + RETURN ${output} diff --git a/tests/hardware/kvm/avocent/acs/8000/memory.robot b/tests/hardware/kvm/avocent/acs/8000/memory.robot new file mode 100644 index 0000000000..9e20e1ed60 --- /dev/null +++ b/tests/hardware/kvm/avocent/acs/8000/memory.robot @@ -0,0 +1,38 @@ +*** Settings *** +Documentation memory mode + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${SNMPCOMMUNITY} hardware/kvm/avocent/acs/8000/avocent8000 + + +*** Test Cases *** +Memory + [Tags] hardware kvm avocent memory snmp + ${output} Run Avocent 8000 Plugin "memory" "" + + ${output} Strip String ${output} + Should Be Equal As Strings + ... ${output} + ... OK: Ram Total: 1.92 GB Used (-buffers/cache): 626.18 MB (31.79%) Free: 1.31 GB (68.21%), Buffer: 2.04 MB, Cached: 723.54 MB, Shared: 26.09 MB | 'used'=656592896B;;;0;2065698816 'free'=1409105920B;;;0;2065698816 'used_prct'=31.79%;;;0;100 'buffer'=2134016B;;;0; 'cached'=758689792B;;;0; 'shared'=27357184B;;;0; + ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} + +*** Keywords *** +Run Avocent 8000 Plugin + [Arguments] ${mode} ${extraoptions} + ${command} Catenate + ... ${CENTREON_PLUGINS} + ... --plugin=hardware::kvm::avocent::acs::8000::snmp::plugin + ... --mode=${mode} + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=${SNMPCOMMUNITY} + ... ${extraoptions} + + ${output} Run ${command} + RETURN ${output} diff --git a/tests/hardware/kvm/avocent/acs/8000/hardware-kvm-avocent-acs-8000.robot b/tests/hardware/kvm/avocent/acs/8000/serial_ports.robot similarity index 52% rename from tests/hardware/kvm/avocent/acs/8000/hardware-kvm-avocent-acs-8000.robot rename to tests/hardware/kvm/avocent/acs/8000/serial_ports.robot index 1eb1c73c13..8e15dce840 100644 --- a/tests/hardware/kvm/avocent/acs/8000/hardware-kvm-avocent-acs-8000.robot +++ b/tests/hardware/kvm/avocent/acs/8000/serial_ports.robot @@ -1,5 +1,5 @@ *** Settings *** -Documentation hardware::kvm::avocent::acs::8000::snmp::plugin +Documentation serial-ports mode Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}..${/}resources/import.resource @@ -11,60 +11,7 @@ ${SNMPCOMMUNITY} hardware/kvm/avocent/acs/8000/avocent8000 *** Test Cases *** -Cpu-Detailed - [Documentation] cpu-detailed mode - [Tags] hardware kvm avocent cpu snmp - Remove File /dev/shm/snmpstandard_127.0.0.1_2024_cpu-detailed* - ${output} Run Avocent 8000 Plugin "cpu-detailed" --statefile-dir=/dev/shm/ - ${output} Strip String ${output} - Should Be Equal As Strings - ... ${output} - ... OK: CPU Usage: user : Buffer creation, nice : Buffer creation, system : Buffer creation, idle : Buffer creation, wait : Buffer creation, kernel : Buffer creation, interrupt : Buffer creation, softirq : Buffer creation, steal : Buffer creation, guest : Buffer creation, guestnice : Buffer creation - ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} - - ${output} Run Avocent 8000 Plugin "cpu-detailed" --statefile-dir=/dev/shm/ - ${output} Strip String ${output} - Remove File /dev/shm/snmpstandard_127.0.0.1_2024_cpu-detailed* - Should Be Equal As Strings - ... ${output} - ... OK: CPU Usage: user : counter not moved, nice : counter not moved, system : counter not moved, idle : counter not moved, wait : counter not moved, kernel : counter not moved, interrupt : counter not moved, softirq : counter not moved, steal : counter not moved, guest : counter not moved, guestnice : counter not moved - ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} - -Hardware - [Documentation] hardware mode - [Tags] hardware kvm avocent hardware-mode snmp - ${output} Run Avocent 8000 Plugin "hardware" "" - - ${output} Strip String ${output} - Should Be Equal As Strings - ... ${output} - ... OK: All 2 components are ok [2/2 psus]. | 'hardware.psu.count'=2;;;; - ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} - -Load - [Documentation] load mode - [Tags] hardware kvm avocent load snmp - ${output} Run Avocent 8000 Plugin "load" "" - - ${output} Strip String ${output} - Should Be Equal As Strings - ... ${output} - ... OK: Load average: 0.04, 0.10, 0.15 | 'load1'=0.04;;;0; 'load5'=0.10;;;0; 'load15'=0.15;;;0; - ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} - -Memory - [Documentation] memory mode - [Tags] hardware kvm avocent memory snmp - ${output} Run Avocent 8000 Plugin "memory" "" - - ${output} Strip String ${output} - Should Be Equal As Strings - ... ${output} - ... OK: Ram Total: 1.92 GB Used (-buffers/cache): 626.18 MB (31.79%) Free: 1.31 GB (68.21%), Buffer: 2.04 MB, Cached: 723.54 MB, Shared: 26.09 MB | 'used'=656592896B;;;0;2065698816 'free'=1409105920B;;;0;2065698816 'used_prct'=31.79%;;;0;100 'buffer'=2134016B;;;0; 'cached'=758689792B;;;0; 'shared'=27357184B;;;0; - ... Wrong output result for command:{\n}${output}{\n}{\n}{\n} - Serial Ports - [Documentation] serial-ports mode [Tags] hardware kvm avocent serial snmp Remove File /dev/shm/avocent_acs_8000_127.0.0.1_2024_serial-ports* ${output} Run Avocent 8000 Plugin "serial-ports" --statefile-dir=/dev/shm/ diff --git a/tests/network/cisco/meraki/cloudcontroller/restapi/vpntunnels.robot b/tests/network/cisco/meraki/cloudcontroller/restapi/vpntunnels.robot index 2940efea50..862021e9e0 100644 --- a/tests/network/cisco/meraki/cloudcontroller/restapi/vpntunnels.robot +++ b/tests/network/cisco/meraki/cloudcontroller/restapi/vpntunnels.robot @@ -12,7 +12,6 @@ ${MOCKOON_JSON} ${CURDIR}${/}meraki.mockoon.json ${CMD} ${CENTREON_PLUGINS} --plugin=network::cisco::meraki::cloudcontroller::restapi::plugin ... --api-token=EEECGFCGFCGF -... --statefile-dir=/dev/shm/ *** Test Cases *** diff --git a/tests/network/cisco/standard/snmp/interfaces.robot b/tests/network/cisco/standard/snmp/interfaces.robot deleted file mode 100644 index 3698478c44..0000000000 --- a/tests/network/cisco/standard/snmp/interfaces.robot +++ /dev/null @@ -1,32 +0,0 @@ -*** Settings *** -Documentation Network citrix netscaler health - -Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource - -Test Timeout 120s - - -*** Variables *** -${CMD} ${CENTREON_PLUGINS} --plugin=network::cisco::standard::snmp::plugin - - -*** Test Cases *** -interfaces ${tc} - [Tags] network citrix snmp - ${command} Catenate - ... ${CMD} - ... --mode=interfaces - ... --hostname=${HOSTNAME} - ... --snmp-port=${SNMPPORT} - ... --snmp-community=network/cisco/standard/snmp/slim_cisco_fc_fe - ... ${extra_options} - - Ctn Run Command And Check Result As Strings ${command} ${expected_result} - - Examples: tc extra_options expected_result -- - ... 1 --oid-display='ifName' UNKNOWN: Can't construct cache... - ... 2 --oid-extra-display='ifdesc' UNKNOWN: Can't construct cache... - ... 3 --verbose UNKNOWN: Can't construct cache... - ... 4 --show-cache $VAR1 = {}; - ... 5 --display-transform-dst='ens' UNKNOWN: Can't construct cache... - ... 6 --display-transform-src='eth' UNKNOWN: Can't construct cache... diff --git a/tests/network/cisco/standard/snmp/slim_cisco_fc_fe.snmpwalk b/tests/network/cisco/standard/snmp/slim_cisco_fc_fe.snmpwalk deleted file mode 100644 index 04799a7f20..0000000000 --- a/tests/network/cisco/standard/snmp/slim_cisco_fc_fe.snmpwalk +++ /dev/null @@ -1,588 +0,0 @@ -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16777216 = Hex-STRING: 20 01 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16781312 = Hex-STRING: 20 02 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16785408 = Hex-STRING: 20 03 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16789504 = Hex-STRING: 20 04 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16793600 = Hex-STRING: 20 05 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16797696 = Hex-STRING: 20 06 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16801792 = Hex-STRING: 20 07 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16805888 = Hex-STRING: 20 08 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16809984 = Hex-STRING: 20 09 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16814080 = Hex-STRING: 20 0A 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16818176 = Hex-STRING: 20 0B 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16822272 = Hex-STRING: 20 0C 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16826368 = Hex-STRING: 20 0D 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16830464 = Hex-STRING: 20 0E 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16834560 = Hex-STRING: 20 0F 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16838656 = Hex-STRING: 20 10 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16842752 = Hex-STRING: 20 11 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16846848 = Hex-STRING: 20 12 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16850944 = Hex-STRING: 20 13 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16855040 = Hex-STRING: 20 14 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16859136 = Hex-STRING: 20 15 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16863232 = Hex-STRING: 20 16 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16867328 = Hex-STRING: 20 17 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16871424 = Hex-STRING: 20 18 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16875520 = Hex-STRING: 20 19 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16879616 = Hex-STRING: 20 1A 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16883712 = Hex-STRING: 20 1B 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16887808 = Hex-STRING: 20 1C 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16891904 = Hex-STRING: 20 1D 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16896000 = Hex-STRING: 20 1E 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16900096 = Hex-STRING: 20 1F 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16904192 = Hex-STRING: 20 20 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16908288 = Hex-STRING: 20 21 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16912384 = Hex-STRING: 20 22 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16916480 = Hex-STRING: 20 23 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16920576 = Hex-STRING: 20 24 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16924672 = Hex-STRING: 20 25 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16928768 = Hex-STRING: 20 26 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16932864 = Hex-STRING: 20 27 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16936960 = Hex-STRING: 20 28 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16941056 = Hex-STRING: 20 29 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16945152 = Hex-STRING: 20 2A 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16949248 = Hex-STRING: 20 2B 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16953344 = Hex-STRING: 20 2C 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16957440 = Hex-STRING: 20 2D 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16961536 = Hex-STRING: 20 2E 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16965632 = Hex-STRING: 20 2F 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.16969728 = Hex-STRING: 20 30 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.1.67108864 = Hex-STRING: 24 01 00 08 31 47 C2 F0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16777216 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16781312 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16785408 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16789504 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16793600 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16797696 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16801792 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16805888 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16809984 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16814080 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16818176 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16822272 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16826368 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16830464 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16834560 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16838656 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16842752 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16846848 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16850944 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16855040 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16859136 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16863232 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16867328 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16871424 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16875520 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16879616 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16883712 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16887808 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16891904 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16896000 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16900096 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16904192 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16908288 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16912384 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16916480 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16920576 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16924672 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16928768 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16932864 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16936960 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16941056 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16945152 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16949248 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16953344 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16957440 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16961536 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16965632 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.16969728 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.10.67108864 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16777216 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16781312 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16785408 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16789504 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16793600 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16797696 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16801792 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16805888 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16809984 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16814080 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16818176 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16822272 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16826368 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16830464 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16834560 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16838656 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16842752 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16846848 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16850944 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16855040 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16859136 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16863232 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16867328 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16871424 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16875520 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16879616 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16883712 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16887808 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16891904 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16896000 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16900096 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16904192 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16908288 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16912384 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16916480 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16920576 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16924672 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16928768 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16932864 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16936960 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16941056 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16945152 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16949248 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16953344 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16957440 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16961536 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16965632 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.16969728 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.11.67108864 = Hex-STRING: 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16777216 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16781312 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16785408 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16789504 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16793600 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16797696 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16801792 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16805888 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16809984 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16814080 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16818176 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16822272 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16826368 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16830464 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16834560 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16838656 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16842752 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16846848 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16850944 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16855040 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16859136 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16863232 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16867328 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16871424 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16875520 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16879616 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16883712 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16887808 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16891904 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16896000 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16900096 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16904192 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16908288 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16912384 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16916480 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16920576 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16924672 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16928768 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16932864 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16936960 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16941056 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16945152 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16949248 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16953344 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16957440 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16961536 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16965632 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.16969728 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.12.67108864 = Hex-STRING: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FC -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16777216 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16781312 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16785408 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16789504 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16793600 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16797696 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16801792 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16805888 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16809984 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16814080 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16818176 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16822272 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16826368 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16830464 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16834560 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16838656 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16842752 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16846848 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16850944 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16855040 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16859136 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16863232 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16867328 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16871424 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16875520 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16879616 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16883712 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16887808 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16891904 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16896000 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16900096 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16904192 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16908288 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16912384 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16916480 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16920576 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16924672 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16928768 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16932864 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16936960 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16941056 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16945152 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16949248 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16953344 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16957440 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16961536 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16965632 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.16969728 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.13.67108864 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16777216 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16781312 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16785408 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16789504 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16793600 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16797696 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16801792 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16805888 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16809984 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16814080 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16818176 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16822272 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16826368 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16830464 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16834560 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16838656 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16842752 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16846848 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16850944 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16855040 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16859136 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16863232 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16867328 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16871424 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16875520 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16879616 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16883712 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16887808 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16891904 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16896000 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16900096 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16904192 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16908288 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16912384 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16916480 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16920576 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16924672 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16928768 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16932864 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16936960 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16941056 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16945152 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16949248 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16953344 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16957440 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16961536 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16965632 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.16969728 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.14.67108864 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16777216 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16781312 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16785408 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16789504 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16793600 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16797696 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16801792 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16805888 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16809984 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16814080 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16818176 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16822272 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16826368 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16830464 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16834560 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16838656 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16842752 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16846848 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16850944 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16855040 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16859136 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16863232 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16867328 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16871424 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16875520 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16879616 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16883712 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16887808 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16891904 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16896000 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16900096 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16904192 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16908288 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16912384 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16916480 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16920576 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16924672 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16928768 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16932864 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16936960 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16941056 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16945152 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16949248 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16953344 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16957440 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16961536 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16965632 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.16969728 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.15.67108864 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16777216 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16781312 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16785408 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16789504 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16793600 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16797696 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16801792 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16805888 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16809984 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16814080 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16818176 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16822272 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16826368 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16830464 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16834560 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16838656 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16842752 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16846848 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16850944 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16855040 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16859136 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16863232 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16867328 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16871424 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16875520 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16879616 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16883712 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16887808 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16891904 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16896000 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16900096 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16904192 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16908288 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16912384 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16916480 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16920576 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16924672 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16928768 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16932864 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16936960 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16941056 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16945152 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16949248 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16953344 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16957440 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16961536 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16965632 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.16969728 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.16.67108864 = Gauge32: 0 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16777216 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16781312 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16785408 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16789504 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16793600 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16797696 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16801792 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16805888 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16809984 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16814080 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16818176 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16822272 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16826368 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16830464 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16834560 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16838656 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16842752 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16846848 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16850944 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16855040 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16859136 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16863232 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16867328 = INTEGER: 4 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16871424 = INTEGER: 4 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16875520 = INTEGER: 3 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16879616 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16883712 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16887808 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16891904 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16896000 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16900096 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16904192 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16908288 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16912384 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16916480 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16920576 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16924672 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16928768 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16932864 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16936960 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16941056 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16945152 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16949248 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16953344 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16957440 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16961536 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16965632 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.16969728 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.17.67108864 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16777216 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16781312 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16785408 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16789504 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16793600 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16797696 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16801792 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16805888 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16809984 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16814080 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16818176 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16822272 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16826368 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16830464 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16834560 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16838656 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16842752 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16846848 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16850944 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16855040 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16859136 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16863232 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16867328 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16871424 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16875520 = INTEGER: 8 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16879616 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16883712 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16887808 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16891904 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16896000 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16900096 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16904192 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16908288 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16912384 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16916480 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16920576 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16924672 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16928768 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16932864 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16936960 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16941056 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16945152 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16949248 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16953344 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16957440 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16961536 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16965632 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.16969728 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.18.67108864 = INTEGER: 1 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16777216 = STRING: Anonymized 150 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16781312 = STRING: Anonymized 250 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16785408 = STRING: Anonymized 234 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16789504 = STRING: Anonymized 081 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16793600 = STRING: Anonymized 167 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16797696 = STRING: Anonymized 182 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16801792 = STRING: Anonymized 072 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16805888 = STRING: Anonymized 007 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16809984 = STRING: Anonymized 006 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16814080 = STRING: Anonymized 145 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16818176 = STRING: Anonymized 204 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16822272 = STRING: Anonymized 122 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16826368 = STRING: Anonymized 242 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16830464 = STRING: Anonymized 154 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16834560 = STRING: Anonymized 186 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16838656 = STRING: Anonymized 204 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16842752 = STRING: Anonymized 134 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16846848 = STRING: Anonymized 199 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16850944 = STRING: Anonymized 128 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16855040 = STRING: Anonymized 138 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16859136 = STRING: Anonymized 211 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16863232 = STRING: Anonymized 104 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16867328 = STRING: Anonymized 131 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16871424 = STRING: Anonymized 244 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16875520 = STRING: Anonymized 033 -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16879616 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16883712 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16887808 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16891904 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16896000 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16900096 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16904192 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16908288 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16912384 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16916480 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16920576 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16924672 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16928768 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16932864 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16936960 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16941056 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16945152 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16949248 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16953344 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16957440 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16961536 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16965632 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.16969728 = "" -.1.3.6.1.4.1.9.9.289.1.1.2.1.19.67108864 = "" -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16777216 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16781312 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16785408 = Counter32: 1262 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16789504 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16793600 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16797696 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16801792 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16805888 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16809984 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16814080 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16818176 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16822272 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16826368 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16830464 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16834560 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16838656 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16842752 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16846848 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16850944 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16855040 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16859136 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16863232 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16867328 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16871424 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16875520 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16879616 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16883712 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16887808 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16891904 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16896000 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16900096 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16904192 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16908288 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16912384 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16916480 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16920576 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16924672 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16928768 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16932864 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16936960 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16941056 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16945152 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16949248 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16953344 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16957440 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16961536 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16965632 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.16969728 = Counter32: 0 -.1.3.6.1.4.1.9.9.289.1.2.1.1.15.67108864 = Counter32: 0 \ No newline at end of file diff --git a/tests/network/hp/procurve/snmp/slim_procurve_stack.snmpwalk b/tests/network/hp/procurve/snmp/slim_procurve_stack.snmpwalk new file mode 100644 index 0000000000..0bec893347 --- /dev/null +++ b/tests/network/hp/procurve/snmp/slim_procurve_stack.snmpwalk @@ -0,0 +1,52 @@ +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.2.1 = STRING: Anonymized 121 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.2.2 = STRING: Anonymized 175 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.3.1 = Hex-STRING: 94 18 82 D8 04 40 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.3.2 = Hex-STRING: D0 67 26 72 32 80 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.4.1 = INTEGER: 2 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.4.2 = INTEGER: 2 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.5.1 = INTEGER: 2 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.5.2 = INTEGER: 2 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.6.1 = INTEGER: 255 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.6.2 = INTEGER: 128 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.7.1 = INTEGER: 3 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.7.2 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.8.1 = INTEGER: 101001 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.8.2 = INTEGER: 201001 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.9.1 = INTEGER: 3 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.9.2 = INTEGER: 4 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.10.1 = STRING: Anonymized 000 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.10.2 = STRING: Anonymized 011 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.11.1 = Timeticks: (1730459700) 200 days, 6:49:57.00 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.11.2 = Timeticks: (1730463400) 200 days, 6:50:34.00 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.12.1 = OID: .1.3.6.1.4.1.11.2.3.7.11.155 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.12.2 = OID: .1.3.6.1.4.1.11.2.3.7.11.155 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.14.1 = STRING: Anonymized 239 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.14.2 = STRING: Anonymized 238 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.15.1 = INTEGER: 84 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.15.2 = INTEGER: 4 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.16.1 = INTEGER: 74322432 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.16.2 = INTEGER: 74322432 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.17.1 = INTEGER: 41957260 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.17.2 = INTEGER: 44788680 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.18.1 = STRING: Anonymized 151 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.18.2 = STRING: Anonymized 141 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.19.1 = STRING: Anonymized 177 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.19.2 = STRING: Anonymized 100 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.20.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.3.1.20.2 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.3.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.3.1.2.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.3.2.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.3.2.2.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.4.1.1.1 = STRING: "2.2" +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.4.1.2.1 = STRING: "2.1" +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.4.2.1.1 = STRING: "1.2" +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.4.2.2.1 = STRING: "1.1" +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.5.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.5.1.2.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.5.2.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.5.2.2.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.8.1.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.8.1.2.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.8.2.1.1 = INTEGER: 1 +.1.3.6.1.4.1.11.2.14.11.5.1.69.1.5.1.8.2.2.1 = INTEGER: 1 diff --git a/tests/network/hp/procurve/snmp/stack.robot b/tests/network/hp/procurve/snmp/stack.robot new file mode 100644 index 0000000000..fdb4bb2ace --- /dev/null +++ b/tests/network/hp/procurve/snmp/stack.robot @@ -0,0 +1,37 @@ +*** Settings *** +Documentation Check stack members. + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s +Test Setup Ctn Generic Suite Setup + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=network::hp::procurve::snmp::plugin + +*** Test Cases *** +stack ${tc} + [Tags] network hp + ${command} Catenate + ... ${CMD} + ... --mode=stack + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=network/hp/procurve/snmp/slim_procurve_stack + ... --snmp-timeout=1 + ... ${extra_options} + + # first run to build cache + Run ${command} + # second run to control the output + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc extra_options expected_result -- + ... 1 --verbose OK: All stack members are ok ${\n}checking stack member 'Anonymized 238'${\n}${SPACE}${SPACE}${SPACE}${SPACE}role: active [state: standby]${\n}${SPACE}${SPACE}${SPACE}${SPACE}port '1' operational status: up [admin status: enabled]${\n}${SPACE}${SPACE}${SPACE}${SPACE}port '2' operational status: up [admin status: enabled]${\n}checking stack member 'Anonymized 239'${\n}${SPACE}${SPACE}${SPACE}${SPACE}role: notReady [state: commander]${\n}${SPACE}${SPACE}${SPACE}${SPACE}port '1' operational status: up [admin status: enabled]${\n}${SPACE}${SPACE}${SPACE}${SPACE}port '2' operational status: up [admin status: enabled] + ... 2 --unknown-member-status='${PERCENT}\\{role\\} ne "notReady"' UNKNOWN: Stack member 'Anonymized 238' role: active [state: standby] + ... 3 --warning-member-status='${PERCENT}\\{state\\} ne "down"' WARNING: Stack member 'Anonymized 238' role: active [state: standby] - Stack member 'Anonymized 239' role: notReady [state: commander] + ... 4 --critical-member-status='${PERCENT}\\{role\\} eq ${PERCENT}\\{roleLast\\}' CRITICAL: Stack member 'Anonymized 238' role: active [state: standby] - Stack member 'Anonymized 239' role: notReady [state: commander] + ... 5 --unknown-port-status='${PERCENT}\\{oper_status\\} eq "up"' UNKNOWN: Stack member 'Anonymized 238' port '1' operational status: up [admin status: enabled] - port '2' operational status: up [admin status: enabled] - Stack member 'Anonymized 239' port '1' operational status: up [admin status: enabled] - port '2' operational status: up [admin status: enabled] + ... 6 --warning-port-status='${PERCENT}\\{oper_status\\} eq "up"' WARNING: Stack member 'Anonymized 238' port '1' operational status: up [admin status: enabled] - port '2' operational status: up [admin status: enabled] - Stack member 'Anonymized 239' port '1' operational status: up [admin status: enabled] - port '2' operational status: up [admin status: enabled] + ... 7 --critical-port-status='${PERCENT}\\{oper_status\\} eq "up" and ${PERCENT}\\{display\\} ne "up"' CRITICAL: Stack member 'Anonymized 238' port '1' operational status: up [admin status: enabled] - port '2' operational status: up [admin status: enabled] - Stack member 'Anonymized 239' port '1' operational status: up [admin status: enabled] - port '2' operational status: up [admin status: enabled] diff --git a/tests/network/keysight/nvos/restapi/keysight.json b/tests/network/keysight/nvos/restapi/keysight.json new file mode 100644 index 0000000000..5db1c964c3 --- /dev/null +++ b/tests/network/keysight/nvos/restapi/keysight.json @@ -0,0 +1,367 @@ +{ + "uuid": "969b130b-0ab9-4d14-aa8d-5ba775260baf", + "lastMigration": 33, + "name": "Keysight", + "endpointPrefix": "", + "latency": 0, + "port": 3000, + "hostname": "", + "folders": [], + "routes": [ + { + "uuid": "beee08c1-0fbb-4ccc-b233-90908aebfa03", + "type": "http", + "documentation": "Retrieve a stats snapshot", + "method": "post", + "endpoint": "api/stats", + "responses": [ + { + "uuid": "48b94195-9437-4494-97bc-70513f46dc4d", + "body": "{\r\n \"stats_snapshot\":[\r\n {\r\n \"default_name\":\"PG1\",\r\n \"id\":\"104\",\r\n \"reset_time\":1679354883450,\r\n \"rs_average_drop_rate_packets\":0,\r\n \"rs_average_receive_rate_bytes\":65705532,\r\n \"rs_average_receive_rate_packets\":34666,\r\n \"rs_average_transmit_rate_bytes\":65722821,\r\n \"rs_average_transmit_rate_packets\":34689,\r\n \"rs_current_drop_rate_packets\":0,\r\n \"rs_current_receive_rate_bytes\":148553403,\r\n \"rs_current_receive_rate_packets\":77538,\r\n \"rs_current_transmit_rate_bytes\":148578576,\r\n \"rs_current_transmit_rate_packets\":77570,\r\n \"rs_peak_drop_rate_packets\":0,\r\n \"rs_peak_drop_rate_packets_time\":1701966818122,\r\n \"rs_peak_receive_rate_bytes\":958952724,\r\n \"rs_peak_receive_rate_bytes_time\":1684920909112,\r\n \"rs_peak_receive_rate_packets\":341706,\r\n \"rs_peak_receive_rate_packets_time\":1695195630913,\r\n \"rs_peak_transmit_rate_bytes\":958959729,\r\n \"rs_peak_transmit_rate_bytes_time\":1684920909112,\r\n \"rs_peak_transmit_rate_packets\":341735,\r\n \"rs_peak_transmit_rate_packets_time\":1695195630913,\r\n \"rs_total_drop_count_packets\":0,\r\n \"rs_total_receive_count_bytes\":185716152331665,\r\n \"rs_total_receive_count_packets\":783881855284,\r\n \"rs_total_transmit_count_bytes\":185765018913713,\r\n \"rs_total_transmit_count_packets\":784388603790,\r\n \"stats_time\":1701966818122,\r\n \"tp_afm_drop_time\":1701966818151,\r\n \"tp_average_drop_rate_packets\":0,\r\n \"tp_average_insp_rate_packets\":34689,\r\n \"tp_average_pass_percent_packets\":0.99999887,\r\n \"tp_average_pass_rate_bits\":65722821,\r\n \"tp_average_pass_rate_packets\":34689,\r\n \"tp_average_tx_rate_bits\":65703282,\r\n \"tp_average_tx_rate_packets\":34665,\r\n \"tp_average_tx_utilization\":0.01781242,\r\n \"tp_current_burst_buffer_fill_mb\":0,\r\n \"tp_current_burst_buffer_fill_percent\":0,\r\n \"tp_current_drop_rate_packets\":0,\r\n \"tp_current_insp_rate_packets\":77570,\r\n \"tp_current_pass_percent_packets\":1,\r\n \"tp_current_pass_rate_bits\":148578576,\r\n \"tp_current_pass_rate_packets\":77570,\r\n \"tp_current_tx_rate_bits\":148545116,\r\n \"tp_current_tx_rate_packets\":77509,\r\n \"tp_current_tx_utilization\":0.04023664,\r\n \"tp_drop_reset_time\":1679354883450,\r\n \"tp_peak_burst_buffer_fill_mb\":0,\r\n \"tp_peak_burst_buffer_fill_percent\":0,\r\n \"tp_peak_burst_buffer_fill_time\":0,\r\n \"tp_peak_drop_rate_packets\":0,\r\n \"tp_peak_drop_rate_packets_time\":1701966818122,\r\n \"tp_peak_insp_rate_packets\":341706,\r\n \"tp_peak_insp_rate_packets_time\":1695195630913,\r\n \"tp_peak_pass_percent_packets\":1,\r\n \"tp_peak_pass_percent_packets_time\":1701966818122,\r\n \"tp_peak_pass_rate_bits\":958959729,\r\n \"tp_peak_pass_rate_bits_time\":1684920910112,\r\n \"tp_peak_pass_rate_packets\":341735,\r\n \"tp_peak_pass_rate_packets_time\":1695195631913,\r\n \"tp_peak_tx_rate_bits\":959252656,\r\n \"tp_peak_tx_rate_bits_time\":1684920909112,\r\n \"tp_peak_tx_rate_packets\":341659,\r\n \"tp_peak_tx_rate_packets_time\":1695195630913,\r\n \"tp_peak_tx_utilization\":0.24709128,\r\n \"tp_peak_tx_utilization_time\":1684920909112,\r\n \"tp_total_afm_drop_count_packets\":0,\r\n \"tp_total_arp_req_pkt_cnt\":0,\r\n \"tp_total_bp_fifo_pkts_dropped\":0,\r\n \"tp_total_bp_fifo_pkts_passed\":0,\r\n \"tp_total_data_masking_count_packets\":0,\r\n \"tp_total_data_masking_percent_packets\":0,\r\n \"tp_total_dedup_count_packets\":506748505,\r\n \"tp_total_dedup_percent_packets\":0.00064604264,\r\n \"tp_total_drop_count_packets\":0,\r\n \"tp_total_erspan_strip_count_packets\":0,\r\n \"tp_total_erspan_strip_error_packets\":0,\r\n \"tp_total_erspan_strip_percent_packets\":0,\r\n \"tp_total_etag_strip_count_packets\":0,\r\n \"tp_total_etag_strip_percent_packets\":0,\r\n \"tp_total_fabric_path_strip_count_packets\":0,\r\n \"tp_total_fabric_path_strip_percent_packets\":0,\r\n \"tp_total_generic_strip_count_packets\":0,\r\n \"tp_total_generic_strip_error_packets\":0,\r\n \"tp_total_generic_strip_percent_packets\":0,\r\n \"tp_total_gre_encap_count_packets\":0,\r\n \"tp_total_gre_encap_percent_packets\":0,\r\n \"tp_total_gtp_strip_count_packets\":0,\r\n \"tp_total_gtp_strip_error_packets\":0,\r\n \"tp_total_gtp_strip_percent_packets\":0,\r\n \"tp_total_insp_count_packets\":784389485086,\r\n \"tp_total_l2gre_strip_count_packets\":0,\r\n \"tp_total_l2gre_strip_error_packets\":0,\r\n \"tp_total_l2gre_strip_percent_packets\":0,\r\n \"tp_total_lisp_strip_count_packets\":0,\r\n \"tp_total_lisp_strip_error_packets\":0,\r\n \"tp_total_lisp_strip_percent_packets\":0,\r\n \"tp_total_mpls_strip_count_packets\":0,\r\n \"tp_total_mpls_strip_error_packets\":0,\r\n \"tp_total_mpls_strip_percent_packets\":0,\r\n \"tp_total_packet_fragmentation_count_frags\":0,\r\n \"tp_total_packet_fragmentation_count_packets\":0,\r\n \"tp_total_packet_fragmentation_percent_packets\":0,\r\n \"tp_total_pass_count_bytes\":185765018913713,\r\n \"tp_total_pass_count_packets\":784388603790,\r\n \"tp_total_pppoe_strip_count_packets\":0,\r\n \"tp_total_pppoe_strip_percent_packets\":0,\r\n \"tp_total_reassembly_count_frags\":0,\r\n \"tp_total_reassembly_notprocessed_count_frags\":0,\r\n \"tp_total_reassembly_percent_frags\":0,\r\n \"tp_total_reassembly_reassembled_count_packets\":0,\r\n \"tp_total_reassembly_timedout_count_frags\":0,\r\n \"tp_total_rx_pause_count_packets\":0,\r\n \"tp_total_timestamp_or_packet_length_trailer_count_packets\":0,\r\n \"tp_total_timestamp_or_packet_length_trailer_percent_packets\":0,\r\n \"tp_total_timestamp_translation_count_packets\":0,\r\n \"tp_total_timestamp_translation_count_passed\":0,\r\n \"tp_total_timestamp_translation_percent_packets\":0,\r\n \"tp_total_timestamp_translation_percent_passed\":0,\r\n \"tp_total_trailer_strip_count_packets\":0,\r\n \"tp_total_trailer_strip_percent_packets\":0,\r\n \"tp_total_trim_count_bytes\":0,\r\n \"tp_total_trim_count_packets\":0,\r\n \"tp_total_trim_percent_bytes\":0,\r\n \"tp_total_trim_percent_packets\":0,\r\n \"tp_total_tx_1024to1518_byte_packets\":7080046313,\r\n \"tp_total_tx_128to255_byte_packets\":614962256602,\r\n \"tp_total_tx_1519to2047_byte_packets\":964291407,\r\n \"tp_total_tx_2048to4095_byte_packets\":0,\r\n \"tp_total_tx_256to511_byte_packets\":81881445216,\r\n \"tp_total_tx_4096to9216_byte_packets\":0,\r\n \"tp_total_tx_512to1023_byte_packets\":9623709334,\r\n \"tp_total_tx_64_byte_packets\":4343645730,\r\n \"tp_total_tx_65to127_byte_packets\":65000131223,\r\n \"tp_total_tx_9217to16838_byte_packets\":0,\r\n \"tp_total_tx_count_bcast_packets\":8242921,\r\n \"tp_total_tx_count_bytes\":185709790646386,\r\n \"tp_total_tx_count_invalid_packets\":0,\r\n \"tp_total_tx_count_mcast_packets\":1537179755,\r\n \"tp_total_tx_count_packets\":783855525825,\r\n \"tp_total_tx_count_ucast_packets\":782310103149,\r\n \"tp_total_vntag_strip_count_packets\":0,\r\n \"tp_total_vntag_strip_percent_packets\":0,\r\n \"tp_total_vxlan_strip_count_packets\":0,\r\n \"tp_total_vxlan_strip_error_packets\":0,\r\n \"tp_total_vxlan_strip_percent_packets\":0,\r\n \"type\":\"Port Group\"\r\n },\r\n {\r\n \"default_name\":\"P01\",\r\n \"id\":\"8\",\r\n \"np_average_deny_percent_bytes\":0,\r\n \"np_average_deny_percent_packets\":0,\r\n \"np_average_deny_rate_bits\":0,\r\n \"np_average_deny_rate_packets\":0,\r\n \"np_average_pass_percent_bytes\":1,\r\n \"np_average_pass_percent_packets\":1,\r\n \"np_average_pass_rate_bits\":29733460,\r\n \"np_average_pass_rate_packets\":16474,\r\n \"np_average_rx_rate_bits\":29733460,\r\n \"np_average_rx_rate_packets\":16474,\r\n \"np_average_rx_utilization\":0.0323693,\r\n \"np_current_deny_percent_bytes\":0,\r\n \"np_current_deny_percent_packets\":0,\r\n \"np_current_deny_rate_bits\":0,\r\n \"np_current_deny_rate_packets\":0,\r\n \"np_current_pass_percent_bytes\":1,\r\n \"np_current_pass_percent_packets\":1,\r\n \"np_current_pass_rate_bits\":134391377,\r\n \"np_current_pass_rate_packets\":72264,\r\n \"np_current_rx_rate_bits\":134391377,\r\n \"np_current_rx_rate_packets\":72264,\r\n \"np_current_rx_utilization\":0.14595361,\r\n \"np_peak_deny_percent_bytes\":0,\r\n \"np_peak_deny_percent_bytes_time\":1701966818122,\r\n \"np_peak_deny_percent_packets\":0,\r\n \"np_peak_deny_percent_packets_time\":1701966818122,\r\n \"np_peak_deny_rate_bits\":0,\r\n \"np_peak_deny_rate_bits_time\":1701966818122,\r\n \"np_peak_deny_rate_packets\":0,\r\n \"np_peak_deny_rate_packets_time\":1701966818122,\r\n \"np_peak_pass_percent_bytes\":1,\r\n \"np_peak_pass_percent_bytes_time\":1701966818122,\r\n \"np_peak_pass_percent_packets\":1,\r\n \"np_peak_pass_percent_packets_time\":1701966818122,\r\n \"np_peak_pass_rate_bits\":944393289,\r\n \"np_peak_pass_rate_bits_time\":1684920909112,\r\n \"np_peak_pass_rate_packets\":250841,\r\n \"np_peak_pass_rate_packets_time\":1701264643494,\r\n \"np_peak_rx_rate_bits\":944393289,\r\n \"np_peak_rx_rate_bits_time\":1684920909112,\r\n \"np_peak_rx_rate_packets\":250841,\r\n \"np_peak_rx_rate_packets_time\":1701264643494,\r\n \"np_peak_rx_utilization\":0.97251076,\r\n \"np_peak_rx_utilization_time\":1684920909112,\r\n \"np_total_deny_count_bytes\":0,\r\n \"np_total_deny_count_packets\":0,\r\n \"np_total_pass_count_bytes\":86076080313402,\r\n \"np_total_pass_count_packets\":381548953598,\r\n \"np_total_rx_1024to1518_byte_packets\":3956134495,\r\n \"np_total_rx_128to255_byte_packets\":324901447067,\r\n \"np_total_rx_1519to2047_byte_packets\":562594056,\r\n \"np_total_rx_2048to4095_byte_packets\":0,\r\n \"np_total_rx_256to511_byte_packets\":3900051788,\r\n \"np_total_rx_4096to9216_byte_packets\":0,\r\n \"np_total_rx_512to1023_byte_packets\":4656112321,\r\n \"np_total_rx_64_byte_packets\":2987489964,\r\n \"np_total_rx_65to127_byte_packets\":40585123907,\r\n \"np_total_rx_9217to16838_byte_packets\":0,\r\n \"np_total_rx_count_alignment_errors\":0,\r\n \"np_total_rx_count_bcast_packets\":4670772,\r\n \"np_total_rx_count_bytes\":86076080313402,\r\n \"np_total_rx_count_collisions\":0,\r\n \"np_total_rx_count_crc_alignment_errors\":0,\r\n \"np_total_rx_count_fcs_errors\":0,\r\n \"np_total_rx_count_fragments\":0,\r\n \"np_total_rx_count_frames_too_long\":0,\r\n \"np_total_rx_count_invalid_packets\":0,\r\n \"np_total_rx_count_jabbers\":0,\r\n \"np_total_rx_count_mcast_packets\":941115606,\r\n \"np_total_rx_count_nucast_packets\":945786378,\r\n \"np_total_rx_count_packets\":381548953598,\r\n \"np_total_rx_count_runts\":0,\r\n \"np_total_rx_count_symbol_errors\":0,\r\n \"np_total_rx_count_ucast_packets\":380603167220,\r\n \"np_total_rx_count_valid_packets\":381548953598,\r\n \"reset_by\":\"admin\",\r\n \"reset_time\":1678807433611,\r\n \"stats_time\":1701966818122,\r\n \"type\":\"Port\"\r\n },\r\n {\r\n \"default_name\":\"P12\",\r\n \"id\":\"19\",\r\n \"np_average_deny_percent_bytes\":0,\r\n \"np_average_deny_percent_packets\":0,\r\n \"np_average_deny_rate_bits\":0,\r\n \"np_average_deny_rate_packets\":0,\r\n \"np_average_pass_percent_bytes\":0.86485845,\r\n \"np_average_pass_percent_packets\":0.9955057,\r\n \"np_average_pass_rate_bits\":21958190,\r\n \"np_average_pass_rate_packets\":7301,\r\n \"np_average_rx_rate_bits\":21958245,\r\n \"np_average_rx_rate_packets\":7301,\r\n \"np_average_rx_utilization\":0.0023126404,\r\n \"np_current_deny_percent_bytes\":0,\r\n \"np_current_deny_percent_packets\":0,\r\n \"np_current_deny_rate_bits\":0,\r\n \"np_current_deny_rate_packets\":0,\r\n \"np_current_pass_percent_bytes\":0.78630006,\r\n \"np_current_pass_percent_packets\":0.99144804,\r\n \"np_current_pass_rate_bits\":23227924,\r\n \"np_current_pass_rate_packets\":12012,\r\n \"np_current_rx_rate_bits\":23250241,\r\n \"np_current_rx_rate_packets\":12044,\r\n \"np_current_rx_utilization\":0.0025177281,\r\n \"np_peak_deny_percent_bytes\":0,\r\n \"np_peak_deny_percent_bytes_time\":1701966818122,\r\n \"np_peak_deny_percent_packets\":0,\r\n \"np_peak_deny_percent_packets_time\":1701966818122,\r\n \"np_peak_deny_rate_bits\":0,\r\n \"np_peak_deny_rate_bits_time\":1701966818122,\r\n \"np_peak_deny_rate_packets\":0,\r\n \"np_peak_deny_rate_packets_time\":1701966818122,\r\n \"np_peak_pass_percent_bytes\":1,\r\n \"np_peak_pass_percent_bytes_time\":1701966818122,\r\n \"np_peak_pass_percent_packets\":1,\r\n \"np_peak_pass_percent_packets_time\":1701966818122,\r\n \"np_peak_pass_rate_bits\":2525321424,\r\n \"np_peak_pass_rate_bits_time\":1701911128909,\r\n \"np_peak_pass_rate_packets\":213541,\r\n \"np_peak_pass_rate_packets_time\":1701911128909,\r\n \"np_peak_rx_rate_bits\":2518773072,\r\n \"np_peak_rx_rate_bits_time\":1701911127910,\r\n \"np_peak_rx_rate_packets\":212970,\r\n \"np_peak_rx_rate_packets_time\":1701911127910,\r\n \"np_peak_rx_utilization\":0.25528482,\r\n \"np_peak_rx_utilization_time\":1701911127910,\r\n \"np_total_afm_drop_count_packets\":0,\r\n \"np_total_data_masking_count_packets\":0,\r\n \"np_total_data_masking_percent_packets\":0,\r\n \"np_total_dedup_count_packets\":616154859,\r\n \"np_total_dedup_percent_packets\":0.004486405,\r\n \"np_total_deny_count_bytes\":0,\r\n \"np_total_deny_count_packets\":0,\r\n \"np_total_erspan_strip_count_packets\":0,\r\n \"np_total_erspan_strip_error_packets\":0,\r\n \"np_total_erspan_strip_percent_packets\":0,\r\n \"np_total_etag_strip_count_packets\":0,\r\n \"np_total_etag_strip_percent_packets\":0,\r\n \"np_total_fabric_path_strip_count_packets\":0,\r\n \"np_total_fabric_path_strip_percent_packets\":0,\r\n \"np_total_generic_strip_count_packets\":0,\r\n \"np_total_generic_strip_error_packets\":0,\r\n \"np_total_generic_strip_percent_packets\":0,\r\n \"np_total_gtp_strip_count_packets\":0,\r\n \"np_total_gtp_strip_error_packets\":0,\r\n \"np_total_gtp_strip_percent_packets\":0,\r\n \"np_total_l2gre_strip_count_packets\":0,\r\n \"np_total_l2gre_strip_error_packets\":0,\r\n \"np_total_l2gre_strip_percent_packets\":0,\r\n \"np_total_lisp_strip_count_packets\":0,\r\n \"np_total_lisp_strip_error_packets\":0,\r\n \"np_total_lisp_strip_percent_packets\":0,\r\n \"np_total_mpls_strip_count_packets\":0,\r\n \"np_total_mpls_strip_error_packets\":0,\r\n \"np_total_mpls_strip_percent_packets\":0,\r\n \"np_total_pass_count_bytes\":44652849531751,\r\n \"np_total_pass_count_packets\":136722061650,\r\n \"np_total_pppoe_strip_count_packets\":0,\r\n \"np_total_pppoe_strip_percent_packets\":0,\r\n \"np_total_reassembly_count_frags\":0,\r\n \"np_total_reassembly_notprocessed_count_frags\":0,\r\n \"np_total_reassembly_percent_frags\":0,\r\n \"np_total_reassembly_reassembled_count_packets\":0,\r\n \"np_total_reassembly_timedout_count_frags\":0,\r\n \"np_total_rx_1024to1518_byte_packets\":16663529888,\r\n \"np_total_rx_128to255_byte_packets\":39533710939,\r\n \"np_total_rx_1519to2047_byte_packets\":894595025,\r\n \"np_total_rx_2048to4095_byte_packets\":0,\r\n \"np_total_rx_256to511_byte_packets\":45301311400,\r\n \"np_total_rx_4096to9216_byte_packets\":0,\r\n \"np_total_rx_512to1023_byte_packets\":4869385104,\r\n \"np_total_rx_64_byte_packets\":155426,\r\n \"np_total_rx_65to127_byte_packets\":30076616625,\r\n \"np_total_rx_9217to16838_byte_packets\":0,\r\n \"np_total_rx_count_alignment_errors\":0,\r\n \"np_total_rx_count_bcast_packets\":836117,\r\n \"np_total_rx_count_bytes\":51630239202095,\r\n \"np_total_rx_count_collisions\":0,\r\n \"np_total_rx_count_crc_alignment_errors\":12,\r\n \"np_total_rx_count_fcs_errors\":12,\r\n \"np_total_rx_count_fragments\":0,\r\n \"np_total_rx_count_frames_too_long\":0,\r\n \"np_total_rx_count_invalid_packets\":12,\r\n \"np_total_rx_count_jabbers\":0,\r\n \"np_total_rx_count_mcast_packets\":12191533,\r\n \"np_total_rx_count_nucast_packets\":13027650,\r\n \"np_total_rx_count_packets\":137339304406,\r\n \"np_total_rx_count_runts\":0,\r\n \"np_total_rx_count_symbol_errors\":2,\r\n \"np_total_rx_count_ucast_packets\":137326276744,\r\n \"np_total_rx_count_valid_packets\":137339304394,\r\n \"np_total_timestamp_or_packet_length_trailer_count_packets\":0,\r\n \"np_total_timestamp_or_packet_length_trailer_percent_packets\":0,\r\n \"np_total_timestamp_translation_count_packets\":0,\r\n \"np_total_timestamp_translation_count_passed\":0,\r\n \"np_total_timestamp_translation_percent_packets\":0,\r\n \"np_total_timestamp_translation_percent_passed\":0,\r\n \"np_total_trim_count_bytes\":0,\r\n \"np_total_trim_count_packets\":0,\r\n \"np_total_trim_percent_bytes\":0,\r\n \"np_total_trim_percent_packets\":0,\r\n \"np_total_tunnel_term_count_packets\":137326023912,\r\n \"np_total_tunnel_term_error_packets\":0,\r\n \"np_total_tunnel_term_percent_packets\":1,\r\n \"np_total_vntag_strip_count_packets\":0,\r\n \"np_total_vntag_strip_percent_packets\":0,\r\n \"np_total_vxlan_strip_count_packets\":0,\r\n \"np_total_vxlan_strip_error_packets\":0,\r\n \"np_total_vxlan_strip_percent_packets\":0,\r\n \"reset_time\":1683156484552,\r\n \"rs_average_drop_rate_packets\":0,\r\n \"rs_average_transmit_rate_bytes\":21958190,\r\n \"rs_average_transmit_rate_packets\":7301,\r\n \"rs_current_drop_rate_packets\":0,\r\n \"rs_current_transmit_rate_bytes\":23227924,\r\n \"rs_current_transmit_rate_packets\":12012,\r\n \"rs_peak_drop_rate_packets\":0,\r\n \"rs_peak_drop_rate_packets_time\":1701966818122,\r\n \"rs_peak_transmit_rate_bytes\":2525321424,\r\n \"rs_peak_transmit_rate_bytes_time\":1701911127910,\r\n \"rs_peak_transmit_rate_packets\":213541,\r\n \"rs_peak_transmit_rate_packets_time\":1701911127910,\r\n \"rs_total_drop_count_packets\":0,\r\n \"rs_total_transmit_count_bytes\":51630112107898,\r\n \"rs_total_transmit_count_packets\":137338216489,\r\n \"stats_time\":1701966818122,\r\n \"type\":\"Port\"\r\n },\r\n {\r\n \"default_name\":\"P17\",\r\n \"id\":\"24\",\r\n \"reset_by\":\"trakoto\",\r\n \"reset_time\":1676469625207,\r\n \"stats_time\":1701966818122,\r\n \"tp_average_drop_rate_packets\":0,\r\n \"tp_average_insp_rate_packets\":10429,\r\n \"tp_average_pass_percent_packets\":1,\r\n \"tp_average_pass_rate_bits\":64169785,\r\n \"tp_average_pass_rate_packets\":10429,\r\n \"tp_average_tx_rate_bits\":64169785,\r\n \"tp_average_tx_rate_packets\":10429,\r\n \"tp_average_tx_utilization\":0.0065838424,\r\n \"tp_current_drop_rate_packets\":0,\r\n \"tp_current_insp_rate_packets\":0,\r\n \"tp_current_pass_percent_packets\":0,\r\n \"tp_current_pass_rate_bits\":0,\r\n \"tp_current_pass_rate_packets\":0,\r\n \"tp_current_tx_rate_bits\":0,\r\n \"tp_current_tx_rate_packets\":0,\r\n \"tp_current_tx_utilization\":0,\r\n \"tp_drop_reset_by\":\"trakoto\",\r\n \"tp_drop_reset_time\":1676469625207,\r\n \"tp_peak_drop_rate_packets\":0,\r\n \"tp_peak_drop_rate_packets_time\":1701966818122,\r\n \"tp_peak_insp_rate_packets\":145172,\r\n \"tp_peak_insp_rate_packets_time\":1700559879522,\r\n \"tp_peak_pass_percent_packets\":1,\r\n \"tp_peak_pass_percent_packets_time\":1701300392504,\r\n \"tp_peak_pass_rate_bits\":943515944,\r\n \"tp_peak_pass_rate_bits_time\":1683215824054,\r\n \"tp_peak_pass_rate_packets\":145172,\r\n \"tp_peak_pass_rate_packets_time\":1700559879522,\r\n \"tp_peak_tx_rate_bits\":943515944,\r\n \"tp_peak_tx_rate_bits_time\":1683215824054,\r\n \"tp_peak_tx_rate_packets\":145172,\r\n \"tp_peak_tx_rate_packets_time\":1700559879522,\r\n \"tp_peak_tx_utilization\":0.09615128,\r\n \"tp_peak_tx_utilization_time\":1683215824054,\r\n \"tp_total_drop_count_packets\":0,\r\n \"tp_total_insp_count_packets\":265915012102,\r\n \"tp_total_pass_count_bytes\":204518676518600,\r\n \"tp_total_pass_count_packets\":265915012102,\r\n \"tp_total_rx_pause_count_packets\":0,\r\n \"tp_total_tx_1024to1518_byte_packets\":88492905359,\r\n \"tp_total_tx_128to255_byte_packets\":32192973755,\r\n \"tp_total_tx_1519to2047_byte_packets\":31154829805,\r\n \"tp_total_tx_2048to4095_byte_packets\":0,\r\n \"tp_total_tx_256to511_byte_packets\":16868075006,\r\n \"tp_total_tx_4096to9216_byte_packets\":0,\r\n \"tp_total_tx_512to1023_byte_packets\":17803279118,\r\n \"tp_total_tx_64_byte_packets\":37364972736,\r\n \"tp_total_tx_65to127_byte_packets\":42037976323,\r\n \"tp_total_tx_9217to16838_byte_packets\":0,\r\n \"tp_total_tx_count_bcast_packets\":73911,\r\n \"tp_total_tx_count_bytes\":204518676518600,\r\n \"tp_total_tx_count_invalid_packets\":0,\r\n \"tp_total_tx_count_mcast_packets\":49224976,\r\n \"tp_total_tx_count_packets\":265915012102,\r\n \"tp_total_tx_count_ucast_packets\":265865713215,\r\n \"type\":\"Port\"\r\n },\r\n {\r\n \"default_name\":\"P14\",\r\n \"id\":\"21\",\r\n \"np_average_deny_percent_bytes\":0,\r\n \"np_average_deny_percent_packets\":0,\r\n \"np_average_deny_rate_bits\":0,\r\n \"np_average_deny_rate_packets\":0,\r\n \"np_average_pass_percent_bytes\":1,\r\n \"np_average_pass_percent_packets\":1,\r\n \"np_average_pass_rate_bits\":22477642,\r\n \"np_average_pass_rate_packets\":10578,\r\n \"np_average_rx_rate_bits\":22477642,\r\n \"np_average_rx_rate_packets\":10578,\r\n \"np_average_rx_utilization\":0.0024170121,\r\n \"np_current_deny_percent_bytes\":0,\r\n \"np_current_deny_percent_packets\":0,\r\n \"np_current_deny_rate_bits\":0,\r\n \"np_current_deny_rate_packets\":0,\r\n \"np_current_pass_percent_bytes\":1,\r\n \"np_current_pass_percent_packets\":1,\r\n \"np_current_pass_rate_bits\":25532275,\r\n \"np_current_pass_rate_packets\":16308,\r\n \"np_current_rx_rate_bits\":25532275,\r\n \"np_current_rx_rate_packets\":16308,\r\n \"np_current_rx_utilization\":0.0028141555,\r\n \"np_peak_deny_percent_bytes\":0,\r\n \"np_peak_deny_percent_bytes_time\":1701966818122,\r\n \"np_peak_deny_percent_packets\":0,\r\n \"np_peak_deny_percent_packets_time\":1701966818122,\r\n \"np_peak_deny_rate_bits\":0,\r\n \"np_peak_deny_rate_bits_time\":1701966818122,\r\n \"np_peak_deny_rate_packets\":0,\r\n \"np_peak_deny_rate_packets_time\":1701966818122,\r\n \"np_peak_pass_percent_bytes\":1,\r\n \"np_peak_pass_percent_bytes_time\":1701966818122,\r\n \"np_peak_pass_percent_packets\":1,\r\n \"np_peak_pass_percent_packets_time\":1701966818122,\r\n \"np_peak_pass_rate_bits\":2439314064,\r\n \"np_peak_pass_rate_bits_time\":1701911127910,\r\n \"np_peak_pass_rate_packets\":216277,\r\n \"np_peak_pass_rate_packets_time\":1701911127910,\r\n \"np_peak_rx_rate_bits\":2439314064,\r\n \"np_peak_rx_rate_bits_time\":1701911127910,\r\n \"np_peak_rx_rate_packets\":216277,\r\n \"np_peak_rx_rate_packets_time\":1701911127910,\r\n \"np_peak_rx_utilization\":0.24739183,\r\n \"np_peak_rx_utilization_time\":1701911127910,\r\n \"np_total_deny_count_bytes\":0,\r\n \"np_total_deny_count_packets\":0,\r\n \"np_total_pass_count_bytes\":65082974198729,\r\n \"np_total_pass_count_packets\":245046060993,\r\n \"np_total_rx_1024to1518_byte_packets\":21428145885,\r\n \"np_total_rx_128to255_byte_packets\":85098305179,\r\n \"np_total_rx_1519to2047_byte_packets\":1921,\r\n \"np_total_rx_2048to4095_byte_packets\":0,\r\n \"np_total_rx_256to511_byte_packets\":7635601428,\r\n \"np_total_rx_4096to9216_byte_packets\":0,\r\n \"np_total_rx_512to1023_byte_packets\":7026993037,\r\n \"np_total_rx_64_byte_packets\":11093907539,\r\n \"np_total_rx_65to127_byte_packets\":112763106004,\r\n \"np_total_rx_9217to16838_byte_packets\":0,\r\n \"np_total_rx_count_alignment_errors\":0,\r\n \"np_total_rx_count_bcast_packets\":210635079,\r\n \"np_total_rx_count_bytes\":65082974198729,\r\n \"np_total_rx_count_collisions\":0,\r\n \"np_total_rx_count_crc_alignment_errors\":0,\r\n \"np_total_rx_count_fcs_errors\":0,\r\n \"np_total_rx_count_fragments\":0,\r\n \"np_total_rx_count_frames_too_long\":0,\r\n \"np_total_rx_count_invalid_packets\":0,\r\n \"np_total_rx_count_jabbers\":0,\r\n \"np_total_rx_count_mcast_packets\":637170736,\r\n \"np_total_rx_count_nucast_packets\":847805815,\r\n \"np_total_rx_count_packets\":245046060993,\r\n \"np_total_rx_count_runts\":0,\r\n \"np_total_rx_count_symbol_errors\":0,\r\n \"np_total_rx_count_ucast_packets\":244198255178,\r\n \"np_total_rx_count_valid_packets\":245046060993,\r\n \"reset_by\":\"admin\",\r\n \"reset_time\":1678803187943,\r\n \"stats_time\":1701966818122,\r\n \"tp_average_drop_rate_packets\":0,\r\n \"tp_average_insp_rate_packets\":10578,\r\n \"tp_average_pass_percent_packets\":1,\r\n \"tp_average_pass_rate_bits\":22477642,\r\n \"tp_average_pass_rate_packets\":10578,\r\n \"tp_average_tx_rate_bits\":22477642,\r\n \"tp_average_tx_rate_packets\":10578,\r\n \"tp_average_tx_utilization\":0.0024170121,\r\n \"tp_current_drop_rate_packets\":0,\r\n \"tp_current_insp_rate_packets\":16307,\r\n \"tp_current_pass_percent_packets\":1,\r\n \"tp_current_pass_rate_bits\":25532275,\r\n \"tp_current_pass_rate_packets\":16307,\r\n \"tp_current_tx_rate_bits\":25532275,\r\n \"tp_current_tx_rate_packets\":16307,\r\n \"tp_current_tx_utilization\":0.0028141395,\r\n \"tp_drop_reset_by\":\"admin\",\r\n \"tp_drop_reset_time\":1678803187943,\r\n \"tp_peak_drop_rate_packets\":0,\r\n \"tp_peak_drop_rate_packets_time\":1701966818122,\r\n \"tp_peak_insp_rate_packets\":216277,\r\n \"tp_peak_insp_rate_packets_time\":1701911127910,\r\n \"tp_peak_pass_percent_packets\":1,\r\n \"tp_peak_pass_percent_packets_time\":1701966818122,\r\n \"tp_peak_pass_rate_bits\":2439314064,\r\n \"tp_peak_pass_rate_bits_time\":1701911127910,\r\n \"tp_peak_pass_rate_packets\":216277,\r\n \"tp_peak_pass_rate_packets_time\":1701911127910,\r\n \"tp_peak_tx_rate_bits\":2439314064,\r\n \"tp_peak_tx_rate_bits_time\":1701911127910,\r\n \"tp_peak_tx_rate_packets\":216277,\r\n \"tp_peak_tx_rate_packets_time\":1701911127910,\r\n \"tp_peak_tx_utilization\":0.24739183,\r\n \"tp_peak_tx_utilization_time\":1701911127910,\r\n \"tp_total_drop_count_packets\":0,\r\n \"tp_total_insp_count_packets\":245046060993,\r\n \"tp_total_pass_count_bytes\":65082974198729,\r\n \"tp_total_pass_count_packets\":245046060993,\r\n \"tp_total_rx_pause_count_packets\":0,\r\n \"tp_total_tx_1024to1518_byte_packets\":21428145885,\r\n \"tp_total_tx_128to255_byte_packets\":85098305179,\r\n \"tp_total_tx_1519to2047_byte_packets\":1921,\r\n \"tp_total_tx_2048to4095_byte_packets\":0,\r\n \"tp_total_tx_256to511_byte_packets\":7635601428,\r\n \"tp_total_tx_4096to9216_byte_packets\":0,\r\n \"tp_total_tx_512to1023_byte_packets\":7026993037,\r\n \"tp_total_tx_64_byte_packets\":11093907539,\r\n \"tp_total_tx_65to127_byte_packets\":112763106004,\r\n \"tp_total_tx_9217to16838_byte_packets\":0,\r\n \"tp_total_tx_count_bcast_packets\":210635079,\r\n \"tp_total_tx_count_bytes\":65082974198729,\r\n \"tp_total_tx_count_invalid_packets\":0,\r\n \"tp_total_tx_count_mcast_packets\":637170736,\r\n \"tp_total_tx_count_packets\":245046060993,\r\n \"tp_total_tx_count_ucast_packets\":244198255178,\r\n \"type\":\"Port\"\r\n },\r\n {\r\n \"default_name\":\"F23\",\r\n \"df_average_deny_percent_bytes\":0,\r\n \"df_average_deny_percent_packets\":0,\r\n \"df_average_deny_rate_bits\":0,\r\n \"df_average_deny_rate_packets\":0,\r\n \"df_average_insp_rate_bits\":541243419,\r\n \"df_average_insp_rate_packets\":72182,\r\n \"df_average_pass_percent_bytes\":1,\r\n \"df_average_pass_percent_packets\":1,\r\n \"df_average_pass_rate_bits\":541243419,\r\n \"df_average_pass_rate_packets\":72182,\r\n \"df_current_deny_percent_bytes\":0,\r\n \"df_current_deny_percent_packets\":0,\r\n \"df_current_deny_rate_bits\":0,\r\n \"df_current_deny_rate_packets\":0,\r\n \"df_current_insp_rate_bits\":582952981,\r\n \"df_current_insp_rate_packets\":82823,\r\n \"df_current_pass_percent_bytes\":1,\r\n \"df_current_pass_percent_packets\":1,\r\n \"df_current_pass_rate_bits\":582952981,\r\n \"df_current_pass_rate_packets\":82823,\r\n \"df_peak_deny_percent_bytes\":0,\r\n \"df_peak_deny_percent_bytes_time\":1701966818122,\r\n \"df_peak_deny_percent_packets\":0,\r\n \"df_peak_deny_percent_packets_time\":1701966818122,\r\n \"df_peak_deny_rate_bits\":0,\r\n \"df_peak_deny_rate_bits_time\":1701966818122,\r\n \"df_peak_deny_rate_packets\":0,\r\n \"df_peak_deny_rate_packets_time\":1701966818122,\r\n \"df_peak_insp_rate_bits\":1138739896,\r\n \"df_peak_insp_rate_bits_time\":1701856845806,\r\n \"df_peak_insp_rate_packets\":163328,\r\n \"df_peak_insp_rate_packets_time\":1701936649299,\r\n \"df_peak_pass_percent_bytes\":1,\r\n \"df_peak_pass_percent_bytes_time\":1701966818122,\r\n \"df_peak_pass_percent_packets\":1,\r\n \"df_peak_pass_percent_packets_time\":1701966818122,\r\n \"df_peak_pass_rate_bits\":1138739896,\r\n \"df_peak_pass_rate_bits_time\":1701856845806,\r\n \"df_peak_pass_rate_packets\":163328,\r\n \"df_peak_pass_rate_packets_time\":1701936649299,\r\n \"df_total_deny_count_bytes\":0,\r\n \"df_total_deny_count_packets\":0,\r\n \"df_total_insp_count_bytes\":12972477769527,\r\n \"df_total_insp_count_packets\":13840518683,\r\n \"df_total_pass_before_resource_count_bytes\":12972477769527,\r\n \"df_total_pass_before_resource_count_packets\":13840518683,\r\n \"df_total_pass_count_bytes\":12972477769527,\r\n \"df_total_pass_count_packets\":13840518683,\r\n \"id\":\"161\",\r\n \"reset_by\":\"admin\",\r\n \"reset_time\":1701775074780,\r\n \"stats_time\":1701966818122,\r\n \"type\":\"Dynamic Filter\"\r\n },\r\n {\r\n \"default_name\":\"F22\",\r\n \"df_average_deny_percent_bytes\":0,\r\n \"df_average_deny_percent_packets\":0,\r\n \"df_average_deny_rate_bits\":0,\r\n \"df_average_deny_rate_packets\":0,\r\n \"df_average_insp_rate_bits\":30559366,\r\n \"df_average_insp_rate_packets\":13540,\r\n \"df_average_pass_percent_bytes\":0.9999998,\r\n \"df_average_pass_percent_packets\":0.99999976,\r\n \"df_average_pass_rate_bits\":30559360,\r\n \"df_average_pass_rate_packets\":13540,\r\n \"df_current_deny_percent_bytes\":0,\r\n \"df_current_deny_percent_packets\":0,\r\n \"df_current_deny_rate_bits\":0,\r\n \"df_current_deny_rate_packets\":0,\r\n \"df_current_insp_rate_bits\":25539843,\r\n \"df_current_insp_rate_packets\":16275,\r\n \"df_current_pass_percent_bytes\":1,\r\n \"df_current_pass_percent_packets\":1,\r\n \"df_current_pass_rate_bits\":25655098,\r\n \"df_current_pass_rate_packets\":16294,\r\n \"df_peak_deny_percent_bytes\":0,\r\n \"df_peak_deny_percent_bytes_time\":1701966818122,\r\n \"df_peak_deny_percent_packets\":0,\r\n \"df_peak_deny_percent_packets_time\":1701966818122,\r\n \"df_peak_deny_rate_bits\":0,\r\n \"df_peak_deny_rate_bits_time\":1701966818122,\r\n \"df_peak_deny_rate_packets\":0,\r\n \"df_peak_deny_rate_packets_time\":1701966818122,\r\n \"df_peak_insp_rate_bits\":2445067960,\r\n \"df_peak_insp_rate_bits_time\":1701911127910,\r\n \"df_peak_insp_rate_packets\":216800,\r\n \"df_peak_insp_rate_packets_time\":1701911127910,\r\n \"df_peak_pass_percent_bytes\":1,\r\n \"df_peak_pass_percent_bytes_time\":1701966818122,\r\n \"df_peak_pass_percent_packets\":1,\r\n \"df_peak_pass_percent_packets_time\":1701966818122,\r\n \"df_peak_pass_rate_bits\":2445910912,\r\n \"df_peak_pass_rate_bits_time\":1701911127910,\r\n \"df_peak_pass_rate_packets\":216884,\r\n \"df_peak_pass_rate_packets_time\":1701911127910,\r\n \"df_total_deny_count_bytes\":0,\r\n \"df_total_deny_count_packets\":0,\r\n \"df_total_insp_count_bytes\":49273247902243,\r\n \"df_total_insp_count_packets\":174658538323,\r\n \"df_total_pass_before_resource_count_bytes\":49273247902243,\r\n \"df_total_pass_before_resource_count_packets\":174658538323,\r\n \"df_total_pass_count_bytes\":49273237928768,\r\n \"df_total_pass_count_packets\":174658495168,\r\n \"id\":\"151\",\r\n \"np_total_afm_drop_count_packets\":0,\r\n \"np_total_data_masking_count_packets\":0,\r\n \"np_total_data_masking_percent_packets\":0,\r\n \"np_total_dedup_count_packets\":132,\r\n \"np_total_dedup_percent_packets\":7.5576057E-10,\r\n \"np_total_erspan_strip_count_packets\":0,\r\n \"np_total_erspan_strip_error_packets\":0,\r\n \"np_total_erspan_strip_percent_packets\":0,\r\n \"np_total_etag_strip_count_packets\":0,\r\n \"np_total_etag_strip_percent_packets\":0,\r\n \"np_total_fabric_path_strip_count_packets\":0,\r\n \"np_total_fabric_path_strip_percent_packets\":0,\r\n \"np_total_generic_strip_count_packets\":0,\r\n \"np_total_generic_strip_error_packets\":0,\r\n \"np_total_generic_strip_percent_packets\":0,\r\n \"np_total_gtp_strip_count_packets\":0,\r\n \"np_total_gtp_strip_error_packets\":0,\r\n \"np_total_gtp_strip_percent_packets\":0,\r\n \"np_total_l2gre_strip_count_packets\":0,\r\n \"np_total_l2gre_strip_error_packets\":0,\r\n \"np_total_l2gre_strip_percent_packets\":0,\r\n \"np_total_lisp_strip_count_packets\":0,\r\n \"np_total_lisp_strip_error_packets\":0,\r\n \"np_total_lisp_strip_percent_packets\":0,\r\n \"np_total_mpls_strip_count_packets\":0,\r\n \"np_total_mpls_strip_error_packets\":0,\r\n \"np_total_mpls_strip_percent_packets\":0,\r\n \"np_total_pppoe_strip_count_packets\":0,\r\n \"np_total_pppoe_strip_percent_packets\":0,\r\n \"np_total_reassembly_count_frags\":0,\r\n \"np_total_reassembly_notprocessed_count_frags\":0,\r\n \"np_total_reassembly_percent_frags\":0,\r\n \"np_total_reassembly_reassembled_count_packets\":0,\r\n \"np_total_reassembly_timedout_count_frags\":0,\r\n \"np_total_timestamp_or_packet_length_trailer_count_packets\":0,\r\n \"np_total_timestamp_or_packet_length_trailer_percent_packets\":0,\r\n \"np_total_timestamp_translation_count_packets\":0,\r\n \"np_total_timestamp_translation_count_passed\":0,\r\n \"np_total_timestamp_translation_percent_packets\":0,\r\n \"np_total_timestamp_translation_percent_passed\":0,\r\n \"np_total_trim_count_bytes\":0,\r\n \"np_total_trim_count_packets\":0,\r\n \"np_total_trim_percent_bytes\":0,\r\n \"np_total_trim_percent_packets\":0,\r\n \"np_total_vntag_strip_count_packets\":0,\r\n \"np_total_vntag_strip_percent_packets\":0,\r\n \"np_total_vxlan_strip_count_packets\":0,\r\n \"np_total_vxlan_strip_error_packets\":0,\r\n \"np_total_vxlan_strip_percent_packets\":0,\r\n \"reset_by\":\"admin\",\r\n \"reset_time\":1689067794830,\r\n \"rs_average_drop_rate_packets\":0,\r\n \"rs_average_transmit_rate_bytes\":30559360,\r\n \"rs_average_transmit_rate_packets\":13540,\r\n \"rs_current_drop_rate_packets\":0,\r\n \"rs_current_transmit_rate_bytes\":25655098,\r\n \"rs_current_transmit_rate_packets\":16293,\r\n \"rs_peak_drop_rate_packets\":0,\r\n \"rs_peak_drop_rate_packets_time\":1701966818122,\r\n \"rs_peak_transmit_rate_bytes\":2445910912,\r\n \"rs_peak_transmit_rate_bytes_time\":1701911127910,\r\n \"rs_peak_transmit_rate_packets\":216884,\r\n \"rs_peak_transmit_rate_packets_time\":1701911127910,\r\n \"rs_total_drop_count_packets\":0,\r\n \"rs_total_transmit_count_bytes\":49273237945356,\r\n \"rs_total_transmit_count_packets\":174658495301,\r\n \"stats_time\":1701966818122,\r\n \"type\":\"Dynamic Filter\"\r\n }\r\n ]\r\n}", + "latency": 0, + "statusCode": 200, + "label": "The request has succeeded", + "headers": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": true, + "crudKey": "id", + "callbacks": [] + } + ], + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "046ff40f-fc70-4292-92a8-28c991316240", + "type": "http", + "documentation": "Get PG1 port details (Port Group)", + "method": "get", + "endpoint": "api/ports/PG1", + "responses": [ + { + "uuid": "a88f272f-a8de-46f2-a62f-0b9dd209c079", + "body": "{\r\n \"enabled\":1,\r\n \"license_status\":\"VALID\",\r\n \"link_status\":{\r\n \"link_up\":1\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, + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "8690a790-9a24-45c3-a6ad-fc27d8f3d8fe", + "type": "http", + "documentation": "Get P01 port details (Network Port)", + "method": "get", + "endpoint": "api/ports/P01", + "responses": [ + { + "uuid": "15cb91a9-91fa-442f-80d0-48c807cd7773", + "body": "{\r\n \"enabled\":1,\r\n \"license_status\":\"VALID\",\r\n \"link_status\":{\r\n \"link_up\":1\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, + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "c308af63-c0b5-4d5e-a121-f532fe35f2a2", + "type": "http", + "documentation": "Get P12 port details (Network Port with dedup)", + "method": "get", + "endpoint": "api/ports/P12", + "responses": [ + { + "uuid": "273baba8-e0fb-4aac-8612-6731228d529b", + "body": "{\r\n \"enabled\":1,\r\n \"license_status\":\"VALID\",\r\n \"link_status\":{\r\n \"link_up\":1\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, + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "a9936e6f-a78c-4de2-ba66-9823460b24a4", + "type": "http", + "documentation": "Get P17 port details (Tool Port)", + "method": "get", + "endpoint": "api/ports/P17", + "responses": [ + { + "uuid": "1f967d6d-9847-4c8b-a093-080481b1bed1", + "body": "{\r\n \"enabled\":1,\r\n \"license_status\":\"VALID\",\r\n \"link_status\":{\r\n \"link_up\":1\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, + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "3e56d0a7-0048-47f0-99e6-f686b85307d4", + "type": "http", + "documentation": "Get P14 port details (Loopback dedup)", + "method": "get", + "endpoint": "api/ports/P14", + "responses": [ + { + "uuid": "d0203a6b-2698-47b6-a0db-e7f44503bacc", + "body": "{\r\n \"enabled\":1,\r\n \"license_status\":\"VALID\",\r\n \"link_status\":{\r\n \"link_up\":1\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, + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "977c593b-78ea-484c-92d2-2a9aeef5c7bc", + "type": "http", + "documentation": "Get F23 port details (Dynamic Filter without dedup)", + "method": "get", + "endpoint": "api/ports/F23", + "responses": [ + { + "uuid": "f263a9d4-b331-4852-97aa-97279bb26e7d", + "body": "{\r\n \"enabled\":1,\r\n \"license_status\":\"VALID\",\r\n \"link_status\":{\r\n \"link_up\":1\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, + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "754605e2-78ef-4c98-820c-9c56c08c3367", + "type": "http", + "documentation": "Get F22 port details (Dynamic Filter with dedup)", + "method": "get", + "endpoint": "api/ports/F22", + "responses": [ + { + "uuid": "9fbb85f7-137f-4c04-813b-df7e8ab7052e", + "body": "{\r\n \"enabled\":1,\r\n \"license_status\":\"VALID\",\r\n \"link_status\":{\r\n \"link_up\":1\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, + "streamingMode": null, + "streamingInterval": 0 + }, + { + "uuid": "b0e757a3-0415-4735-bb4a-b10f1fc7d43b", + "type": "http", + "documentation": "Get system properties", + "method": "get", + "endpoint": "api/system", + "responses": [ + { + "uuid": "d7ad5274-8136-4254-8745-8cc2daa82759", + "body": "{\r\n \"subsystem_alarms\":{\r\n \"subsystem_alarms\":{\r\n \"LicenseExpirationStatus\":{\r\n \"info\":[\r\n \"Expired: Maintenance; Oct 20, 2023 23:59:59 GMT\"\r\n ],\r\n \"state\":\"NONE\",\r\n \"time\":1701701956881\r\n }\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, + "streamingMode": null, + "streamingInterval": 0 + } + ], + "rootChildren": [ + { + "type": "route", + "uuid": "beee08c1-0fbb-4ccc-b233-90908aebfa03" + }, + { + "type": "route", + "uuid": "046ff40f-fc70-4292-92a8-28c991316240" + }, + { + "type": "route", + "uuid": "8690a790-9a24-45c3-a6ad-fc27d8f3d8fe" + }, + { + "type": "route", + "uuid": "c308af63-c0b5-4d5e-a121-f532fe35f2a2" + }, + { + "type": "route", + "uuid": "a9936e6f-a78c-4de2-ba66-9823460b24a4" + }, + { + "type": "route", + "uuid": "3e56d0a7-0048-47f0-99e6-f686b85307d4" + }, + { + "type": "route", + "uuid": "977c593b-78ea-484c-92d2-2a9aeef5c7bc" + }, + { + "type": "route", + "uuid": "754605e2-78ef-4c98-820c-9c56c08c3367" + }, + { + "type": "route", + "uuid": "b0e757a3-0415-4735-bb4a-b10f1fc7d43b" + } + ], + "proxyMode": false, + "proxyHost": "", + "proxyRemovePrefix": false, + "tlsOptions": { + "enabled": false, + "type": "CERT", + "pfxPath": "", + "certPath": "", + "keyPath": "", + "caPath": "", + "passphrase": "" + }, + "cors": true, + "headers": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "proxyReqHeaders": [ + { + "key": "", + "value": "" + } + ], + "proxyResHeaders": [ + { + "key": "", + "value": "" + } + ], + "data": [], + "callbacks": [] +} \ No newline at end of file diff --git a/tests/network/keysight/nvos/restapi/license.robot b/tests/network/keysight/nvos/restapi/license.robot new file mode 100644 index 0000000000..6f7a0cffb6 --- /dev/null +++ b/tests/network/keysight/nvos/restapi/license.robot @@ -0,0 +1,39 @@ +*** Settings *** +Documentation Check the licenses status + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Start Mockoon ${MOCKOON_JSON} +Suite Teardown Stop Mockoon +Test Timeout 120s + + +*** Variables *** +${MOCKOON_JSON} ${CURDIR}${/}keysight.json + +${cmd} ${CENTREON_PLUGINS} +... --plugin=network::keysight::nvos::restapi::plugin +... --custommode=api +... --hostname=${HOSTNAME} +... --api-username=username +... --api-password=password +... --proto=http +... --port=${APIPORT} + + +*** Test Cases *** +license ${tc} + [Tags] network restapi + ${command} Catenate + ... ${cmd} + ... --mode=license + ... ${extraoptions} + + Log ${cmd} + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc extraoptions expected_result -- + ... 1 --verbose OK: status : skipped (no value(s)) + ... 2 --unknown-status=\\\%{status} OK: status : skipped (no value(s)) + ... 3 --warning-status='\\\%{status} =~ /MINOR/i' OK: status : skipped (no value(s)) + ... 4 --critical-status='\\\%{status} =~ /MAJOR|CRITICAL/i' OK: status : skipped (no value(s)) diff --git a/tests/network/keysight/nvos/restapi/ports.robot b/tests/network/keysight/nvos/restapi/ports.robot new file mode 100644 index 0000000000..a02a3eab68 --- /dev/null +++ b/tests/network/keysight/nvos/restapi/ports.robot @@ -0,0 +1,48 @@ +*** Settings *** +Documentation Check the ports status + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Start Mockoon ${MOCKOON_JSON} +Suite Teardown Stop Mockoon +Test Timeout 120s + + +*** Variables *** +${MOCKOON_JSON} ${CURDIR}${/}keysight.json + +${cmd} ${CENTREON_PLUGINS} +... --plugin=network::keysight::nvos::restapi::plugin +... --custommode=api +... --hostname=${HOSTNAME} +... --api-username=username +... --api-password=password +... --proto=http +... --port=${APIPORT} + + +*** Test Cases *** +ports ${tc} + [Tags] network restapi notauto + ${command} Catenate + ... ${cmd} + ... --mode=ports + ... ${extraoptions} + Log ${cmd} + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc extraoptions expected_result -- + ... 1 --verbose OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.percentage'=0.00%;;;0;100 checking port 'P01' license status: valid link operational status: up [admin: enabled] checking port 'P12' license status: valid link operational status: up [admin: enabled] checking port 'P14' license status: valid link operational status: up [admin: enabled] traffic out: 0.00%, traffic-out : Buffer creation packets packets-out : Buffer creation, packets-dropped : Buffer creation, packets-pass : Buffer creation, packets-insp : Buffer creation checking port 'P17' license status: valid link operational status: up [admin: enabled] traffic out: 0.00%, traffic-out : Buffer creation packets packets-out : Buffer creation, packets-dropped : Buffer creation, packets-pass : Buffer creation, packets-insp : Buffer creation + ... 2 --filter-name OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 3 --unknown-license-status=\\\%{status} UNKNOWN: port 'P01' license status: valid - port 'P12' license status: valid - port 'P14' license status: valid - port 'P17' license status: valid | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 4 --warning-license-status='\\\%{status} =~ /invalid_software_version/' OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 5 --critical-license-status=\\\%{name} CRITICAL: port 'P01' license status: valid - port 'P12' license status: valid - port 'P14' license status: valid - port 'P17' license status: valid | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 6 --unknown-link-status=\\\%{adminStatus} UNKNOWN: port 'P01' link operational status: up [admin: enabled] - port 'P12' link operational status: up [admin: enabled] - port 'P14' link operational status: up [admin: enabled] - port 'P17' link operational status: up [admin: enabled] | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 7 --warning-link-status=\\\%{name} WARNING: port 'P01' link operational status: up [admin: enabled] - port 'P12' link operational status: up [admin: enabled] - port 'P14' link operational status: up [admin: enabled] - port 'P17' link operational status: up [admin: enabled] | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 8 --critical-link-status='\\\%{adminStatus} eq "enabled" and \\\%{operationalStatus} ne "up"' OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 9 --warning-traffic-out-prct --critical-traffic-out-prct OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 10 --warning-packets-out --critical-packets-out OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 11 --warning-traffic-out=0 --critical-traffic-out=100 OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;0:0;0:100;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;0:0;0:100;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 12 --warning-packets-dropped=10 --critical-packets-dropped=0 OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;0:10;0:0;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;0:10;0:0;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 13 --warning-packets-pass --critical-packets-pass OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;;;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;;;0; + ... 14 --warning-packets-insp=150 --critical-packets-insp=5 OK: All ports are ok | 'P14#port.traffic.out.percentage'=0.00%;;;0;100 'P14#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P14#port.packets.out.count'=0;;;0; 'P14#port.packets.dropped.count'=0;;;0; 'P14#port.packets.pass.count'=0;;;0; 'P14#port.packets.insp.count'=0;0:150;0:5;0; 'P17#port.traffic.out.percentage'=0.00%;;;0;100 'P17#port.traffic.out.bytespersecond'=0.00B/s;;;0; 'P17#port.packets.out.count'=0;;;0; 'P17#port.packets.dropped.count'=0;;;0; 'P17#port.packets.pass.count'=0;;;0; 'P17#port.packets.insp.count'=0;0:150;0:5;0; diff --git a/tests/network/nokia/timos/snmp/nokia.snmpwalk b/tests/network/nokia/timos/snmp/nokia.snmpwalk new file mode 100644 index 0000000000..3391e87919 --- /dev/null +++ b/tests/network/nokia/timos/snmp/nokia.snmpwalk @@ -0,0 +1,24 @@ +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.2.1 = STRING: "PSU_1_Sammelalarm" +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.2.2 = STRING: "PSU_1_230V_fehlt" +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.2.3 = STRING: "PSU_2_Sammelalarm" +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.2.4 = STRING: "PSU_2_230V_fehlt" +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.3.1 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.3.2 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.3.3 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.3.4 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.4.1 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.4.2 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.4.3 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.4.4 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.5.1 = INTEGER: 3 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.5.2 = INTEGER: 3 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.5.3 = INTEGER: 3 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.5.4 = INTEGER: 3 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.6.1 = INTEGER: 2 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.6.2 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.6.3 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.6.4 = INTEGER: 1 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.7.1 = Timeticks: (280) 0:00:02.80 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.7.2 = Timeticks: (280) 0:00:02.80 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.7.3 = Timeticks: (280) 0:00:02.80 +.1.3.6.1.4.1.6527.6.2.2.2.9.1.1.7.4 = Timeticks: (280) 0:00:02.80 \ No newline at end of file diff --git a/tests/network/nokia/timos/snmp/sas-alarm.robot b/tests/network/nokia/timos/snmp/sas-alarm.robot new file mode 100644 index 0000000000..7a2ef38bad --- /dev/null +++ b/tests/network/nokia/timos/snmp/sas-alarm.robot @@ -0,0 +1,32 @@ +*** Settings *** +Documentation Check Stormshield equipment (also Netasq) in SNMP + +Resource ${CURDIR}${/}..${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=network::nokia::timos::snmp::plugin + + +*** Test Cases *** +sas-alarm ${tc} + [Tags] network nokia + ${command} Catenate + ... ${CMD} + ... --mode=sas-alarm + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=network/nokia/timos/snmp/nokia + ... --snmp-timeout=1 + ... ${extra_options} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc extra_options expected_result -- + ... 1 --verbose CRITICAL: Alarm input 'PSU_1_Sammelalarm' Alarm input status : alarm (Alarm input admin state: up (Alarm output severity: major) Alarm input 'PSU_1_Sammelalarm' Alarm input status : alarm (Alarm input admin state: up (Alarm output severity: major) Alarm input 'PSU_1_230V_fehlt' Alarm input status : noAlarm (Alarm input admin state: up (Alarm output severity: major) Alarm input 'PSU_2_Sammelalarm' Alarm input status : noAlarm (Alarm input admin state: up (Alarm output severity: major) Alarm input 'PSU_2_230V_fehlt' Alarm input status : noAlarm (Alarm input admin state: up (Alarm output severity: major) + ... 2 --warning-status='\\\%{alarm_input_admin_state} eq "up" and \\\%{alarm_input_status} eq "alarm" and \\\%{alarm_output_severity} =~ /minor/' CRITICAL: Alarm input 'PSU_1_Sammelalarm' Alarm input status : alarm (Alarm input admin state: up (Alarm output severity: major) + ... 3 --critical-status='\\\%{alarm_input_admin_state} eq "up" and \\\%{alarm_input_status} eq "alarm" and \\\%{alarm_output_severity} =~ /major|critical/' CRITICAL: Alarm input 'PSU_1_Sammelalarm' Alarm input status : alarm (Alarm input admin state: up (Alarm output severity: major) + ... 4 --filter-name CRITICAL: Alarm input 'PSU_1_Sammelalarm' Alarm input status : alarm (Alarm input admin state: up (Alarm output severity: major) \ No newline at end of file diff --git a/tests/os/linux/local/List-Systemdservices-v219.robot b/tests/os/linux/local/List-Systemdservices-v219.robot new file mode 100644 index 0000000000..db2e09eff7 --- /dev/null +++ b/tests/os/linux/local/List-Systemdservices-v219.robot @@ -0,0 +1,31 @@ +*** Settings *** +Documentation Linux Local list-systemdservices + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=os::linux::local::plugin +${COND} ${PERCENT}\{sub\} =~ /exited/ && ${PERCENT}{display} =~ /network/' + + +*** Test Cases *** +List-Systemdservices v219 ${tc} + [Documentation] Systemd version < 248 + [Tags] os linux local + ${command} Catenate + ... ${CMD} + ... --mode=list-systemdservices + ... --command-path=${CURDIR}${/}systemd-219 + ... --filter-name='${filtername}' + ... --filter-description='${filterdescription}' + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc filtername filterdescription expected_result -- + ... 1 toto ${EMPTY} List systemd services: + ... 2 NetworkManager.service ${EMPTY} List systemd services: \n\'NetworkManager.service\' [desc = Network Manager] [load = loaded] [active = active] [sub = running] + ... 3 ${EMPTY} toto List systemd services: + ... 4 ${EMPTY} Permit User Sessions List systemd services: \n\'systemd-user-sessions.service\' [desc = Permit User Sessions] [load = loaded] [active = active] [sub = exited] \ No newline at end of file diff --git a/tests/os/linux/local/List-Systemdservices-v252.robot b/tests/os/linux/local/List-Systemdservices-v252.robot new file mode 100644 index 0000000000..a0ec2e1453 --- /dev/null +++ b/tests/os/linux/local/List-Systemdservices-v252.robot @@ -0,0 +1,31 @@ +*** Settings *** +Documentation Linux Local list-systemdservices + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=os::linux::local::plugin +${COND} ${PERCENT}\{sub\} =~ /exited/ && ${PERCENT}{display} =~ /network/' + + +*** Test Cases *** +List-Systemdservices v252 ${tc} + [Documentation] Systemd version >= 248 + [Tags] os linux local + ${command} Catenate + ... ${CMD} + ... --mode=list-systemdservices + ... --command-path=${CURDIR}${/}systemd-252 + ... --filter-name='${filtername}' + ... --filter-description='${filterdescription}' + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc filtername filterdescription expected_result -- + ... 1 toto ${EMPTY} List systemd services: + ... 2 NetworkManager.service ${EMPTY} List systemd services: \n\'NetworkManager.service\' [desc = Network Manager] [load = loaded] [active = active] [sub = running] + ... 3 ${EMPTY} toto List systemd services: + ... 4 ${EMPTY} Permit User Sessions List systemd services: \n\'systemd-user-sessions.service\' [desc = Permit User Sessions] [load = loaded] [active = active] [sub = exited] diff --git a/tests/os/linux/local/os-linux-list-systemdservices.robot b/tests/os/linux/local/os-linux-list-systemdservices.robot deleted file mode 100644 index 0a22b5d3ce..0000000000 --- a/tests/os/linux/local/os-linux-list-systemdservices.robot +++ /dev/null @@ -1,59 +0,0 @@ -*** Settings *** -Documentation Linux Local list-systemdservices - -Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource - -Test Timeout 120s - - -*** Variables *** -${CMD} ${CENTREON_PLUGINS} --plugin=os::linux::local::plugin -${COND} ${PERCENT}\{sub\} =~ /exited/ && ${PERCENT}{display} =~ /network/' - - -*** Test Cases *** -List-Systemdservices v219 ${tc}/4 - [Documentation] Systemd version < 248 - [Tags] os linux local - ${command} Catenate - ... ${CMD} - ... --mode=list-systemdservices - ... --command-path=${CURDIR}${/}systemd-219 - ... --filter-name='${filtername}' - ... --filter-description='${filterdescription}' - - ${output} Run ${command} - ${output} Strip String ${output} - Should Be Equal As Strings - ... ${output} - ... ${expected_result} - ... \nWrong output result for command:\n${command}\n\nExpected:\n${expected_result}\nCommand output:\n${output}\n - - Examples: tc filtername filterdescription expected_result -- - ... 1 toto ${EMPTY} List systemd services: - ... 2 NetworkManager.service ${EMPTY} List systemd services: \n\'NetworkManager.service\' [desc = Network Manager] [load = loaded] [active = active] [sub = running] - ... 3 ${EMPTY} toto List systemd services: - ... 4 ${EMPTY} Permit User Sessions List systemd services: \n\'systemd-user-sessions.service\' [desc = Permit User Sessions] [load = loaded] [active = active] [sub = exited] - -List-Systemdservices v252 ${tc}/4 - [Documentation] Systemd version >= 248 - [Tags] os linux local - ${command} Catenate - ... ${CMD} - ... --mode=list-systemdservices - ... --command-path=${CURDIR}${/}systemd-252 - ... --filter-name='${filtername}' - ... --filter-description='${filterdescription}' - - ${output} Run ${command} - ${output} Strip String ${output} - Should Be Equal As Strings - ... ${output} - ... ${expected_result} - ... \nWrong output result for command:\n${command}\n\nExpected:\n${expected_result}\nCommand output:\n${output}\n - - Examples: tc filtername filterdescription expected_result -- - ... 1 toto ${EMPTY} List systemd services: - ... 2 NetworkManager.service ${EMPTY} List systemd services: \n\'NetworkManager.service\' [desc = Network Manager] [load = loaded] [active = active] [sub = running] - ... 3 ${EMPTY} toto List systemd services: - ... 4 ${EMPTY} Permit User Sessions List systemd services: \n\'systemd-user-sessions.service\' [desc = Permit User Sessions] [load = loaded] [active = active] [sub = exited] diff --git a/tests/os/linux/local/os-linux-system-sc-status.robot b/tests/os/linux/local/os-linux-system-sc-status.robot deleted file mode 100644 index 982f3f5100..0000000000 --- a/tests/os/linux/local/os-linux-system-sc-status.robot +++ /dev/null @@ -1,97 +0,0 @@ -*** Settings *** -Documentation Linux Local Systemd-sc-status - -# systemd changed the output format of the command starting from version 252, so we need to check for a systemd version and use the correct parameter. -Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource - -Test Timeout 120s - - -*** Variables *** -${CMD} ${CENTREON_PLUGINS} --plugin=os::linux::local::plugin - - -*** Test Cases *** -Systemd-sc-status v219 ${tc}/15 - [Documentation] Systemd version < 248 - [Tags] os linux local - ${command} Catenate - ... ${CMD} - ... --mode=systemd-sc-status - ... --command-path=${CURDIR}${/}systemd-219 - ... --filter-name='${filter}' - ... --exclude-name='${exclude}' - ... --warning-status='${w_stat}' - ... --critical-status='${c_stat}' - ... --warning-total-running='${w_running}' - ... --critical-total-running='${c_running}' - ... --warning-total-dead='${w_dead}' - ... --critical-total-dead='${c_dead}' - ... --warning-total-exited='${w_exited}' - ... --critical-total-exited='${c_exited}' - ... --warning-total-failed='${w_failed}' - ... --critical-total-failed='${c_failed}' - - ${output} Run ${command} - ${output} Strip String ${output} - Should Be Equal As Strings - ... ${output} - ... ${expected_result} - ... \nWrong output result for command:\n${command}\n\nExpected:\n${expected_result}\nCommand output:\n${output}\n - - Examples: tc filter exclude w_stat c_stat w_running c_running w_dead c_dead w_exited c_exited w_failed c_failed expected_result -- - ... 1 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} OK: Total Running: 34, Total Failed: 1, Total Dead: 97, Total Exited: 25 - All services are ok | 'total_running'=34;;;0;220 'total_failed'=1;;;0;220 'total_dead'=97;;;0;220 'total_exited'=25;;;0;220 - ... 2 toto ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} UNKNOWN: No service found. - ... 3 NetworkManager ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} OK: Total Running: 1, Total Failed: 0, Total Dead: 0, Total Exited: 1 - All services are ok | 'total_running'=1;;;0;2 'total_failed'=0;;;0;2 'total_dead'=0;;;0;2 'total_exited'=1;;;0;2 - ... 4 ${EMPTY} Manager ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} OK: Total Running: 33, Total Failed: 1, Total Dead: 97, Total Exited: 24 - All services are ok | 'total_running'=33;;;0;218 'total_failed'=1;;;0;218 'total_dead'=97;;;0;218 'total_exited'=24;;;0;218 - ... 5 NetworkManager ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} OK: Total Running: 1, Total Failed: 0, Total Dead: 0, Total Exited: 1 - All services are ok | 'total_running'=1;;;0;2 'total_failed'=0;;;0;2 'total_dead'=0;;;0;2 'total_exited'=1;;;0;2 - ... 8 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 0 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} WARNING: Total Running: 34 | 'total_running'=34;0:0;;0;220 'total_failed'=1;;;0;220 'total_dead'=97;;;0;220 'total_exited'=25;;;0;220 - ... 9 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 0 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} CRITICAL: Total Running: 34 | 'total_running'=34;;0:0;0;220 'total_failed'=1;;;0;220 'total_dead'=97;;;0;220 'total_exited'=25;;;0;220 - ... 10 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 0 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} WARNING: Total Dead: 97 | 'total_running'=34;;;0;220 'total_failed'=1;;;0;220 'total_dead'=97;0:0;;0;220 'total_exited'=25;;;0;220 - ... 11 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 0 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} CRITICAL: Total Dead: 97 | 'total_running'=34;;;0;220 'total_failed'=1;;;0;220 'total_dead'=97;;0:0;0;220 'total_exited'=25;;;0;220 - ... 12 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 0 ${EMPTY} ${EMPTY} ${EMPTY} WARNING: Total Exited: 25 | 'total_running'=34;;;0;220 'total_failed'=1;;;0;220 'total_dead'=97;;;0;220 'total_exited'=25;0:0;;0;220 - ... 13 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 0 ${EMPTY} ${EMPTY} CRITICAL: Total Exited: 25 | 'total_running'=34;;;0;220 'total_failed'=1;;;0;220 'total_dead'=97;;;0;220 'total_exited'=25;;0:0;0;220 - ... 14 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 0 ${EMPTY} WARNING: Total Failed: 1 | 'total_running'=34;;;0;220 'total_failed'=1;0:0;;0;220 'total_dead'=97;;;0;220 'total_exited'=25;;;0;220 - ... 15 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 0 CRITICAL: Total Failed: 1 | 'total_running'=34;;;0;220 'total_failed'=1;;0:0;0;220 'total_dead'=97;;;0;220 'total_exited'=25;;;0;220 - -Systemd-sc-status v252 ${tc}/15 - [Documentation] Systemd version >= 248 - [Tags] os linux local - ${command} Catenate - ... ${CMD} - ... --mode=systemd-sc-status - ... --command-path=${CURDIR}${/}systemd-252 - ... --filter-name='${filter}' - ... --exclude-name='${exclude}' - ... --warning-status='${w_stat}' - ... --critical-status='${c_stat}' - ... --warning-total-running='${w_running}' - ... --critical-total-running='${c_running}' - ... --warning-total-dead='${w_dead}' - ... --critical-total-dead='${c_dead}' - ... --warning-total-exited='${w_exited}' - ... --critical-total-exited='${c_exited}' - ... --warning-total-failed='${w_failed}' - ... --critical-total-failed='${c_failed}' - - ${output} Run ${command} - ${output} Strip String ${output} - Should Be Equal As Strings - ... ${output} - ... ${expected_result} - ... Wrong output result for command:\n${command}\n\nExpected:\n${expected_result}\nCommand output:\n${output}\n\n - - Examples: tc filter exclude w_stat c_stat w_running c_running w_dead c_dead w_exited c_exited w_failed c_failed expected_result -- - ... 1 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} OK: Total Running: 31, Total Failed: 4, Total Dead: 108, Total Exited: 19 - All services are ok | 'total_running'=31;;;0;258 'total_failed'=4;;;0;258 'total_dead'=108;;;0;258 'total_exited'=19;;;0;258 - ... 2 toto ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} UNKNOWN: No service found. - ... 3 NetworkManager ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} OK: Total Running: 1, Total Failed: 0, Total Dead: 0, Total Exited: 1 - All services are ok | 'total_running'=1;;;0;2 'total_failed'=0;;;0;2 'total_dead'=0;;;0;2 'total_exited'=1;;;0;2 - ... 4 ${EMPTY} Manager ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} OK: Total Running: 30, Total Failed: 4, Total Dead: 108, Total Exited: 18 - All services are ok | 'total_running'=30;;;0;256 'total_failed'=4;;;0;256 'total_dead'=108;;;0;256 'total_exited'=18;;;0;256 - ... 5 NetworkManager ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} OK: Total Running: 1, Total Failed: 0, Total Dead: 0, Total Exited: 1 - All services are ok | 'total_running'=1;;;0;2 'total_failed'=0;;;0;2 'total_dead'=0;;;0;2 'total_exited'=1;;;0;2 - ... 8 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 2 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} WARNING: Total Running: 31 | 'total_running'=31;0:2;;0;258 'total_failed'=4;;;0;258 'total_dead'=108;;;0;258 'total_exited'=19;;;0;258 - ... 9 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 2 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} CRITICAL: Total Running: 31 | 'total_running'=31;;0:2;0;258 'total_failed'=4;;;0;258 'total_dead'=108;;;0;258 'total_exited'=19;;;0;258 - ... 10 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 2 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} WARNING: Total Dead: 108 | 'total_running'=31;;;0;258 'total_failed'=4;;;0;258 'total_dead'=108;0:2;;0;258 'total_exited'=19;;;0;258 - ... 11 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 2 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} CRITICAL: Total Dead: 108 | 'total_running'=31;;;0;258 'total_failed'=4;;;0;258 'total_dead'=108;;0:2;0;258 'total_exited'=19;;;0;258 - ... 12 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 2 ${EMPTY} ${EMPTY} ${EMPTY} WARNING: Total Exited: 19 | 'total_running'=31;;;0;258 'total_failed'=4;;;0;258 'total_dead'=108;;;0;258 'total_exited'=19;0:2;;0;258 - ... 13 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 2 ${EMPTY} ${EMPTY} CRITICAL: Total Exited: 19 | 'total_running'=31;;;0;258 'total_failed'=4;;;0;258 'total_dead'=108;;;0;258 'total_exited'=19;;0:2;0;258 - ... 14 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 2 ${EMPTY} WARNING: Total Failed: 4 | 'total_running'=31;;;0;258 'total_failed'=4;0:2;;0;258 'total_dead'=108;;;0;258 'total_exited'=19;;;0;258 - ... 15 ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} ${EMPTY} 2 CRITICAL: Total Failed: 4 | 'total_running'=31;;;0;258 'total_failed'=4;;0:2;0;258 'total_dead'=108;;;0;258 'total_exited'=19;;;0;258 diff --git a/tests/os/linux/local/process.robot b/tests/os/linux/local/process.robot new file mode 100644 index 0000000000..b16d0bba4f --- /dev/null +++ b/tests/os/linux/local/process.robot @@ -0,0 +1,45 @@ +*** Settings *** +Documentation Linux Local list-systemdservices + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=os::linux::local::plugin +${COND} ${PERCENT}\{sub\} =~ /exited/ && ${PERCENT}{display} =~ /network/' + + +*** Test Cases *** +Process ${tc} + [Tags] os linux local + ${command} Catenate + ... ${CMD} + ... --mode=process + ... --command-options='${CURDIR}${/}process_bin${/}${ps_output}' + ... --command=cat + ... --warning-total='${warning}' + ... --critical-total='${critical}' + ... --filter-command='${filter_command}' + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc ps_output filter_command warning critical expected_result -- + ... 1 ps-centreon.output cs.sapC4P_C00 ${EMPTY} ${EMPTY} OK: Number of current processes: 0 | 'processes.total.count'=0;;;0; + ... 2 ps-centreon.output cs.sapC4P_C00 1:1 ${EMPTY} WARNING: Number of current processes: 0 | 'processes.total.count'=0;1:1;;0; + ... 3 ps-centreon.output cs.sapC4P_C00 1:1 1:1 CRITICAL: Number of current processes: 0 | 'processes.total.count'=0;1:1;1:1;0; + ... 4 ps-centreon.output cs.sapC4P_C00 0:0 0:0 OK: Number of current processes: 0 | 'processes.total.count'=0;0:0;0:0;0; + ... 5 ps-centreon.output gorgone-proxy ${EMPTY} ${EMPTY} OK: Number of current processes: 5 | 'processes.total.count'=5;;;0; + ... 6 ps-centreon.output gorgone-proxy 1:1 ${EMPTY} WARNING: Number of current processes: 5 | 'processes.total.count'=5;1:1;;0; + ... 7 ps-centreon.output gorgone-proxy 1:1 1:1 CRITICAL: Number of current processes: 5 | 'processes.total.count'=5;1:1;1:1;0; + ... 8 ps-centreon.output gorgone-proxy 5:5 5:5 OK: Number of current processes: 5 | 'processes.total.count'=5;5:5;5:5;0; + ... 9 ps-sap.output cs.sapC4P_C00 ${EMPTY} ${EMPTY} OK: Process: [command => cs.sapC4P_C00] [arg => cs.sapC4P_C00 pf=/usr/sap/C4P/SYS/profile/C4P_C00_lunisapcsprd2] [state => S] duration: 3M 2w 5d 21h 51m 25s - Number of current processes: 1 | 'processes.total.count'=1;;;0; + ... 10 ps-sap.output cs.sapC4P_C00 2:2 ${EMPTY} WARNING: Number of current processes: 1 | 'processes.total.count'=1;2:2;;0; + ... 11 ps-sap.output cs.sapC4P_C00 2:2 2:2 CRITICAL: Number of current processes: 1 | 'processes.total.count'=1;2:2;2:2;0; + ... 12 ps-sap.output cs.sapC4P_C00 1:1 1:1 OK: Process: [command => cs.sapC4P_C00] [arg => cs.sapC4P_C00 pf=/usr/sap/C4P/SYS/profile/C4P_C00_lunisapcsprd2] [state => S] duration: 3M 2w 5d 21h 51m 25s - Number of current processes: 1 | 'processes.total.count'=1;1:1;1:1;0; + ... 13 ps-sap.output gorgone-proxy ${EMPTY} ${EMPTY} OK: Number of current processes: 0 | 'processes.total.count'=0;;;0; + ... 14 ps-sap.output gorgone-proxy 2:2 ${EMPTY} WARNING: Number of current processes: 0 | 'processes.total.count'=0;2:2;;0; + ... 15 ps-sap.output gorgone-proxy 2:2 2:2 CRITICAL: Number of current processes: 0 | 'processes.total.count'=0;2:2;2:2;0; + ... 16 ps-sap.output gorgone-proxy 0:0 0:0 OK: Number of current processes: 0 | 'processes.total.count'=0;0:0;0:0;0; + diff --git a/tests/os/linux/local/process_bin/ps-centreon.output b/tests/os/linux/local/process_bin/ps-centreon.output new file mode 100644 index 0000000000..3db39a1cb3 --- /dev/null +++ b/tests/os/linux/local/process_bin/ps-centreon.output @@ -0,0 +1,156 @@ +S ELAPSED PID PPID COMMAND COMMAND +S 43-00:56:55 1 0 systemd /sbin/init +S 43-00:56:55 2 0 kthreadd [kthreadd] +I 43-00:56:55 3 2 rcu_gp [rcu_gp] +I 43-00:56:55 4 2 rcu_par_gp [rcu_par_gp] +I 43-00:56:55 5 2 slub_flushwq [slub_flushwq] +I 43-00:56:55 6 2 netns [netns] +I 43-00:56:55 10 2 mm_percpu_wq [mm_percpu_wq] +I 43-00:56:55 11 2 rcu_tasks_kthread [rcu_tasks_kthread] +I 43-00:56:55 12 2 rcu_tasks_rude_kthread [rcu_tasks_rude_kthread] +I 43-00:56:55 13 2 rcu_tasks_trace_kthread [rcu_tasks_trace_kthread] +S 43-00:56:55 14 2 ksoftirqd/0 [ksoftirqd/0] +I 43-00:56:55 15 2 rcu_preempt [rcu_preempt] +S 43-00:56:55 16 2 migration/0 [migration/0] +S 43-00:56:55 18 2 cpuhp/0 [cpuhp/0] +S 43-00:56:55 19 2 cpuhp/1 [cpuhp/1] +S 43-00:56:55 20 2 migration/1 [migration/1] +S 43-00:56:55 21 2 ksoftirqd/1 [ksoftirqd/1] +I 43-00:56:55 23 2 kworker/1:0H-events_highpri [kworker/1:0H-events_highpri] +S 43-00:56:55 26 2 kdevtmpfs [kdevtmpfs] +I 43-00:56:55 27 2 inet_frag_wq [inet_frag_wq] +S 43-00:56:55 28 2 kauditd [kauditd] +S 43-00:56:55 29 2 khungtaskd [khungtaskd] +S 43-00:56:55 30 2 oom_reaper [oom_reaper] +I 43-00:56:55 32 2 writeback [writeback] +S 43-00:56:55 33 2 kcompactd0 [kcompactd0] +S 43-00:56:55 34 2 ksmd [ksmd] +S 43-00:56:55 35 2 khugepaged [khugepaged] +I 43-00:56:55 36 2 kintegrityd [kintegrityd] +I 43-00:56:55 37 2 kblockd [kblockd] +I 43-00:56:55 38 2 blkcg_punt_bio [blkcg_punt_bio] +I 43-00:56:54 39 2 tpm_dev_wq [tpm_dev_wq] +I 43-00:56:54 40 2 edac-poller [edac-poller] +I 43-00:56:54 41 2 devfreq_wq [devfreq_wq] +I 43-00:56:54 43 2 kworker/1:1H-kblockd [kworker/1:1H-kblockd] +S 43-00:56:54 44 2 kswapd0 [kswapd0] +I 43-00:56:54 50 2 kthrotld [kthrotld] +S 43-00:56:54 52 2 irq/24-pciehp [irq/24-pciehp] +S 43-00:56:54 53 2 irq/25-pciehp [irq/25-pciehp] +S 43-00:56:54 54 2 irq/26-pciehp [irq/26-pciehp] +S 43-00:56:54 55 2 irq/27-pciehp [irq/27-pciehp] +S 43-00:56:54 56 2 irq/28-pciehp [irq/28-pciehp] +S 43-00:56:54 57 2 irq/29-pciehp [irq/29-pciehp] +S 43-00:56:54 58 2 irq/30-pciehp [irq/30-pciehp] +S 43-00:56:54 59 2 irq/31-pciehp [irq/31-pciehp] +S 43-00:56:54 60 2 irq/32-pciehp [irq/32-pciehp] +S 43-00:56:54 61 2 irq/33-pciehp [irq/33-pciehp] +S 43-00:56:54 62 2 irq/34-pciehp [irq/34-pciehp] +S 43-00:56:54 63 2 irq/35-pciehp [irq/35-pciehp] +S 43-00:56:54 64 2 irq/36-pciehp [irq/36-pciehp] +S 43-00:56:54 65 2 irq/37-pciehp [irq/37-pciehp] +S 43-00:56:54 66 2 irq/38-pciehp [irq/38-pciehp] +S 43-00:56:54 67 2 irq/39-pciehp [irq/39-pciehp] +S 43-00:56:54 68 2 irq/40-pciehp [irq/40-pciehp] +S 43-00:56:54 69 2 irq/41-pciehp [irq/41-pciehp] +S 43-00:56:54 70 2 irq/42-pciehp [irq/42-pciehp] +S 43-00:56:54 71 2 irq/43-pciehp [irq/43-pciehp] +S 43-00:56:54 72 2 irq/44-pciehp [irq/44-pciehp] +S 43-00:56:54 73 2 irq/45-pciehp [irq/45-pciehp] +S 43-00:56:54 74 2 irq/46-pciehp [irq/46-pciehp] +S 43-00:56:54 75 2 irq/47-pciehp [irq/47-pciehp] +S 43-00:56:54 76 2 irq/48-pciehp [irq/48-pciehp] +S 43-00:56:54 77 2 irq/49-pciehp [irq/49-pciehp] +S 43-00:56:54 78 2 irq/50-pciehp [irq/50-pciehp] +S 43-00:56:54 79 2 irq/51-pciehp [irq/51-pciehp] +S 43-00:56:54 80 2 irq/52-pciehp [irq/52-pciehp] +S 43-00:56:54 81 2 irq/53-pciehp [irq/53-pciehp] +S 43-00:56:54 82 2 irq/54-pciehp [irq/54-pciehp] +S 43-00:56:54 83 2 irq/55-pciehp [irq/55-pciehp] +I 43-00:56:54 84 2 acpi_thermal_pm [acpi_thermal_pm] +I 43-00:56:54 86 2 mld [mld] +I 43-00:56:54 87 2 ipv6_addrconf [ipv6_addrconf] +I 43-00:56:54 92 2 kstrp [kstrp] +I 43-00:56:54 97 2 zswap-shrink [zswap-shrink] +I 43-00:56:54 98 2 kworker/u5:0 [kworker/u5:0] +I 43-00:56:54 158 2 kworker/0:1H-kblockd [kworker/0:1H-kblockd] +S 43-00:56:54 161 2 scsi_eh_0 [scsi_eh_0] +I 43-00:56:54 164 2 ata_sff [ata_sff] +I 43-00:56:54 165 2 scsi_tmf_0 [scsi_tmf_0] +I 43-00:56:54 166 2 vmw_pvscsi_wq_0 [vmw_pvscsi_wq_0] +S 43-00:56:54 168 2 scsi_eh_1 [scsi_eh_1] +I 43-00:56:54 169 2 scsi_tmf_1 [scsi_tmf_1] +S 43-00:56:54 170 2 scsi_eh_2 [scsi_eh_2] +I 43-00:56:54 171 2 scsi_tmf_2 [scsi_tmf_2] +I 43-00:56:54 187 2 kdmflush/254:0 [kdmflush/254:0] +I 43-00:56:54 188 2 kdmflush/254:1 [kdmflush/254:1] +S 43-00:56:54 197 2 speakup [speakup] +S 43-00:56:53 223 2 jbd2/dm-0-8 [jbd2/dm-0-8] +I 43-00:56:53 224 2 ext4-rsv-conver [ext4-rsv-conver] +S 43-00:56:53 265 1 systemd-journal /lib/systemd/systemd-journald +S 43-00:56:53 289 1 systemd-udevd /lib/systemd/systemd-udevd +S 43-00:56:53 315 2 irq/60-vmw_vmci [irq/60-vmw_vmci] +S 43-00:56:53 316 2 irq/61-vmw_vmci [irq/61-vmw_vmci] +S 43-00:56:53 321 2 irq/62-vmw_vmci [irq/62-vmw_vmci] +S 43-00:56:53 326 2 irq/16-vmwgfx [irq/16-vmwgfx] +I 43-00:56:53 403 2 ext4-rsv-conver [ext4-rsv-conver] +I 43-00:56:53 411 2 cryptd [cryptd] +I 43-00:56:53 520 2 nfit [nfit] +S 43-00:56:53 568 1 systemd-timesyn /lib/systemd/systemd-timesyncd +S 43-00:56:53 570 1 VGAuthService /usr/bin/VGAuthService +S 43-00:56:53 571 1 vmtoolsd /usr/bin/vmtoolsd +S 43-00:56:52 770 1 cron /usr/sbin/cron -f +S 43-00:56:52 771 1 dbus-daemon /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only +S 43-00:56:52 775 1 php-fpm8.1 php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf) +S 43-00:56:52 776 1 snmpd /usr/sbin/snmpd -LOw -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f +S 43-00:56:52 782 1 systemd-logind /lib/systemd/systemd-logind +S 43-00:56:52 785 1 centagent /usr/bin/centagent /etc/centreon-monitoring-agent/centagent.json +S 43-00:56:52 787 1 centreontrapd /usr/bin/perl /usr/share/centreon/bin/centreontrapd --logfile=/var/log/centreon/centreontrapd.log --severity=error --config=/etc/centreon/conf.pm --config-extra=/etc/centreon/centreontrapd.pm +S 43-00:56:52 790 1 agetty /sbin/agetty -o -p -- \u --noclear - linux +S 43-00:56:52 792 1 sshd sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups +S 43-00:56:52 868 1 mariadbd /usr/sbin/mariadbd +S 43-00:56:52 869 1 apache2 /usr/sbin/apache2 -k start +S 43-00:56:52 876 775 php-fpm8.1 php-fpm: pool www +S 43-00:56:52 877 775 php-fpm8.1 php-fpm: pool www +S 43-00:56:51 895 1 cbwd /usr/sbin/cbwd /etc/centreon-broker/watchdog.json +S 43-00:56:51 902 1 centengine /usr/sbin/centengine /etc/centreon-engine/centengine.cfg +S 43-00:56:51 903 895 cbd /usr/sbin/cbd /etc/centreon-broker/central-broker.json +S 43-00:56:51 904 895 cbd /usr/sbin/cbd /etc/centreon-broker/central-rrd.json +S 43-00:56:50 1091 1 gpg-agent gpg-agent --homedir /tmp/www-data --use-standard-socket --daemon +I 42-04:51:03 76631 2 dio/dm-0 [dio/dm-0] +I 29-01:59:35 1255545 2 kworker/0:0H-kblockd [kworker/0:0H-kblockd] +S 7-01:47:04 3232231 1 polkitd /usr/lib/polkit-1/polkitd --no-debug +S 7-01:39:40 3234054 1 perl /usr/bin/perl /usr/bin/gorgoned --config=/etc/centreon-gorgone/config.yaml --logfile=/var/log/centreon-gorgone/gorgoned.log --severity=debug +S 7-01:39:40 3234057 3234054 gorgone-engine gorgone-engine +S 7-01:39:40 3234058 3234054 gorgone-cron gorgone-cron +S 7-01:39:40 3234059 3234054 gorgone-nodes gorgone-nodes +S 7-01:39:40 3234060 3234054 gorgone-audit gorgone-audit +S 7-01:39:40 3234061 3234054 gorgone-httpser gorgone-httpserver +S 7-01:39:40 3234062 3234054 gorgone-action gorgone-action +S 7-01:39:40 3234063 3234054 gorgone-dbclean gorgone-dbcleaner +S 7-01:39:40 3234064 3234054 gorgone-legacyc gorgone-legacycmd +S 7-01:39:40 3234065 3234054 gorgone-autodis gorgone-autodiscovery +S 7-01:39:40 3234068 3234054 gorgone-proxy gorgone-proxy +S 7-01:39:40 3234071 3234054 gorgone-proxy gorgone-proxy +S 7-01:39:40 3234082 3234054 gorgone-proxy gorgone-proxy +S 7-01:39:40 3234083 3234054 gorgone-proxy gorgone-proxy +S 7-01:39:40 3234086 3234054 gorgone-proxy gorgone-proxy +S 7-01:39:40 3234088 3234054 gorgone-statist gorgone-statistics +S 16:51:21 3806240 869 apache2 /usr/sbin/apache2 -k start +S 16:51:21 3806241 869 apache2 /usr/sbin/apache2 -k start +S 16:51:21 3806242 869 apache2 /usr/sbin/apache2 -k start +S 16:51:21 3806243 869 apache2 /usr/sbin/apache2 -k start +S 16:51:21 3806244 869 apache2 /usr/sbin/apache2 -k start +S 16:43:50 3806672 869 apache2 /usr/sbin/apache2 -k start +I 01:12:21 3864794 2 kworker/u4:1-ext4-rsv-conversion [kworker/u4:1-ext4-rsv-conversion] +I 01:12:21 3864795 2 kworker/0:0-cgroup_destroy [kworker/0:0-cgroup_destroy] +I 42:21 3866750 2 kworker/0:2 [kworker/0:2] +I 38:06 3866998 2 kworker/1:5-events_power_efficient [kworker/1:5-events_power_efficient] +I 24:50 3867811 2 kworker/u4:2-writeback [kworker/u4:2-writeback] +I 10:04 3868763 2 kworker/u4:0-events_unbound [kworker/u4:0-events_unbound] +I 07:03 3868932 2 kworker/1:1-ata_sff [kworker/1:1-ata_sff] +I 01:52 3869245 2 kworker/1:0-events [kworker/1:0-events] +S 00:00 3869359 792 sshd sshd: root@notty +S 00:00 3869364 1 systemd /lib/systemd/systemd --user +S 00:00 3869365 3869364 (sd-pam) (sd-pam) +R 00:00 3869384 3869359 ps ps -e -o state -o etime:15 -o pid:10 -o ppid:10 -o comm:50 -o args -w diff --git a/tests/os/linux/local/process_bin/ps-sap.output b/tests/os/linux/local/process_bin/ps-sap.output new file mode 100644 index 0000000000..8f85bbd0a2 --- /dev/null +++ b/tests/os/linux/local/process_bin/ps-sap.output @@ -0,0 +1,5 @@ +S ELAPSED PID PPID COMMAND COMMAND +S 285-02:41:18 1710 1 apstartsrv /usr/sap/C4P/C00/exe/sapstartsrv pf=/usr/sap/C4P/SYS/profile/C4P_C00_lunisapcsprd2 -D -u c4padm +S 111-05:18:34 3241853 1 sapstart sapstart pf=/usr/sap/C4P/SYS/profile/C4P_C00_lunisapcsprd2 +S 111-05:18:34 3241862 3241853 cs.sapC4P_C00 cs.sapC4P_C00 pf=/usr/sap/C4P/SYS/profile/C4P_C00_lunisapcsprd2 +S 00:01 1022450 1022449 centreon_linux_ usr/bin/perl /usr/lib/centreon/plugins/centreon_linux_local.pl --plugin=os::linux::local::plugin --mode=process --warning-total= --critical-total=1:1 --warning-time= --critical-time= --filter-command=cs.sapC4P_C00 --filter-arg= --filter-state= --debug diff --git a/tests/os/linux/snmp/arp.robot b/tests/os/linux/snmp/arp.robot index 81708b2db3..fe82acb6fe 100644 --- a/tests/os/linux/snmp/arp.robot +++ b/tests/os/linux/snmp/arp.robot @@ -3,6 +3,7 @@ Documentation Check arp table Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource +Suite Setup Ctn Generic Suite Setup Test Timeout 120s diff --git a/tests/os/linux/snmp/memory-centreonvault.robot b/tests/os/linux/snmp/memory-centreonvault.robot new file mode 100644 index 0000000000..b9359e3952 --- /dev/null +++ b/tests/os/linux/snmp/memory-centreonvault.robot @@ -0,0 +1,37 @@ +*** Settings *** +Documentation Centreonvault module + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Start Mockoon ${MOCKOON_JSON} +Suite Teardown Stop Mockoon +Test Timeout 120s + + +*** Variables *** + +${CMD} ${CENTREON_PLUGINS} --plugin=os::linux::snmp::plugin --pass-manager=centreonvault --snmp-port=${SNMPPORT} --snmp-version=${SNMPVERSION} --hostname=${HOSTNAME} +${VAULT_CACHE} /var/lib/centreon/centplugins/centreonvault_cache +${VAULT_FILES} ${CURDIR}${/}..${/}..${/}..${/}centreon${/}plugins${/}passwordmgr +${MOCKOON_JSON} ${VAULT_FILES}${/}centreonvault.mockoon.json + +*** Test Cases *** +Linux Memory with vault ${tc} + [Tags] snmp linux vault mockoon + Remove File ${VAULT_CACHE} + ${command} Catenate + ... ${CMD} + ... --mode=memory + ... --snmp-community=secret::hashicorp_vault::myvault/data/snmp::${secret} + ... --vault-config=${vault_config} + ... --vault-cache=${VAULT_CACHE} + ... ${extra_options} + + Ctn Run Command And Check Result As Regexp ${command} ${expected_regexp} + + Examples: tc secret vault_config extra_options expected_regexp -- + ... 1 Linux ${EMPTY} ${EMPTY} UNKNOWN: Please provide a Centreon Vault configuration file path with --vault-config option + ... 2 Linux ${VAULT_FILES}${/}vault.json ${EMPTY} UNKNOWN: File '.*/centreon/plugins/passwordmgr/vault.json' could not be found. + ... 3 Linux ${VAULT_FILES}${/}vault_config_incomplete.json ${EMPTY} UNKNOWN: Unable to authenticate to the vault: role_id or secret_id is empty. + ... 4 Linux ${VAULT_FILES}${/}vault_config_plain.json --debug OK: Ram Total: 1.92 GB Used + ... 5 Linux ${VAULT_FILES}${/}vault_config_encrypted.json --vault-env-file=${VAULT_FILES}${/}env OK: Ram Total: 1.92 GB Used diff --git a/tests/os/linux/snmp/network-interfaces.robot b/tests/os/linux/snmp/network-interfaces.robot index baa63ee156..ca07724a71 100644 --- a/tests/os/linux/snmp/network-interfaces.robot +++ b/tests/os/linux/snmp/network-interfaces.robot @@ -14,7 +14,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --hostname=${HOSTNAME} ... --snmp-port=${SNMPPORT} ... --snmp-community=os/linux/snmp/network-interfaces -... --statefile-dir=/dev/shm/ ${COND} ${PERCENT}\{sub\} =~ /exited/ && ${PERCENT}{display} =~ /network/' diff --git a/tests/resources/spellcheck/stopwords.txt b/tests/resources/spellcheck/stopwords.txt index cfc38f6295..55c3a58940 100644 --- a/tests/resources/spellcheck/stopwords.txt +++ b/tests/resources/spellcheck/stopwords.txt @@ -1,17 +1,12 @@ 2c ---warning-authservers-total ---critical-authservers-total ---warning-authserver-roundtrip-time ---critical-authserver-roundtrip-time ---warning-authserver-packets-access-requests ---critical-authserver-packets-access-requests ---warning-authserver-packets-access-accepts ---critical-authserver-packets-access-accepts ---warning-authserver-clients-timeout ---critical-authserver-clients-timeout 3COM 3CX --3cx-version +7210SAS +7750SR +ACS +--add-cpu +--add-disk-io --add-fc-fe-errors --add-qos-limit --add-sysdesc @@ -26,27 +21,41 @@ api.meraki.com --api-token --api-username --api-version +AppearTV ASAM Avigilon +Avocent aws AWSCLI --aws-role-arn Backbox +base64 +blocked-by-uf --cacert-file cardtemperature +centreon Centreon +centreonvault --cert-pkcs12 --cert-pwd CloudWatch connections-dhcp connections-dns +cpu-utilization cpu-utilization-1m cpu-utilization-5m cpu-utilization-5s +--critical-authserver-clients-timeout +--critical-authserver-packets-access-accepts +--critical-authserver-packets-access-requests +--critical-authserver-roundtrip-time +--critical-authservers-total --critical-backend-congestions --critical-backend-outstanding-io --critical-bytesallocatedpercentage +--critical-cpu-utilization --critical-na +--critical-total-cpu-utilization Datacore datasource DC4 @@ -58,14 +67,19 @@ df dfsrevent --display-transform-dst --display-transform-src +dns-resolve-time --dyn-mode -EncodedCommand +env +ESX eth --exclude-fs +--failback-file fanspeed FCCapacity --filter-fs --filter-imei +--filter-ppid --filter-vdom --filter-vm --force-64bits-counters @@ -90,12 +104,15 @@ in-fcserror in-mcast -InputFormat interface-dsl-name +InterrupibleSleep in-ucast IpAddr ipv4 ipv6 ISAM Iwsva +jmeter +JMeter --jobq JOBQ jobqueue @@ -103,6 +120,7 @@ jobqueues journalctl kccevent keepass +Keysight Kubernetes ldap --legacy-api-beta @@ -113,8 +131,10 @@ Loggly machineaccount --map-speed-dsl MBean +McAfee memAvailReal memBuffer +--memexpiration memTotalReal Meraki MIB @@ -151,6 +171,7 @@ NLCapacity --ntlmv2 NTLMv2 NTP +NVOS --oid OID --oid-display @@ -169,25 +190,35 @@ physicaldrive PKCS1 powershell powershell.exe +PPID prct Primera +Procurve proto --proxyurl psu QoS queue-messages-inflighted +--redis-attribute +--redis-db +--redis-server RestAPI RFC1628 RRDCached Sansymphony +SAS +scenarii --scope-datacenter sfp.temperature --skip-ssl-check +SkyHigh SNMP space-usage-prct --sql-errors-exit SSDCapacity SSH +statefile +--statefile-concat-cwd SureBackup systemd SysVol @@ -195,6 +226,8 @@ TCP teampass Teldat timeframe +TiMOS +tmnxSasAlarmInputDescription topic-messages-inflighted total-offline-prct total-online-prct @@ -202,8 +235,11 @@ total-oper-down total-oper-up tower-cli TrendMicro +tsdb-version UCD UDP +UninterrupibleSleep +uniq uptime --urlpath usage-prct @@ -218,9 +254,17 @@ VM VMware VPN vSAN +vSphere +--warning-authserver-clients-timeout +--warning-authserver-packets-access-accepts +--warning-authserver-packets-access-requests +--warning-authserver-roundtrip-time +--warning-authservers-total --warning-backend-congestions --warning-backend-outstanding-io --warning-bytesallocatedpercentage +--warning-cpu-utilization --warning-na +--warning-total-cpu-utilization WSMAN XPath diff --git a/tests/storage/datacore/restapi/alert-count.robot b/tests/storage/datacore/restapi/alert-count.robot new file mode 100644 index 0000000000..3752916fff --- /dev/null +++ b/tests/storage/datacore/restapi/alert-count.robot @@ -0,0 +1,33 @@ +*** Settings *** +Documentation datacore rest api plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Start Mockoon ${MOCKOON_JSON} +Suite Teardown Stop Mockoon +Test Timeout 120s + + +*** Variables *** +${MOCKOON_JSON} ${CURDIR}${/}storage-datacore-api.json + +${CMD} ${CENTREON_PLUGINS} --plugin=storage::datacore::restapi::plugin --password=pass --username=user --port=${APIPORT} --hostname=${HOSTNAME} --proto=http + + +*** Test Cases *** +Datacore check alert count ${tc} + [Documentation] Check Datacore pool usage + [Tags] storage api + ${command} Catenate + ... ${CMD} + ... --mode=alerts + ... --warning-error=${warning-error} + ... --critical-error=${critical-error} + ... --warning-warning=${warning-warning} + ... --critical-warning=${critical-warning} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc warning-error critical-error warning-warning critical-warning expected_result -- + ... 1 0 1 5 5 WARNING: number of error alerts : 1 | 'datacore.event.error.count'=1;0:0;0:1;0; 'datacore.alerts.warning.count'=1;0:5;0:5;0; 'datacore.alerts.info.count'=0;;;0; 'datacore.alerts.trace.count'=0;;;0; + ... 2 5 5 5 5 OK: number of error alerts : 1, number of warning alerts : 1, number of info alerts : 0, number of trace alerts : 0 | 'datacore.event.error.count'=1;0:5;0:5;0; 'datacore.alerts.warning.count'=1;0:5;0:5;0; 'datacore.alerts.info.count'=0;;;0; 'datacore.alerts.trace.count'=0;;;0; \ No newline at end of file diff --git a/tests/storage/datacore/restapi/storage-datacore-restapi.robot b/tests/storage/datacore/restapi/pool-usage.robot similarity index 53% rename from tests/storage/datacore/restapi/storage-datacore-restapi.robot rename to tests/storage/datacore/restapi/pool-usage.robot index 025b50824a..08c3a7145f 100644 --- a/tests/storage/datacore/restapi/storage-datacore-restapi.robot +++ b/tests/storage/datacore/restapi/pool-usage.robot @@ -31,34 +31,4 @@ Datacore check pool usage ${tc} Examples: tc warning-bytesallocatedpercentage critical-bytesallocatedpercentage warning-oversubscribed critical-oversubscribed expected_result -- ... 1 2 5 -1 3 CRITICAL: Bytes Allocated : 12 % WARNING: Over subscribed bytes : 0 | 'datacore.pool.bytesallocated.percentage'=12%;0:2;0:5;0;100 'datacore.pool.oversubscribed.bytes'=0bytes;0:-1;0:3;0; - ... 2 70 80 10 20 OK: Bytes Allocated : 12 % - Over subscribed bytes : 0 | 'datacore.pool.bytesallocated.percentage'=12%;0:70;0:80;0;100 'datacore.pool.oversubscribed.bytes'=0bytes;0:10;0:20;0; - -Datacore check alert count ${tc} - [Documentation] Check Datacore pool usage - [Tags] storage api - ${command} Catenate - ... ${CMD} - ... --mode=alerts - ... --warning-error=${warning-error} - ... --critical-error=${critical-error} - ... --warning-warning=${warning-warning} - ... --critical-warning=${critical-warning} - - Ctn Run Command And Check Result As Strings ${command} ${expected_result} - - Examples: tc warning-error critical-error warning-warning critical-warning expected_result -- - ... 1 0 1 5 5 WARNING: number of error alerts : 1 | 'datacore.event.error.count'=1;0:0;0:1;0; 'datacore.alerts.warning.count'=1;0:5;0:5;0; 'datacore.alerts.info.count'=0;;;0; 'datacore.alerts.trace.count'=0;;;0; - ... 2 5 5 5 5 OK: number of error alerts : 1, number of warning alerts : 1, number of info alerts : 0, number of trace alerts : 0 | 'datacore.event.error.count'=1;0:5;0:5;0; 'datacore.alerts.warning.count'=1;0:5;0:5;0; 'datacore.alerts.info.count'=0;;;0; 'datacore.alerts.trace.count'=0;;;0; - -Datacore check status monitor ${tc} - [Documentation] Check Datacore pool usage - [Tags] storage api - ${command} Catenate - ... ${CMD} - ... --mode=status-monitor - ... --statefile-dir=/dev/shm/ - - Ctn Run Command And Check Result As Strings ${command} ${expected_result} - - Examples: tc expected_result -- - ... 1 CRITICAL: 'State of HostVM2' status : 'Critical', message is 'Connected' + ... 2 70 80 10 20 OK: Bytes Allocated : 12 % - Over subscribed bytes : 0 | 'datacore.pool.bytesallocated.percentage'=12%;0:70;0:80;0;100 'datacore.pool.oversubscribed.bytes'=0bytes;0:10;0:20;0; \ No newline at end of file diff --git a/tests/storage/datacore/restapi/status-monitor.robot b/tests/storage/datacore/restapi/status-monitor.robot new file mode 100644 index 0000000000..b1372fed4a --- /dev/null +++ b/tests/storage/datacore/restapi/status-monitor.robot @@ -0,0 +1,29 @@ +*** Settings *** +Documentation datacore rest api plugin + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Suite Setup Start Mockoon ${MOCKOON_JSON} +Suite Teardown Stop Mockoon +Test Timeout 120s + + +*** Variables *** +${MOCKOON_JSON} ${CURDIR}${/}storage-datacore-api.json + +${CMD} ${CENTREON_PLUGINS} --plugin=storage::datacore::restapi::plugin --password=pass --username=user --port=${APIPORT} --hostname=${HOSTNAME} --proto=http + + +*** Test Cases *** +Datacore check status monitor ${tc} + [Documentation] Check Datacore pool usage + [Tags] storage api + ${command} Catenate + ... ${CMD} + ... --mode=status-monitor + ... --statefile-dir=/dev/shm/ + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc expected_result -- + ... 1 CRITICAL: 'State of HostVM2' status : 'Critical', message is 'Connected' diff --git a/tests/storage/hp/primera/restapi/capacity.robot b/tests/storage/hp/primera/restapi/capacity.robot index 50d2f8c491..8c232f6667 100644 --- a/tests/storage/hp/primera/restapi/capacity.robot +++ b/tests/storage/hp/primera/restapi/capacity.robot @@ -21,7 +21,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ *** Test Cases *** Capacity ${tc} diff --git a/tests/storage/hp/primera/restapi/diskstatus.robot b/tests/storage/hp/primera/restapi/diskstatus.robot index bfe4c02a59..7d186020ba 100644 --- a/tests/storage/hp/primera/restapi/diskstatus.robot +++ b/tests/storage/hp/primera/restapi/diskstatus.robot @@ -21,7 +21,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ *** Test Cases *** Diskstatus ${tc} diff --git a/tests/storage/hp/primera/restapi/diskusage.robot b/tests/storage/hp/primera/restapi/diskusage.robot index f83af7f967..612bfe9a48 100644 --- a/tests/storage/hp/primera/restapi/diskusage.robot +++ b/tests/storage/hp/primera/restapi/diskusage.robot @@ -20,7 +20,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ *** Test Cases *** Disk Usage ${tc} diff --git a/tests/storage/hp/primera/restapi/licenses.robot b/tests/storage/hp/primera/restapi/licenses.robot index af638aacc0..267f905056 100644 --- a/tests/storage/hp/primera/restapi/licenses.robot +++ b/tests/storage/hp/primera/restapi/licenses.robot @@ -20,7 +20,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ *** Test Cases *** Licenses ${tc} diff --git a/tests/storage/hp/primera/restapi/listdisks.robot b/tests/storage/hp/primera/restapi/listdisks.robot index 51b65c393e..19cc35b963 100644 --- a/tests/storage/hp/primera/restapi/listdisks.robot +++ b/tests/storage/hp/primera/restapi/listdisks.robot @@ -21,7 +21,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ ... *** Test Cases *** diff --git a/tests/storage/hp/primera/restapi/listvolumes.robot b/tests/storage/hp/primera/restapi/listvolumes.robot index 9546fbe4dc..e595a2b255 100644 --- a/tests/storage/hp/primera/restapi/listvolumes.robot +++ b/tests/storage/hp/primera/restapi/listvolumes.robot @@ -21,7 +21,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ ... *** Test Cases *** diff --git a/tests/storage/hp/primera/restapi/nodes.robot b/tests/storage/hp/primera/restapi/nodes.robot index efad134c4c..7c752a46b6 100644 --- a/tests/storage/hp/primera/restapi/nodes.robot +++ b/tests/storage/hp/primera/restapi/nodes.robot @@ -20,7 +20,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ *** Test Cases *** Nodes ${tc} diff --git a/tests/storage/hp/primera/restapi/volumeusage.robot b/tests/storage/hp/primera/restapi/volumeusage.robot index bf866dcd6f..518fc2a4fc 100644 --- a/tests/storage/hp/primera/restapi/volumeusage.robot +++ b/tests/storage/hp/primera/restapi/volumeusage.robot @@ -20,7 +20,6 @@ ${CMD} ${CENTREON_PLUGINS} ... --proto=http ... --port=${APIPORT} ... --custommode=api -... --statefile-dir=/dev/shm/ *** Test Cases *** Volumeusage ${tc} diff --git a/tests/storage/synology/snmp/Components.robot b/tests/storage/synology/snmp/Components.robot new file mode 100644 index 0000000000..9e1c40c87f --- /dev/null +++ b/tests/storage/synology/snmp/Components.robot @@ -0,0 +1,29 @@ +*** Settings *** +Documentation Storage Synology SNMP + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=storage::synology::snmp::plugin + +*** Test Cases *** +Components ${tc} + [Tags] storage synology snmp + ${command} Catenate + ... ${CMD} + ... --mode=components + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=${snmpcommunity} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc snmpcommunity expected_result -- + ... 1 storage/synology/snmp/synology-disk-ok OK: All 8 components are ok [2/2 disk, 2/2 fan, 1/1 psu, 2/2 raid, 1/1 system]. | 'Disk 1#hardware.disk.bad_sectors.count'=0;;;0; 'Disk 2#hardware.disk.bad_sectors.count'=0;;;0; 'hardware.disk.count'=2;;;; 'hardware.fan.count'=2;;;; 'hardware.psu.count'=1;;;; 'hardware.raid.count'=2;;;; 'hardware.system.count'=1;;;; + ... 2 storage/synology/snmp/synology-disk-warning WARNING: Disk 'Disk 2' health is warning | 'Disk 1#hardware.disk.bad_sectors.count'=0;;;0; 'Disk 2#hardware.disk.bad_sectors.count'=0;;;0; 'hardware.disk.count'=2;;;; 'hardware.fan.count'=2;;;; 'hardware.psu.count'=1;;;; 'hardware.raid.count'=2;;;; 'hardware.system.count'=1;;;; + ... 3 storage/synology/snmp/synology-disk-critical CRITICAL: Disk 'Disk 2' health is critical | 'Disk 1#hardware.disk.bad_sectors.count'=0;;;0; 'Disk 2#hardware.disk.bad_sectors.count'=0;;;0; 'hardware.disk.count'=2;;;; 'hardware.fan.count'=2;;;; 'hardware.psu.count'=1;;;; 'hardware.raid.count'=2;;;; 'hardware.system.count'=1;;;; + ... 4 storage/synology/snmp/synology-disk-failing CRITICAL: Disk 'Disk 2' health is failing | 'Disk 1#hardware.disk.bad_sectors.count'=0;;;0; 'Disk 2#hardware.disk.bad_sectors.count'=0;;;0; 'hardware.disk.count'=2;;;; 'hardware.fan.count'=2;;;; 'hardware.psu.count'=1;;;; 'hardware.raid.count'=2;;;; 'hardware.system.count'=1;;;; \ No newline at end of file diff --git a/tests/storage/synology/snmp/Uptime.robot b/tests/storage/synology/snmp/Uptime.robot new file mode 100644 index 0000000000..f86a7b9bfa --- /dev/null +++ b/tests/storage/synology/snmp/Uptime.robot @@ -0,0 +1,30 @@ +*** Settings *** +Documentation Storage Synology SNMP + +Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource + +Test Timeout 120s + + +*** Variables *** +${CMD} ${CENTREON_PLUGINS} --plugin=storage::synology::snmp::plugin + +*** Test Cases *** +Uptime ${tc} + [Tags] storage synology snmp + ${command} Catenate + ... ${CMD} + ... --mode=uptime + ... --hostname=${HOSTNAME} + ... --snmp-version=${SNMPVERSION} + ... --snmp-port=${SNMPPORT} + ... --snmp-community=storage/synology/snmp/synology-disk-ok + ... --warning-uptime=${warning} + ... --critical-uptime=${critical} + + Ctn Run Command And Check Result As Strings ${command} ${expected_result} + + Examples: tc warning critical expected_result -- + ... 1 ${Empty} ${Empty} OK: System uptime is: 46m 5s | 'uptime'=2765.00s;;;0; + ... 2 10 ${Empty} WARNING: System uptime is: 46m 5s | 'uptime'=2765.00s;0:10;;0; + ... 3 ${Empty} 10 CRITICAL: System uptime is: 46m 5s | 'uptime'=2765.00s;;0:10;0; \ No newline at end of file diff --git a/tests/storage/synology/snmp/storage-synology-snmp.robot b/tests/storage/synology/snmp/storage-synology-snmp.robot deleted file mode 100644 index 40fa65f909..0000000000 --- a/tests/storage/synology/snmp/storage-synology-snmp.robot +++ /dev/null @@ -1,88 +0,0 @@ -*** Settings *** -Documentation Storage Synology SNMP - -Resource ${CURDIR}${/}..${/}..${/}..${/}resources/import.resource - -Test Timeout 120s - - -*** Variables *** -${CMD} ${CENTREON_PLUGINS} --plugin=storage::synology::snmp::plugin - -&{check_components_test1} -... description=Checking disk components when all disks are ok -... snmpcommunity=storage/synology/snmp/synology-disk-ok -... expected_output=OK: All 8 components are ok [2/2 disk, 2/2 fan, 1/1 psu, 2/2 raid, 1/1 system]. | 'Disk 1#hardware.disk.bad_sectors.count'=0;;;0; 'Disk 2#hardware.disk.bad_sectors.count'=0;;;0; 'hardware.disk.count'=2;;;; 'hardware.fan.count'=2;;;; 'hardware.psu.count'=1;;;; 'hardware.raid.count'=2;;;; 'hardware.system.count'=1;;;; -&{check_components_test2} -... description=Checking disk components when one disks is warning -... snmpcommunity=storage/synology/snmp/synology-disk-warning -... expected_output=WARNING: Disk 'Disk 2' health is warning | 'Disk 1#hardware.disk.bad_sectors.count'=0;;;0; 'Disk 2#hardware.disk.bad_sectors.count'=0;;;0; 'hardware.disk.count'=2;;;; 'hardware.fan.count'=2;;;; 'hardware.psu.count'=1;;;; 'hardware.raid.count'=2;;;; 'hardware.system.count'=1;;;; -&{check_components_test3} -... description=Checking disk components when one disks is critical -... snmpcommunity=storage/synology/snmp/synology-disk-critical -... expected_output=CRITICAL: Disk 'Disk 2' health is critical | 'Disk 1#hardware.disk.bad_sectors.count'=0;;;0; 'Disk 2#hardware.disk.bad_sectors.count'=0;;;0; 'hardware.disk.count'=2;;;; 'hardware.fan.count'=2;;;; 'hardware.psu.count'=1;;;; 'hardware.raid.count'=2;;;; 'hardware.system.count'=1;;;; -&{check_components_test4} -... description=Checking disk components when one disks is failing -... snmpcommunity=storage/synology/snmp/synology-disk-failing -... expected_output=CRITICAL: Disk 'Disk 2' health is failing | 'Disk 1#hardware.disk.bad_sectors.count'=0;;;0; 'Disk 2#hardware.disk.bad_sectors.count'=0;;;0; 'hardware.disk.count'=2;;;; 'hardware.fan.count'=2;;;; 'hardware.psu.count'=1;;;; 'hardware.raid.count'=2;;;; 'hardware.system.count'=1;;;; -@{check_components_tests} -... &{check_components_test1} -... &{check_components_test2} -... &{check_components_test3} -... &{check_components_test4} - -&{uptime_t1} -... description=Uptime check expected to be OK -... snmpcommunity=storage/synology/snmp/synology-disk-ok -... warning= -... critical= -... expected_output=OK: System uptime is: 46m 5s | 'uptime'=2765.00s;;;0; -&{uptime_t2} -... description=Uptime check expected to be warning -... snmpcommunity=storage/synology/snmp/synology-disk-ok -... warning=10 -... critical= -... expected_output=WARNING: System uptime is: 46m 5s | 'uptime'=2765.00s;0:10;;0; -&{uptime_t3} -... description=Uptime check expected to be critical -... snmpcommunity=storage/synology/snmp/synology-disk-ok -... warning= -... critical=10 -... expected_output=CRITICAL: System uptime is: 46m 5s | 'uptime'=2765.00s;;0:10;0; - -@{uptime_tests} -... &{uptime_t1} -... &{uptime_t2} -... &{uptime_t3} - - -*** Test Cases *** -Components - [Tags] storage synology snmp - FOR ${check_components_test} IN @{check_components_tests} - ${command} Catenate - ... ${CMD} - ... --mode=components - ... --hostname=${HOSTNAME} - ... --snmp-version=${SNMPVERSION} - ... --snmp-port=${SNMPPORT} - ... --snmp-community=${check_components_test.snmpcommunity} - - Ctn Run Command And Check Result As Strings ${command} ${check_components_test.expected_output} - END - -Uptime - [Tags] storage synology snmp - FOR ${test_item} IN @{uptime_tests} - ${command} Catenate - ... ${CMD} - ... --mode=uptime - ... --hostname=${HOSTNAME} - ... --snmp-version=${SNMPVERSION} - ... --snmp-port=${SNMPPORT} - ... --snmp-community=${test_item.snmpcommunity} - ... --warning-uptime=${test_item.warning} - ... --critical-uptime=${test_item.critical} - - Ctn Run Command And Check Result As Strings ${command} ${test_item.expected_output} - END