59 lines
1023 B
Go
59 lines
1023 B
Go
|
package dnsmasq
|
||
|
|
||
|
import (
|
||
|
"cryptic-net/bootstrap"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"text/template"
|
||
|
)
|
||
|
|
||
|
// ConfData describes all the data needed to populate a dnsmasq.conf file.
|
||
|
type ConfData struct {
|
||
|
Resolvers []string
|
||
|
Domain string
|
||
|
IP string
|
||
|
Hosts []bootstrap.Host
|
||
|
}
|
||
|
|
||
|
var confTpl = template.Must(template.New("").Parse(`
|
||
|
port=53
|
||
|
|
||
|
bind-interfaces
|
||
|
listen-address={{ .IP }}
|
||
|
|
||
|
no-resolv
|
||
|
no-hosts
|
||
|
|
||
|
user=
|
||
|
group=
|
||
|
|
||
|
{{- range $host := .Hosts }}
|
||
|
address=/{{ $host.Name }}.hosts.{{ .Domain }}/{{ $host.Nebula.IP }}
|
||
|
{{ end -}}
|
||
|
|
||
|
{{- range .Resolvers }}
|
||
|
server={{ . }}
|
||
|
{{ end -}}
|
||
|
`))
|
||
|
|
||
|
// WriteConfFile renders a dnsmasq.conf using the given data to a new
|
||
|
// file at the given path.
|
||
|
func WriteConfFile(path string, data ConfData) error {
|
||
|
|
||
|
file, err := os.OpenFile(
|
||
|
path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0640,
|
||
|
)
|
||
|
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("creating file: %w", err)
|
||
|
}
|
||
|
|
||
|
defer file.Close()
|
||
|
|
||
|
if err := confTpl.Execute(file, data); err != nil {
|
||
|
return fmt.Errorf("rendering template to file: %w", err)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|