From bfb94377f42f0d0ab23cec1c76b99f5dd1b4a757 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sat, 12 Jun 2021 18:25:37 +0200 Subject: [PATCH] netconfig: move bridge creation into its own function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit also don’t short-circuit the rest of the configuration if bridge config fails --- internal/netconfig/netconfig.go | 52 +++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/internal/netconfig/netconfig.go b/internal/netconfig/netconfig.go index c6350a6..4d0598e 100644 --- a/internal/netconfig/netconfig.go +++ b/internal/netconfig/netconfig.go @@ -240,30 +240,10 @@ func LinkAddress(dir, ifname string) (net.IP, error) { return ip, err } -func applyInterfaces(dir, root string) error { - b, err := ioutil.ReadFile(filepath.Join(dir, "interfaces.json")) - if err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - var cfg InterfaceConfig - if err := json.Unmarshal(b, &cfg); err != nil { - return err - } - byName := make(map[string]InterfaceDetails) - byHardwareAddr := make(map[string]InterfaceDetails) - for _, details := range cfg.Interfaces { - byHardwareAddr[details.HardwareAddr] = details - if spoof := details.SpoofHardwareAddr; spoof != "" { - byHardwareAddr[spoof] = details - } - byName[details.Name] = details - } - +func applyBridges(cfg *InterfaceConfig) error { for _, bridge := range cfg.Bridges { if _, err := netlink.LinkByName(bridge.Name); err != nil { + log.Printf("creating bridge %s", bridge.Name) link := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: bridge.Name}} if err := netlink.LinkAdd(link); err != nil { return fmt.Errorf("netlink.LinkAdd: %v", err) @@ -310,6 +290,34 @@ func applyInterfaces(dir, root string) error { } } } + return nil +} + +func applyInterfaces(dir, root string) error { + b, err := ioutil.ReadFile(filepath.Join(dir, "interfaces.json")) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + var cfg InterfaceConfig + if err := json.Unmarshal(b, &cfg); err != nil { + return err + } + byName := make(map[string]InterfaceDetails) + byHardwareAddr := make(map[string]InterfaceDetails) + for _, details := range cfg.Interfaces { + byHardwareAddr[details.HardwareAddr] = details + if spoof := details.SpoofHardwareAddr; spoof != "" { + byHardwareAddr[spoof] = details + } + byName[details.Name] = details + } + + if err := applyBridges(&cfg); err != nil { + log.Printf("applyBridges: %v", err) + } links, err := netlink.LinkList() if err != nil {