diff options
Diffstat (limited to 'config')
-rw-r--r-- | config/serve.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/config/serve.go b/config/serve.go new file mode 100644 index 00000000..23e4c1de --- /dev/null +++ b/config/serve.go @@ -0,0 +1,59 @@ +package config + +import ( + "github.com/BurntSushi/toml" +) + +func ReadConfigfileServe(path string, configCh chan BgpType, reloadCh chan bool) { + for { + <-reloadCh + + b := BgpType{} + _, err := toml.DecodeFile(path, &b) + if err == nil { + // TODO: validate configuration + for i, _ := range b.NeighborList { + SetNeighborTypeDefault(&b.NeighborList[i]) + } + } + + configCh <- b + } +} + +func inSlice(n NeighborType, b []NeighborType) bool { + for _, nb := range b { + if nb.NeighborAddress.String() == n.NeighborAddress.String() { + return true + } + } + return false +} + +func UpdateConfig(curC *BgpType, newC *BgpType) (*BgpType, []NeighborType, []NeighborType) { + bgpConfig := BgpType{} + if curC == nil { + bgpConfig.Global = newC.Global + curC = &bgpConfig + } else { + // can't update the global config + bgpConfig.Global = curC.Global + } + added := []NeighborType{} + deleted := []NeighborType{} + + for _, n := range newC.NeighborList { + if inSlice(n, curC.NeighborList) == false { + added = append(added, n) + } + } + + for _, n := range curC.NeighborList { + if inSlice(n, newC.NeighborList) == false { + deleted = append(deleted, n) + } + } + + bgpConfig.NeighborList = newC.NeighborList + return &bgpConfig, added, deleted +} |