JavaでSNMP 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 が何なのかイマイチ分かっていない。。後日調査してブログに書くことにする。