Reverted to kubernetes

This commit is contained in:
Chris Stuurman 2024-04-06 22:09:39 +02:00
parent a5f92861e7
commit 24853d497a
12 changed files with 114 additions and 56 deletions

View File

@ -5,11 +5,13 @@ import (
"fmt" "fmt"
"github.com/miekg/dns" "github.com/miekg/dns"
"k8s.io/klog/v2"
) )
func (e *SthomeSolver) handleDNSRequest(w dns.ResponseWriter, req *dns.Msg) { func (e *SthomeSolver) handleDNSRequest(w dns.ResponseWriter, req *dns.Msg) {
msg := new(dns.Msg) msg := new(dns.Msg)
msg.SetReply(req) msg.SetReply(req)
klog.Infof("Entering: %s ============\n", "handleDNSRequest")
switch req.Opcode { switch req.Opcode {
case dns.OpcodeQuery: case dns.OpcodeQuery:
for _, q := range msg.Question { for _, q := range msg.Question {
@ -20,9 +22,11 @@ func (e *SthomeSolver) handleDNSRequest(w dns.ResponseWriter, req *dns.Msg) {
} }
} }
w.WriteMsg(msg) w.WriteMsg(msg)
klog.Infof("Exiting: %s ============\n", "handleDNSRequest")
} }
func (e *SthomeSolver) addDNSAnswer(q dns.Question, msg *dns.Msg, req *dns.Msg) error { func (e *SthomeSolver) addDNSAnswer(q dns.Question, msg *dns.Msg, req *dns.Msg) error {
klog.Infof("Entering: %s ============\n", "addDNSAnswer")
switch q.Qtype { switch q.Qtype {
// Always return loopback for any A query // Always return loopback for any A query
case dns.TypeA: case dns.TypeA:
@ -35,6 +39,7 @@ func (e *SthomeSolver) addDNSAnswer(q dns.Question, msg *dns.Msg, req *dns.Msg)
// TXT records are the only important record for ACME dns-01 challenges // TXT records are the only important record for ACME dns-01 challenges
case dns.TypeTXT: case dns.TypeTXT:
klog.Infof("case: %s ============\n", "dns.TypeTXT")
e.RLock() e.RLock()
record, found := e.txtRecords[q.Name] record, found := e.txtRecords[q.Name]
e.RUnlock() e.RUnlock()
@ -47,6 +52,7 @@ func (e *SthomeSolver) addDNSAnswer(q dns.Question, msg *dns.Msg, req *dns.Msg)
return err return err
} }
msg.Answer = append(msg.Answer, rr) msg.Answer = append(msg.Answer, rr)
klog.Infof("msg.Answer: %s ============\n", msg.Answer)
return nil return nil
// NS and SOA are for authoritative lookups, return obviously invalid data // NS and SOA are for authoritative lookups, return obviously invalid data

38
_backup/secrets.go Normal file
View File

@ -0,0 +1,38 @@
package dns
import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)
//go:generate mockgen -destination=./mock/secrets.go -source=./secrets.go SecretFetcher
type SecretFetcher interface {
StringFromSecret(namespace, secretName, key string) (string, error)
}
type kubeSecretFetcher struct {
client kubernetes.Interface
ctx context.Context
}
func (k *kubeSecretFetcher) StringFromSecret(namespace, secretName, key string) (string, error) {
secret, err := k.client.CoreV1().Secrets(namespace).Get(k.ctx, secretName, metav1.GetOptions{})
if err != nil {
return "", err
}
binary, ok := secret.Data[key]
if !ok {
return "", fmt.Errorf("key `%q` not found in secretFetcher `%s/%s`",
key, namespace, secretName)
}
return string(binary), nil
}
func NewSecretFetcher() SecretFetcher {
return &kubeSecretFetcher{}
}

View File

@ -2,22 +2,25 @@
package dns package dns
import ( import (
"context"
"fmt" "fmt"
"os"
"strings" "strings"
"sync" "sync"
"github.com/cert-manager/cert-manager/pkg/acme/webhook" "github.com/cert-manager/cert-manager/pkg/acme/webhook"
acme "github.com/cert-manager/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1" acme "github.com/cert-manager/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1"
"github.com/miekg/dns" "github.com/miekg/dns"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
"k8s.io/klog/v2" "k8s.io/klog/v2"
) )
type SthomeSolver struct { type SthomeSolver struct {
name string ctx context.Context
server *dns.Server name string
txtRecords map[string]string server *dns.Server
txtRecords map[string]string
secretFetcher SecretFetcher
sync.RWMutex sync.RWMutex
} }
@ -84,22 +87,35 @@ func (e *SthomeSolver) CleanUp(ch *acme.ChallengeRequest) error {
} }
func (e *SthomeSolver) Initialize(kubeClientConfig *rest.Config, stopCh <-chan struct{}) error { func (e *SthomeSolver) Initialize(kubeClientConfig *rest.Config, stopCh <-chan struct{}) error {
go func(done <-chan struct{}) { klog.Infof("Initializing sthome solver")
<-done cl, err := kubernetes.NewForConfig(kubeClientConfig)
if err := e.server.Shutdown(); err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return fmt.Errorf("failed to get kubernetes client: %w", err)
} }
}(stopCh) e.secretFetcher = &kubeSecretFetcher{
go func() { client: cl,
if err := e.server.ListenAndServe(); err != nil { ctx: e.ctx,
fmt.Fprintf(os.Stderr, "%s\n", err.Error()) }
os.Exit(1) /*
} go func(done <-chan struct{}) {
}() <-done
if err := e.server.Shutdown(); err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
}
}(stopCh)
go func() {
if err := e.server.ListenAndServe(); err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
os.Exit(1)
}
}()
*/
klog.Infof("Sthome solver initialized")
return nil return nil
} }
func New(port string) webhook.Solver { func New(port string) webhook.Solver {
klog.Infof("Entering New")
e := &SthomeSolver{ e := &SthomeSolver{
name: ProviderName, name: ProviderName,
txtRecords: make(map[string]string), txtRecords: make(map[string]string),
@ -109,5 +125,6 @@ func New(port string) webhook.Solver {
Net: "udp", Net: "udp",
Handler: dns.HandlerFunc(e.handleDNSRequest), Handler: dns.HandlerFunc(e.handleDNSRequest),
} }
klog.Infof("Exiting New")
return e return e
} }

View File

@ -1,5 +1,5 @@
apiVersion: v1 apiVersion: v1
appVersion: v0.0.5-alpha.1 appVersion: v0.0.5-alpha.12
description: Cert-Manager webhook for sthome description: Cert-Manager webhook for sthome
name: sthome-webhook name: sthome-webhook
version: 0.0.5-alpha.1 version: 0.0.5-alpha.12

View File

@ -31,7 +31,7 @@ clusterIssuer:
image: image:
repository: stuurmcp/cert-manager-webhook-sthome repository: stuurmcp/cert-manager-webhook-sthome
#repository: wstat.sthome.net:5000/cert-manager-webhook-sthome #repository: wstat.sthome.net:5000/cert-manager-webhook-sthome
tag: 0.0.5-alpha.1 tag: 0.0.5-alpha.12
#pullPolicy should be IfNotPresent. Set to Always for testing purposes #pullPolicy should be IfNotPresent. Set to Always for testing purposes
pullPolicy: IfNotPresent pullPolicy: IfNotPresent

9
go.mod
View File

@ -6,7 +6,6 @@ toolchain go1.22.1
require ( require (
github.com/cert-manager/cert-manager v1.14.4 github.com/cert-manager/cert-manager v1.14.4
github.com/miekg/dns v1.1.58
k8s.io/api v0.29.0 k8s.io/api v0.29.0
k8s.io/apiextensions-apiserver v0.29.0 k8s.io/apiextensions-apiserver v0.29.0
k8s.io/client-go v0.29.0 k8s.io/client-go v0.29.0
@ -14,10 +13,7 @@ require (
require k8s.io/klog/v2 v2.110.1 require k8s.io/klog/v2 v2.110.1
require ( require k8s.io/apimachinery v0.29.0 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
k8s.io/apimachinery v0.29.0 // indirect
)
require ( require (
github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect
@ -67,7 +63,7 @@ require (
github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/cobra v1.8.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/stoewer/go-strcase v1.3.0 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect
github.com/stretchr/testify v1.9.0 github.com/stretchr/testify v1.9.0 // indirect
go.etcd.io/etcd/api/v3 v3.5.11 // indirect go.etcd.io/etcd/api/v3 v3.5.11 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.11 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.11 // indirect
go.etcd.io/etcd/client/v3 v3.5.11 // indirect go.etcd.io/etcd/client/v3 v3.5.11 // indirect
@ -84,7 +80,6 @@ require (
go.uber.org/zap v1.26.0 // indirect go.uber.org/zap v1.26.0 // indirect
golang.org/x/crypto v0.18.0 // indirect golang.org/x/crypto v0.18.0 // indirect
golang.org/x/exp v0.0.0-20231226003508-02704c960a9b // indirect golang.org/x/exp v0.0.0-20231226003508-02704c960a9b // indirect
golang.org/x/mod v0.14.0 // indirect
golang.org/x/net v0.20.0 // indirect golang.org/x/net v0.20.0 // indirect
golang.org/x/oauth2 v0.15.0 // indirect golang.org/x/oauth2 v0.15.0 // indirect
golang.org/x/sync v0.6.0 // indirect golang.org/x/sync v0.6.0 // indirect

4
go.sum
View File

@ -116,8 +116,6 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4=
github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@ -222,8 +220,6 @@ golang.org/x/exp v0.0.0-20231226003508-02704c960a9b/go.mod h1:iRJReGqOEeBhDZGkGb
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=

23
main.go
View File

@ -2,18 +2,18 @@ package main
import ( import (
_ "embed" _ "embed"
"fmt"
"os" "os"
"strings" "strings"
"k8s.io/client-go/kubernetes" /*
"k8s.io/client-go/rest" "fmt"
"k8s.io/klog/v2" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"github.com/cert-manager/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1" "k8s.io/klog/v2"
"github.com/cert-manager/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1"
"github.com/cert-manager/cert-manager/pkg/issuer/acme/dns/util"
*/
"github.com/cert-manager/cert-manager/pkg/acme/webhook/cmd" "github.com/cert-manager/cert-manager/pkg/acme/webhook/cmd"
"github.com/cert-manager/cert-manager/pkg/issuer/acme/dns/util"
dns "github.com/stuurmcp/cert-manager-webhook-sthome/pkg/dns" dns "github.com/stuurmcp/cert-manager-webhook-sthome/pkg/dns"
) )
@ -31,16 +31,18 @@ func main() {
panic("GROUP_NAME must be specified") panic("GROUP_NAME must be specified")
} }
cmd.RunWebhookServer(GroupName, cmd.RunWebhookServer(GroupName,
&dns.SthomeSolver{}, &dns.LocalDNSProviderSolver{},
//&dns.SthomeSolver{},
) )
} }
/*
type LocalDNSProviderSolver struct { type LocalDNSProviderSolver struct {
client kubernetes.Interface client kubernetes.Interface
} }
func (p *LocalDNSProviderSolver) Name() string { func (p *LocalDNSProviderSolver) Name() string {
return dns.ProviderName return dns.ProviderName + "loc"
} }
func (loc *LocalDNSProviderSolver) Present(ch *v1alpha1.ChallengeRequest) error { func (loc *LocalDNSProviderSolver) Present(ch *v1alpha1.ChallengeRequest) error {
@ -114,3 +116,4 @@ func extractDomainName(zone string) string {
} }
return util.UnFqdn(authZone) return util.UnFqdn(authZone)
} }
*/

View File

@ -17,6 +17,8 @@ func Execute(shell string, arg ...string) (bool, error) {
klog.Errorf("Script returned error: %s\nout:\n%serr:\n%s============\n", err, outb.String(), errb.String()) klog.Errorf("Script returned error: %s\nout:\n%serr:\n%s============\n", err, outb.String(), errb.String())
return false, err return false, err
} }
klog.Infof("Script returned success:\nout:\n%s============\n", outb.String()) klog.Infof("script stdout:\n%s\n", outb.String())
klog.Infof("script stderr:\n%s\n", errb.String())
klog.Infof("Script returned success\n")
return true, nil return true, nil
} }

View File

@ -9,7 +9,6 @@ import (
"k8s.io/klog/v2" "k8s.io/klog/v2"
"github.com/cert-manager/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1" "github.com/cert-manager/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1"
"github.com/cert-manager/cert-manager/pkg/issuer/acme/dns/util"
) )
// LocalDNSProviderSolver implements the provider-specific logic needed to // LocalDNSProviderSolver implements the provider-specific logic needed to
@ -37,7 +36,7 @@ func (p *LocalDNSProviderSolver) Name() string {
// solver has correctly configured the DNS provider. // solver has correctly configured the DNS provider.
func (loc *LocalDNSProviderSolver) Present(ch *v1alpha1.ChallengeRequest) error { func (loc *LocalDNSProviderSolver) Present(ch *v1alpha1.ChallengeRequest) error {
//domainName := extractDomainName(ch.ResolvedZone) //domainName := extractDomainName(ch.ResolvedZone)
cfg, err := loadConfig(ch.Config) cfg, err := LoadConfig(ch.Config)
if err != nil { if err != nil {
return err return err
} }
@ -78,19 +77,19 @@ func (loc *LocalDNSProviderSolver) Present(ch *v1alpha1.ChallengeRequest) error
strings.Join(cfg.AllowedZones, ","), strings.Join(cfg.AllowedZones, ","),
) )
// TODO: convert shell script to golang // TODO: convert shell script to golang
localip := getOutboundIP(dnsserver_net) //localip := GetOutboundIP(Dnsserver_net)
success, _ := Execute( success, _ := Execute(
shell, Shell,
acmeAuthCmd, AcmeAuthCmd,
"set", "set",
ch.DNSName, ch.DNSName,
ch.ResolvedFQDN, ch.ResolvedFQDN,
ch.Key, ch.Key,
"-l", "-l",
localip, "\"\"", //localip,
"-v", "-v",
) )
klog.Infof("Execute set TXT returned success: %t", success) klog.Infof("Execute set TXT returned success: %t\n", success)
return nil return nil
} }
@ -103,19 +102,19 @@ func (loc *LocalDNSProviderSolver) Present(ch *v1alpha1.ChallengeRequest) error
func (loc *LocalDNSProviderSolver) CleanUp(ch *v1alpha1.ChallengeRequest) error { func (loc *LocalDNSProviderSolver) CleanUp(ch *v1alpha1.ChallengeRequest) error {
//domainName := extractDomainName(ch.ResolvedZone) //domainName := extractDomainName(ch.ResolvedZone)
// TODO: add code that deletes a record from the DNS provider's console // TODO: add code that deletes a record from the DNS provider's console
localip := getOutboundIP(dnsserver_net) //localip := GetOutboundIP(Dnsserver_net)
success, _ := Execute( success, _ := Execute(
shell, Shell,
acmeAuthCmd, AcmeAuthCmd,
"unset", "unset",
ch.DNSName, ch.DNSName,
ch.ResolvedFQDN, ch.ResolvedFQDN,
ch.Key, ch.Key,
"-l", "-l",
localip, "\"\"", //localip,
"-v", "-v",
) )
klog.Infof("Execute unset TXT returned success: %t", success) klog.Infof("Execute unset TXT returned success: %t\n", success)
return nil return nil
} }
@ -138,6 +137,7 @@ func (loc *LocalDNSProviderSolver) Initialize(kubeClientConfig *rest.Config, sto
return nil return nil
} }
/*
func extractDomainName(zone string) string { func extractDomainName(zone string) string {
authZone, err := util.FindZoneByFqdn(zone, util.RecursiveNameservers) authZone, err := util.FindZoneByFqdn(zone, util.RecursiveNameservers)
if err != nil { if err != nil {
@ -146,3 +146,4 @@ func extractDomainName(zone string) string {
} }
return util.UnFqdn(authZone) return util.UnFqdn(authZone)
} }
*/

View File

@ -1,3 +1,3 @@
0.0.5-alpha.1 0.0.5-alpha.12
20240406-1230 20240406-2016
1 12