fix goroutine and memory leak

This commit is contained in:
0xJacky 2022-06-13 00:29:52 +08:00
parent 61496e3727
commit 40fcebbaae
3 changed files with 23 additions and 19 deletions

View file

@ -59,7 +59,8 @@ type serverFileSystemType struct {
} }
func (f serverFileSystemType) Exists(prefix string, _path string) bool { func (f serverFileSystemType) Exists(prefix string, _path string) bool {
_, err := f.Open(path.Join(prefix, _path)) file, err := f.Open(path.Join(prefix, _path))
defer file.Close()
return err == nil return err == nil
} }

View file

@ -24,9 +24,11 @@ func InitRouter() *gin.Engine {
accept := c.Request.Header.Get("Accept") accept := c.Request.Header.Get("Accept")
if strings.Contains(accept, "text/html") { if strings.Contains(accept, "text/html") {
file, _ := mustFS("").Open("index.html") file, _ := mustFS("").Open("index.html")
defer file.Close()
stat, _ := file.Stat() stat, _ := file.Stat()
c.DataFromReader(http.StatusOK, stat.Size(), "text/html", c.DataFromReader(http.StatusOK, stat.Size(), "text/html",
bufio.NewReader(file), nil) bufio.NewReader(file), nil)
return
} }
}) })

View file

@ -5,7 +5,6 @@ import (
"crypto/ecdsa" "crypto/ecdsa"
"crypto/elliptic" "crypto/elliptic"
"crypto/rand" "crypto/rand"
"crypto/tls"
"crypto/x509" "crypto/x509"
"github.com/0xJacky/Nginx-UI/server/model" "github.com/0xJacky/Nginx-UI/server/model"
"github.com/0xJacky/Nginx-UI/server/settings" "github.com/0xJacky/Nginx-UI/server/settings"
@ -15,9 +14,11 @@ import (
"github.com/go-acme/lego/v4/challenge/http01" "github.com/go-acme/lego/v4/challenge/http01"
"github.com/go-acme/lego/v4/lego" "github.com/go-acme/lego/v4/lego"
"github.com/go-acme/lego/v4/registration" "github.com/go-acme/lego/v4/registration"
"github.com/pkg/errors"
"io" "io"
"io/ioutil" "io/ioutil"
"log" "log"
"net"
"net/http" "net/http"
"os" "os"
"path/filepath" "path/filepath"
@ -70,15 +71,20 @@ func GetCertInfo(domain string) (key *x509.Certificate, err error) {
var response *http.Response var response *http.Response
ts := &http.Transport{ client := &http.Client{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, Transport: &http.Transport{
DialContext: (&net.Dialer{
Timeout: 5 * time.Second,
}).DialContext,
DisableKeepAlives: true,
},
Timeout: 5 * time.Second,
} }
client := &http.Client{Transport: ts}
response, err = client.Get("https://" + domain) response, err = client.Get("https://" + domain)
if err != nil { if err != nil {
err = errors.Wrap(err, "get cert info error")
return return
} }
@ -99,8 +105,7 @@ func IssueCert(domain string) error {
// Create a user. New accounts need an email and private key to start. // Create a user. New accounts need an email and private key to start.
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil { if err != nil {
log.Println(err) return errors.Wrap(err, "issue cert generate key error")
return err
} }
myUser := MyUser{ myUser := MyUser{
@ -118,8 +123,7 @@ func IssueCert(domain string) error {
// A client facilitates communication with the CA server. // A client facilitates communication with the CA server.
client, err := lego.NewClient(config) client, err := lego.NewClient(config)
if err != nil { if err != nil {
log.Println(err) return errors.Wrap(err, "issue cert new client error")
return err
} }
err = client.Challenge.SetHTTP01Provider( err = client.Challenge.SetHTTP01Provider(
@ -128,15 +132,14 @@ func IssueCert(domain string) error {
), ),
) )
if err != nil { if err != nil {
log.Println(err) return errors.Wrap(err, "issue cert challenge fail")
return err
} }
// New users will need to register // New users will need to register
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true}) reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return err return errors.Wrap(err, "issue cert register fail")
} }
myUser.Registration = reg myUser.Registration = reg
@ -146,15 +149,13 @@ func IssueCert(domain string) error {
} }
certificates, err := client.Certificate.Obtain(request) certificates, err := client.Certificate.Obtain(request)
if err != nil { if err != nil {
log.Println(err) return errors.Wrap(err, "issue cert fail to obtain")
return err
} }
saveDir := nginx.GetNginxConfPath("ssl/" + domain) saveDir := nginx.GetNginxConfPath("ssl/" + domain)
if _, err := os.Stat(saveDir); os.IsNotExist(err) { if _, err := os.Stat(saveDir); os.IsNotExist(err) {
err = os.Mkdir(saveDir, 0755) err = os.Mkdir(saveDir, 0755)
if err != nil { if err != nil {
log.Println("fail to create", saveDir) return errors.Wrap(err, "issue cert fail to create")
return err
} }
} }
@ -164,13 +165,13 @@ func IssueCert(domain string) error {
certificates.Certificate, 0644) certificates.Certificate, 0644)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return err return errors.Wrap(err, "issue cert write fullchain.cer fail")
} }
err = ioutil.WriteFile(filepath.Join(saveDir, domain+".key"), err = ioutil.WriteFile(filepath.Join(saveDir, domain+".key"),
certificates.PrivateKey, 0644) certificates.PrivateKey, 0644)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return err return errors.Wrap(err, "issue cert write key fail")
} }
nginx.ReloadNginx() nginx.ReloadNginx()