plugin.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright 2018-present the CoreDHCP Authors. All rights reserved
  2. // This source code is licensed under the MIT license found in the
  3. // LICENSE file in the root directory of this source tree.
  4. package dns
  5. import (
  6. "errors"
  7. "net"
  8. "github.com/coredhcp/coredhcp/handler"
  9. "github.com/coredhcp/coredhcp/logger"
  10. "github.com/coredhcp/coredhcp/plugins"
  11. "github.com/insomniacslk/dhcp/dhcpv4"
  12. "github.com/insomniacslk/dhcp/dhcpv6"
  13. )
  14. var log = logger.GetLogger("plugins/dns")
  15. func init() {
  16. plugins.RegisterPlugin("dns", setupDNS6, setupDNS4)
  17. }
  18. var (
  19. dnsServers6 []net.IP
  20. dnsServers4 []net.IP
  21. )
  22. func setupDNS6(args ...string) (handler.Handler6, error) {
  23. if len(args) < 1 {
  24. return nil, errors.New("need at least one DNS server")
  25. }
  26. for _, arg := range args {
  27. server := net.ParseIP(arg)
  28. if server.To16() == nil {
  29. return Handler6, errors.New("expected an DNS server address, got: " + arg)
  30. }
  31. dnsServers6 = append(dnsServers6, server)
  32. }
  33. log.Infof("loaded %d DNS servers.", len(dnsServers6))
  34. return Handler6, nil
  35. }
  36. func setupDNS4(args ...string) (handler.Handler4, error) {
  37. log.Printf("loaded plugin for DHCPv4.")
  38. if len(args) < 1 {
  39. return nil, errors.New("need at least one DNS server")
  40. }
  41. for _, arg := range args {
  42. DNSServer := net.ParseIP(arg)
  43. if DNSServer.To4() == nil {
  44. return Handler4, errors.New("expected an DNS server address, got: " + arg)
  45. }
  46. dnsServers4 = append(dnsServers4, DNSServer)
  47. }
  48. log.Infof("loaded %d DNS servers.", len(dnsServers4))
  49. return Handler4, nil
  50. }
  51. // Handler6 handles DHCPv6 packets for the dns plugin
  52. func Handler6(req, resp dhcpv6.DHCPv6) (dhcpv6.DHCPv6, bool) {
  53. decap, err := req.GetInnerMessage()
  54. if err != nil {
  55. log.Errorf("Could not decapsulate relayed message, aborting: %v", err)
  56. return nil, true
  57. }
  58. if decap.IsOptionRequested(dhcpv6.OptionDNSRecursiveNameServer) {
  59. resp.UpdateOption(&dhcpv6.OptDNSRecursiveNameServer{NameServers: dnsServers6})
  60. }
  61. return resp, false
  62. }
  63. //Handler4 handles DHCPv4 packets for the dns plugin
  64. func Handler4(req, resp *dhcpv4.DHCPv4) (*dhcpv4.DHCPv4, bool) {
  65. if req.IsOptionRequested(dhcpv4.OptionDomainNameServer) {
  66. resp.Options.Update(dhcpv4.OptDNS(dnsServers4...))
  67. }
  68. return resp, false
  69. }