diff options
-rw-r--r-- | app/anygone.go | 14 | ||||
-rw-r--r-- | app/conf.go | 16 | ||||
-rw-r--r-- | tuntap/tuntap.go | 34 |
3 files changed, 48 insertions, 16 deletions
diff --git a/app/anygone.go b/app/anygone.go index 8c1ca1b..239f4e8 100644 --- a/app/anygone.go +++ b/app/anygone.go @@ -75,9 +75,17 @@ func main() { os.Exit(1) } - if err = dev.Configure(cfg.IFConfig.String(), cfg.PostUp); err != nil { - al.Printf("Error while configuring device: %v", err) - os.Exit(1) + if cfg.IFConfig.Valid { + if err = dev.Configure(cfg.IFConfig.Net); err != nil { + al.Printf("Error while configuring device: %v", err) + os.Exit(1) + } + } + if cfg.PostUp != "" { + if err = dev.RunPostUp(cfg.PostUp); err != nil { + al.Printf("Error while running post-up script: %v", err) + os.Exit(1) + } } for { diff --git a/app/conf.go b/app/conf.go index defe102..5066808 100644 --- a/app/conf.go +++ b/app/conf.go @@ -40,29 +40,29 @@ import ( "github.com/spf13/pflag" ) -// IPNet adapts net.IPNet for use as a flag. -type IPNet struct { +type IPAddrCIDR struct { Net net.IPNet Valid bool } -func (ipnet IPNet) String() string { +func (ipnet IPAddrCIDR) String() string { if ipnet.Valid { return ipnet.Net.String() } return "" } -func (ipnet *IPNet) Set(value string) error { - _, n, err := net.ParseCIDR(strings.TrimSpace(value)) +func (ipnet *IPAddrCIDR) Set(value string) error { + ip, net, err := net.ParseCIDR(strings.TrimSpace(value)) if err != nil { return err } - *ipnet = IPNet{*n, true} + net.IP = ip + *ipnet = IPAddrCIDR{*net, true} return nil } -func (*IPNet) Type() string { +func (*IPAddrCIDR) Type() string { return "ipNet" } @@ -74,7 +74,7 @@ type Config struct { Version bool DeviceName string DeviceType string - IFConfig IPNet + IFConfig IPAddrCIDR PostUp string } diff --git a/tuntap/tuntap.go b/tuntap/tuntap.go index 27fd2b1..6c27171 100644 --- a/tuntap/tuntap.go +++ b/tuntap/tuntap.go @@ -32,22 +32,44 @@ package tuntap import ( "fmt" + "net" "strings" extlib "github.com/lab11/go-tuntap/tuntap" + "github.com/vishvananda/netlink" ) type Device struct { iface *extlib.Interface iftype extlib.DevKind + ifname string } -func (dev *Device) Configure(ip_mask string, postup string) error { - fmt.Printf("running: ip link set up dev %s\n", dev.iface.Name()) - fmt.Printf("running: ip addr add dev %s %s\n", dev.iface.Name(), ip_mask) - if postup != "" { - fmt.Printf("running: %s %s\n", postup, dev.iface.Name()) +func (dev *Device) Name() string { + return dev.ifname +} + +func (dev *Device) Configure(addr net.IPNet) error { + // TODO: this only works on linux... + ln, err := netlink.LinkByName(dev.ifname) + if err != nil { + return fmt.Errorf("netlink(open netlink by name) failed: %v", dev.ifname, err) + } + if err = netlink.AddrAdd(ln, &netlink.Addr{IPNet: &addr}); err != nil { + return fmt.Errorf("netlink(addr add) failed: %v", err) + } + if err = netlink.LinkSetMTU(ln, 1400); err != nil { // TODO: hardcoded value + return fmt.Errorf("netlink(link set mtu) failed: %v", err) } + if err = netlink.LinkSetUp(ln); err != nil { + return fmt.Errorf("netlink(link set up) failed: %v", err) + } + return nil +} + +func (dev *Device) RunPostUp(script string) error { + // TODO: implement this + fmt.Printf("running: %s %s\n", script, dev.iface.Name()) return nil } @@ -69,6 +91,7 @@ func NewTunDevice(name string) (dev *Device, err error) { if dev.iface, err = extlib.Open(name, extlib.DevTun, true); err != nil { return } + dev.ifname = strings.TrimRight(dev.iface.Name(), "\x00") // TODO: fix this upstream return } @@ -77,6 +100,7 @@ func NewTapDevice(name string) (dev *Device, err error) { if dev.iface, err = extlib.Open(name, extlib.DevTap, false); err != nil { return } + dev.ifname = strings.TrimRight(dev.iface.Name(), "\x00") // TODO: fix this upstream return } |