Add netdev subcommands to weaveutil

The subcommands are going to be used with WithNetNS wrapper.
This commit is contained in:
Martynas Pumputis committed 2016-10-19 16:07:53 +01:00
1 parent fc940d0017
commit cdd6ed548c
3 files changed
+103 -2

No files matched your search

+2 -2
View File
@@ -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)
}
+4
View File
@@ -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,
}
}
+97
View File
@@ -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", "<iface-name>")
}
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", "<iface-name>")
}
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", "<iface-name> <new-iface-name>")
}
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", "<iface-name-prefix>")
@@ -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", "<iface-index>[,<iface-index>]")
}
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
}