snmptrapを受信し、phpスクリプトでトラップ内容を扱えるようにする方法です。
OSはCentOSを使います。簡易phpスクリプトも記載しています。必要に応じてカスタマイズしてください。
1.snmp環境のインストール
まずは、yumでsnmpパッケージをインストールします。
$ sudo yum install net-snmp $ sudo yum install net-snmp-utils
net-snmp-utils は、snmptrapコマンドで使います。
2.phpスクリプトの用意
snmpトラップを受け取るphpスクリプトを用意します。
以下はシンプルな処理のみを実装したphpスクリプトです。ご参考まで。
#!/usr/bin/php <?php $logfile = "/path/to/trap_". date("Ymd") .".log"; $logtime = date("Y-m-d H:i:s "); file_put_contents($logfile,$logtime ."===== start =====\n",FILE_APPEND); $fp = fopen('php://stdin', 'r'); if (!$fp){ file_put_contents($logfile,$logtime ."ERROR : fopen error\n",FILE_APPEND); exit; } while(!feof($fp)) { $stdin = fgets($fp, 4096); file_put_contents($logfile,$logtime ."DEBUG : ".$stdin ,FILE_APPEND); } fclose($fp); file_put_contents($logfile,$logtime ."\n",FILE_APPEND); file_put_contents($logfile,$logtime ."===== end =====\n",FILE_APPEND); ?>
受信した snmp トラップ内容を別途ログに吐くようにしています。
3.snmptrapd 設定
snmptrapd の設定ファイル「/etc/snmp/snmptrapd.conf 」で、snmptrapを受信した際に、phpスクリプトに渡すように設定します。
以下はサンプル設定です。詳細はご自身の環境に合わせて設定してください。
authCommunity log,execute,net public traphandle default /path/to/trap.php
traphandle では、全てのトラップを(default)、配置した trap.php に渡しています。
設定完了後は、snmptrapdを再起動してください。
4.snmpトラップ送信テスト
snmpトラップを送信します。
まずは、文字列(STRING)を送ってみます。
$ sudo snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.99999 .1.3.6.1.4.1.8072.99999.1 s "TEST TRAP MESSAGE"
phpスクリプトで設定したログには下記のように吐かれます。
2015-04-11 12:33:58 ===== start ===== 2015-04-11 12:33:58 DEBUG : localhost 2015-04-11 12:33:58 DEBUG : UDP: [127.0.0.1]:38649->[127.0.0.1] 2015-04-11 12:33:58 DEBUG : DISMAN-EVENT-MIB::sysUpTimeInstance 158:12:03:25.73 2015-04-11 12:33:58 DEBUG : SNMPv2-MIB::snmpTrapOID.0 NET-SNMP-MIB::netSnmp.99999 2015-04-11 12:33:58 DEBUG : NET-SNMP-MIB::netSnmp.99999.1 "TEST TRAP MESSAGE" 2015-04-11 12:33:58 DEBUG : 2015-04-11 12:33:58 2015-04-11 12:33:58 ===== end =====
ちなみに、/var/log/messages(syslog)には、下記のように吐かれます。
Apr 11 12:33:58 dev snmptrapd[25601]: 2015-04-11 12:33:58 localhost [UDP: [127.0.0.1]:38649->[127.0.0.1]]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (1369460573) 158 days, 12:03:25.73#011SNMPv2-MIB::snmpTrapOID.0 = OID: NET-SNMP-MIB::netSnmp.99999#011NET-SNMP-MIB::netSnmp.99999.1 = STRING: "TEST TRAP MESSAGE"
snmpトラップのフォーマットが異なる事が分かります。phpスクリプトのほうが分かり易いかな。
次に数値(INTEGER)を送ってみます。
$ sudo snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.99999 .1.3.6.1.4.1.8072.99999.1 i "12345"
phpスクリプトで設定したログには下記のように吐かれます。
2015-04-11 12:38:34 ===== start ===== 2015-04-11 12:38:34 DEBUG : localhost 2015-04-11 12:38:34 DEBUG : UDP: [127.0.0.1]:46398->[127.0.0.1] 2015-04-11 12:38:34 DEBUG : DISMAN-EVENT-MIB::sysUpTimeInstance 158:12:08:01.68 2015-04-11 12:38:34 DEBUG : SNMPv2-MIB::snmpTrapOID.0 NET-SNMP-MIB::netSnmp.99999 2015-04-11 12:38:34 DEBUG : NET-SNMP-MIB::netSnmp.99999.1 12345 2015-04-11 12:38:34 DEBUG : 2015-04-11 12:38:34 2015-04-11 12:38:34 ===== end =====
数値(INTEGER)が抜き取り易くなっていると思います。
ちなみに、/var/log/messages(syslog)には、下記のように吐かれます。
Apr 11 12:38:34 dev snmptrapd[25601]: 2015-04-11 12:38:34 localhost [UDP: [127.0.0.1]:46398->[127.0.0.1]]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (1369488168) 158 days, 12:08:01.68#011SNMPv2-MIB::snmpTrapOID.0 = OID: NET-SNMP-MIB::netSnmp.99999#011NET-SNMP-MIB::netSnmp.99999.1 = INTEGER: 12345
以上、phpスクリプトでsnmpトラップを取り扱う方法でした。ご参考まで。