123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package sandbox
- import (
- "fmt"
- "net"
- "os"
- "runtime"
- "github.com/vishvananda/netlink"
- "github.com/vishvananda/netns"
- )
- func configureInterface(iface netlink.Link, settings *Interface) error {
- ifaceName := iface.Attrs().Name
- ifaceConfigurators := []struct {
- Fn func(netlink.Link, *Interface) error
- ErrMessage string
- }{
- {setInterfaceName, fmt.Sprintf("error renaming interface %q to %q", ifaceName, settings.DstName)},
- {setInterfaceIP, fmt.Sprintf("error setting interface %q IP to %q", ifaceName, settings.Address)},
- {setInterfaceIPv6, fmt.Sprintf("error setting interface %q IPv6 to %q", ifaceName, settings.AddressIPv6)},
- }
- for _, config := range ifaceConfigurators {
- if err := config.Fn(iface, settings); err != nil {
- return fmt.Errorf("%s: %v", config.ErrMessage, err)
- }
- }
- return nil
- }
- func setGatewayIP(path string, gw net.IP) error {
- runtime.LockOSThread()
- defer runtime.UnlockOSThread()
- origns, err := netns.Get()
- if err != nil {
- return err
- }
- defer origns.Close()
- f, err := os.OpenFile(path, os.O_RDONLY, 0)
- if err != nil {
- return fmt.Errorf("failed get network namespace %q: %v", path, err)
- }
- defer f.Close()
- nsFD := f.Fd()
- if err = netns.Set(netns.NsHandle(nsFD)); err != nil {
- return err
- }
- defer netns.Set(origns)
- return netlink.RouteAdd(&netlink.Route{
- Scope: netlink.SCOPE_UNIVERSE,
- Gw: gw,
- })
- }
- func setInterfaceIP(iface netlink.Link, settings *Interface) error {
- ipAddr := &netlink.Addr{IPNet: settings.Address, Label: ""}
- return netlink.AddrAdd(iface, ipAddr)
- }
- func setInterfaceIPv6(iface netlink.Link, settings *Interface) error {
- if settings.AddressIPv6 == nil {
- return nil
- }
- ipAddr := &netlink.Addr{IPNet: settings.AddressIPv6, Label: ""}
- return netlink.AddrAdd(iface, ipAddr)
- }
- func setInterfaceName(iface netlink.Link, settings *Interface) error {
- return netlink.LinkSetName(iface, settings.DstName)
- }
|