├── .github ├── dependabot.yml ├── integration │ ├── configuration.yaml │ ├── example1.walk │ └── ios.yaml └── workflows │ ├── codeql.yml │ ├── docker.yml │ ├── integration.yml │ ├── maven-release.yml │ └── maven.yml ├── .gitignore ├── .suppressions.xml ├── Dockerfile ├── LICENSE.txt ├── MAINTAINERS ├── README.md ├── docker └── docker-entrypoint.sh ├── pom.xml ├── snmpman-cli ├── pom.xml └── src │ ├── main │ ├── assembly │ │ ├── dist.xml │ │ └── snmpman.sh │ ├── config │ │ ├── configuration.yaml │ │ ├── devices │ │ │ ├── catos.yaml │ │ │ ├── finesse.yaml │ │ │ ├── foundry.yaml │ │ │ ├── ios.yaml │ │ │ ├── iosxr.yaml │ │ │ ├── junos.yaml │ │ │ └── nxos.yaml │ │ └── walk │ │ │ └── example1.walk │ ├── java │ │ └── com │ │ │ └── oneandone │ │ │ └── snmpman │ │ │ ├── CommandLineOptions.java │ │ │ ├── Main.java │ │ │ └── package-info.java │ └── resources │ │ └── log4j2.xml │ └── test │ ├── java │ └── com │ │ └── oneandone │ │ └── snmpman │ │ └── CommandLineOptionsTest.java │ └── resources │ ├── configuration │ ├── cisco.yaml │ ├── configuration.yaml │ ├── differentStartingOID.txt │ ├── empty.yaml │ └── example.txt │ └── log4j2.xml └── snmpman ├── pom.xml └── src ├── main ├── config │ ├── configuration.yaml │ ├── devices │ │ ├── catos.yaml │ │ ├── finesse.yaml │ │ ├── foundry.yaml │ │ ├── ios.yaml │ │ ├── iosxr.yaml │ │ ├── junos.yaml │ │ └── nxos.yaml │ ├── log4j2.xml │ └── walk │ │ └── example1.walk └── java │ └── com │ └── oneandone │ └── snmpman │ ├── Snmpman.java │ ├── SnmpmanAgent.java │ ├── configuration │ ├── AgentConfiguration.java │ ├── Device.java │ ├── Walks.java │ ├── modifier │ │ ├── AbstractIntegerModifier.java │ │ ├── CommunityContextModifier.java │ │ ├── CommunityIndexCounter32Modifier.java │ │ ├── Counter32Modifier.java │ │ ├── Counter64Modifier.java │ │ ├── Gauge32Modifier.java │ │ ├── Integer32Modifier.java │ │ ├── ModifiedVariable.java │ │ ├── Modifier.java │ │ ├── TimeTicksModifier.java │ │ ├── UnsignedInteger32Modifier.java │ │ ├── VariableModifier.java │ │ └── package-info.java │ ├── package-info.java │ └── type │ │ ├── ModifierProperties.java │ │ ├── WildcardOID.java │ │ └── package-info.java │ ├── exception │ ├── InitializationException.java │ └── package-info.java │ ├── package-info.java │ └── snmp │ └── MOGroup.java └── test ├── java └── com │ └── oneandone │ └── snmpman │ ├── AbstractSnmpmanTest.java │ ├── SnmpmanAgentTest.java │ ├── SnmpmanSetTest.java │ ├── SnmpmanTest.java │ ├── configuration │ ├── AgentConfigurationTest.java │ ├── DeviceFactoryTest.java │ ├── DeviceTest.java │ ├── WalksTest.java │ ├── modifier │ │ ├── AbstractIntegerModifierTest.java │ │ ├── CommunityIndexCounter32ModifierTest.java │ │ ├── Counter32ModifierTest.java │ │ ├── Counter64ModifierTest.java │ │ ├── Gauge32ModifierTest.java │ │ ├── Integer32ModifierTest.java │ │ ├── ModifiedVariableTest.java │ │ ├── ModifierTest.java │ │ ├── TimeTicksModifierTest.java │ │ └── UnsignedInteger32ModifierTest.java │ └── type │ │ ├── ModifierPropertiesTest.java │ │ └── WildcardOIDTest.java │ └── integration │ └── SnmpmanIntegrationTest.java └── resources ├── configuration ├── cisco.yaml ├── configuration.yaml ├── differentStartingOID.txt ├── empty.yaml └── example.txt └── log4j2.xml /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "maven" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | -------------------------------------------------------------------------------- /.github/integration/configuration.yaml: -------------------------------------------------------------------------------- 1 | - name: "example1" 2 | device: "ios.yaml" 3 | walk: "example1.walk" 4 | ip: "127.0.0.1" 5 | port: 10000 -------------------------------------------------------------------------------- /.github/integration/example1.walk: -------------------------------------------------------------------------------- 1 | .1.3.6.1.2.1.1.5.0 = STRING: "device" 2 | .1.3.6.1.2.1.2.2.1.7.10101 = INTEGER: 1 3 | .1.3.6.1.2.1.31.1.1.1.6.10101 = Counter64: 389172331 4 | .1.3.6.1.2.1.31.1.1.1.7.10101 = Counter64: 5470259 5 | .1.3.6.1.2.1.31.1.1.1.8.10101 = Counter64: 19 6 | .1.3.6.1.2.1.31.1.1.1.9.10101 = Counter64: 743 7 | .1.3.6.1.2.1.2.2.1.13.10101 = Counter32: 0 8 | .1.3.6.1.2.1.2.2.1.14.10101 = Counter32: 0 9 | .1.3.6.1.2.1.2.2.1.15.10101 = Counter32: 0 10 | .1.3.6.1.2.1.31.1.1.1.10.10101 = Counter64: 48648257581 11 | .1.3.6.1.2.1.31.1.1.1.11.10101 = Counter64: 32038868 12 | .1.3.6.1.2.1.31.1.1.1.12.10101 = Counter64: 141915228 13 | .1.3.6.1.2.1.31.1.1.1.13.10101 = Counter64: 44011328 14 | .1.3.6.1.2.1.2.2.1.19.10101 = Counter32: 0 15 | .1.3.6.1.2.1.2.2.1.2.10101 = STRING: "GigabitEthernet0/1" 16 | .1.3.6.1.2.1.31.1.1.1.1.10101 = STRING: "Gi0/1" 17 | .1.3.6.1.2.1.31.1.1.1.10.10101 = Counter64: 48648257581 18 | .1.3.6.1.2.1.31.1.1.1.11.10101 = Counter64: 32038868 19 | .1.3.6.1.2.1.31.1.1.1.12.10101 = Counter64: 141915228 20 | .1.3.6.1.2.1.31.1.1.1.13.10101 = Counter64: 44011328 21 | .1.3.6.1.2.1.31.1.1.1.15.10101 = Gauge32: 1000 22 | .1.3.6.1.2.1.2.2.1.5.10101 = Gauge32: 1000000000 23 | .1.3.6.1.2.1.17.2.4.0 = Counter32: 0 -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ "master" ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ "master" ] 20 | schedule: 21 | - cron: '18 19 * * 0' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} 27 | timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} 28 | permissions: 29 | actions: read 30 | contents: read 31 | security-events: write 32 | 33 | strategy: 34 | fail-fast: false 35 | matrix: 36 | language: [ 'java' ] 37 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ] 38 | # Use only 'java' to analyze code written in Java, Kotlin or both 39 | # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both 40 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support 41 | 42 | steps: 43 | - name: Checkout repository 44 | uses: actions/checkout@v3 45 | 46 | # Initializes the CodeQL tools for scanning. 47 | - name: Initialize CodeQL 48 | uses: github/codeql-action/init@v2 49 | with: 50 | languages: ${{ matrix.language }} 51 | # If you wish to specify custom queries, you can do so here or in a config file. 52 | # By default, queries listed here will override any specified in a config file. 53 | # Prefix the list here with "+" to use these queries and those in the config file. 54 | 55 | # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 56 | # queries: security-extended,security-and-quality 57 | 58 | 59 | # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). 60 | # If this step fails, then you should remove it and run the build manually (see below) 61 | - name: Autobuild 62 | uses: github/codeql-action/autobuild@v2 63 | 64 | # ℹ️ Command-line programs to run using the OS shell. 65 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 66 | 67 | # If the Autobuild fails above, remove it and uncomment the following three lines. 68 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. 69 | 70 | # - run: | 71 | # echo "Run, Build Application using script" 72 | # ./location_of_script_within_repo/buildscript.sh 73 | 74 | - name: Perform CodeQL Analysis 75 | uses: github/codeql-action/analyze@v2 76 | with: 77 | category: "/language:${{matrix.language}}" 78 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Docker 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | 7 | jobs: 8 | docker: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - 12 | name: Set up QEMU 13 | uses: docker/setup-qemu-action@v2 14 | - 15 | name: Set up Docker Buildx 16 | uses: docker/setup-buildx-action@v2 17 | - 18 | name: Login to DockerHub 19 | uses: docker/login-action@v2 20 | with: 21 | username: ${{ secrets.DOCKERHUB_USERNAME }} 22 | password: ${{ secrets.DOCKERHUB_TOKEN }} 23 | - 24 | name: Build and push 25 | uses: docker/build-push-action@v3 26 | with: 27 | push: true 28 | tags: stephanfuhrmannionos/snmpman:latest 29 | -------------------------------------------------------------------------------- /.github/workflows/integration.yml: -------------------------------------------------------------------------------- 1 | name: Integration Test 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | integration: 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | java: [ 11, 17, 21 ] 15 | steps: 16 | 17 | - uses: actions/checkout@v3 18 | 19 | - name: Set up JDK ${{ matrix.java }} 20 | uses: actions/setup-java@v3 21 | with: 22 | distribution: 'adopt' 23 | java-version: ${{ matrix.java }} 24 | 25 | - name: Build with Maven 26 | run: mvn -B package --file pom.xml 27 | 28 | - name: Run snmpman 29 | run: | 30 | ../../snmpman-cli/target/snmpman-cli-*-SNAPSHOT-bin/bin/snmpman.sh -c configuration.yaml & 31 | SNMPMAN_PID=$! 32 | echo "Pid: $SNMPMAN_PID" 33 | sleep 5 34 | working-directory: ./.github/integration 35 | 36 | - name: snmpget a single OID 37 | run: | 38 | ACTUAL=$(snmpget -On -v2c -c public 127.0.0.1:10000 iso.3.6.1.2.1.2.2.1.2.10101) 39 | DESIRED=".1.3.6.1.2.1.2.2.1.2.10101 = STRING: \"GigabitEthernet0/1\"" 40 | if [ "$ACTUAL" != "$DESIRED" ]; then 41 | echo "Actual is: $ACTUAL" 42 | echo "Desired is: $DESIRED" 43 | exit 1 44 | fi 45 | 46 | - name: snmpset a single OID 47 | run: | 48 | snmpset -On -v2c -c public 127.0.0.1:10000 iso.3.6.1.2.1.2.2.1.2.10101 s "GigabitEthernet0/2" 49 | ACTUAL=$(snmpget -On -v2c -c public 127.0.0.1:10000 iso.3.6.1.2.1.2.2.1.2.10101) 50 | DESIRED=".1.3.6.1.2.1.2.2.1.2.10101 = STRING: \"GigabitEthernet0/2\"" 51 | if [ "$ACTUAL" != "$DESIRED" ]; then 52 | echo "Actual is: $ACTUAL" 53 | echo "Desired is: $DESIRED" 54 | exit 1 55 | fi 56 | -------------------------------------------------------------------------------- /.github/workflows/maven-release.yml: -------------------------------------------------------------------------------- 1 | # This release process looks for tags and produces releases. 2 | name: Release 3 | 4 | on: 5 | push: 6 | tags: 7 | - 'snmpman-parent-[0-9]+*' 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | outputs: 13 | version: ${{ steps.version.outputs.version }} 14 | md5sum: ${{ steps.md5sum.outputs.md5sum }} 15 | sha256sum: ${{ steps.sha256sum.outputs.sha256sum }} 16 | env: 17 | DEBIAN_FRONTEND: noninteractive 18 | 19 | steps: 20 | - uses: actions/checkout@v3 21 | 22 | - name: Set up JDK 21 23 | uses: actions/setup-java@v3 24 | with: 25 | distribution: 'adopt' 26 | java-version: 21 27 | 28 | - name: Build with Maven 29 | run: mvn -B package --file pom.xml 30 | 31 | - name: Extract current maven version 32 | run: echo "::set-output name=version::$(mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout)" 33 | id: version 34 | shell: bash 35 | 36 | - name: Calculate MD5 37 | run: echo "::set-output name=md5sum::$(md5sum -b snmpman-cli/target/snmpman-cli-${{ steps.version.outputs.version }}-bin.tar.gz | cut -f1 -d" ")" 38 | id: md5sum 39 | shell: bash 40 | 41 | - name: Calculate SHA256 42 | run: echo "::set-output name=sha256sum::$(sha256sum -b snmpman-cli/target/snmpman-cli-${{ steps.version.outputs.version }}-bin.tar.gz | cut -f1 -d" ")" 43 | id: sha256sum 44 | shell: bash 45 | 46 | - uses: actions/upload-artifact@v3 47 | with: 48 | name: snmpman-cli-${{ steps.version.outputs.version }}-bin.tar.gz 49 | path: snmpman-cli/target/snmpman-cli-${{ steps.version.outputs.version }}-bin.tar.gz 50 | 51 | - uses: actions/create-release@v1 52 | id: create_release 53 | env: 54 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 55 | with: 56 | tag_name: ${{ github.ref }} 57 | release_name: ${{ github.ref }} 58 | draft: true 59 | body: | 60 | # Release ${{ steps.version.outputs.version }} 61 | ## Changes 62 | 63 | * 1 64 | * 2 65 | * 3 66 | 67 | ## Checksums 68 | |Type|Message digest| 69 | |----|--------------| 70 | |MD5|`${{ steps.md5sum.outputs.md5sum }}`| 71 | |SHA256|`${{ steps.sha256sum.outputs.sha256sum }}`| 72 | 73 | - uses: actions/upload-release-asset@v1 74 | env: 75 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 76 | with: 77 | upload_url: ${{ steps.create_release.outputs.upload_url }} 78 | asset_path: snmpman-cli/target/snmpman-cli-${{ steps.version.outputs.version }}-bin.tar.gz 79 | asset_name: snmpman-cli-${{ steps.version.outputs.version }}-bin.tar.gz 80 | asset_content_type: application/tar+gzip 81 | -------------------------------------------------------------------------------- /.github/workflows/maven.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Maven 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven 3 | 4 | name: Java CI with Maven 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | strategy: 16 | matrix: 17 | java: [ 11, 17, 21 ] 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Set up JDK ${{ matrix.java }} 21 | uses: actions/setup-java@v1 22 | with: 23 | java-version: ${{ matrix.java }} 24 | - name: Build with Maven 25 | run: mvn -B package --file pom.xml 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Maven 2 | target/ 3 | 4 | # Eclipse 5 | .project 6 | .settings/ 7 | .classpath 8 | .metadata 9 | 10 | # IntelliJ 11 | .idea/ 12 | *.iml 13 | *.iws 14 | 15 | # MAC 16 | .DS_Store 17 | 18 | # Gradle properties 19 | gradle.properties 20 | *.gpg 21 | build 22 | .gradle 23 | 24 | # Temporary execution files 25 | *.BC.cfg 26 | *.Config.cfg -------------------------------------------------------------------------------- /.suppressions.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | ^pkg:javascript/jquery@.*$ 8 | CVE-2019-11358 9 | 10 | 11 | 14 | ^pkg:javascript/jquery@.*$ 15 | Regex in its jQuery.htmlPrefilter sometimes may introduce XSS 16 | 17 | 18 | 21 | CVE-2019-16775 22 | 23 | 24 | 27 | CVE-2019-16776 28 | 29 | 30 | 33 | CVE-2019-16777 34 | 35 | 36 | 39 | ^pkg:javascript/jquery@.*$ 40 | CVE-2020-11022 41 | 42 | 43 | 46 | ^pkg:javascript/jquery@.*$ 47 | CVE-2020-11023 48 | 49 | 50 | 53 | CVE-2020-15095 54 | 55 | 56 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ########### 2 | # 3 | # Build with: 4 | # podman build -tsnmpman . 5 | # 6 | # Run with: 7 | # podman run -p127.0.0.1:10000:10000/udp snmpman 8 | # 9 | ########### 10 | 11 | # 12 | # maven build 13 | # 14 | FROM docker.io/maven:3-eclipse-temurin-21 as maven-build 15 | COPY . /snmpman 16 | RUN cd /snmpman && mvn clean package 17 | 18 | # 19 | # create JRE 20 | # 21 | FROM docker.io/debian:bookworm as jre-build 22 | ENV JAVA_HOME=/opt/java/openjdk 23 | COPY --from=docker.io/eclipse-temurin:21 /opt/java/openjdk $JAVA_HOME 24 | ENV PATH="${JAVA_HOME}/bin:${PATH}" 25 | 26 | RUN apt-get update && apt-get install --yes binutils 27 | # Create a custom Java runtime 28 | RUN $JAVA_HOME/bin/jlink \ 29 | --add-modules java.base,java.xml,java.desktop,java.management,java.naming \ 30 | --strip-debug \ 31 | --no-man-pages \ 32 | --no-header-files \ 33 | --compress=2 \ 34 | --output /javaruntime 35 | 36 | # 37 | # combine JRE + JAR 38 | # 39 | FROM docker.io/debian:bookworm 40 | ENV JAVA_HOME=/opt/java/openjdk 41 | COPY --from=jre-build /javaruntime $JAVA_HOME 42 | ENV PATH="${JAVA_HOME}/bin:${PATH}" 43 | 44 | #RUN apt-get update && apt-get install --yes snmp tcpdump strace iproute2 net-tools 45 | RUN useradd snmpman 46 | COPY --chown=snmpman:snmpman --from=maven-build /snmpman/snmpman-cli/target/snmpman-cli-*bin /snmpman 47 | COPY --chown=snmpman:snmpman --from=maven-build /snmpman/snmpman-cli/src/main/config/devices/catos.yaml /snmpman/etc/devices/ 48 | COPY --chown=snmpman:snmpman --from=maven-build /snmpman/snmpman-cli/src/main/config/devices/finesse.yaml /snmpman/etc/devices/ 49 | COPY --chown=snmpman:snmpman --from=maven-build /snmpman/snmpman-cli/src/main/config/devices/foundry.yaml /snmpman/etc/devices/ 50 | COPY --chown=snmpman:snmpman --from=maven-build /snmpman/snmpman-cli/src/main/config/devices/iosxr.yaml /snmpman/etc/devices/ 51 | COPY --chown=snmpman:snmpman --from=maven-build /snmpman/snmpman-cli/src/main/config/devices/ios.yaml /snmpman/etc/devices/ 52 | COPY --chown=snmpman:snmpman --from=maven-build /snmpman/snmpman-cli/src/main/config/devices/junos.yaml /snmpman/etc/devices/ 53 | COPY --chown=snmpman:snmpman --from=maven-build /snmpman/snmpman-cli/src/main/config/devices/nxos.yaml /snmpman/etc/devices/ 54 | COPY --chown=snmpman:snmpman --from=maven-build /snmpman/snmpman-cli/src/main/config/walk/example1.walk /snmpman/etc/walk/ 55 | COPY docker/docker-entrypoint.sh /docker-entrypoint.sh 56 | USER snmpman 57 | EXPOSE 10000/udp 58 | ENTRYPOINT ["/docker-entrypoint.sh"] 59 | -------------------------------------------------------------------------------- /MAINTAINERS: -------------------------------------------------------------------------------- 1 | sfuhrm 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![SNMPMAN](http://1and1.github.io/snmpman/images/snmpman.png 2 | "SNMPMAN") 3 | ============ 4 | [![Java CI with Maven](https://github.com/1and1/snmpman/actions/workflows/maven.yml/badge.svg)](https://github.com/1and1/snmpman/actions/workflows/maven.yml) 5 | [![javadoc](https://javadoc.io/badge2/com.oneandone/snmpman/javadoc.svg)](https://javadoc.io/doc/com.oneandone/snmpman) 6 | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.oneandone/snmpman/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.oneandone/snmpman) 7 | ![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/stephanfuhrmannionos/snmpman) 8 | [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) 9 | 10 | **This repo has been set to read-only because there are no maintainers in our organization to maintain the project. Feel free to fork.** 11 | 12 | The `SNMPMAN` is a command-line application that simulates `SNMP`-capable devices and was developed to be usable during unit testing. 13 | It may be used to test traffic monitoring applications that execute `SNMP` queries. Due to the lack of 14 | flexibility in already existing alternatives, it was developed by the **IONOS SE** to improve flexibility. Therefore the `SNMPMAN` 15 | is highly extendable and will be enhanced over time. 16 | 17 | Multiple `SNMP` agents may be started at once and will run in parallel. The agents running in parallel 18 | will return the data queried and save it to a textual walk result file. This file will be created by querying a real device. It is also possible to query several 19 | device types at once. The query configuration may contain policies on 20 | how to dynamically change the query responses. E.g. the response of an 21 | [ifInOctets](http://tools.cisco.com/Support/SNMP/do/BrowseOID.do?objectInput=ifInOctets&translate=Translate&submitValue=SUBMIT") 22 | may be incremented with each query to simulate traffic. Several variable modifiers are already in existence for different 23 | data types. 24 | 25 | Usage 26 | ============ 27 | `SNMPMAN` can either be used as 28 | 29 | * Java library 30 | * Standalone command line program 31 | * Docker image 32 | 33 | Java library usage 34 | ----------- 35 | 36 | You can include the `SNMPMAN` as a Maven dependency from [Maven Central](). 37 | 38 | ```xml 39 | 40 | com.oneandone 41 | snmpman 42 | 2.2.0 43 | 44 | ``` 45 | 46 | In order to start and stop the simulation use this code snippet as an example: 47 | 48 | ```Java 49 | /* 50 | * creates a new instance of the SNMPMAN with the specified configuration file 51 | * and executes all agents 52 | */ 53 | Snmpman snmpman = Snmpman.start(new File("configuration.yaml")); 54 | /* ... do something with the agents */ 55 | 56 | /* stop the SNMPMAN and all started agents */ 57 | snmpman.stop(); 58 | ``` 59 | 60 | Standalone commandline usage 61 | ----------- 62 | For standalone commandline usage, you need to pass a YAML file as a configuration. 63 | 64 | The commandline options are: 65 | 66 | ``` 67 | -c (--configuration) FILE : the path to the configuration YAML 68 | -h (--help) : print the help message (Vorgabe: false) 69 | ``` 70 | 71 | A YAML configuration specifying one SNMP agent, binding to IP 127.0.0.1, UDP port 10000 and 72 | SNMP community 'public' is given here: 73 | 74 | ``` 75 | - name: "example1" 76 | device: "/opt/snmpman/etc/devices/ios.yaml" 77 | walk: "/opt/snmpman/etc/walk/example1.walk" 78 | ip: "127.0.0.1" 79 | port: 10000 80 | community: public 81 | ``` 82 | 83 | The walk can be a SNMP walk extracted with the 'snmpwalk' command line program with the options `-On`. 84 | 85 | Docker usage 86 | ----------- 87 | There's an experimental docker image available that can be used to simulate SNMP agents. 88 | 89 | Available configuration options: 90 | 91 | * `SNMPMAN_CONFIG`: The location of the default configuration can be changed using the env var `SNMPMAN_CONFIG`, it defaults to a 92 | sample config at `/snmpman/etc/configuration.yaml` if you're not specifying thie config file. Instead of providing a 93 | full-blown config, you can also let the docker entrypoint create a config for you with the following 94 | env vars. 95 | * `SNMPMAN_PORT`: The UDP port to bind to, from the perspective of the docker container. Only gets written if `SNMPMAN_CONFIG` is not set. 96 | * `SNMPMAN_COMMUNITY`: The SNMP community to use for authentication. Only gets written if `SNMPMAN_CONFIG` is not set. 97 | * `SNMPMAN_WALK`: The location of the SNMP walk to provide via SNMP in the docker container filesystem (can be bind-mounted as a volume into the container). Only gets written if `SNMPMAN_CONFIG` is not set. 98 | 99 | Sample call mounting a walk inside the container and binding the container towards the standard SNMP port 161: 100 | 101 | ``` 102 | docker run -v ABSOLUTE/PATH/TO/walk.txt:/snmpman/etc/walk/example1.walk -p 161:10000/udp stephanfuhrmannionos/snmpman 103 | ``` 104 | 105 | Installation and building 106 | ============ 107 | ### Prerequisites 108 | * `Java JDK 9+` 109 | * `Apache Maven 3.5.2` 110 | 111 | ### Building a fat Jar 112 | 113 | In order to build the `SNMPMAN` you can use Apache Maven to build a far JAR: 114 | 115 | ``` 116 | mvn clean package 117 | ``` 118 | 119 | After that you find your JAR in `snmpman-cli/target/snmpman-cli-$VERSION-SNAPSHOT-jar-with-dependencies.jar`. 120 | 121 | Execution 122 | ============ 123 | To execute an instance of the `SNMPMAN` you have to start the execution script and specify a value for the `-c` 124 | or `--configuration` option that lists the path to the configuration `YAML` file that will be loaded during execution. 125 | 126 | Configuration 127 | ============ 128 | The `SNMPMAN` configuration can be found in two main `YAML` files ... 129 | * The agent configuration lists all agents which will be started 130 | * The device type configuration defines the modifiers that will be applied to a range of OIDs 131 | 132 | You can find some `YAML` example configuration files within the test resources of this project in [this](https://github.com/1and1/snmpman/tree/master/snmpman-cli/src/test/resources/configuration 133 | ) directory. 134 | 135 | The third component of the configuration are the walk files for the agents as specified in the agent configuration. 136 | 137 | This is a basic overview and more information will be provided [on the project's Wiki pages](https://github.com/1and1/snmpman/wiki). 138 | 139 | Contribution 140 | ------------ 141 | 142 | This section gives some pointers about contributions to the snmpman project. 143 | The project is being developed by the community. Maintainers merge pull-requests, fix critical bugs, etc. 144 | 145 | If you fixed or added something useful to the project, you can send a pull-request. It will be reviewed and accepted, or commented on for rework by [maintainers](https://github.com/1and1/snmpman/blob/master/MAINTAINERS). Pull-requests are declined if a maintainer closes the request. 146 | -------------------------------------------------------------------------------- /docker/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [[ "$SNMPMAN_PORT" = "" ]]; then 5 | export SNMPMAN_PORT="10000" 6 | fi 7 | 8 | if [[ "$SNMPMAN_COMMUNITY" = "" ]]; then 9 | export SNMPMAN_COMMUNITY="public" 10 | fi 11 | 12 | if [[ "$SNMPMAN_WALK" = "" ]]; then 13 | export SNMPMAN_WALK="/snmpman/etc/walk/example1.walk" 14 | fi 15 | 16 | if [[ "$SNMPMAN_CONFIG" = "" ]]; then 17 | export SNMPMAN_CONFIG=/snmpman/etc/configuration.yaml 18 | echo "Creating dummy config in $SNMPMAN_CONFIG UDP port $SNMPMAN_PORT, override with env var SNMPMAN_CONFIG" 19 | cat >> $SNMPMAN_CONFIG << CONFIG 20 | - name: "example1" 21 | device: "/snmpman/etc/devices/ios.yaml" 22 | walk: "$SNMPMAN_WALK" 23 | ip: "0.0.0.0" 24 | port: $SNMPMAN_PORT 25 | community: $SNMPMAN_COMMUNITY 26 | CONFIG 27 | fi 28 | 29 | #exec /snmpman/bin/snmpman.sh --configuration "$SNMPMAN_CONFIG" 30 | exec java -Dlog4j.configurationFile=file:////snmpman/etc/log4j2.xml -jar /snmpman/lib/snmpman-cli-*.jar --configuration "$SNMPMAN_CONFIG" -------------------------------------------------------------------------------- /snmpman-cli/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | 5 | 6 | com.oneandone 7 | snmpman-parent 8 | 2.2.1-SNAPSHOT 9 | 10 | 11 | snmpman-cli 12 | jar 13 | 14 | SNMPMan Command Line 15 | SNMP agent simulator command line interface 16 | 17 | 18 | 19 | ${project.groupId} 20 | snmpman 21 | ${project.version} 22 | 23 | 24 | args4j 25 | args4j 26 | 2.33 27 | 28 | 29 | org.apache.logging.log4j 30 | log4j-slf4j2-impl 31 | ${log4j2.version} 32 | 33 | 34 | 35 | 36 | 37 | 38 | ${basedir}/src/main/assembly 39 | true 40 | 41 | 42 | 43 | 44 | org.apache.maven.plugins 45 | maven-jar-plugin 46 | 3.3.0 47 | 48 | 49 | false 50 | 51 | true 52 | false 53 | com.oneandone.snmpman.Main 54 | true 55 | true 56 | 57 | 58 | 59 | 60 | 61 | org.apache.maven.plugins 62 | maven-assembly-plugin 63 | 3.6.0 64 | 65 | 66 | src/main/assembly/dist.xml 67 | 68 | 69 | 70 | 71 | package 72 | 73 | single 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /snmpman-cli/src/main/assembly/dist.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | bin 5 | 6 | dir 7 | tar.gz 8 | tar.bz2 9 | zip 10 | 11 | false 12 | 13 | 14 | ${project.basedir}/.. 15 | 16 | 17 | README.md 18 | MAINTAINERS 19 | LICENSE.txt 20 | 21 | 22 | 23 | target/classes 24 | bin 25 | 0755 26 | 27 | *.sh 28 | 29 | 30 | 31 | target 32 | lib 33 | 34 | *-javadoc.jar 35 | *-sources.jar 36 | 37 | 38 | *.jar 39 | 40 | 41 | 42 | src/main/resources 43 | etc 44 | 45 | log4j2* 46 | 47 | 48 | 49 | 50 | 51 | /lib 52 | false 53 | runtime 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /snmpman-cli/src/main/assembly/snmpman.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | BASEDIR=$(cd $(dirname "$0")/..; pwd) 4 | JAR=${BASEDIR}/lib/snmpman-cli-${project.version}.jar 5 | if [ "$LOGXML" = "" ]; then 6 | export LOGXML=file:///${BASEDIR}/etc/log4j2.xml 7 | fi 8 | 9 | java -Dlog4j.configurationFile=${LOGXML} -jar ${JAR} "$@" 10 | -------------------------------------------------------------------------------- /snmpman-cli/src/main/config/configuration.yaml: -------------------------------------------------------------------------------- 1 | - name: "example1" 2 | device: "/opt/snmpman/etc/devices/ios.yaml" 3 | walk: "/opt/snmpman/etc/walk/example1.walk" 4 | ip: "127.0.0.1" 5 | port: 10000 -------------------------------------------------------------------------------- /snmpman-cli/src/main/config/devices/catos.yaml: -------------------------------------------------------------------------------- 1 | name: "CatOS" 2 | modifiers: 3 | # cpu.load 4 | - oid: ".1.3.6.1.4.1.9.9.109.1.1.1.1.6" 5 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 6 | properties: 7 | minimum: 0 8 | maximum: 100 9 | minimumStep: 0 10 | maximumStep: 100 11 | # cpu.avg1 12 | - oid: ".1.3.6.1.4.1.9.9.109.1.1.1.1.7" 13 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 14 | properties: 15 | minimum: 0 16 | maximum: 100 17 | minimumStep: 0 18 | maximumStep: 100 19 | # cpu.avg5 20 | - oid: ".1.3.6.1.4.1.9.9.109.1.1.1.1.8" 21 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 22 | properties: 23 | minimum: 0 24 | maximum: 100 25 | minimumStep: 0 26 | maximumStep: 100 27 | # mem.free 28 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.6" 29 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 30 | properties: 31 | minimum: 1547369620 32 | maximum: 1547374620 33 | minimumStep: -30 34 | maximumStep: 30 35 | # mem.largestfree 36 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.7" 37 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 38 | properties: 39 | minimum: 1547369620 40 | maximum: 1547374620 41 | minimumStep: -30 42 | maximumStep: 30 43 | # env.temperature.value 44 | - oid: ".1.3.6.1.4.1.9.9.13.1.3.1.3" 45 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 46 | properties: 47 | minimum: 25 48 | maximum: 60 49 | minimumStep: -10 50 | maximumStep: 10 51 | # ifInOctets 52 | - oid: ".1.3.6.1.2.1.2.2.1.10" 53 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 54 | properties: 55 | minimum: 0 56 | maximum: 4294967295 57 | minimumStep: 0 58 | maximumStep: 3840000 59 | # ifInOctets 60 | - oid: ".1.3.6.1.2.1.2.2.1.11" 61 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 62 | properties: 63 | minimum: 0 64 | maximum: 4294967295 65 | minimumStep: 0 66 | maximumStep: 20000 67 | # ifInNUcastPkts 68 | - oid: ".1.3.6.1.2.1.2.2.1.12" 69 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 70 | properties: 71 | minimum: 0 72 | maximum: 4294967295 73 | minimumStep: 0 74 | maximumStep: 20000 75 | # ifInDiscards 76 | - oid: ".1.3.6.1.2.1.2.2.1.13" 77 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 78 | properties: 79 | minimum: 0 80 | maximum: 4294967295 81 | minimumStep: 0 82 | maximumStep: 20000 83 | # ifInErrors 84 | - oid: ".1.3.6.1.2.1.2.2.1.14" 85 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 86 | properties: 87 | minimum: 0 88 | maximum: 4294967295 89 | minimumStep: 0 90 | maximumStep: 20000 91 | # ifInUnknownProtos 92 | - oid: ".1.3.6.1.2.1.2.2.1.15" 93 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 94 | properties: 95 | minimum: 0 96 | maximum: 4294967295 97 | minimumStep: 0 98 | maximumStep: 20000 99 | # ifOutOctets 100 | - oid: ".1.3.6.1.2.1.2.2.1.16" 101 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 102 | properties: 103 | minimum: 0 104 | maximum: 4294967295 105 | minimumStep: 0 106 | maximumStep: 3840000 107 | # ifOutUcastPkts 108 | - oid: ".1.3.6.1.2.1.2.2.1.17" 109 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 110 | properties: 111 | minimum: 0 112 | maximum: 4294967295 113 | minimumStep: 0 114 | maximumStep: 20000 115 | # ifOutNUcastPkts 116 | - oid: ".1.3.6.1.2.1.2.2.1.18" 117 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 118 | properties: 119 | minimum: 0 120 | maximum: 4294967295 121 | minimumStep: 0 122 | maximumStep: 20000 123 | # ifOutDiscards 124 | - oid: ".1.3.6.1.2.1.2.2.1.19" 125 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 126 | properties: 127 | minimum: 0 128 | maximum: 4294967295 129 | minimumStep: 0 130 | maximumStep: 20000 131 | # ifOutErrors 132 | - oid: ".1.3.6.1.2.1.2.2.1.20" 133 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 134 | properties: 135 | minimum: 0 136 | maximum: 4294967295 137 | minimumStep: 0 138 | maximumStep: 20000 139 | # ifHCInOctets 140 | - oid: ".1.3.6.1.2.1.31.1.1.1.6" 141 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 142 | properties: 143 | minimum: 0 144 | maximum: 1844674407370955161 145 | minimumStep: 0 146 | maximumStep: 3840000 147 | # ifHCInUcastPkts 148 | - oid: ".1.3.6.1.2.1.31.1.1.1.7" 149 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 150 | properties: 151 | minimum: 0 152 | maximum: 1844674407370955161 153 | minimumStep: 0 154 | maximumStep: 20000 155 | # ifHCInMulticastPkts 156 | - oid: ".1.3.6.1.2.1.31.1.1.1.8" 157 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 158 | properties: 159 | minimum: 0 160 | maximum: 1844674407370955161 161 | minimumStep: 0 162 | maximumStep: 20000 163 | # ifHCInBroadcastPkts 164 | - oid: ".1.3.6.1.2.1.31.1.1.1.9" 165 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 166 | properties: 167 | minimum: 0 168 | maximum: 1844674407370955161 169 | minimumStep: 0 170 | maximumStep: 20000 171 | # ifInDiscards 172 | - oid: ".1.3.6.1.2.1.2.2.1.13" 173 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 174 | properties: 175 | minimum: 0 176 | maximum: 4294967295 177 | minimumStep: 0 178 | maximumStep: 20000 179 | # ifInErrors 180 | - oid: ".1.3.6.1.2.1.2.2.1.14" 181 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 182 | properties: 183 | minimum: 0 184 | maximum: 4294967295 185 | minimumStep: 0 186 | maximumStep: 20000 187 | # ifInUnknownProtos 188 | - oid: ".1.3.6.1.2.1.2.2.1.15" 189 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 190 | properties: 191 | minimum: 0 192 | maximum: 4294967295 193 | minimumStep: 0 194 | maximumStep: 20000 195 | # ifHCOutOctets 196 | - oid: ".1.3.6.1.2.1.31.1.1.1.10" 197 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 198 | properties: 199 | minimum: 0 200 | maximum: 1844674407370955161 201 | minimumStep: 0 202 | maximumStep: 3840000 203 | # ifHCOutUcastPkts 204 | - oid: ".1.3.6.1.2.1.31.1.1.1.11" 205 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 206 | properties: 207 | minimum: 0 208 | maximum: 1844674407370955161 209 | minimumStep: 0 210 | maximumStep: 20000 211 | # ifHCOutMulticastPkts 212 | - oid: ".1.3.6.1.2.1.31.1.1.1.12" 213 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 214 | properties: 215 | minimum: 0 216 | maximum: 1844674407370955161 217 | minimumStep: 0 218 | maximumStep: 20000 219 | # ifHCOutBroadcastPkts 220 | - oid: ".1.3.6.1.2.1.31.1.1.1.13" 221 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 222 | properties: 223 | minimum: 0 224 | maximum: 1844674407370955161 225 | minimumStep: 0 226 | maximumStep: 20000 227 | # ifOutDiscards 228 | - oid: ".1.3.6.1.2.1.2.2.1.19" 229 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 230 | properties: 231 | minimum: 0 232 | maximum: 4294967295 233 | minimumStep: 0 234 | maximumStep: 20000 235 | # ifOutErrors 236 | - oid: ".1.3.6.1.2.1.2.2.1.20" 237 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 238 | properties: 239 | minimum: 0 240 | maximum: 4294967295 241 | minimumStep: 0 242 | maximumStep: 20000 -------------------------------------------------------------------------------- /snmpman-cli/src/main/config/devices/foundry.yaml: -------------------------------------------------------------------------------- 1 | name: "Foundry" 2 | modifiers: 3 | # cpu.load / cpu.avg1 / cpu.av5 4 | - oid: ".1.3.6.1.4.1.1991.1.1.2.11.1.1.5" 5 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 6 | properties: 7 | minimum: 0 8 | maximum: 100 9 | minimumStep: 0 10 | maximumStep: 100 11 | # mem.free 12 | - oid: ".1.3.6.1.4.1.1991.1.1.2.1.55" 13 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 14 | properties: 15 | minimum: 1547369620 16 | maximum: 1547374620 17 | minimumStep: -30 18 | maximumStep: 30 19 | # mem.used 20 | - oid: ".1.3.6.1.4.1.1991.1.1.2.1.53" 21 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 22 | properties: 23 | minimum: 1547369620 24 | maximum: 1547374620 25 | minimumStep: -30 26 | maximumStep: 30 27 | # env.temperature.value 28 | - oid: ".1.3.6.1.4.1.1991.1.1.2.13.1.1.4" 29 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 30 | properties: 31 | minimum: 25 32 | maximum: 60 33 | minimumStep: -10 34 | maximumStep: 10 35 | # ifInOctets 36 | - oid: ".1.3.6.1.2.1.2.2.1.10" 37 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 38 | properties: 39 | minimum: 0 40 | maximum: 4294967295 41 | minimumStep: 0 42 | maximumStep: 3840000 43 | # ifInOctets 44 | - oid: ".1.3.6.1.2.1.2.2.1.11" 45 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 46 | properties: 47 | minimum: 0 48 | maximum: 4294967295 49 | minimumStep: 0 50 | maximumStep: 20000 51 | # ifInNUcastPkts 52 | - oid: ".1.3.6.1.2.1.2.2.1.12" 53 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 54 | properties: 55 | minimum: 0 56 | maximum: 4294967295 57 | minimumStep: 0 58 | maximumStep: 20000 59 | # ifInDiscards 60 | - oid: ".1.3.6.1.2.1.2.2.1.13" 61 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 62 | properties: 63 | minimum: 0 64 | maximum: 4294967295 65 | minimumStep: 0 66 | maximumStep: 20000 67 | # ifInErrors 68 | - oid: ".1.3.6.1.2.1.2.2.1.14" 69 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 70 | properties: 71 | minimum: 0 72 | maximum: 4294967295 73 | minimumStep: 0 74 | maximumStep: 20000 75 | # ifInUnknownProtos 76 | - oid: ".1.3.6.1.2.1.2.2.1.15" 77 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 78 | properties: 79 | minimum: 0 80 | maximum: 4294967295 81 | minimumStep: 0 82 | maximumStep: 20000 83 | # ifOutOctets 84 | - oid: ".1.3.6.1.2.1.2.2.1.16" 85 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 86 | properties: 87 | minimum: 0 88 | maximum: 4294967295 89 | minimumStep: 0 90 | maximumStep: 3840000 91 | # ifOutUcastPkts 92 | - oid: ".1.3.6.1.2.1.2.2.1.17" 93 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 94 | properties: 95 | minimum: 0 96 | maximum: 4294967295 97 | minimumStep: 0 98 | maximumStep: 20000 99 | # ifOutNUcastPkts 100 | - oid: ".1.3.6.1.2.1.2.2.1.18" 101 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 102 | properties: 103 | minimum: 0 104 | maximum: 4294967295 105 | minimumStep: 0 106 | maximumStep: 20000 107 | # ifOutDiscards 108 | - oid: ".1.3.6.1.2.1.2.2.1.19" 109 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 110 | properties: 111 | minimum: 0 112 | maximum: 4294967295 113 | minimumStep: 0 114 | maximumStep: 20000 115 | # ifOutErrors 116 | - oid: ".1.3.6.1.2.1.2.2.1.20" 117 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 118 | properties: 119 | minimum: 0 120 | maximum: 4294967295 121 | minimumStep: 0 122 | maximumStep: 20000 123 | # ifHCInOctets 124 | - oid: ".1.3.6.1.2.1.31.1.1.1.6" 125 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 126 | properties: 127 | minimum: 0 128 | maximum: 1844674407370955161 129 | minimumStep: 0 130 | maximumStep: 3840000 131 | # ifHCInUcastPkts 132 | - oid: ".1.3.6.1.2.1.31.1.1.1.7" 133 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 134 | properties: 135 | minimum: 0 136 | maximum: 1844674407370955161 137 | minimumStep: 0 138 | maximumStep: 20000 139 | # ifHCInMulticastPkts 140 | - oid: ".1.3.6.1.2.1.31.1.1.1.8" 141 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 142 | properties: 143 | minimum: 0 144 | maximum: 1844674407370955161 145 | minimumStep: 0 146 | maximumStep: 20000 147 | # ifHCInBroadcastPkts 148 | - oid: ".1.3.6.1.2.1.31.1.1.1.9" 149 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 150 | properties: 151 | minimum: 0 152 | maximum: 1844674407370955161 153 | minimumStep: 0 154 | maximumStep: 20000 155 | # ifInDiscards 156 | - oid: ".1.3.6.1.2.1.2.2.1.13" 157 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 158 | properties: 159 | minimum: 0 160 | maximum: 4294967295 161 | minimumStep: 0 162 | maximumStep: 20000 163 | # ifInErrors 164 | - oid: ".1.3.6.1.2.1.2.2.1.14" 165 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 166 | properties: 167 | minimum: 0 168 | maximum: 4294967295 169 | minimumStep: 0 170 | maximumStep: 20000 171 | # ifInUnknownProtos 172 | - oid: ".1.3.6.1.2.1.2.2.1.15" 173 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 174 | properties: 175 | minimum: 0 176 | maximum: 4294967295 177 | minimumStep: 0 178 | maximumStep: 20000 179 | # ifHCOutOctets 180 | - oid: ".1.3.6.1.2.1.31.1.1.1.10" 181 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 182 | properties: 183 | minimum: 0 184 | maximum: 1844674407370955161 185 | minimumStep: 0 186 | maximumStep: 3840000 187 | # ifHCOutUcastPkts 188 | - oid: ".1.3.6.1.2.1.31.1.1.1.11" 189 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 190 | properties: 191 | minimum: 0 192 | maximum: 1844674407370955161 193 | minimumStep: 0 194 | maximumStep: 20000 195 | # ifHCOutMulticastPkts 196 | - oid: ".1.3.6.1.2.1.31.1.1.1.12" 197 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 198 | properties: 199 | minimum: 0 200 | maximum: 1844674407370955161 201 | minimumStep: 0 202 | maximumStep: 20000 203 | # ifHCOutBroadcastPkts 204 | - oid: ".1.3.6.1.2.1.31.1.1.1.13" 205 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 206 | properties: 207 | minimum: 0 208 | maximum: 1844674407370955161 209 | minimumStep: 0 210 | maximumStep: 20000 211 | # ifOutDiscards 212 | - oid: ".1.3.6.1.2.1.2.2.1.19" 213 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 214 | properties: 215 | minimum: 0 216 | maximum: 4294967295 217 | minimumStep: 0 218 | maximumStep: 20000 219 | # ifOutErrors 220 | - oid: ".1.3.6.1.2.1.2.2.1.20" 221 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 222 | properties: 223 | minimum: 0 224 | maximum: 4294967295 225 | minimumStep: 0 226 | maximumStep: 20000 -------------------------------------------------------------------------------- /snmpman-cli/src/main/config/devices/junos.yaml: -------------------------------------------------------------------------------- 1 | name: "Junos" 2 | modifiers: 3 | # cpu.load 4 | - oid: ".1.3.6.1.4.1.2636.3.1.13.1.8" 5 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 6 | properties: 7 | minimum: 0 8 | maximum: 100 9 | minimumStep: 0 10 | maximumStep: 100 11 | # env.temperature.value 12 | - oid: ".1.3.6.1.4.1.2636.3.1.13.1.7" 13 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 14 | properties: 15 | minimum: 25 16 | maximum: 60 17 | minimumStep: -10 18 | maximumStep: 10 19 | # ifInOctets 20 | - oid: ".1.3.6.1.2.1.2.2.1.10" 21 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 22 | properties: 23 | minimum: 0 24 | maximum: 4294967295 25 | minimumStep: 0 26 | maximumStep: 3840000 27 | # ifInOctets 28 | - oid: ".1.3.6.1.2.1.2.2.1.11" 29 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 30 | properties: 31 | minimum: 0 32 | maximum: 4294967295 33 | minimumStep: 0 34 | maximumStep: 20000 35 | # ifInNUcastPkts 36 | - oid: ".1.3.6.1.2.1.2.2.1.12" 37 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 38 | properties: 39 | minimum: 0 40 | maximum: 4294967295 41 | minimumStep: 0 42 | maximumStep: 20000 43 | # ifInDiscards 44 | - oid: ".1.3.6.1.2.1.2.2.1.13" 45 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 46 | properties: 47 | minimum: 0 48 | maximum: 4294967295 49 | minimumStep: 0 50 | maximumStep: 20000 51 | # ifInErrors 52 | - oid: ".1.3.6.1.2.1.2.2.1.14" 53 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 54 | properties: 55 | minimum: 0 56 | maximum: 4294967295 57 | minimumStep: 0 58 | maximumStep: 20000 59 | # ifInUnknownProtos 60 | - oid: ".1.3.6.1.2.1.2.2.1.15" 61 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 62 | properties: 63 | minimum: 0 64 | maximum: 4294967295 65 | minimumStep: 0 66 | maximumStep: 20000 67 | # ifOutOctets 68 | - oid: ".1.3.6.1.2.1.2.2.1.16" 69 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 70 | properties: 71 | minimum: 0 72 | maximum: 4294967295 73 | minimumStep: 0 74 | maximumStep: 3840000 75 | # ifOutUcastPkts 76 | - oid: ".1.3.6.1.2.1.2.2.1.17" 77 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 78 | properties: 79 | minimum: 0 80 | maximum: 4294967295 81 | minimumStep: 0 82 | maximumStep: 20000 83 | # ifOutNUcastPkts 84 | - oid: ".1.3.6.1.2.1.2.2.1.18" 85 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 86 | properties: 87 | minimum: 0 88 | maximum: 4294967295 89 | minimumStep: 0 90 | maximumStep: 20000 91 | # ifOutDiscards 92 | - oid: ".1.3.6.1.2.1.2.2.1.19" 93 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 94 | properties: 95 | minimum: 0 96 | maximum: 4294967295 97 | minimumStep: 0 98 | maximumStep: 20000 99 | # ifOutErrors 100 | - oid: ".1.3.6.1.2.1.2.2.1.20" 101 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 102 | properties: 103 | minimum: 0 104 | maximum: 4294967295 105 | minimumStep: 0 106 | maximumStep: 20000 107 | # ifHCInOctets 108 | - oid: ".1.3.6.1.2.1.31.1.1.1.6" 109 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 110 | properties: 111 | minimum: 0 112 | maximum: 1844674407370955161 113 | minimumStep: 0 114 | maximumStep: 3840000 115 | # ifHCInUcastPkts 116 | - oid: ".1.3.6.1.2.1.31.1.1.1.7" 117 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 118 | properties: 119 | minimum: 0 120 | maximum: 1844674407370955161 121 | minimumStep: 0 122 | maximumStep: 20000 123 | # ifHCInMulticastPkts 124 | - oid: ".1.3.6.1.2.1.31.1.1.1.8" 125 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 126 | properties: 127 | minimum: 0 128 | maximum: 1844674407370955161 129 | minimumStep: 0 130 | maximumStep: 20000 131 | # ifHCInBroadcastPkts 132 | - oid: ".1.3.6.1.2.1.31.1.1.1.9" 133 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 134 | properties: 135 | minimum: 0 136 | maximum: 1844674407370955161 137 | minimumStep: 0 138 | maximumStep: 20000 139 | # ifInDiscards 140 | - oid: ".1.3.6.1.2.1.2.2.1.13" 141 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 142 | properties: 143 | minimum: 0 144 | maximum: 4294967295 145 | minimumStep: 0 146 | maximumStep: 20000 147 | # ifInErrors 148 | - oid: ".1.3.6.1.2.1.2.2.1.14" 149 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 150 | properties: 151 | minimum: 0 152 | maximum: 4294967295 153 | minimumStep: 0 154 | maximumStep: 20000 155 | # ifInUnknownProtos 156 | - oid: ".1.3.6.1.2.1.2.2.1.15" 157 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 158 | properties: 159 | minimum: 0 160 | maximum: 4294967295 161 | minimumStep: 0 162 | maximumStep: 20000 163 | # ifHCOutOctets 164 | - oid: ".1.3.6.1.2.1.31.1.1.1.10" 165 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 166 | properties: 167 | minimum: 0 168 | maximum: 1844674407370955161 169 | minimumStep: 0 170 | maximumStep: 3840000 171 | # ifHCOutUcastPkts 172 | - oid: ".1.3.6.1.2.1.31.1.1.1.11" 173 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 174 | properties: 175 | minimum: 0 176 | maximum: 1844674407370955161 177 | minimumStep: 0 178 | maximumStep: 20000 179 | # ifHCOutMulticastPkts 180 | - oid: ".1.3.6.1.2.1.31.1.1.1.12" 181 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 182 | properties: 183 | minimum: 0 184 | maximum: 1844674407370955161 185 | minimumStep: 0 186 | maximumStep: 20000 187 | # ifHCOutBroadcastPkts 188 | - oid: ".1.3.6.1.2.1.31.1.1.1.13" 189 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 190 | properties: 191 | minimum: 0 192 | maximum: 1844674407370955161 193 | minimumStep: 0 194 | maximumStep: 20000 195 | # ifOutDiscards 196 | - oid: ".1.3.6.1.2.1.2.2.1.19" 197 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 198 | properties: 199 | minimum: 0 200 | maximum: 4294967295 201 | minimumStep: 0 202 | maximumStep: 20000 203 | # ifOutErrors 204 | - oid: ".1.3.6.1.2.1.2.2.1.20" 205 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 206 | properties: 207 | minimum: 0 208 | maximum: 4294967295 209 | minimumStep: 0 210 | maximumStep: 20000 -------------------------------------------------------------------------------- /snmpman-cli/src/main/config/walk/example1.walk: -------------------------------------------------------------------------------- 1 | .1.3.6.1.2.1.1.5.0 = STRING: "device" 2 | .1.3.6.1.2.1.2.2.1.7.10101 = INTEGER: 1 3 | .1.3.6.1.2.1.31.1.1.1.6.10101 = Counter64: 389172331 4 | .1.3.6.1.2.1.31.1.1.1.7.10101 = Counter64: 5470259 5 | .1.3.6.1.2.1.31.1.1.1.8.10101 = Counter64: 19 6 | .1.3.6.1.2.1.31.1.1.1.9.10101 = Counter64: 743 7 | .1.3.6.1.2.1.2.2.1.13.10101 = Counter32: 0 8 | .1.3.6.1.2.1.2.2.1.14.10101 = Counter32: 0 9 | .1.3.6.1.2.1.2.2.1.15.10101 = Counter32: 0 10 | .1.3.6.1.2.1.31.1.1.1.10.10101 = Counter64: 48648257581 11 | .1.3.6.1.2.1.31.1.1.1.11.10101 = Counter64: 32038868 12 | .1.3.6.1.2.1.31.1.1.1.12.10101 = Counter64: 141915228 13 | .1.3.6.1.2.1.31.1.1.1.13.10101 = Counter64: 44011328 14 | .1.3.6.1.2.1.2.2.1.19.10101 = Counter32: 0 15 | .1.3.6.1.2.1.2.2.1.2.10101 = STRING: "GigabitEthernet0/1" 16 | .1.3.6.1.2.1.31.1.1.1.1.10101 = STRING: "Gi0/1" 17 | .1.3.6.1.2.1.31.1.1.1.10.10101 = Counter64: 48648257581 18 | .1.3.6.1.2.1.31.1.1.1.11.10101 = Counter64: 32038868 19 | .1.3.6.1.2.1.31.1.1.1.12.10101 = Counter64: 141915228 20 | .1.3.6.1.2.1.31.1.1.1.13.10101 = Counter64: 44011328 21 | .1.3.6.1.2.1.31.1.1.1.15.10101 = Gauge32: 1000 22 | .1.3.6.1.2.1.2.2.1.5.10101 = Gauge32: 1000000000 23 | .1.3.6.1.2.1.17.2.4.0 = Counter32: 0 -------------------------------------------------------------------------------- /snmpman-cli/src/main/java/com/oneandone/snmpman/CommandLineOptions.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman; 2 | 3 | import lombok.Getter; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.kohsuke.args4j.Option; 6 | 7 | import java.io.File; 8 | 9 | /** The command-line options for the {@link Main} application. */ 10 | @Slf4j 11 | public final class CommandLineOptions { 12 | 13 | /** The {@code Main} configuration. */ 14 | @Option(name = "-c", aliases = "--configuration", usage = "the path to the configuration YAML", required = true) 15 | @Getter private File configurationFile; 16 | 17 | /** Flag that defines that a help message should be displayed when {@code true}. */ 18 | @Option(name = "-h", aliases = "--help", usage = "print the help message", help = true) 19 | @Getter private boolean showHelp = false; 20 | } 21 | -------------------------------------------------------------------------------- /snmpman-cli/src/main/java/com/oneandone/snmpman/Main.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman; 2 | 3 | import com.oneandone.snmpman.exception.InitializationException; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.kohsuke.args4j.CmdLineException; 6 | import org.kohsuke.args4j.CmdLineParser; 7 | 8 | /** 9 | * This is the main-class for this application. 10 | *
11 | * A mandatory argument for execution of the {@link #main(String...)} method is the path to the configuration file. 12 | * See {@link com.oneandone.snmpman.CommandLineOptions} for information on available command line options. 13 | *
14 | * Each configuration list item represents an instance of the {@link com.oneandone.snmpman.configuration.AgentConfiguration}. 15 | * The constructor {@link com.oneandone.snmpman.configuration.AgentConfiguration#AgentConfiguration(String, java.io.File, java.io.File, String, int, String)} 16 | * lists all available properties, which may or may not be required. 17 | *
18 | * An entry may look like the following: 19 | *
20 |  * {@code
21 |  *     - name: "example1"
22 |  *       device: "src/test/resources/configuration/cisco.yaml"
23 |  *       walk: "src/test/resources/configuration/example.txt"
24 |  *       ip: "127.0.0.1"
25 |  *       port: 10000
26 |  * }
27 |  * 
28 | * You can find more example within the test resources of this project. 29 | *
30 | * The configuration {@code YAML} file defines a list of all agents that should be simulated by the {@code Main}. 31 | */ 32 | @Slf4j 33 | public final class Main { 34 | 35 | /** 36 | * The application entry-point. 37 | *
38 | * All available command-line arguments are documented in the {@link com.oneandone.snmpman.CommandLineOptions} class. 39 | *
40 | * If illegal command-line options were specified for execution, a usage help message will be printed out 41 | * on the {@link System#err} stream and the application will terminate. Otherwise the configuration will 42 | * be read and used for execution. 43 | * 44 | * @param args the command-line arguments 45 | */ 46 | public static void main(final String... args) { 47 | final CommandLineOptions commandLineOptions = new CommandLineOptions(); 48 | final CmdLineParser cmdLineParser = new CmdLineParser(commandLineOptions); 49 | try { 50 | cmdLineParser.parseArgument(args); 51 | 52 | if (commandLineOptions.isShowHelp()) { 53 | cmdLineParser.printUsage(System.out); 54 | } else { 55 | Snmpman.start(commandLineOptions.getConfigurationFile()); 56 | } 57 | } catch (final InitializationException | CmdLineException e) { 58 | log.error("could not parse or process command-line arguments", e); 59 | if (e.getMessage() != null && !e.getMessage().isEmpty()) { 60 | System.err.println("could not start application because of following error: "); 61 | System.err.println(e.getMessage()); 62 | } else { 63 | System.err.println("failed to start application, check the logs for more information"); 64 | } 65 | cmdLineParser.printUsage(System.err); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /snmpman-cli/src/main/java/com/oneandone/snmpman/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * The {@code Main} is a command-line application that simulates {@code SNMP}-capable devices. 3 | *
4 | * It also can be used within Unit tests which require the usage of SNMP devices. You can start and stop all agents 5 | * with pre- and post unit-test execution methods, which are available in probably every Unit-Test framework. 6 | *
7 | * Check the documentation of {@link com.oneandone.snmpman.Main} to get more information on the execution. 8 | */ 9 | package com.oneandone.snmpman; -------------------------------------------------------------------------------- /snmpman-cli/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /snmpman-cli/src/test/java/com/oneandone/snmpman/CommandLineOptionsTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman; 2 | 3 | import org.kohsuke.args4j.CmdLineParser; 4 | import org.testng.annotations.Test; 5 | 6 | import static org.testng.Assert.*; 7 | 8 | public class CommandLineOptionsTest { 9 | 10 | @Test 11 | public void testGetAgents() throws Exception { 12 | final CommandLineOptions commandLineOptions = new CommandLineOptions(); 13 | final CmdLineParser cmdLineParser = new CmdLineParser(commandLineOptions); 14 | cmdLineParser.parseArgument("-c", "src/test/resources/configuration/configuration.yaml"); 15 | 16 | assertEquals(commandLineOptions.getConfigurationFile().getName(), "configuration.yaml"); 17 | assertTrue(commandLineOptions.getConfigurationFile().exists()); 18 | assertTrue(commandLineOptions.getConfigurationFile().isFile()); 19 | } 20 | 21 | @Test 22 | public void testHelp() throws Exception { 23 | final CommandLineOptions commandLineOptions = new CommandLineOptions(); 24 | final CmdLineParser cmdLineParser = new CmdLineParser(commandLineOptions); 25 | cmdLineParser.parseArgument("-h"); 26 | 27 | assertTrue(commandLineOptions.isShowHelp()); 28 | } 29 | } -------------------------------------------------------------------------------- /snmpman-cli/src/test/resources/configuration/cisco.yaml: -------------------------------------------------------------------------------- 1 | name: "Cisco" 2 | modifiers: 3 | - oid: ".1.3.6.1.4.1.9.2.1.56" 4 | class: "com.oneandone.snmpman.configuration.modifier.Integer32Modifier" 5 | properties: 6 | minimum: 0 7 | maximum: 100 8 | minimumStep: 0 9 | maximumStep: 100 10 | - oid: ".1.3.6.1.4.1.9.2.1.57" 11 | class: "com.oneandone.snmpman.configuration.modifier.Integer32Modifier" 12 | properties: 13 | minimum: 0 14 | maximum: 100 15 | minimumStep: 0 16 | maximumStep: 100 17 | - oid: ".1.3.6.1.4.1.9.2.1.58" 18 | class: "com.oneandone.snmpman.configuration.modifier.Integer32Modifier" 19 | properties: 20 | minimum: 0 21 | maximum: 100 22 | minimumStep: 0 23 | maximumStep: 100 24 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.6" 25 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 26 | properties: 27 | minimum: 1547369620 28 | maximum: 1547374620 29 | minimumStep: -30 30 | maximumStep: 30 31 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.7" 32 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 33 | properties: 34 | minimum: 1547369620 35 | maximum: 1547374620 36 | minimumStep: -30 37 | maximumStep: 30 38 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.5" 39 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 40 | properties: 41 | minimum: 0 42 | maximum: 5000 43 | minimumStep: -30 44 | maximumStep: 30 45 | - oid: ".1.3.6.1.4.1.9.9.13.1.3.1.3" 46 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 47 | properties: 48 | minimum: 25 49 | maximum: 60 50 | minimumStep: -10 51 | maximumStep: 10 52 | - oid: ".1.3.6.1.2.1.2.2.1.10" 53 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 54 | properties: 55 | minimum: 0 56 | maximum: 4294967295 57 | minimumStep: 0 58 | maximumStep: 3840000 59 | - oid: ".1.3.6.1.2.1.2.2.1.11" 60 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 61 | properties: 62 | minimum: 0 63 | maximum: 4294967295 64 | minimumStep: 0 65 | maximumStep: 20000 66 | - oid: ".1.3.6.1.2.1.2.2.1.12" 67 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 68 | properties: 69 | minimum: 0 70 | maximum: 4294967295 71 | minimumStep: 0 72 | maximumStep: 20000 73 | - oid: ".1.3.6.1.2.1.2.2.1.13" 74 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 75 | properties: 76 | minimum: 0 77 | maximum: 4294967295 78 | minimumStep: 0 79 | maximumStep: 20000 80 | - oid: ".1.3.6.1.2.1.2.2.1.14" 81 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 82 | properties: 83 | minimum: 0 84 | maximum: 4294967295 85 | minimumStep: 0 86 | maximumStep: 20000 87 | - oid: ".1.3.6.1.2.1.2.2.1.15" 88 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 89 | properties: 90 | minimum: 0 91 | maximum: 4294967295 92 | minimumStep: 0 93 | maximumStep: 20000 94 | - oid: ".1.3.6.1.2.1.2.2.1.16" 95 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 96 | properties: 97 | minimum: 0 98 | maximum: 4294967295 99 | minimumStep: 0 100 | maximumStep: 3840000 101 | - oid: ".1.3.6.1.2.1.2.2.1.17" 102 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 103 | properties: 104 | minimum: 0 105 | maximum: 4294967295 106 | minimumStep: 0 107 | maximumStep: 20000 108 | - oid: ".1.3.6.1.2.1.2.2.1.18" 109 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 110 | properties: 111 | minimum: 0 112 | maximum: 4294967295 113 | minimumStep: 0 114 | maximumStep: 20000 115 | - oid: ".1.3.6.1.2.1.2.2.1.19" 116 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 117 | properties: 118 | minimum: 0 119 | maximum: 4294967295 120 | minimumStep: 0 121 | maximumStep: 20000 122 | - oid: ".1.3.6.1.2.1.2.2.1.20" 123 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 124 | properties: 125 | minimum: 0 126 | maximum: 4294967295 127 | minimumStep: 0 128 | maximumStep: 20000 129 | - oid: ".1.3.6.1.2.1.31.1.1.1.6" 130 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 131 | properties: 132 | minimum: 0 133 | maximum: 1844674407370955161 134 | minimumStep: 0 135 | maximumStep: 3840000 136 | - oid: ".1.3.6.1.2.1.31.1.1.1.7" 137 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 138 | properties: 139 | minimum: 0 140 | maximum: 1844674407370955161 141 | minimumStep: 0 142 | maximumStep: 20000 143 | - oid: ".1.3.6.1.2.1.31.1.1.1.8" 144 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 145 | properties: 146 | minimum: 0 147 | maximum: 1844674407370955161 148 | minimumStep: 0 149 | maximumStep: 20000 150 | - oid: ".1.3.6.1.2.1.31.1.1.1.9" 151 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 152 | properties: 153 | minimum: 0 154 | maximum: 1844674407370955161 155 | minimumStep: 0 156 | maximumStep: 20000 157 | - oid: ".1.3.6.1.2.1.2.2.1.13" 158 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 159 | properties: 160 | minimum: 0 161 | maximum: 4294967295 162 | minimumStep: 0 163 | maximumStep: 20000 164 | - oid: ".1.3.6.1.2.1.2.2.1.14" 165 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 166 | properties: 167 | minimum: 0 168 | maximum: 4294967295 169 | minimumStep: 0 170 | maximumStep: 20000 171 | - oid: ".1.3.6.1.2.1.2.2.1.15" 172 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 173 | properties: 174 | minimum: 0 175 | maximum: 4294967295 176 | minimumStep: 0 177 | maximumStep: 20000 178 | - oid: ".1.3.6.1.2.1.31.1.1.1.10" 179 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 180 | properties: 181 | minimum: 0 182 | maximum: 1844674407370955161 183 | minimumStep: 0 184 | maximumStep: 3840000 185 | - oid: ".1.3.6.1.2.1.31.1.1.1.11" 186 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 187 | properties: 188 | minimum: 0 189 | maximum: 1844674407370955161 190 | minimumStep: 0 191 | maximumStep: 20000 192 | - oid: ".1.3.6.1.2.1.31.1.1.1.12" 193 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 194 | properties: 195 | minimum: 0 196 | maximum: 1844674407370955161 197 | minimumStep: 0 198 | maximumStep: 20000 199 | - oid: ".1.3.6.1.2.1.31.1.1.1.13" 200 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 201 | properties: 202 | minimum: 0 203 | maximum: 1844674407370955161 204 | minimumStep: 0 205 | maximumStep: 20000 206 | - oid: ".1.3.6.1.2.1.2.2.1.19" 207 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 208 | properties: 209 | minimum: 0 210 | maximum: 4294967295 211 | minimumStep: 0 212 | maximumStep: 20000 213 | - oid: ".1.3.6.1.2.1.2.2.1.20" 214 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 215 | properties: 216 | minimum: 0 217 | maximum: 4294967295 218 | minimumStep: 0 219 | maximumStep: 20000 220 | - oid: ".1.3.6.1.2.1.17.2.4.0" 221 | class: "com.oneandone.snmpman.configuration.modifier.CommunityIndexCounter32Modifier" 222 | properties: 223 | 42: 150 224 | 9: 120 225 | vlans: 226 | - 42 227 | - 9 -------------------------------------------------------------------------------- /snmpman-cli/src/test/resources/configuration/configuration.yaml: -------------------------------------------------------------------------------- 1 | - name: "example1" 2 | device: "src/test/resources/configuration/cisco.yaml" 3 | walk: "src/test/resources/configuration/example.txt" 4 | ip: "127.0.0.1" 5 | port: 10000 6 | - name: "example2" 7 | device: "src/test/resources/configuration/cisco.yaml" 8 | walk: "src/test/resources/configuration/example.txt" 9 | ip: "127.0.0.1" 10 | port: 10001 11 | - name: "example3" 12 | device: "src/test/resources/configuration/cisco.yaml" 13 | walk: "src/test/resources/configuration/example.txt" 14 | ip: "127.0.0.1" 15 | port: 10002 16 | - name: "example4" 17 | device: "src/test/resources/configuration/cisco.yaml" 18 | walk: "src/test/resources/configuration/example.txt" 19 | ip: "127.0.0.1" 20 | port: 10003 21 | - name: "example5" 22 | device: "src/test/resources/configuration/cisco.yaml" 23 | walk: "src/test/resources/configuration/example.txt" 24 | ip: "127.0.0.1" 25 | port: 10004 26 | - name: "example6" 27 | device: "src/test/resources/configuration/cisco.yaml" 28 | walk: "src/test/resources/configuration/example.txt" 29 | ip: "127.0.0.1" 30 | port: 10005 31 | - name: "example7" 32 | device: "src/test/resources/configuration/cisco.yaml" 33 | walk: "src/test/resources/configuration/example.txt" 34 | ip: "127.0.0.1" 35 | port: 10006 36 | - name: "example8" 37 | device: "src/test/resources/configuration/cisco.yaml" 38 | walk: "src/test/resources/configuration/example.txt" 39 | ip: "127.0.0.1" 40 | port: 10007 41 | - name: "example9" 42 | device: "src/test/resources/configuration/cisco.yaml" 43 | walk: "src/test/resources/configuration/example.txt" 44 | ip: "127.0.0.1" 45 | port: 10008 46 | - name: "example10" 47 | device: "src/test/resources/configuration/cisco.yaml" 48 | walk: "src/test/resources/configuration/example.txt" 49 | ip: "127.0.0.1" 50 | port: 10009 51 | - name: "example11" 52 | device: "src/test/resources/configuration/empty.yaml" 53 | walk: "src/test/resources/configuration/differentStartingOID.txt" 54 | ip: "127.0.0.1" 55 | port: 10010 -------------------------------------------------------------------------------- /snmpman-cli/src/test/resources/configuration/differentStartingOID.txt: -------------------------------------------------------------------------------- 1 | .1.0.8802.1.1.2.1.4.1.1.7.0.436301824.53 = STRING: "Eth1/24" 2 | .1.0.8802.1.1.2.1.4.1.1.7.0.939532288.52 = STRING: "512" 3 | .1.0.8802.1.1.2.1.4.1.1.8.0.436301824.53 = STRING: "vpc-peer-link" 4 | .1.0.8802.1.1.2.1.4.1.1.8.0.939532288.52 = STRING: "xe-0/1/2.0" 5 | .1.0.8802.1.1.2.1.4.1.1.9.0.436301824.53 = STRING: "some.devie.location.beach" 6 | .1.0.8802.1.1.2.1.4.1.1.9.0.939532288.52 = STRING: "other.device.location.mountains" 7 | .1.0.8802.1.1.2.1.4.1.1.10.0.436301824.53 = STRING: "Cisco NX-OS(tm) n1337" 8 | .1.0.8802.1.1.2.1.4.1.1.10.0.939532288.52 = STRING: "Juniper Networks, Inc. ex0815" 9 | .1.3.6.1.2.1.31.1.1.1.1.83886080 = STRING: "mgmt0" 10 | .1.3.6.1.2.1.31.1.1.1.1.151060481 = STRING: "Vlan1" 11 | .1.3.6.1.2.1.31.1.1.1.1.369098752 = STRING: "port-channel1" 12 | .1.3.6.1.2.1.31.1.1.1.1.385875968 = STRING: "Null0" 13 | .1.3.6.1.2.1.31.1.1.1.1.436211712 = STRING: "Ethernet1/2" 14 | .1.3.6.1.2.1.31.1.1.1.1.436215808 = STRING: "Ethernet1/3" 15 | .1.3.6.1.2.1.31.1.1.1.1.436219904 = STRING: "Ethernet1/4" 16 | .1.3.6.1.2.1.31.1.1.1.1.436224000 = STRING: "Ethernet1/5" 17 | .1.3.6.1.2.1.31.1.1.1.1.436228096 = STRING: "Ethernet1/6" 18 | .1.3.6.1.2.1.31.1.1.1.1.436232192 = STRING: "Ethernet1/7" 19 | .1.3.6.1.2.1.31.1.1.1.1.436236288 = STRING: "Ethernet1/8" 20 | .1.3.6.1.2.1.31.1.1.1.1.436240384 = STRING: "Ethernet1/9" 21 | .1.3.6.1.2.1.31.1.1.1.1.436244480 = STRING: "Ethernet1/10" 22 | .1.3.6.1.2.1.31.1.1.1.1.436248576 = STRING: "Ethernet1/11" 23 | .1.3.6.1.2.1.31.1.1.1.1.436252672 = STRING: "Ethernet1/12" 24 | .1.3.6.1.2.1.31.1.1.1.1.436256768 = STRING: "Ethernet1/13" 25 | .1.3.6.1.2.1.31.1.1.1.1.436260864 = STRING: "Ethernet1/14" 26 | .1.3.6.1.2.1.31.1.1.1.1.436264960 = STRING: "Ethernet1/15" 27 | .1.3.6.1.2.1.31.1.1.1.1.436269056 = STRING: "Ethernet1/16" 28 | .1.3.6.1.2.1.31.1.1.1.1.436273152 = STRING: "Ethernet1/17" 29 | .1.3.6.1.2.1.31.1.1.1.1.436277248 = STRING: "Ethernet1/18" 30 | .1.3.6.1.2.1.31.1.1.1.1.436281344 = STRING: "Ethernet1/19" 31 | .1.3.6.1.2.1.31.1.1.1.1.436285440 = STRING: "Ethernet1/20" 32 | .1.3.6.1.2.1.31.1.1.1.1.436289536 = STRING: "Ethernet1/21" 33 | .1.3.6.1.2.1.31.1.1.1.1.436293632 = STRING: "Ethernet1/22" 34 | .1.3.6.1.2.1.31.1.1.1.1.436297728 = STRING: "Ethernet1/23" 35 | .1.3.6.1.2.1.31.1.1.1.1.436301824 = STRING: "Ethernet1/24" 36 | .1.3.6.1.2.1.31.1.1.1.1.939528192 = STRING: "Ethernet1/1/2" 37 | .1.3.6.1.2.1.31.1.1.1.1.939532288 = STRING: "Ethernet1/1/3" 38 | .1.3.6.1.2.1.31.1.1.1.1.939536384 = STRING: "Ethernet1/1/4" 39 | -------------------------------------------------------------------------------- /snmpman-cli/src/test/resources/configuration/empty.yaml: -------------------------------------------------------------------------------- 1 | name: "Empty" -------------------------------------------------------------------------------- /snmpman-cli/src/test/resources/configuration/example.txt: -------------------------------------------------------------------------------- 1 | .1.3.6.1.2.1.1.5.0 = STRING: "device" 2 | .1.3.6.1.2.1.2.2.1.7.10101 = INTEGER: 1 3 | .1.3.6.1.2.1.31.1.1.1.6.10101 = Counter64: 389172331 4 | .1.3.6.1.2.1.31.1.1.1.7.10101 = Counter64: 5470259 5 | .1.3.6.1.2.1.31.1.1.1.8.10101 = Counter64: 19 6 | .1.3.6.1.2.1.31.1.1.1.9.10101 = Counter64: 743 7 | .1.3.6.1.2.1.2.2.1.13.10101 = Counter32: 0 8 | .1.3.6.1.2.1.2.2.1.14.10101 = Counter32: 0 9 | .1.3.6.1.2.1.2.2.1.15.10101 = Counter32: 0 10 | .1.3.6.1.2.1.31.1.1.1.10.10101 = Counter64: 48648257581 11 | .1.3.6.1.2.1.31.1.1.1.11.10101 = Counter64: 32038868 12 | .1.3.6.1.2.1.31.1.1.1.12.10101 = Counter64: 141915228 13 | .1.3.6.1.2.1.31.1.1.1.13.10101 = Counter64: 44011328 14 | .1.3.6.1.2.1.2.2.1.19.10101 = Counter32: 0 15 | .1.3.6.1.2.1.2.2.1.2.10101 = STRING: "GigabitEthernet0/1" 16 | .1.3.6.1.2.1.31.1.1.1.1.10101 = STRING: "Gi0/1" 17 | .1.3.6.1.2.1.31.1.1.1.15.10101 = Gauge32: 1000 18 | .1.3.6.1.2.1.2.2.1.5.10101 = Gauge32: 1000000000 19 | .1.3.6.1.2.1.17.2.4.0 = Counter32: 0 -------------------------------------------------------------------------------- /snmpman-cli/src/test/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /snmpman/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | 5 | 6 | com.oneandone 7 | snmpman-parent 8 | 2.2.1-SNAPSHOT 9 | 10 | 11 | snmpman 12 | jar 13 | 14 | SNMPMan 15 | SNMP agent simulator library 16 | 17 | 18 | 19 | org.snmp4j 20 | snmp4j 21 | 3.7.8 22 | 23 | 24 | org.snmp4j 25 | snmp4j-agent 26 | 3.0.3 27 | 28 | 29 | com.fasterxml.jackson.jaxrs 30 | jackson-jaxrs-json-provider 31 | ${jackson.version} 32 | 33 | 34 | com.fasterxml.jackson.dataformat 35 | jackson-dataformat-yaml 36 | ${jackson.version} 37 | 38 | 39 | com.fasterxml.jackson.core 40 | jackson-core 41 | ${jackson.version} 42 | 43 | 44 | org.apache.logging.log4j 45 | log4j-slf4j2-impl 46 | ${log4j2.version} 47 | test 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /snmpman/src/main/config/configuration.yaml: -------------------------------------------------------------------------------- 1 | - name: "example1" 2 | device: "/opt/snmpman/etc/devices/ios.yaml" 3 | walk: "/opt/snmpman/etc/walk/example1.walk" 4 | ip: "127.0.0.1" 5 | port: 10000 -------------------------------------------------------------------------------- /snmpman/src/main/config/devices/catos.yaml: -------------------------------------------------------------------------------- 1 | name: "CatOS" 2 | modifiers: 3 | # cpu.load 4 | - oid: ".1.3.6.1.4.1.9.9.109.1.1.1.1.6" 5 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 6 | properties: 7 | minimum: 0 8 | maximum: 100 9 | minimumStep: 0 10 | maximumStep: 100 11 | # cpu.avg1 12 | - oid: ".1.3.6.1.4.1.9.9.109.1.1.1.1.7" 13 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 14 | properties: 15 | minimum: 0 16 | maximum: 100 17 | minimumStep: 0 18 | maximumStep: 100 19 | # cpu.avg5 20 | - oid: ".1.3.6.1.4.1.9.9.109.1.1.1.1.8" 21 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 22 | properties: 23 | minimum: 0 24 | maximum: 100 25 | minimumStep: 0 26 | maximumStep: 100 27 | # mem.free 28 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.6" 29 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 30 | properties: 31 | minimum: 1547369620 32 | maximum: 1547374620 33 | minimumStep: -30 34 | maximumStep: 30 35 | # mem.largestfree 36 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.7" 37 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 38 | properties: 39 | minimum: 1547369620 40 | maximum: 1547374620 41 | minimumStep: -30 42 | maximumStep: 30 43 | # env.temperature.value 44 | - oid: ".1.3.6.1.4.1.9.9.13.1.3.1.3" 45 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 46 | properties: 47 | minimum: 25 48 | maximum: 60 49 | minimumStep: -10 50 | maximumStep: 10 51 | # ifInOctets 52 | - oid: ".1.3.6.1.2.1.2.2.1.10" 53 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 54 | properties: 55 | minimum: 0 56 | maximum: 4294967295 57 | minimumStep: 0 58 | maximumStep: 3840000 59 | # ifInOctets 60 | - oid: ".1.3.6.1.2.1.2.2.1.11" 61 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 62 | properties: 63 | minimum: 0 64 | maximum: 4294967295 65 | minimumStep: 0 66 | maximumStep: 20000 67 | # ifInNUcastPkts 68 | - oid: ".1.3.6.1.2.1.2.2.1.12" 69 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 70 | properties: 71 | minimum: 0 72 | maximum: 4294967295 73 | minimumStep: 0 74 | maximumStep: 20000 75 | # ifInDiscards 76 | - oid: ".1.3.6.1.2.1.2.2.1.13" 77 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 78 | properties: 79 | minimum: 0 80 | maximum: 4294967295 81 | minimumStep: 0 82 | maximumStep: 20000 83 | # ifInErrors 84 | - oid: ".1.3.6.1.2.1.2.2.1.14" 85 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 86 | properties: 87 | minimum: 0 88 | maximum: 4294967295 89 | minimumStep: 0 90 | maximumStep: 20000 91 | # ifInUnknownProtos 92 | - oid: ".1.3.6.1.2.1.2.2.1.15" 93 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 94 | properties: 95 | minimum: 0 96 | maximum: 4294967295 97 | minimumStep: 0 98 | maximumStep: 20000 99 | # ifOutOctets 100 | - oid: ".1.3.6.1.2.1.2.2.1.16" 101 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 102 | properties: 103 | minimum: 0 104 | maximum: 4294967295 105 | minimumStep: 0 106 | maximumStep: 3840000 107 | # ifOutUcastPkts 108 | - oid: ".1.3.6.1.2.1.2.2.1.17" 109 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 110 | properties: 111 | minimum: 0 112 | maximum: 4294967295 113 | minimumStep: 0 114 | maximumStep: 20000 115 | # ifOutNUcastPkts 116 | - oid: ".1.3.6.1.2.1.2.2.1.18" 117 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 118 | properties: 119 | minimum: 0 120 | maximum: 4294967295 121 | minimumStep: 0 122 | maximumStep: 20000 123 | # ifOutDiscards 124 | - oid: ".1.3.6.1.2.1.2.2.1.19" 125 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 126 | properties: 127 | minimum: 0 128 | maximum: 4294967295 129 | minimumStep: 0 130 | maximumStep: 20000 131 | # ifOutErrors 132 | - oid: ".1.3.6.1.2.1.2.2.1.20" 133 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 134 | properties: 135 | minimum: 0 136 | maximum: 4294967295 137 | minimumStep: 0 138 | maximumStep: 20000 139 | # ifHCInOctets 140 | - oid: ".1.3.6.1.2.1.31.1.1.1.6" 141 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 142 | properties: 143 | minimum: 0 144 | maximum: 1844674407370955161 145 | minimumStep: 0 146 | maximumStep: 3840000 147 | # ifHCInUcastPkts 148 | - oid: ".1.3.6.1.2.1.31.1.1.1.7" 149 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 150 | properties: 151 | minimum: 0 152 | maximum: 1844674407370955161 153 | minimumStep: 0 154 | maximumStep: 20000 155 | # ifHCInMulticastPkts 156 | - oid: ".1.3.6.1.2.1.31.1.1.1.8" 157 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 158 | properties: 159 | minimum: 0 160 | maximum: 1844674407370955161 161 | minimumStep: 0 162 | maximumStep: 20000 163 | # ifHCInBroadcastPkts 164 | - oid: ".1.3.6.1.2.1.31.1.1.1.9" 165 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 166 | properties: 167 | minimum: 0 168 | maximum: 1844674407370955161 169 | minimumStep: 0 170 | maximumStep: 20000 171 | # ifInDiscards 172 | - oid: ".1.3.6.1.2.1.2.2.1.13" 173 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 174 | properties: 175 | minimum: 0 176 | maximum: 4294967295 177 | minimumStep: 0 178 | maximumStep: 20000 179 | # ifInErrors 180 | - oid: ".1.3.6.1.2.1.2.2.1.14" 181 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 182 | properties: 183 | minimum: 0 184 | maximum: 4294967295 185 | minimumStep: 0 186 | maximumStep: 20000 187 | # ifInUnknownProtos 188 | - oid: ".1.3.6.1.2.1.2.2.1.15" 189 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 190 | properties: 191 | minimum: 0 192 | maximum: 4294967295 193 | minimumStep: 0 194 | maximumStep: 20000 195 | # ifHCOutOctets 196 | - oid: ".1.3.6.1.2.1.31.1.1.1.10" 197 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 198 | properties: 199 | minimum: 0 200 | maximum: 1844674407370955161 201 | minimumStep: 0 202 | maximumStep: 3840000 203 | # ifHCOutUcastPkts 204 | - oid: ".1.3.6.1.2.1.31.1.1.1.11" 205 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 206 | properties: 207 | minimum: 0 208 | maximum: 1844674407370955161 209 | minimumStep: 0 210 | maximumStep: 20000 211 | # ifHCOutMulticastPkts 212 | - oid: ".1.3.6.1.2.1.31.1.1.1.12" 213 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 214 | properties: 215 | minimum: 0 216 | maximum: 1844674407370955161 217 | minimumStep: 0 218 | maximumStep: 20000 219 | # ifHCOutBroadcastPkts 220 | - oid: ".1.3.6.1.2.1.31.1.1.1.13" 221 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 222 | properties: 223 | minimum: 0 224 | maximum: 1844674407370955161 225 | minimumStep: 0 226 | maximumStep: 20000 227 | # ifOutDiscards 228 | - oid: ".1.3.6.1.2.1.2.2.1.19" 229 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 230 | properties: 231 | minimum: 0 232 | maximum: 4294967295 233 | minimumStep: 0 234 | maximumStep: 20000 235 | # ifOutErrors 236 | - oid: ".1.3.6.1.2.1.2.2.1.20" 237 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 238 | properties: 239 | minimum: 0 240 | maximum: 4294967295 241 | minimumStep: 0 242 | maximumStep: 20000 -------------------------------------------------------------------------------- /snmpman/src/main/config/devices/foundry.yaml: -------------------------------------------------------------------------------- 1 | name: "Foundry" 2 | modifiers: 3 | # cpu.load / cpu.avg1 / cpu.av5 4 | - oid: ".1.3.6.1.4.1.1991.1.1.2.11.1.1.5" 5 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 6 | properties: 7 | minimum: 0 8 | maximum: 100 9 | minimumStep: 0 10 | maximumStep: 100 11 | # mem.free 12 | - oid: ".1.3.6.1.4.1.1991.1.1.2.1.55" 13 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 14 | properties: 15 | minimum: 1547369620 16 | maximum: 1547374620 17 | minimumStep: -30 18 | maximumStep: 30 19 | # mem.used 20 | - oid: ".1.3.6.1.4.1.1991.1.1.2.1.53" 21 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 22 | properties: 23 | minimum: 1547369620 24 | maximum: 1547374620 25 | minimumStep: -30 26 | maximumStep: 30 27 | # env.temperature.value 28 | - oid: ".1.3.6.1.4.1.1991.1.1.2.13.1.1.4" 29 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 30 | properties: 31 | minimum: 25 32 | maximum: 60 33 | minimumStep: -10 34 | maximumStep: 10 35 | # ifInOctets 36 | - oid: ".1.3.6.1.2.1.2.2.1.10" 37 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 38 | properties: 39 | minimum: 0 40 | maximum: 4294967295 41 | minimumStep: 0 42 | maximumStep: 3840000 43 | # ifInOctets 44 | - oid: ".1.3.6.1.2.1.2.2.1.11" 45 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 46 | properties: 47 | minimum: 0 48 | maximum: 4294967295 49 | minimumStep: 0 50 | maximumStep: 20000 51 | # ifInNUcastPkts 52 | - oid: ".1.3.6.1.2.1.2.2.1.12" 53 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 54 | properties: 55 | minimum: 0 56 | maximum: 4294967295 57 | minimumStep: 0 58 | maximumStep: 20000 59 | # ifInDiscards 60 | - oid: ".1.3.6.1.2.1.2.2.1.13" 61 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 62 | properties: 63 | minimum: 0 64 | maximum: 4294967295 65 | minimumStep: 0 66 | maximumStep: 20000 67 | # ifInErrors 68 | - oid: ".1.3.6.1.2.1.2.2.1.14" 69 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 70 | properties: 71 | minimum: 0 72 | maximum: 4294967295 73 | minimumStep: 0 74 | maximumStep: 20000 75 | # ifInUnknownProtos 76 | - oid: ".1.3.6.1.2.1.2.2.1.15" 77 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 78 | properties: 79 | minimum: 0 80 | maximum: 4294967295 81 | minimumStep: 0 82 | maximumStep: 20000 83 | # ifOutOctets 84 | - oid: ".1.3.6.1.2.1.2.2.1.16" 85 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 86 | properties: 87 | minimum: 0 88 | maximum: 4294967295 89 | minimumStep: 0 90 | maximumStep: 3840000 91 | # ifOutUcastPkts 92 | - oid: ".1.3.6.1.2.1.2.2.1.17" 93 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 94 | properties: 95 | minimum: 0 96 | maximum: 4294967295 97 | minimumStep: 0 98 | maximumStep: 20000 99 | # ifOutNUcastPkts 100 | - oid: ".1.3.6.1.2.1.2.2.1.18" 101 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 102 | properties: 103 | minimum: 0 104 | maximum: 4294967295 105 | minimumStep: 0 106 | maximumStep: 20000 107 | # ifOutDiscards 108 | - oid: ".1.3.6.1.2.1.2.2.1.19" 109 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 110 | properties: 111 | minimum: 0 112 | maximum: 4294967295 113 | minimumStep: 0 114 | maximumStep: 20000 115 | # ifOutErrors 116 | - oid: ".1.3.6.1.2.1.2.2.1.20" 117 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 118 | properties: 119 | minimum: 0 120 | maximum: 4294967295 121 | minimumStep: 0 122 | maximumStep: 20000 123 | # ifHCInOctets 124 | - oid: ".1.3.6.1.2.1.31.1.1.1.6" 125 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 126 | properties: 127 | minimum: 0 128 | maximum: 1844674407370955161 129 | minimumStep: 0 130 | maximumStep: 3840000 131 | # ifHCInUcastPkts 132 | - oid: ".1.3.6.1.2.1.31.1.1.1.7" 133 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 134 | properties: 135 | minimum: 0 136 | maximum: 1844674407370955161 137 | minimumStep: 0 138 | maximumStep: 20000 139 | # ifHCInMulticastPkts 140 | - oid: ".1.3.6.1.2.1.31.1.1.1.8" 141 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 142 | properties: 143 | minimum: 0 144 | maximum: 1844674407370955161 145 | minimumStep: 0 146 | maximumStep: 20000 147 | # ifHCInBroadcastPkts 148 | - oid: ".1.3.6.1.2.1.31.1.1.1.9" 149 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 150 | properties: 151 | minimum: 0 152 | maximum: 1844674407370955161 153 | minimumStep: 0 154 | maximumStep: 20000 155 | # ifInDiscards 156 | - oid: ".1.3.6.1.2.1.2.2.1.13" 157 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 158 | properties: 159 | minimum: 0 160 | maximum: 4294967295 161 | minimumStep: 0 162 | maximumStep: 20000 163 | # ifInErrors 164 | - oid: ".1.3.6.1.2.1.2.2.1.14" 165 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 166 | properties: 167 | minimum: 0 168 | maximum: 4294967295 169 | minimumStep: 0 170 | maximumStep: 20000 171 | # ifInUnknownProtos 172 | - oid: ".1.3.6.1.2.1.2.2.1.15" 173 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 174 | properties: 175 | minimum: 0 176 | maximum: 4294967295 177 | minimumStep: 0 178 | maximumStep: 20000 179 | # ifHCOutOctets 180 | - oid: ".1.3.6.1.2.1.31.1.1.1.10" 181 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 182 | properties: 183 | minimum: 0 184 | maximum: 1844674407370955161 185 | minimumStep: 0 186 | maximumStep: 3840000 187 | # ifHCOutUcastPkts 188 | - oid: ".1.3.6.1.2.1.31.1.1.1.11" 189 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 190 | properties: 191 | minimum: 0 192 | maximum: 1844674407370955161 193 | minimumStep: 0 194 | maximumStep: 20000 195 | # ifHCOutMulticastPkts 196 | - oid: ".1.3.6.1.2.1.31.1.1.1.12" 197 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 198 | properties: 199 | minimum: 0 200 | maximum: 1844674407370955161 201 | minimumStep: 0 202 | maximumStep: 20000 203 | # ifHCOutBroadcastPkts 204 | - oid: ".1.3.6.1.2.1.31.1.1.1.13" 205 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 206 | properties: 207 | minimum: 0 208 | maximum: 1844674407370955161 209 | minimumStep: 0 210 | maximumStep: 20000 211 | # ifOutDiscards 212 | - oid: ".1.3.6.1.2.1.2.2.1.19" 213 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 214 | properties: 215 | minimum: 0 216 | maximum: 4294967295 217 | minimumStep: 0 218 | maximumStep: 20000 219 | # ifOutErrors 220 | - oid: ".1.3.6.1.2.1.2.2.1.20" 221 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 222 | properties: 223 | minimum: 0 224 | maximum: 4294967295 225 | minimumStep: 0 226 | maximumStep: 20000 -------------------------------------------------------------------------------- /snmpman/src/main/config/devices/junos.yaml: -------------------------------------------------------------------------------- 1 | name: "Junos" 2 | modifiers: 3 | # cpu.load 4 | - oid: ".1.3.6.1.4.1.2636.3.1.13.1.8" 5 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 6 | properties: 7 | minimum: 0 8 | maximum: 100 9 | minimumStep: 0 10 | maximumStep: 100 11 | # env.temperature.value 12 | - oid: ".1.3.6.1.4.1.2636.3.1.13.1.7" 13 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 14 | properties: 15 | minimum: 25 16 | maximum: 60 17 | minimumStep: -10 18 | maximumStep: 10 19 | # ifInOctets 20 | - oid: ".1.3.6.1.2.1.2.2.1.10" 21 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 22 | properties: 23 | minimum: 0 24 | maximum: 4294967295 25 | minimumStep: 0 26 | maximumStep: 3840000 27 | # ifInOctets 28 | - oid: ".1.3.6.1.2.1.2.2.1.11" 29 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 30 | properties: 31 | minimum: 0 32 | maximum: 4294967295 33 | minimumStep: 0 34 | maximumStep: 20000 35 | # ifInNUcastPkts 36 | - oid: ".1.3.6.1.2.1.2.2.1.12" 37 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 38 | properties: 39 | minimum: 0 40 | maximum: 4294967295 41 | minimumStep: 0 42 | maximumStep: 20000 43 | # ifInDiscards 44 | - oid: ".1.3.6.1.2.1.2.2.1.13" 45 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 46 | properties: 47 | minimum: 0 48 | maximum: 4294967295 49 | minimumStep: 0 50 | maximumStep: 20000 51 | # ifInErrors 52 | - oid: ".1.3.6.1.2.1.2.2.1.14" 53 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 54 | properties: 55 | minimum: 0 56 | maximum: 4294967295 57 | minimumStep: 0 58 | maximumStep: 20000 59 | # ifInUnknownProtos 60 | - oid: ".1.3.6.1.2.1.2.2.1.15" 61 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 62 | properties: 63 | minimum: 0 64 | maximum: 4294967295 65 | minimumStep: 0 66 | maximumStep: 20000 67 | # ifOutOctets 68 | - oid: ".1.3.6.1.2.1.2.2.1.16" 69 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 70 | properties: 71 | minimum: 0 72 | maximum: 4294967295 73 | minimumStep: 0 74 | maximumStep: 3840000 75 | # ifOutUcastPkts 76 | - oid: ".1.3.6.1.2.1.2.2.1.17" 77 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 78 | properties: 79 | minimum: 0 80 | maximum: 4294967295 81 | minimumStep: 0 82 | maximumStep: 20000 83 | # ifOutNUcastPkts 84 | - oid: ".1.3.6.1.2.1.2.2.1.18" 85 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 86 | properties: 87 | minimum: 0 88 | maximum: 4294967295 89 | minimumStep: 0 90 | maximumStep: 20000 91 | # ifOutDiscards 92 | - oid: ".1.3.6.1.2.1.2.2.1.19" 93 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 94 | properties: 95 | minimum: 0 96 | maximum: 4294967295 97 | minimumStep: 0 98 | maximumStep: 20000 99 | # ifOutErrors 100 | - oid: ".1.3.6.1.2.1.2.2.1.20" 101 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 102 | properties: 103 | minimum: 0 104 | maximum: 4294967295 105 | minimumStep: 0 106 | maximumStep: 20000 107 | # ifHCInOctets 108 | - oid: ".1.3.6.1.2.1.31.1.1.1.6" 109 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 110 | properties: 111 | minimum: 0 112 | maximum: 1844674407370955161 113 | minimumStep: 0 114 | maximumStep: 3840000 115 | # ifHCInUcastPkts 116 | - oid: ".1.3.6.1.2.1.31.1.1.1.7" 117 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 118 | properties: 119 | minimum: 0 120 | maximum: 1844674407370955161 121 | minimumStep: 0 122 | maximumStep: 20000 123 | # ifHCInMulticastPkts 124 | - oid: ".1.3.6.1.2.1.31.1.1.1.8" 125 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 126 | properties: 127 | minimum: 0 128 | maximum: 1844674407370955161 129 | minimumStep: 0 130 | maximumStep: 20000 131 | # ifHCInBroadcastPkts 132 | - oid: ".1.3.6.1.2.1.31.1.1.1.9" 133 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 134 | properties: 135 | minimum: 0 136 | maximum: 1844674407370955161 137 | minimumStep: 0 138 | maximumStep: 20000 139 | # ifInDiscards 140 | - oid: ".1.3.6.1.2.1.2.2.1.13" 141 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 142 | properties: 143 | minimum: 0 144 | maximum: 4294967295 145 | minimumStep: 0 146 | maximumStep: 20000 147 | # ifInErrors 148 | - oid: ".1.3.6.1.2.1.2.2.1.14" 149 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 150 | properties: 151 | minimum: 0 152 | maximum: 4294967295 153 | minimumStep: 0 154 | maximumStep: 20000 155 | # ifInUnknownProtos 156 | - oid: ".1.3.6.1.2.1.2.2.1.15" 157 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 158 | properties: 159 | minimum: 0 160 | maximum: 4294967295 161 | minimumStep: 0 162 | maximumStep: 20000 163 | # ifHCOutOctets 164 | - oid: ".1.3.6.1.2.1.31.1.1.1.10" 165 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 166 | properties: 167 | minimum: 0 168 | maximum: 1844674407370955161 169 | minimumStep: 0 170 | maximumStep: 3840000 171 | # ifHCOutUcastPkts 172 | - oid: ".1.3.6.1.2.1.31.1.1.1.11" 173 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 174 | properties: 175 | minimum: 0 176 | maximum: 1844674407370955161 177 | minimumStep: 0 178 | maximumStep: 20000 179 | # ifHCOutMulticastPkts 180 | - oid: ".1.3.6.1.2.1.31.1.1.1.12" 181 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 182 | properties: 183 | minimum: 0 184 | maximum: 1844674407370955161 185 | minimumStep: 0 186 | maximumStep: 20000 187 | # ifHCOutBroadcastPkts 188 | - oid: ".1.3.6.1.2.1.31.1.1.1.13" 189 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 190 | properties: 191 | minimum: 0 192 | maximum: 1844674407370955161 193 | minimumStep: 0 194 | maximumStep: 20000 195 | # ifOutDiscards 196 | - oid: ".1.3.6.1.2.1.2.2.1.19" 197 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 198 | properties: 199 | minimum: 0 200 | maximum: 4294967295 201 | minimumStep: 0 202 | maximumStep: 20000 203 | # ifOutErrors 204 | - oid: ".1.3.6.1.2.1.2.2.1.20" 205 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 206 | properties: 207 | minimum: 0 208 | maximum: 4294967295 209 | minimumStep: 0 210 | maximumStep: 20000 -------------------------------------------------------------------------------- /snmpman/src/main/config/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /snmpman/src/main/config/walk/example1.walk: -------------------------------------------------------------------------------- 1 | .1.3.6.1.2.1.1.5.0 = STRING: "device" 2 | .1.3.6.1.2.1.2.2.1.7.10101 = INTEGER: 1 3 | .1.3.6.1.2.1.31.1.1.1.6.10101 = Counter64: 389172331 4 | .1.3.6.1.2.1.31.1.1.1.7.10101 = Counter64: 5470259 5 | .1.3.6.1.2.1.31.1.1.1.8.10101 = Counter64: 19 6 | .1.3.6.1.2.1.31.1.1.1.9.10101 = Counter64: 743 7 | .1.3.6.1.2.1.2.2.1.13.10101 = Counter32: 0 8 | .1.3.6.1.2.1.2.2.1.14.10101 = Counter32: 0 9 | .1.3.6.1.2.1.2.2.1.15.10101 = Counter32: 0 10 | .1.3.6.1.2.1.31.1.1.1.10.10101 = Counter64: 48648257581 11 | .1.3.6.1.2.1.31.1.1.1.11.10101 = Counter64: 32038868 12 | .1.3.6.1.2.1.31.1.1.1.12.10101 = Counter64: 141915228 13 | .1.3.6.1.2.1.31.1.1.1.13.10101 = Counter64: 44011328 14 | .1.3.6.1.2.1.2.2.1.19.10101 = Counter32: 0 15 | .1.3.6.1.2.1.2.2.1.2.10101 = STRING: "GigabitEthernet0/1" 16 | .1.3.6.1.2.1.31.1.1.1.1.10101 = STRING: "Gi0/1" 17 | .1.3.6.1.2.1.31.1.1.1.10.10101 = Counter64: 48648257581 18 | .1.3.6.1.2.1.31.1.1.1.11.10101 = Counter64: 32038868 19 | .1.3.6.1.2.1.31.1.1.1.12.10101 = Counter64: 141915228 20 | .1.3.6.1.2.1.31.1.1.1.13.10101 = Counter64: 44011328 21 | .1.3.6.1.2.1.31.1.1.1.15.10101 = Gauge32: 1000 22 | .1.3.6.1.2.1.2.2.1.5.10101 = Gauge32: 1000000000 23 | .1.3.6.1.2.1.17.2.4.0 = Counter32: 0 -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/Snmpman.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; 5 | import com.google.common.base.Preconditions; 6 | import com.oneandone.snmpman.configuration.AgentConfiguration; 7 | import com.oneandone.snmpman.exception.InitializationException; 8 | import lombok.Getter; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.snmp4j.agent.BaseAgent; 11 | 12 | import java.io.File; 13 | import java.io.IOException; 14 | import java.util.Arrays; 15 | import java.util.Collections; 16 | import java.util.List; 17 | import java.util.stream.Collectors; 18 | 19 | /** 20 | * This is the library interface for Snmpman. 21 | *
22 | * Each configuration list item represents an instance of the {@link com.oneandone.snmpman.configuration.AgentConfiguration}. 23 | * The constructor {@link com.oneandone.snmpman.configuration.AgentConfiguration#AgentConfiguration(String, java.io.File, java.io.File, String, int, String)} 24 | * lists all available properties, which may or may not be required. 25 | *
26 | * An entry may look like the following: 27 | *
 28 |  * {@code
 29 |  *     - name: "example1"
 30 |  *       device: "src/test/resources/configuration/cisco.yaml"
 31 |  *       walk: "src/test/resources/configuration/example.txt"
 32 |  *       ip: "127.0.0.1"
 33 |  *       port: 10000
 34 |  * }
 35 |  * 
36 | * You can find more example within the test resources of this project. 37 | *
38 | * The configuration {@code YAML} file defines a list of all agents that should be simulated by the {@code Snmpman}. 39 | */ 40 | @Slf4j 41 | public final class Snmpman { 42 | 43 | /** 44 | * Returns the list of SNMP agents for {@code this} instance. 45 | * 46 | * @return the list of SNMP agents 47 | */ 48 | @Getter private final List agents; 49 | 50 | /** 51 | * Constructs an instance by the specified list of agents. 52 | * 53 | * @param agents the agents for {@code this} instance 54 | */ 55 | private Snmpman(final List agents) { 56 | this.agents = agents; 57 | } 58 | 59 | /** 60 | * Creates an {@code Snmpman} instance by the specified configuration in the {@code configurationFile} and starts all agents. 61 | * 62 | * @param configurationFile the configuration 63 | * @return the {@code Snmpman} instance 64 | * @throws com.oneandone.snmpman.exception.InitializationException thrown if any agent, as specified in the configuration, could not be started 65 | */ 66 | public static Snmpman start(final File configurationFile) { 67 | Preconditions.checkNotNull(configurationFile, "the configuration file may not be null"); 68 | Preconditions.checkArgument(configurationFile.exists() && configurationFile.isFile(), "configuration does not exist or is not a file"); 69 | 70 | log.debug("started with configuration in path {}", configurationFile.getAbsolutePath()); 71 | try { 72 | final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 73 | final AgentConfiguration[] configurations = mapper.readValue(configurationFile, AgentConfiguration[].class); 74 | 75 | return Snmpman.start(Arrays.stream(configurations).map(SnmpmanAgent::new).collect(Collectors.toList())); 76 | } catch (final IOException e) { 77 | throw new InitializationException("could not parse configuration at path: " + configurationFile.getAbsolutePath(), e); 78 | } 79 | } 80 | 81 | /** 82 | * Creates a {@code Snmpman} instance with the specified list of agents and starts all agents. 83 | * 84 | * @param agents the list of agents 85 | * @return the {@code Snmpman} instance 86 | * @throws com.oneandone.snmpman.exception.InitializationException thrown if any agent, as specified in the configuration, could not be started 87 | */ 88 | public static Snmpman start(final List agents) { 89 | final Snmpman snmpman = new Snmpman(Collections.unmodifiableList(agents)); 90 | snmpman.start(); 91 | return snmpman; 92 | } 93 | 94 | /** 95 | * Starts all agents as defined in {@link #agents}. 96 | * 97 | * @throws com.oneandone.snmpman.exception.InitializationException thrown if any agent could not be started 98 | */ 99 | private void start() { 100 | log.debug("starting to load agents"); 101 | for (final SnmpmanAgent agent : agents) { 102 | try { 103 | agent.execute(); 104 | } catch (final IOException e) { 105 | throw new InitializationException("failed to start agent \"" + agent.getName() + "\"", e); 106 | } 107 | } 108 | log.debug("all agents initialized"); 109 | agents.forEach(this::checkStatus); 110 | log.info("all agents are running"); 111 | } 112 | 113 | /** 114 | * Wait until specified agent is started. 115 | *
116 | * A call of this method is blocking. 117 | * 118 | * @param agent the agent to wait for 119 | * @throws InitializationException if the specified agent is already stopped 120 | */ 121 | private void checkStatus(final SnmpmanAgent agent) { 122 | if (agent.getAgentState() == BaseAgent.STATE_STOPPED) { 123 | throw new InitializationException("agent " + agent.getName() + " already stopped while initialization was running"); 124 | } else if (agent.getAgentState() != BaseAgent.STATE_RUNNING) { 125 | try { 126 | Thread.sleep(100L); 127 | checkStatus(agent); 128 | } catch (final InterruptedException e) { 129 | log.warn("wait was interrupted", e); 130 | } 131 | } 132 | } 133 | 134 | /** Stops all agents as defined in {@link #agents}. */ 135 | public void stop() { 136 | agents.forEach(SnmpmanAgent::stop); 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/AgentConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | import com.fasterxml.jackson.databind.ObjectMapper; 5 | import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; 6 | import com.oneandone.snmpman.Snmpman; 7 | import com.oneandone.snmpman.SnmpmanAgent; 8 | import com.oneandone.snmpman.configuration.modifier.Modifier; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.Getter; 11 | import lombok.ToString; 12 | import lombok.extern.slf4j.Slf4j; 13 | import org.snmp4j.smi.Address; 14 | import org.snmp4j.smi.GenericAddress; 15 | 16 | import java.io.File; 17 | import java.io.IOException; 18 | import java.util.HashMap; 19 | import java.util.Map; 20 | import java.util.Optional; 21 | 22 | /** Representation of the configuration for a {@link SnmpmanAgent}. */ 23 | @Slf4j 24 | @ToString(exclude = "community") @EqualsAndHashCode 25 | public class AgentConfiguration { 26 | 27 | /** The device factory. */ 28 | private static final DeviceFactory DEVICE_FACTORY = new DeviceFactory(); 29 | 30 | /** 31 | * Returns the name of the agent. 32 | *
33 | * If the {@code name} wasn't set on construction, the name will be defined by the {@link #address}. 34 | * 35 | * @return the name of the agent 36 | */ 37 | @Getter private final String name; 38 | 39 | /** 40 | * Returns the address of the agent. 41 | * 42 | * @return the address of the agent 43 | */ 44 | @Getter private final Address address; // e.g. 127.0.0.1/8080 45 | 46 | /** The device configuration file path. */ 47 | private final File deviceConfiguration; 48 | 49 | /** 50 | * Returns the {@link Device} representation for the agent. 51 | *
52 | * Will be set to {@link DeviceFactory#DEFAULT_DEVICE} by default. 53 | * 54 | * @return the device representation for the agent 55 | */ 56 | @Getter(lazy=true) private final Device device = initializeDevice(); // e.g. cisco 57 | 58 | /** 59 | * Returns the base walk file (e.g. dump of SNMP walks) for the agent. 60 | * 61 | * @return the base walk file for the agent 62 | */ 63 | @Getter private final File walk; // real walk: /opt/snmpman/... 64 | 65 | /** 66 | * Returns the community for the agent. 67 | *
68 | * The community is {@code public} by default. 69 | * 70 | * @return the community for the agent 71 | */ 72 | @Getter private final String community; // e.g. 'public' 73 | 74 | /** 75 | * The device factory creates all {@link Device} representations. 76 | *
77 | * It is required to instantiate the representations only one time application-wide. 78 | */ 79 | // TODO each Snmpman instance should have its own device factory instance 80 | public static class DeviceFactory { 81 | 82 | /** The default device which will be returned if no configuration specified. */ 83 | public static final Device DEFAULT_DEVICE = new Device("default", new Modifier[0], null); 84 | 85 | /** The map of all available devices. */ 86 | private final Map devices = new HashMap<>(); 87 | 88 | /** 89 | * Returns the device representation for the specified {@code path}. 90 | *
91 | * If the {@code path} is {@code null}, or the parsing of the configuration failed, the {@link #DEFAULT_DEVICE} will be returned instead. 92 | * 93 | * @param path the path of the device configuration 94 | * @return the {@link Device} representation for the specified configuration in {@code path} 95 | */ 96 | public Device getDevice(final File path) { 97 | if (path == null) { 98 | return DEFAULT_DEVICE; 99 | } 100 | 101 | if (devices.containsKey(path)) { 102 | return devices.get(path); 103 | } else { 104 | try { 105 | final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 106 | final Device device = mapper.readValue(path, Device.class); 107 | devices.put(path, device); 108 | return device; 109 | } catch (final IOException e) { 110 | log.error("could not load device in path \"" + path.getAbsolutePath() + "\"", e); 111 | return DEFAULT_DEVICE; 112 | } 113 | } 114 | } 115 | } 116 | 117 | /** 118 | * Constructs a new agent configuration. 119 | *
120 | * The list of agent configurations will be parsed from within {@link Snmpman}. 121 | * 122 | * @param name the name of the agent or {@code null} to set the address as the name 123 | * @param deviceConfiguration the device configuration or {@code null} will set it to 124 | * {@link DeviceFactory#DEFAULT_DEVICE} 125 | * @param walk the base walk file (e.g. dump of SNMP walks) 126 | * @param ip the IP the agent should bind to 127 | * @param port the port of the agent 128 | * @param community the community of the agent or {@code null} will set it to {@code public} 129 | */ 130 | public AgentConfiguration(@JsonProperty(value = "name") final String name, 131 | @JsonProperty(value = "device") final File deviceConfiguration, 132 | @JsonProperty(value = "walk", required = true) final File walk, 133 | @JsonProperty(value = "ip", required = true) final String ip, 134 | @JsonProperty(value = "port", required = true) final int port, 135 | @JsonProperty(value = "community") final String community) { 136 | this.name = Optional.ofNullable(name).orElse(ip + ":" + port); 137 | this.address = GenericAddress.parse(ip + "/" + port); 138 | 139 | this.deviceConfiguration = deviceConfiguration; 140 | this.walk = walk; 141 | 142 | this.community = Optional.ofNullable(community).orElse("public"); 143 | } 144 | 145 | /** 146 | * FIXME 147 | * Lazy initialization of {@link #device} required as nested use of {@link ObjectMapper} 148 | * lead to an exception. Try to remove this call with a version update of {@code jackson}. 149 | * 150 | * @return the lazy initialized device 151 | */ 152 | private Device initializeDevice() { 153 | return DEVICE_FACTORY.getDevice(deviceConfiguration); 154 | } 155 | 156 | 157 | } 158 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/Device.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | import com.oneandone.snmpman.configuration.modifier.Modifier; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.Getter; 7 | import lombok.ToString; 8 | 9 | import java.util.Arrays; 10 | import java.util.Collections; 11 | import java.util.List; 12 | 13 | /** 14 | * Represents a device type. 15 | *
16 | * You can find example configurations within the test resources of this project. 17 | */ 18 | @ToString(of = "name") @EqualsAndHashCode 19 | public class Device { 20 | 21 | /** 22 | * The device name. 23 | * 24 | * @return the device name 25 | */ 26 | @Getter private final String name; 27 | 28 | /** 29 | * The unmodifiable list of modifier definitions. 30 | *
31 | * See {@link Modifier} and {@link com.oneandone.snmpman.configuration.modifier.VariableModifier}. 32 | * 33 | * @return list of modifier definitions 34 | */ 35 | @Getter private final List modifiers; 36 | 37 | /** 38 | * The unmodifiable list of vlans. 39 | * 40 | * @return list of vlans represented as {@link Long}. 41 | */ 42 | @Getter private final List vlans; 43 | 44 | /** 45 | * Constructs a new device type. 46 | * 47 | * @param name the name of the device 48 | * @param modifiers the modifiers 49 | */ 50 | Device(@JsonProperty("name") final String name, @JsonProperty("modifiers") final Modifier[] modifiers, @JsonProperty(value = "vlans") final Long[] vlans) { 51 | this.name = name; 52 | if (modifiers != null) { 53 | this.modifiers = Collections.unmodifiableList(Arrays.asList(modifiers)); 54 | } else { 55 | this.modifiers = Collections.emptyList(); 56 | } 57 | if (vlans != null) { 58 | this.vlans = Collections.unmodifiableList(Arrays.asList(vlans)); 59 | } else { 60 | this.vlans = Collections.emptyList(); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/AbstractIntegerModifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.google.common.primitives.UnsignedInteger; 5 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 6 | import lombok.Getter; 7 | import org.snmp4j.smi.UnsignedInteger32; 8 | 9 | import java.util.Optional; 10 | 11 | /** 12 | * This modifier has all utility methods to construct for unsigned integer variable modifiers. 13 | */ 14 | abstract class AbstractIntegerModifier implements VariableModifier { 15 | 16 | /** The minimum allowed number for the resulting modified variable. */ 17 | @Getter private long minimum; 18 | 19 | /** The maximum allowed number for the resulting modified variable. */ 20 | @Getter private long maximum; 21 | 22 | /** The minimal step by which a variable will be incremented. */ 23 | @Getter private long minimumStep; 24 | 25 | /** The maximal step by which a variable will be incremented. */ 26 | @Getter private long maximumStep; 27 | 28 | @Override 29 | public void init(final ModifierProperties properties) { 30 | this.minimum = Optional.ofNullable(properties.getLong("minimum")).orElse(0L); 31 | this.maximum = Optional.ofNullable(properties.getLong("maximum")).orElse(UnsignedInteger.MAX_VALUE.longValue()); 32 | 33 | this.minimumStep = Optional.ofNullable(properties.getLong("minimumStep")).orElse(0L); 34 | this.maximumStep = Optional.ofNullable(properties.getLong("maximumStep")).orElse(1L); 35 | 36 | Preconditions.checkArgument(minimum >= 0, "minimum should not be negative"); 37 | Preconditions.checkArgument(maximum >= 0, "maximum should not be negative"); 38 | 39 | Preconditions.checkArgument(minimum <= UnsignedInteger.MAX_VALUE.longValue(), "minimum should not exceed 2^32-1 (4294967295 decimal)"); 40 | Preconditions.checkArgument(maximum <= UnsignedInteger.MAX_VALUE.longValue(), "maximum should not exceed 2^32-1 (4294967295 decimal)"); 41 | } 42 | 43 | /** 44 | * Casts the long value to the specified output type of the implementing modifier. 45 | * 46 | * @param value the value to cast 47 | * @return the casted value 48 | */ 49 | protected abstract T cast(long value); 50 | 51 | @Override 52 | public final T modify(final T variable) { 53 | long currentValue = variable.getValue(); 54 | if (currentValue < minimum || currentValue > maximum) { 55 | currentValue = minimum; 56 | } 57 | long step = (Math.round(Math.random() * (maximumStep - minimumStep)) + minimumStep); 58 | 59 | long stepUntilMaximum = maximum - currentValue; 60 | long newValue; 61 | if (Math.abs(step) > Math.abs(stepUntilMaximum)) { 62 | newValue = minimum + (step - stepUntilMaximum - 1); 63 | } else { 64 | newValue = currentValue + step; 65 | } 66 | 67 | if (newValue < minimum) { 68 | newValue = minimum; 69 | } else if (newValue > maximum) { 70 | newValue = maximum; 71 | } 72 | 73 | return cast(newValue); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/CommunityContextModifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import org.snmp4j.smi.OID; 4 | import org.snmp4j.smi.OctetString; 5 | import org.snmp4j.smi.Variable; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * This is a {@link VariableModifier}, which is able to handle the SNMP community context. 11 | */ 12 | public interface CommunityContextModifier extends VariableModifier { 13 | /** 14 | * Getter for the mapping of the community context to value mapping. 15 | * 16 | * @return Map of context value mapping. 17 | */ 18 | Map getCommunityContextMapping(); 19 | 20 | /** 21 | * Creates a mapping of SNMP OID and a value based on the SNMP community context and the SNMP OID. 22 | * 23 | * @param context SNMP community context. 24 | * @param oid SNMP OID. 25 | * @return variable binding of OID to Variable. 26 | */ 27 | Map getVariableBindings(final OctetString context, final OID oid); 28 | } 29 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/CommunityIndexCounter32Modifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import lombok.Getter; 5 | import org.snmp4j.smi.Counter32; 6 | import org.snmp4j.smi.OID; 7 | import org.snmp4j.smi.OctetString; 8 | import org.snmp4j.smi.Variable; 9 | 10 | import java.util.*; 11 | 12 | /** 13 | * This modifier implementation modifies {@link Counter32} variables depending on their community context. 14 | */ 15 | public class CommunityIndexCounter32Modifier implements CommunityContextModifier { 16 | /** 17 | * Mapping of SNMP community context to SNMP OID and result. 18 | */ 19 | @Getter private Map communityContextMapping = new HashMap<>(); 20 | 21 | @Override 22 | public void init(final ModifierProperties properties) { 23 | communityContextMapping = new HashMap<>(); 24 | properties.entrySet().stream().filter(property -> getUnsignedLong(property.getKey()) != -1L && 25 | getUnsignedLong(property.getValue()) != -1L).forEach(property -> 26 | communityContextMapping.put(getUnsignedLong(property.getKey()), getUnsignedLong(property.getValue()))); 27 | } 28 | 29 | private Long getUnsignedLong(final Object input) { 30 | try { 31 | if (!Optional.ofNullable(input).isPresent()) { 32 | // not present 33 | return -1L; 34 | } 35 | final String value = String.valueOf(input); 36 | return Long.parseLong(value); 37 | } catch (NumberFormatException e) { 38 | // s is not numeric 39 | return -11L; 40 | } 41 | } 42 | 43 | @Override 44 | public final Counter32 modify(final Counter32 variable) { 45 | if (variable == null) { 46 | return new Counter32(0); 47 | } 48 | return variable; 49 | } 50 | 51 | @Override 52 | public Map getVariableBindings(final OctetString context, final OID queryOID) { 53 | if (queryOID != null && context != null && context.getValue().length != 0) { 54 | if (!queryOID.toString().isEmpty() && !context.toString().isEmpty() && communityContextMapping.containsKey(Long.parseLong(context.toString()))) { 55 | return Collections.singletonMap(queryOID, new Counter32(communityContextMapping.get(Long.parseLong(context.toString())))); 56 | } 57 | } else if (queryOID != null) { 58 | return Collections.singletonMap(queryOID, modify(null)); 59 | 60 | } 61 | return new TreeMap<>(); 62 | } 63 | } 64 | 65 | 66 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/Counter32Modifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import org.snmp4j.smi.Counter32; 4 | 5 | /** This modifier instance modifies {@link org.snmp4j.smi.Counter32} variables. */ 6 | public class Counter32Modifier extends AbstractIntegerModifier { 7 | 8 | @Override 9 | protected Counter32 cast(long value) { 10 | return new Counter32(value); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/Counter64Modifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.google.common.primitives.UnsignedLong; 4 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 5 | import lombok.Getter; 6 | import org.snmp4j.smi.Counter64; 7 | 8 | import java.util.Optional; 9 | 10 | /** This modifier instance modifies {@link Counter64} variables. */ 11 | public class Counter64Modifier implements VariableModifier { 12 | 13 | /** The minimum allowed number for the resulting modified variable. */ 14 | @Getter private UnsignedLong minimum; 15 | 16 | /** The maximum allowed number for the resulting modified variable. */ 17 | @Getter private UnsignedLong maximum; 18 | 19 | /** The minimal step by which a variable will be incremented. */ 20 | @Getter private UnsignedLong minimumStep; 21 | 22 | /** The maximal step by which a variable will be incremented. */ 23 | @Getter private UnsignedLong maximumStep; 24 | 25 | @Override 26 | public void init(final ModifierProperties properties) { 27 | this.minimum = Optional.ofNullable(properties.getUnsignedLong("minimum")).orElse(UnsignedLong.ZERO); 28 | this.maximum = Optional.ofNullable(properties.getUnsignedLong("maximum")).orElse(UnsignedLong.MAX_VALUE); 29 | 30 | this.minimumStep = Optional.ofNullable(properties.getUnsignedLong("minimumStep")).orElse(UnsignedLong.ZERO); 31 | this.maximumStep = Optional.ofNullable(properties.getUnsignedLong("maximumStep")).orElse(UnsignedLong.ONE); 32 | } 33 | 34 | @Override 35 | public Counter64 modify(final Counter64 variable) { 36 | UnsignedLong currentValue = UnsignedLong.valueOf(variable.toString()); 37 | if (currentValue.compareTo(minimum) < 0 || currentValue.compareTo(maximum) > 0) { 38 | currentValue = minimum; 39 | } 40 | 41 | final UnsignedLong step = UnsignedLong.valueOf((long) (Math.random() * maximumStep.minus(minimumStep).longValue())).plus(minimumStep); 42 | final UnsignedLong newValue = currentValue.plus(step); 43 | 44 | return new Counter64(newValue.longValue()); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/Gauge32Modifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import org.snmp4j.smi.Gauge32; 4 | 5 | /** This modifier instance modifies {@link org.snmp4j.smi.Gauge32} variables. */ 6 | public class Gauge32Modifier extends AbstractIntegerModifier { 7 | 8 | @Override 9 | protected Gauge32 cast(long value) { 10 | return new Gauge32(value); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/Integer32Modifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import lombok.Getter; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.snmp4j.smi.Integer32; 7 | 8 | import java.util.Optional; 9 | 10 | /** This modifier instance modifies {@link Integer32} variables. */ 11 | @Slf4j 12 | public class Integer32Modifier implements VariableModifier { 13 | 14 | /** The minimum allowed number for the resulting modified variable. */ 15 | @Getter private Integer minimum; 16 | 17 | /** The maximum allowed number for the resulting modified variable. */ 18 | @Getter private Integer maximum; 19 | 20 | /** The minimal step by which a variable will be incremented. */ 21 | @Getter private Integer minimumStep; 22 | 23 | /** The maximal step by which a variable will be incremented. */ 24 | @Getter private Integer maximumStep; 25 | 26 | @Override 27 | public void init(final ModifierProperties properties) { 28 | this.minimum = Optional.ofNullable(properties.getInteger("minimum")).orElse(Integer.MIN_VALUE); 29 | this.maximum = Optional.ofNullable(properties.getInteger("maximum")).orElse(Integer.MAX_VALUE); 30 | 31 | this.minimumStep = Optional.ofNullable(properties.getInteger("minimumStep")).orElse(-1); 32 | this.maximumStep = Optional.ofNullable(properties.getInteger("maximumStep")).orElse(1); 33 | } 34 | 35 | /** 36 | * Increments the current value by a random number between the minimum and maximum step. 37 | *

38 | * An overflow can occur and will be considered in the minimum and maximum interval. 39 | * 40 | * @param currentValue the current value to modify 41 | * @param minimum {@link #minimum} 42 | * @param maximum {@link #maximum} 43 | * @param minimumStep {@link #minimumStep} 44 | * @param maximumStep {@link #maximumStep} 45 | * @return the modified variable value 46 | */ 47 | protected int modify(final int currentValue, final int minimum, final int maximum, final int minimumStep, final int maximumStep) { 48 | int currentValidValue = currentValue; 49 | if (currentValue < minimum || currentValue > maximum) { 50 | currentValidValue = minimum; 51 | } 52 | int step = (int) (Math.round(Math.random() * (maximumStep - minimumStep)) + minimumStep); 53 | 54 | int stepUntilMaximum = maximum - currentValidValue; 55 | int newValue; 56 | if (Math.abs(step) > Math.abs(stepUntilMaximum)) { 57 | newValue = minimum + (step - stepUntilMaximum - 1); 58 | } else { 59 | newValue = currentValidValue + step; 60 | } 61 | 62 | if (newValue < minimum) { 63 | newValue = minimum; 64 | } else if (newValue > maximum) { 65 | newValue = maximum; 66 | } 67 | 68 | return newValue; 69 | } 70 | 71 | @Override 72 | public Integer32 modify(final Integer32 variable) { 73 | final int newValue = this.modify(variable.getValue(), minimum, maximum, minimumStep, maximumStep); 74 | log.trace("Counter32 variable {} will be tuned to {}", variable.getValue(), newValue); 75 | return new Integer32(newValue); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/ModifiedVariable.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.snmp4j.asn1.BERInputStream; 5 | import org.snmp4j.smi.OID; 6 | import org.snmp4j.smi.Variable; 7 | 8 | import java.io.IOException; 9 | import java.io.OutputStream; 10 | import java.util.Collections; 11 | import java.util.List; 12 | 13 | /** 14 | * A modified variable will change it's value on every value call. 15 | */ 16 | @Slf4j 17 | public class ModifiedVariable implements Variable, Cloneable { 18 | 19 | /** The list of modifiers that modify the {@link #variable}. */ 20 | private final List modifiers; 21 | 22 | /** The variable. */ 23 | private Variable variable; 24 | 25 | /** 26 | * Constructs a new modified variable. 27 | *
28 | * A modified variable will dynamically change it's value on each value call. 29 | * 30 | * @param variable the initial variable to modify 31 | * @param modifiers the list of modifiers that should modify this variable 32 | */ 33 | public ModifiedVariable(final Variable variable, final List modifiers) { 34 | this.variable = variable; 35 | this.modifiers = Collections.unmodifiableList(modifiers); 36 | } 37 | 38 | @Override 39 | public int compareTo(final Variable variable) { 40 | return this.variable.compareTo(variable); 41 | } 42 | 43 | @SuppressWarnings({"CloneDoesntCallSuperClone", "unchecked"}) 44 | @Override 45 | public Object clone() { 46 | log.trace("variable {} will be cloned", variable); 47 | for (final VariableModifier modifier : modifiers) { 48 | this.variable = modifier.modify(variable); 49 | } 50 | return this.variable.clone(); 51 | } 52 | 53 | @Override 54 | public int getSyntax() { 55 | log.trace("syntax of variable {} will be retrieved", variable); 56 | return variable.getSyntax(); 57 | } 58 | 59 | @Override 60 | public boolean isException() { 61 | log.trace("asking if variable {} is an exception", variable); 62 | return variable.isException(); 63 | } 64 | 65 | @Override 66 | public String toString() { 67 | log.trace("toString() called for variable {}", variable); 68 | return variable.toString(); 69 | } 70 | 71 | @Override 72 | public int toInt() { 73 | log.trace("integer value of variable {} will be returned", variable); 74 | return variable.toInt(); 75 | } 76 | 77 | @Override 78 | public long toLong() { 79 | log.trace("long value of variable {} will be returned", variable); 80 | return variable.toLong(); 81 | } 82 | 83 | @Override 84 | public String getSyntaxString() { 85 | log.trace("syntax string of variable {} will be retrieved", variable); 86 | return variable.getSyntaxString(); 87 | } 88 | 89 | @Override 90 | public OID toSubIndex(final boolean b) { 91 | return variable.toSubIndex(b); 92 | } 93 | 94 | @Override 95 | public void fromSubIndex(final OID oid, final boolean b) { 96 | variable.fromSubIndex(oid, b); 97 | } 98 | 99 | @Override 100 | public boolean isDynamic() { 101 | log.trace("asking if variable {} is dynamic", variable); 102 | return variable.isDynamic(); 103 | } 104 | 105 | @Override 106 | public int getBERLength() { 107 | log.trace("BER length of variable {} will be retrieved", variable); 108 | return variable.getBERLength(); 109 | } 110 | 111 | @Override 112 | public int getBERPayloadLength() { 113 | log.trace("BER payload length of variable {} will be retrieved", variable); 114 | return variable.getBERPayloadLength(); 115 | } 116 | 117 | @Override 118 | public void decodeBER(final BERInputStream berInputStream) throws IOException { 119 | log.trace("BER will be decoded for variable {}", variable); 120 | variable.decodeBER(berInputStream); 121 | } 122 | 123 | @Override 124 | public void encodeBER(final OutputStream outputStream) throws IOException { 125 | log.trace("BER will be encoded for variable {}", variable); 126 | variable.encodeBER(outputStream); 127 | } 128 | 129 | @Override 130 | public boolean equals(final Object o) { 131 | if (o instanceof ModifiedVariable) { 132 | return variable.equals(((ModifiedVariable) o).variable); 133 | } 134 | return variable.equals(o); 135 | } 136 | 137 | @Override 138 | public int hashCode() { 139 | return variable.hashCode(); 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/Modifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 5 | import com.oneandone.snmpman.configuration.type.WildcardOID; 6 | import com.oneandone.snmpman.exception.InitializationException; 7 | import lombok.Getter; 8 | import org.snmp4j.smi.OID; 9 | import org.snmp4j.smi.Variable; 10 | 11 | import java.lang.reflect.InvocationTargetException; 12 | 13 | /** 14 | * Representation of a generic modifier. 15 | *
16 | * See also {@link com.oneandone.snmpman.configuration.modifier.VariableModifier}. 17 | * 18 | * @param the variable type 19 | */ 20 | public class Modifier implements VariableModifier { 21 | 22 | /** The OID range {@code this} modifier should process. */ 23 | private final WildcardOID oid; 24 | 25 | /** 26 | * The wrapped variable modifier for this generic modifier. 27 | * 28 | * @return variable modifier. 29 | */ 30 | @Getter private final VariableModifier modifier; 31 | 32 | /** 33 | * Constructs a wrapped modifier. 34 | * 35 | * @param oid the wildcard OID to define the OID range {@code this} modifier should process 36 | * @param modifierClass the class of the modifier 37 | * @param properties the initialization properties 38 | */ 39 | @SuppressWarnings("unchecked") 40 | public Modifier(@JsonProperty("oid") final String oid, 41 | @JsonProperty("class") final String modifierClass, 42 | @JsonProperty("properties") final ModifierProperties properties) { 43 | this.oid = new WildcardOID(oid); 44 | 45 | try { 46 | this.modifier = (VariableModifier) Class.forName(modifierClass).getConstructor().newInstance(); 47 | this.modifier.init(properties); 48 | } catch (final ClassNotFoundException | NoSuchMethodException | InstantiationException | InvocationTargetException | IllegalAccessException e) { 49 | throw new InitializationException("could not construct a modifier for the oid " + oid + " and class " + modifierClass, e); 50 | } 51 | } 52 | 53 | /** 54 | * Returns {@code true} if this modifier is applicable for the specified {@code oid}, otherwise {@code false}. 55 | * 56 | * @param oid the oid to check 57 | * @return {@code true} if this modifier is applicable for the specified {@code oid}, otherwise {@code false} 58 | */ 59 | public boolean isApplicable(final OID oid) { 60 | return this.oid.matches(oid); 61 | } 62 | 63 | @Override 64 | public T modify(T variable) { 65 | return modifier.modify(variable); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/TimeTicksModifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import org.snmp4j.smi.TimeTicks; 4 | 5 | /** 6 | * This modifier instance modifies {@link TimeTicks} variables by the {@link #modify(TimeTicks)} method. 7 | *
8 | * This method will return a new {@link TimeTicks} instance with the current timestamp. 9 | */ 10 | public class TimeTicksModifier implements VariableModifier { 11 | 12 | /** The initialization time of {@code this} modifier. */ 13 | private final long initTime = System.currentTimeMillis(); 14 | 15 | @Override 16 | public TimeTicks modify(final TimeTicks variable) { 17 | TimeTicks timeTicks = new TimeTicks(); 18 | final long timeTicksInMilliseconds = variable.toMilliseconds(); 19 | final long upTime = (System.currentTimeMillis() - initTime) + timeTicksInMilliseconds; 20 | timeTicks.fromMilliseconds(timeTicksInMilliseconds + upTime); 21 | return timeTicks; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/UnsignedInteger32Modifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import org.snmp4j.smi.UnsignedInteger32; 4 | 5 | /** This modifier instance modifies {@link org.snmp4j.smi.UnsignedInteger32} variables. */ 6 | public class UnsignedInteger32Modifier extends AbstractIntegerModifier { 7 | 8 | @Override 9 | protected UnsignedInteger32 cast(long value) { 10 | return new UnsignedInteger32(value); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/VariableModifier.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import org.snmp4j.smi.Variable; 5 | 6 | /** Abstract definition of a variable modifier. 7 | * @param the variable type that gets modified by this instance. 8 | */ 9 | public interface VariableModifier { 10 | 11 | /** 12 | * Modifies the specified {@code variable} and returns a copy of it. 13 | * 14 | * @param variable the variable to modify 15 | * @return the modified variable 16 | */ 17 | T modify(final T variable); 18 | 19 | /** 20 | * Initialize {@code this} variable modifier by the specified {@code properties}. 21 | * 22 | * @param properties the initialization properties 23 | */ 24 | default void init(final ModifierProperties properties) { } 25 | } 26 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/modifier/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * This package contains all components to represent modified {@link org.snmp4j.smi.Variable}. 3 | *
4 | * In this context the so called modified variables are those which value change with every prompt. 5 | *
6 | * Every implementation of the {@link com.oneandone.snmpman.configuration.modifier.VariableModifier} can be used as a binding 7 | * modifier in a device configuration. 8 | * 9 | * @see com.oneandone.snmpman.configuration.Device 10 | */ 11 | package com.oneandone.snmpman.configuration.modifier; -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/package-info.java: -------------------------------------------------------------------------------- 1 | /** This package contains all classes as used for the configuration of the {@code Snmpman} application. */ 2 | package com.oneandone.snmpman.configuration; -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/type/ModifierProperties.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.type; 2 | 3 | import com.google.common.primitives.UnsignedLong; 4 | 5 | import java.util.Optional; 6 | import java.util.Properties; 7 | 8 | /** The modifier properties as used in {@link com.oneandone.snmpman.configuration.Device} for initialization. */ 9 | public class ModifierProperties extends Properties { 10 | 11 | /** 12 | * Returns the integer value for the specified property {@code key}. 13 | * 14 | * @param key the property key 15 | * @return the integer value for the specified key or {@code null} if not existing. 16 | * @throws java.lang.ClassCastException thrown if the value for the specified key could not be casted 17 | */ 18 | public Integer getInteger(final String key) { 19 | final Optional number = getNumber(key); 20 | return number.isPresent() ? number.get().intValue() : null; 21 | } 22 | 23 | /** 24 | * Returns the long value for the specified property {@code key}. 25 | * 26 | * @param key the property key 27 | * @return the long value for the specified key or {@code null} if not existing. 28 | * @throws java.lang.ClassCastException thrown if the value for the specified key could not be casted 29 | */ 30 | public Long getLong(final String key) { 31 | final Optional number = getNumber(key); 32 | return number.isPresent() ? number.get().longValue() : null; 33 | } 34 | 35 | /** 36 | * Returns the unsigned long value for the specified property {@code key}. 37 | * 38 | * @param key the property key 39 | * @return the unsigned long value for the specified key or {@code null} if not existing. 40 | * @throws java.lang.ClassCastException thrown if the value for the specified key could not be casted 41 | */ 42 | public UnsignedLong getUnsignedLong(final String key) { 43 | final Optional number = getNumber(key); 44 | return number.map(value -> UnsignedLong.valueOf(value.longValue())).orElse(null); 45 | } 46 | 47 | /** 48 | * Returns the number for the specified property {@code key}. 49 | * 50 | * @param key the property key 51 | * @return the optional number for the specified key. 52 | * @throws java.lang.ClassCastException thrown if the value for the specified key could not be casted 53 | */ 54 | private Optional getNumber(final String key) { 55 | if (this.containsKey(key)) { 56 | final Object value = this.get(key); 57 | if (value instanceof Number) { 58 | return Optional.of((Number) value); 59 | } else if (value instanceof String) { 60 | return Optional.of(Long.valueOf((String) value)); 61 | } else { 62 | throw new ClassCastException("property \"" + key + "\" is not a number"); 63 | } 64 | } 65 | return Optional.empty(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/type/WildcardOID.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.type; 2 | 3 | import com.google.common.base.Preconditions; 4 | import lombok.EqualsAndHashCode; 5 | import org.snmp4j.smi.OID; 6 | 7 | import java.util.regex.Matcher; 8 | import java.util.regex.Pattern; 9 | 10 | /** 11 | * A wildcard {@code OID} is an {@code OID} that can contain the wildcard character "*". 12 | *
13 | * The wildcard will be considered for matching request in the function {@link #matches(org.snmp4j.smi.OID)}. 14 | * Every sequence of {@code int} array chains can be considered for the wildcard character. 15 | *
16 | * Only one wildcard is allowed for the wildcard {@code OID}. 17 | */ 18 | @EqualsAndHashCode 19 | public class WildcardOID { 20 | 21 | /** The wildcard OID pattern. */ 22 | private static final Pattern WILDCARD_OID_PATTERN = Pattern.compile("((\\.)?[0-9]+(\\.[0-9]+)*)(\\.\\*)?((\\.[0-9]+)*)"); 23 | 24 | /** The first part of the wildcard {@code OID} (before the "{@code *}" character). */ 25 | private final OID startsWith; 26 | 27 | /** The second part of the wildcard {@code OID} (after the "{@code *}" character). Can be {@code null}. */ 28 | private final OID endsWith; 29 | 30 | /** 31 | * Constructs a new instance of this class. 32 | * 33 | * @param oid the {@code OID} that potentially contains a wildcard 34 | * @throws NullPointerException if the specified {@code OID} is null 35 | * @throws IllegalArgumentException if the specified {@code OID} contains more than one wildcard character 36 | */ 37 | public WildcardOID(final String oid) { 38 | Preconditions.checkNotNull(oid, "oid may not be null"); 39 | 40 | final Matcher matcher = WILDCARD_OID_PATTERN.matcher(oid); 41 | if (matcher.matches()) { 42 | this.startsWith = new OID(matcher.group(1)); 43 | if (matcher.group(5).isEmpty()) { 44 | this.endsWith = null; 45 | } else { 46 | this.endsWith = new OID(matcher.group(5)); 47 | } 48 | } else { 49 | throw new IllegalArgumentException("specified oid \"" + oid + "\" is not a valid wildcard"); 50 | } 51 | } 52 | 53 | /** 54 | * Returns {@code true} if this wildcard {@code OID} matches with the specified {@code OID}. 55 | *
56 | * Here some examples for matching {@code OID}s: 57 | *

    58 | *
  • {@code .1.3.3.*.7} and {@code .1.3.3.7}
  • 59 | *
  • {@code .1.3.3.*.7} and {@code .1.3.3.3.7}
  • 60 | *
  • {@code .1.3.3.*.7} and {@code .1.3.3.1.2.3.4.5.7}
  • 61 | *
62 | * 63 | * @param oid the {@code OID} to test 64 | * @return {@code true} if the {@code OID}s are matching, otherwise {@code false} 65 | */ 66 | public boolean matches(final OID oid) { 67 | return oid.startsWith(startsWith) && (endsWith == null || oid.size() >= endsWith.size() && oid.rightMostCompare(endsWith.size(), endsWith) == 0); 68 | } 69 | 70 | @Override 71 | public String toString() { 72 | if (endsWith == null) { 73 | return startsWith.toDottedString() + ".*"; 74 | } else { 75 | return startsWith.toDottedString() + ".*." + endsWith.toDottedString(); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/configuration/type/package-info.java: -------------------------------------------------------------------------------- 1 | /** Types as used by other configuration representations. */ 2 | package com.oneandone.snmpman.configuration.type; -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/exception/InitializationException.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.exception; 2 | 3 | /** Exception type defines the failed initialization of the application. */ 4 | public class InitializationException extends RuntimeException { 5 | 6 | /** The version number of this class. */ 7 | private static final long serialVersionUID = 1L; 8 | 9 | /** 10 | * Constructs a new exception. 11 | * 12 | * @param message the detail message 13 | */ 14 | public InitializationException(final String message) { 15 | super(message); 16 | } 17 | 18 | /** 19 | * Constructs a new exception. 20 | * 21 | * @param message the detail message 22 | * @param cause the exception cause 23 | */ 24 | public InitializationException(final String message, final Throwable cause) { 25 | super(message, cause); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/exception/package-info.java: -------------------------------------------------------------------------------- 1 | /** Application specific exception types. */ 2 | package com.oneandone.snmpman.exception; -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * The {@code Snmpman} is a command-line application that simulates {@code SNMP}-capable devices. 3 | *
4 | * It also can be used within Unit tests which require the usage of SNMP devices. You can start and stop all agents 5 | * with pre- and post unit-test execution methods, which are available in probably every Unit-Test framework. 6 | *
7 | * Check the documentation of {@link com.oneandone.snmpman.Snmpman} to get more information on the execution. 8 | */ 9 | package com.oneandone.snmpman; -------------------------------------------------------------------------------- /snmpman/src/main/java/com/oneandone/snmpman/snmp/MOGroup.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.snmp; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.snmp4j.agent.DefaultMOScope; 5 | import org.snmp4j.agent.MOScope; 6 | import org.snmp4j.agent.ManagedObject; 7 | import org.snmp4j.agent.request.SubRequest; 8 | import org.snmp4j.mp.SnmpConstants; 9 | import org.snmp4j.smi.Null; 10 | import org.snmp4j.smi.OID; 11 | import org.snmp4j.smi.Variable; 12 | 13 | import java.util.Iterator; 14 | import java.util.SortedMap; 15 | import java.util.TreeMap; 16 | 17 | @Slf4j 18 | public class MOGroup implements ManagedObject { 19 | 20 | /** 21 | * Sorted map of the variable bindings for this group. 22 | */ 23 | private final SortedMap variableBindings; 24 | 25 | /** 26 | * The root {@code OID} for this group. 27 | */ 28 | private final OID root; 29 | 30 | /** 31 | * The {@link MOScope} for this group. 32 | */ 33 | private final MOScope scope; 34 | 35 | /** 36 | * Constructs a new instance of this class. 37 | *
38 | * The specified {@code OID} and variable will be set as the only data stored 39 | * in the map of {@link #variableBindings}. 40 | * 41 | * @param root the root {@code OID} 42 | * @param oid the {@code OID} for a variable binding 43 | * @param variable the variable of the variable binding 44 | */ 45 | public MOGroup(final OID root, final OID oid, final Variable variable) { 46 | this.root = root; 47 | this.scope = new DefaultMOScope(root, true, root.nextPeer(), false); 48 | this.variableBindings = new TreeMap<>(); 49 | this.variableBindings.put(oid, variable); 50 | } 51 | 52 | /** 53 | * Constructs a new instance of this class. 54 | * 55 | * @param root the root {@code OID} 56 | * @param variableBindings the map of variable bindings for this instance 57 | */ 58 | public MOGroup(final OID root, final SortedMap variableBindings) { 59 | this.root = root; 60 | this.scope = new DefaultMOScope(root, true, root.nextPeer(), false); 61 | this.variableBindings = variableBindings; 62 | } 63 | 64 | @Override 65 | public MOScope getScope() { 66 | return scope; 67 | } 68 | 69 | @Override 70 | public OID find(final MOScope range) { 71 | final SortedMap tail = variableBindings.tailMap(range.getLowerBound()); 72 | final OID first = tail.firstKey(); 73 | if (range.getLowerBound().equals(first) && !range.isLowerIncluded()) { 74 | if (tail.size() > 1) { 75 | final Iterator it = tail.keySet().iterator(); 76 | it.next(); 77 | return it.next(); 78 | } 79 | } else { 80 | return first; 81 | } 82 | return null; 83 | } 84 | 85 | @Override 86 | public void get(final SubRequest request) { 87 | final OID oid = request.getVariableBinding().getOid(); 88 | final Variable variable = variableBindings.get(oid); 89 | if (variable == null) { 90 | request.getVariableBinding().setVariable(Null.noSuchInstance); 91 | } else { 92 | request.getVariableBinding().setVariable((Variable) variable.clone()); 93 | } 94 | request.completed(); 95 | } 96 | 97 | @Override 98 | public boolean next(final SubRequest request) { 99 | final MOScope scope = request.getQuery().getScope(); 100 | final SortedMap tail = variableBindings.tailMap(scope.getLowerBound()); 101 | OID first = tail.firstKey(); 102 | if (scope.getLowerBound().equals(first) && !scope.isLowerIncluded()) { 103 | if (tail.size() > 1) { 104 | final Iterator it = tail.keySet().iterator(); 105 | it.next(); 106 | first = it.next(); 107 | } else { 108 | return false; 109 | } 110 | } 111 | if (first != null) { 112 | final Variable variable = variableBindings.get(first); 113 | // TODO remove try / catch if no more errors occur 114 | // TODO add configuration check with types though (e.g. UInt32 == UInt32 Modifier?) 115 | try { 116 | if (variable == null) { 117 | request.getVariableBinding().setVariable(Null.noSuchInstance); 118 | } else { 119 | request.getVariableBinding().setVariable((Variable) variable.clone()); 120 | } 121 | request.getVariableBinding().setOid(first); 122 | } catch (IllegalArgumentException e) { 123 | if (variable != null) { 124 | log.error("error occurred on variable class " + variable.getClass().getName() + " with first OID " + first.toDottedString(), e); 125 | } 126 | } 127 | request.completed(); 128 | return true; 129 | } 130 | return false; 131 | } 132 | 133 | /** 134 | * Sets UnDo-Value for the OID to SubRequest which is replaced when commit fails. 135 | * 136 | * @param request The SubRequest to handle. 137 | */ 138 | @Override 139 | public void prepare(SubRequest request) { 140 | OID oid = request.getVariableBinding().getOid(); 141 | request.setUndoValue(variableBindings.get(oid)); 142 | request.getStatus().setPhaseComplete(true); 143 | } 144 | 145 | /** 146 | * If the prepare method doesn't set {@link org.snmp4j.agent.request.RequestStatus RequestStatus} to 147 | * {@link org.snmp4j.mp.SnmpConstants#SNMP_ERROR_SUCCESS SNMP_ERROR_SUCCESS} the new values are written. 148 | * Otherwise the commit fails and forces an undo operation. 149 | * 150 | * @param request The SubRequest to handle. 151 | */ 152 | @Override 153 | public void commit(final SubRequest request) { 154 | Variable newValue = request.getVariableBinding().getVariable(); 155 | OID oid = request.getVariableBinding().getOid(); 156 | if (variableBindings.getOrDefault(oid, newValue).getSyntax() == newValue.getSyntax()) { 157 | variableBindings.put(oid, newValue); 158 | } else { 159 | request.getStatus().setErrorStatus(SnmpConstants.SNMP_ERROR_INCONSISTENT_VALUE); 160 | } 161 | request.getStatus().setPhaseComplete(true); 162 | } 163 | 164 | /** 165 | * If any ErrorStatus, except the implicit {@link org.snmp4j.PDU#noError PDU.noError}, 166 | * has occurred during commit then the old values are written. 167 | * 168 | * @param request The SubRequest to handle. 169 | */ 170 | @Override 171 | public void undo(final SubRequest request) { 172 | if (request.getUndoValue() instanceof Variable) { 173 | variableBindings.put(request.getVariableBinding().getOid(), (Variable) request.getUndoValue()); 174 | } else { 175 | variableBindings.remove(request.getVariableBinding().getOid()); 176 | } 177 | request.getStatus().setPhaseComplete(true); 178 | } 179 | 180 | @Override 181 | public void cleanup(final SubRequest request) { 182 | // do nothing here 183 | } 184 | 185 | @Override 186 | public String toString() { 187 | return "MOGroup[" + 188 | "variableBindings=" + variableBindings + 189 | ", root=" + root + 190 | ", scope=" + scope + 191 | ']'; 192 | } 193 | } 194 | -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/AbstractSnmpmanTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman; 2 | 3 | import org.snmp4j.CommunityTarget; 4 | import org.snmp4j.PDU; 5 | import org.snmp4j.Snmp; 6 | import org.snmp4j.mp.SnmpConstants; 7 | import org.snmp4j.smi.Address; 8 | import org.snmp4j.smi.GenericAddress; 9 | import org.snmp4j.smi.OID; 10 | import org.snmp4j.smi.OctetString; 11 | import org.snmp4j.transport.DefaultUdpTransportMapping; 12 | import org.snmp4j.util.DefaultPDUFactory; 13 | import org.snmp4j.util.PDUFactory; 14 | import org.snmp4j.util.TableEvent; 15 | import org.snmp4j.util.TableUtils; 16 | import org.testng.annotations.AfterMethod; 17 | import org.testng.annotations.BeforeMethod; 18 | 19 | import java.io.File; 20 | import java.util.Arrays; 21 | import java.util.List; 22 | 23 | import static org.testng.Assert.assertTrue; 24 | import static org.testng.AssertJUnit.assertEquals; 25 | 26 | public abstract class AbstractSnmpmanTest { 27 | 28 | protected Snmpman snmpman; 29 | protected static final String COMMUNITY = "public"; 30 | protected static final int PORT = 10009; 31 | 32 | @BeforeMethod 33 | public void startSnmpman() { 34 | snmpman = Snmpman.start(new File("src/test/resources/configuration/configuration.yaml")); 35 | } 36 | 37 | @AfterMethod 38 | public void stopSnmpman() { 39 | snmpman.stop(); 40 | } 41 | 42 | 43 | public static boolean containsColumn(final List responses, final String oid, final String result) { 44 | for (final TableEvent e : responses) { 45 | String columnsToString = Arrays.toString(e.getColumns()); 46 | if (columnsToString.contains(oid) && columnsToString.contains("= " + result)) { 47 | return true; 48 | } 49 | } 50 | return false; 51 | } 52 | 53 | public static List getResponse(final OID query, int port, final String community) throws Exception { 54 | final Address targetAddress = GenericAddress.parse(String.format("127.0.0.1/%d", port)); 55 | final Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); 56 | snmp.listen(); 57 | 58 | final CommunityTarget target = getCommunityTarget(community, targetAddress); 59 | 60 | // creating PDU 61 | final PDUFactory pduFactory = new DefaultPDUFactory(PDU.GETBULK); 62 | final TableUtils utils = new TableUtils(snmp, pduFactory); 63 | 64 | return utils.getTable(target, new OID[]{query}, null, null); 65 | } 66 | 67 | static CommunityTarget getCommunityTarget(String community, Address targetAddress) { 68 | final CommunityTarget target = new CommunityTarget(); 69 | target.setCommunity(new OctetString(community)); 70 | target.setAddress(targetAddress); 71 | target.setRetries(2); 72 | target.setTimeout(1500); 73 | target.setVersion(SnmpConstants.version2c); 74 | return target; 75 | } 76 | 77 | public static List getResponse(final OID query, int port) throws Exception { 78 | return getResponse(query, port, COMMUNITY); 79 | } 80 | 81 | void assertThatOidHasValue(OID oid, String expectedValue) throws Exception { 82 | List responses1 = getResponse(oid, PORT); 83 | if (expectedValue.equals("null")) { 84 | assertEquals(Arrays.toString(responses1.get(0).getColumns()), expectedValue); 85 | } else { 86 | assertTrue(containsColumn(responses1, oid.toString(), expectedValue), 87 | "Table under OID=" + oid + " doesn't contain value=" + expectedValue); 88 | } 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/SnmpmanAgentTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman; 2 | 3 | import org.snmp4j.smi.OctetString; 4 | import org.testng.annotations.Test; 5 | 6 | import java.util.ArrayList; 7 | import java.util.Arrays; 8 | import java.util.List; 9 | 10 | import static org.testng.Assert.assertTrue; 11 | 12 | public class SnmpmanAgentTest extends AbstractSnmpmanTest { 13 | 14 | @Test 15 | public void testSnmpAgentSetupWithCommunityContext() { 16 | final List contexts = new ArrayList<>(); 17 | final List snmpmanAgents = snmpman.getAgents(); 18 | for (final SnmpmanAgent agent : snmpmanAgents) { 19 | agent.registerManagedObjects(); 20 | 21 | contexts.addAll(Arrays.asList(agent.getServer().getContexts())); 22 | } 23 | 24 | assertTrue(contexts.contains(new OctetString("9"))); 25 | assertTrue(contexts.contains(new OctetString("42"))); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/SnmpmanSetTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman; 2 | 3 | import org.snmp4j.CommunityTarget; 4 | import org.snmp4j.PDU; 5 | import org.snmp4j.Snmp; 6 | import org.snmp4j.event.ResponseEvent; 7 | import org.snmp4j.mp.SnmpConstants; 8 | import org.snmp4j.smi.GenericAddress; 9 | import org.snmp4j.smi.Integer32; 10 | import org.snmp4j.smi.OID; 11 | import org.snmp4j.smi.OctetString; 12 | import org.snmp4j.smi.Variable; 13 | import org.snmp4j.smi.VariableBinding; 14 | import org.snmp4j.transport.DefaultUdpTransportMapping; 15 | import org.testng.annotations.BeforeMethod; 16 | import org.testng.annotations.Test; 17 | 18 | import java.io.IOException; 19 | 20 | import static org.testng.Assert.assertEquals; 21 | 22 | /** 23 | * This tests based on an instance of {@see com.oneandone.snmpman.snmp.MOGroup MOGroup} which is filled with 24 | * {@see org.snmp4j.smi.Variable VariableBindings} generated from example.txt. 25 | * The PDU.SET command fails when the type or the scope of the variable is unsuited. 26 | */ 27 | public class SnmpmanSetTest extends AbstractSnmpmanTest { 28 | 29 | private static final OID OID_ROW_INDEX = new OID("10101"); 30 | private static final OID OID_OCTETSTRING = new OID(".1.3.6.1.2.1.31.1.1.1.1"); 31 | private static final String PRIMAL_OCTECT_VALUE = "Gi0/1"; 32 | private Snmp snmp; 33 | 34 | @BeforeMethod 35 | public void initSnmpSession() throws IOException { 36 | snmp = new Snmp(new DefaultUdpTransportMapping()); 37 | snmp.listen(); 38 | } 39 | 40 | @Test 41 | public void testSetterForValidValue() throws Exception { 42 | String newValue = "New interface"; 43 | ResponseEvent responseEvent = setVariableToOID(new OID(OID_OCTETSTRING).append(OID_ROW_INDEX), new OctetString(newValue)); 44 | assertEquals(SnmpConstants.SNMP_ERROR_SUCCESS, responseEvent.getResponse().getErrorStatus()); 45 | assertThatOidHasValue(OID_OCTETSTRING, newValue); 46 | } 47 | 48 | @Test 49 | public void testSetterForInvalidValue() throws Exception { 50 | Integer newValue = 9999; 51 | ResponseEvent responseEvent = setVariableToOID(new OID(OID_OCTETSTRING).append(OID_ROW_INDEX), new Integer32(newValue)); 52 | assertEquals(SnmpConstants.SNMP_ERROR_INCONSISTENT_VALUE, responseEvent.getResponse().getErrorStatus()); 53 | assertThatOidHasValue(OID_OCTETSTRING, PRIMAL_OCTECT_VALUE); 54 | } 55 | 56 | 57 | private ResponseEvent setVariableToOID(OID oid, Variable variable) throws IOException { 58 | 59 | final CommunityTarget target = getCommunityTarget(COMMUNITY, GenericAddress.parse(String.format("127.0.0.1/%d", PORT))); 60 | 61 | PDU pdu = new PDU(); 62 | pdu.setType(PDU.SET); 63 | 64 | VariableBinding variableBinding = new VariableBinding(oid); 65 | variableBinding.setVariable(variable); 66 | 67 | pdu.add(variableBinding); 68 | return snmp.set(pdu, target); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/SnmpmanTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman; 2 | 3 | import com.oneandone.snmpman.exception.InitializationException; 4 | import org.mockito.Mockito; 5 | import org.snmp4j.agent.BaseAgent; 6 | import org.snmp4j.smi.OID; 7 | import org.snmp4j.util.TableEvent; 8 | import org.testng.annotations.Test; 9 | 10 | import java.util.Collections; 11 | import java.util.List; 12 | 13 | import static org.testng.Assert.assertEquals; 14 | import static org.testng.Assert.assertNotEquals; 15 | import static org.testng.Assert.assertTrue; 16 | 17 | public class SnmpmanTest extends AbstractSnmpmanTest { 18 | 19 | @Test 20 | public void testSnmpGetBulk() throws Exception { 21 | assertEquals(snmpman.getAgents().size(), 11); 22 | 23 | List responses = getResponse(new OID("1.3.6.1.2.1"), 10000); 24 | assertEquals(responses.size(), 19); 25 | 26 | responses = getResponse(new OID("1.3.6.1.2.1.31"), 10000); 27 | assertEquals(responses.size(), 10); 28 | 29 | responses = getResponse(new OID(".1.3.6.1.2.1.2"), 10000); 30 | assertEquals(responses.size(), 7); 31 | 32 | responses = getResponse(new OID(".1.3"), 10010); 33 | assertEquals(responses.size(), 30); 34 | 35 | responses = getResponse(new OID(".1.0"), 10010); 36 | assertEquals(responses.size(), 8); 37 | } 38 | 39 | @Test 40 | public void testWithCommunityIndex() throws Exception { 41 | assertEquals(snmpman.getAgents().size(), 11); 42 | 43 | final String oid = "1.3.6.1.2.1.17.2.4"; 44 | List responses1 = getResponse(new OID(oid), PORT, "public@42"); 45 | assertEquals(responses1.size(), 1); 46 | assertTrue(containsColumn(responses1, oid, "150")); 47 | 48 | List responses2 = getResponse(new OID(oid), PORT, "public@9"); 49 | assertEquals(responses2.size(), 1); 50 | assertTrue(containsColumn(responses2, oid, "120")); 51 | 52 | List responses3 = getResponse(new OID(oid), PORT, COMMUNITY); 53 | assertEquals(responses3.size(), 1); 54 | assertTrue(containsColumn(responses3, oid, "0")); 55 | } 56 | 57 | @Test(expectedExceptions = InitializationException.class) 58 | public void startWithAlreadyStoppedAgent() { 59 | final SnmpmanAgent mock = Mockito.mock(SnmpmanAgent.class); 60 | Mockito.when(mock.getAgentState()).thenReturn(BaseAgent.STATE_STOPPED); 61 | 62 | final List snmpmanAgents = Collections.singletonList(mock); 63 | Snmpman.start(snmpmanAgents); 64 | } 65 | 66 | @Test 67 | public void testModifier() throws Exception { 68 | final String oid = "1.3.6.1.2.1.2.2.1.13"; 69 | List responses1 = SnmpmanTest.getResponse(new OID(oid), PORT, COMMUNITY); 70 | List responses2 = SnmpmanTest.getResponse(new OID(oid), PORT, COMMUNITY); 71 | 72 | assertNotEquals(responses1.get(0).getColumns(), responses2.get(0).getColumns(), 73 | "repeated call should return a different result"); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/AgentConfigurationTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | import java.io.File; 6 | 7 | import static org.testng.Assert.assertEquals; 8 | 9 | public class AgentConfigurationTest { 10 | 11 | @Test 12 | public void testInitialization() { 13 | final AgentConfiguration configuration = new AgentConfiguration( 14 | "Test", 15 | new File("src/test/resources/configuration/cisco.yaml"), 16 | new File("src/test/resources/configuration/example.txt"), 17 | "127.0.0.1", 8080, 18 | "secret"); 19 | 20 | assertEquals(configuration.getName(), "Test"); 21 | assertEquals(configuration.getWalk(), new File("src/test/resources/configuration/example.txt")); 22 | assertEquals(configuration.getCommunity(), "secret"); 23 | assertEquals(configuration.getDevice().getName(), "Cisco"); 24 | assertEquals(configuration.getAddress().toByteArray(), new byte[]{ 127, 0, 0, 1 }); 25 | } 26 | 27 | @Test 28 | public void testInitializationWithoutName() { 29 | final AgentConfiguration configuration = new AgentConfiguration( 30 | null, 31 | new File("src/test/resources/configuration/cisco.yaml"), 32 | new File("src/test/resources/configuration/example.txt"), 33 | "127.0.0.1", 8080, 34 | "secret"); 35 | 36 | assertEquals(configuration.getName(), "127.0.0.1:8080"); 37 | assertEquals(configuration.getWalk(), new File("src/test/resources/configuration/example.txt")); 38 | assertEquals(configuration.getCommunity(), "secret"); 39 | assertEquals(configuration.getDevice().getName(), "Cisco"); 40 | assertEquals(configuration.getAddress().toByteArray(), new byte[]{ 127, 0, 0, 1 }); 41 | } 42 | 43 | @Test 44 | public void testInitializationWithoutDevice() { 45 | final AgentConfiguration configuration = new AgentConfiguration( 46 | "Test", 47 | null, 48 | new File("src/test/resources/configuration/example.txt"), 49 | "127.0.0.1", 8080, 50 | "secret"); 51 | 52 | assertEquals(configuration.getName(), "Test"); 53 | assertEquals(configuration.getWalk(), new File("src/test/resources/configuration/example.txt")); 54 | assertEquals(configuration.getCommunity(), "secret"); 55 | assertEquals(configuration.getDevice(), AgentConfiguration.DeviceFactory.DEFAULT_DEVICE); 56 | assertEquals(configuration.getAddress().toByteArray(), new byte[]{ 127, 0, 0, 1 }); 57 | } 58 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/DeviceFactoryTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | import java.io.File; 6 | 7 | import static org.testng.Assert.*; 8 | 9 | public class DeviceFactoryTest { 10 | 11 | @Test 12 | public void testGetDeviceForNullPath() { 13 | final AgentConfiguration.DeviceFactory deviceFactory = new AgentConfiguration.DeviceFactory(); 14 | assertEquals(deviceFactory.getDevice(null), AgentConfiguration.DeviceFactory.DEFAULT_DEVICE); 15 | } 16 | 17 | @Test 18 | public void testGetDeviceForNonExistentPath() { 19 | final AgentConfiguration.DeviceFactory deviceFactory = new AgentConfiguration.DeviceFactory(); 20 | assertEquals(deviceFactory.getDevice(new File("src/foo/bar/what.txt")), AgentConfiguration.DeviceFactory.DEFAULT_DEVICE); 21 | } 22 | 23 | @Test 24 | public void testGetCiscoDevice() { 25 | final AgentConfiguration.DeviceFactory deviceFactory = new AgentConfiguration.DeviceFactory(); 26 | final Device ciscoDevice = deviceFactory.getDevice(new File("src/test/resources/configuration/cisco.yaml")); 27 | 28 | assertNotEquals(ciscoDevice, AgentConfiguration.DeviceFactory.DEFAULT_DEVICE); 29 | 30 | assertEquals(ciscoDevice.getName(), "Cisco"); 31 | assertEquals(ciscoDevice.toString(), "Device(name=Cisco)"); 32 | assertFalse(ciscoDevice.getModifiers().isEmpty()); 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/DeviceTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration; 2 | 3 | import com.oneandone.snmpman.configuration.modifier.Counter32Modifier; 4 | import com.oneandone.snmpman.configuration.modifier.Modifier; 5 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 6 | import org.testng.annotations.Test; 7 | 8 | import static org.testng.Assert.assertEquals; 9 | import static org.testng.Assert.assertTrue; 10 | 11 | public class DeviceTest { 12 | 13 | @Test 14 | public void testInitialization() { 15 | final Device device = new Device("Test", new Modifier[0], null); 16 | 17 | assertEquals(device.getName(), "Test"); 18 | assertTrue(device.getModifiers().isEmpty()); 19 | } 20 | 21 | @Test(expectedExceptions = { UnsupportedOperationException.class }) 22 | public void testImmutability() { 23 | final Device device = new Device("Test", new Modifier[0], null); 24 | 25 | device.getModifiers().add(new Modifier(".1.2.3", Counter32Modifier.class.getName(), new ModifierProperties())); 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/WalksTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration; 2 | 3 | import org.snmp4j.smi.Counter64; 4 | import org.snmp4j.smi.Gauge32; 5 | import org.snmp4j.smi.OID; 6 | import org.snmp4j.smi.OctetString; 7 | import org.snmp4j.smi.Variable; 8 | import org.testng.annotations.AfterMethod; 9 | import org.testng.annotations.BeforeMethod; 10 | import org.testng.annotations.Test; 11 | 12 | import java.io.IOException; 13 | import java.nio.file.Files; 14 | import java.nio.file.Path; 15 | import java.util.Arrays; 16 | import java.util.Collections; 17 | import java.util.HashMap; 18 | import java.util.Map; 19 | 20 | import static org.testng.Assert.assertEquals; 21 | 22 | public class WalksTest { 23 | private Path tmpFile; 24 | 25 | @BeforeMethod 26 | public void setUp() throws IOException { 27 | tmpFile = Files.createTempFile("snmpman", "walk"); 28 | } 29 | 30 | @AfterMethod 31 | public void tearDown() { 32 | if (tmpFile != null) { 33 | tmpFile.toFile().delete(); 34 | } 35 | } 36 | 37 | @Test 38 | public void readWalkWithEmptyFile() throws IOException { 39 | Map walk = Walks.readWalk(tmpFile.toFile()); 40 | assertEquals(walk, Collections.emptyMap()); 41 | } 42 | 43 | @Test 44 | public void readWalkWithStringLine() throws IOException { 45 | Files.write(tmpFile, Collections.singletonList(".1.3.6.1.2.1.2.2.1.2.10101 = STRING: \"GigabitEthernet0/1\"")); 46 | Map walk = Walks.readWalk(tmpFile.toFile()); 47 | assertEquals(walk, Collections.singletonMap( 48 | new OID(".1.3.6.1.2.1.2.2.1.2.10101"), 49 | new OctetString("GigabitEthernet0/1"))); 50 | } 51 | 52 | @Test 53 | public void readWalkWithFourStringLine() throws IOException { 54 | Files.write(tmpFile, Arrays.asList( 55 | ".1.0.8802.1.1.2.1.3.4.0 = STRING: \"Cisco IOS Software, C3560 Software (C3560-IPBASEK9-M), Version 12.2(50)SE3, RELEASE SOFTWARE (fc1)", 56 | "Technical Support: http://www.cisco.com/techsupport", 57 | "Copyright (c) 1986-2009 by Cisco Systems, Inc.", 58 | "Compiled Wed 22-Jul-09 06:41 by prod_rel_team\"")); 59 | Map walk = Walks.readWalk(tmpFile.toFile()); 60 | String expected = "Cisco IOS Software, C3560 Software (C3560-IPBASEK9-M), Version 12.2(50)SE3, RELEASE SOFTWARE (fc1)\n" + 61 | "Technical Support: http://www.cisco.com/techsupport\n" + 62 | "Copyright (c) 1986-2009 by Cisco Systems, Inc.\n" + 63 | "Compiled Wed 22-Jul-09 06:41 by prod_rel_team"; 64 | assertEquals(walk, Collections.singletonMap( 65 | new OID(".1.0.8802.1.1.2.1.3.4.0"), 66 | new OctetString(expected))); 67 | } 68 | 69 | @Test 70 | public void readWalkWithHexStringLine() throws IOException { 71 | Files.write(tmpFile, Collections.singletonList(".1.3.6.1.4.1.9.9.683.1.5.0 = Hex-STRING: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f")); 72 | Map walk = Walks.readWalk(tmpFile.toFile()); 73 | byte[] expected = new byte[16]; 74 | for (int i = 0; i < 16; i++) { 75 | expected[i] = (byte) i; 76 | } 77 | assertEquals(walk, Collections.singletonMap( 78 | new OID(".1.3.6.1.4.1.9.9.683.1.5.0"), 79 | new OctetString(expected))); 80 | } 81 | 82 | @Test 83 | public void readWalkWithIsoOid() throws IOException { 84 | Files.write(tmpFile, Collections.singletonList("iso.3.6.1.4.1.9.9.683.1.5.0 = Hex-STRING: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f")); 85 | Map walk = Walks.readWalk(tmpFile.toFile()); 86 | byte[] expected = new byte[16]; 87 | for (int i = 0; i < 16; i++) { 88 | expected[i] = (byte) i; 89 | } 90 | assertEquals(walk, Collections.singletonMap( 91 | new OID(".1.3.6.1.4.1.9.9.683.1.5.0"), 92 | new OctetString(expected))); 93 | } 94 | 95 | @Test 96 | public void readWalkWithTwoHexStringLine() throws IOException { 97 | Files.write(tmpFile, Arrays.asList( 98 | ".1.3.6.1.4.1.9.9.683.1.5.0 = Hex-STRING: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f", 99 | "10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f")); 100 | Map walk = Walks.readWalk(tmpFile.toFile()); 101 | byte[] expected = new byte[32]; 102 | for (int i = 0; i < 32; i++) { 103 | expected[i] = (byte) i; 104 | } 105 | assertEquals(walk, Collections.singletonMap( 106 | new OID(".1.3.6.1.4.1.9.9.683.1.5.0"), 107 | new OctetString(expected))); 108 | } 109 | 110 | @Test 111 | public void readWalkWithMultipleKeys() throws IOException { 112 | Files.write(tmpFile, Arrays.asList( 113 | ".1.3.6.1.2.1.2.2.1.2.10101 = STRING: \"GigabitEthernet0/1\"", 114 | ".1.3.6.1.2.1.31.1.1.1.1.10101 = STRING: \"Gi0/1\"", 115 | ".1.3.6.1.2.1.31.1.1.1.10.10101 = Counter64: 48648257581", 116 | ".1.3.6.1.2.1.31.1.1.1.11.10101 = Counter64: 32038868", 117 | ".1.3.6.1.2.1.31.1.1.1.12.10101 = Counter64: 141915228", 118 | ".1.3.6.1.2.1.31.1.1.1.13.10101 = Counter64: 44011328", 119 | ".1.3.6.1.2.1.31.1.1.1.15.10101 = Gauge32: 1000", 120 | ".1.3.6.1.2.1.2.2.1.5.10101 = Gauge32: 1000000000" 121 | )); 122 | Map walk = Walks.readWalk(tmpFile.toFile()); 123 | Map expected = new HashMap<>(); 124 | expected.put(new OID(".1.3.6.1.2.1.2.2.1.2.10101"), new OctetString("GigabitEthernet0/1")); 125 | expected.put(new OID(".1.3.6.1.2.1.31.1.1.1.1.10101"), new OctetString("Gi0/1")); 126 | expected.put(new OID(".1.3.6.1.2.1.31.1.1.1.10.10101"), new Counter64(48648257581L)); 127 | expected.put(new OID(".1.3.6.1.2.1.31.1.1.1.11.10101"), new Counter64(32038868L)); 128 | expected.put(new OID(".1.3.6.1.2.1.31.1.1.1.12.10101"), new Counter64(141915228L)); 129 | expected.put(new OID(".1.3.6.1.2.1.31.1.1.1.13.10101"), new Counter64(44011328)); 130 | expected.put(new OID(".1.3.6.1.2.1.31.1.1.1.15.10101"), new Gauge32(1000)); 131 | expected.put(new OID(".1.3.6.1.2.1.2.2.1.5.10101"), new Gauge32(1000000000)); 132 | 133 | assertEquals(walk, expected); 134 | } 135 | 136 | @Test 137 | public void readWalkWithInvalidLine() throws IOException { 138 | Files.write(tmpFile, Collections.singletonList("this is just an example")); 139 | Map walk = Walks.readWalk(tmpFile.toFile()); 140 | assertEquals(walk, Collections.emptyMap()); 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/AbstractIntegerModifierTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import org.testng.annotations.Test; 5 | 6 | import static org.testng.Assert.assertEquals; 7 | 8 | public class AbstractIntegerModifierTest { 9 | 10 | @Test(expectedExceptions = { IllegalArgumentException.class }) 11 | public void testIllegalInitParameterMinimum() { 12 | final ModifierProperties modifierProperties = new ModifierProperties(); 13 | modifierProperties.put("minimum", -1); 14 | modifierProperties.put("maximum", 3000); 15 | modifierProperties.put("minimumStep", 1); 16 | modifierProperties.put("maximumStep", 10); 17 | 18 | final Gauge32Modifier modifier = new Gauge32Modifier(); 19 | modifier.init(modifierProperties); 20 | } 21 | 22 | @Test(expectedExceptions = { IllegalArgumentException.class }) 23 | public void testIllegalInitParameterMaximum() { 24 | final ModifierProperties modifierProperties = new ModifierProperties(); 25 | modifierProperties.put("minimum", 0); 26 | modifierProperties.put("maximum", -1); 27 | modifierProperties.put("minimumStep", 1); 28 | modifierProperties.put("maximumStep", 10); 29 | 30 | final Gauge32Modifier modifier = new Gauge32Modifier(); 31 | modifier.init(modifierProperties); 32 | } 33 | 34 | @Test 35 | public void testProperties() { 36 | final ModifierProperties modifierProperties = new ModifierProperties(); 37 | modifierProperties.put("minimum", 0); 38 | modifierProperties.put("maximum", 10); 39 | modifierProperties.put("minimumStep", 1); 40 | modifierProperties.put("maximumStep", 10); 41 | 42 | final Gauge32Modifier modifier = new Gauge32Modifier(); 43 | modifier.init(modifierProperties); 44 | 45 | assertEquals(modifier.getMinimum(), 0); 46 | assertEquals(modifier.getMaximum(), 10); 47 | assertEquals(modifier.getMinimumStep(), 1); 48 | assertEquals(modifier.getMaximumStep(), 10); 49 | } 50 | 51 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/CommunityIndexCounter32ModifierTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import org.snmp4j.smi.Counter32; 5 | import org.snmp4j.smi.OID; 6 | import org.snmp4j.smi.OctetString; 7 | import org.snmp4j.smi.Variable; 8 | import org.testng.annotations.BeforeTest; 9 | import org.testng.annotations.Test; 10 | 11 | import java.util.Collections; 12 | import java.util.Map; 13 | 14 | import static org.testng.Assert.assertEquals; 15 | import static org.testng.Assert.assertTrue; 16 | 17 | public class CommunityIndexCounter32ModifierTest { 18 | private ModifierProperties modifierProperties; 19 | private long context1; 20 | private long contextValue1; 21 | private long context2; 22 | private long contextValue2; 23 | private static final String OID = "1.3.6.1.2.1.17.2.4.0"; 24 | 25 | @BeforeTest 26 | private void setUp() { 27 | context1 = 20; 28 | contextValue1 = 150; 29 | context2 = 9; 30 | contextValue2 = 120; 31 | modifierProperties = new ModifierProperties(); 32 | modifierProperties.put(context1, contextValue1); 33 | modifierProperties.put(context2, contextValue2); 34 | } 35 | 36 | @Test 37 | public void testInit() { 38 | final CommunityIndexCounter32Modifier modifier = new CommunityIndexCounter32Modifier(); 39 | modifier.init(modifierProperties); 40 | 41 | final Map communityIndexValues = modifier.getCommunityContextMapping(); 42 | assertEquals(communityIndexValues.size(), 2); 43 | assertTrue(communityIndexValues.containsKey(context1) && communityIndexValues.containsValue(contextValue1)); 44 | assertTrue(communityIndexValues.containsKey(context2) && communityIndexValues.containsValue(contextValue2)); 45 | 46 | // unchanged 47 | modifierProperties.put("maximum", Collections.singletonMap("1.3.6", 172L)); 48 | final CommunityIndexCounter32Modifier modifier2 = new CommunityIndexCounter32Modifier(); 49 | modifier2.init(modifierProperties); 50 | 51 | final Map communityIndexValues2 = modifier.getCommunityContextMapping(); 52 | assertEquals(communityIndexValues2.size(), 2); 53 | assertTrue(communityIndexValues2.containsKey(context1) && communityIndexValues2.containsValue(contextValue1)); 54 | assertTrue(communityIndexValues2.containsKey(context2) && communityIndexValues2.containsValue(contextValue2)); 55 | } 56 | 57 | @Test 58 | public void testModify() { 59 | final CommunityIndexCounter32Modifier modifier = new CommunityIndexCounter32Modifier(); 60 | modifier.init(modifierProperties); 61 | 62 | final Counter32 counter32 = new Counter32(contextValue1); 63 | assertEquals(counter32.getValue(), contextValue1); 64 | 65 | final Counter32 modifiedVariable = modifier.modify(counter32); 66 | assertEquals(modifiedVariable.getValue(), contextValue1); 67 | 68 | final Counter32 modifiedVariable2 = modifier.modify(null); 69 | assertEquals(modifiedVariable2, new Counter32(0L)); 70 | } 71 | 72 | @Test 73 | public void testGetVariableBindings() { 74 | final CommunityIndexCounter32Modifier modifier = new CommunityIndexCounter32Modifier(); 75 | modifier.init(modifierProperties); 76 | 77 | final OctetString context1 = new OctetString("20"); 78 | final OID queryOID1 = new OID(OID); 79 | final Map variableBindings1 = modifier.getVariableBindings(context1, queryOID1); 80 | 81 | assertEquals(variableBindings1.size(), 1); 82 | assertEquals(variableBindings1.get(queryOID1), new Counter32(150L)); 83 | 84 | final OctetString context2 = new OctetString("23"); 85 | final OID queryOID2 = new OID("1.3.6"); 86 | final Map variableBindings2 = modifier.getVariableBindings(context2, queryOID2); 87 | 88 | assertEquals(variableBindings2.size(), 0, "bindings with not initialized context should be empty"); 89 | 90 | final OctetString context3 = null; 91 | final OID queryOID3 = new OID("1.3.6"); 92 | final Map variableBindings3 = modifier.getVariableBindings(context3, queryOID3); 93 | 94 | assertEquals(variableBindings3.size(), 1); 95 | assertEquals(variableBindings3.get(queryOID3), new Counter32(0L), "bindings with null context should be 0"); 96 | 97 | final OctetString context4 = new OctetString(); 98 | final OID queryOID4 = new OID("1.3.6"); 99 | final Map variableBindings4 = modifier.getVariableBindings(context4, queryOID4); 100 | 101 | assertEquals(variableBindings4.size(), 1); 102 | assertEquals(variableBindings4.get(queryOID4), new Counter32(0L), "bindings with empty context should be 0"); 103 | 104 | final OctetString context5 = new OctetString("20"); 105 | final OID queryOID5 = null; 106 | final Map variableBindings5 = modifier.getVariableBindings(context5, queryOID5); 107 | 108 | assertEquals(variableBindings5.size(), 0, "bindings with null query OID should be empty"); 109 | } 110 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/Counter32ModifierTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import org.snmp4j.smi.Counter32; 5 | import org.testng.annotations.Test; 6 | 7 | import static org.testng.Assert.assertEquals; 8 | import static org.testng.Assert.assertNotEquals; 9 | 10 | public class Counter32ModifierTest { 11 | 12 | @Test 13 | public void testModify() { 14 | final ModifierProperties modifierProperties = new ModifierProperties(); 15 | modifierProperties.put("minimum", 0); 16 | modifierProperties.put("maximum", 3000); 17 | modifierProperties.put("minimumStep", 1); 18 | modifierProperties.put("maximumStep", 10); 19 | 20 | final Counter32Modifier modifier = new Counter32Modifier(); 21 | modifier.init(modifierProperties); 22 | 23 | final Counter32 counter32 = new Counter32(0); 24 | assertEquals(counter32.getValue(), 0); 25 | 26 | final Counter32 modifiedVariable = modifier.modify(counter32); 27 | assertNotEquals(modifiedVariable.getValue(), 0); 28 | 29 | // another modification should return another result 30 | final Counter32 modifiedVariable2 = modifier.modify(modifiedVariable); 31 | assertNotEquals(modifiedVariable.getValue(), 0); 32 | assertNotEquals(modifiedVariable2.getValue(), modifiedVariable.getValue()); 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/Counter64ModifierTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.google.common.primitives.UnsignedLong; 4 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 5 | import org.snmp4j.smi.Counter64; 6 | import org.testng.annotations.Test; 7 | 8 | import static org.testng.Assert.assertEquals; 9 | import static org.testng.Assert.assertNotEquals; 10 | 11 | public class Counter64ModifierTest { 12 | 13 | @Test 14 | public void testProperties() { 15 | final ModifierProperties modifierProperties = new ModifierProperties(); 16 | modifierProperties.put("minimum", UnsignedLong.ZERO); 17 | modifierProperties.put("maximum", UnsignedLong.valueOf(10L)); 18 | modifierProperties.put("minimumStep", UnsignedLong.valueOf(1L)); 19 | modifierProperties.put("maximumStep", UnsignedLong.valueOf(10L)); 20 | 21 | final Counter64Modifier modifier = new Counter64Modifier(); 22 | modifier.init(modifierProperties); 23 | 24 | assertEquals(modifier.getMinimum(), UnsignedLong.ZERO); 25 | assertEquals(modifier.getMaximum(), UnsignedLong.valueOf(10L)); 26 | assertEquals(modifier.getMinimumStep(), UnsignedLong.valueOf(1L)); 27 | assertEquals(modifier.getMaximumStep(), UnsignedLong.valueOf(10L)); 28 | } 29 | 30 | @Test 31 | public void testModify() { 32 | final ModifierProperties modifierProperties = new ModifierProperties(); 33 | modifierProperties.put("minimum", UnsignedLong.ZERO); 34 | modifierProperties.put("maximum", UnsignedLong.valueOf(10L)); 35 | modifierProperties.put("minimumStep", UnsignedLong.valueOf(1L)); 36 | modifierProperties.put("maximumStep", UnsignedLong.valueOf(10L)); 37 | 38 | final Counter64Modifier modifier = new Counter64Modifier(); 39 | modifier.init(modifierProperties); 40 | 41 | final Counter64 counter64 = new Counter64(0); 42 | assertEquals(counter64.getValue(), 0); 43 | 44 | final Counter64 modifiedVariable = modifier.modify(counter64); 45 | assertNotEquals(modifiedVariable.getValue(), 0); 46 | } 47 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/Gauge32ModifierTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import org.snmp4j.smi.Gauge32; 5 | import org.testng.annotations.Test; 6 | 7 | import static org.testng.Assert.assertEquals; 8 | import static org.testng.Assert.assertNotEquals; 9 | 10 | public class Gauge32ModifierTest { 11 | 12 | @Test 13 | public void testModify() { 14 | final ModifierProperties modifierProperties = new ModifierProperties(); 15 | modifierProperties.put("minimum", 0); 16 | modifierProperties.put("maximum", 3000); 17 | modifierProperties.put("minimumStep", 1); 18 | modifierProperties.put("maximumStep", 10); 19 | 20 | final Gauge32Modifier modifier = new Gauge32Modifier(); 21 | modifier.init(modifierProperties); 22 | 23 | final Gauge32 gauge32 = new Gauge32(0); 24 | assertEquals(gauge32.getValue(), 0); 25 | 26 | final Gauge32 modifiedVariable = modifier.modify(gauge32); 27 | assertNotEquals(modifiedVariable.getValue(), 0); 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/Integer32ModifierTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import org.snmp4j.smi.Integer32; 5 | import org.testng.annotations.Test; 6 | 7 | import static org.testng.Assert.assertEquals; 8 | import static org.testng.Assert.assertNotEquals; 9 | 10 | public class Integer32ModifierTest { 11 | 12 | @Test 13 | public void testModify() { 14 | final ModifierProperties modifierProperties = new ModifierProperties(); 15 | modifierProperties.put("minimum", Integer.MIN_VALUE); 16 | modifierProperties.put("maximum", Integer.MAX_VALUE); 17 | modifierProperties.put("minimumStep", 1); 18 | modifierProperties.put("maximumStep", 10); 19 | 20 | final Integer32Modifier modifier = new Integer32Modifier(); 21 | modifier.init(modifierProperties); 22 | 23 | final Integer32 integer32 = new Integer32(0); 24 | assertEquals(integer32.getValue(), 0); 25 | 26 | final Integer32 modifiedVariable = modifier.modify(integer32); 27 | assertNotEquals(modifiedVariable.getValue(), 0); 28 | } 29 | 30 | @Test 31 | public void testProperties() { 32 | final ModifierProperties modifierProperties = new ModifierProperties(); 33 | modifierProperties.put("minimum", Integer.MIN_VALUE); 34 | modifierProperties.put("maximum", Integer.MAX_VALUE); 35 | modifierProperties.put("minimumStep", 1); 36 | modifierProperties.put("maximumStep", 10); 37 | 38 | final Integer32Modifier modifier = new Integer32Modifier(); 39 | modifier.init(modifierProperties); 40 | 41 | assertEquals(modifier.getMinimum(), Integer.valueOf(Integer.MIN_VALUE)); 42 | assertEquals(modifier.getMaximum(), Integer.valueOf(Integer.MAX_VALUE)); 43 | assertEquals(modifier.getMinimumStep(), Integer.valueOf(1)); 44 | assertEquals(modifier.getMaximumStep(), Integer.valueOf(10)); 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/ModifiedVariableTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import org.snmp4j.smi.Integer32; 5 | import org.snmp4j.smi.Variable; 6 | import org.testng.annotations.BeforeMethod; 7 | import org.testng.annotations.Test; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | import static org.testng.Assert.*; 13 | 14 | public class ModifiedVariableTest { 15 | 16 | private Variable variable; 17 | private Variable otherVariable; 18 | private ModifiedVariable modifiedVariable; 19 | 20 | @BeforeMethod 21 | public void setUp() { 22 | variable = new Integer32(0); 23 | otherVariable = new Integer32(1); 24 | 25 | List modifiers = new ArrayList<>(1); 26 | 27 | final ModifierProperties modifierProperties = new ModifierProperties(); 28 | modifierProperties.put("minimum", Integer.MIN_VALUE); 29 | modifierProperties.put("maximum", Integer.MAX_VALUE); 30 | modifierProperties.put("minimumStep", 1); 31 | modifierProperties.put("maximumStep", 10); 32 | 33 | final Integer32Modifier modifier = new Integer32Modifier(); 34 | modifier.init(modifierProperties); 35 | 36 | modifiers.add(modifier); 37 | 38 | modifiedVariable = new ModifiedVariable(variable, modifiers); 39 | } 40 | 41 | @Test 42 | public void testCompareTo() { 43 | assertEquals(variable.compareTo(otherVariable), modifiedVariable.compareTo(otherVariable)); 44 | } 45 | 46 | @Test 47 | public void testClone() { 48 | final Object clonedVariable = modifiedVariable.clone(); 49 | assertNotSame(clonedVariable, modifiedVariable); 50 | assertTrue(clonedVariable instanceof Integer32); 51 | 52 | assertNotEquals(((Integer32) clonedVariable).getValue(), ((Integer32) variable).getValue()); 53 | } 54 | 55 | @Test 56 | public void testGetSyntax() { 57 | assertEquals(modifiedVariable.getSyntax(), variable.getSyntax()); 58 | } 59 | 60 | @Test 61 | public void testIsException() { 62 | assertEquals(modifiedVariable.isException(), variable.isException()); 63 | } 64 | 65 | @Test 66 | public void testToString() { 67 | assertEquals(modifiedVariable.toString(), variable.toString()); 68 | } 69 | 70 | @Test 71 | public void testToInt() { 72 | assertEquals(modifiedVariable.toInt(), variable.toInt()); 73 | } 74 | 75 | @Test 76 | public void testToLong() { 77 | assertEquals(modifiedVariable.toLong(), variable.toLong()); 78 | } 79 | 80 | @Test 81 | public void testGetSyntaxString() { 82 | assertEquals(modifiedVariable.getSyntaxString(), variable.getSyntaxString()); 83 | } 84 | 85 | @Test 86 | public void testToSubIndex() { 87 | assertEquals(modifiedVariable.toSubIndex(true), variable.toSubIndex(true)); 88 | assertEquals(modifiedVariable.toSubIndex(false), variable.toSubIndex(false)); 89 | } 90 | 91 | @Test 92 | public void testIsDynamic() { 93 | assertEquals(modifiedVariable.isDynamic(), variable.isDynamic()); 94 | } 95 | 96 | @Test 97 | public void testGetBERLength() { 98 | assertEquals(modifiedVariable.getBERLength(), variable.getBERLength()); 99 | } 100 | 101 | @Test 102 | public void testGetBERPayloadLength() { 103 | assertEquals(modifiedVariable.getBERPayloadLength(), variable.getBERPayloadLength()); 104 | } 105 | 106 | @Test 107 | public void testEquals() { 108 | assertTrue(modifiedVariable.equals(modifiedVariable)); 109 | assertTrue(modifiedVariable.equals(variable)); 110 | } 111 | 112 | @Test 113 | public void testHashCode() { 114 | assertEquals(modifiedVariable.hashCode(), variable.hashCode()); 115 | } 116 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/ModifierTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import org.snmp4j.smi.Counter32; 5 | import org.snmp4j.smi.OID; 6 | import org.snmp4j.smi.Variable; 7 | import org.testng.annotations.Test; 8 | 9 | import static org.testng.Assert.*; 10 | 11 | public class ModifierTest { 12 | 13 | @Test 14 | public void testIsApplicable() { 15 | final Modifier modifier = new Modifier(".1.3.6.*", "com.oneandone.snmpman.configuration.modifier.Counter32Modifier", new ModifierProperties()); 16 | assertTrue(modifier.isApplicable(new OID(".1.3.6.1"))); 17 | } 18 | 19 | @Test 20 | @SuppressWarnings("unchecked") 21 | public void testModify() { 22 | final ModifierProperties modifierProperties = new ModifierProperties(); 23 | modifierProperties.put("minimum", 0L); 24 | modifierProperties.put("maximum", 3000L); 25 | modifierProperties.put("minimumStep", 1L); 26 | modifierProperties.put("maximumStep", 10L); 27 | 28 | final Modifier modifier = new Modifier(".1.3.6.*", "com.oneandone.snmpman.configuration.modifier.Counter32Modifier", modifierProperties); 29 | 30 | final Counter32 counter32 = new Counter32(0L); 31 | assertEquals(counter32.getValue(), 0L); 32 | 33 | final Variable modifiedVariable = modifier.modify(counter32); 34 | assertTrue(modifiedVariable instanceof Counter32); 35 | assertNotEquals(((Counter32) modifiedVariable).getValue(), 0L); 36 | } 37 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/TimeTicksModifierTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import org.snmp4j.smi.TimeTicks; 4 | import org.testng.annotations.Test; 5 | 6 | import static org.testng.Assert.assertNotEquals; 7 | 8 | public class TimeTicksModifierTest { 9 | 10 | @Test 11 | public void testModify() throws Exception { 12 | final TimeTicksModifier timeTicksModifier = new TimeTicksModifier(); 13 | 14 | final TimeTicks timeTicks = new TimeTicks(); 15 | final long initialTimeTicks = timeTicks.getValue(); 16 | 17 | Thread.sleep(11L); 18 | 19 | final TimeTicks modifiedVariable = timeTicksModifier.modify(timeTicks); 20 | final long newTimeTicks = modifiedVariable.getValue(); 21 | 22 | assertNotEquals(newTimeTicks, initialTimeTicks); 23 | } 24 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/modifier/UnsignedInteger32ModifierTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.modifier; 2 | 3 | import com.oneandone.snmpman.configuration.type.ModifierProperties; 4 | import org.snmp4j.smi.UnsignedInteger32; 5 | import org.testng.annotations.Test; 6 | 7 | import static org.testng.Assert.assertEquals; 8 | import static org.testng.Assert.assertNotEquals; 9 | 10 | public class UnsignedInteger32ModifierTest { 11 | 12 | @Test 13 | public void testModify() { 14 | final ModifierProperties modifierProperties = new ModifierProperties(); 15 | modifierProperties.put("minimum", 0); 16 | modifierProperties.put("maximum", 3000); 17 | modifierProperties.put("minimumStep", 1); 18 | modifierProperties.put("maximumStep", 10); 19 | 20 | final UnsignedInteger32Modifier modifier = new UnsignedInteger32Modifier(); 21 | modifier.init(modifierProperties); 22 | 23 | final UnsignedInteger32 unsignedInteger32 = new UnsignedInteger32(0); 24 | assertEquals(unsignedInteger32.getValue(), 0); 25 | 26 | final UnsignedInteger32 modifiedVariable = modifier.modify(unsignedInteger32); 27 | assertNotEquals(modifiedVariable.getValue(), 0); 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/type/ModifierPropertiesTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.type; 2 | 3 | import com.google.common.primitives.UnsignedLong; 4 | import com.oneandone.snmpman.configuration.AgentConfiguration; 5 | import com.oneandone.snmpman.configuration.Device; 6 | import com.oneandone.snmpman.configuration.modifier.Counter64Modifier; 7 | import com.oneandone.snmpman.configuration.modifier.Modifier; 8 | import org.snmp4j.smi.OID; 9 | import org.testng.annotations.Test; 10 | 11 | import java.io.File; 12 | import java.lang.reflect.Field; 13 | import java.math.BigInteger; 14 | 15 | import static org.testng.Assert.*; 16 | 17 | public class ModifierPropertiesTest { 18 | 19 | @Test 20 | public void testParsing() throws Exception { 21 | final AgentConfiguration.DeviceFactory deviceFactory = new AgentConfiguration.DeviceFactory(); 22 | final Device device = deviceFactory.getDevice(new File("src/test/resources/configuration/cisco.yaml")); 23 | 24 | assertFalse(device.getModifiers().isEmpty()); 25 | 26 | boolean counter64found = false; 27 | for (final Modifier modifier : device.getModifiers()) { 28 | // counter64 29 | if (modifier.isApplicable(new OID(".1.3.6.1.2.1.31.1.1.1.11.1"))) { 30 | final Field variableModifierField = Modifier.class.getDeclaredField("modifier"); 31 | variableModifierField.setAccessible(true); 32 | 33 | final Counter64Modifier counter64Modifier = (Counter64Modifier) variableModifierField.get(modifier); 34 | assertEquals(counter64Modifier.getMaximum(), UnsignedLong.valueOf(new BigInteger("1844674407370955161"))); 35 | counter64found = true; 36 | } 37 | } 38 | 39 | if (!counter64found) { 40 | fail("no modifier for unsigned long found"); 41 | } 42 | } 43 | 44 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/configuration/type/WildcardOIDTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.configuration.type; 2 | 3 | import org.snmp4j.smi.OID; 4 | import org.testng.annotations.Test; 5 | 6 | import static org.testng.Assert.*; 7 | 8 | public class WildcardOIDTest { 9 | 10 | @Test(expectedExceptions = { IllegalArgumentException.class }) 11 | public void testIllegalWildcard() { 12 | new WildcardOID(".1.2.3.*.*.4"); 13 | } 14 | 15 | @Test 16 | public void testStartingMatcher() { 17 | final WildcardOID wildcard = new WildcardOID(".1.2.3.*"); 18 | 19 | assertTrue(wildcard.matches(new OID("1.2.3.4"))); 20 | assertTrue(wildcard.matches(new OID("1.2.3.4.5"))); 21 | assertFalse(wildcard.matches(new OID("1.2.4"))); 22 | 23 | assertEquals(wildcard.toString(), "1.2.3.*"); 24 | } 25 | 26 | @Test 27 | public void testGeneralMatcher() { 28 | final WildcardOID wildcard = new WildcardOID(".1.2.3.*.5"); 29 | 30 | assertTrue(wildcard.matches(new OID("1.2.3.4.5"))); 31 | assertTrue(wildcard.matches(new OID("1.2.3.1337.5"))); 32 | assertFalse(wildcard.matches(new OID("1.2.3.4"))); 33 | assertFalse(wildcard.matches(new OID("1.2.3.4.4"))); 34 | 35 | assertEquals(wildcard.toString(), "1.2.3.*.5"); 36 | } 37 | } -------------------------------------------------------------------------------- /snmpman/src/test/java/com/oneandone/snmpman/integration/SnmpmanIntegrationTest.java: -------------------------------------------------------------------------------- 1 | package com.oneandone.snmpman.integration; 2 | 3 | import com.oneandone.snmpman.AbstractSnmpmanTest; 4 | import com.oneandone.snmpman.SnmpmanTest; 5 | import org.snmp4j.smi.OID; 6 | import org.snmp4j.util.TableEvent; 7 | import org.testng.annotations.Test; 8 | 9 | import java.util.List; 10 | 11 | import static org.testng.Assert.assertEquals; 12 | import static org.testng.Assert.assertTrue; 13 | 14 | @Test(groups = "integration-test") 15 | public class SnmpmanIntegrationTest extends AbstractSnmpmanTest { 16 | 17 | @Test 18 | public void testSnmpGetBulk() throws Exception { 19 | List responses = SnmpmanTest.getResponse(new OID("1.3.6.1.2.1"), 10000); 20 | assertEquals(responses.size(), 19); 21 | 22 | responses = SnmpmanTest.getResponse(new OID("1.3.6.1.2.1.31"), 10000); 23 | assertEquals(responses.size(), 10); 24 | 25 | responses = SnmpmanTest.getResponse(new OID(".1.3.6.1.2.1.2"), 10000); 26 | assertEquals(responses.size(), 7); 27 | } 28 | 29 | @Test 30 | public void testWithCommunityIndex() throws Exception { 31 | final String oid = "1.3.6.1.2.1.17.2.4"; 32 | List responses1 = SnmpmanTest.getResponse(new OID(oid), PORT, "public@42"); 33 | assertEquals(responses1.size(), 1); 34 | assertTrue(SnmpmanTest.containsColumn(responses1, oid, "150")); 35 | 36 | List responses2 = SnmpmanTest.getResponse(new OID(oid), PORT, "public@9"); 37 | assertEquals(responses2.size(), 1); 38 | assertTrue(SnmpmanTest.containsColumn(responses2, oid, "120")); 39 | 40 | List responses3 = SnmpmanTest.getResponse(new OID(oid), PORT, COMMUNITY); 41 | assertEquals(responses3.size(), 1); 42 | assertTrue(SnmpmanTest.containsColumn(responses3, oid, "0")); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /snmpman/src/test/resources/configuration/cisco.yaml: -------------------------------------------------------------------------------- 1 | name: "Cisco" 2 | modifiers: 3 | - oid: ".1.3.6.1.4.1.9.2.1.56" 4 | class: "com.oneandone.snmpman.configuration.modifier.Integer32Modifier" 5 | properties: 6 | minimum: 0 7 | maximum: 100 8 | minimumStep: 0 9 | maximumStep: 100 10 | - oid: ".1.3.6.1.4.1.9.2.1.57" 11 | class: "com.oneandone.snmpman.configuration.modifier.Integer32Modifier" 12 | properties: 13 | minimum: 0 14 | maximum: 100 15 | minimumStep: 0 16 | maximumStep: 100 17 | - oid: ".1.3.6.1.4.1.9.2.1.58" 18 | class: "com.oneandone.snmpman.configuration.modifier.Integer32Modifier" 19 | properties: 20 | minimum: 0 21 | maximum: 100 22 | minimumStep: 0 23 | maximumStep: 100 24 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.6" 25 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 26 | properties: 27 | minimum: 1547369620 28 | maximum: 1547374620 29 | minimumStep: -30 30 | maximumStep: 30 31 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.7" 32 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 33 | properties: 34 | minimum: 1547369620 35 | maximum: 1547374620 36 | minimumStep: -30 37 | maximumStep: 30 38 | - oid: ".1.3.6.1.4.1.9.9.48.1.1.1.5" 39 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 40 | properties: 41 | minimum: 0 42 | maximum: 5000 43 | minimumStep: -30 44 | maximumStep: 30 45 | - oid: ".1.3.6.1.4.1.9.9.13.1.3.1.3" 46 | class: "com.oneandone.snmpman.configuration.modifier.Gauge32Modifier" 47 | properties: 48 | minimum: 25 49 | maximum: 60 50 | minimumStep: -10 51 | maximumStep: 10 52 | - oid: ".1.3.6.1.2.1.2.2.1.10" 53 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 54 | properties: 55 | minimum: 0 56 | maximum: 4294967295 57 | minimumStep: 0 58 | maximumStep: 3840000 59 | - oid: ".1.3.6.1.2.1.2.2.1.11" 60 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 61 | properties: 62 | minimum: 0 63 | maximum: 4294967295 64 | minimumStep: 0 65 | maximumStep: 20000 66 | - oid: ".1.3.6.1.2.1.2.2.1.12" 67 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 68 | properties: 69 | minimum: 0 70 | maximum: 4294967295 71 | minimumStep: 0 72 | maximumStep: 20000 73 | - oid: ".1.3.6.1.2.1.2.2.1.13" 74 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 75 | properties: 76 | minimum: 0 77 | maximum: 4294967295 78 | minimumStep: 0 79 | maximumStep: 20000 80 | - oid: ".1.3.6.1.2.1.2.2.1.14" 81 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 82 | properties: 83 | minimum: 0 84 | maximum: 4294967295 85 | minimumStep: 0 86 | maximumStep: 20000 87 | - oid: ".1.3.6.1.2.1.2.2.1.15" 88 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 89 | properties: 90 | minimum: 0 91 | maximum: 4294967295 92 | minimumStep: 0 93 | maximumStep: 20000 94 | - oid: ".1.3.6.1.2.1.2.2.1.16" 95 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 96 | properties: 97 | minimum: 0 98 | maximum: 4294967295 99 | minimumStep: 0 100 | maximumStep: 3840000 101 | - oid: ".1.3.6.1.2.1.2.2.1.17" 102 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 103 | properties: 104 | minimum: 0 105 | maximum: 4294967295 106 | minimumStep: 0 107 | maximumStep: 20000 108 | - oid: ".1.3.6.1.2.1.2.2.1.18" 109 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 110 | properties: 111 | minimum: 0 112 | maximum: 4294967295 113 | minimumStep: 0 114 | maximumStep: 20000 115 | - oid: ".1.3.6.1.2.1.2.2.1.19" 116 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 117 | properties: 118 | minimum: 0 119 | maximum: 4294967295 120 | minimumStep: 0 121 | maximumStep: 20000 122 | - oid: ".1.3.6.1.2.1.2.2.1.20" 123 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 124 | properties: 125 | minimum: 0 126 | maximum: 4294967295 127 | minimumStep: 0 128 | maximumStep: 20000 129 | - oid: ".1.3.6.1.2.1.31.1.1.1.6" 130 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 131 | properties: 132 | minimum: 0 133 | maximum: 1844674407370955161 134 | minimumStep: 0 135 | maximumStep: 3840000 136 | - oid: ".1.3.6.1.2.1.31.1.1.1.7" 137 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 138 | properties: 139 | minimum: 0 140 | maximum: 1844674407370955161 141 | minimumStep: 0 142 | maximumStep: 20000 143 | - oid: ".1.3.6.1.2.1.31.1.1.1.8" 144 | class: com.oneandone.snmpman.configuration.modifier.Counter64Modifier 145 | properties: 146 | minimum: 0 147 | maximum: 1844674407370955161 148 | minimumStep: 0 149 | maximumStep: 20000 150 | - oid: ".1.3.6.1.2.1.31.1.1.1.9" 151 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 152 | properties: 153 | minimum: 0 154 | maximum: 1844674407370955161 155 | minimumStep: 0 156 | maximumStep: 20000 157 | - oid: ".1.3.6.1.2.1.2.2.1.13" 158 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 159 | properties: 160 | minimum: 0 161 | maximum: 4294967295 162 | minimumStep: 0 163 | maximumStep: 20000 164 | - oid: ".1.3.6.1.2.1.2.2.1.14" 165 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 166 | properties: 167 | minimum: 0 168 | maximum: 4294967295 169 | minimumStep: 0 170 | maximumStep: 20000 171 | - oid: ".1.3.6.1.2.1.2.2.1.15" 172 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 173 | properties: 174 | minimum: 0 175 | maximum: 4294967295 176 | minimumStep: 0 177 | maximumStep: 20000 178 | - oid: ".1.3.6.1.2.1.31.1.1.1.10" 179 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 180 | properties: 181 | minimum: 0 182 | maximum: 1844674407370955161 183 | minimumStep: 0 184 | maximumStep: 3840000 185 | - oid: ".1.3.6.1.2.1.31.1.1.1.11" 186 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 187 | properties: 188 | minimum: 0 189 | maximum: 1844674407370955161 190 | minimumStep: 0 191 | maximumStep: 20000 192 | - oid: ".1.3.6.1.2.1.31.1.1.1.12" 193 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 194 | properties: 195 | minimum: 0 196 | maximum: 1844674407370955161 197 | minimumStep: 0 198 | maximumStep: 20000 199 | - oid: ".1.3.6.1.2.1.31.1.1.1.13" 200 | class: "com.oneandone.snmpman.configuration.modifier.Counter64Modifier" 201 | properties: 202 | minimum: 0 203 | maximum: 1844674407370955161 204 | minimumStep: 0 205 | maximumStep: 20000 206 | - oid: ".1.3.6.1.2.1.2.2.1.19" 207 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 208 | properties: 209 | minimum: 0 210 | maximum: 4294967295 211 | minimumStep: 0 212 | maximumStep: 20000 213 | - oid: ".1.3.6.1.2.1.2.2.1.20" 214 | class: "com.oneandone.snmpman.configuration.modifier.Counter32Modifier" 215 | properties: 216 | minimum: 0 217 | maximum: 4294967295 218 | minimumStep: 0 219 | maximumStep: 20000 220 | - oid: ".1.3.6.1.2.1.17.2.4.0" 221 | class: "com.oneandone.snmpman.configuration.modifier.CommunityIndexCounter32Modifier" 222 | properties: 223 | 42: 150 224 | 9: 120 225 | vlans: 226 | - 42 227 | - 9 -------------------------------------------------------------------------------- /snmpman/src/test/resources/configuration/configuration.yaml: -------------------------------------------------------------------------------- 1 | - name: "example1" 2 | device: "src/test/resources/configuration/cisco.yaml" 3 | walk: "src/test/resources/configuration/example.txt" 4 | ip: "127.0.0.1" 5 | port: 10000 6 | - name: "example2" 7 | device: "src/test/resources/configuration/cisco.yaml" 8 | walk: "src/test/resources/configuration/example.txt" 9 | ip: "127.0.0.1" 10 | port: 10001 11 | - name: "example3" 12 | device: "src/test/resources/configuration/cisco.yaml" 13 | walk: "src/test/resources/configuration/example.txt" 14 | ip: "127.0.0.1" 15 | port: 10002 16 | - name: "example4" 17 | device: "src/test/resources/configuration/cisco.yaml" 18 | walk: "src/test/resources/configuration/example.txt" 19 | ip: "127.0.0.1" 20 | port: 10003 21 | - name: "example5" 22 | device: "src/test/resources/configuration/cisco.yaml" 23 | walk: "src/test/resources/configuration/example.txt" 24 | ip: "127.0.0.1" 25 | port: 10004 26 | - name: "example6" 27 | device: "src/test/resources/configuration/cisco.yaml" 28 | walk: "src/test/resources/configuration/example.txt" 29 | ip: "127.0.0.1" 30 | port: 10005 31 | - name: "example7" 32 | device: "src/test/resources/configuration/cisco.yaml" 33 | walk: "src/test/resources/configuration/example.txt" 34 | ip: "127.0.0.1" 35 | port: 10006 36 | - name: "example8" 37 | device: "src/test/resources/configuration/cisco.yaml" 38 | walk: "src/test/resources/configuration/example.txt" 39 | ip: "127.0.0.1" 40 | port: 10007 41 | - name: "example9" 42 | device: "src/test/resources/configuration/cisco.yaml" 43 | walk: "src/test/resources/configuration/example.txt" 44 | ip: "127.0.0.1" 45 | port: 10008 46 | - name: "example10" 47 | device: "src/test/resources/configuration/cisco.yaml" 48 | walk: "src/test/resources/configuration/example.txt" 49 | ip: "127.0.0.1" 50 | port: 10009 51 | - name: "example11" 52 | device: "src/test/resources/configuration/empty.yaml" 53 | walk: "src/test/resources/configuration/differentStartingOID.txt" 54 | ip: "127.0.0.1" 55 | port: 10010 -------------------------------------------------------------------------------- /snmpman/src/test/resources/configuration/differentStartingOID.txt: -------------------------------------------------------------------------------- 1 | .1.0.8802.1.1.2.1.4.1.1.7.0.436301824.53 = STRING: "Eth1/24" 2 | .1.0.8802.1.1.2.1.4.1.1.7.0.939532288.52 = STRING: "512" 3 | .1.0.8802.1.1.2.1.4.1.1.8.0.436301824.53 = STRING: "vpc-peer-link" 4 | .1.0.8802.1.1.2.1.4.1.1.8.0.939532288.52 = STRING: "xe-0/1/2.0" 5 | .1.0.8802.1.1.2.1.4.1.1.9.0.436301824.53 = STRING: "some.devie.location.beach" 6 | .1.0.8802.1.1.2.1.4.1.1.9.0.939532288.52 = STRING: "other.device.location.mountains" 7 | .1.0.8802.1.1.2.1.4.1.1.10.0.436301824.53 = STRING: "Cisco NX-OS(tm) n1337" 8 | .1.0.8802.1.1.2.1.4.1.1.10.0.939532288.52 = STRING: "Juniper Networks, Inc. ex0815" 9 | .1.3.6.1.2.1.31.1.1.1.1.83886080 = STRING: "mgmt0" 10 | .1.3.6.1.2.1.31.1.1.1.1.151060481 = STRING: "Vlan1" 11 | .1.3.6.1.2.1.31.1.1.1.1.369098752 = STRING: "port-channel1" 12 | .1.3.6.1.2.1.31.1.1.1.1.385875968 = STRING: "Null0" 13 | .1.3.6.1.2.1.31.1.1.1.1.436211712 = STRING: "Ethernet1/2" 14 | .1.3.6.1.2.1.31.1.1.1.1.436215808 = STRING: "Ethernet1/3" 15 | .1.3.6.1.2.1.31.1.1.1.1.436219904 = STRING: "Ethernet1/4" 16 | .1.3.6.1.2.1.31.1.1.1.1.436224000 = STRING: "Ethernet1/5" 17 | .1.3.6.1.2.1.31.1.1.1.1.436228096 = STRING: "Ethernet1/6" 18 | .1.3.6.1.2.1.31.1.1.1.1.436232192 = STRING: "Ethernet1/7" 19 | .1.3.6.1.2.1.31.1.1.1.1.436236288 = STRING: "Ethernet1/8" 20 | .1.3.6.1.2.1.31.1.1.1.1.436240384 = STRING: "Ethernet1/9" 21 | .1.3.6.1.2.1.31.1.1.1.1.436244480 = STRING: "Ethernet1/10" 22 | .1.3.6.1.2.1.31.1.1.1.1.436248576 = STRING: "Ethernet1/11" 23 | .1.3.6.1.2.1.31.1.1.1.1.436252672 = STRING: "Ethernet1/12" 24 | .1.3.6.1.2.1.31.1.1.1.1.436256768 = STRING: "Ethernet1/13" 25 | .1.3.6.1.2.1.31.1.1.1.1.436260864 = STRING: "Ethernet1/14" 26 | .1.3.6.1.2.1.31.1.1.1.1.436264960 = STRING: "Ethernet1/15" 27 | .1.3.6.1.2.1.31.1.1.1.1.436269056 = STRING: "Ethernet1/16" 28 | .1.3.6.1.2.1.31.1.1.1.1.436273152 = STRING: "Ethernet1/17" 29 | .1.3.6.1.2.1.31.1.1.1.1.436277248 = STRING: "Ethernet1/18" 30 | .1.3.6.1.2.1.31.1.1.1.1.436281344 = STRING: "Ethernet1/19" 31 | .1.3.6.1.2.1.31.1.1.1.1.436285440 = STRING: "Ethernet1/20" 32 | .1.3.6.1.2.1.31.1.1.1.1.436289536 = STRING: "Ethernet1/21" 33 | .1.3.6.1.2.1.31.1.1.1.1.436293632 = STRING: "Ethernet1/22" 34 | .1.3.6.1.2.1.31.1.1.1.1.436297728 = STRING: "Ethernet1/23" 35 | .1.3.6.1.2.1.31.1.1.1.1.436301824 = STRING: "Ethernet1/24" 36 | .1.3.6.1.2.1.31.1.1.1.1.939528192 = STRING: "Ethernet1/1/2" 37 | .1.3.6.1.2.1.31.1.1.1.1.939532288 = STRING: "Ethernet1/1/3" 38 | .1.3.6.1.2.1.31.1.1.1.1.939536384 = STRING: "Ethernet1/1/4" 39 | -------------------------------------------------------------------------------- /snmpman/src/test/resources/configuration/empty.yaml: -------------------------------------------------------------------------------- 1 | name: "Empty" -------------------------------------------------------------------------------- /snmpman/src/test/resources/configuration/example.txt: -------------------------------------------------------------------------------- 1 | .1.3.6.1.2.1.1.5.0 = STRING: "device" 2 | .1.3.6.1.2.1.2.2.1.7.10101 = INTEGER: 1 3 | .1.3.6.1.2.1.31.1.1.1.6.10101 = Counter64: 389172331 4 | .1.3.6.1.2.1.31.1.1.1.7.10101 = Counter64: 5470259 5 | .1.3.6.1.2.1.31.1.1.1.8.10101 = Counter64: 19 6 | .1.3.6.1.2.1.31.1.1.1.9.10101 = Counter64: 743 7 | .1.3.6.1.2.1.2.2.1.13.10101 = Counter32: 0 8 | .1.3.6.1.2.1.2.2.1.14.10101 = Counter32: 0 9 | .1.3.6.1.2.1.2.2.1.15.10101 = Counter32: 0 10 | .1.3.6.1.2.1.31.1.1.1.10.10101 = Counter64: 48648257581 11 | .1.3.6.1.2.1.31.1.1.1.11.10101 = Counter64: 32038868 12 | .1.3.6.1.2.1.31.1.1.1.12.10101 = Counter64: 141915228 13 | .1.3.6.1.2.1.31.1.1.1.13.10101 = Counter64: 44011328 14 | .1.3.6.1.2.1.2.2.1.19.10101 = Counter32: 0 15 | .1.3.6.1.2.1.2.2.1.2.10101 = STRING: "GigabitEthernet0/1" 16 | .1.3.6.1.2.1.31.1.1.1.1.10101 = STRING: "Gi0/1" 17 | .1.3.6.1.2.1.31.1.1.1.15.10101 = Gauge32: 1000 18 | .1.3.6.1.2.1.2.2.1.5.10101 = Gauge32: 1000000000 19 | .1.3.6.1.2.1.17.2.4.0 = Counter32: 0 -------------------------------------------------------------------------------- /snmpman/src/test/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | --------------------------------------------------------------------------------