kvm/internal/dhclient/resolvconf.go

63 lines
1.4 KiB
Go

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)
}