迁移并重构项目,优化了执行流程

This commit is contained in:
2025-10-31 15:43:25 +08:00
commit 35bcd62ad5
29 changed files with 1312 additions and 0 deletions

View 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)
}

View 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
}

View 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
}

View File

@ -0,0 +1,6 @@
package SafeLine
type Object struct {
Host string `json:"Host"`
ApiToken string `json:"ApiToken"`
}

View 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)
}

View 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
}

View 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()
}