feat: 完善堡垒机与 Agent 智能运维能力
- 支持 Windows Agent 构建、安装脚本和统一上报协议 - 增强 RDP 剪贴板、虚拟盘和文件传输能力 - 新增 AIOps 上下文工具、告警 RCA trace 落库和回放接口 - 重构 docs 模块文档并补充终端、堡垒机、监控、AI Agent 设计
This commit is contained in:
1 parent
a9513c2056
commit
e0d652d211
169 files changed
+12192
-9116
No files matched your search
@@ -21,7 +21,49 @@ func RunCronJobByID(db *gorm.DB, id uint) (*model.TaskExecution, error) {
|
||||
return runCronJob(db, job)
|
||||
}
|
||||
|
||||
// QueueCronJobByID 提交一次手动执行,立即返回执行记录,后台继续执行 // Logan.Li
|
||||
func QueueCronJobByID(db *gorm.DB, id uint) (*model.TaskExecution, error) {
|
||||
var job model.CronJob
|
||||
if err := db.First(&job, id).Error; err != nil {
|
||||
return nil, fmt.Errorf("定时任务不存在")
|
||||
}
|
||||
execution, startedAt, err := createCronExecution(db, job)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
go finishCronExecution(db, job, execution.ID, startedAt)
|
||||
return execution, nil
|
||||
}
|
||||
|
||||
func runCronJob(db *gorm.DB, job model.CronJob) (*model.TaskExecution, error) {
|
||||
execution, startedAt, err := createCronExecution(db, job)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
finishCronExecution(db, job, execution.ID, startedAt)
|
||||
_ = db.First(execution, execution.ID).Error
|
||||
return execution, nil
|
||||
}
|
||||
|
||||
func createCronExecution(db *gorm.DB, job model.CronJob) (*model.TaskExecution, time.Time, error) {
|
||||
startedAt := time.Now()
|
||||
execution := &model.TaskExecution{
|
||||
TaskType: "cron",
|
||||
TaskID: job.ID,
|
||||
TaskName: job.Name,
|
||||
Status: "running",
|
||||
TargetType: job.TargetType,
|
||||
Targets: job.Targets,
|
||||
StartedAt: &startedAt,
|
||||
}
|
||||
if err := db.Create(execution).Error; err != nil {
|
||||
return nil, startedAt, fmt.Errorf("创建执行记录失败")
|
||||
}
|
||||
return execution, startedAt, nil
|
||||
}
|
||||
|
||||
// finishCronExecution 执行定时任务主体并写回执行结果 // Logan.Li
|
||||
func finishCronExecution(db *gorm.DB, job model.CronJob, executionID uint, startedAt time.Time) {
|
||||
content := job.Content
|
||||
scriptType := job.Type
|
||||
if scriptType == "command" {
|
||||
@@ -36,20 +78,6 @@ func runCronJob(db *gorm.DB, job model.CronJob) (*model.TaskExecution, error) {
|
||||
}
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
execution := model.TaskExecution{
|
||||
TaskType: "cron",
|
||||
TaskID: job.ID,
|
||||
TaskName: job.Name,
|
||||
Status: "running",
|
||||
TargetType: job.TargetType,
|
||||
Targets: job.Targets,
|
||||
StartedAt: &now,
|
||||
}
|
||||
if err := db.Create(&execution).Error; err != nil {
|
||||
return nil, fmt.Errorf("创建执行记录失败")
|
||||
}
|
||||
|
||||
var output string
|
||||
var exitCode int
|
||||
var duration int
|
||||
@@ -57,7 +85,7 @@ func runCronJob(db *gorm.DB, job model.CronJob) (*model.TaskExecution, error) {
|
||||
|
||||
if job.TargetType != "" && job.TargetType != "local" && job.Targets != "" {
|
||||
remoteResults, remoteErr := ExecuteCronOnTargets(db, job, scriptType, content, job.Timeout)
|
||||
duration = int(time.Since(now).Milliseconds())
|
||||
duration = int(time.Since(startedAt).Milliseconds())
|
||||
if remoteErr != nil {
|
||||
output = fmt.Sprintf("远程执行调度失败: %v", remoteErr)
|
||||
exitCode = -1
|
||||
@@ -77,7 +105,7 @@ func runCronJob(db *gorm.DB, job model.CronJob) (*model.TaskExecution, error) {
|
||||
if ok, reason := scriptrunner.CanRun(rt, scriptType); !ok {
|
||||
output = reason + "\n"
|
||||
exitCode = -1
|
||||
duration = int(time.Since(now).Milliseconds())
|
||||
duration = int(time.Since(startedAt).Milliseconds())
|
||||
status = "failed"
|
||||
} else {
|
||||
output, exitCode, duration = runLocal(scriptType, content, job.Timeout)
|
||||
@@ -88,7 +116,7 @@ func runCronJob(db *gorm.DB, job model.CronJob) (*model.TaskExecution, error) {
|
||||
}
|
||||
|
||||
finishedAt := time.Now()
|
||||
db.Model(&execution).Updates(map[string]interface{}{
|
||||
db.Model(&model.TaskExecution{}).Where("id = ?", executionID).Updates(map[string]interface{}{
|
||||
"status": status,
|
||||
"output": output,
|
||||
"duration": duration,
|
||||
@@ -96,7 +124,7 @@ func runCronJob(db *gorm.DB, job model.CronJob) (*model.TaskExecution, error) {
|
||||
})
|
||||
|
||||
statsUpdates := map[string]interface{}{
|
||||
"last_run_at": now,
|
||||
"last_run_at": startedAt,
|
||||
"last_status": status,
|
||||
"run_count": job.RunCount + 1,
|
||||
}
|
||||
@@ -106,11 +134,5 @@ func runCronJob(db *gorm.DB, job model.CronJob) (*model.TaskExecution, error) {
|
||||
statsUpdates["fail_count"] = job.FailCount + 1
|
||||
}
|
||||
db.Model(&job).Updates(statsUpdates)
|
||||
|
||||
execution.Output = output
|
||||
execution.Status = status
|
||||
execution.Duration = duration
|
||||
execution.FinishedAt = &finishedAt
|
||||
_ = exitCode
|
||||
return &execution, nil
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user