diff --git a/cmd/network/network.go b/cmd/network/network.go index 4a0a8e62..366bf01d 100755 --- a/cmd/network/network.go +++ b/cmd/network/network.go @@ -6,11 +6,12 @@ import ( "github.com/rancher/os/docker" "github.com/rancher/os/log" + "io/ioutil" + "github.com/docker/libnetwork/resolvconf" "github.com/rancher/os/config" "github.com/rancher/os/hostname" "github.com/rancher/os/netconf" - "io/ioutil" ) func Main() { @@ -37,13 +38,13 @@ func ApplyNetworkConfig(cfg *config.CloudConfig) { userSetDNS := len(cfg.Rancher.Network.DNS.Nameservers) > 0 || len(cfg.Rancher.Network.DNS.Search) > 0 if err := hostname.SetHostnameFromCloudConfig(cfg); err != nil { - log.Error(err) + log.Errorf("Failed to set hostname from cloud config: %v", err) } userSetHostname := cfg.Hostname != "" dhcpSetDNS, err := netconf.ApplyNetworkConfigs(&cfg.Rancher.Network, userSetHostname, userSetDNS) if err != nil { - log.Error(err) + log.Errorf("Failed to apply network configs(by netconf): %v", err) } if dhcpSetDNS { @@ -57,12 +58,12 @@ func ApplyNetworkConfig(cfg *config.CloudConfig) { cfg.Rancher.Defaults.Network.DNS.Nameservers, cfg.Rancher.Defaults.Network.DNS.Search, nil); err != nil { - log.Error(err) + log.Errorf("Failed to write resolv.conf (!userSetDNS and !dhcpSetDNS): %v", err) } } if userSetDNS { if _, err := resolvconf.Build("/etc/resolv.conf", cfg.Rancher.Network.DNS.Nameservers, cfg.Rancher.Network.DNS.Search, nil); err != nil { - log.Error(err) + log.Errorf("Failed to write resolv.conf (userSetDNS): %v", err) } else { log.Infof("writing to /etc/resolv.conf: nameservers: %v, search: %v", cfg.Rancher.Network.DNS.Nameservers, cfg.Rancher.Network.DNS.Search) } @@ -73,6 +74,6 @@ func ApplyNetworkConfig(cfg *config.CloudConfig) { log.Infof("Apply Network Config SyncHostname") if err := hostname.SyncHostname(); err != nil { - log.Error(err) + log.Errorf("Failed to sync hostname: %v", err) } } diff --git a/netconf/netconf_linux.go b/netconf/netconf_linux.go index 1cb45a01..83e341ea 100755 --- a/netconf/netconf_linux.go +++ b/netconf/netconf_linux.go @@ -177,7 +177,10 @@ func ApplyNetworkConfigs(netCfg *NetworkConfig, userSetHostname, userSetDNS bool //apply network config for _, link := range links { - applyOuter(link, netCfg, &wg, userSetHostname, userSetDNS) + linkName := link.Attrs().Name + if linkName != "lo" { + applyOuter(link, netCfg, &wg, userSetHostname, userSetDNS) + } } wg.Wait() @@ -186,26 +189,27 @@ func ApplyNetworkConfigs(netCfg *NetworkConfig, userSetHostname, userSetDNS bool dnsSet := false for _, link := range links { linkName := link.Attrs().Name - log.Infof("dns testing %s", linkName) - lease := getDhcpLease(linkName) - if _, ok := lease["domain_name_servers"]; ok { - log.Infof("dns was dhcp set for %s", linkName) - dnsSet = true + if linkName != "lo" { + log.Infof("dns testing %s", linkName) + lease := getDhcpLease(linkName) + if _, ok := lease["domain_name_servers"]; ok { + log.Infof("dns was dhcp set for %s", linkName) + dnsSet = true + } } } - return dnsSet, err + return dnsSet, nil } func applyOuter(link netlink.Link, netCfg *NetworkConfig, wg *sync.WaitGroup, userSetHostname, userSetDNS bool) { - log.Debugf("applyOuter(%V, %v)", userSetHostname, userSetDNS) + linkName := link.Attrs().Name + log.Debugf("applyOuter(%v, %v), link: %s", userSetHostname, userSetDNS, linkName) match, ok := findMatch(link, netCfg) if !ok { return } - linkName := link.Attrs().Name - log.Debugf("Config(%s): %#v", linkName, match) runCmds(match.PreUp, linkName) defer runCmds(match.PostUp, linkName) @@ -215,9 +219,7 @@ func applyOuter(link netlink.Link, netCfg *NetworkConfig, wg *sync.WaitGroup, us log.Errorf("Failed to apply settings to %s : %v", linkName, err) } } - if linkName == "lo" { - return - } + if !match.DHCP && !hasDhcp(linkName) { log.Debugf("Skipping(%s): DHCP=false && no DHCP lease yet", linkName) return @@ -254,18 +256,21 @@ func getDhcpLease(iface string) (lease map[string]string) { } func getDhcpLeaseString(iface string) []byte { - cmd := exec.Command("dhcpcd", "-U", iface) + args := defaultDhcpArgs + args = append(args, "-U", iface) + cmd := exec.Command(args[0], args[1:]...) //cmd.Stderr = os.Stderr out, err := cmd.Output() + log.Debugf("Running cmd: %s, output: %s", args, string(out)) if err != nil { - log.Error(err) + // dhcpcd works fine, but gets an error: exit status 1 + log.Warnf("Failed to run cmd: %s, error: %v", args, err) } return out } func hasDhcp(iface string) bool { out := getDhcpLeaseString(iface) - log.Debugf("dhcpcd -U %s: %s", iface, out) return len(out) > 0 } @@ -300,7 +305,7 @@ func runDhcp(netCfg *NetworkConfig, iface string, argstr string, setHostname, se cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { - log.Error(err) + log.Errorf("Failed to run dhcpcd for %s: %v", iface, err) } }