diff options
author | ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp> | 2015-06-12 13:02:34 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2015-06-25 22:26:06 +0900 |
commit | 854cf36c7460f3240a0126322e5d03b929a1c3d0 (patch) | |
tree | 31beda98c5fd78ce31493b0650c84f18c51390f9 | |
parent | e17379e9d954dcd105bc39bcbaf011443815e8f2 (diff) |
cli: add a command to monitor changes of best paths
$ gobgp monitor global rib
[ROUTE] 10.0.1.0/24 via 192.168.10.3 aspath [65001] attrs [{Origin: IGP} {Med: 0}]
[ROUTE] 10.0.2.0/24 via 192.168.10.4 aspath [65002] attrs [{Origin: IGP} {Med: 0}]
[ROUTE] 10.0.3.0/24 via 192.168.10.5 aspath [65003] attrs [{Origin: IGP} {Med: 0}]
[ROUTE] 10.0.4.0/24 via 192.168.10.6 aspath [65004] attrs [{Origin: IGP} {Med: 0}]
[DELROUTE] 10.0.4.0/24 via 192.168.10.6 aspath [65004] attrs [{Origin: IGP} {Med: 0}]
[DELROUTE] 10.0.2.0/24 via 192.168.10.4 aspath [65002] attrs [{Origin: IGP} {Med: 0}]
[DELROUTE] 10.0.3.0/24 via 192.168.10.5 aspath [65003] attrs [{Origin: IGP} {Med: 0}]
[ROUTE] 10.0.3.0/24 via 192.168.10.5 aspath [65003] attrs [{Origin: IGP} {Med: 100}]
[ROUTE] 10.0.6.0/24 via 192.168.10.5 aspath [65003 65005] attrs [{Origin: IGP} {Med: 100}]
[ROUTE] 10.0.2.0/24 via 192.168.10.4 aspath [65002] attrs [{Origin: IGP} {Med: 200}]
Signed-off-by: ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>
-rw-r--r-- | gobgp/common.go | 1 | ||||
-rw-r--r-- | gobgp/global.go | 2 | ||||
-rw-r--r-- | gobgp/main.go | 3 | ||||
-rw-r--r-- | gobgp/monitor.go | 72 | ||||
-rw-r--r-- | gobgp/neighbor.go | 17 |
5 files changed, 88 insertions, 7 deletions
diff --git a/gobgp/common.go b/gobgp/common.go index d7d9e2c4..0ae61af7 100644 --- a/gobgp/common.go +++ b/gobgp/common.go @@ -52,6 +52,7 @@ const ( CMD_ACTIONS = "actions" CMD_IMPORT = "import" CMD_EXPORT = "export" + CMD_MONITOR = "monitor" ) var subOpts struct { diff --git a/gobgp/global.go b/gobgp/global.go index b5f19ad3..93bd1fde 100644 --- a/gobgp/global.go +++ b/gobgp/global.go @@ -70,7 +70,7 @@ func showGlobalRib() error { sort.Sort(ps) - showRoute(ps, true, true) + showRoute(ps, true, true, false) return nil } diff --git a/gobgp/main.go b/gobgp/main.go index ba6c8d5f..79629380 100644 --- a/gobgp/main.go +++ b/gobgp/main.go @@ -58,9 +58,10 @@ func main() { globalCmd := NewGlobalCmd() neighborCmd := NewNeighborCmd() policyCmd := NewPolicyCmd() + monitorCmd := NewMonitorCmd() rootCmd.AddCommand(globalCmd) rootCmd.AddCommand(neighborCmd) rootCmd.AddCommand(policyCmd) - + rootCmd.AddCommand(monitorCmd) rootCmd.Execute() } diff --git a/gobgp/monitor.go b/gobgp/monitor.go new file mode 100644 index 00000000..b57b1451 --- /dev/null +++ b/gobgp/monitor.go @@ -0,0 +1,72 @@ +// Copyright (C) 2015 Nippon Telegraph and Telephone Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +// implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "fmt" + "github.com/osrg/gobgp/api" + "github.com/spf13/cobra" + "golang.org/x/net/context" + "io" + "net" + "os" +) + +func NewMonitorCmd() *cobra.Command { + ribCmd := &cobra.Command{ + Use: CMD_RIB, + Run: func(cmd *cobra.Command, args []string) { + rt, err := checkAddressFamily(net.IP{}) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + arg := &api.Arguments{ + Resource: api.Resource_GLOBAL, + Af: rt, + } + + stream, err := client.MonitorBestChanged(context.Background(), arg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + for { + p, err := stream.Recv() + if err == io.EOF { + break + } else if err != nil { + fmt.Println(err) + os.Exit(1) + } + showRoute([]*api.Path{p}, false, false, true) + } + + }, + } + + globalCmd := &cobra.Command{ + Use: CMD_GLOBAL, + } + globalCmd.AddCommand(ribCmd) + + monitorCmd := &cobra.Command{ + Use: CMD_MONITOR, + } + monitorCmd.AddCommand(globalCmd) + + return monitorCmd +} diff --git a/gobgp/neighbor.go b/gobgp/neighbor.go index 8d311f9b..c478f7a1 100644 --- a/gobgp/neighbor.go +++ b/gobgp/neighbor.go @@ -223,7 +223,7 @@ type AsPathFormat struct { separator string } -func showRoute(pathList []*api.Path, showAge bool, showBest bool) { +func showRoute(pathList []*api.Path, showAge bool, showBest bool, isMonitor bool) { var pathStrs [][]interface{} maxPrefixLen := len("Network") @@ -352,8 +352,13 @@ func showRoute(pathList []*api.Path, showAge bool, showBest bool) { if maxAsPathLen < len(aspath(p.Attrs)) { maxAsPathLen = len(aspath(p.Attrs)) } - - if showAge { + if isMonitor { + title := "ROUTE" + if p.IsWithdraw { + title = "DELROUTE" + } + pathStrs = append(pathStrs, []interface{}{title, p.Nlri.Prefix, p.Nexthop, aspath(p.Attrs), formatAttrs(p.Attrs)}) + } else if showAge { pathStrs = append(pathStrs, []interface{}{best, p.Nlri.Prefix, p.Nexthop, aspath(p.Attrs), formatTimedelta(p.Age), formatAttrs(p.Attrs)}) } else { pathStrs = append(pathStrs, []interface{}{best, p.Nlri.Prefix, p.Nexthop, aspath(p.Attrs), formatAttrs(p.Attrs)}) @@ -361,7 +366,9 @@ func showRoute(pathList []*api.Path, showAge bool, showBest bool) { } var format string - if showAge { + if isMonitor { + format = "[%s] %s via %s aspath [%s] attrs %s\n" + } else if showAge { format = fmt.Sprintf("%%-2s %%-%ds %%-%ds %%-%ds %%-10s %%-s\n", maxPrefixLen, maxNexthopLen, maxAsPathLen) fmt.Printf(format, "", "Network", "Next Hop", "AS_PATH", "Age", "Attrs") } else { @@ -455,7 +462,7 @@ func showNeighborRib(r string, remoteIP net.IP) error { } sort.Sort(ps) - showRoute(ps, showAge, showBest) + showRoute(ps, showAge, showBest, false) return nil } |