シン・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の運営にも貢献できるのでよろしくお願います。