149 lines
3.8 KiB
Go
149 lines
3.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"next-terminal/server/constant"
|
|
"next-terminal/server/global/cron"
|
|
"next-terminal/server/log"
|
|
"next-terminal/server/model"
|
|
"next-terminal/server/repository"
|
|
"next-terminal/server/utils"
|
|
)
|
|
|
|
type jobService struct {
|
|
}
|
|
|
|
func (r jobService) ChangeStatusById(id, status string) error {
|
|
job, err := repository.JobRepository.FindById(context.TODO(), id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if status == constant.JobStatusRunning {
|
|
j, err := getJob(&job)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
entryID, err := cron.GlobalCron.AddJob(job.Cron, j)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
log.Debugf("开启计划任务「%v」,运行中计划任务数量「%v」", job.Name, len(cron.GlobalCron.Entries()))
|
|
|
|
jobForUpdate := model.Job{ID: id, Status: constant.JobStatusRunning, CronJobId: int(entryID)}
|
|
|
|
return repository.JobRepository.UpdateById(context.TODO(), &jobForUpdate)
|
|
} else {
|
|
cron.GlobalCron.Remove(cron.JobId(job.CronJobId))
|
|
log.Debugf("关闭计划任务「%v」,运行中计划任务数量「%v」", job.Name, len(cron.GlobalCron.Entries()))
|
|
jobForUpdate := model.Job{ID: id, Status: constant.JobStatusNotRunning}
|
|
return repository.JobRepository.UpdateById(context.TODO(), &jobForUpdate)
|
|
}
|
|
}
|
|
|
|
func getJob(j *model.Job) (job cron.Job, err error) {
|
|
switch j.Func {
|
|
case constant.FuncCheckAssetStatusJob:
|
|
job = CheckAssetStatusJob{
|
|
ID: j.ID,
|
|
Mode: j.Mode,
|
|
ResourceIds: j.ResourceIds,
|
|
Metadata: j.Metadata,
|
|
}
|
|
case constant.FuncShellJob:
|
|
job = ShellJob{ID: j.ID, Mode: j.Mode, ResourceIds: j.ResourceIds, Metadata: j.Metadata}
|
|
default:
|
|
return nil, errors.New("未识别的任务")
|
|
}
|
|
return job, err
|
|
}
|
|
|
|
func (r jobService) ExecJobById(id string) (err error) {
|
|
job, err := repository.JobRepository.FindById(context.TODO(), id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
j, err := getJob(&job)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
j.Run()
|
|
return nil
|
|
}
|
|
|
|
func (r jobService) InitJob() error {
|
|
jobs, _ := repository.JobRepository.FindAll(context.TODO())
|
|
if len(jobs) == 0 {
|
|
job := model.Job{
|
|
ID: utils.UUID(),
|
|
Name: "资产状态检测",
|
|
Func: constant.FuncCheckAssetStatusJob,
|
|
Cron: "0 0/10 * * * ?",
|
|
Mode: constant.JobModeAll,
|
|
Status: constant.JobStatusRunning,
|
|
Created: utils.NowJsonTime(),
|
|
Updated: utils.NowJsonTime(),
|
|
}
|
|
if err := repository.JobRepository.Create(context.TODO(), &job); err != nil {
|
|
return err
|
|
}
|
|
log.Debugf("创建计划任务「%v」cron「%v」", job.Name, job.Cron)
|
|
} else {
|
|
for i := range jobs {
|
|
if jobs[i].Status == constant.JobStatusRunning {
|
|
err := r.ChangeStatusById(jobs[i].ID, constant.JobStatusRunning)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
log.Debugf("启动计划任务「%v」cron「%v」", jobs[i].Name, jobs[i].Cron)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (r jobService) Create(o *model.Job) (err error) {
|
|
|
|
if o.Status == constant.JobStatusRunning {
|
|
j, err := getJob(o)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
jobId, err := cron.GlobalCron.AddJob(o.Cron, j)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
o.CronJobId = int(jobId)
|
|
}
|
|
|
|
return repository.JobRepository.Create(context.TODO(), o)
|
|
}
|
|
|
|
func (r jobService) DeleteJobById(id string) error {
|
|
job, err := repository.JobRepository.FindById(context.TODO(), id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if job.Status == constant.JobStatusRunning {
|
|
if err := r.ChangeStatusById(id, constant.JobStatusNotRunning); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return repository.JobRepository.DeleteJobById(context.TODO(), id)
|
|
}
|
|
|
|
func (r jobService) UpdateById(m *model.Job) error {
|
|
if err := repository.JobRepository.UpdateById(context.TODO(), m); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := r.ChangeStatusById(m.ID, constant.JobStatusNotRunning); err != nil {
|
|
return err
|
|
}
|
|
if err := r.ChangeStatusById(m.ID, constant.JobStatusRunning); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|