迁移并重构项目,优化了执行流程
This commit is contained in:
42
internal/class/SafeLine/Cert.go
Normal file
42
internal/class/SafeLine/Cert.go
Normal file
@ -0,0 +1,42 @@
|
||||
package SafeLine
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
)
|
||||
|
||||
type UpdateReq struct {
|
||||
Acme struct {
|
||||
Domains []string `json:"domains"`
|
||||
Email string `json:"email"`
|
||||
} `json:"acme"`
|
||||
Id int `json:"id"`
|
||||
Manual struct {
|
||||
Crt string `json:"crt"`
|
||||
Key string `json:"key"`
|
||||
} `json:"manual"`
|
||||
Type int `json:"type"`
|
||||
}
|
||||
|
||||
func (updateReq *UpdateReq) Create(Certificate, PrivateKey []byte, domains []string, email string, id, Type int) {
|
||||
updateReq.Acme.Domains = domains
|
||||
updateReq.Acme.Email = email
|
||||
updateReq.Manual.Crt = string(Certificate)
|
||||
updateReq.Manual.Key = string(PrivateKey)
|
||||
updateReq.Id = id
|
||||
updateReq.Type = Type
|
||||
}
|
||||
|
||||
func (updateReq *UpdateReq) Marshal() []byte {
|
||||
data, _ := json.Marshal(updateReq)
|
||||
return data
|
||||
}
|
||||
|
||||
type UpdateResp struct {
|
||||
Data int `json:"data"`
|
||||
Err interface{} `json:"err"`
|
||||
Msg string `json:"msg"`
|
||||
}
|
||||
|
||||
func (updateResp *UpdateResp) Unmarshal(data []byte) {
|
||||
_ = json.Unmarshal(data, &updateResp)
|
||||
}
|
||||
29
internal/class/SafeLine/CheckMethod.go
Normal file
29
internal/class/SafeLine/CheckMethod.go
Normal file
@ -0,0 +1,29 @@
|
||||
package SafeLine
|
||||
|
||||
import "SafeLine-Acme/internal/app/logger"
|
||||
|
||||
func (safeLine *Object) CheckFile() bool {
|
||||
var flag = true
|
||||
if safeLine.Host == "" {
|
||||
logger.Warning.Printf("未设置 %s服务器主机%s: 请检查配置文件中的 %sServer.Host%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
flag = false
|
||||
}
|
||||
if safeLine.ApiToken == "" {
|
||||
logger.Warning.Printf("未设置 %sSafeLine API Token%s : 请检查配置文件中的 %sServer.ApiToken%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
flag = false
|
||||
}
|
||||
return flag
|
||||
}
|
||||
|
||||
func (safeLine *Object) CheckCommand() bool {
|
||||
var flag = true
|
||||
if safeLine.Host == "" {
|
||||
logger.Warning.Printf("未设置 %s服务器主机%s: 请检查命令中的 %s-h%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
flag = false
|
||||
}
|
||||
if safeLine.ApiToken == "" {
|
||||
logger.Warning.Printf("未设置 %sSafeLine API Token%s : 请检查命令中的 %s-t%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||
flag = false
|
||||
}
|
||||
return flag
|
||||
}
|
||||
52
internal/class/SafeLine/Method.go
Normal file
52
internal/class/SafeLine/Method.go
Normal file
@ -0,0 +1,52 @@
|
||||
package SafeLine
|
||||
|
||||
import (
|
||||
"SafeLine-Acme/internal/app/logger"
|
||||
"SafeLine-Acme/pkg/utils"
|
||||
"bytes"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
)
|
||||
|
||||
func (safeLine *Object) GetCertNodes() []Nodes {
|
||||
header := http.Header{
|
||||
"X-SLCE-API-TOKEN": []string{safeLine.ApiToken},
|
||||
}
|
||||
resp, err := utils.Request("GET", safeLine.SSLCertUrl(), nil, header)
|
||||
if err != nil {
|
||||
logger.Error.Printf("请求接口 %s/api/open/cert%s 时发生错误: %s%s%s", logger.Cyan, logger.Reset, logger.Red, err, logger.Reset)
|
||||
os.Exit(0)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
data, _ := io.ReadAll(resp.Body)
|
||||
var listResp ListResp
|
||||
listResp.Unmarshal(data)
|
||||
return listResp.Data.Nodes
|
||||
}
|
||||
|
||||
func (safeLine *Object) UpdateCert(email string, Certificate, PrivateKey []byte, cert Nodes) ([]string, []string) {
|
||||
|
||||
header := http.Header{
|
||||
"X-SLCE-API-TOKEN": []string{safeLine.ApiToken},
|
||||
"Content-Type": []string{"application/json"},
|
||||
}
|
||||
var updateReq UpdateReq
|
||||
updateReq.Create(Certificate, PrivateKey, cert.Domains, email, cert.Id, cert.Type)
|
||||
resp, err := utils.Request("POST", safeLine.SSLCertUrl(), bytes.NewReader(updateReq.Marshal()), header)
|
||||
if err != nil {
|
||||
logger.Error.Printf("更新证书时发生错误: %s%s%s", logger.Red, err, logger.Reset)
|
||||
return nil, nil
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
data, _ := io.ReadAll(resp.Body)
|
||||
var updateResp UpdateResp
|
||||
updateResp.Unmarshal(data)
|
||||
if updateResp.Msg != "" {
|
||||
logger.Error.Printf("域名 %s%s%s 证书更新失败: %s%s%s", logger.Cyan, cert.Domains, logger.Reset, logger.Red, updateResp.Msg, logger.Reset)
|
||||
return nil, cert.Domains
|
||||
}
|
||||
logger.Success.Printf("域名 %s%s%s 证书更新成功!", logger.Cyan, cert.Domains, logger.Reset)
|
||||
return cert.Domains, nil
|
||||
|
||||
}
|
||||
6
internal/class/SafeLine/Object.go
Normal file
6
internal/class/SafeLine/Object.go
Normal file
@ -0,0 +1,6 @@
|
||||
package SafeLine
|
||||
|
||||
type Object struct {
|
||||
Host string `json:"Host"`
|
||||
ApiToken string `json:"ApiToken"`
|
||||
}
|
||||
33
internal/class/SafeLine/Other.go
Normal file
33
internal/class/SafeLine/Other.go
Normal file
@ -0,0 +1,33 @@
|
||||
package SafeLine
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
)
|
||||
|
||||
type ListResp struct {
|
||||
Data struct {
|
||||
Nodes []Nodes `json:"nodes"`
|
||||
Total int `json:"total"`
|
||||
} `json:"data"`
|
||||
Err string `json:"err"`
|
||||
Msg string `json:"msg"`
|
||||
}
|
||||
|
||||
type Nodes struct {
|
||||
Id int `json:"id"`
|
||||
Domains []string `json:"domains"`
|
||||
Issuer string `json:"issuer"`
|
||||
SelfSignature bool `json:"self_signature"`
|
||||
Trusted bool `json:"trusted"`
|
||||
Revoked bool `json:"revoked"`
|
||||
Expired bool `json:"expired"`
|
||||
Type int `json:"type"`
|
||||
AcmeMessage string `json:"acme_message"`
|
||||
ValidBefore time.Time `json:"valid_before"`
|
||||
RelatedSites []string `json:"related_sites"`
|
||||
}
|
||||
|
||||
func (listResp *ListResp) Unmarshal(data []byte) {
|
||||
_ = json.Unmarshal(data, &listResp)
|
||||
}
|
||||
42
internal/class/SafeLine/VerifyMethod.go
Normal file
42
internal/class/SafeLine/VerifyMethod.go
Normal file
@ -0,0 +1,42 @@
|
||||
package SafeLine
|
||||
|
||||
import (
|
||||
"SafeLine-Acme/internal/app/logger"
|
||||
"SafeLine-Acme/pkg/utils"
|
||||
"errors"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func (safeLine *Object) Verify() bool {
|
||||
err := safeLine.ServerVerify()
|
||||
if err != nil {
|
||||
logger.Error.Printf("请求服务端时发生错误: %s%s%s", logger.Red, err.Error(), logger.Reset)
|
||||
return false
|
||||
}
|
||||
|
||||
err = safeLine.AuthTokenVerify()
|
||||
if err != nil {
|
||||
logger.Warning.Printf("%sSafeLine API Token%s 验证失败,请检查后重试", logger.Cyan, logger.Reset)
|
||||
return false
|
||||
}
|
||||
|
||||
logger.Success.Printf("%sSafeLine%s 相关配置检验完成!", logger.Cyan, logger.Reset)
|
||||
return true
|
||||
}
|
||||
|
||||
func (safeLine *Object) ServerVerify() error {
|
||||
_, err := utils.Request("GET", safeLine.Url().String(), nil, nil)
|
||||
return err
|
||||
}
|
||||
|
||||
func (safeLine *Object) AuthTokenVerify() error {
|
||||
header := http.Header{
|
||||
"X-SLCE-API-TOKEN": []string{safeLine.ApiToken},
|
||||
}
|
||||
|
||||
resp, err := utils.Request("GET", safeLine.AuthTokenUrl(), nil, header)
|
||||
if err != nil || resp.StatusCode != 200 {
|
||||
return errors.New("token 验证失败")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
26
internal/class/SafeLine/url.go
Normal file
26
internal/class/SafeLine/url.go
Normal file
@ -0,0 +1,26 @@
|
||||
package SafeLine
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
func (safeLine *Object) Url() *url.URL {
|
||||
var u *url.URL
|
||||
u, _ = url.Parse(fmt.Sprintf("https://%s", safeLine.Host))
|
||||
return u
|
||||
}
|
||||
|
||||
func (safeLine *Object) AuthTokenUrl() string {
|
||||
path := "/api/open/auth/token"
|
||||
u := safeLine.Url()
|
||||
u.Path = path
|
||||
return u.String()
|
||||
}
|
||||
|
||||
func (safeLine *Object) SSLCertUrl() string {
|
||||
path := "/api/open/cert"
|
||||
u := safeLine.Url()
|
||||
u.Path = path
|
||||
return u.String()
|
||||
}
|
||||
Reference in New Issue
Block a user