coredhcp/plugins/dns/plugin.go
Anatole Denis 79f78359c2 plugins/dns: Implement DHCPv6 support (#54)
* 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>
2019-09-17 09:32:31 +01:00

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
}