allinssl/plugins/aliyun/main.go

124 lines
2.6 KiB
Go

package main
import (
"crypto/x509"
"encoding/json"
"encoding/pem"
"fmt"
"io"
"os"
)
type ActionInfo struct {
Name string `json:"name"`
Description string `json:"description"`
Params map[string]any `json:"params,omitempty"` // 可选参数
}
type Request struct {
Action string `json:"action"`
Params map[string]interface{} `json:"params"`
}
type Response struct {
Status string `json:"status"`
Message string `json:"message"`
Result map[string]interface{} `json:"result"`
}
var pluginMeta = map[string]interface{}{
"name": "aliyun",
"description": "部署到阿里云",
"version": "1.0.0",
"author": "主包",
"config": map[string]interface{}{
"access_key": "阿里云 AccessKey",
"secret_key": "阿里云 SecretKey",
},
"actions": []ActionInfo{
{
Name: "deployToESA",
Description: "部署到阿里云esa",
Params: map[string]any{
"site_id": "站点 ID",
"del_repeat_domain_cert": "是否删除重复的域名证书,默认 false",
},
},
{
Name: "uploadToCAS",
Description: "上传到阿里云cas",
Params: map[string]any{
"name": "证书名称",
},
},
},
}
// **解析 PEM 格式的证书**
func ParseCertificate(certPEM []byte) (*x509.Certificate, error) {
block, _ := pem.Decode(certPEM)
if block == nil {
return nil, fmt.Errorf("无法解析证书 PEM")
}
return x509.ParseCertificate(block.Bytes)
}
func outputJSON(resp *Response) {
_ = json.NewEncoder(os.Stdout).Encode(resp)
}
func outputError(msg string, err error) {
outputJSON(&Response{
Status: "error",
Message: fmt.Sprintf("%s: %v", msg, err),
})
}
func main() {
var req Request
input, err := io.ReadAll(os.Stdin)
if err != nil {
outputError("读取输入失败", err)
return
}
if err := json.Unmarshal(input, &req); err != nil {
outputError("解析请求失败", err)
return
}
switch req.Action {
case "get_metadata":
outputJSON(&Response{
Status: "success",
Message: "插件信息",
Result: pluginMeta,
})
case "list_actions":
outputJSON(&Response{
Status: "success",
Message: "支持的动作",
Result: map[string]interface{}{"actions": pluginMeta["actions"]},
})
case "deployToESA":
rep, err := deployToESA(req.Params)
if err != nil {
outputError("ESA 部署失败", err)
return
}
outputJSON(rep)
case "uploadToCAS":
rep, err := uploadToCAS(req.Params)
if err != nil {
outputError("CAS 上传失败", err)
return
}
outputJSON(rep)
default:
outputJSON(&Response{
Status: "error",
Message: "未知 action: " + req.Action,
})
}
}