見出し画像

シン・TWSNMPのNetFlow対応でWindows版だけプロトコルが表示されない

今朝も4時半に、助手の猫さんが起こしてくれました。最近はいいペースです。

今日こそリリースできるかと思ってWindows版の最終テストを行いました。NetFlowの受信はできていましたが、プロトコルの部分だけ空欄でした。
Mac版は問題ないので不思議でした。とりあえずプロトコル名を設定しているNetFlowのパッケージのソースコードを調べてみました。

プロトコルの名前を取得する処理が

var protocol = map[uint8]string{}

func init() {
	if f, err := os.Open("/etc/protocols"); err == nil {
		defer f.Close()

		s := bufio.NewScanner(f)
		for s.Scan() {
			line := s.Text()
			if strings.HasPrefix(line, "#") {
				continue
			}
			fields := strings.Fields(line)
			if len(fields) < 2 {
				continue
			}
			if n, err := strconv.Atoi(fields[1]); err == nil {
				protocol[uint8(n)] = fields[0]
			}
		}
	}
}

// Protocol returns the protocol name
func Protocol(p uint8) string {
	return protocol[p]
}

のようになっていました。つまり/etc/protocolsがない環境だと使えないのです。Windowsではだめはずです。
実際に使われているTCP/IPのプロトコルは、それほど多くなにので

						pi := uint8(getIntFromIPFIXFieldValue(f.Translated.Value))
						switch pi {
						case 1:
							record.Protocol = "icmp"
						case 2:
							record.Protocol = "igmp"
						case 6:
							record.Protocol = "tcp"
						case 8:
							record.Protocol = "egp"
						case 17:
							record.Protocol = "udp"
						case 58:
							record.Protocol = "ipv6-icmp"
						default:
							record.Protocol = read.Protocol(pi)
							if record.Protocol == "" {
								record.Protocol = fmt.Sprintf("%d", pi)
							}
						}

のようにして対応しました。プロトコルも表示できました。TWSNMP FCも同じ問題があると思います。

これで完成かと思ったら

追加したNetFlowのページのヘルプが抜けていました。
明日から休みなので、じっくり作ろうと思います。

明日に続く

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