2010年07月26日

実践SNMP+Java - SNMP Set

SNMP4Jを利用したSNMP Setについて説明します。

その名の通りSetを使うとSNMPを使ってエージェントの値を設定する事が出来ます。

では、Javaコードから見ていきましょう。

 
<Javaコード>
 
  1.     // SNMP parameters.
  2.     CommunityTarget comTgt = new CommunityTarget();
  3.     String managerUdpAddr = "localhost/161"; // SNMP agent UDP address.
  4.     comTgt.setAddress( new UdpAddress(managerUdpAddr) );
  5.     comTgt.setCommunity( new OctetString("readwrite") ); // SNMP write community.
  6.     comTgt.setVersion(SnmpConstants.version1); // SNMP version.
  7.     final String sysLocationOID = ".1.3.6.1.2.1.1.6.0"; // system.sysLocation.0
  8.     String sysLocationValue = "my locaction";
  9.     // create set PDU
  10.     PDU pdu = new PDU();
  11.     // set PDU type
  12.     pdu.setType(PDU.SET);
  13.     // create OID
  14.     OID oid = new OID(sysLocationOID);
  15.     /*
  16.      * All Known Implementing Classes(from javadoc):
  17.      *  AbstractVariable, BitString, Counter32, Counter64, Gauge32,
  18.      *  GenericAddress, Integer32, IpAddress, Null, OctetString, OID,
  19.      *  Opaque, SMIAddress, TcpAddress, TimeTicks, TransportIpAddress,
  20.      *  UdpAddress, UnsignedInteger32, VariantVariable
  21.      */
  22.     Variable variable = new OctetString( sysLocationValue );
  23.     // create variable binding (varbind)
  24.     VariableBinding varbind = new VariableBinding(oid, variable);
  25.     // add varbind
  26.     pdu.add(varbind);
  27.     // SNMP operation object
  28.     Snmp snmp = null;
  29.     // DefaultUdpTransportMapping or DefaultTcpTransportMapping
  30.     DefaultUdpTransportMapping utm = null;
  31.     try {
  32.       utm = new DefaultUdpTransportMapping();
  33.       snmp = new Snmp(utm);
  34.       snmp.listen(); // must 'snmp.listen()' to receive response.
  35.       // set
  36.       ResponseEvent event = snmp.set(pdu, comTgt);
  37.       PDU resPDU = event.getResponse();
  38.       if ( resPDU != null && resPDU.getErrorStatus() == SnmpConstants.SNMP_ERROR_SUCCESS ) {
  39.         System.out.println("succeed: SNMP Set");
  40.       } else {
  41.         if ( resPDU != null ) {
  42.           // SNMP error
  43.           System.out.println("failed: " + resPDU.getErrorStatusText());
  44.         } else {
  45.           System.out.println("failed: timeout.");
  46.         }
  47.       }
  48.       snmp.close(); // closes the session and frees any allocated resources.
  49.     } catch (IOException e) {
  50.       e.printStackTrace();
  51.     }

<実行結果>
 
succeed: SNMP Set 

この結果だけでは間違いなくエージェント側の値が書き換わったかわかりませんね。
SNMP Getで説明したコードでOIDをsystem.sysLocation.0を取得して下さい。
成功している場合、Setリクエストした値が表示されます。

1.3.6.1.2.1.1.6.0 -> my locaction

 
<説明>
 
1)送信準備
  1~6行目でSNMPパラメータの設定を行っています。
  この時、Write権限のコミュニティ名を設定します。
  SNMPエージェントがWindows PCならばSNMP Service/プロパティ/セキュリティで
  設定出来ますよ。
 
2)PDUの生成
  9~26行目でPDUを生成しています。
  今回は".1.3.6.1.2.1.1.6.0"; // system.sysLocation.0の値をSetします。
  ちなみに、RFC1213-MIBをみると、sysLocationは次のように定義されており、
 
    sysLocation OBJECT-TYPE
        SYNTAX  DisplayString (SIZE (0..255))
        ACCESS  read-write
        STATUS  mandatory
        DESCRIPTION "The physical location of this node (e.g.,`telephone closet, 3rd floor')."

  そのACCESS属性から書き込み(Set)可能である事が確認出来ます。
  また、SyntaxはOctetStringの拡張であるDisplayStringですから、22行目で
  Variableインタフェースの実装クラスであるOctetStringを使ってVariableを
  生成しています。
  このOIDとVariableをPDUに追加してSet PDUの準備は完了です。
 
3)送信と応答確認
  34~46行目でSetリクエストの送信と応答を確認しています。
  snmp.set(pdu, comTgt);の戻り値からレスポンスPDUを取り出して、
  nullでは無く、かつ、SNMPエラー・ステータスが成功(0)であれば、
  Setは完了です。
  これ以外の場合は、タイムアウト又はSNMPエラー(OID間違いなど)が
  発生しているので詳しい内容を確認して下さい。
  #コミュニティ名の間違いはタイムアウトになります。

 
入門SNMP
入門SNMP
posted with amazlet at 13.01.12
ダグラス・R. マウロ ケビン・J. シュミット
オライリー・ジャパン
売り上げランキング: 257,278

Java ネットワーク プログラミング 基礎からわかる 完全入門
永嶋 浩
技術評論社
売り上げランキング: 228,941

Posted by netbuffalo at 20:06│TrackBack(0) 実践SNMP+Java 


この記事へのトラックバックURL