Files
jiacrontab/jiacrontab_admin/crontab.go
jiazhizhong 1279635d7f fix
2022-03-10 17:09:03 +08:00

267 lines
6.2 KiB
Go

package admin
import (
"errors"
"jiacrontab/models"
"jiacrontab/pkg/proto"
"strings"
)
func GetJobList(ctx *myctx) {
var (
jobRet proto.QueryCrontabJobRet
err error
reqBody GetJobListReqParams
rpcReqParams proto.QueryJobArgs
)
if err = ctx.Valid(&reqBody); err != nil {
ctx.respParamError(err)
return
}
rpcReqParams.Page = reqBody.Page
rpcReqParams.Pagesize = reqBody.Pagesize
rpcReqParams.UserID = ctx.claims.UserID
rpcReqParams.Root = ctx.claims.Root
rpcReqParams.GroupID = ctx.claims.GroupID
rpcReqParams.SearchTxt = reqBody.SearchTxt
if err := rpcCall(reqBody.Addr, "CrontabJob.List", rpcReqParams, &jobRet); err != nil {
ctx.respRPCError(err)
return
}
ctx.respSucc("", map[string]interface{}{
"list": jobRet.List,
"page": jobRet.Page,
"pagesize": jobRet.Pagesize,
"total": jobRet.Total,
})
}
func GetRecentLog(ctx *myctx) {
var (
err error
searchRet proto.SearchLogResult
reqBody GetLogReqParams
logList []string
)
if err = ctx.Valid(&reqBody); err != nil {
ctx.respParamError(err)
return
}
if err = rpcCall(reqBody.Addr, "CrontabJob.Log", proto.SearchLog{
JobID: reqBody.JobID,
Offset: reqBody.Offset,
Pagesize: reqBody.Pagesize,
Date: reqBody.Date,
Root: ctx.claims.Root,
GroupID: ctx.claims.GroupID,
UserID: ctx.claims.UserID,
Pattern: reqBody.Pattern,
IsTail: reqBody.IsTail,
}, &searchRet); err != nil {
ctx.respRPCError(err)
return
}
logList = strings.Split(string(searchRet.Content), "\n")
ctx.respSucc("", map[string]interface{}{
"logList": logList,
"curAddr": reqBody.Addr,
"offset": searchRet.Offset,
"filesize": searchRet.FileSize,
"pagesize": reqBody.Pagesize,
})
}
func EditJob(ctx *myctx) {
var (
err error
reply models.CrontabJob
reqBody EditJobReqParams
job models.CrontabJob
)
if err = ctx.Valid(&reqBody); err != nil {
ctx.respBasicError(err)
return
}
if !ctx.verifyNodePermission(reqBody.Addr) {
ctx.respNotAllowed()
return
}
job = models.CrontabJob{
Name: reqBody.Name,
Command: reqBody.Command,
GroupID: ctx.claims.GroupID,
Code: reqBody.Code,
TimeArgs: models.TimeArgs{
Month: reqBody.Month,
Day: reqBody.Day,
Hour: reqBody.Hour,
Minute: reqBody.Minute,
Weekday: reqBody.Weekday,
Second: reqBody.Second,
},
UpdatedUserID: ctx.claims.UserID,
UpdatedUsername: ctx.claims.Username,
WorkDir: reqBody.WorkDir,
WorkUser: reqBody.WorkUser,
WorkIp: reqBody.WorkIp,
WorkEnv: reqBody.WorkEnv,
KillChildProcess: reqBody.KillChildProcess,
RetryNum: reqBody.RetryNum,
Timeout: reqBody.Timeout,
TimeoutTrigger: reqBody.TimeoutTrigger,
MailTo: reqBody.MailTo,
APITo: reqBody.APITo,
DingdingTo: reqBody.DingdingTo,
MaxConcurrent: reqBody.MaxConcurrent,
DependJobs: reqBody.DependJobs,
ErrorMailNotify: reqBody.ErrorMailNotify,
ErrorAPINotify: reqBody.ErrorAPINotify,
ErrorDingdingNotify: reqBody.ErrorDingdingNotify,
IsSync: reqBody.IsSync,
CreatedUserID: ctx.claims.UserID,
CreatedUsername: ctx.claims.Username,
}
job.ID = reqBody.JobID
if ctx.claims.Root || ctx.claims.GroupID == models.SuperGroup.ID {
job.Status = models.StatusJobOk
} else {
job.Status = models.StatusJobUnaudited
}
if err = rpcCall(reqBody.Addr, "CrontabJob.Edit", proto.EditCrontabJobArgs{
Job: job,
GroupID: ctx.claims.GroupID,
Root: ctx.claims.Root,
UserID: ctx.claims.UserID,
}, &reply); err != nil {
ctx.respRPCError(err)
return
}
ctx.pubEvent(reply.Name, event_EditCronJob, models.EventSourceName(reqBody.Addr), reqBody)
ctx.respSucc("", reply)
}
func ActionTask(ctx *myctx) {
var (
err error
ok bool
method string
reqBody ActionTaskReqParams
jobReply []models.CrontabJob
methods = map[string]string{
"start": "CrontabJob.Start",
"stop": "CrontabJob.Stop",
"delete": "CrontabJob.Delete",
"batch-exec": "CrontabJob.Execs",
"kill": "CrontabJob.Kill",
}
eDesc = map[string]string{
"start": event_StartCronJob,
"stop": event_StopCronJob,
"batch-exec": event_ExecCronJob,
"delete": event_DelCronJob,
"kill": event_KillCronJob,
}
)
if err = ctx.Valid(&reqBody); err != nil {
ctx.respBasicError(err)
return
}
if method, ok = methods[reqBody.Action]; !ok {
ctx.respBasicError(errors.New("action无法识别"))
return
}
if err = rpcCall(reqBody.Addr, method, proto.ActionJobsArgs{
UserID: ctx.claims.UserID,
GroupID: ctx.claims.GroupID,
Root: ctx.claims.Root,
JobIDs: reqBody.JobIDs,
}, &jobReply); err != nil {
ctx.respRPCError(err)
return
}
if len(jobReply) > 0 {
var targetNames []string
for _, v := range jobReply {
targetNames = append(targetNames, v.Name)
}
ctx.pubEvent(strings.Join(targetNames, ","), eDesc[reqBody.Action], models.EventSourceName(reqBody.Addr), reqBody)
}
ctx.respSucc("", jobReply)
}
func ExecTask(ctx *myctx) {
var (
err error
logList []string
execJobReply proto.ExecCrontabJobReply
reqBody JobReqParams
)
if err = ctx.Valid(&reqBody); err != nil {
ctx.respParamError(err)
return
}
if err = rpcCall(reqBody.Addr, "CrontabJob.Exec", proto.GetJobArgs{
UserID: ctx.claims.UserID,
Root: ctx.claims.Root,
JobID: reqBody.JobID,
GroupID: ctx.claims.GroupID,
}, &execJobReply); err != nil {
ctx.respRPCError(err)
return
}
logList = strings.Split(string(execJobReply.Content), "\n")
ctx.pubEvent(execJobReply.Job.Name, event_ExecCronJob, models.EventSourceName(reqBody.Addr), reqBody)
ctx.respSucc("", logList)
}
func GetJob(ctx *myctx) {
var (
reqBody GetJobReqParams
crontabJob models.CrontabJob
err error
)
if err = ctx.Valid(&reqBody); err != nil {
ctx.respParamError(err)
return
}
if !ctx.verifyNodePermission(reqBody.Addr) {
ctx.respNotAllowed()
return
}
if err = rpcCall(reqBody.Addr, "CrontabJob.Get", proto.GetJobArgs{
UserID: ctx.claims.UserID,
Root: ctx.claims.Root,
GroupID: ctx.claims.GroupID,
JobID: reqBody.JobID,
}, &crontabJob); err != nil {
ctx.respRPCError(err)
return
}
ctx.respSucc("", crontabJob)
}