labunix's blog

labunixのラボUnix

winevntでsnmpトラップをdebianに送信する

 

■winevntでsnmpトラップをdebianに送信する。
 テストしたOS:WinXPHome
 Squidサービスが起動しているかを定期的にチェックする。

 Windows版squid
 http://d.hatena.ne.jp/labunix/20111022

■以下でSNMPサービスを導入。

 プログラムの追加と削除->Windows コンポーネントの追加と削除 -> 管理とモニタツール

 WMI SNMP プロバイダ
 簡易ネットワーク管理プロトコル(SNMP)

■初期導入だけで、「PID」がある。
 つまり、サービスSTATEは開始「4 RUNNING」している。

> sc getKeyName "SNMP Service"
[SC] GetServiceKeyName SUCCESS  Name = SNMP
> sc getKeyName "SNMP Trap Service"
[SC] GetServiceKeyName SUCCESS  Name = SNMPTRAP
> sc queryex SNMP

SERVICE_NAME: SNMP
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 3492
        FLAGS              :
> sc queryex SNMPTRAP

SERVICE_NAME: SNMPTRAP
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 504
        FLAGS              :
■サービスの設定でSNMPトラップの送信先を指定。

 SNMPサービス->プロパティ->トラップタブ

 コミュニティ :public
 トラップ送信先:debianのIP

■サービスの再起動

> net stop "SNMP Trap Service"
> net stop "SNMP Service"
> net start "SNMP Service"
> net start "SNMP Trap Service"

C:\myapp\wol193>net start | find "SNMP"
   SNMP Service
   SNMP Trap Service

■イベントログで確認する。
 システムのイベントログ、7035,7036等を確認する。
 また、アプリケーションのWSH、0,1.2.4.8.16を確認する。

> eventvwr

■「eventwin」で「カスタム->追加」からSNMPトラップ送信をするイベントを設定する。

> evntwin

 イベントソースから以下を選択
 system -> eventlog
 Application -> WSH

 イベントIDを追加
 eventlog 7901,7035,7036
 WSH      1,2,4,8,16

■サービスの停止、起動でイベントログからSNMPトラップの送信。

> net stop "SNMP Service"
> net start "SNMP Service"

■debian側のSNMPトラップの受信設定の確認。

$ sudo tail -2 /etc/snmp/snmptrapd.conf
authCommunity log,execute,net public

■syslogでSNMPトラップ受信を確認。

$ sudo grep snmptrapd /var/log/syslog | sed s/".*iso.3.6.1.4.1.311.1.1.3.1.1 \([LC]\)"/"\1"/g
2012-10-27 20:18:06 NET-SNMP version 5.4.3 Stopped.
Stopping snmptrapd
NET-SNMP version 5.4.3 AgentX subagent connected
NET-SNMP version 5.4.3
Cold Start Trap (0) Uptime: 0:00:00.00#012
Link Up Trap (0) Uptime: 0:00:15.04#012#011iso.3.6.1.2.1.2.2.1.1.1 = INTEGER: 1
Link Up Trap (0) Uptime: 0:00:15.04#012#011iso.3.6.1.2.1.2.2.1.1.131074 = INTEGER: 131074
Cold Start Trap (0) Uptime: 0:00:00.00#012
Link Up Trap (0) Uptime: 0:00:15.06#012#011iso.3.6.1.2.1.2.2.1.1.1 = INTEGER: 1
Link Up Trap (0) Uptime: 0:00:15.06#012#011iso.3.6.1.2.1.2.2.1.1.131074 = INTEGER: 131074

■「myevent.vbs」

 参考:LogEvent メソッド
 http://msdn.microsoft.com/ja-jp/library/cc364408.aspx

> type myevent.vbs
C:\>type myevent.vbs
'-------------------------------------------------------------------------------

'0 :SUCCESS(成功)
'1 :ERROR
'2 :WARNING
'4 :INFO
'8 :AUDIT_SUCCESS
'16:AUDIT_FAILURE
'-------------------------------------------------------------------------------


'[Call Section]
'  WScript.Shell
'  WScript.Arguments
'
Set objShell = Wscript.CreateObject("Wscript.Shell")
Set objArgs = WScript.Arguments

'[Default Arguments Section]
'

MYEVENT_ID = 0
MYEVENT_MSG = "Default Message"

'[Get Augument Section]
'

If objArgs.Count >= 1 Then
    MYEVENT_ID = objArgs(0)
End If
If objArgs.Count >= 2 Then
    MYEVENT_MSG = objArgs(1)
End If

'Eventlog Source is "WSH"
objShell.LogEvent MYEVENT_ID, MYEVENT_MSG

■「myevent.vbs」の実行例

> myevent.vbs
> myevent.vbs 1 Squid

■引数を渡すバッチの作成

> type mysvcchk.bat
@echo off

cd %~dp0

net start | findstr "Squid" > nill
if %ERRORLEVEL%==0 (
  myevent.vbs 4 "%MYSERVICE_NAME% Running"
) ELSE (
  myevent.vbs 2 "%MYSERVICE_NAME% Stopped"
)

■実行テスト

> mysvcchk.bat

■実行した結果

$ sudo grep "snmptrapd.*\iso" /var/log/syslog | \
  tail -1 | \
  sed s/"= STRING\:\|\.*Uptime\: "/"\n"/g | \
  sed s/"#.*"//g | \
  sed s/"^ *\|\""//g | \
  sed s/".*snmptrapd.*TRAP, "//g | \
  awk '(NR==1||NR==3||NR==5||NR==6) {print $0}'
  xargs echo -n | \
  sed s/"^\|,"/"\"&"/g | \
  sed s/","/"&\""/g | \
  sed s/"\,\"\$"/"\n"/
"SNMP v1"," community public"," Squid Running"," DUMMY-WINXP"," 4"

■ウインドウを隠すVBS
 「Wscript.Echo objShell.CurrentDirectory」はどのディレクトリで実行されているかの確認用。

> type run.vbs
Set objShell = WScript.CreateObject("WScript.Shell")
'Wscript.Echo objShell.CurrentDirectory
objShell.Run "mysvcchk.bat",0

■タスクで1分間隔でテスト、問題が無ければ15分間隔に変更する。