見出し画像

TWSNMP FC: ログ関連のページ完成

夜中に何度か猫にに起こされました。4時近くになったので自発的に起きると猫はかみさんの布団に潜って寝てしまいました。
昨日の朝作ったNetFlowのページを夜試してみました。どうもNetFlowのデータを送るプログラムを起動していないことに気づきました。しばらくWindowsマシンを操作していなかったのでアップデートのため再起動された時にいろいろなプログラムが停止していました。必要なプロログラムを起動すると、NetFlowの画面も表示できました。

画像2

画像1

のような感じです。
ログ表示のページを全て作ってみるとGO言語のサーバー側で同じようなソースコードが沢山でてきました。これは関数にまとめたほうがよいと思って整理しました。

var logLevelMap = map[string]*regexp.Regexp{
	"high": regexp.MustCompile("high"),
	"low":  regexp.MustCompile("(high|low)"),
	"warn": regexp.MustCompile("(high|low|warn)"),
}

func makeTimeFilter(sd, st string, oh int) int64 {
	var t time.Time
	var err error
	if t, err = time.Parse("2006-01-02T15:04 MST", fmt.Sprintf("%sT%s JST", sd, st)); err != nil {
		log.Printf("makeTimeFilter err=%v", err)
		t = time.Now().Add(-time.Hour * time.Duration(oh))
	}
	return t.UnixNano()
}

func makeStringFilter(f string) *regexp.Regexp {
	if f == "" {
		return nil
	}
	r, err := regexp.Compile(f)
	if err != nil {
		log.Printf("makeStringFilter err=%v", err)
		return nil
	}
	return r
}

func getLogLevelFilter(f string) *regexp.Regexp {
	return logLevelMap[f]
}

という関数にまとめることで、

	var srcFilter *regexp.Regexp
	if filter.Src != "" {
		if srcFilter, err = regexp.Compile(filter.Src); err != nil {
			log.Printf("postSyslog err=%v", err)
			return echo.ErrBadRequest
		}
	}
	var dstFilter *regexp.Regexp
	if filter.Dst != "" {
		if dstFilter, err = regexp.Compile(filter.Dst); err != nil {
			log.Printf("postSyslog err=%v", err)
			return echo.ErrBadRequest
		}
	}
	var protocolFilter *regexp.Regexp
	if filter.Protocol != "" {
		if protocolFilter, err = regexp.Compile(filter.Protocol); err != nil {
			log.Printf("postSyslog err=%v", err)
			return echo.ErrBadRequest
		}
	}
	st := time.Now().Add(-time.Hour * 24).UnixNano()
	if t, err := time.Parse("2006-01-02T15:04 MST", fmt.Sprintf("%sT%s JST", filter.StartDate, filter.StartTime)); err == nil {
		st = t.UnixNano()
	}
	et := time.Now().UnixNano()
	if t, err := time.Parse("2006-01-02T15:04 MST", fmt.Sprintf("%sT%s JST", filter.EndDate, filter.EndTime)); err == nil {
		et = t.UnixNano()
	}

のように書いていた処理を、

	srcFilter := makeStringFilter(filter.Src)
	dstFilter := makeStringFilter(filter.Dst)
	protocolFilter := makeStringFilter(filter.Protocol)
	st := makeTimeFilter(filter.StartDate, filter.EndDate, 3)
	et := makeTimeFilter(filter.EndDate, filter.EndTime, 0)

のように整理できました。これは気持ちよいです。

昨日と今日の開発は

です。明日に続く。



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