package dhclient import ( "bytes" "fmt" "html/template" "net" "os" "strings" ) const ( resolvConfPath = "/etc/resolv.conf" resolvConfFileMode = 0644 resolvConfTemplate = `# the resolv.conf file is managed by the jetkvm-dhclient service # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN {{ if .searchList }} search {{ join .searchList " " }} # {{ .iface }} {{- end -}} {{ if .domain }} domain {{ .domain }} # {{ .iface }} {{- end -}} {{ range .nameservers }} nameserver {{ printf "%s" . }} # {{ $.iface }} {{- end }} ` ) var ( tplFuncMap = template.FuncMap{ "join": strings.Join, } ) func toResolvConf(iface string, nameservers []net.IP, searchList []string, domain string) (bytes.Buffer, error) { rc := bytes.Buffer{} tmpl, err := template.New("resolv.conf").Funcs(tplFuncMap).Parse(resolvConfTemplate) if err != nil { return rc, fmt.Errorf("failed to parse template: %w", err) } if err := tmpl.Execute(&rc, map[string]interface{}{ "iface": iface, "nameservers": nameservers, "searchList": searchList, "domain": domain, }); err != nil { return rc, fmt.Errorf("failed to execute template: %w", err) } return rc, nil } func updateResolvConf(iface string, nameservers []net.IP, searchList []string, domain string) error { rc, err := toResolvConf(iface, nameservers, searchList, domain) if err != nil { return err } return os.WriteFile(resolvConfPath, rc.Bytes(), resolvConfFileMode) }