Akira's Blog

神奈川在住のITエンジニアの雑記です。主にプログラミング(Perl, Java など)やネットワーク技術についての小ネタを、ちょっとずつ書いていきます。

JavaでSNMP GetBulk

JavaSNMP Get Bulk を実行するコードを作ってみた。とりあえずざっと作ってみただけなので、SNMP要求を出すターゲットの情報などはソース中にハードコードしている。
実行すると、localhost上のSNMPエージェントに対して、.1.3.6.1.2.1.1 から数えて20個のMIBを取得する。.1.3.6.1.2.1.1 (system MIB)配下は通常20個もMIBは無いので、.1.3.6.1.2.1.1 配下のMIBを取得し終わると、.1.3.6.1.2.1.2 以降のMIBも取得する。なお、snmp4j が提供するAPIを使用しているため、コンパイル、実行するには snmp4j が必要。

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class Snmpbulk {
    public static void main(String[] args) {
        // Set value for snmp getbulk
        String targetAddr = "localhost";
        String oidStr = ".1.3.6.1.2.1.1";
        String commStr = "public";
        int snmpVersion = SnmpConstants.version2c;
        String portNum = "161";
        int timeout = 3000;
        int retryCnt = 1;
        int maxRepetitions = 20;

        // Create target
        CommunityTarget target = new CommunityTarget();
        target.setAddress(new UdpAddress(targetAddr + "/" + portNum));
        target.setCommunity(new OctetString(commStr));
        target.setTimeout(timeout);
        target.setRetries(retryCnt);
        target.setVersion(snmpVersion);

        // Create pdu
        PDU pdu = new PDU();
        pdu.setType(PDU.GETBULK);
        pdu.setMaxRepetitions(maxRepetitions);
        pdu.setNonRepeaters(0);
        OID targetOID = new OID(oidStr);
        pdu.add(new VariableBinding(targetOID));

        Snmp snmp = null;
        try {
            snmp = new Snmp(new DefaultUdpTransportMapping());
            snmp.listen();
            // Execute snmp GetBulk
            ResponseEvent responseEv = snmp.getBulk(pdu, target);

            // Get response
            PDU response = responseEv.getResponse();

            // ---------------------------------
            // Analyze response
            // ---------------------------------
            if (response == null) {
                System.out.println("Request timeout...");
                return;
            }
            if (response.getErrorStatus() != SnmpConstants.SNMP_ERROR_SUCCESS) {
                System.out.println("Error happened...");
                System.out.println(response.getErrorStatusText());
                return;
            }
            int numVarBinds = response.size();
            for (int i = 0; i < numVarBinds; i++) {
               VariableBinding varbind = response.get(i);
               if (varbind == null) {
                   continue;
               }
               if (varbind.isException()) {
                   System.out.println(varbind.getOid() + " : " + "Exception happened");
                   continue;
               }
               System.out.println(
                   varbind.getOid() +
                       " : " +
                   varbind.getVariable().getSyntaxString() +
                       " : " +
                   varbind.getVariable());
            } // for
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (snmp != null) {
                    snmp.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


実行すると、Getbulkで取得したMIB値が以下のように表示される。

1.3.6.1.2.1.1.1.0 : OCTET STRING : xxxx
1.3.6.1.2.1.1.2.0 : OBJECT IDENTIFIER : 1.3.6.1.4.1.311.1.1.3.1.1
1.3.6.1.2.1.1.3.0 : TimeTicks : 2 days, 22:32:36.34
1.3.6.1.2.1.1.4.0 : OCTET STRING :
1.3.6.1.2.1.1.5.0 : OCTET STRING : xxxx
1.3.6.1.2.1.1.6.0 : OCTET STRING :
1.3.6.1.2.1.1.7.0 : Integer32 : 76
1.3.6.1.2.1.2.1.0 : Integer32 : 42
1.3.6.1.2.1.2.2.1.1.1 : Integer32 : 1
1.3.6.1.2.1.2.2.1.1.2 : Integer32 : 2
1.3.6.1.2.1.2.2.1.1.3 : Integer32 : 3
1.3.6.1.2.1.2.2.1.1.4 : Integer32 : 4
1.3.6.1.2.1.2.2.1.1.5 : Integer32 : 5
1.3.6.1.2.1.2.2.1.1.6 : Integer32 : 6
1.3.6.1.2.1.2.2.1.1.7 : Integer32 : 7
1.3.6.1.2.1.2.2.1.1.8 : Integer32 : 8
1.3.6.1.2.1.2.2.1.1.9 : Integer32 : 9
1.3.6.1.2.1.2.2.1.1.10 : Integer32 : 10
1.3.6.1.2.1.2.2.1.1.11 : Integer32 : 11
1.3.6.1.2.1.2.2.1.1.12 : Integer32 : 12

そういえば、nonRepeaters が何なのかイマイチ分かっていない。。後日調査してブログに書くことにする。