2010年07月23日

実践SNMP+Java - SNMP Inform

SNMP4Jを利用したSNMPv2 Informの送信について説明します。

これまでに説明したSNMPv1 Trap, SNMPv2 Trapを使うと、SNMPマネージャにアラームを通知することが出来ますが、Trapの場合、それだけではマネージャ側が受信したか否かを送信(SNMPエージェント)側で知ることは出来ません。

ですから、重要なアラームであるほど通知先(相手)が受信したことを知りたい、という実践(運用)上の矛盾が生じます。

SNMPv1,v2トラップの場合、僕の知っている限りでは、通知元(SNMPエージェント)でSNMP Setリクエストを受信できるようにしておき、ある特定のSetリクエストをもって、相手が受信したと判断することが多いようです。
(Setリクエストを受信できない場合、ある一定の間隔で、トラップを送信し続ける)

この方法は送信側でSNMPエージェントがサービスしている場合には良いですが、アラーム通知だけしたいアプリケーションを作る場合には面倒です。

そこでInformという事になります。

Informを利用すると受信側がレスポンスを戻すので、送信側が受信を確認することが出来ます。

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

<Javaコード>
  1.     // SNMP通信パラメータを設定するクラス。
  2.     CommunityTarget comTgt = new CommunityTarget();
  3.     String managerUdpAddr = "localhost/162"; // SNMPマネージャのUDPアドレス
  4.     comTgt.setAddress( new UdpAddress(managerUdpAddr) );
  5.     comTgt.setCommunity( new OctetString("public") ); // SNMPコミュニティ名
  6.     comTgt.setVersion(SnmpConstants.version2c); // SNMPバージョン
  7.     final String sysObjectID = ".1.3.6.1.4.1.99999.1.1.100"; // sysObjectID
  8.     /*
  9.      * SNMPv2-MIB::snmpTrapOID(RFC1907)
  10.      *  The authoritative identification of the notification
  11.      *  currently being sent.  This variable occurs as the second
  12.      *  varbind in every SNMPv2-Trap-PDU and InformRequest-PDU.
  13.      *
  14.      *  <standard>
  15.      *   coldStart             -> .1.3.6.1.6.3.1.1.5.1
  16.      *   warmStart             -> .1.3.6.1.6.3.1.1.5.2
  17.      *   authenticationFailure -> .1.3.6.1.6.3.1.1.5.5
  18.      *
  19.      *  <private>
  20.      *   Generally, set the value that added '0' and specific trap type of SNMPv1 trap to sysObjectID.
  21.      */
  22.     final String mySnmpTrapOID = sysObjectID + ".0.1"; // dummy snmpTrapOID
  23.     final String varBindOID1 = ".1.3.6.1.4.1.99999.1.2.1.0"; // my varbind 1
  24.     final String varBindOID2 = ".1.3.6.1.4.1.99999.1.2.2.0"; // my varbind 2
  25.     // SNMPv2 Trap PDU
  26.     PDU v2pdu = new PDU();
  27.     // set pdu type
  28.     v2pdu.setType(PDU.INFORM);
  29.     // add varbind1: sysUpTime default 0.
  30.     long sysUpTime = 8640000;
  31.     v2pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(sysUpTime)));
  32.     // add varbind 2: snmpTrapOID
  33.     // SnmpConstants.snmpTrapOID -> .1.3.6.1.6.3.1.1.4.1.0
  34.     v2pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, new OID(mySnmpTrapOID)));
  35.     // add varbind 3: my payload 1
  36.     v2pdu.add( new VariableBinding(new OID(varBindOID1), new OctetString("NETBUFFALO SNMPv2 Inform - my varbind 1")) );
  37.     // add varbind 4: my payload 2
  38.     v2pdu.add( new VariableBinding(new OID(varBindOID2), new OctetString("NETBUFFALO SNMPv2 Inform - my varbind 2")) );
  39.     // SNMP操作の基本になるクラス。
  40.     Snmp snmp = null;
  41.     // DefaultTcpTransportMappingクラスもあります
  42.     DefaultUdpTransportMapping utm = null;
  43.     try {
  44.       utm = new DefaultUdpTransportMapping();
  45.       snmp = new Snmp(utm);
  46.       snmp.listen(); // snmp.listen();しないと必ずfailedです。
  47.       // Inform
  48.       ResponseEvent event = snmp.send(v2pdu, comTgt);
  49.       PDU responsePDU = event.getResponse();
  50.       if (responsePDU == null) {
  51.         System.out.println("failed: SNMPv2 Inform");
  52.       } else {
  53.         System.out.println("succeed: SNMPv2 Inform");
  54.       }
  55.       snmp.close();
  56.     } catch (IOException e) {
  57.       e.printStackTrace();
  58.     }


<実行結果>
 
OpUtilsで受信した結果です。
 
trap_receiver_v2Inform

送信側ですが、受信先から応答があった場合、次のような表示になります。
 
succeed: SNMPv2 Inform


<説明>

1)送信準備
  1~38行目までは、SNMPv2トラップと基本的に同じです。
  送信先ポートは162、SNMPバージョンはv2cにしてください。
  あと、28行目でPDUタイプをINFORMに設定しています。

2)送信と結果の応答確認
  まず、46行目でsnmp.listen()しています。InformではSNMPマネージャの
  応答を待つので、snmp.listen()が必要です。これをしないと、送信は出来ますが、
  レスポンスがnullになってしまいます。
 
  48~54行目で受信確認しています。
  responsePDUがnullの場合、タイムアウトですから、受信確認は失敗です。
  逆の場合は、SNMPマネージャからレスポンスがあった事を意味しています。
  失敗した場合は、暫く経ってから再送するロジックを実装します。
 
  応答データって具体的に何が送られてくるのですか?、と思う方もいるかも知れません。
  その答えは、SNMPマネージャ(Inform/トラップの受信)の実装でご説明します。
  #ここで受信したPDUの中身を見ても分かります。



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

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

Posted by netbuffalo at 14:49│TrackBack(0) 実践SNMP+Java 


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