@@ -7,17 +7,20 @@ import (
77 "crypto/rand"
88 "crypto/tls"
99 "github.com/0xJacky/Nginx-UI/logger"
10- dns2 "github.com/0xJacky/Nginx-UI/server/internal/cert/dns"
10+ "github.com/0xJacky/Nginx-UI/server/internal/cert/dns"
1111 "github.com/0xJacky/Nginx-UI/server/internal/nginx"
1212 "github.com/0xJacky/Nginx-UI/server/query"
1313 "github.com/0xJacky/Nginx-UI/server/settings"
1414 "github.com/go-acme/lego/v4/certcrypto"
1515 "github.com/go-acme/lego/v4/certificate"
1616 "github.com/go-acme/lego/v4/challenge/http01"
1717 "github.com/go-acme/lego/v4/lego"
18- "github.com/go-acme/lego/v4/providers/dns"
18+ lego_log "github.com/go-acme/lego/v4/log"
19+ dns_providers "github.com/go-acme/lego/v4/providers/dns"
1920 "github.com/go-acme/lego/v4/registration"
2021 "github.com/pkg/errors"
22+ "io"
23+ "log"
2124 "net/http"
2225 "os"
2326 "path/filepath"
@@ -52,13 +55,29 @@ type ConfigPayload struct {
5255 DNSCredentialID int `json:"dns_credential_id"`
5356}
5457
58+ type channelWriter struct {
59+ ch chan []byte
60+ }
61+
62+ func (cw * channelWriter ) Write (p []byte ) (n int , err error ) {
63+ n = len (p )
64+ temp := make ([]byte , n )
65+ copy (temp , p )
66+ cw .ch <- temp
67+ return n , nil
68+ }
69+
5570func IssueCert (payload * ConfigPayload , logChan chan string , errChan chan error ) {
5671 defer func () {
5772 if err := recover (); err != nil {
5873 logger .Error (err )
5974 }
6075 }()
6176
77+ // Use a channel to receive lego log
78+ logChannel := make (chan []byte , 1024 )
79+ defer close (logChannel )
80+
6281 domain := payload .ServerName
6382
6483 // Create a user. New accounts need an email and private key to start.
@@ -75,6 +94,20 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
7594 Key : privateKey ,
7695 }
7796
97+ // Hijack lego's log
98+ cw := & channelWriter {ch : logChannel }
99+ multiWriter := io .MultiWriter (os .Stderr , cw )
100+ l := log .New (os .Stderr , "" , log .LstdFlags )
101+ l .SetOutput (multiWriter )
102+ lego_log .Logger = l
103+
104+ // Start a goroutine to fetch and process logs from channel
105+ go func () {
106+ for msg := range logChannel {
107+ logChan <- string (msg )
108+ }
109+ }()
110+
78111 config := lego .NewConfig (& myUser )
79112
80113 if settings .ServerSettings .Demo {
@@ -120,7 +153,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
120153
121154 logChan <- "Using DNS01 challenge provider"
122155 code := dnsCredential .Config .Code
123- pConfig , ok := dns2 .GetProvider (code )
156+ pConfig , ok := dns .GetProvider (code )
124157
125158 if ! ok {
126159 errChan <- errors .Wrap (err , "provider not found" )
@@ -135,7 +168,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
135168 logChan <- "Cleaning environment variables"
136169 pConfig .CleanEnv ()
137170 }()
138- provider , err := dns .NewDNSChallengeProviderByName (code )
171+ provider , err := dns_providers .NewDNSChallengeProviderByName (code )
139172 if err != nil {
140173 break
141174 }
0 commit comments