diff --git a/src/main/java/net/geedge/asw/common/config/SetupRunner.java b/src/main/java/net/geedge/asw/common/config/SetupRunner.java index 116566d..885cde3 100644 --- a/src/main/java/net/geedge/asw/common/config/SetupRunner.java +++ b/src/main/java/net/geedge/asw/common/config/SetupRunner.java @@ -14,10 +14,10 @@ import net.geedge.asw.module.environment.entity.EnvironmentEntity; import net.geedge.asw.module.environment.entity.EnvironmentSessionEntity; import net.geedge.asw.module.environment.service.IEnvironmentService; import net.geedge.asw.module.environment.service.IEnvironmentSessionService; -import net.geedge.asw.module.runner.entity.JobEntity; -import net.geedge.asw.module.runner.util.JobQueueManager; -import net.geedge.asw.module.runner.service.IJobService; -import net.geedge.asw.module.runner.util.RunnerConstant; +import net.geedge.asw.module.job.entity.JobEntity; +import net.geedge.asw.module.job.util.JobQueueManager; +import net.geedge.asw.module.job.service.IJobService; +import net.geedge.asw.module.job.util.JobConstant; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @@ -47,13 +47,13 @@ public class SetupRunner implements CommandLineRunner{ @Override public void run(String... args) throws Exception { log.info("Setup inited"); - List pendingJobs = jobService.list(new LambdaQueryWrapper().eq(JobEntity::getStatus, RunnerConstant.JobStatus.PENDING.getValue())); + List pendingJobs = jobService.list(new LambdaQueryWrapper().eq(JobEntity::getStatus, JobConstant.JobStatus.PENDING.getValue())); pendingJobs.forEach(jobQueueManager::addJob); log.info("[SetupRunner] [init pending job to JobQueueManager]"); log.info("[SetupRunner] [begin interrupted running job]"); - List runningJobs = jobService.list(new LambdaQueryWrapper().eq(JobEntity::getStatus, RunnerConstant.JobStatus.RUNNING.getValue())); + List runningJobs = jobService.list(new LambdaQueryWrapper().eq(JobEntity::getStatus, JobConstant.JobStatus.RUNNING.getValue())); for (JobEntity runningJob : runningJobs) { String id = runningJob.getId(); EnvironmentEntity environment = environmentService.getById(runningJob.getEnvId()); @@ -71,7 +71,7 @@ public class SetupRunner implements CommandLineRunner{ JSONObject result = T.JSONUtil.toBean(body, JSONObject.class); JSONObject data = result.getJSONObject("data"); String status = data.getStr("status"); - if (RunnerConstant.JobStatus.RUNNING.getValue().equals(status)){ + if (JobConstant.JobStatus.RUNNING.getValue().equals(status)){ HttpRequest request = T.HttpUtil.createRequest(Method.DELETE, String.format("%s/api/v1/env/playbook/%s", url, runningJob.getId())); request.header("Authorization", token); request.execute(); diff --git a/src/main/java/net/geedge/asw/common/config/job/JobConfig.java b/src/main/java/net/geedge/asw/common/config/job/JobConfig.java index 1446a4e..acec40b 100644 --- a/src/main/java/net/geedge/asw/common/config/job/JobConfig.java +++ b/src/main/java/net/geedge/asw/common/config/job/JobConfig.java @@ -4,8 +4,8 @@ import cn.hutool.log.Log; import jakarta.annotation.PostConstruct; import net.geedge.asw.common.util.T; import net.geedge.asw.module.environment.job.JobEnvironmentStatusChecker; -import net.geedge.asw.module.runner.job.JobPlaybookExecResultChecker; -import net.geedge.asw.module.runner.job.JobPlaybookExecutor; +import net.geedge.asw.module.job.job.JobPlaybookExecResultChecker; +import net.geedge.asw.module.job.job.JobPlaybookExecutor; import net.geedge.asw.module.sys.service.ISysConfigService; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/net/geedge/asw/common/util/Constants.java b/src/main/java/net/geedge/asw/common/util/Constants.java index 1ab1ef2..27ddd6a 100644 --- a/src/main/java/net/geedge/asw/common/util/Constants.java +++ b/src/main/java/net/geedge/asw/common/util/Constants.java @@ -111,6 +111,16 @@ public class Constants { */ public static final List ANDROID_PACKAGE_TYPE_LIST = T.ListUtil.of("xapk", "apk"); + /** + * job cfg type + */ + public static final List JOB_CFG_TYPE_LIST= T.ListUtil.of("asap", "cron"); + + /** + * job cfg status + */ + public static final List JOB_CFG_STATUS_LIST= T.ListUtil.of("enabled", "disabled"); + public static final String EMPTY_FILE_MD5 = "d41d8cd98f00b204e9800998ecf8427e"; /** diff --git a/src/main/java/net/geedge/asw/common/util/RCode.java b/src/main/java/net/geedge/asw/common/util/RCode.java index e25bc3d..6698d38 100644 --- a/src/main/java/net/geedge/asw/common/util/RCode.java +++ b/src/main/java/net/geedge/asw/common/util/RCode.java @@ -106,6 +106,18 @@ public enum RCode { ENVIRONMENT_ID_CANNOT_EMPTY(601005, "environment id cannot be empty"), + //job + JOB_CFG_TYPE_CANNOT_EMPTY(701001, "Job configuration type cannot be empty"), + JOB_CFG_STATUS_CANNOT_EMPTY(701002, "Job configuration status cannot be empty"), + JOB_CFG_STATUS_ERROR(701003, "Job configuration status error"), + JOB_CFG_TYPE_ERROR(701004, "Job configuration type error"), + JOB_CFG_CRON_CANNOT_EMPTY(701005, "Job configuration cron cannot be empty"), + JOB_CFG_CRON_ERROR(701006, "Job configuration cron is not a valid cron expression"), + JOB_CFG_NANE_ALREADY_EXISTS(701007, "Job configuration name already exists"), + JOB_CFG_NOT_EXIST(701008, "Job configuration does not exist"), + + + SUCCESS(200, "success"); // 成功 diff --git a/src/main/java/net/geedge/asw/module/app/service/impl/PackageServiceImpl.java b/src/main/java/net/geedge/asw/module/app/service/impl/PackageServiceImpl.java index a0d2add..a8b5b59 100644 --- a/src/main/java/net/geedge/asw/module/app/service/impl/PackageServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/app/service/impl/PackageServiceImpl.java @@ -14,8 +14,8 @@ import net.geedge.asw.module.app.service.IPackageService; import net.geedge.asw.module.app.util.ApkInfo; import net.geedge.asw.module.app.util.ApkUtil; import net.geedge.asw.module.app.util.PkgConstant; -import net.geedge.asw.module.runner.entity.JobEntity; -import net.geedge.asw.module.runner.service.IJobService; +import net.geedge.asw.module.job.entity.JobEntity; +import net.geedge.asw.module.job.service.IJobService; import net.geedge.asw.module.sys.entity.SysUserEntity; import net.geedge.asw.module.sys.service.ISysUserService; import net.geedge.asw.module.workbook.service.IWorkbookResourceService; diff --git a/src/main/java/net/geedge/asw/module/environment/controller/EnvironmentController.java b/src/main/java/net/geedge/asw/module/environment/controller/EnvironmentController.java index 1b0ea07..07de142 100644 --- a/src/main/java/net/geedge/asw/module/environment/controller/EnvironmentController.java +++ b/src/main/java/net/geedge/asw/module/environment/controller/EnvironmentController.java @@ -18,9 +18,9 @@ import net.geedge.asw.module.environment.entity.EnvironmentSessionEntity; import net.geedge.asw.module.environment.service.IEnvironmentService; import net.geedge.asw.module.environment.service.IEnvironmentSessionService; import net.geedge.asw.module.environment.util.EnvironmentUtil; -import net.geedge.asw.module.runner.entity.PcapEntity; -import net.geedge.asw.module.runner.service.IPcapService; -import net.geedge.asw.module.runner.util.RunnerConstant; +import net.geedge.asw.module.job.entity.PcapEntity; +import net.geedge.asw.module.job.service.IPcapService; +import net.geedge.asw.module.job.util.JobConstant; import net.geedge.asw.module.sys.service.ISysUserService; import net.geedge.asw.module.workspace.entity.WorkspaceEntity; import net.geedge.asw.module.workspace.service.IWorkspaceService; @@ -28,8 +28,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; -import org.springframework.web.socket.CloseStatus; -import org.springframework.web.socket.WebSocketSession; import java.io.File; import java.io.FileOutputStream; @@ -211,7 +209,7 @@ public class EnvironmentController { entity.setId(pcapId); entity.setName(destination.getName()); entity.setSize(destination.length()); - entity.setStatus(RunnerConstant.PcapStatus.UPLOADED.getValue()); + entity.setStatus(JobConstant.PcapStatus.UPLOADED.getValue()); entity.setCreateTimestamp(System.currentTimeMillis()); entity.setCreateUserId(StpUtil.getLoginIdAsString()); entity.setWorkspaceId(workspace.getId()); diff --git a/src/main/java/net/geedge/asw/module/runner/controller/JobController.java b/src/main/java/net/geedge/asw/module/job/controller/JobController.java similarity index 60% rename from src/main/java/net/geedge/asw/module/runner/controller/JobController.java rename to src/main/java/net/geedge/asw/module/job/controller/JobController.java index ee78da9..e5227b2 100644 --- a/src/main/java/net/geedge/asw/module/runner/controller/JobController.java +++ b/src/main/java/net/geedge/asw/module/job/controller/JobController.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.controller; +package net.geedge.asw.module.job.controller; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; @@ -8,18 +8,17 @@ import cn.hutool.log.Log; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.geedge.asw.common.util.Constants; -import net.geedge.asw.common.util.R; -import net.geedge.asw.common.util.RCode; -import net.geedge.asw.common.util.T; +import net.geedge.asw.common.util.*; import net.geedge.asw.module.environment.entity.EnvironmentEntity; import net.geedge.asw.module.environment.entity.EnvironmentSessionEntity; import net.geedge.asw.module.environment.service.IEnvironmentService; import net.geedge.asw.module.environment.service.IEnvironmentSessionService; -import net.geedge.asw.module.runner.entity.JobEntity; -import net.geedge.asw.module.runner.util.JobQueueManager; -import net.geedge.asw.module.runner.service.IJobService; -import net.geedge.asw.module.runner.util.RunnerConstant; +import net.geedge.asw.module.job.entity.JobCfgEntity; +import net.geedge.asw.module.job.entity.JobEntity; +import net.geedge.asw.module.job.service.IJobCfgService; +import net.geedge.asw.module.job.util.JobQueueManager; +import net.geedge.asw.module.job.service.IJobService; +import net.geedge.asw.module.job.util.JobConstant; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -45,6 +44,9 @@ public class JobController { @Autowired private JobQueueManager jobQueueManager; + @Autowired + private IJobCfgService jobCfgService; + @GetMapping("/{workspaceId}/job/{id}") public R detail(@PathVariable("workspaceId") String workspaceId, @PathVariable("id") String id) { @@ -61,18 +63,11 @@ public class JobController { } @PostMapping("/{workspaceId}/job") - public R add(@PathVariable("workspaceId") String workspaceId, - @RequestBody JobEntity entity) { - T.VerifyUtil.is(entity).notNull() - .and(entity.getEnvironmentId()).notEmpty(RCode.ENVIRONMENT_ID_CANNOT_EMPTY) - .and(entity.getPackageId()).notEmpty(RCode.PACKAGE_ID_CANNOT_EMPTY) - .and(entity.getPlaybookId()).notEmpty(RCode.PLAYBOOK_ID_CANNOT_EMPTY); + public R add(@PathVariable("workspaceId") String workspaceId, String jobCfgId) { + T.VerifyUtil.is(jobCfgId).notNull(RCode.ID_CANNOT_EMPTY); - entity.setWorkspaceId(workspaceId); - entity.setEnvId(entity.getEnvironmentId()); - - JobEntity jobEntity = jobService.saveJob(entity); - return R.ok().putData("id", jobEntity.getId()); + JobEntity jobEntity = jobService.saveJob(workspaceId, jobCfgId); + return R.ok().putData("record", T.MapUtil.of("id", jobEntity.getId())); } @DeleteMapping("/{workspaceId}/job") @@ -107,7 +102,7 @@ public class JobController { HttpRequest requestStatus = T.HttpUtil.createGet(String.format("%s/api/v1/env/playbook/%s", url, id)); requestStatus.header("Authorization", token); - if (job.getStatus().contains(RunnerConstant.JobStatus.RUNNING.getValue())){ + if (job.getStatus().contains(JobConstant.JobStatus.RUNNING.getValue())){ while (true){ HttpResponse response = requestStatus.execute(); if (response.isOk()){ @@ -121,7 +116,7 @@ public class JobController { log.info("[cancelJob] [request env stop playbook] [status: {}]", response.body()); } - if (job.getStatus().contains(RunnerConstant.JobStatus.PENDING.getValue())){ + if (job.getStatus().contains(JobConstant.JobStatus.PENDING.getValue())){ jobQueueManager.removeJob(job); } @@ -159,4 +154,55 @@ public class JobController { return R.ok().putData("record", result); } + @GetMapping("/{workspaceId}/job/cfg/{id}") + public R jobCfgInfo(@PathVariable("workspaceId") String workspaceId, + @PathVariable("id") String id) { + JobCfgEntity entity = jobCfgService.info(id); + return R.ok().putData("record", entity); + } + + @GetMapping("/{workspaceId}/job/cfg") + public R jobCfgList(@PathVariable("workspaceId") String workspaceId, + @RequestParam Map params) { + Page page = jobCfgService.queryList(params); + return R.ok(page); + } + + @PostMapping("/{workspaceId}/job/cfg") + public R saveCfg(@PathVariable("workspaceId") String workspaceId, + @RequestBody JobCfgEntity cfg) { + VerifyUtil.is(cfg).notNull() + .and(cfg.getName()).notEmpty(RCode.NAME_CANNOT_EMPTY) + .and(cfg.getPlaybookId()).notEmpty(RCode.PLAYBOOK_ID_CANNOT_EMPTY) + .and(cfg.getPackageId()).notEmpty(RCode.PACKAGE_ID_CANNOT_EMPTY) + .and(cfg.getType()).notEmpty(RCode.JOB_CFG_TYPE_CANNOT_EMPTY) + .and(cfg.getStatus()).notEmpty(RCode.JOB_CFG_STATUS_CANNOT_EMPTY); + JobCfgEntity jobCfgEntity = jobCfgService.saveJobCfg(workspaceId, cfg); + return R.ok().putData("record", T.MapUtil.of("id", jobCfgEntity.getId())); + } + + @PutMapping("/{workspaceId}/job/cfg") + public R updateCfg(@PathVariable("workspaceId") String workspaceId, + @RequestBody JobCfgEntity cfg) { + VerifyUtil.is(cfg).notNull() + .and(cfg.getId()).notEmpty(RCode.ID_CANNOT_EMPTY) + .and(cfg.getName()).notEmpty(RCode.NAME_CANNOT_EMPTY) + .and(cfg.getPlaybookId()).notEmpty(RCode.PLAYBOOK_ID_CANNOT_EMPTY) + .and(cfg.getPackageId()).notEmpty(RCode.PACKAGE_ID_CANNOT_EMPTY) + .and(cfg.getType()).notEmpty(RCode.JOB_CFG_TYPE_CANNOT_EMPTY) + .and(cfg.getStatus()).notEmpty(RCode.JOB_CFG_STATUS_CANNOT_EMPTY); + + JobCfgEntity jobCfgEntity = jobCfgService.updateCfg(workspaceId, cfg); + return R.ok().putData("record", T.MapUtil.of("id", jobCfgEntity.getId())); + } + + @DeleteMapping("/{workspaceId}/job/cfg") + public R deleteJobCfg(@PathVariable("workspaceId") String workspaceId, + String ids) { + VerifyUtil.is(ids).notEmpty(); + List idList = Arrays.asList(ids.split(",")); + jobCfgService.removeBatchByIds(idList); + return R.ok(); + } + } \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/runner/controller/PcapController.java b/src/main/java/net/geedge/asw/module/job/controller/PcapController.java similarity index 98% rename from src/main/java/net/geedge/asw/module/runner/controller/PcapController.java rename to src/main/java/net/geedge/asw/module/job/controller/PcapController.java index 0137dc9..ed0a701 100644 --- a/src/main/java/net/geedge/asw/module/runner/controller/PcapController.java +++ b/src/main/java/net/geedge/asw/module/job/controller/PcapController.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.controller; +package net.geedge.asw.module.job.controller; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; @@ -13,8 +13,8 @@ import jakarta.servlet.http.HttpServletResponse; import net.geedge.asw.common.config.SpringContextUtils; import net.geedge.asw.common.util.*; import net.geedge.asw.module.feign.client.WebSharkClient; -import net.geedge.asw.module.runner.entity.PcapEntity; -import net.geedge.asw.module.runner.service.IPcapService; +import net.geedge.asw.module.job.entity.PcapEntity; +import net.geedge.asw.module.job.service.IPcapService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; diff --git a/src/main/java/net/geedge/asw/module/runner/controller/PlaybookController.java b/src/main/java/net/geedge/asw/module/job/controller/PlaybookController.java similarity index 94% rename from src/main/java/net/geedge/asw/module/runner/controller/PlaybookController.java rename to src/main/java/net/geedge/asw/module/job/controller/PlaybookController.java index 918c6e5..3c968e3 100644 --- a/src/main/java/net/geedge/asw/module/runner/controller/PlaybookController.java +++ b/src/main/java/net/geedge/asw/module/job/controller/PlaybookController.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.controller; +package net.geedge.asw.module.job.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jakarta.servlet.http.HttpServletResponse; @@ -6,8 +6,8 @@ import net.geedge.asw.common.util.R; import net.geedge.asw.common.util.RCode; import net.geedge.asw.common.util.ResponseUtil; import net.geedge.asw.common.util.T; -import net.geedge.asw.module.runner.entity.PlaybookEntity; -import net.geedge.asw.module.runner.service.IPlaybookService; +import net.geedge.asw.module.job.entity.PlaybookEntity; +import net.geedge.asw.module.job.service.IPlaybookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/net/geedge/asw/module/runner/dao/RunnerDao.java b/src/main/java/net/geedge/asw/module/job/dao/JobCfgDao.java similarity index 51% rename from src/main/java/net/geedge/asw/module/runner/dao/RunnerDao.java rename to src/main/java/net/geedge/asw/module/job/dao/JobCfgDao.java index efa0fd5..ac533a9 100644 --- a/src/main/java/net/geedge/asw/module/runner/dao/RunnerDao.java +++ b/src/main/java/net/geedge/asw/module/job/dao/JobCfgDao.java @@ -1,16 +1,15 @@ -package net.geedge.asw.module.runner.dao; +package net.geedge.asw.module.job.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.geedge.asw.module.runner.entity.RunnerEntity; +import net.geedge.asw.module.job.entity.JobCfgEntity; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; @Mapper -public interface RunnerDao extends BaseMapper{ - - List queryList(Page page, Map params); +public interface JobCfgDao extends BaseMapper { + List queryList(Page page, Map params); } diff --git a/src/main/java/net/geedge/asw/module/runner/dao/JobDao.java b/src/main/java/net/geedge/asw/module/job/dao/JobDao.java similarity index 70% rename from src/main/java/net/geedge/asw/module/runner/dao/JobDao.java rename to src/main/java/net/geedge/asw/module/job/dao/JobDao.java index 57a7240..4efebf0 100644 --- a/src/main/java/net/geedge/asw/module/runner/dao/JobDao.java +++ b/src/main/java/net/geedge/asw/module/job/dao/JobDao.java @@ -1,10 +1,9 @@ -package net.geedge.asw.module.runner.dao; +package net.geedge.asw.module.job.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import net.geedge.asw.module.runner.entity.JobEntity; +import net.geedge.asw.module.job.entity.JobEntity; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; diff --git a/src/main/java/net/geedge/asw/module/runner/dao/PcapDao.java b/src/main/java/net/geedge/asw/module/job/dao/PcapDao.java similarity index 78% rename from src/main/java/net/geedge/asw/module/runner/dao/PcapDao.java rename to src/main/java/net/geedge/asw/module/job/dao/PcapDao.java index ffd0d17..2faa392 100644 --- a/src/main/java/net/geedge/asw/module/runner/dao/PcapDao.java +++ b/src/main/java/net/geedge/asw/module/job/dao/PcapDao.java @@ -1,8 +1,8 @@ -package net.geedge.asw.module.runner.dao; +package net.geedge.asw.module.job.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.geedge.asw.module.runner.entity.PcapEntity; +import net.geedge.asw.module.job.entity.PcapEntity; import org.apache.ibatis.annotations.Mapper; import java.util.List; diff --git a/src/main/java/net/geedge/asw/module/runner/dao/PlaybookDao.java b/src/main/java/net/geedge/asw/module/job/dao/PlaybookDao.java similarity index 84% rename from src/main/java/net/geedge/asw/module/runner/dao/PlaybookDao.java rename to src/main/java/net/geedge/asw/module/job/dao/PlaybookDao.java index 193db35..b951351 100644 --- a/src/main/java/net/geedge/asw/module/runner/dao/PlaybookDao.java +++ b/src/main/java/net/geedge/asw/module/job/dao/PlaybookDao.java @@ -1,8 +1,8 @@ -package net.geedge.asw.module.runner.dao; +package net.geedge.asw.module.job.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.geedge.asw.module.runner.entity.PlaybookEntity; +import net.geedge.asw.module.job.entity.PlaybookEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/src/main/java/net/geedge/asw/module/job/entity/JobCfgEntity.java b/src/main/java/net/geedge/asw/module/job/entity/JobCfgEntity.java new file mode 100644 index 0000000..8ec467c --- /dev/null +++ b/src/main/java/net/geedge/asw/module/job/entity/JobCfgEntity.java @@ -0,0 +1,63 @@ +package net.geedge.asw.module.job.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import net.geedge.asw.module.app.entity.PackageEntity; +import net.geedge.asw.module.environment.entity.EnvironmentEntity; +import net.geedge.asw.module.sys.entity.SysUserEntity; +import net.geedge.asw.module.workspace.entity.WorkspaceEntity; + +import java.util.List; + +@Data +@TableName("job_cfg") +public class JobCfgEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String name; + private String description; + private String packageId; + private String envId; + private String playbookId; + private String type; + private String cron; + private String status; + private String parameters; + + private Long createTimestamp; + private Long updateTimestamp; + private String createUserId; + private String updateUserId; + + private String workspaceId; + + @TableField(exist = false) + @JsonProperty(value = "package") + private PackageEntity pkg; + + @TableField(exist = false) + private EnvironmentEntity environment; + + @TableField(exist = false) + private PlaybookEntity playbook; + + @TableField(exist = false) + private List pcap; + + @TableField(exist = false) + private SysUserEntity createUser; + + @TableField(exist = false) + private SysUserEntity updateUser; + + @TableField(exist = false) + private WorkspaceEntity workspace; + + @TableField(exist = false) + private JobEntity lastJobResult; +} diff --git a/src/main/java/net/geedge/asw/module/runner/entity/JobEntity.java b/src/main/java/net/geedge/asw/module/job/entity/JobEntity.java similarity index 93% rename from src/main/java/net/geedge/asw/module/runner/entity/JobEntity.java rename to src/main/java/net/geedge/asw/module/job/entity/JobEntity.java index 5ab8d1b..50d3a4d 100644 --- a/src/main/java/net/geedge/asw/module/runner/entity/JobEntity.java +++ b/src/main/java/net/geedge/asw/module/job/entity/JobEntity.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.entity; +package net.geedge.asw.module.job.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; @@ -21,6 +21,7 @@ public class JobEntity { @TableId(type = IdType.ASSIGN_UUID) private String id; + private String jobCfgId; private String packageId; private String envId; private String playbookId; @@ -65,6 +66,6 @@ public class JobEntity { @TableField(exist = false) private EnvironmentSessionEntity session; - - + @TableField(exist = false) + private JobCfgEntity jobCfg; } \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/runner/entity/PcapEntity.java b/src/main/java/net/geedge/asw/module/job/entity/PcapEntity.java similarity index 97% rename from src/main/java/net/geedge/asw/module/runner/entity/PcapEntity.java rename to src/main/java/net/geedge/asw/module/job/entity/PcapEntity.java index 6a5f197..922025f 100644 --- a/src/main/java/net/geedge/asw/module/runner/entity/PcapEntity.java +++ b/src/main/java/net/geedge/asw/module/job/entity/PcapEntity.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.entity; +package net.geedge.asw.module.job.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/net/geedge/asw/module/runner/entity/PlaybookEntity.java b/src/main/java/net/geedge/asw/module/job/entity/PlaybookEntity.java similarity index 95% rename from src/main/java/net/geedge/asw/module/runner/entity/PlaybookEntity.java rename to src/main/java/net/geedge/asw/module/job/entity/PlaybookEntity.java index cd8ff83..357ae99 100644 --- a/src/main/java/net/geedge/asw/module/runner/entity/PlaybookEntity.java +++ b/src/main/java/net/geedge/asw/module/job/entity/PlaybookEntity.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.entity; +package net.geedge.asw.module.job.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/net/geedge/asw/module/runner/job/JobPlaybookExecResultChecker.java b/src/main/java/net/geedge/asw/module/job/job/JobPlaybookExecResultChecker.java similarity index 96% rename from src/main/java/net/geedge/asw/module/runner/job/JobPlaybookExecResultChecker.java rename to src/main/java/net/geedge/asw/module/job/job/JobPlaybookExecResultChecker.java index 94de8a1..63c7ec1 100644 --- a/src/main/java/net/geedge/asw/module/runner/job/JobPlaybookExecResultChecker.java +++ b/src/main/java/net/geedge/asw/module/job/job/JobPlaybookExecResultChecker.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.job; +package net.geedge.asw.module.job.job; import cn.hutool.core.net.url.UrlBuilder; import cn.hutool.http.HttpRequest; @@ -17,11 +17,11 @@ import net.geedge.asw.module.environment.entity.EnvironmentEntity; import net.geedge.asw.module.environment.entity.EnvironmentSessionEntity; import net.geedge.asw.module.environment.service.IEnvironmentService; import net.geedge.asw.module.environment.service.IEnvironmentSessionService; -import net.geedge.asw.module.runner.entity.JobEntity; -import net.geedge.asw.module.runner.entity.PcapEntity; -import net.geedge.asw.module.runner.service.IJobService; -import net.geedge.asw.module.runner.service.IPcapService; -import net.geedge.asw.module.runner.util.RunnerConstant; +import net.geedge.asw.module.job.entity.JobEntity; +import net.geedge.asw.module.job.entity.PcapEntity; +import net.geedge.asw.module.job.service.IJobService; +import net.geedge.asw.module.job.service.IPcapService; +import net.geedge.asw.module.job.util.JobConstant; import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.model.FileHeader; import net.lingala.zip4j.model.ZipParameters; @@ -82,7 +82,7 @@ public class JobPlaybookExecResultChecker extends QuartzJobBean { private void playbookExecResultChecker() { - List jobList = jobService.list(new LambdaQueryWrapper().eq(JobEntity::getStatus, RunnerConstant.JobStatus.RUNNING.getValue())); + List jobList = jobService.list(new LambdaQueryWrapper().eq(JobEntity::getStatus, JobConstant.JobStatus.RUNNING.getValue())); if (jobList.isEmpty()) { return; } @@ -116,10 +116,10 @@ public class JobPlaybookExecResultChecker extends QuartzJobBean { Constants.RUNNING_JOB_THREAD.computeIfAbsent(id, jobId -> startGetJobLogThread(job, environment)); break; case "error": - Constants.RESULT_JOB_THREAD.computeIfAbsent(id, jobId -> startGetJobResultThread(job, environment,RunnerConstant.JobStatus.FAILED.getValue())); + Constants.RESULT_JOB_THREAD.computeIfAbsent(id, jobId -> startGetJobResultThread(job, environment, JobConstant.JobStatus.FAILED.getValue())); break; case "done": - Constants.RESULT_JOB_THREAD.computeIfAbsent(id, jobId -> startGetJobResultThread(job, environment, RunnerConstant.JobStatus.PASSED.getValue())); + Constants.RESULT_JOB_THREAD.computeIfAbsent(id, jobId -> startGetJobResultThread(job, environment, JobConstant.JobStatus.PASSED.getValue())); break; } } @@ -153,7 +153,7 @@ public class JobPlaybookExecResultChecker extends QuartzJobBean { // 检查 Job 的状态是否为 running private boolean isJobInRunningStatus(JobEntity jobEntity) { JobEntity job = jobService.getById(jobEntity.getId()); - return job != null && !T.StrUtil.equalsIgnoreCase(job.getStatus(), RunnerConstant.JobStatus.RUNNING.getValue()); + return job != null && !T.StrUtil.equalsIgnoreCase(job.getStatus(), JobConstant.JobStatus.RUNNING.getValue()); } /** @@ -263,7 +263,7 @@ public class JobPlaybookExecResultChecker extends QuartzJobBean { entity.setName(fileName); entity.setSize(pcapFile.length()); - entity.setStatus(RunnerConstant.PcapStatus.UPLOADED.getValue()); + entity.setStatus(JobConstant.PcapStatus.UPLOADED.getValue()); entity.setCreateTimestamp(System.currentTimeMillis()); entity.setCreateUserId(job.getCreateUserId()); entity.setWorkspaceId(job.getWorkspaceId()); diff --git a/src/main/java/net/geedge/asw/module/runner/job/JobPlaybookExecutor.java b/src/main/java/net/geedge/asw/module/job/job/JobPlaybookExecutor.java similarity index 91% rename from src/main/java/net/geedge/asw/module/runner/job/JobPlaybookExecutor.java rename to src/main/java/net/geedge/asw/module/job/job/JobPlaybookExecutor.java index 4692d6a..a659685 100644 --- a/src/main/java/net/geedge/asw/module/runner/job/JobPlaybookExecutor.java +++ b/src/main/java/net/geedge/asw/module/job/job/JobPlaybookExecutor.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.job; +package net.geedge.asw.module.job.job; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; @@ -14,12 +14,12 @@ import net.geedge.asw.module.environment.entity.EnvironmentEntity; import net.geedge.asw.module.environment.entity.EnvironmentSessionEntity; import net.geedge.asw.module.environment.service.IEnvironmentService; import net.geedge.asw.module.environment.service.IEnvironmentSessionService; -import net.geedge.asw.module.runner.entity.JobEntity; -import net.geedge.asw.module.runner.entity.PlaybookEntity; -import net.geedge.asw.module.runner.service.IJobService; -import net.geedge.asw.module.runner.service.IPlaybookService; -import net.geedge.asw.module.runner.util.JobQueueManager; -import net.geedge.asw.module.runner.util.RunnerConstant; +import net.geedge.asw.module.job.entity.JobEntity; +import net.geedge.asw.module.job.entity.PlaybookEntity; +import net.geedge.asw.module.job.service.IJobService; +import net.geedge.asw.module.job.service.IPlaybookService; +import net.geedge.asw.module.job.util.JobQueueManager; +import net.geedge.asw.module.job.util.JobConstant; import org.apache.commons.lang3.time.StopWatch; import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; @@ -76,7 +76,7 @@ public class JobPlaybookExecutor extends QuartzJobBean { public void playbookExecutor() { List createdJobs = jobService.list( new LambdaQueryWrapper() - .eq(JobEntity::getStatus, RunnerConstant.JobStatus.CREATED.getValue()) + .eq(JobEntity::getStatus, JobConstant.JobStatus.CREATED.getValue()) .orderByAsc(JobEntity::getCreateTimestamp) ); @@ -85,7 +85,7 @@ public class JobPlaybookExecutor extends QuartzJobBean { // 将 CREATED 任务加入队列 createdJobs.forEach(jobQueueManager::addJob); // 更新 createdJobs 状态为 pending - createdJobs.forEach(x -> x.setStatus(RunnerConstant.JobStatus.PENDING.getValue())); + createdJobs.forEach(x -> x.setStatus(JobConstant.JobStatus.PENDING.getValue())); jobService.updateBatchById(createdJobs); } @@ -114,7 +114,7 @@ public class JobPlaybookExecutor extends QuartzJobBean { // update job status running jobService.update(new LambdaUpdateWrapper() - .set(JobEntity::getStatus, RunnerConstant.JobStatus.RUNNING.getValue()) + .set(JobEntity::getStatus, JobConstant.JobStatus.RUNNING.getValue()) .set(JobEntity::getStartTimestamp, System.currentTimeMillis()) .eq(JobEntity::getId, nextJob.getId()) ); @@ -150,7 +150,7 @@ public class JobPlaybookExecutor extends QuartzJobBean { // update job status, starTime, updateTimestamp jobService.update(new LambdaUpdateWrapper() - .set(JobEntity::getStatus, RunnerConstant.JobStatus.FAILED.getValue()) + .set(JobEntity::getStatus, JobConstant.JobStatus.FAILED.getValue()) .set(JobEntity::getEndTimestamp, System.currentTimeMillis()) .eq(JobEntity::getId, job.getId())); @@ -162,7 +162,7 @@ public class JobPlaybookExecutor extends QuartzJobBean { // update job status, starTime, updateTimestamp jobService.update(new LambdaUpdateWrapper() - .set(JobEntity::getStatus, RunnerConstant.JobStatus.FAILED.getValue()) + .set(JobEntity::getStatus, JobConstant.JobStatus.FAILED.getValue()) .set(JobEntity::getEndTimestamp, System.currentTimeMillis()) .eq(JobEntity::getId, job.getId())); diff --git a/src/main/java/net/geedge/asw/module/job/service/IJobCfgService.java b/src/main/java/net/geedge/asw/module/job/service/IJobCfgService.java new file mode 100644 index 0000000..bff5d00 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/job/service/IJobCfgService.java @@ -0,0 +1,18 @@ +package net.geedge.asw.module.job.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.job.entity.JobCfgEntity; + +import java.util.Map; + +public interface IJobCfgService extends IService { + + JobCfgEntity info(String id); + + Page queryList(Map params); + + JobCfgEntity saveJobCfg(String workspaceId, JobCfgEntity cfg); + + JobCfgEntity updateCfg(String workspaceId, JobCfgEntity cfg); +} diff --git a/src/main/java/net/geedge/asw/module/runner/service/IJobService.java b/src/main/java/net/geedge/asw/module/job/service/IJobService.java similarity index 51% rename from src/main/java/net/geedge/asw/module/runner/service/IJobService.java rename to src/main/java/net/geedge/asw/module/job/service/IJobService.java index a8a6db8..083fc91 100644 --- a/src/main/java/net/geedge/asw/module/runner/service/IJobService.java +++ b/src/main/java/net/geedge/asw/module/job/service/IJobService.java @@ -1,8 +1,8 @@ -package net.geedge.asw.module.runner.service; +package net.geedge.asw.module.job.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import net.geedge.asw.module.runner.entity.JobEntity; +import net.geedge.asw.module.job.entity.JobEntity; import java.util.List; import java.util.Map; @@ -13,16 +13,9 @@ public interface IJobService extends IService{ Page queryList(Map params); - JobEntity saveJob(JobEntity entity); + JobEntity saveJob(String workspaceId, String jobCfgId); void removeJob(List ids); Map queryJobLog(String id, Integer offset); - -// JobEntity assignPendingJob(String id, String platform); -// -// void appendTraceLogStrToFile(String jobId, String content) throws RuntimeException; -// -// void updateJobResult(String jobId, String state, MultipartFile pcapFile); - } diff --git a/src/main/java/net/geedge/asw/module/runner/service/IPcapService.java b/src/main/java/net/geedge/asw/module/job/service/IPcapService.java similarity index 87% rename from src/main/java/net/geedge/asw/module/runner/service/IPcapService.java rename to src/main/java/net/geedge/asw/module/job/service/IPcapService.java index 59f81b9..9b8e686 100644 --- a/src/main/java/net/geedge/asw/module/runner/service/IPcapService.java +++ b/src/main/java/net/geedge/asw/module/job/service/IPcapService.java @@ -1,8 +1,8 @@ -package net.geedge.asw.module.runner.service; +package net.geedge.asw.module.job.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import net.geedge.asw.module.runner.entity.PcapEntity; +import net.geedge.asw.module.job.entity.PcapEntity; import org.springframework.core.io.Resource; import java.util.Map; diff --git a/src/main/java/net/geedge/asw/module/runner/service/IPlaybookService.java b/src/main/java/net/geedge/asw/module/job/service/IPlaybookService.java similarity index 86% rename from src/main/java/net/geedge/asw/module/runner/service/IPlaybookService.java rename to src/main/java/net/geedge/asw/module/job/service/IPlaybookService.java index 7177cea..6fbd093 100644 --- a/src/main/java/net/geedge/asw/module/runner/service/IPlaybookService.java +++ b/src/main/java/net/geedge/asw/module/job/service/IPlaybookService.java @@ -1,8 +1,8 @@ -package net.geedge.asw.module.runner.service; +package net.geedge.asw.module.job.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import net.geedge.asw.module.runner.entity.PlaybookEntity; +import net.geedge.asw.module.job.entity.PlaybookEntity; import org.springframework.web.multipart.MultipartFile; import java.util.Map; diff --git a/src/main/java/net/geedge/asw/module/job/service/impl/JobCfgServiceImpl.java b/src/main/java/net/geedge/asw/module/job/service/impl/JobCfgServiceImpl.java new file mode 100644 index 0000000..6031fcc --- /dev/null +++ b/src/main/java/net/geedge/asw/module/job/service/impl/JobCfgServiceImpl.java @@ -0,0 +1,159 @@ +package net.geedge.asw.module.job.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.common.config.Query; +import net.geedge.asw.common.util.*; +import net.geedge.asw.module.app.entity.PackageEntity; +import net.geedge.asw.module.app.service.IPackageService; +import net.geedge.asw.module.environment.entity.EnvironmentEntity; +import net.geedge.asw.module.environment.service.IEnvironmentService; +import net.geedge.asw.module.job.dao.JobCfgDao; +import net.geedge.asw.module.job.entity.JobCfgEntity; +import net.geedge.asw.module.job.entity.JobEntity; +import net.geedge.asw.module.job.entity.PcapEntity; +import net.geedge.asw.module.job.entity.PlaybookEntity; +import net.geedge.asw.module.job.service.IJobCfgService; +import net.geedge.asw.module.job.service.IJobService; +import net.geedge.asw.module.job.service.IPcapService; +import net.geedge.asw.module.job.service.IPlaybookService; +import net.geedge.asw.module.sys.entity.SysUserEntity; +import net.geedge.asw.module.sys.service.ISysUserService; +import net.geedge.asw.module.workspace.entity.WorkspaceEntity; +import net.geedge.asw.module.workspace.service.IWorkspaceService; +import org.quartz.CronExpression; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class JobCfgServiceImpl extends ServiceImpl implements IJobCfgService { + + @Autowired + private IPackageService packageService; + + @Autowired + private IPlaybookService playbookService; + + @Autowired + private IEnvironmentService environmentService; + + @Autowired + private IJobService jobService; + + @Autowired + private IPcapService pcapService; + + @Autowired + private ISysUserService userService; + + @Autowired + private IWorkspaceService workspaceService; + + @Override + public JobCfgEntity info(String id) { + JobCfgEntity cfg = this.getById(id); + + PackageEntity pkg = packageService.getById(cfg.getPackageId()); + if (T.ObjectUtil.isNotEmpty(pkg)) { + cfg.setPkg(pkg); + } + + EnvironmentEntity environment = environmentService.getById(cfg.getEnvId()); + if (T.ObjectUtil.isNotEmpty(environment)) { + cfg.setEnvironment(environment); + } + + PlaybookEntity playbook = playbookService.getById(cfg.getPlaybookId()); + if (T.ObjectUtil.isNotEmpty(playbook)) { + cfg.setPlaybook(playbook); + } + + SysUserEntity createUser = userService.getById(cfg.getCreateUserId()); + if (T.ObjectUtil.isNotEmpty(createUser)) { + cfg.setCreateUser(createUser); + } + + SysUserEntity updateUser = userService.getById(cfg.getUpdateUserId()); + if (T.ObjectUtil.isNotEmpty(updateUser)) { + cfg.setCreateUser(updateUser); + } + + WorkspaceEntity workspace = workspaceService.getById(cfg.getWorkspaceId()); + if (T.ObjectUtil.isNotEmpty(workspace)) { + cfg.setWorkspace(workspace); + } + + JobEntity lastJob = jobService.getOne(new LambdaQueryWrapper() + .eq(JobEntity::getJobCfgId, cfg.getId()) + .orderByDesc(JobEntity::getCreateTimestamp) + .last("limit 1")); + if (T.ObjectUtil.isNotEmpty(lastJob)) { + cfg.setLastJobResult(lastJob); + + List pcapList = pcapService.list(new LambdaQueryWrapper().eq(PcapEntity::getJobId, lastJob.getId())); + cfg.setPcap(pcapList); + } + + return cfg; + } + + @Override + public Page queryList(Map params) { + Page page = new Query(JobCfgEntity.class).getPage(params); + List jobList = this.getBaseMapper().queryList(page, params); + + page.setRecords(jobList); + return page; + } + + private void validateJobCfgInfo(JobCfgEntity cfg) { + if (!Constants.JOB_CFG_STATUS_LIST.contains(cfg.getStatus())) { + throw new ASWException(RCode.JOB_CFG_STATUS_ERROR); + } + if (!Constants.JOB_CFG_TYPE_LIST.contains(cfg.getType())) { + throw new ASWException(RCode.JOB_CFG_TYPE_ERROR); + } + if (T.StrUtil.equals(cfg.getType(), "cron") && cfg.getCron() == null) { + throw new ASWException(RCode.JOB_CFG_CRON_CANNOT_EMPTY); + } + if (cfg.getCron() != null && !CronExpression.isValidExpression(cfg.getCron())) { + throw new ASWException(RCode.JOB_CFG_CRON_ERROR); + } + + JobCfgEntity entity = this.getOne(new LambdaQueryWrapper().eq(JobCfgEntity::getName, cfg.getName())); + if (cfg.getId() == null && T.ObjectUtil.isNotEmpty(entity)) { + throw new ASWException(RCode.JOB_CFG_NANE_ALREADY_EXISTS); + } + + if (cfg.getId() != null && T.ObjectUtil.isNotEmpty(entity) && !T.StrUtil.equals(cfg.getId(), entity.getId())) { + throw new ASWException(RCode.JOB_CFG_NANE_ALREADY_EXISTS); + } + } + + @Override + public JobCfgEntity saveJobCfg(String workspaceId, JobCfgEntity cfg) { + this.validateJobCfgInfo(cfg); + cfg.setCreateTimestamp(System.currentTimeMillis()); + cfg.setUpdateTimestamp(System.currentTimeMillis()); + cfg.setCreateUserId(StpUtil.getLoginIdAsString()); + cfg.setUpdateUserId(StpUtil.getLoginIdAsString()); + cfg.setWorkspaceId(workspaceId); + this.save(cfg); + return cfg; + } + + + @Override + public JobCfgEntity updateCfg(String workspaceId, JobCfgEntity cfg) { + this.validateJobCfgInfo(cfg); + cfg.setUpdateTimestamp(System.currentTimeMillis()); + cfg.setUpdateUserId(StpUtil.getLoginIdAsString()); + this.updateById(cfg); + return cfg; + } +} diff --git a/src/main/java/net/geedge/asw/module/runner/service/impl/JobServiceImpl.java b/src/main/java/net/geedge/asw/module/job/service/impl/JobServiceImpl.java similarity index 59% rename from src/main/java/net/geedge/asw/module/runner/service/impl/JobServiceImpl.java rename to src/main/java/net/geedge/asw/module/job/service/impl/JobServiceImpl.java index 6b5045a..007d816 100644 --- a/src/main/java/net/geedge/asw/module/runner/service/impl/JobServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/job/service/impl/JobServiceImpl.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.service.impl; +package net.geedge.asw.module.job.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.log.Log; @@ -14,14 +14,16 @@ import net.geedge.asw.module.environment.entity.EnvironmentEntity; import net.geedge.asw.module.environment.entity.EnvironmentSessionEntity; import net.geedge.asw.module.environment.service.IEnvironmentService; import net.geedge.asw.module.environment.service.IEnvironmentSessionService; -import net.geedge.asw.module.runner.dao.JobDao; -import net.geedge.asw.module.runner.entity.JobEntity; -import net.geedge.asw.module.runner.entity.PcapEntity; -import net.geedge.asw.module.runner.entity.PlaybookEntity; -import net.geedge.asw.module.runner.service.IJobService; -import net.geedge.asw.module.runner.service.IPcapService; -import net.geedge.asw.module.runner.service.IPlaybookService; -import net.geedge.asw.module.runner.util.RunnerConstant; +import net.geedge.asw.module.job.dao.JobDao; +import net.geedge.asw.module.job.entity.JobCfgEntity; +import net.geedge.asw.module.job.entity.JobEntity; +import net.geedge.asw.module.job.entity.PcapEntity; +import net.geedge.asw.module.job.entity.PlaybookEntity; +import net.geedge.asw.module.job.service.IJobCfgService; +import net.geedge.asw.module.job.service.IJobService; +import net.geedge.asw.module.job.service.IPcapService; +import net.geedge.asw.module.job.service.IPlaybookService; +import net.geedge.asw.module.job.util.JobConstant; import net.geedge.asw.module.sys.entity.SysUserEntity; import net.geedge.asw.module.sys.service.ISysUserService; import net.geedge.asw.module.workspace.entity.WorkspaceEntity; @@ -63,20 +65,12 @@ public class JobServiceImpl extends ServiceImpl implements IJ @Autowired private IEnvironmentSessionService environmentSessionService; + @Autowired + private IJobCfgService jobCfgService; + @Value("${asw.resources.path:resources}") private String resources; - - /** - * rootPath/result/{jobId} - * - * @param jobId - * @return - */ - private String getJobResultPath(String jobId) { - return T.FileUtil.file(T.WebPathUtil.getRootPath(), "job_result", jobId).getPath(); - } - @Override public JobEntity queryInfo(String id) { JobEntity job = this.getById(id); @@ -103,6 +97,9 @@ public class JobServiceImpl extends ServiceImpl implements IJ EnvironmentSessionEntity session = environmentSessionService.getOne(new LambdaQueryWrapper().eq(EnvironmentSessionEntity::getJobId, id)); job.setSession(session); + JobCfgEntity cfg = jobCfgService.getById(job.getJobCfgId()); + job.setJobCfg(cfg); + if (-1 == job.getStartTimestamp()) { job.setStartTimestamp(null); } @@ -130,23 +127,35 @@ public class JobServiceImpl extends ServiceImpl implements IJ @Override @Transactional(rollbackFor = Exception.class) - public JobEntity saveJob(JobEntity entity) { - entity.setCreateTimestamp(System.currentTimeMillis()); - entity.setUpdateTimestamp(System.currentTimeMillis()); - entity.setCreateUserId(StpUtil.getLoginIdAsString()); - entity.setUpdateUserId(StpUtil.getLoginIdAsString()); - entity.setStatus(RunnerConstant.JobStatus.CREATED.getValue()); + public JobEntity saveJob(String workspaceId, String jobCfgId) { + + JobCfgEntity cfg = jobCfgService.getById(jobCfgId); + if (T.ObjectUtil.isEmpty(cfg)){ + throw new ASWException(RCode.JOB_CFG_NOT_EXIST); + } + JobEntity job = new JobEntity(); + job.setWorkspaceId(workspaceId); + job.setJobCfgId(jobCfgId); + job.setParameters(cfg.getParameters()); + job.setEnvId(cfg.getEnvId()); + job.setPackageId(cfg.getPackageId()); + job.setPlaybookId(cfg.getPlaybookId()); + job.setCreateTimestamp(System.currentTimeMillis()); + job.setUpdateTimestamp(System.currentTimeMillis()); + job.setCreateUserId(StpUtil.getLoginIdAsString()); + job.setUpdateUserId(StpUtil.getLoginIdAsString()); + job.setStatus(JobConstant.JobStatus.CREATED.getValue()); // save - this.save(entity); + this.save(job); // trace log file path - String saveFileName = entity.getId() + "." + "log"; - File traceLogFile = FileResourceUtil.createFile(resources, entity.getWorkspaceId(), Constants.FileTypeEnum.JOB.getType(), entity.getId(), saveFileName); + String saveFileName = job.getId() + "." + "log"; + File traceLogFile = FileResourceUtil.createFile(resources, job.getWorkspaceId(), Constants.FileTypeEnum.JOB.getType(), job.getId(), saveFileName); this.update(new LambdaUpdateWrapper() .set(JobEntity::getLogPath, traceLogFile.getPath()) - .eq(JobEntity::getId, entity.getId())); - return entity; + .eq(JobEntity::getId, job.getId())); + return job; } @Override @@ -191,60 +200,4 @@ public class JobServiceImpl extends ServiceImpl implements IJ return result; } - -// @Override -// public synchronized JobEntity assignPendingJob(String runnerId, String platform) { -// if (T.StrUtil.hasEmpty(runnerId, platform)) { -// return null; -// } -// // query -// JobEntity job = this.getBaseMapper().getPendingJobByPlatform(platform); -// if (T.ObjectUtil.isNotNull(job)) { -// // update -// this.update(new LambdaUpdateWrapper() -// .set(JobEntity::getRunnerId, runnerId) -// .set(JobEntity::getStatus, RunnerConstant.JobStatus.RUNNING.getValue()) -// .set(JobEntity::getStartTimestamp, System.currentTimeMillis()) -// .eq(JobEntity::getId, job.getId()) -// ); -// } -// return job; -// } -// -// @Override -// public void appendTraceLogStrToFile(String jobId, String content) throws RuntimeException { -// try { -// JobEntity job = this.getById(jobId); -// if (T.StrUtil.isEmpty(job.getLogPath())) { -// File traceLogFile = T.FileUtil.file(this.getJobResultPath(jobId), "trace.log"); -// job.setLogPath(traceLogFile.getPath()); -// } -// // append content -// T.FileUtil.appendString(content, T.FileUtil.file(job.getLogPath()), T.CharsetUtil.CHARSET_UTF_8); -// } catch (IORuntimeException e) { -// log.error(e, "[appendTraceLogStrToFile] [error] [job: {}] [content: {}]", jobId, content); -// throw new RuntimeException(e.getMessage()); -// } -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void updateJobResult(String jobId, String state, MultipartFile pcapFile) { -// String pcapId = T.StrUtil.EMPTY; -// // save pcap file -// if (T.ObjectUtil.isNotNull(pcapFile)) { -// PcapEntity pcapEntity = pcapService.savePcap(jobId, pcapFile.getResource()); -// pcapId = pcapEntity.getId(); -// } -// -// // update job status&pcap_id -// state = T.StrUtil.equals("success", state) ? RunnerConstant.JobStatus.PASSED.getValue() : state; -// this.update(new LambdaUpdateWrapper() -// .set(JobEntity::getStatus, state) -// .set(T.StrUtil.isNotEmpty(pcapId), JobEntity::getPcapId, pcapId) -// .set(JobEntity::getEndTimestamp, System.currentTimeMillis()) -// .eq(JobEntity::getId, jobId) -// ); -// } - } diff --git a/src/main/java/net/geedge/asw/module/runner/service/impl/PcapServiceImpl.java b/src/main/java/net/geedge/asw/module/job/service/impl/PcapServiceImpl.java similarity index 96% rename from src/main/java/net/geedge/asw/module/runner/service/impl/PcapServiceImpl.java rename to src/main/java/net/geedge/asw/module/job/service/impl/PcapServiceImpl.java index ba3dee3..0213ab0 100644 --- a/src/main/java/net/geedge/asw/module/runner/service/impl/PcapServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/job/service/impl/PcapServiceImpl.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.service.impl; +package net.geedge.asw.module.job.service.impl; import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.StpUtil; @@ -20,15 +20,15 @@ import net.geedge.asw.module.environment.entity.EnvironmentEntity; import net.geedge.asw.module.environment.service.IEnvironmentService; import net.geedge.asw.module.feign.client.DashboardClient; import net.geedge.asw.module.feign.client.KibanaClient; -import net.geedge.asw.module.runner.dao.PcapDao; -import net.geedge.asw.module.runner.entity.JobEntity; -import net.geedge.asw.module.runner.entity.PcapEntity; -import net.geedge.asw.module.runner.entity.PlaybookEntity; -import net.geedge.asw.module.runner.service.IJobService; -import net.geedge.asw.module.runner.service.IPcapService; -import net.geedge.asw.module.runner.service.IPlaybookService; -import net.geedge.asw.module.runner.util.PcapParserThread; -import net.geedge.asw.module.runner.util.RunnerConstant; +import net.geedge.asw.module.job.dao.PcapDao; +import net.geedge.asw.module.job.entity.JobEntity; +import net.geedge.asw.module.job.entity.PcapEntity; +import net.geedge.asw.module.job.entity.PlaybookEntity; +import net.geedge.asw.module.job.service.IJobService; +import net.geedge.asw.module.job.service.IPcapService; +import net.geedge.asw.module.job.service.IPlaybookService; +import net.geedge.asw.module.job.util.PcapParserThread; +import net.geedge.asw.module.job.util.JobConstant; import net.geedge.asw.module.sys.entity.SysUserEntity; import net.geedge.asw.module.sys.service.ISysConfigService; import net.geedge.asw.module.sys.service.ISysUserService; @@ -148,7 +148,7 @@ public class PcapServiceImpl extends ServiceImpl implements byte[] bytes = fileResource.getInputStream().readAllBytes(); entity.setSize((long) bytes.length); - entity.setStatus(RunnerConstant.PcapStatus.UPLOADED.getValue()); + entity.setStatus(JobConstant.PcapStatus.UPLOADED.getValue()); entity.setCreateTimestamp(System.currentTimeMillis()); entity.setCreateUserId(createUserId); entity.setWorkspaceId(workspaceId); @@ -270,7 +270,7 @@ public class PcapServiceImpl extends ServiceImpl implements log.error("delete openSearch index error index: {}", indexName); throw new RuntimeException("delete openSearch index error ", e); } - pcapEntity.setStatus(RunnerConstant.PcapStatus.UPLOADED.getValue()); + pcapEntity.setStatus(JobConstant.PcapStatus.UPLOADED.getValue()); // del common pcap file Map summary = T.JSONUtil.toBean(pcapEntity.getSummary(), Map.class); T.FileUtil.del(T.MapUtil.getStr(summary, "commentPath")); diff --git a/src/main/java/net/geedge/asw/module/runner/service/impl/PlaybookServiceImpl.java b/src/main/java/net/geedge/asw/module/job/service/impl/PlaybookServiceImpl.java similarity index 96% rename from src/main/java/net/geedge/asw/module/runner/service/impl/PlaybookServiceImpl.java rename to src/main/java/net/geedge/asw/module/job/service/impl/PlaybookServiceImpl.java index e48ec2c..d1e92f4 100644 --- a/src/main/java/net/geedge/asw/module/runner/service/impl/PlaybookServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/job/service/impl/PlaybookServiceImpl.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.service.impl; +package net.geedge.asw.module.job.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.log.Log; @@ -7,9 +7,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import net.geedge.asw.common.config.Query; import net.geedge.asw.common.util.*; -import net.geedge.asw.module.runner.dao.PlaybookDao; -import net.geedge.asw.module.runner.entity.PlaybookEntity; -import net.geedge.asw.module.runner.service.IPlaybookService; +import net.geedge.asw.module.job.dao.PlaybookDao; +import net.geedge.asw.module.job.entity.PlaybookEntity; +import net.geedge.asw.module.job.service.IPlaybookService; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; diff --git a/src/main/java/net/geedge/asw/module/runner/util/RunnerConstant.java b/src/main/java/net/geedge/asw/module/job/util/JobConstant.java similarity index 91% rename from src/main/java/net/geedge/asw/module/runner/util/RunnerConstant.java rename to src/main/java/net/geedge/asw/module/job/util/JobConstant.java index 10d5d1c..174af6b 100644 --- a/src/main/java/net/geedge/asw/module/runner/util/RunnerConstant.java +++ b/src/main/java/net/geedge/asw/module/job/util/JobConstant.java @@ -1,6 +1,6 @@ -package net.geedge.asw.module.runner.util; +package net.geedge.asw.module.job.util; -public class RunnerConstant { +public class JobConstant { /** diff --git a/src/main/java/net/geedge/asw/module/runner/util/JobQueueManager.java b/src/main/java/net/geedge/asw/module/job/util/JobQueueManager.java similarity index 95% rename from src/main/java/net/geedge/asw/module/runner/util/JobQueueManager.java rename to src/main/java/net/geedge/asw/module/job/util/JobQueueManager.java index a0dd96c..3fd8b3a 100644 --- a/src/main/java/net/geedge/asw/module/runner/util/JobQueueManager.java +++ b/src/main/java/net/geedge/asw/module/job/util/JobQueueManager.java @@ -1,7 +1,7 @@ -package net.geedge.asw.module.runner.util; +package net.geedge.asw.module.job.util; import net.geedge.asw.common.util.T; -import net.geedge.asw.module.runner.entity.JobEntity; +import net.geedge.asw.module.job.entity.JobEntity; import org.springframework.stereotype.Component; import java.util.*; diff --git a/src/main/java/net/geedge/asw/module/runner/util/PcapParserThread.java b/src/main/java/net/geedge/asw/module/job/util/PcapParserThread.java similarity index 98% rename from src/main/java/net/geedge/asw/module/runner/util/PcapParserThread.java rename to src/main/java/net/geedge/asw/module/job/util/PcapParserThread.java index a2ef9d9..dc77664 100644 --- a/src/main/java/net/geedge/asw/module/runner/util/PcapParserThread.java +++ b/src/main/java/net/geedge/asw/module/job/util/PcapParserThread.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.util; +package net.geedge.asw.module.job.util; import cn.hutool.log.Log; import com.alibaba.fastjson2.JSONArray; @@ -12,8 +12,8 @@ import net.geedge.asw.common.util.T; import net.geedge.asw.module.feign.client.GeoipClient; import net.geedge.asw.module.feign.client.PcapCommentClient; import net.geedge.asw.module.feign.client.ZeekClient; -import net.geedge.asw.module.runner.entity.PcapEntity; -import net.geedge.asw.module.runner.service.IPcapService; +import net.geedge.asw.module.job.entity.PcapEntity; +import net.geedge.asw.module.job.service.IPcapService; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.time.StopWatch; import org.opensearch.client.opensearch.OpenSearchClient; @@ -35,7 +35,7 @@ import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; -import static net.geedge.asw.module.runner.util.RunnerConstant.PcapStatus; +import static net.geedge.asw.module.job.util.JobConstant.PcapStatus; @Data public class PcapParserThread implements Runnable { diff --git a/src/main/java/net/geedge/asw/module/runner/util/SignatureExtract.java b/src/main/java/net/geedge/asw/module/job/util/SignatureExtract.java similarity index 99% rename from src/main/java/net/geedge/asw/module/runner/util/SignatureExtract.java rename to src/main/java/net/geedge/asw/module/job/util/SignatureExtract.java index 111dd2a..d87fbcf 100644 --- a/src/main/java/net/geedge/asw/module/runner/util/SignatureExtract.java +++ b/src/main/java/net/geedge/asw/module/job/util/SignatureExtract.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.util; +package net.geedge.asw.module.job.util; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONConfig; diff --git a/src/main/java/net/geedge/asw/module/runner/util/SignatureUtil.java b/src/main/java/net/geedge/asw/module/job/util/SignatureUtil.java similarity index 99% rename from src/main/java/net/geedge/asw/module/runner/util/SignatureUtil.java rename to src/main/java/net/geedge/asw/module/job/util/SignatureUtil.java index a9fdbc3..343824e 100644 --- a/src/main/java/net/geedge/asw/module/runner/util/SignatureUtil.java +++ b/src/main/java/net/geedge/asw/module/job/util/SignatureUtil.java @@ -1,4 +1,4 @@ -package net.geedge.asw.module.runner.util; +package net.geedge.asw.module.job.util; import cn.hutool.log.Log; import lombok.Data; diff --git a/src/main/java/net/geedge/asw/module/runner/controller/RunnerController.java b/src/main/java/net/geedge/asw/module/runner/controller/RunnerController.java deleted file mode 100644 index 2897ef7..0000000 --- a/src/main/java/net/geedge/asw/module/runner/controller/RunnerController.java +++ /dev/null @@ -1,174 +0,0 @@ -//package net.geedge.asw.module.runner.controller; -// -//import cn.dev33.satoken.annotation.SaIgnore; -//import cn.hutool.core.lang.Opt; -//import cn.hutool.log.Log; -//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -//import jakarta.servlet.http.HttpServletResponse; -//import net.geedge.asw.common.util.R; -//import net.geedge.asw.common.util.RCode; -//import net.geedge.asw.common.util.T; -//import net.geedge.asw.module.app.entity.PackageEntity; -//import net.geedge.asw.module.runner.entity.JobEntity; -//import net.geedge.asw.module.runner.entity.PlaybookEntity; -//import net.geedge.asw.module.runner.entity.RunnerEntity; -//import net.geedge.asw.module.runner.service.IJobService; -//import net.geedge.asw.module.runner.service.IRunnerService; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.web.bind.annotation.*; -//import org.springframework.web.multipart.MultipartFile; -// -//import java.io.IOException; -//import java.util.Map; -// -//@RestController -//@RequestMapping("/api/v1/runner") -//public class RunnerController { -// -// private static final Log log = Log.get(); -// -// @Autowired -// private IJobService jobService; -// -// @Autowired -// private IRunnerService runnerService; -// -// @GetMapping("/{id}") -// public R detail(@PathVariable("id") String id) { -// RunnerEntity runnerEntity = runnerService.getById(id); -// return R.ok().putData("record", runnerEntity); -// } -// -// @GetMapping -// public R list(@RequestParam Map params) { -// T.VerifyUtil.is(params).notNull() -// .and(T.MapUtil.getStr(params, "workspaceId")).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY); -// -// Page page = runnerService.queryList(params); -// return R.ok(page); -// } -// -// @PostMapping -// public R add(@RequestBody RunnerEntity entity) { -// T.VerifyUtil.is(entity).notNull() -// .and(entity.getWorkspaceId()).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY); -// -// RunnerEntity runner = runnerService.saveRunner(entity); -// return R.ok().putData("record", runner); -// } -// -// @PutMapping -// public R update(@RequestBody RunnerEntity entity) { -// T.VerifyUtil.is(entity).notNull() -// .and(entity.getId()).notEmpty(RCode.ID_CANNOT_EMPTY) -// .and(entity.getWorkspaceId()).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY); -// -// RunnerEntity runner = runnerService.updateRunner(entity); -// return R.ok().putData("record", runner); -// } -// -// @DeleteMapping("/{id}") -// public R delete(@PathVariable("id") String id) { -// runnerService.removeById(id); -// return R.ok(); -// } -// -// @SaIgnore -// @PostMapping("/register") -// public void register(@RequestHeader("Authorization") String token, HttpServletResponse response) throws IOException { -// RunnerEntity runner = runnerService.getOne(new LambdaUpdateWrapper().eq(RunnerEntity::getToken, token)); -// String status = Opt.ofNullable(runner).map(RunnerEntity::getStatus).orElseGet(() -> null); -// if (!T.StrUtil.equals("online", status)) { -// log.warn("[register] [runner is offline] [token: {}]", token); -// response.sendError(HttpServletResponse.SC_FORBIDDEN, "Runner is offline"); -// } -// } -// -// @SaIgnore -// @PostMapping("/heartbeat") -// public void heartbeat(@RequestHeader("Authorization") String token, @RequestBody Map platformMap, -// HttpServletResponse response) throws IOException { -// RunnerEntity runner = runnerService.getOne(new LambdaUpdateWrapper().eq(RunnerEntity::getToken, token)); -// String status = Opt.ofNullable(runner).map(RunnerEntity::getStatus).orElseGet(() -> null); -// if (!T.StrUtil.equals("online", status)) { -// log.warn("[heartbeat] [runner is offline] [token: {}]", token); -// response.sendError(HttpServletResponse.SC_FORBIDDEN, "Runner is offline"); -// return; -// } -// -// // update last_heartbeat_timestamp -// runnerService.update(new LambdaUpdateWrapper() -// .set(RunnerEntity::getLastHeartbeatTimestamp, System.currentTimeMillis()) -// .eq(RunnerEntity::getId, runner.getId())); -// -// // findjob by platform -// String platform = platformMap.entrySet().stream().filter(entry -> entry.getValue() > 0).findFirst().map(entry -> entry.getKey()).orElseGet(null); -// JobEntity job = jobService.assignPendingJob(runner.getId(), platform); -// if (T.ObjectUtil.isNotNull(job)) { -// // package -// PackageEntity pkg = job.getPkg(); -// Map pkgInfo = T.MapUtil.builder("id", pkg.getId()) -// .put("platform", pkg.getPlatform()) -// .put("identifier", pkg.getIdentifier()) -// .put("version", pkg.getVersion()) -// .build(); -// -// // playbook -// PlaybookEntity playbook = job.getPlaybook(); -// Map pbInfo = T.MapUtil.builder("id", playbook.getId()) -// .put("name", playbook.getName()) -// .build(); -// -// // response job info -// Map responseData = T.MapUtil.builder() -// .put("id", job.getId()) -// .put("pkg", pkgInfo) -// .put("playbook", pbInfo) -// .build(); -// response.setCharacterEncoding("UTF-8"); -// response.setContentType("text/html; charset=UTF-8"); -// response.getWriter().write(T.JSONUtil.toJsonStr(responseData)); -// } -// } -// -// @SaIgnore -// @PutMapping("/trace/{jobId}") -// public void trace(@RequestHeader("Authorization") String token, @PathVariable String jobId, @RequestBody byte[] bytes, -// HttpServletResponse response) throws IOException { -// RunnerEntity runner = runnerService.getOne(new LambdaUpdateWrapper().eq(RunnerEntity::getToken, token)); -// String status = Opt.ofNullable(runner).map(RunnerEntity::getStatus).orElseGet(() -> null); -// if (!T.StrUtil.equals("online", status)) { -// log.warn("[trace] [runner is offline] [token: {}]", token); -// response.sendError(HttpServletResponse.SC_FORBIDDEN, "Runner is offline"); -// return; -// } -// -// try { -// // 追加到文件中 -// String content = T.StrUtil.str(bytes, T.CharsetUtil.CHARSET_UTF_8); -// jobService.appendTraceLogStrToFile(jobId, content); -// } catch (Exception e) { -// log.error("[trace] [error] [job: {}]", jobId); -// response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); -// } -// } -// -// @SaIgnore -// @PutMapping("/jobResult/{jobId}") -// public void jobResult(@RequestHeader("Authorization") String token, @PathVariable String jobId, @RequestParam String state, -// @RequestParam(value = "file", required = false) MultipartFile pcapFile, -// HttpServletResponse response) throws IOException { -// RunnerEntity runner = runnerService.getOne(new LambdaUpdateWrapper().eq(RunnerEntity::getToken, token)); -// String status = Opt.ofNullable(runner).map(RunnerEntity::getStatus).orElseGet(() -> null); -// if (!T.StrUtil.equals("online", status)) { -// log.warn("[trace] [runner is offline] [token: {}]", token); -// response.sendError(HttpServletResponse.SC_FORBIDDEN, "Runner is offline"); -// return; -// } -// -// // 更新任务状态 -// jobService.updateJobResult(jobId, state, pcapFile); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/runner/entity/RunnerEntity.java b/src/main/java/net/geedge/asw/module/runner/entity/RunnerEntity.java deleted file mode 100644 index b6f34ff..0000000 --- a/src/main/java/net/geedge/asw/module/runner/entity/RunnerEntity.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.geedge.asw.module.runner.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("runner") -public class RunnerEntity { - - @TableId(type = IdType.ASSIGN_UUID) - private String id; - private String name; - private String token; - private String tags; - private String supportPlatforms; - private Integer shareFlag; - private String description; - private String status; - private Long lastHeartbeatTimestamp; - - private Long createTimestamp; - private Long updateTimestamp; - private String createUserId; - private String updateUserId; - - private String workspaceId; - -} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/runner/service/IRunnerService.java b/src/main/java/net/geedge/asw/module/runner/service/IRunnerService.java deleted file mode 100644 index e2a6af8..0000000 --- a/src/main/java/net/geedge/asw/module/runner/service/IRunnerService.java +++ /dev/null @@ -1,17 +0,0 @@ -//package net.geedge.asw.module.runner.service; -// -//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -//import com.baomidou.mybatisplus.extension.service.IService; -//import net.geedge.asw.module.runner.entity.RunnerEntity; -// -//import java.util.Map; -// -//public interface IRunnerService extends IService{ -// -// Page queryList(Map params); -// -// RunnerEntity saveRunner(RunnerEntity entity); -// -// RunnerEntity updateRunner(RunnerEntity entity); -// -//} diff --git a/src/main/java/net/geedge/asw/module/runner/service/impl/RunnerServiceImpl.java b/src/main/java/net/geedge/asw/module/runner/service/impl/RunnerServiceImpl.java deleted file mode 100644 index b60aecc..0000000 --- a/src/main/java/net/geedge/asw/module/runner/service/impl/RunnerServiceImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -//package net.geedge.asw.module.runner.service.impl; -// -//import cn.dev33.satoken.stp.StpUtil; -//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -//import net.geedge.asw.common.util.T; -//import net.geedge.asw.module.runner.dao.RunnerDao; -//import net.geedge.asw.module.runner.entity.RunnerEntity; -//import net.geedge.asw.module.runner.service.IRunnerService; -//import org.springframework.stereotype.Service; -// -//import java.util.List; -//import java.util.Map; -// -//@Service -//public class RunnerServiceImpl extends ServiceImpl implements IRunnerService { -// -// @Override -// public Page queryList(Map params) { -// Page page = T.PageUtil.getPage(params); -// List jobList = this.getBaseMapper().queryList(page, params); -// page.setRecords(jobList); -// return page; -// } -// -// @Override -// public RunnerEntity saveRunner(RunnerEntity entity) { -// entity.setCreateTimestamp(System.currentTimeMillis()); -// entity.setUpdateTimestamp(System.currentTimeMillis()); -// entity.setCreateUserId(StpUtil.getLoginIdAsString()); -// entity.setUpdateUserId(StpUtil.getLoginIdAsString()); -// -// // token -// entity.setToken(T.IdUtil.fastSimpleUUID()); -// -// // save -// this.save(entity); -// return entity; -// } -// -// @Override -// public RunnerEntity updateRunner(RunnerEntity entity) { -// entity.setUpdateTimestamp(System.currentTimeMillis()); -// entity.setUpdateUserId(StpUtil.getLoginIdAsString()); -// -// // update -// this.updateById(entity); -// return entity; -// } -// -//} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/sys/entity/SysUserEntity.java b/src/main/java/net/geedge/asw/module/sys/entity/SysUserEntity.java index 413a0b5..e95ac02 100644 --- a/src/main/java/net/geedge/asw/module/sys/entity/SysUserEntity.java +++ b/src/main/java/net/geedge/asw/module/sys/entity/SysUserEntity.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity; @@ -21,6 +22,7 @@ public class SysUserEntity { @TableField("user_name") private String userName; + @JsonIgnore private String pwd; @TableField(exist = false) diff --git a/src/main/resources/db/mapper/runner/JobCfgMapper.xml b/src/main/resources/db/mapper/runner/JobCfgMapper.xml new file mode 100644 index 0000000..f9f936b --- /dev/null +++ b/src/main/resources/db/mapper/runner/JobCfgMapper.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db/mapper/runner/JobMapper.xml b/src/main/resources/db/mapper/runner/JobMapper.xml index f77da42..6ca627b 100644 --- a/src/main/resources/db/mapper/runner/JobMapper.xml +++ b/src/main/resources/db/mapper/runner/JobMapper.xml @@ -1,10 +1,11 @@ - + - + + @@ -32,7 +33,22 @@ - + + + + + + + + + + + + + + + + @@ -51,6 +67,15 @@ env.id AS em_id, env.name AS em_name, + jc.id AS jc_id, + jc.name AS jc_name, + + ws.id AS ws_id, + ws.name AS ws_name, + + su.id AS cu_id, + su.name AS cu_name, + pb.id AS pb_id, pb.name AS pb_name FROM @@ -58,6 +83,9 @@ LEFT JOIN environment env ON job.env_id = env.id LEFT JOIN package pkg ON job.package_id = pkg.id LEFT JOIN playbook pb ON job.playbook_id = pb.id + LEFT JOIN job_cfg jc ON job.job_cfg_id = jc.id + LEFT JOIN workspace ws ON job.workspace_id = ws.id + LEFT JOIN sys_user su ON job.create_user_id = su.id job.id in @@ -74,6 +102,11 @@ #{id} + + AND jc.id in + #{id} + + AND pb.id in #{id} diff --git a/src/main/resources/db/mapper/runner/PcapMapper.xml b/src/main/resources/db/mapper/runner/PcapMapper.xml index b4a56f6..c734f1b 100644 --- a/src/main/resources/db/mapper/runner/PcapMapper.xml +++ b/src/main/resources/db/mapper/runner/PcapMapper.xml @@ -1,9 +1,9 @@ - + - + @@ -29,7 +29,7 @@ - + diff --git a/src/main/resources/db/mapper/runner/PlaybookMapper.xml b/src/main/resources/db/mapper/runner/PlaybookMapper.xml index ed0948c..28dab25 100644 --- a/src/main/resources/db/mapper/runner/PlaybookMapper.xml +++ b/src/main/resources/db/mapper/runner/PlaybookMapper.xml @@ -1,8 +1,8 @@ - + - + diff --git a/src/main/resources/db/mapper/runner/RunnerMapper.xml b/src/main/resources/db/mapper/runner/RunnerMapper.xml deleted file mode 100644 index 56acce5..0000000 --- a/src/main/resources/db/mapper/runner/RunnerMapper.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql b/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql index 39eb000..3be41a0 100644 --- a/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql +++ b/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql @@ -202,6 +202,7 @@ CREATE TABLE `playbook` ( DROP TABLE IF EXISTS `job`; CREATE TABLE `job` ( `id` varchar(64) NOT NULL COMMENT '主键', + `job_cfg_id` varchar(64) NOT NULL DEFAULT '' COMMENT '任务配置ID', `playbook_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'Playbook ID', `package_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'Package ID', `env_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'env ID', @@ -223,6 +224,31 @@ CREATE TABLE `job` ( KEY `idx_workspace_id` (`workspace_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/** + * 新增 job_cfg 表 + */ +DROP TABLE IF EXISTS `job_cfg`; +CREATE TABLE `job_cfg` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '名称', + `description` TEXT NOT NULL DEFAULT '' COMMENT '描述信息 ', + `package_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'Package ID', + `env_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'env ID', + `playbook_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'playbook ID', + `type` varchar(64) NOT NULL DEFAULT '' COMMENT '任务类型:可选值:asap,cron', + `cron` varchar(64) NOT NULL DEFAULT '' COMMENT 'cron表达式,当 type = cron 时不能为空', + `status` varchar(64) NOT NULL DEFAULT '' COMMENT '状态:当 type = cron 时有效 可选值: enabled,disabled', + `parameters` TEXT NOT NULL DEFAULT '' COMMENT '运行参数', + `create_timestamp` bigint(20) NOT NULL COMMENT '创建时间戳', + `update_timestamp` bigint(20) NOT NULL COMMENT '更新时间戳', + `create_user_id` varchar(64) NOT NULL COMMENT '创建人', + `update_user_id` varchar(64) NOT NULL COMMENT '更新人', + `workspace_id` varchar(64) NOT NULL DEFAULT '' COMMENT '工作空间ID', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_name` (`name`) USING BTREE, + KEY `idx_type` (`type`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + /** * 新增 pcap 表 */