fix: dns manager issue

This commit is contained in:
0xJacky 2023-04-13 15:03:17 +08:00
parent fcc22632ec
commit c95aa36433
No known key found for this signature in database
GPG key ID: B6E4A6E4A561BAF0
2 changed files with 93 additions and 89 deletions

View file

@ -14,6 +14,10 @@ const code = computed(() => {
}) })
function init() { function init() {
data.configuration = {
credentials: {},
additional: {}
}
providers.value?.forEach((v: any, k: number) => { providers.value?.forEach((v: any, k: number) => {
if (v.code === code.value) { if (v.code === code.value) {
provider_idx.value = k provider_idx.value = k

View file

@ -1,128 +1,128 @@
package cert package cert
import ( import (
"fmt" "fmt"
"github.com/0xJacky/Nginx-UI/server/model" "github.com/0xJacky/Nginx-UI/server/model"
"github.com/pkg/errors" "github.com/pkg/errors"
"log" "log"
"time" "time"
) )
func handleIssueCertLogChan(logChan chan string) { func handleIssueCertLogChan(logChan chan string) {
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
log.Println("[Auto Cert] handleIssueCertLogChan", err) log.Println("[Auto Cert] handleIssueCertLogChan", err)
} }
}() }()
for logString := range logChan { for logString := range logChan {
log.Println("[Auto Cert] Info", logString) log.Println("[Auto Cert] Info", logString)
} }
} }
type AutoCertErrorLog struct { type AutoCertErrorLog struct {
buffer []string buffer []string
cert *model.Cert cert *model.Cert
} }
func (t *AutoCertErrorLog) SetCertModel(cert *model.Cert) { func (t *AutoCertErrorLog) SetCertModel(cert *model.Cert) {
t.cert = cert t.cert = cert
} }
func (t *AutoCertErrorLog) Push(text string, err error) { func (t *AutoCertErrorLog) Push(text string, err error) {
t.buffer = append(t.buffer, text+" "+err.Error()) t.buffer = append(t.buffer, text+" "+err.Error())
log.Println("[AutoCert Error]", text, err) log.Println("[AutoCert Error]", text, err)
} }
func (t *AutoCertErrorLog) Exit(text string, err error) { func (t *AutoCertErrorLog) Exit(text string, err error) {
t.buffer = append(t.buffer, text+" "+err.Error()) t.buffer = append(t.buffer, text+" "+err.Error())
log.Println("[AutoCert Error]", text, err) log.Println("[AutoCert Error]", text, err)
if t.cert == nil { if t.cert == nil {
return return
} }
_ = t.cert.Updates(&model.Cert{ _ = t.cert.Updates(&model.Cert{
Log: t.ToString(), Log: t.ToString(),
}) })
} }
func (t *AutoCertErrorLog) ToString() (content string) { func (t *AutoCertErrorLog) ToString() (content string) {
for _, v := range t.buffer { for _, v := range t.buffer {
content += fmt.Sprintf("[AutoCert Error] %s\n", v) content += fmt.Sprintf("[AutoCert Error] %s\n", v)
} }
return return
} }
func AutoObtain() { func AutoObtain() {
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
log.Println("[AutoCert] Recover", err) log.Println("[AutoCert] Recover", err)
} }
}() }()
log.Println("[AutoCert] Start") log.Println("[AutoCert] Start")
autoCertList := model.GetAutoCertList() autoCertList := model.GetAutoCertList()
for _, certModel := range autoCertList { for _, certModel := range autoCertList {
confName := certModel.Filename confName := certModel.Filename
errLog := &AutoCertErrorLog{} errLog := &AutoCertErrorLog{}
errLog.SetCertModel(certModel) errLog.SetCertModel(certModel)
if len(certModel.Filename) == 0 { if len(certModel.Filename) == 0 {
errLog.Exit("", errors.New("filename is empty")) errLog.Exit("", errors.New("filename is empty"))
continue continue
} }
if len(certModel.Domains) == 0 { if len(certModel.Domains) == 0 {
errLog.Exit(confName, errors.New("domains list is empty, "+ errLog.Exit(confName, errors.New("domains list is empty, "+
"try to reopen auto-cert for this config:"+confName)) "try to reopen auto-cert for this config:"+confName))
continue continue
} }
if certModel.SSLCertificatePath != "" { if certModel.SSLCertificatePath != "" {
cert, err := GetCertInfo(certModel.SSLCertificatePath) cert, err := GetCertInfo(certModel.SSLCertificatePath)
if err != nil { if err != nil {
errLog.Push("get cert info", err) errLog.Push("get cert info", err)
// Get certificate info error, ignore this domain // Get certificate info error, ignore this domain
continue continue
} }
// every week // every week
if time.Now().Sub(cert.NotBefore).Hours()/24 < 7 { if time.Now().Sub(cert.NotBefore).Hours()/24 < 7 {
continue continue
} }
} }
// after 1 mo, reissue certificate // after 1 mo, reissue certificate
logChan := make(chan string, 1) logChan := make(chan string, 1)
errChan := make(chan error, 1) errChan := make(chan error, 1)
// support SAN certification // support SAN certification
payload := &ConfigPayload{ payload := &ConfigPayload{
ServerName: certModel.Domains, ServerName: certModel.Domains,
ChallengeMethod: certModel.ChallengeMethod, ChallengeMethod: certModel.ChallengeMethod,
DNSCredentialID: certModel.DnsCredentialID, DNSCredentialID: certModel.DnsCredentialID,
} }
go IssueCert(payload, logChan, errChan) go IssueCert(payload, logChan, errChan)
go handleIssueCertLogChan(logChan) go handleIssueCertLogChan(logChan)
// block, unless errChan closed // block, unless errChan closed
for err := range errChan { for err := range errChan {
errLog.Push("issue cert", err) errLog.Push("issue cert", err)
} }
logStr := errLog.ToString() logStr := errLog.ToString()
if logStr != "" { if logStr != "" {
// store error log to db // store error log to db
_ = certModel.Updates(&model.Cert{ _ = certModel.Updates(&model.Cert{
Log: errLog.ToString(), Log: errLog.ToString(),
}) })
} else { } else {
certModel.ClearLog() certModel.ClearLog()
} }
close(logChan) close(logChan)
} }
log.Println("[AutoCert] End") log.Println("[AutoCert] End")
} }