allinssl/backend/internal/workflow/executor.go

244 lines
7.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package workflow
import (
"ALLinSSL/backend/internal/cert"
certApply "ALLinSSL/backend/internal/cert/apply"
certDeploy "ALLinSSL/backend/internal/cert/deploy"
"ALLinSSL/backend/internal/report"
"ALLinSSL/backend/public"
"errors"
"fmt"
"strconv"
)
// var executors map[string]func(map[string]any) (any, error)
//
// func RegistExector(executorName string, executor func(map[string]any) (any, error)) {
// executors[executorName] = executor
// }
func Executors(exec string, params map[string]any) (any, error) {
switch exec {
case "apply":
return apply(params)
case "deploy":
return deploy(params)
case "upload":
return upload(params)
case "notify":
return notify(params)
default:
return nil, nil
}
}
func apply(params map[string]any) (any, error) {
logger := params["logger"].(*public.Logger)
logger.Info("=============申请证书=============")
certificate, err := certApply.Apply(params, logger)
if err != nil {
logger.Error(err.Error())
logger.Info("=============申请失败=============")
return nil, err
}
logger.Info("=============申请成功=============")
return certificate, nil
}
func deploy(params map[string]any) (any, error) {
logger := params["logger"].(*public.Logger)
logger.Info("=============部署证书=============")
certificate := params["certificate"]
if certificate == nil {
logger.Error("证书不存在")
logger.Info("=============部署失败=============")
return nil, errors.New("证书不存在")
}
certificateMap, ok := params["certificate"].(map[string]any)
if !ok {
logger.Error("证书不存在")
logger.Info("=============部署失败=============")
return nil, errors.New("证书不存在")
}
certStr, ok := certificateMap["cert"].(string)
if !ok {
logger.Error("证书格式错误")
logger.Info("=============部署失败=============")
return nil, errors.New("证书格式错误")
}
nowSha256, err := public.GetSHA256(certStr)
if err != nil {
logger.Error("解析证书sha256失败" + err.Error())
logger.Info("=============部署失败=============")
return nil, err
}
s, err := public.NewSqlite("data/data.db", "")
if err != nil {
logger.Error("新建数据库连接失败" + err.Error())
logger.Info("=============部署失败=============")
return nil, err
}
defer s.Close()
s.TableName = "workflow_history"
historyData, err := s.Where("id=?", []any{params["_runId"]}).Find()
if err != nil {
logger.Error("查询表workflow_history失败" + err.Error())
logger.Info("=============部署失败=============")
return nil, err
}
workflowId := historyData["workflow_id"]
s.TableName = "workflow_deploy"
deployData, err := s.Where("workflow_id=? and id=?", []any{workflowId, params["NodeId"]}).Select()
if err != nil {
logger.Error("查询表workflow_deploy失败" + err.Error())
logger.Info("=============部署失败=============")
return nil, err
}
if params["skip"] != nil {
var skip int
switch v := params["skip"].(type) {
case int:
skip = v
case float64:
skip = int(v)
case string:
skip, _ = strconv.Atoi(v)
}
if skip == 1 {
if len(deployData) > 0 {
beSha256, ok := deployData[0]["cert_hash"].(string)
if !ok {
logger.Error("证书hash格式错误")
logger.Info("=============部署失败=============")
return nil, errors.New("证书hash格式错误")
}
if beSha256 == nowSha256 && deployData[0]["status"].(string) == "success" {
logger.Info("与上次部署的证书sha256相同且上次部署成功跳过重复部署")
logger.Info("=============部署成功=============")
return map[string]any{
"skip": true,
}, nil
}
}
}
}
err = certDeploy.Deploy(params, logger)
var status string
if err != nil {
status = "fail"
logger.Error(err.Error())
logger.Info("=============部署失败=============")
} else {
status = "success"
logger.Info("=============部署成功=============")
}
if len(deployData) > 0 {
s.Where("workflow_id=? and id=?", []any{workflowId, params["NodeId"]}).Update(map[string]interface{}{"cert_hash": nowSha256, "status": status})
} else {
s.Insert(map[string]interface{}{"cert_hash": nowSha256, "workflow_id": workflowId, "id": params["NodeId"], "status": status})
}
return nil, err
}
func upload(params map[string]any) (any, error) {
logger := params["logger"].(*public.Logger)
logger.Info("=============上传证书=============")
// 判断证书id走本地还是走旧上传应在之后的迭代中移除旧代码
if params["cert_id"] == nil {
keyStr, ok := params["key"].(string)
if !ok {
logger.Error("上传的密钥有误")
logger.Info("=============上传失败=============")
return nil, errors.New("上传的密钥有误")
}
certStr, ok := params["cert"].(string)
if !ok {
logger.Error("上传的证书有误")
logger.Info("=============上传失败=============")
return nil, errors.New("上传的证书有误")
}
_, err := cert.UploadCert(keyStr, certStr)
if err != nil {
logger.Error(err.Error())
logger.Info("=============上传失败=============")
return nil, err
}
logger.Info("=============上传成功=============")
return params, nil
} else {
certId := ""
switch v := params["cert_id"].(type) {
case float64:
certId = strconv.Itoa(int(v))
case string:
certId = v
default:
logger.Info("=============上传证书获取失败=============")
return nil, errors.New("证书 ID 类型错误")
}
result := map[string]any{}
certObj, err := cert.GetCert(certId)
if err != nil {
logger.Error(err.Error())
logger.Info("=============上传证书获取失败=============")
return nil, err
}
if certObj == nil {
logger.Error("证书不存在")
logger.Info("=============上传证书获取失败=============")
return nil, errors.New("证书不存在")
}
logger.Debug(fmt.Sprintf("证书 ID: %s", certId))
result["cert"] = certObj["cert"]
result["key"] = certObj["key"]
return result, nil
}
}
func notify(params map[string]any) (any, error) {
// fmt.Println("通知:", params)
logger := params["logger"].(*public.Logger)
logger.Info("=============发送通知=============")
if fromNodeData, ok := params["fromNodeData"].(map[string]any); ok && fromNodeData != nil {
if v, ok := fromNodeData["skip"].(bool); ok && v {
// 如果 skip 是 true则跳过通知
var skip bool
switch v := fromNodeData["skip"].(type) {
case int:
skip = v == 1
case float64:
skip = v == 1
case string:
skip = v == "1" || v == "true"
case bool:
skip = v
default:
skip = false
}
if skip {
logger.Debug("上个节点已跳过操作,跳过通知")
logger.Info("=============发送执行完成=============")
return map[string]any{
"skip": true,
}, nil
}
}
}
logger.Debug(fmt.Sprintf("发送通知:%s", params["subject"].(string)))
err := report.Notify(params)
if err != nil {
logger.Error(err.Error())
logger.Info("=============发送失败=============")
return nil, err
}
logger.Info("=============发送成功=============")
return fmt.Sprintf("通知到: %s", params["message"]), nil
}