feat: 添加数据库资产、命令拦截器、授权资产等功能,修复GitHub Actions工作流

This commit is contained in:
2026-04-18 07:44:18 +08:00
parent 6e2e2f9387
commit 3c217ab039
64 changed files with 3308 additions and 760 deletions
+62 -7
View File
@@ -30,6 +30,14 @@ type MetadataShell struct {
Shell string
}
type ExecScriptResult struct {
Name string `json:"name"`
Success bool `json:"success"`
UsedTime int64 `json:"usedTime"`
UsedTimeStr string `json:"usedTimeStr"`
Result string `json:"result"`
}
func (r ShellJob) Run() {
if r.ID == "" {
return
@@ -49,6 +57,14 @@ func (r ShellJob) Run() {
func (r ShellJob) executeShellByAssets(assets []model.Asset) {
if len(assets) == 0 {
jobLog := model.JobLog{
ID: utils.UUID(),
JobId: r.ID,
Timestamp: common.NowJsonTime(),
Message: "没有找到符合条件的SSH资产",
Results: "[]",
}
_ = repository.JobLogRepository.Create(context.TODO(), &jobLog)
return
}
@@ -59,12 +75,23 @@ func (r ShellJob) executeShellByAssets(assets []model.Asset) {
return
}
msgChan := make(chan string)
type execResult struct {
msg string
result ExecScriptResult
}
resultChan := make(chan execResult)
for i := range assets {
asset, err := AssetService.FindByIdAndDecrypt(context.TODO(), assets[i].ID)
if err != nil {
msgChan <- fmt.Sprintf("资产「%v」Shell执行失败,查询数据异常「%v」", assets[i].Name, err.Error())
return
resultChan <- execResult{
msg: fmt.Sprintf("资产「%v」Shell执行失败,查询数据异常「%v」", assets[i].Name, err.Error()),
result: ExecScriptResult{
Name: assets[i].Name,
Success: false,
Result: err.Error(),
},
}
continue
}
var (
@@ -79,8 +106,15 @@ func (r ShellJob) executeShellByAssets(assets []model.Asset) {
if asset.AccountType == "credential" {
credential, err := CredentialService.FindByIdAndDecrypt(context.TODO(), asset.CredentialId)
if err != nil {
msgChan <- fmt.Sprintf("资产「%v」Shell执行失败,查询授权凭证数据异常「%v」", assets[i].Name, err.Error())
return
resultChan <- execResult{
msg: fmt.Sprintf("资产「%v」Shell执行失败,查询授权凭证数据异常「%v」", assets[i].Name, err.Error()),
result: ExecScriptResult{
Name: asset.Name,
Success: false,
Result: err.Error(),
},
}
continue
}
if credential.Type == nt.Custom {
@@ -98,33 +132,54 @@ func (r ShellJob) executeShellByAssets(assets []model.Asset) {
result, err := execute(metadataShell.Shell, asset.AccessGatewayId, ip, port, username, password, privateKey, passphrase)
elapsed := time.Since(t1)
var msg string
var execRes ExecScriptResult
if err != nil {
if errors.Is(gorm.ErrRecordNotFound, err) {
msg = fmt.Sprintf("资产「%v」Shell执行失败,请检查资产所关联接入网关是否存在,耗时「%v」", asset.Name, elapsed)
} else {
msg = fmt.Sprintf("资产「%v」Shell执行失败,错误内容为:「%v」,耗时「%v」", asset.Name, err.Error(), elapsed)
}
execRes = ExecScriptResult{
Name: asset.Name,
Success: false,
UsedTime: elapsed.Milliseconds(),
UsedTimeStr: elapsed.String(),
Result: err.Error(),
}
log.Debug(msg)
} else {
msg = fmt.Sprintf("资产「%v」Shell执行成功,返回值「%v」,耗时「%v」", asset.Name, result, elapsed)
execRes = ExecScriptResult{
Name: asset.Name,
Success: true,
UsedTime: elapsed.Milliseconds(),
UsedTimeStr: elapsed.String(),
Result: result,
}
log.Debug(msg)
}
msgChan <- msg
resultChan <- execResult{msg: msg, result: execRes}
}()
}
var message = ""
var results []ExecScriptResult
for i := 0; i < len(assets); i++ {
message += <-msgChan + "\n"
res := <-resultChan
message += res.msg + "\n"
results = append(results, res.result)
}
resultsJSON, _ := json.Marshal(results)
_ = repository.JobRepository.UpdateLastUpdatedById(context.TODO(), r.ID)
jobLog := model.JobLog{
ID: utils.UUID(),
JobId: r.ID,
Timestamp: common.NowJsonTime(),
Message: message,
Results: string(resultsJSON),
}
_ = repository.JobLogRepository.Create(context.TODO(), &jobLog)