11package rosospf
22
33import (
4- "bytes"
54 "encoding/gob"
65 "github.com/BaiMeow/NetworkMonitor/graph/entity"
76 "log"
@@ -22,8 +21,9 @@ func init() {
2221}
2322
2423var (
25- ros6BodyPtpReg = regexp .MustCompile (`Point-To-Point ((?:[0-9]{1,3}\.){3}[0-9]{1,3}) (?:[0-9]{1,3}\.){3}[0-9]{1,3} (\d+)` )
26- ros7BodyPtpReg = regexp .MustCompile (`type=p2p id=((?:[0-9]{1,3}\.){3}[0-9]{1,3}) data=(?:[0-9]{1,3}\.){3}[0-9]{1,3} metric=(\d+)` )
24+ ros6BodyPtpReg = regexp .MustCompile (`Point-To-Point ((?:[0-9]{1,3}\.){3}[0-9]{1,3}) (?:[0-9]{1,3}\.){3}[0-9]{1,3} (\d+)` )
25+ ros7BodyPtpReg = regexp .MustCompile (`type=p2p id=((?:[0-9]{1,3}\.){3}[0-9]{1,3}) data=(?:[0-9]{1,3}\.){3}[0-9]{1,3} metric=(\d+)` )
26+ ros7BodyNetworkReg = regexp .MustCompile (`type=network id=((?:[0-9]{1,3}\.){3}[0-9]{1,3}) data=(?:[0-9]{1,3}\.){3}[0-9]{1,3} metric=(\d+)` )
2727)
2828
2929var _ parse.Parser [* entity.OSPF ] = (* RosOSPF )(nil )
@@ -32,17 +32,21 @@ type RosOSPF struct {
3232 parse.Base [* entity.OSPF ]
3333}
3434
35+ type network struct {
36+ cost int
37+ area string
38+ routers []string
39+ }
40+
3541func (p * RosOSPF ) Parse (input any ) (* entity.OSPF , error ) {
36- raw , ok := input .([]byte )
42+ sentences , ok := input .([]* proto. Sentence )
3743 if ! ok {
3844 log .Fatalf ("invalid input data type: %s\n " , reflect .TypeOf (input ).Elem ())
3945 }
4046
41- var graph entity.OSPF
42-
43- var sentences []* proto.Sentence
44- gob .NewDecoder (bytes .NewReader (raw )).Decode (& sentences ) // 这里本来应该在初始化就直接处理了,但是因为Init没有抛异常,所以这一步在这里做
47+ networks := make (map [string ]* network )
4548
49+ var graph entity.OSPF
4650 for _ , sentence := range sentences {
4751 if sentence .Word == "!done" { // 这个判断可有可无 因为fetcher已经做了处理
4852 break
@@ -74,6 +78,36 @@ func (p *RosOSPF) Parse(input any) (*entity.OSPF, error) {
7478 }
7579 graph .AddLink (sentence .Map ["area" ], sentence .Map ["id" ], field [1 ], cost )
7680 }
81+ nw := ros7BodyNetworkReg .FindAllStringSubmatch (sentence .Map ["body" ], - 1 )
82+ for _ , field := range nw {
83+ if len (field ) != 3 {
84+ continue
85+ }
86+ cost , err := strconv .Atoi (field [2 ])
87+ if err != nil {
88+ continue
89+ }
90+ nw := networks [field [1 ]]
91+ if nw == nil {
92+ nw = & network {
93+ cost : cost ,
94+ area : sentence .Map ["area" ],
95+ }
96+ networks [field [1 ]] = nw
97+ }
98+ nw .routers = append (nw .routers , sentence .Map ["id" ])
99+ }
77100 }
101+
102+ for _ , network := range networks {
103+ area := graph .GetArea (network .area )
104+ for i := 0 ; i < len (network .routers ); i ++ {
105+ for j := i + 1 ; j < len (network .routers ); j ++ {
106+ area .AddLink (network .routers [i ], network .routers [j ], network .cost )
107+ area .AddLink (network .routers [j ], network .routers [i ], network .cost )
108+ }
109+ }
110+ }
111+
78112 return & graph , nil
79113}
0 commit comments