Compare commits
2 Commits
4590d46e17
...
bf4832607c
| Author | SHA1 | Date | |
|---|---|---|---|
| bf4832607c | |||
| ce649f0e18 |
19
Makefile
19
Makefile
@@ -1,50 +1,49 @@
|
|||||||
# 定义变量
|
# Define variables
|
||||||
BIN_DIR := ./bin
|
BIN_DIR := ./bin
|
||||||
APP_NAME := safelineApi
|
APP_NAME := safelineApi
|
||||||
SRC_DIR := ./cmd/safelineApi
|
SRC_DIR := ./cmd/safelineApi
|
||||||
VERSION := 1.0.0
|
VERSION := 1.0.0
|
||||||
BUILD_TIME := $(shell date +"%Y-%m-%dT%H:%M:%S")
|
BUILD_TIME := $(shell date +"%Y-%m-%dT%H:%M:%S")
|
||||||
|
|
||||||
# 默认任务
|
|
||||||
.DEFAULT_GOAL := build
|
.DEFAULT_GOAL := build
|
||||||
|
|
||||||
# 构建任务
|
# Build task
|
||||||
build:
|
build:
|
||||||
@echo "Building $(APP_NAME) version $(VERSION)..."
|
@echo "Building $(APP_NAME) version $(VERSION)..."
|
||||||
mkdir -p $(BIN_DIR)
|
mkdir -p $(BIN_DIR)
|
||||||
go build -ldflags "-X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" -o $(BIN_DIR)/$(APP_NAME) $(SRC_DIR)
|
go build -ldflags "-X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" -o $(BIN_DIR)/$(APP_NAME) $(SRC_DIR)
|
||||||
|
|
||||||
# 运行任务
|
# Run task
|
||||||
run:
|
run:
|
||||||
@echo "Running $(APP_NAME)..."
|
@echo "Running $(APP_NAME)..."
|
||||||
$(BIN_DIR)/$(APP_NAME)
|
$(BIN_DIR)/$(APP_NAME)
|
||||||
|
|
||||||
# 清理任务
|
# Clean task
|
||||||
clean:
|
clean:
|
||||||
@echo "Cleaning up..."
|
@echo "Cleaning up..."
|
||||||
rm -rf $(BIN_DIR)
|
rm -rf $(BIN_DIR)
|
||||||
|
|
||||||
# 测试任务
|
# Test task
|
||||||
test:
|
test:
|
||||||
@echo "Running tests..."
|
@echo "Running tests..."
|
||||||
go test ./...
|
go test ./...
|
||||||
|
|
||||||
# 格式化代码
|
# Format code
|
||||||
fmt:
|
fmt:
|
||||||
@echo "Formatting code..."
|
@echo "Formatting code..."
|
||||||
go fmt ./...
|
go fmt ./...
|
||||||
|
|
||||||
# 检查代码风格
|
# Vet code
|
||||||
vet:
|
vet:
|
||||||
@echo "Vetting code..."
|
@echo "Vetting code..."
|
||||||
go vet ./...
|
go vet ./...
|
||||||
|
|
||||||
# 安装依赖
|
# Install dependencies
|
||||||
tidy:
|
tidy:
|
||||||
@echo "Tidying dependencies..."
|
@echo "Tidying dependencies..."
|
||||||
go mod tidy
|
go mod tidy
|
||||||
|
|
||||||
# 多平台编译
|
# Cross-platform build
|
||||||
build-all:
|
build-all:
|
||||||
@echo "Building for all platforms..."
|
@echo "Building for all platforms..."
|
||||||
GOOS=linux GOARCH=amd64 go build -o $(BIN_DIR)/$(APP_NAME)-linux-amd64 $(SRC_DIR)
|
GOOS=linux GOARCH=amd64 go build -o $(BIN_DIR)/$(APP_NAME)-linux-amd64 $(SRC_DIR)
|
||||||
|
|||||||
41
cmd/safelineApi/config.json
Normal file
41
cmd/safelineApi/config.json
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"SafeLine": {
|
||||||
|
"Host": {
|
||||||
|
"HostName": "192.168.1.4",
|
||||||
|
"Port": "1443"
|
||||||
|
},
|
||||||
|
"ApiToken": "xxx"
|
||||||
|
},
|
||||||
|
"ApplyCert": {
|
||||||
|
"Days": 30,
|
||||||
|
"Email": "xxx",
|
||||||
|
"SavePath": "/tmp/ssl",
|
||||||
|
"DNSProviderConfig": {
|
||||||
|
"DNSProvider": "xxx",
|
||||||
|
"TencentCloud": {
|
||||||
|
"SecretId": "xxx",
|
||||||
|
"SecretKey": "xxx"
|
||||||
|
},
|
||||||
|
"AliCloud": {
|
||||||
|
"AccessKeyId": "xxx",
|
||||||
|
"AccessKeySecret": "xxx",
|
||||||
|
"RAMRole": "xxx (optional)",
|
||||||
|
"STSToken": "xxx (optional)"
|
||||||
|
},
|
||||||
|
"HuaweiCloud": {
|
||||||
|
"AccessKeyId": "xxx",
|
||||||
|
"Region": "xxx",
|
||||||
|
"SecretAccessKey": "xxx"
|
||||||
|
},
|
||||||
|
"WestCN": {
|
||||||
|
"Username": "xxx",
|
||||||
|
"Password": "xxx"
|
||||||
|
},
|
||||||
|
"RainYun": {
|
||||||
|
"ApiKey": "xxx"
|
||||||
|
},
|
||||||
|
"Cloudflare": {},
|
||||||
|
"Dode": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,7 +24,7 @@ func main() {
|
|||||||
|
|
||||||
err := os.MkdirAll(conf.SavePath, os.ModePerm)
|
err := os.MkdirAll(conf.SavePath, os.ModePerm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("创建文件夹 %s%s%s 时发生错误: %s%s%s", logger.Cyan, conf.SavePath, logger.Reset, logger.Red, err.Error(), logger.Reset)
|
logger.Error.Printf("Error creating folder %s%s%s: %s%s%s", logger.Cyan, conf.SavePath, logger.Reset, logger.Red, err.Error(), logger.Reset)
|
||||||
}
|
}
|
||||||
|
|
||||||
urlStr := conf.Url()
|
urlStr := conf.Url()
|
||||||
@@ -32,10 +32,10 @@ func main() {
|
|||||||
certUpsert := moudle.CheckNodes(certNodes, conf.Days)
|
certUpsert := moudle.CheckNodes(certNodes, conf.Days)
|
||||||
p, err := moudle.ChooseDNSProvider(conf.DNSProviderConfig)
|
p, err := moudle.ChooseDNSProvider(conf.DNSProviderConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Println(fmt.Sprintf("验证 DNS 服务提供商时发生错误: %s%s%s", logger.Red, err, logger.Reset))
|
logger.Error.Println(fmt.Sprintf("Error validating DNS provider: %s%s%s", logger.Red, err, logger.Reset))
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
log.Printf("本次需要更新证书数量有 %d 个", len(certUpsert))
|
log.Printf("Number of certificates to update this run: %d", len(certUpsert))
|
||||||
var failedApply [][]string
|
var failedApply [][]string
|
||||||
var successApply [][]string
|
var successApply [][]string
|
||||||
for _, cert := range certUpsert {
|
for _, cert := range certUpsert {
|
||||||
@@ -48,20 +48,20 @@ func main() {
|
|||||||
body := bytes.NewReader(upsertReq.Marshal())
|
body := bytes.NewReader(upsertReq.Marshal())
|
||||||
result := utils.Upsert(urlStr, conf.ApiToken.String(), body)
|
result := utils.Upsert(urlStr, conf.ApiToken.String(), body)
|
||||||
if result.Msg != "" {
|
if result.Msg != "" {
|
||||||
logger.Error.Printf("域名 %s%s%s 证书更新失败: %s%s%s", logger.Cyan, cert.Domains, logger.Reset, logger.Red, result.Msg, logger.Reset)
|
logger.Error.Printf("Certificate update failed for domain %s%s%s: %s%s%s", logger.Cyan, cert.Domains, logger.Reset, logger.Red, result.Msg, logger.Reset)
|
||||||
failedApply = append(failedApply, cert.Domains)
|
failedApply = append(failedApply, cert.Domains)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
successApply = append(successApply, cert.Domains)
|
successApply = append(successApply, cert.Domains)
|
||||||
logger.Success.Printf("域名 %s%s%s 证书更新成功!", logger.Cyan, cert.Domains, logger.Reset)
|
logger.Success.Printf("Certificate update succeeded for domain %s%s%s", logger.Cyan, cert.Domains, logger.Reset)
|
||||||
}
|
}
|
||||||
if len(successApply) != 0 {
|
if len(successApply) != 0 {
|
||||||
log.Printf("本次成功更新的域名证书如下: %s%s%s", logger.Cyan, successApply, logger.Reset)
|
log.Printf("Certificates successfully updated this run: %s%s%s", logger.Cyan, successApply, logger.Reset)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(failedApply) != 0 {
|
if len(failedApply) != 0 {
|
||||||
log.Printf("未成功更新的域名证书如下: %s%s%s", logger.Cyan, failedApply, logger.Reset)
|
log.Printf("Certificates that failed to update: %s%s%s", logger.Cyan, failedApply, logger.Reset)
|
||||||
}
|
}
|
||||||
log.Printf("本次任务执行完成")
|
log.Printf("Task completed")
|
||||||
_ = os.RemoveAll(conf.SavePath)
|
_ = os.RemoveAll(conf.SavePath)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,8 @@
|
|||||||
"AliCloud": {
|
"AliCloud": {
|
||||||
"AccessKeyId": "xxx",
|
"AccessKeyId": "xxx",
|
||||||
"AccessKeySecret": "xxx",
|
"AccessKeySecret": "xxx",
|
||||||
"RAMRole": "xxx(可选)",
|
"RAMRole": "xxx (optional)",
|
||||||
"STSToken": "xxx(可选)"
|
"STSToken": "xxx (optional)"
|
||||||
},
|
},
|
||||||
"HuaweiCloud": {
|
"HuaweiCloud": {
|
||||||
"AccessKeyId": "xxx",
|
"AccessKeyId": "xxx",
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ go run ./cmd/safelineApi -- -t "<SafeLineApiToken>" -D "Cloudflare" -e "you@exam
|
|||||||
Notes on flags: the project reads flags and `config.json`. If a flag is present it will be used for that run.
|
Notes on flags: the project reads flags and `config.json`. If a flag is present it will be used for that run.
|
||||||
|
|
||||||
**Troubleshooting**
|
**Troubleshooting**
|
||||||
- Warning about missing values: If you see warnings like `未设置 DNS服务提供商`, set `ApplyCert.DNSProviderConfig.DNSProvider` or pass `-D` on the command line.
|
- Warning about missing values: If you see warnings like `No DNS provider set`, set `ApplyCert.DNSProviderConfig.DNSProvider` or pass `-D` on the command line.
|
||||||
- Dependency/download issues: If `go build` stalls on module downloads, try setting a proxy:
|
- Dependency/download issues: If `go build` stalls on module downloads, try setting a proxy:
|
||||||
```powershell
|
```powershell
|
||||||
go env -w GOPROXY=https://goproxy.cn,direct
|
go env -w GOPROXY=https://goproxy.cn,direct
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ type Config struct {
|
|||||||
func (config *Config) Read(path string) {
|
func (config *Config) Read(path string) {
|
||||||
data, err := os.ReadFile(path)
|
data, err := os.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("配置文件读取失败: %s%s%s", logger.Red, err, logger.Reset)
|
logger.Error.Printf("Failed to read configuration file: %s%s%s", logger.Red, err, logger.Reset)
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(data, &config)
|
err = json.Unmarshal(data, &config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("配置文件读取失败: %s%s%s", logger.Red, err, logger.Reset)
|
logger.Error.Printf("Failed to read configuration file: %s%s%s", logger.Red, err, logger.Reset)
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
config.Verify()
|
config.Verify()
|
||||||
|
|||||||
@@ -31,15 +31,15 @@ func (applyCert *ApplyCert) Verify() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if applyCert.DNSProvider == "" {
|
if applyCert.DNSProvider == "" {
|
||||||
logger.Warning.Printf("未设置 %sDNS服务提供商%s: 请检查配置文件中的 %sApplyCert.DNSProviderConfig.DNSProvider%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
logger.Warning.Printf("No %sDNS provider%s set: please check the %sApplyCert.DNSProviderConfig.DNSProvider%s parameter", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
flag = true
|
flag = true
|
||||||
}
|
}
|
||||||
if applyCert.Email == "" {
|
if applyCert.Email == "" {
|
||||||
logger.Warning.Printf("未设置 %s证书申请邮箱%s: 请检查配置文件中的 %sApplyCert.Email%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
logger.Warning.Printf("No %scertificate request email%s set: please check the %sApplyCert.Email%s parameter", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
flag = true
|
flag = true
|
||||||
}
|
}
|
||||||
if !flag {
|
if !flag {
|
||||||
log.Printf("%sApplyCert%s 相关配置检验完成!", logger.Cyan, logger.Reset)
|
log.Printf("%sApplyCert%s configuration check completed!", logger.Cyan, logger.Reset)
|
||||||
}
|
}
|
||||||
return flag
|
return flag
|
||||||
}
|
}
|
||||||
@@ -55,15 +55,15 @@ func (applyCert *ApplyCert) VerifyCommand() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if applyCert.DNSProvider == "" {
|
if applyCert.DNSProvider == "" {
|
||||||
logger.Warning.Printf("未设置 %sDNS服务提供商%s: 请检查命令中的 %s-D%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
logger.Warning.Printf("No %sDNS provider%s set: please check the %s-D%s command-line argument", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
flag = true
|
flag = true
|
||||||
}
|
}
|
||||||
if applyCert.Email == "" {
|
if applyCert.Email == "" {
|
||||||
logger.Warning.Printf("未设置 %s证书申请邮箱%s: 请检查命令中的 %s-e%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
logger.Warning.Printf("No %scertificate request email%s set: please check the %s-e%s command-line argument", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
flag = true
|
flag = true
|
||||||
}
|
}
|
||||||
if !flag {
|
if !flag {
|
||||||
log.Printf("%sApplyCert%s 相关配置检验完成!", logger.Cyan, logger.Reset)
|
log.Printf("%sApplyCert%s configuration check completed!", logger.Cyan, logger.Reset)
|
||||||
}
|
}
|
||||||
return flag
|
return flag
|
||||||
|
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ func (config *Config) Default() {
|
|||||||
AliCloud: AliCloud{
|
AliCloud: AliCloud{
|
||||||
AccessKeyId: "xxx",
|
AccessKeyId: "xxx",
|
||||||
AccessKeySecret: "xxx",
|
AccessKeySecret: "xxx",
|
||||||
RAMRole: "xxx(可选)",
|
RAMRole: "xxx (optional)",
|
||||||
STSToken: "xxx(可选)",
|
STSToken: "xxx (optional)",
|
||||||
},
|
},
|
||||||
HuaweiCloud: HuaweiCloud{
|
HuaweiCloud: HuaweiCloud{
|
||||||
AccessKeyId: "xxx",
|
AccessKeyId: "xxx",
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ func (host Host) String() string {
|
|||||||
|
|
||||||
func (host Host) Verify() bool {
|
func (host Host) Verify() bool {
|
||||||
if host.HostName == "" {
|
if host.HostName == "" {
|
||||||
logger.Warning.Printf("未设置 %s主机名称%s: 请检查配置文件中的 %sSafeLine.Host.HostName%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
logger.Warning.Printf("No %shostname%s set: please check the %sSafeLine.Host.HostName%s parameter", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@@ -29,7 +29,7 @@ func (host Host) Verify() bool {
|
|||||||
|
|
||||||
func (host Host) VerifyCommand() bool {
|
func (host Host) VerifyCommand() bool {
|
||||||
if host.HostName == "" {
|
if host.HostName == "" {
|
||||||
logger.Warning.Printf("未设置 %s主机名称%s: 请检查命令中的 %s-h%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
logger.Warning.Printf("No %shostname%s set: please check the %s-h%s command-line argument", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -9,18 +9,18 @@ func (config *Config) Verify() {
|
|||||||
a := config.SafeLine.Verify()
|
a := config.SafeLine.Verify()
|
||||||
b := config.ApplyCert.Verify()
|
b := config.ApplyCert.Verify()
|
||||||
if a || b {
|
if a || b {
|
||||||
log.Printf("配置检查完毕,请检查相关配置后重新运行!")
|
log.Printf("Configuration check complete; please review settings and rerun!")
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
log.Printf("配置检查完毕,即将开始更新证书!")
|
log.Printf("Configuration check complete; starting certificate updates!")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *Config) VerifyCommand() {
|
func (config *Config) VerifyCommand() {
|
||||||
a := config.SafeLine.VerifyCommand()
|
a := config.SafeLine.VerifyCommand()
|
||||||
b := config.ApplyCert.VerifyCommand()
|
b := config.ApplyCert.VerifyCommand()
|
||||||
if a || b {
|
if a || b {
|
||||||
log.Printf("配置检查完毕,请检查相关配置后重新运行!")
|
log.Printf("Configuration check complete; please review settings and rerun!")
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
log.Printf("配置检查完毕,即将开始更新证书!")
|
log.Printf("Configuration check complete; starting certificate updates!")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ func (apiToken ApiToken) String() string {
|
|||||||
|
|
||||||
func (apiToken ApiToken) Verify() bool {
|
func (apiToken ApiToken) Verify() bool {
|
||||||
if apiToken.String() == "" {
|
if apiToken.String() == "" {
|
||||||
logger.Warning.Printf("未设置 %sSafeLine API Token%s : 请检查配置文件中的 %sSafeLine.ApiToken%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
logger.Warning.Printf("No %sSafeLine API token%s set: please check the %sSafeLine.ApiToken%s parameter", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@@ -36,32 +36,32 @@ func (safeLine SafeLine) Verify() bool {
|
|||||||
|
|
||||||
NoLoginAuthTokenResp, NoLoginStatusCode, NoLoginErr := utils.AuthSafeLine(*safeLine.Host.Url())
|
NoLoginAuthTokenResp, NoLoginStatusCode, NoLoginErr := utils.AuthSafeLine(*safeLine.Host.Url())
|
||||||
if NoLoginErr != nil {
|
if NoLoginErr != nil {
|
||||||
logger.Error.Printf("请求服务端时发生错误: %s%s%s", logger.Red, NoLoginErr.Error(), logger.Reset)
|
logger.Error.Printf("Error requesting server: %s%s%s", logger.Red, NoLoginErr.Error(), logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
LoginAuthTokenResp, LoginStatusCode, LoginErr := utils.VerifyAuthToken(*safeLine.Host.Url(), safeLine.ApiToken.String())
|
LoginAuthTokenResp, LoginStatusCode, LoginErr := utils.VerifyAuthToken(*safeLine.Host.Url(), safeLine.ApiToken.String())
|
||||||
if LoginErr != nil {
|
if LoginErr != nil {
|
||||||
logger.Error.Printf("验证 %sSafeLine API Token%s 时发生错误: %s%s%s", logger.Cyan, logger.Reset, logger.Red, LoginErr.Error(), logger.Reset)
|
logger.Error.Printf("Error validating %sSafeLine API token%s: %s%s%s", logger.Cyan, logger.Reset, logger.Red, LoginErr.Error(), logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if !(NoLoginAuthTokenResp.Err == "login-required" && NoLoginStatusCode == 401) {
|
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)
|
logger.Warning.Printf("Server endpoint %s/open/auth/token%s returned error: please check the %sSafeLine.Host%s configuration", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if LoginAuthTokenResp.Err == "login-required" && LoginStatusCode == 401 {
|
if LoginAuthTokenResp.Err == "login-required" && LoginStatusCode == 401 {
|
||||||
logger.Warning.Printf("%sSafeLine API Token%s 有误: 请检查后重试", logger.Cyan, logger.Reset)
|
logger.Warning.Printf("%sSafeLine API token%s is invalid: please check and retry", logger.Cyan, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Success.Printf("%sSafeLine%s 相关配置检验完成!", logger.Cyan, logger.Reset)
|
logger.Success.Printf("%sSafeLine%s configuration check completed!", logger.Cyan, logger.Reset)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (apiToken ApiToken) VerifyCommand() bool {
|
func (apiToken ApiToken) VerifyCommand() bool {
|
||||||
if apiToken.String() == "" {
|
if apiToken.String() == "" {
|
||||||
logger.Warning.Printf("未设置 %sSafeLine API Token%s : 请检查命令中的 %s-t%s 参数", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
logger.Warning.Printf("No %sSafeLine API token%s set: please check the %s-t%s command-line argument", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@@ -76,25 +76,25 @@ func (safeLine SafeLine) VerifyCommand() bool {
|
|||||||
|
|
||||||
NoLoginAuthTokenResp, NoLoginStatusCode, NoLoginErr := utils.AuthSafeLine(*safeLine.Host.Url())
|
NoLoginAuthTokenResp, NoLoginStatusCode, NoLoginErr := utils.AuthSafeLine(*safeLine.Host.Url())
|
||||||
if NoLoginErr != nil {
|
if NoLoginErr != nil {
|
||||||
logger.Error.Printf("请求服务端时发生错误: %s%s%s", logger.Red, NoLoginErr.Error(), logger.Reset)
|
logger.Error.Printf("Error requesting server: %s%s%s", logger.Red, NoLoginErr.Error(), logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
LoginAuthTokenResp, LoginStatusCode, LoginErr := utils.VerifyAuthToken(*safeLine.Host.Url(), safeLine.ApiToken.String())
|
LoginAuthTokenResp, LoginStatusCode, LoginErr := utils.VerifyAuthToken(*safeLine.Host.Url(), safeLine.ApiToken.String())
|
||||||
if LoginErr != nil {
|
if LoginErr != nil {
|
||||||
logger.Error.Printf("验证 %sSafeLine API Token%s 时发生错误: %s%s%s", logger.Cyan, logger.Reset, logger.Red, LoginErr.Error(), logger.Reset)
|
logger.Error.Printf("Error validating %sSafeLine API token%s: %s%s%s", logger.Cyan, logger.Reset, logger.Red, LoginErr.Error(), logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if !(NoLoginAuthTokenResp.Err == "login-required" && NoLoginStatusCode == 401) {
|
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)
|
logger.Warning.Printf("Server endpoint %s/open/auth/token%s returned error: please check the %s-h%s command-line argument", logger.Cyan, logger.Reset, logger.Yellow, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if LoginAuthTokenResp.Err == "login-required" && LoginStatusCode == 401 {
|
if LoginAuthTokenResp.Err == "login-required" && LoginStatusCode == 401 {
|
||||||
logger.Warning.Printf("%sSafeLine API Token%s 有误: 请检查后重试", logger.Cyan, logger.Reset)
|
logger.Warning.Printf("%sSafeLine API token%s is invalid: please check and retry", logger.Cyan, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Success.Printf("%sSafeLine%s 相关配置检验完成!", logger.Cyan, logger.Reset)
|
logger.Success.Printf("%sSafeLine%s configuration check completed!", logger.Cyan, logger.Reset)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,5 +22,5 @@ func ChooseDNSProvider(config config.DNSProviderConfig) (challenge.Provider, err
|
|||||||
} else if config.DNSProvider == "Dode" {
|
} else if config.DNSProvider == "Dode" {
|
||||||
return config.Dode.Provider()
|
return config.Dode.Provider()
|
||||||
}
|
}
|
||||||
return nil, errors.New("未正确设置 DNS 服务提供商")
|
return nil, errors.New("DNS provider not configured correctly")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func (u *MyUser) GetPrivateKey() crypto.PrivateKey {
|
|||||||
func ApplyCert(domains []string, email, dir string, provider challenge.Provider) bool {
|
func ApplyCert(domains []string, email, dir string, provider challenge.Provider) bool {
|
||||||
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("申请 %s%s%s 证书时发生错误: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
logger.Error.Printf("Error requesting certificate for %s%s%s: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
myUser := MyUser{
|
myUser := MyUser{
|
||||||
@@ -45,18 +45,18 @@ func ApplyCert(domains []string, email, dir string, provider challenge.Provider)
|
|||||||
config.Certificate.KeyType = certcrypto.RSA2048
|
config.Certificate.KeyType = certcrypto.RSA2048
|
||||||
client, err := lego.NewClient(config)
|
client, err := lego.NewClient(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("申请 %s%s%s 证书时发生错误: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
logger.Error.Printf("Error requesting certificate for %s%s%s: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
err = client.Challenge.SetDNS01Provider(provider)
|
err = client.Challenge.SetDNS01Provider(provider)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("申请 %s%s%s 证书时发生错误: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
logger.Error.Printf("Error requesting certificate for %s%s%s: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
|
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("申请 %s%s%s 证书时发生错误: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
logger.Error.Printf("Error requesting certificate for %s%s%s: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
myUser.Registration = reg
|
myUser.Registration = reg
|
||||||
@@ -66,17 +66,17 @@ func ApplyCert(domains []string, email, dir string, provider challenge.Provider)
|
|||||||
}
|
}
|
||||||
certificates, err := client.Certificate.Obtain(request)
|
certificates, err := client.Certificate.Obtain(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("申请 %s%s%s 证书时发生错误: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
logger.Error.Printf("Error requesting certificate for %s%s%s: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
err = os.WriteFile(filepath.Join(dir, domains[0]+".crt"), certificates.Certificate, os.ModePerm)
|
err = os.WriteFile(filepath.Join(dir, domains[0]+".crt"), certificates.Certificate, os.ModePerm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("保存 %s%s%s 证书时发生错误: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
logger.Error.Printf("Error saving certificate for %s%s%s: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
err = os.WriteFile(filepath.Join(dir, domains[0]+".key"), certificates.PrivateKey, os.ModePerm)
|
err = os.WriteFile(filepath.Join(dir, domains[0]+".key"), certificates.PrivateKey, os.ModePerm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("保存 %s%s%s 证书密钥时发生错误: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
logger.Error.Printf("Error saving certificate key for %s%s%s: %s%s%s", logger.Cyan, domains, logger.Reset, logger.Red, err, logger.Reset)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ func GetList(url *safeLineApi.URL, token string) safeLineApi.Nodes {
|
|||||||
}
|
}
|
||||||
resp, err := Request(LIST, url.SSLCertUrl(), nil, header)
|
resp, err := Request(LIST, url.SSLCertUrl(), nil, header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("请求接口 %s/api/open/cert%s 时发生错误: %s%s%s", logger.Cyan, logger.Reset, logger.Red, err, logger.Reset)
|
logger.Error.Printf("Error requesting endpoint %s/api/open/cert%s: %s%s%s", logger.Cyan, logger.Reset, logger.Red, err, logger.Reset)
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ func Upsert(url *safeLineApi.URL, token string, body io.Reader) safeLineApi.Upse
|
|||||||
}
|
}
|
||||||
resp, err := Request(UPSERT, url.SSLCertUrl(), body, header)
|
resp, err := Request(UPSERT, url.SSLCertUrl(), body, header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error.Printf("更新证书时发生错误: %s%s%s", logger.Red, err, logger.Reset)
|
logger.Error.Printf("Error updating certificate: %s%s%s", logger.Red, err, logger.Reset)
|
||||||
return safeLineApi.UpsertResp{}
|
return safeLineApi.UpsertResp{}
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|||||||
Reference in New Issue
Block a user