Skip to content

Commit cab5ff2

Browse files
0xJackyHintay
authored andcommitted
feat: get lego's logs and send them to frontend
1 parent 2529ca9 commit cab5ff2

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

frontend/src/views/domain/cert/components/ObtainCert.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,10 @@ const issue_cert = async (config_name: string, server_name: string, callback: Fu
154154
155155
switch (r.status) {
156156
case 'info':
157-
progressPercent.value += 5
157+
// If it's a lego log, do not increase the percent.
158+
if (r.message.indexOf('[INFO]') == -1) {
159+
progressPercent.value += 5
160+
}
158161
break
159162
default:
160163
modalClosable.value = true

server/internal/cert/cert.go

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
5570
func 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

Comments
 (0)