重构项目
This commit is contained in:
33
internal/class/Acme/Method.go
Normal file
33
internal/class/Acme/Method.go
Normal file
@ -0,0 +1,33 @@
|
||||
package Acme
|
||||
|
||||
import (
|
||||
"SafelineAPI/internal/app/logger"
|
||||
"log"
|
||||
)
|
||||
|
||||
func (acme *Acme) Verify() bool {
|
||||
var flag = false
|
||||
|
||||
if acme.Email == "" {
|
||||
logger.Warning.Printf("未设置 %s证书申请邮箱%s: 请检查配置文件中的 %sApplyCert.Email%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
flag = true
|
||||
}
|
||||
if !flag {
|
||||
log.Printf("%sApplyCert%s 相关配置检验完成!", logger.Cyan, logger.Reset)
|
||||
}
|
||||
return flag
|
||||
}
|
||||
|
||||
func (acme *Acme) VerifyCommand() bool {
|
||||
var flag = false
|
||||
|
||||
if acme.Email == "" {
|
||||
logger.Warning.Printf("未设置 %s证书申请邮箱%s: 请检查命令中的 %s-e%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
flag = true
|
||||
}
|
||||
if !flag {
|
||||
log.Printf("%sApplyCert%s 相关配置检验完成!", logger.Cyan, logger.Reset)
|
||||
}
|
||||
return flag
|
||||
|
||||
}
|
||||
10
internal/class/Acme/Object.go
Normal file
10
internal/class/Acme/Object.go
Normal file
@ -0,0 +1,10 @@
|
||||
package Acme
|
||||
|
||||
import (
|
||||
"SafelineAPI/internal/class/DNSProvider"
|
||||
)
|
||||
|
||||
type Acme struct {
|
||||
Email string `json:"Email"`
|
||||
DNSProvider DNSProvider.DNSProvider `json:"DNSProvider"`
|
||||
}
|
||||
60
internal/class/DNSProvider/Method.go
Normal file
60
internal/class/DNSProvider/Method.go
Normal file
@ -0,0 +1,60 @@
|
||||
package DNSProvider
|
||||
|
||||
import (
|
||||
"github.com/go-acme/lego/v4/challenge"
|
||||
"github.com/go-acme/lego/v4/providers/dns/alidns"
|
||||
"github.com/go-acme/lego/v4/providers/dns/dode"
|
||||
"github.com/go-acme/lego/v4/providers/dns/huaweicloud"
|
||||
"github.com/go-acme/lego/v4/providers/dns/rainyun"
|
||||
"github.com/go-acme/lego/v4/providers/dns/tencentcloud"
|
||||
"github.com/go-acme/lego/v4/providers/dns/westcn"
|
||||
)
|
||||
|
||||
func (tencent TencentCloud) Provider() (challenge.Provider, error) {
|
||||
cfg := tencentcloud.NewDefaultConfig()
|
||||
cfg.SecretID = tencent.SecretID
|
||||
cfg.SecretKey = tencent.SecretKey
|
||||
p, err := tencentcloud.NewDNSProviderConfig(cfg)
|
||||
return p, err
|
||||
}
|
||||
|
||||
func (ali AliCloud) Provider() (challenge.Provider, error) {
|
||||
cfg := alidns.NewDefaultConfig()
|
||||
cfg.SecurityToken = ali.STSToken
|
||||
cfg.SecretKey = ali.AccessKeySecret
|
||||
cfg.RAMRole = ali.RAMRole
|
||||
cfg.APIKey = ali.AccessKeyId
|
||||
p, err := alidns.NewDNSProviderConfig(cfg)
|
||||
return p, err
|
||||
}
|
||||
|
||||
func (huawei HuaweiCloud) Provider() (challenge.Provider, error) {
|
||||
cfg := huaweicloud.NewDefaultConfig()
|
||||
cfg.Region = huawei.Region
|
||||
cfg.AccessKeyID = huawei.AccessKeyId
|
||||
cfg.SecretAccessKey = huawei.SecretAccessKey
|
||||
p, err := huaweicloud.NewDNSProviderConfig(cfg)
|
||||
return p, err
|
||||
}
|
||||
|
||||
func (west WestCN) Provider() (challenge.Provider, error) {
|
||||
cfg := westcn.NewDefaultConfig()
|
||||
cfg.Username = west.Username
|
||||
cfg.Password = west.Password
|
||||
p, err := westcn.NewDNSProviderConfig(cfg)
|
||||
return p, err
|
||||
}
|
||||
|
||||
func (rain RainYun) Provider() (challenge.Provider, error) {
|
||||
cfg := rainyun.NewDefaultConfig()
|
||||
cfg.APIKey = rain.ApiKey
|
||||
p, err := rainyun.NewDNSProviderConfig(cfg)
|
||||
return p, err
|
||||
}
|
||||
|
||||
func (Dode Dode) Provider() (challenge.Provider, error) {
|
||||
cfg := dode.NewDefaultConfig()
|
||||
cfg.Token = Dode.Token
|
||||
p, err := dode.NewDNSProviderConfig(cfg)
|
||||
return p, err
|
||||
}
|
||||
32
internal/class/DNSProvider/Object.go
Normal file
32
internal/class/DNSProvider/Object.go
Normal file
@ -0,0 +1,32 @@
|
||||
package DNSProvider
|
||||
|
||||
type TencentCloud struct {
|
||||
SecretID string `json:"SecretId,omitempty"`
|
||||
SecretKey string `json:"SecretKey,omitempty"`
|
||||
}
|
||||
|
||||
type AliCloud struct {
|
||||
AccessKeyId string `json:"AccessKeyId,omitempty"`
|
||||
AccessKeySecret string `json:"AccessKeySecret,omitempty"`
|
||||
RAMRole string `json:"RAMRole,omitempty"`
|
||||
STSToken string `json:"STSToken,omitempty"`
|
||||
}
|
||||
|
||||
type HuaweiCloud struct {
|
||||
AccessKeyId string `json:"AccessKeyId,omitempty"`
|
||||
Region string `json:"Region,omitempty"`
|
||||
SecretAccessKey string `json:"SecretAccessKey,omitempty"`
|
||||
}
|
||||
|
||||
type WestCN struct {
|
||||
Username string `json:"Username,omitempty"`
|
||||
Password string `json:"Password,omitempty"`
|
||||
}
|
||||
|
||||
type RainYun struct {
|
||||
ApiKey string `json:"ApiKey,omitempty"`
|
||||
}
|
||||
|
||||
type Dode struct {
|
||||
Token string `json:"Token,omitempty"`
|
||||
}
|
||||
43
internal/class/DNSProvider/Objects.go
Normal file
43
internal/class/DNSProvider/Objects.go
Normal file
@ -0,0 +1,43 @@
|
||||
package DNSProvider
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"github.com/go-acme/lego/v4/challenge"
|
||||
)
|
||||
|
||||
type DNSProvider struct {
|
||||
TencentCloud TencentCloud `json:"TencentCloud,omitempty"`
|
||||
AliCloud AliCloud `json:"AliCloud,omitempty"`
|
||||
HuaweiCloud HuaweiCloud `json:"HuaweiCloud,omitempty"`
|
||||
WestCN WestCN `json:"WestCN,omitempty"`
|
||||
RainYun RainYun `json:"RainYun,omitempty"`
|
||||
Dode Dode `json:"Dode,omitempty"`
|
||||
}
|
||||
|
||||
func (dnsProvider *DNSProvider) Choose() ([]challenge.Provider, []error) {
|
||||
|
||||
var Providers []challenge.Provider
|
||||
var Errors []error
|
||||
v := reflect.ValueOf(dnsProvider).Elem()
|
||||
|
||||
for i := 0; i < v.NumField(); i++ {
|
||||
field := v.Field(i)
|
||||
if field.Kind() == reflect.Struct {
|
||||
for ii := 0; ii < field.NumField(); ii++ {
|
||||
if field.Field(ii).String() != "" {
|
||||
method, _ := field.Type().MethodByName("Provider")
|
||||
results := method.Func.Call([]reflect.Value{field})
|
||||
err, _ := results[1].Interface().(error)
|
||||
if err != nil {
|
||||
Errors = append(Errors, err)
|
||||
} else {
|
||||
Providers = append(Providers, results[0].Interface().(challenge.Provider))
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Providers, Errors
|
||||
}
|
||||
9
internal/class/DNSProvider/SubObject.go
Normal file
9
internal/class/DNSProvider/SubObject.go
Normal file
@ -0,0 +1,9 @@
|
||||
package DNSProvider
|
||||
|
||||
import "github.com/go-acme/lego/v4/challenge"
|
||||
|
||||
type Result struct {
|
||||
Provider challenge.Provider
|
||||
Error error
|
||||
}
|
||||
type Msg map[string]Result
|
||||
17
internal/class/MyUser/Method.go
Normal file
17
internal/class/MyUser/Method.go
Normal file
@ -0,0 +1,17 @@
|
||||
package MyUser
|
||||
|
||||
import (
|
||||
"crypto"
|
||||
|
||||
"github.com/go-acme/lego/v4/registration"
|
||||
)
|
||||
|
||||
func (myUser *MyUser) GetEmail() string {
|
||||
return myUser.Email
|
||||
}
|
||||
func (myUser *MyUser) GetRegistration() *registration.Resource {
|
||||
return myUser.Registration
|
||||
}
|
||||
func (myUser *MyUser) GetPrivateKey() crypto.PrivateKey {
|
||||
return myUser.Key
|
||||
}
|
||||
13
internal/class/MyUser/Object.go
Normal file
13
internal/class/MyUser/Object.go
Normal file
@ -0,0 +1,13 @@
|
||||
package MyUser
|
||||
|
||||
import (
|
||||
"crypto"
|
||||
|
||||
"github.com/go-acme/lego/v4/registration"
|
||||
)
|
||||
|
||||
type MyUser struct {
|
||||
Email string
|
||||
Registration *registration.Resource
|
||||
Key crypto.PrivateKey
|
||||
}
|
||||
119
internal/class/Safeline/Method.go
Normal file
119
internal/class/Safeline/Method.go
Normal file
@ -0,0 +1,119 @@
|
||||
package Safeline
|
||||
|
||||
import (
|
||||
"SafelineAPI/internal/app/SafelineRequest"
|
||||
"SafelineAPI/internal/app/logger"
|
||||
"SafelineAPI/pkg/utils"
|
||||
"fmt"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
func (apiToken ApiToken) GetApiToken() (string, string) {
|
||||
return "X-SLCE-API-TOKEN", apiToken.String()
|
||||
}
|
||||
|
||||
func (apiToken ApiToken) String() string {
|
||||
return string(apiToken)
|
||||
}
|
||||
|
||||
func (apiToken ApiToken) Verify() bool {
|
||||
if apiToken.String() == "" {
|
||||
logger.Warning.Printf("未设置 %sSafeLine API Token%s : 请检查配置文件中的 %sSafeLine.ApiToken%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (safeLine SafeLine) Verify() bool {
|
||||
a := safeLine.ApiToken.Verify()
|
||||
b := safeLine.Host.Verify()
|
||||
if a || b {
|
||||
return true
|
||||
}
|
||||
|
||||
NoLoginAuthTokenResp, NoLoginStatusCode, NoLoginErr := utils.AuthSafeLine(*safeLine.Host.Url())
|
||||
if NoLoginErr != nil {
|
||||
logger.Error.Printf("请求服务端时发生错误: %s%s%s", logger.Red, NoLoginErr.Error(), logger.Reset)
|
||||
return true
|
||||
}
|
||||
LoginAuthTokenResp, LoginStatusCode, LoginErr := utils.VerifyAuthToken(*safeLine.Host.Url(), safeLine.ApiToken.String())
|
||||
if LoginErr != nil {
|
||||
logger.Error.Printf("验证 %sSafeLine API Token%s 时发生错误: %s%s%s", logger.Cyan, logger.Reset, logger.Red, LoginErr.Error(), logger.Reset)
|
||||
return true
|
||||
}
|
||||
|
||||
if !(NoLoginAuthTokenResp.Err == "login-required" && NoLoginStatusCode == 401) {
|
||||
logger.Warning.Printf("服务端接口 %s/open/auth/token%s 请求有误: 请检查配置文件中的 %sSafeLine.Host%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
return true
|
||||
}
|
||||
|
||||
if LoginAuthTokenResp.Err == "login-required" && LoginStatusCode == 401 {
|
||||
logger.Warning.Printf("%sSafeLine API Token%s 有误: 请检查后重试", logger.Cyan, logger.Reset)
|
||||
return true
|
||||
}
|
||||
|
||||
logger.Success.Printf("%sSafeLine%s 相关配置检验完成!", logger.Cyan, logger.Reset)
|
||||
return false
|
||||
}
|
||||
|
||||
func (apiToken ApiToken) VerifyCommand() bool {
|
||||
if apiToken.String() == "" {
|
||||
logger.Warning.Printf("未设置 %sSafeLine API Token%s : 请检查命令中的 %s-t%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (safeLine SafeLine) VerifyCommand() bool {
|
||||
a := safeLine.ApiToken.VerifyCommand()
|
||||
b := safeLine.Host.VerifyCommand()
|
||||
if a || b {
|
||||
return true
|
||||
}
|
||||
|
||||
NoLoginAuthTokenResp, NoLoginStatusCode, NoLoginErr := utils.AuthSafeLine(*safeLine.Host.Url())
|
||||
if NoLoginErr != nil {
|
||||
logger.Error.Printf("请求服务端时发生错误: %s%s%s", logger.Red, NoLoginErr.Error(), logger.Reset)
|
||||
return true
|
||||
}
|
||||
LoginAuthTokenResp, LoginStatusCode, LoginErr := utils.VerifyAuthToken(*safeLine.Host.Url(), safeLine.ApiToken.String())
|
||||
if LoginErr != nil {
|
||||
logger.Error.Printf("验证 %sSafeLine API Token%s 时发生错误: %s%s%s", logger.Cyan, logger.Reset, logger.Red, LoginErr.Error(), logger.Reset)
|
||||
return true
|
||||
}
|
||||
|
||||
if !(NoLoginAuthTokenResp.Err == "login-required" && NoLoginStatusCode == 401) {
|
||||
logger.Warning.Printf("服务端接口 %s/open/auth/token%s 请求有误: 请检查命令中的 %s-h%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
return true
|
||||
}
|
||||
|
||||
if LoginAuthTokenResp.Err == "login-required" && LoginStatusCode == 401 {
|
||||
logger.Warning.Printf("%sSafeLine API Token%s 有误: 请检查后重试", logger.Cyan, logger.Reset)
|
||||
return true
|
||||
}
|
||||
|
||||
logger.Success.Printf("%sSafeLine%s 相关配置检验完成!", logger.Cyan, logger.Reset)
|
||||
return false
|
||||
}
|
||||
|
||||
func (host Host) Verify() bool {
|
||||
if host == "" {
|
||||
logger.Warning.Printf("未设置 %s服务器主机%s: 请检查配置文件中的 %sSafeLine.Host%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (host Host) VerifyCommand() bool {
|
||||
if host == "" {
|
||||
logger.Warning.Printf("未设置 %s主机名称%s: 请检查命令中的 %s-h%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (host Host) Url() *SafelineRequest.URL {
|
||||
var u *url.URL
|
||||
u, _ = url.Parse(fmt.Sprintf("https://%s", host))
|
||||
return (*SafelineRequest.URL)(u)
|
||||
}
|
||||
9
internal/class/Safeline/Object.go
Normal file
9
internal/class/Safeline/Object.go
Normal file
@ -0,0 +1,9 @@
|
||||
package Safeline
|
||||
|
||||
type SafeLine struct {
|
||||
Host Host `json:"Host"`
|
||||
ApiToken ApiToken `json:"ApiToken"`
|
||||
}
|
||||
|
||||
type Host string
|
||||
type ApiToken string
|
||||
106
internal/class/config/Method.go
Normal file
106
internal/class/config/Method.go
Normal file
@ -0,0 +1,106 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"SafelineAPI/internal/app/logger"
|
||||
"SafelineAPI/internal/class/Acme"
|
||||
"SafelineAPI/internal/class/DNSProvider"
|
||||
"SafelineAPI/internal/class/Safeline"
|
||||
"SafelineAPI/pkg/utils"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"log"
|
||||
"os"
|
||||
)
|
||||
|
||||
func (config *Config) Read(path string) {
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
logger.Error.Printf("配置文件读取失败: %s%s%s", logger.Red, err, logger.Reset)
|
||||
os.Exit(0)
|
||||
}
|
||||
err = json.Unmarshal(data, &config)
|
||||
if err != nil {
|
||||
logger.Error.Printf("配置文件读取失败: %s%s%s", logger.Red, err, logger.Reset)
|
||||
os.Exit(0)
|
||||
}
|
||||
config.Verify()
|
||||
}
|
||||
func (config *Config) Write(path string) {
|
||||
data, _ := json.MarshalIndent(config, "", " ")
|
||||
_ = os.WriteFile(path, data, 0644)
|
||||
}
|
||||
|
||||
func (config *Config) Command() {
|
||||
var host, apiToken, email *string
|
||||
var days, concurrency *int
|
||||
|
||||
host = flag.String("h", "172.22.222.4:1443", "-h <host>")
|
||||
apiToken = flag.String("t", "", "-t <apiToken>")
|
||||
days = flag.Int("d", 30, "-t <days>")
|
||||
concurrency = flag.Int("c", 3, "-c <concurrency>")
|
||||
email = flag.String("e", "", "-e <email>")
|
||||
kvp := flag.String("kv", "", "-kv <key=value>,<key=value>...")
|
||||
flag.Parse()
|
||||
|
||||
var KVP = make(utils.KVPair)
|
||||
if *kvp != "" {
|
||||
KVP.Set(*kvp)
|
||||
}
|
||||
|
||||
config.Days = *days
|
||||
config.Concurrency = *concurrency
|
||||
config.Server = Safeline.SafeLine{
|
||||
Host: Safeline.Host(*host),
|
||||
ApiToken: Safeline.ApiToken(*apiToken),
|
||||
}
|
||||
config.Acme = Acme.Acme{
|
||||
Email: *email,
|
||||
DNSProvider: DNSProvider.DNSProvider{
|
||||
TencentCloud: DNSProvider.TencentCloud{
|
||||
SecretID: KVP["SecretID"],
|
||||
SecretKey: KVP["SecretKey"],
|
||||
},
|
||||
AliCloud: DNSProvider.AliCloud{
|
||||
AccessKeyId: KVP["AccessKeyId"],
|
||||
AccessKeySecret: KVP["AccessKeySecret"],
|
||||
RAMRole: KVP["RAMRole"],
|
||||
STSToken: KVP["STSToken"],
|
||||
},
|
||||
HuaweiCloud: DNSProvider.HuaweiCloud{
|
||||
AccessKeyId: KVP["AccessKeyId"],
|
||||
Region: KVP["Region"],
|
||||
SecretAccessKey: KVP["SecretAccessKey"],
|
||||
},
|
||||
WestCN: DNSProvider.WestCN{
|
||||
Username: KVP["Username"],
|
||||
Password: KVP["Password"],
|
||||
},
|
||||
RainYun: DNSProvider.RainYun{
|
||||
ApiKey: KVP["ApiKey"],
|
||||
},
|
||||
Dode: DNSProvider.Dode{
|
||||
Token: KVP["Token"],
|
||||
},
|
||||
},
|
||||
}
|
||||
config.VerifyCommand()
|
||||
}
|
||||
func (config *Config) Verify() {
|
||||
a := config.Server.Verify()
|
||||
b := config.Acme.Verify()
|
||||
if a || b {
|
||||
log.Printf("配置检查完毕,请检查相关配置后重新运行!")
|
||||
os.Exit(0)
|
||||
}
|
||||
log.Printf("配置检查完毕,即将开始更新证书!")
|
||||
}
|
||||
|
||||
func (config *Config) VerifyCommand() {
|
||||
a := config.Server.VerifyCommand()
|
||||
b := config.Acme.VerifyCommand()
|
||||
if a || b {
|
||||
log.Printf("配置检查完毕,请检查相关配置后重新运行!")
|
||||
os.Exit(0)
|
||||
}
|
||||
log.Printf("配置检查完毕,即将开始更新证书!")
|
||||
}
|
||||
13
internal/class/config/Object.go
Normal file
13
internal/class/config/Object.go
Normal file
@ -0,0 +1,13 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"SafelineAPI/internal/class/Acme"
|
||||
"SafelineAPI/internal/class/Safeline"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
Concurrency int `json:"Concurrency"`
|
||||
Days int `json:"Days"`
|
||||
Server Safeline.SafeLine `json:"Server"`
|
||||
Acme Acme.Acme `json:"Acme"`
|
||||
}
|
||||
49
internal/class/config/default.go
Normal file
49
internal/class/config/default.go
Normal file
@ -0,0 +1,49 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"SafelineAPI/internal/class/Acme"
|
||||
"SafelineAPI/internal/class/DNSProvider"
|
||||
"SafelineAPI/internal/class/Safeline"
|
||||
)
|
||||
|
||||
func (config *Config) Default() {
|
||||
a := Config{
|
||||
Concurrency: 3,
|
||||
Days: 15,
|
||||
Server: Safeline.SafeLine{
|
||||
Host: "192.168.1.4:1443",
|
||||
ApiToken: "xxx",
|
||||
},
|
||||
Acme: Acme.Acme{
|
||||
Email: "xxx",
|
||||
DNSProvider: DNSProvider.DNSProvider{
|
||||
TencentCloud: DNSProvider.TencentCloud{
|
||||
SecretID: "xxx",
|
||||
SecretKey: "xxx",
|
||||
},
|
||||
AliCloud: DNSProvider.AliCloud{
|
||||
AccessKeyId: "xxx",
|
||||
AccessKeySecret: "xxx",
|
||||
RAMRole: "xxx(可选)",
|
||||
STSToken: "xxx(可选)",
|
||||
},
|
||||
HuaweiCloud: DNSProvider.HuaweiCloud{
|
||||
AccessKeyId: "xxx",
|
||||
Region: "xxx",
|
||||
SecretAccessKey: "xxx",
|
||||
},
|
||||
WestCN: DNSProvider.WestCN{
|
||||
Username: "xxx",
|
||||
Password: "xxx",
|
||||
},
|
||||
RainYun: DNSProvider.RainYun{
|
||||
ApiKey: "xxx",
|
||||
},
|
||||
Dode: DNSProvider.Dode{
|
||||
Token: "xxx",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
a.Write("./config.json")
|
||||
}
|
||||
Reference in New Issue
Block a user