From cdd6ed548c723d1a9c498868fb955be04f6fe19d Mon Sep 17 00:00:00 2001 From: Martynas Pumputis Date: Wed, 19 Oct 2016 15:51:25 +0100 Subject: [PATCH] Add netdev subcommands to weaveutil The subcommands are going to be used with WithNetNS wrapper. --- common/utils.go | 4 +- prog/weaveutil/main.go | 4 ++ prog/weaveutil/netdev.go | 97 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 2 deletions(-) diff --git a/common/utils.go b/common/utils.go index 19c0d2dd..71cdaf84 100644 --- a/common/utils.go +++ b/common/utils.go @@ -76,7 +76,7 @@ func forEachLink(f func(netlink.Link) error) error { return nil } -func linkToNetDev(link netlink.Link) (NetDev, error) { +func LinkToNetDev(link netlink.Link) (NetDev, error) { addrs, err := netlink.AddrList(link, netlink.FAMILY_V4) if err != nil { return NetDev{}, err @@ -164,5 +164,5 @@ func GetBridgeNetDev(bridgeName string) (NetDev, error) { return NetDev{}, err } - return linkToNetDev(link) + return LinkToNetDev(link) } diff --git a/prog/weaveutil/main.go b/prog/weaveutil/main.go index 5cf72e46..2381827d 100644 --- a/prog/weaveutil/main.go +++ b/prog/weaveutil/main.go @@ -24,6 +24,10 @@ func init() { "attach-container": attach, "detach-container": detach, "configure-arp": configureARP, + "check-iface": checkIface, + "del-iface": delIface, + "setup-iface": setupIface, + "list-netdevs": listNetDevs, } } diff --git a/prog/weaveutil/netdev.go b/prog/weaveutil/netdev.go index 4fee6ee4..a89b82af 100644 --- a/prog/weaveutil/netdev.go +++ b/prog/weaveutil/netdev.go @@ -1,14 +1,75 @@ package main import ( + "fmt" + "strconv" "strings" + "github.com/coreos/go-iptables/iptables" "github.com/j-keck/arping" "github.com/vishvananda/netlink" + "github.com/weaveworks/weave/common" weavenet "github.com/weaveworks/weave/net" ) +// checkIface returns an error if the given interface cannot be found. +func checkIface(args []string) error { + if len(args) != 1 { + cmdUsage("check-iface", "") + } + ifaceName := args[0] + + if _, err := netlink.LinkByName(ifaceName); err != nil { + return err + } + + return nil +} + +func delIface(args []string) error { + if len(args) != 1 { + cmdUsage("del-iface", "") + } + ifName := args[0] + + link, err := netlink.LinkByName(ifName) + if err != nil { + return err + } + return netlink.LinkDel(link) +} + +// setupIface renames the given iface and configures its ARP cache settings. +func setupIface(args []string) error { + if len(args) != 2 { + cmdUsage("setup-iface", " ") + } + ifaceName := args[0] + newIfName := args[1] + + ipt, err := iptables.New() + if err != nil { + return err + } + + link, err := netlink.LinkByName(ifaceName) + if err != nil { + return err + } + if err := netlink.LinkSetName(link, newIfName); err != nil { + return err + } + if err := weavenet.ConfigureARPCache(newIfName); err != nil { + return err + } + if err := ipt.Append("filter", "INPUT", "-i", newIfName, "-d", "224.0.0.0/4", "-j", "DROP"); err != nil { + return err + } + + return nil +} + func configureARP(args []string) error { if len(args) != 1 { cmdUsage("configure-arp", "") @@ -33,3 +94,39 @@ func configureARP(args []string) error { return nil } + +// listNetDevs outputs network ifaces identified by the given indexes +// in the format of weavenet.Dev. +func listNetDevs(args []string) error { + if len(args) != 1 { + cmdUsage("list-netdevs", "[,]") + } + + indexes := make(map[int]struct{}) + for _, index := range strings.Split(args[0], ",") { + if index != "" { + id, err := strconv.Atoi(index) + if err != nil { + return err + } + indexes[id] = struct{}{} + } + } + + links, err := netlink.LinkList() + if err != nil { + return err + } + + for _, link := range links { + if _, found := indexes[link.Attrs().Index]; found { + netdev, err := common.LinkToNetDev(link) + if err != nil { + return err + } + fmt.Println(netdev) + } + } + + return nil +}