見出し画像

TWSNMP開発日誌:夏休みの宿題2つ解決(syslogとARP監視の問題)

今朝は3時台に一度起きましたが、二度寝して4時半から開発開始です。
昨日からTWSNMP FCの夏休みの宿題に取り組んでいます。2つあります。
1つ目は、モバイル版のsyslogサーバーテスト機能を作っている時に発見したRFC5424(IETF)形式のsyslogが受信できない問題の調査です。
最初は使っているGO言語のsyslogのパッケージを疑っていました。

です。RFC5424(IETF)形式のログの解析ができないのではないかと思ってソースコードをダウンロードして調べてみました。GO言語の古い書き方なので組み込まれているテストコードをうまく動かすことができませんでした。
そこで、パッケージのテストするプログラムを別に作ってみました。

package main

import (
	"fmt"

	"gopkg.in/mcuadros/go-syslog.v2/format"
)

func main() {
	b := `<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] An application event log entry...`
	// b := "<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - 'su root' failed for lonvick on /dev/pts/8"
	// b := "<165>1 2003-08-24T05:14:15.000003-07:00 192.0.2.1 myproc 8710 - - %% It's time to make the do-nuts."
	// b := "<165>1 2003-08-24T05:14:15.000003-07:00 192.0.2.1 012345678901234567890123456789012345678901234567 8710 - - %% It's time to make the do-nuts."
	// with STRUCTURED-DATA
	// b := `<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] An application event log entry...`

	// STRUCTURED-DATA Only
	// b := `<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource= "Application" eventID="1011"][examplePriority@32473 class="high"]`
	// STRUCTURED-DATA Only
	// b := `<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 `
	// b := "<34>Oct 11 22:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8"

	buff := []byte(b)

	// p := format.Automatic{}
	p := format.RFC5424{}
	logp := p.GetParser(buff)
	if logp == nil {
		panic("err")
	}
	err := logp.Parse()
	if err != nil {
		panic(err)
	}
	fmt.Println(logp.Dump())
}

思っていたのと違って、ちゃんとsyslogを解析できました。人の作ったものを疑ってすみません。テストプログラムの出力をよく見ると
TWSNMP FCで受信できるBSD形式のsyslogは、

map[content:'su root' failed for lonvick on /dev/pts/8 facility:4 hostname:mymachine priority:34 severity:2 tag:su timestamp:2022-10-11 22:14:15 +0000 UTC]

受信できないRFC5424(IETF)形式は、

map[app_name:evntslog facility:20 hostname:mymachine.example.com message:An application event log entry... msg_id:ID47 priority:165 proc_id:- severity:5 structured_data:[exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] t

です。tagがapp_nameにcontentがmessageになっています。
この影響で受信したsyslogはDBに記録できていても検索の時に、tagやcontentの項目がないために結果に含めない状態になっていました。
このためにログの検索で表示されなかったのです。受信はできていたのです。この問題を修正しました。

2つ目の宿題は、利用者から問い合わせにあったARP監視の結果で通知したいという課題です。ARPログをポーリングで監視する機能が使えない状態だったので修正しました。最初は選択子がないだけの問題かと思っていましたが、内部処理にもいくつか間違いがあって修正しました。
ポーリングの設定画面も縦長でノートPCとかだとはみ出しそうなので、
ついでに修正しました。


のような感じにしました。
赤い矢印のように設定すればARPログに新規のMACアドレスを発見した時に、軽度のイベントが発生します。これをトリガーにメール通知もできます。フィルターのNewという設定を空欄にすれば、変化した時も検知できます。Changeを設定すれば変化した時だけ通知できます。

もう少しテストして来週v1.12.2としてリリースしようと思います

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。