feat: 添加数据库资产、命令拦截器、授权资产等功能,修复GitHub Actions工作流
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user