penguin/webhook-freedns

freedns webhook for cert-manager

example/example.go

raw ยท 1287 bytes

// package example contains a self-contained example of a webhook that passes the cert-manager
// DNS conformance tests
package example

import (
	"sync"

	"github.com/jetstack/cert-manager/pkg/acme/webhook"
	acme "github.com/jetstack/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1"
	"github.com/miekg/dns"
	"k8s.io/client-go/rest"
)

type exampleSolver struct {
	name       string
	server     *dns.Server
	txtRecords map[string]string
	sync.RWMutex
}

func (e exampleSolver) Name() string {
	return e.name
}

func (e exampleSolver) Present(ch *acme.ChallengeRequest) error {
	e.Lock()
	e.txtRecords[ch.ResolvedFQDN] = ch.Key
	e.Unlock()
	return nil
}

func (e exampleSolver) CleanUp(ch *acme.ChallengeRequest) error {
	e.Lock()
	delete(e.txtRecords, ch.ResolvedFQDN)
	e.Unlock()
	return nil
}

func (e exampleSolver) Initialize(kubeClientConfig *rest.Config, stopCh <-chan struct{}) error {
	go func(done <-chan struct{}) {
		<-done
		e.server.Shutdown()
	}(stopCh)
	go func() {
		e.server.ListenAndServe()
	}()
	return nil
}

func New(port string) webhook.Solver {
	e := &exampleSolver{
		name:       "example",
		txtRecords: make(map[string]string),
	}
	e.server = &dns.Server{
		Addr:    ":" + port,
		Net:     "udp",
		Handler: dns.HandlerFunc(e.handleDNSRequest),
	}
	return e
}