func (net UbuntuNetManager) writeResolvConf(networks boshsettings.Networks) error { buffer := bytes.NewBuffer([]byte{}) const ubuntuResolvConfTemplate = `# Generated by bosh-agent {{ range .DNSServers }}nameserver {{ . }} {{ end }}` t := template.Must(template.New("resolv-conf").Parse(ubuntuResolvConfTemplate)) // Keep DNS servers in the order specified by the network dnsNetwork, _ := networks.DefaultNetworkFor("dns") type dnsConfigArg struct { DNSServers []string } dnsServersArg := dnsConfigArg{dnsNetwork.DNS} err := t.Execute(buffer, dnsServersArg) if err != nil { return bosherr.WrapError(err, "Generating config from template") } err = net.fs.WriteFile("/etc/resolvconf/resolv.conf.d/head", buffer.Bytes()) if err != nil { return bosherr.WrapError(err, "Writing to /etc/resolvconf/resolv.conf.d/head") } _, _, _, err = net.cmdRunner.RunCommand("resolvconf", "-u") if err != nil { return bosherr.WrapError(err, "Updating resolvconf") } return nil }
func (net UbuntuNetManager) writeResolvConf(networks boshsettings.Networks) error { buffer := bytes.NewBuffer([]byte{}) const resolvConfTemplate = `# Generated by bosh-agent {{ range .DNSServers }}nameserver {{ . }} {{ end }}` t := template.Must(template.New("resolv-conf").Parse(resolvConfTemplate)) // Keep DNS servers in the order specified by the network dnsNetwork, _ := networks.DefaultNetworkFor("dns") type dnsConfigArg struct { DNSServers []string } dnsServersArg := dnsConfigArg{dnsNetwork.DNS} err := t.Execute(buffer, dnsServersArg) if err != nil { return bosherr.WrapError(err, "Generating DNS config from template") } if len(dnsNetwork.DNS) > 0 { // Write out base so that releases may overwrite head err = net.fs.WriteFile("/etc/resolvconf/resolv.conf.d/base", buffer.Bytes()) if err != nil { return bosherr.WrapError(err, "Writing to /etc/resolvconf/resolv.conf.d/base") } } else { // For the first time before resolv.conf is symlinked to /run/... // inherit possibly configured resolv.conf targetPath, err := net.fs.ReadLink("/etc/resolv.conf") if err != nil { return bosherr.WrapError(err, "Reading /etc/resolv.conf symlink") } if targetPath == "/etc/resolv.conf" { err := net.fs.CopyFile("/etc/resolv.conf", "/etc/resolvconf/resolv.conf.d/base") if err != nil { return bosherr.WrapError(err, "Copying /etc/resolv.conf for backwards compat") } } } err = net.fs.Symlink("/run/resolvconf/resolv.conf", "/etc/resolv.conf") if err != nil { return bosherr.WrapError(err, "Setting up /etc/resolv.conf symlink") } _, _, _, err = net.cmdRunner.RunCommand("resolvconf", "-u") if err != nil { return bosherr.WrapError(err, "Updating resolvconf") } return nil }
func (net ubuntuNetManager) SetupDhcp(networks boshsettings.Networks, errCh chan error) error { net.logger.Debug(ubuntuNetManagerLogTag, "Configuring DHCP networking") buffer := bytes.NewBuffer([]byte{}) t := template.Must(template.New("dhcp-config").Parse(ubuntuDHCPConfigTemplate)) // Keep DNS servers in the order specified by the network // because they are added by a *single* DHCP's prepend command dnsNetwork, _ := networks.DefaultNetworkFor("dns") dnsServersList := strings.Join(dnsNetwork.DNS, ", ") err := t.Execute(buffer, dnsServersList) if err != nil { return bosherr.WrapError(err, "Generating config from template") } dhclientConfigFile := net.dhclientConfigFile() written, err := net.fs.ConvergeFileContents(dhclientConfigFile, buffer.Bytes()) if err != nil { return bosherr.WrapError(err, "Writing to %s", dhclientConfigFile) } if written { args := net.restartNetworkArguments() net.logger.Debug(ubuntuNetManagerLogTag, "Restarting network interfaces") _, _, _, err := net.cmdRunner.RunCommand("ifdown", args...) if err != nil { net.logger.Error(ubuntuNetManagerLogTag, "Ignoring ifdown failure: %s", err) } _, _, _, err = net.cmdRunner.RunCommand("ifup", args...) if err != nil { net.logger.Error(ubuntuNetManagerLogTag, "Ignoring ifup failure: %s", err) } } addresses := []boship.InterfaceAddress{ // eth0 is hard coded in AWS and OpenStack stemcells. // TODO: abstract hardcoded network interface name to the NetManager boship.NewResolvingInterfaceAddress("eth0", net.ipResolver), } go func() { net.addressBroadcaster.BroadcastMACAddresses(addresses) if errCh != nil { errCh <- nil } }() return nil }
func (net centosNetManager) SetupNetworking(networks boshsettings.Networks, errCh chan error) error { nonVipNetworks := boshsettings.Networks{} for networkName, networkSettings := range networks { if networkSettings.IsVIP() { continue } nonVipNetworks[networkName] = networkSettings } staticInterfaceConfigurations, dhcpInterfaceConfigurations, err := net.buildInterfaces(nonVipNetworks) if err != nil { return err } dnsNetwork, _ := nonVipNetworks.DefaultNetworkFor("dns") dnsServers := dnsNetwork.DNS interfacesChanged, err := net.writeNetworkInterfaces(dhcpInterfaceConfigurations, staticInterfaceConfigurations, dnsServers) if err != nil { return bosherr.WrapError(err, "Writing network configuration") } dhcpChanged := false if len(dhcpInterfaceConfigurations) > 0 { dhcpChanged, err = net.writeDHCPConfiguration(dnsServers, dhcpInterfaceConfigurations) if err != nil { return err } } if interfacesChanged || dhcpChanged { net.restartNetworkingInterfaces() } staticAddresses, dynamicAddresses := net.ifaceAddresses(staticInterfaceConfigurations, dhcpInterfaceConfigurations) err = net.interfaceAddressesValidator.Validate(staticAddresses) if err != nil { return bosherr.WrapError(err, "Validating static network configuration") } err = net.dnsValidator.Validate(dnsServers) if err != nil { return bosherr.WrapError(err, "Validating dns configuration") } net.broadcastIps(append(staticAddresses, dynamicAddresses...), errCh) return nil }
func (net UbuntuNetManager) ComputeNetworkConfig(networks boshsettings.Networks) ([]StaticInterfaceConfiguration, []DHCPInterfaceConfiguration, []string, error) { nonVipNetworks := boshsettings.Networks{} for networkName, networkSettings := range networks { if networkSettings.IsVIP() { continue } nonVipNetworks[networkName] = networkSettings } staticConfigs, dhcpConfigs, err := net.buildInterfaces(nonVipNetworks) if err != nil { return nil, nil, nil, err } dnsNetwork, _ := nonVipNetworks.DefaultNetworkFor("dns") dnsServers := dnsNetwork.DNS return staticConfigs, dhcpConfigs, dnsServers, nil }
func (net centosNetManager) writeResolvConf(networks boshsettings.Networks) error { buffer := bytes.NewBuffer([]byte{}) t := template.Must(template.New("resolv-conf").Parse(centosResolvConfTemplate)) // Keep DNS servers in the order specified by the network dnsNetwork, _ := networks.DefaultNetworkFor("dns") dnsServersArg := dnsConfigArg{dnsNetwork.DNS} err := t.Execute(buffer, dnsServersArg) if err != nil { return bosherr.WrapError(err, "Generating config from template") } err = net.fs.WriteFile("/etc/resolv.conf", buffer.Bytes()) if err != nil { return bosherr.WrapError(err, "Writing to /etc/resolv.conf") } return nil }
func (net WindowsNetManager) SetupNetworking(networks boshsettings.Networks, errCh chan error) error { nonVipNetworks := boshsettings.Networks{} for networkName, networkSettings := range networks { if networkSettings.IsVIP() { continue } nonVipNetworks[networkName] = networkSettings } err := net.setupInterfaces(nonVipNetworks) if err != nil { return err } dnsNetwork, _ := nonVipNetworks.DefaultNetworkFor("dns") dns := net.setupDNS(dnsNetwork) time.Sleep(5 * time.Second) return dns }
func (net centosNetManager) SetupDhcp(networks boshsettings.Networks, errCh chan error) error { net.logger.Debug(centosNetManagerLogTag, "Configuring DHCP networking") buffer := bytes.NewBuffer([]byte{}) t := template.Must(template.New("dhcp-config").Parse(centosDHCPConfigTemplate)) // Keep DNS servers in the order specified by the network // because they are added by a *single* DHCP's prepend command dnsNetwork, _ := networks.DefaultNetworkFor("dns") dnsServersList := strings.Join(dnsNetwork.DNS, ", ") err := t.Execute(buffer, dnsServersList) if err != nil { return bosherr.WrapError(err, "Generating config from template") } written, err := net.fs.ConvergeFileContents("/etc/dhcp/dhclient.conf", buffer.Bytes()) if err != nil { return bosherr.WrapError(err, "Writing to /etc/dhcp/dhclient.conf") } if written { net.restartNetwork() } addresses := []boship.InterfaceAddress{ // eth0 is hard coded in AWS and OpenStack stemcells. // TODO: abstract hardcoded network interface name to the NetManager boship.NewResolvingInterfaceAddress("eth0", net.ipResolver), } go func() { net.addressBroadcaster.BroadcastMACAddresses(addresses) if errCh != nil { errCh <- nil } }() return err }