mirror of
https://github.com/coredhcp/coredhcp.git
synced 2025-10-28 06:31:35 +01:00
* plugins/dns: Implemented DHCPv6 support Signed-off-by: Anatole Denis <anatole@unverle.fr> * plugins/file: Remove hardcoded DNS servers Those are handled by the DNS plugin and don't need to be hardcoded anymore Signed-off-by: Anatole Denis <anatole@unverle.fr> * plugins/dns: Only send option when requested Both DHCP versions have a means for the client to specify what additional information to send with replies. This adds logic to respect that. There is a difference between the protocols as to what happens when this option doesn't exist. In DHCPv6, the option is mandatory. In DHCPv4 it is not and indicates the server may send whatever it deems relevant Signed-off-by: Anatole Denis <anatole@unverle.fr> * Update dhcp library dependency This pulls the enhancement from https://github.com/insomniacslk/dhcp/pull/315 generated by `go get github.com/insomniacslk/dhcp && go mod tidy` Signed-off-by: Anatole Denis <anatole@unverle.fr>
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package dns
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
|
|
"github.com/coredhcp/coredhcp/handler"
|
|
"github.com/coredhcp/coredhcp/logger"
|
|
"github.com/coredhcp/coredhcp/plugins"
|
|
"github.com/insomniacslk/dhcp/dhcpv4"
|
|
"github.com/insomniacslk/dhcp/dhcpv6"
|
|
)
|
|
|
|
var log = logger.GetLogger("plugins/dns")
|
|
|
|
func init() {
|
|
plugins.RegisterPlugin("dns", setupDNS6, setupDNS4)
|
|
}
|
|
|
|
var (
|
|
dnsServers6 []net.IP
|
|
dnsServers4 []net.IP
|
|
)
|
|
|
|
func setupDNS6(args ...string) (handler.Handler6, error) {
|
|
if len(args) < 1 {
|
|
return nil, errors.New("need at least one DNS server")
|
|
}
|
|
for _, arg := range args {
|
|
server := net.ParseIP(arg)
|
|
if server.To16() == nil {
|
|
return Handler6, errors.New("expected an DNS server address, got: " + arg)
|
|
}
|
|
dnsServers6 = append(dnsServers6, server)
|
|
}
|
|
log.Infof("loaded %d DNS servers.", len(dnsServers6))
|
|
return Handler6, nil
|
|
}
|
|
|
|
func setupDNS4(args ...string) (handler.Handler4, error) {
|
|
log.Printf("loaded plugin for DHCPv4.")
|
|
if len(args) < 1 {
|
|
return nil, errors.New("need at least one DNS server")
|
|
}
|
|
for _, arg := range args {
|
|
DNSServer := net.ParseIP(arg)
|
|
if DNSServer.To4() == nil {
|
|
return Handler4, errors.New("expected an DNS server address, got: " + arg)
|
|
}
|
|
dnsServers4 = append(dnsServers4, DNSServer)
|
|
}
|
|
log.Infof("loaded %d DNS servers.", len(dnsServers4))
|
|
return Handler4, nil
|
|
}
|
|
|
|
// Handler6 handles DHCPv6 packets for the dns plugin
|
|
func Handler6(req, resp dhcpv6.DHCPv6) (dhcpv6.DHCPv6, bool) {
|
|
decap, err := req.GetInnerMessage()
|
|
if err != nil {
|
|
log.Errorf("Could not decapsulate relayed message, aborting: %v", err)
|
|
return nil, true
|
|
}
|
|
|
|
if decap.IsOptionRequested(dhcpv6.OptionDNSRecursiveNameServer) {
|
|
resp.UpdateOption(&dhcpv6.OptDNSRecursiveNameServer{NameServers: dnsServers6})
|
|
}
|
|
return resp, false
|
|
}
|
|
|
|
//Handler4 handles DHCPv4 packets for the dns plugin
|
|
func Handler4(req, resp *dhcpv4.DHCPv4) (*dhcpv4.DHCPv4, bool) {
|
|
if req.IsOptionRequested(dhcpv4.OptionDomainNameServer) {
|
|
resp.Options.Update(dhcpv4.OptDNS(dnsServers4...))
|
|
}
|
|
return resp, false
|
|
}
|