11package main
22
33import (
4- "encoding/json"
5- "fmt"
6- "github.com/jetstack/cert-manager/pkg/issuer/acme/dns/util"
7- "k8s.io/client-go/kubernetes"
84 "os"
5+ "fmt"
6+ "context"
7+ "encoding/json"
98
10- extapi "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
11- "k8s.io/client-go/rest"
129 "k8s.io/klog"
10+ "k8s.io/client-go/rest"
11+ "k8s.io/client-go/kubernetes"
12+ extapi "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
1313
14- "github.com/jetstack/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1"
1514 "github.com/jetstack/cert-manager/pkg/acme/webhook/cmd"
15+ "github.com/jetstack/cert-manager/pkg/issuer/acme/dns/util"
16+ "github.com/jetstack/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1"
17+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1618)
1719
1820const (
@@ -36,51 +38,51 @@ type customDNSProviderSolver struct {
3638 client * kubernetes.Clientset
3739}
3840
41+ type envSecretRef struct {
42+ Name string `json:"name"`
43+ Namespace string `json:"namespace"`
44+ }
45+
3946type customDNSProviderConfig struct {
40- TTL * uint64 `json:"ttl"`
41- DNSAPI string `json:"dnsapi"`
42- Env [] string `json:"env"`
47+ TTL * uint64 `json:"ttl"`
48+ DNSAPI string `json:"dnsapi"`
49+ EnvSecretRef envSecretRef `json:"env"`
4350}
4451
52+ type envFromSecret []string
53+
4554func (c * customDNSProviderSolver ) Name () string {
4655 return "acmesh"
4756}
4857
49- func (c * customDNSProviderSolver ) Present ( ch * v1alpha1.ChallengeRequest ) error {
58+ func (c * customDNSProviderSolver ) DoDNSAPI ( action string , ch * v1alpha1.ChallengeRequest ) error {
5059 cfg , err := loadConfig (ch .Config )
5160 if err != nil {
5261 klog .Errorf ("Failed to log config %v: %v" , ch .Config , err )
5362 return err
5463 }
5564
56- procAttr := & os.ProcAttr {
57- Files : []* os.File {os .Stdin , os .Stdout , os .Stderr },
58- Env : cfg .Env ,
59- }
60- process , err := os .StartProcess (acmeDelegate , []string {
61- acmeDelegate , cfg .DNSAPI , "add" , util .UnFqdn (ch .ResolvedFQDN ), ch .Key ,
62- }, procAttr )
65+ envSecret , err := c .client .CoreV1 ().Secrets (cfg .EnvSecretRef .Namespace ).Get (context .TODO (), cfg .EnvSecretRef .Name , metav1.GetOptions {})
6366 if err != nil {
6467 return err
6568 }
6669
67- process .Wait ()
68- return nil
69- }
70+ envData , ok := envSecret .Data ["env" ]
71+ if ! ok {
72+ return fmt .Errorf ("no env in secret" )
73+ }
7074
71- func (c * customDNSProviderSolver ) CleanUp (ch * v1alpha1.ChallengeRequest ) error {
72- cfg , err := loadConfig (ch .Config )
73- if err != nil {
74- klog .Errorf ("Failed to log config %v: %v" , ch .Config , err )
75+ env := envFromSecret {}
76+ if err := json .Unmarshal (envData , & env ); err != nil {
7577 return err
7678 }
7779
7880 procAttr := & os.ProcAttr {
7981 Files : []* os.File {os .Stdin , os .Stdout , os .Stderr },
80- Env : cfg . Env ,
82+ Env : env ,
8183 }
8284 process , err := os .StartProcess (acmeDelegate , []string {
83- acmeDelegate , cfg .DNSAPI , "rm " , util .UnFqdn (ch .ResolvedFQDN ), ch .Key ,
85+ acmeDelegate , cfg .DNSAPI , "add " , util .UnFqdn (ch .ResolvedFQDN ), ch .Key ,
8486 }, procAttr )
8587 if err != nil {
8688 return err
@@ -90,6 +92,14 @@ func (c *customDNSProviderSolver) CleanUp(ch *v1alpha1.ChallengeRequest) error {
9092 return nil
9193}
9294
95+ func (c * customDNSProviderSolver ) Present (ch * v1alpha1.ChallengeRequest ) error {
96+ return c .DoDNSAPI ("add" , ch )
97+ }
98+
99+ func (c * customDNSProviderSolver ) CleanUp (ch * v1alpha1.ChallengeRequest ) error {
100+ return c .DoDNSAPI ("rm" , ch )
101+ }
102+
93103func (c * customDNSProviderSolver ) Initialize (kubeClientConfig * rest.Config , stopCh <- chan struct {}) error {
94104 cl , err := kubernetes .NewForConfig (kubeClientConfig )
95105 if err != nil {
0 commit comments