mirror of
https://github.com/XrayR-project/XrayR.git
synced 2025-06-07 21:09:53 +00:00
164 lines
3.4 KiB
Go
164 lines
3.4 KiB
Go
package mylego
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
var defaultPath string
|
|
|
|
func New(certConf *CertConfig) (*LegoCMD, error) {
|
|
// Set default path to configPath/cert
|
|
var p = ""
|
|
configPath := os.Getenv("XRAY_LOCATION_CONFIG")
|
|
if configPath != "" {
|
|
p = configPath
|
|
} else if cwd, err := os.Getwd(); err == nil {
|
|
p = cwd
|
|
} else {
|
|
p = "."
|
|
}
|
|
|
|
defaultPath = filepath.Join(p, "cert")
|
|
lego := &LegoCMD{
|
|
C: certConf,
|
|
path: defaultPath,
|
|
}
|
|
|
|
return lego, nil
|
|
}
|
|
|
|
func (l *LegoCMD) getPath() string {
|
|
return l.path
|
|
}
|
|
|
|
func (l *LegoCMD) getCertConfig() *CertConfig {
|
|
return l.C
|
|
}
|
|
|
|
// DNSCert cert a domain using DNS API
|
|
func (l *LegoCMD) DNSCert() (CertPath string, KeyPath string, err error) {
|
|
defer func() (string, string, error) {
|
|
// Handle any error
|
|
if r := recover(); r != nil {
|
|
switch x := r.(type) {
|
|
case string:
|
|
err = errors.New(x)
|
|
case error:
|
|
err = x
|
|
default:
|
|
err = errors.New("unknown panic")
|
|
}
|
|
return "", "", err
|
|
}
|
|
return CertPath, KeyPath, nil
|
|
}()
|
|
|
|
// Set Env for DNS configuration
|
|
for key, value := range l.C.DNSEnv {
|
|
os.Setenv(strings.ToUpper(key), value)
|
|
}
|
|
|
|
// First check if the certificate exists
|
|
CertPath, KeyPath, err = checkCertFile(l.C.CertDomain)
|
|
if err == nil {
|
|
return CertPath, KeyPath, err
|
|
}
|
|
|
|
err = l.Run()
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
CertPath, KeyPath, err = checkCertFile(l.C.CertDomain)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
return CertPath, KeyPath, nil
|
|
}
|
|
|
|
// HTTPCert cert a domain using http methods
|
|
func (l *LegoCMD) HTTPCert() (CertPath string, KeyPath string, err error) {
|
|
defer func() (string, string, error) {
|
|
// Handle any error
|
|
if r := recover(); r != nil {
|
|
switch x := r.(type) {
|
|
case string:
|
|
err = errors.New(x)
|
|
case error:
|
|
err = x
|
|
default:
|
|
err = errors.New("unknown panic")
|
|
}
|
|
return "", "", err
|
|
}
|
|
return CertPath, KeyPath, nil
|
|
}()
|
|
|
|
// First check if the certificate exists
|
|
CertPath, KeyPath, err = checkCertFile(l.C.CertDomain)
|
|
if err == nil {
|
|
return CertPath, KeyPath, err
|
|
}
|
|
|
|
err = l.Run()
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
CertPath, KeyPath, err = checkCertFile(l.C.CertDomain)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
return CertPath, KeyPath, nil
|
|
}
|
|
|
|
// RenewCert renew a domain cert
|
|
func (l *LegoCMD) RenewCert() (CertPath string, KeyPath string, ok bool, err error) {
|
|
defer func() (string, string, bool, error) {
|
|
// Handle any error
|
|
if r := recover(); r != nil {
|
|
switch x := r.(type) {
|
|
case string:
|
|
err = errors.New(x)
|
|
case error:
|
|
err = x
|
|
default:
|
|
err = errors.New("unknown panic")
|
|
}
|
|
return "", "", false, err
|
|
}
|
|
return CertPath, KeyPath, ok, nil
|
|
}()
|
|
|
|
ok, err = l.Renew()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
CertPath, KeyPath, err = checkCertFile(l.C.CertDomain)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func checkCertFile(domain string) (string, string, error) {
|
|
keyPath := path.Join(defaultPath, "certificates", fmt.Sprintf("%s.key", sanitizedDomain(domain)))
|
|
certPath := path.Join(defaultPath, "certificates", fmt.Sprintf("%s.crt", sanitizedDomain(domain)))
|
|
if _, err := os.Stat(keyPath); os.IsNotExist(err) {
|
|
return "", "", fmt.Errorf("cert key failed: %s", domain)
|
|
}
|
|
if _, err := os.Stat(certPath); os.IsNotExist(err) {
|
|
return "", "", fmt.Errorf("cert cert failed: %s", domain)
|
|
}
|
|
absKeyPath, _ := filepath.Abs(keyPath)
|
|
absCertPath, _ := filepath.Abs(certPath)
|
|
return absCertPath, absKeyPath, nil
|
|
}
|