/
fdb.go
73 lines (60 loc) · 1.32 KB
/
fdb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main
import (
"fmt"
"net"
"strings"
"github.com/Asphaltt/go-iproute2/bridge"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(fdbCmd())
}
func fdbCmd() *cobra.Command {
fdbCmd := &cobra.Command{
Use: "fdb",
Run: func(cmd *cobra.Command, args []string) {
cli.runCmd(cli.listFdb)
},
}
fdbCmd.AddCommand(&cobra.Command{
Use: "list",
Aliases: []string{"l", "ls", "lis", "lst", "s", "sh", "sho", "show"},
Run: func(cmd *cobra.Command, args []string) {
cli.runCmd(cli.listFdb)
},
})
return fdbCmd
}
func (c *client) listFdb() {
bcli := bridge.New(c.conn)
entries, err := bcli.ListFdb()
if err != nil {
fmt.Println("failed to list fdb entries, err:", err)
return
}
for _, e := range entries {
printListFdb(e)
}
}
func printListFdb(e *bridge.FdbEntry) {
var devName string
if ifi, err := net.InterfaceByIndex(e.Ifindex); err == nil {
devName = ifi.Name
}
var b strings.Builder
b.WriteString(fmt.Sprintf("%s dev %s ", e.Lladdr, devName))
if e.Vlan != 0 {
b.WriteString(fmt.Sprintf("vlan %d ", e.Vlan))
}
if e.Flag != 0 {
b.WriteString(fmt.Sprintf("%s ", e.Flag))
}
if e.Master != 0 {
ifi, err := net.InterfaceByIndex(e.Master)
if err == nil {
b.WriteString(fmt.Sprintf("master %s ", ifi.Name))
}
}
b.WriteString(e.State.String())
fmt.Println(b.String())
}