Pocket

受信したsnmptrapをphpスクリプトでハンドリングする方法

  • add this entry to hatena bookmark

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トラップを取り扱う方法でした。ご参考まで。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

チェックサイト RSS Feed読者登録はいかがでしょうか?RSS配信中です。