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 6308e8a..03a85ae 100644 --- a/src/main/java/net/geedge/asw/common/util/RCode.java +++ b/src/main/java/net/geedge/asw/common/util/RCode.java @@ -19,6 +19,22 @@ public enum RCode { USER_NO_LOGIN(100007, "user not login"), // 用户未登录 SYS_RECORD_NOT_FOUND(100008, "record not found"),// 未找到记录 + + // Application + APP_ID_CANNOT_EMPTY(201001, "application id cannot be empty"), + + + // Package + PACKAGE_ID_CANNOT_EMPTY(202001, "package id cannot be empty"), + + + // Runner + RUNNER_ID_CANNOT_EMPTY(301001, "runner id cannot be empty"), + + + // Playbook + PLAYBOOK_ID_CANNOT_EMPTY(302001, "playbook id cannot be empty"), + SUCCESS(200, "success"); // 成功 private RCode(Integer code, String msg) { diff --git a/src/main/java/net/geedge/asw/module/app/dao/ApplicationDao.java b/src/main/java/net/geedge/asw/module/app/dao/ApplicationDao.java new file mode 100644 index 0000000..8e85f33 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/dao/ApplicationDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.app.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.app.entity.ApplicationEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ApplicationDao extends BaseMapper{ + +} diff --git a/src/main/java/net/geedge/asw/module/app/dao/PackageDao.java b/src/main/java/net/geedge/asw/module/app/dao/PackageDao.java new file mode 100644 index 0000000..b5ec9cd --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/dao/PackageDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.app.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.app.entity.PackageEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PackageDao extends BaseMapper{ + +} diff --git a/src/main/java/net/geedge/asw/module/app/entity/ApplicationEntity.java b/src/main/java/net/geedge/asw/module/app/entity/ApplicationEntity.java new file mode 100644 index 0000000..a2c2186 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/entity/ApplicationEntity.java @@ -0,0 +1,25 @@ +package net.geedge.asw.module.app.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("application") +public class ApplicationEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String name; + private String longName; + private String properties; + private String description; + private String surrogates; + + private Long createTimestamp; + private Long updateTimestamp; + private String createUserId; + private String updateUserId; + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/app/entity/PackageEntity.java b/src/main/java/net/geedge/asw/module/app/entity/PackageEntity.java new file mode 100644 index 0000000..21a692f --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/entity/PackageEntity.java @@ -0,0 +1,25 @@ +package net.geedge.asw.module.app.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("package") +public class PackageEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String logo; + private String description; + private String platform; + private String version; + private String identifier; + + private Long createTimestamp; + private Long updateTimestamp; + private String createUserId; + private String updateUserId; + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/app/service/IApplicationService.java b/src/main/java/net/geedge/asw/module/app/service/IApplicationService.java new file mode 100644 index 0000000..05d29cd --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/service/IApplicationService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.app.entity.ApplicationEntity; + +public interface IApplicationService extends IService{ + +} diff --git a/src/main/java/net/geedge/asw/module/app/service/IPackageService.java b/src/main/java/net/geedge/asw/module/app/service/IPackageService.java new file mode 100644 index 0000000..5a874e8 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/service/IPackageService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.app.entity.PackageEntity; + +public interface IPackageService extends IService{ + +} diff --git a/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationServiceImpl.java b/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationServiceImpl.java new file mode 100644 index 0000000..91a1d71 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.app.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.module.app.dao.ApplicationDao; +import net.geedge.asw.module.app.entity.ApplicationEntity; +import net.geedge.asw.module.app.service.IApplicationService; +import org.springframework.stereotype.Service; + +@Service +public class ApplicationServiceImpl extends ServiceImpl implements IApplicationService { + + +} 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 new file mode 100644 index 0000000..05fa333 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/service/impl/PackageServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.app.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.module.app.dao.PackageDao; +import net.geedge.asw.module.app.entity.PackageEntity; +import net.geedge.asw.module.app.service.IPackageService; +import org.springframework.stereotype.Service; + +@Service +public class PackageServiceImpl extends ServiceImpl implements IPackageService { + + +} diff --git a/src/main/java/net/geedge/asw/module/runner/controller/JobController.java b/src/main/java/net/geedge/asw/module/runner/controller/JobController.java new file mode 100644 index 0000000..7c2cbb9 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/controller/JobController.java @@ -0,0 +1,64 @@ +package net.geedge.asw.module.runner.controller; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.runner.entity.JobEntity; +import net.geedge.asw.module.runner.service.IJobService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequestMapping("/api/v1/job") +public class JobController { + + @Autowired + private IJobService jobService; + + @GetMapping("/{id}") + public R detail(@PathVariable("id") String id) { + JobEntity jobEntity = jobService.queryInfo(id); + return R.ok().putData("record", jobEntity); + } + + @GetMapping + public R list(@RequestParam Map params) { + Page page = jobService.queryList(params); + return R.ok(page); + } + + @PostMapping + public R add(@RequestBody JobEntity entity) { + T.VerifyUtil.is(entity).notNull() + .and(entity.getRunnerId()).notNull(RCode.RUNNER_ID_CANNOT_EMPTY) + .and(entity.getPackageId()).notNull(RCode.PACKAGE_ID_CANNOT_EMPTY) + .and(entity.getPlaybookId()).notNull(RCode.PLAYBOOK_ID_CANNOT_EMPTY); + + JobEntity jobEntity = jobService.saveJob(entity); + return R.ok().putData("id", jobEntity.getId()); + } + + @DeleteMapping + public R delete(String[] ids) { + T.VerifyUtil.is(ids).notEmpty(); + jobService.removeJob(T.ListUtil.of(ids)); + return R.ok(); + } + + @PutMapping("/cancel") + public R cancel(String[] ids) { + // TODO 其他处理 + + // update state + jobService.update(new LambdaUpdateWrapper() + .in(JobEntity::getId, ids) + .set(JobEntity::getStatus, "cancel") + ); + return R.ok(); + } + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/runner/dao/JobDao.java b/src/main/java/net/geedge/asw/module/runner/dao/JobDao.java new file mode 100644 index 0000000..4da581e --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/dao/JobDao.java @@ -0,0 +1,16 @@ +package net.geedge.asw.module.runner.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import net.geedge.asw.module.runner.entity.JobEntity; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface JobDao extends BaseMapper{ + + List queryList(IPage page, Map params); + +} diff --git a/src/main/java/net/geedge/asw/module/runner/dao/PcapDao.java b/src/main/java/net/geedge/asw/module/runner/dao/PcapDao.java new file mode 100644 index 0000000..ef1b878 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/dao/PcapDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.runner.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.runner.entity.PcapEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PcapDao extends BaseMapper{ + +} diff --git a/src/main/java/net/geedge/asw/module/runner/dao/PlaybookDao.java b/src/main/java/net/geedge/asw/module/runner/dao/PlaybookDao.java new file mode 100644 index 0000000..0ee8531 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/dao/PlaybookDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.runner.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.runner.entity.PlaybookEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PlaybookDao extends BaseMapper{ + +} diff --git a/src/main/java/net/geedge/asw/module/runner/dao/RunnerDao.java b/src/main/java/net/geedge/asw/module/runner/dao/RunnerDao.java new file mode 100644 index 0000000..be61ee0 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/dao/RunnerDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.runner.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.runner.entity.RunnerEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RunnerDao extends BaseMapper{ + +} diff --git a/src/main/java/net/geedge/asw/module/runner/entity/JobEntity.java b/src/main/java/net/geedge/asw/module/runner/entity/JobEntity.java new file mode 100644 index 0000000..1bc13d9 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/entity/JobEntity.java @@ -0,0 +1,51 @@ +package net.geedge.asw.module.runner.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.ApplicationEntity; +import net.geedge.asw.module.app.entity.PackageEntity; + +@Data +@TableName("job") +public class JobEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String playbookId; + private String packageId; + private String runnerId; + private String scheduleId; + private String signatureIds; + private String tags; + private Long startTimestamp; + private Long endTimestamp; + private String status; + private String pcapId; + private String logPath; + + private Long createTimestamp; + private Long updateTimestamp; + private String createUserId; + private String updateUserId; + + @TableField(exist = false) + private String workbookId; + + @TableField(exist = false) + private ApplicationEntity application; + + @TableField(exist = false) + @JsonProperty(value = "package") + private PackageEntity pkg; + + @TableField(exist = false) + private RunnerEntity runner; + + @TableField(exist = false) + private PlaybookEntity playbook; + +} \ 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/runner/entity/PcapEntity.java new file mode 100644 index 0000000..230519e --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/entity/PcapEntity.java @@ -0,0 +1,21 @@ +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("pcap") +public class PcapEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String tags; + private String description; + private String path; + + private Long createTimestamp; + private String createUserId; + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/runner/entity/PlaybookEntity.java b/src/main/java/net/geedge/asw/module/runner/entity/PlaybookEntity.java new file mode 100644 index 0000000..2d63be8 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/entity/PlaybookEntity.java @@ -0,0 +1,25 @@ +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("playbook") +public class PlaybookEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String name; + private String appId; + private String tags; + private String script; + private String opVersion; + + private Long createTimestamp; + private Long updateTimestamp; + private String createUserId; + private String updateUserId; + +} \ 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 new file mode 100644 index 0000000..0f74660 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/entity/RunnerEntity.java @@ -0,0 +1,27 @@ +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 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; + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/runner/service/IJobService.java b/src/main/java/net/geedge/asw/module/runner/service/IJobService.java new file mode 100644 index 0000000..3c04248 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/IJobService.java @@ -0,0 +1,20 @@ +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.JobEntity; + +import java.util.List; +import java.util.Map; + +public interface IJobService extends IService{ + + JobEntity queryInfo(String id); + + Page queryList(Map params); + + JobEntity saveJob(JobEntity entity); + + void removeJob(List ids); + +} diff --git a/src/main/java/net/geedge/asw/module/runner/service/IPcapService.java b/src/main/java/net/geedge/asw/module/runner/service/IPcapService.java new file mode 100644 index 0000000..0e595d2 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/IPcapService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.runner.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.runner.entity.PcapEntity; + +public interface IPcapService extends IService{ + +} diff --git a/src/main/java/net/geedge/asw/module/runner/service/IPlaybookService.java b/src/main/java/net/geedge/asw/module/runner/service/IPlaybookService.java new file mode 100644 index 0000000..c96ffde --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/IPlaybookService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.runner.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.runner.entity.PlaybookEntity; + +public interface IPlaybookService extends IService{ + +} 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 new file mode 100644 index 0000000..ba190d7 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/IRunnerService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.runner.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.runner.entity.RunnerEntity; + +public interface IRunnerService extends IService{ + +} diff --git a/src/main/java/net/geedge/asw/module/runner/service/impl/JobServiceImpl.java b/src/main/java/net/geedge/asw/module/runner/service/impl/JobServiceImpl.java new file mode 100644 index 0000000..2cd4241 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/impl/JobServiceImpl.java @@ -0,0 +1,115 @@ +package net.geedge.asw.module.runner.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.util.RCode; +import net.geedge.asw.common.util.T; +import net.geedge.asw.module.app.entity.ApplicationEntity; +import net.geedge.asw.module.app.entity.PackageEntity; +import net.geedge.asw.module.app.service.IApplicationService; +import net.geedge.asw.module.app.service.IPackageService; +import net.geedge.asw.module.runner.dao.JobDao; +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.IPlaybookService; +import net.geedge.asw.module.runner.service.IRunnerService; +import net.geedge.asw.module.workbook.entity.WorkbookResourceEntity; +import net.geedge.asw.module.workbook.service.IWorkbookResourceService; +import net.geedge.asw.module.workbook.util.WorkbookConstant; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +@Service +public class JobServiceImpl extends ServiceImpl implements IJobService { + + @Autowired + private IRunnerService runnerService; + + @Autowired + private IPlaybookService playbookService; + + @Autowired + private IPackageService packageService; + + @Autowired + private IApplicationService applicationService; + + @Autowired + private IWorkbookResourceService workbookResourceService; + + @Override + public JobEntity queryInfo(String id) { + JobEntity job = this.getById(id); + T.VerifyUtil.is(job).notNull(RCode.SYS_RECORD_NOT_FOUND); + + RunnerEntity runner = runnerService.getById(job.getRunnerId()); + job.setRunner(runner); + + PlaybookEntity playbook = playbookService.getById(job.getPlaybookId()); + job.setPlaybook(playbook); + + PackageEntity pkg = packageService.getById(job.getPackageId()); + job.setPkg(pkg); + + if (T.ObjectUtil.isNotNull(playbook)) { + ApplicationEntity application = applicationService.getById(playbook.getAppId()); + job.setApplication(application); + } + return job; + } + + @Override + public Page queryList(Map params) { + Integer current = T.MapUtil.getInt(params, "current", 1); + Integer size = T.MapUtil.getInt(params, "size", 20); + String orderBy = T.MapUtil.getStr(params, "orderBy", "id"); + Page page = Page.of(current, size); + page.addOrder(T.PageUtil.decodeOrderByStr(orderBy)); + + List jobList = this.getBaseMapper().queryList(page, params); + page.setRecords(jobList); + return page; + } + + @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()); + + // save + this.save(entity); + + // workbook resource + if (T.ObjectUtil.isNotEmpty(entity.getWorkbookId())) { + WorkbookResourceEntity res = new WorkbookResourceEntity(); + res.setWorkbookId(entity.getWorkbookId()); + res.setResourceType(WorkbookConstant.ResourceType.JOB.getValue()); + res.setResourceId(entity.getId()); + workbookResourceService.save(res); + } + return entity; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void removeJob(List ids) { + // remove + this.removeBatchByIds(ids); + // workbook resource + workbookResourceService.remove(new LambdaQueryWrapper() + .eq(WorkbookResourceEntity::getResourceType, WorkbookConstant.ResourceType.JOB.getValue()) + .in(WorkbookResourceEntity::getResourceId, ids)); + } + +} diff --git a/src/main/java/net/geedge/asw/module/runner/service/impl/PcapServiceImpl.java b/src/main/java/net/geedge/asw/module/runner/service/impl/PcapServiceImpl.java new file mode 100644 index 0000000..1b47eaf --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/impl/PcapServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.runner.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.module.runner.dao.PcapDao; +import net.geedge.asw.module.runner.entity.PcapEntity; +import net.geedge.asw.module.runner.service.IPcapService; +import org.springframework.stereotype.Service; + +@Service +public class PcapServiceImpl extends ServiceImpl implements IPcapService { + + +} diff --git a/src/main/java/net/geedge/asw/module/runner/service/impl/PlaybookServiceImpl.java b/src/main/java/net/geedge/asw/module/runner/service/impl/PlaybookServiceImpl.java new file mode 100644 index 0000000..1c3d8b9 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/impl/PlaybookServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.runner.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +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 org.springframework.stereotype.Service; + +@Service +public class PlaybookServiceImpl extends ServiceImpl implements IPlaybookService { + + +} 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 new file mode 100644 index 0000000..06ee7c3 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/impl/RunnerServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.runner.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +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; + +@Service +public class RunnerServiceImpl extends ServiceImpl implements IRunnerService { + + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/dao/WorkbookDao.java b/src/main/java/net/geedge/asw/module/workbook/dao/WorkbookDao.java new file mode 100644 index 0000000..fe77604 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/dao/WorkbookDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.workbook.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.workbook.entity.WorkbookEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WorkbookDao extends BaseMapper{ + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/dao/WorkbookMemberDao.java b/src/main/java/net/geedge/asw/module/workbook/dao/WorkbookMemberDao.java new file mode 100644 index 0000000..ba7a3ec --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/dao/WorkbookMemberDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.workbook.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.workbook.entity.WorkbookMemberEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WorkbookMemberDao extends BaseMapper{ + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/dao/WorkbookResourceDao.java b/src/main/java/net/geedge/asw/module/workbook/dao/WorkbookResourceDao.java new file mode 100644 index 0000000..9f10bbe --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/dao/WorkbookResourceDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.workbook.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.workbook.entity.WorkbookResourceEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WorkbookResourceDao extends BaseMapper{ + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/entity/WorkbookEntity.java b/src/main/java/net/geedge/asw/module/workbook/entity/WorkbookEntity.java new file mode 100644 index 0000000..4552aaa --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/entity/WorkbookEntity.java @@ -0,0 +1,24 @@ +package net.geedge.asw.module.workbook.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("workbook") +public class WorkbookEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String name; + private String tags; + private String visibility; + private String description; + + private Long createTimestamp; + private Long updateTimestamp; + private String createUserId; + private String updateUserId; + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workbook/entity/WorkbookMemberEntity.java b/src/main/java/net/geedge/asw/module/workbook/entity/WorkbookMemberEntity.java new file mode 100644 index 0000000..6bbef85 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/entity/WorkbookMemberEntity.java @@ -0,0 +1,19 @@ +package net.geedge.asw.module.workbook.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("workbook_member") +public class WorkbookMemberEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String workbookId; + private String userId; + + private Long createTimestamp; + private String createUserId; + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workbook/entity/WorkbookResourceEntity.java b/src/main/java/net/geedge/asw/module/workbook/entity/WorkbookResourceEntity.java new file mode 100644 index 0000000..97c61fd --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/entity/WorkbookResourceEntity.java @@ -0,0 +1,18 @@ +package net.geedge.asw.module.workbook.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("workbook_resource") +public class WorkbookResourceEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String workbookId; + private String resourceType; + private String resourceId; + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookMemberService.java b/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookMemberService.java new file mode 100644 index 0000000..729f780 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookMemberService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.workbook.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.workbook.entity.WorkbookMemberEntity; + +public interface IWorkbookMemberService extends IService{ + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookResourceService.java b/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookResourceService.java new file mode 100644 index 0000000..b60b6da --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookResourceService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.workbook.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.workbook.entity.WorkbookResourceEntity; + +public interface IWorkbookResourceService extends IService{ + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookService.java b/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookService.java new file mode 100644 index 0000000..86d5b80 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.workbook.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.workbook.entity.WorkbookEntity; + +public interface IWorkbookService extends IService{ + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/service/impl/WorkbookMemberServiceImpl.java b/src/main/java/net/geedge/asw/module/workbook/service/impl/WorkbookMemberServiceImpl.java new file mode 100644 index 0000000..c451297 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/service/impl/WorkbookMemberServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.workbook.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.module.workbook.dao.WorkbookMemberDao; +import net.geedge.asw.module.workbook.entity.WorkbookMemberEntity; +import net.geedge.asw.module.workbook.service.IWorkbookMemberService; +import org.springframework.stereotype.Service; + +@Service +public class WorkbookMemberServiceImpl extends ServiceImpl implements IWorkbookMemberService { + + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/service/impl/WorkbookResourceServiceImpl.java b/src/main/java/net/geedge/asw/module/workbook/service/impl/WorkbookResourceServiceImpl.java new file mode 100644 index 0000000..6641b72 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/service/impl/WorkbookResourceServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.workbook.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.module.workbook.dao.WorkbookResourceDao; +import net.geedge.asw.module.workbook.entity.WorkbookResourceEntity; +import net.geedge.asw.module.workbook.service.IWorkbookResourceService; +import org.springframework.stereotype.Service; + +@Service +public class WorkbookResourceServiceImpl extends ServiceImpl implements IWorkbookResourceService { + + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/service/impl/WorkbookServiceImpl.java b/src/main/java/net/geedge/asw/module/workbook/service/impl/WorkbookServiceImpl.java new file mode 100644 index 0000000..cd63986 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/service/impl/WorkbookServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.workbook.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.module.workbook.dao.WorkbookDao; +import net.geedge.asw.module.workbook.entity.WorkbookEntity; +import net.geedge.asw.module.workbook.service.IWorkbookService; +import org.springframework.stereotype.Service; + +@Service +public class WorkbookServiceImpl extends ServiceImpl implements IWorkbookService { + + +} diff --git a/src/main/java/net/geedge/asw/module/workbook/util/WorkbookConstant.java b/src/main/java/net/geedge/asw/module/workbook/util/WorkbookConstant.java new file mode 100644 index 0000000..fa11cf0 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workbook/util/WorkbookConstant.java @@ -0,0 +1,42 @@ +package net.geedge.asw.module.workbook.util; + +import cn.hutool.core.util.StrUtil; + +public class WorkbookConstant { + + + /** + * resource type + */ + public enum ResourceType { + PACKAGE("package"), + SIGNATURE("signature"), + JOB("job"), + PCAP("pcap"), + DECODE_RECORD("decode_record"); + + private String value; + + ResourceType(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static ResourceType getInstanceByType(String type) { + for (ResourceType v : values()) { + if (StrUtil.equalsIgnoreCase(v.getValue(), type)) { + return v; + } + } + throw new IllegalArgumentException("Failed to find resource type with parameter."); + } + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1300f30..a4a79ad 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -51,7 +51,7 @@ server: mime-types: text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml mybatis-plus: - mapper-locations: classpath:db/mapper/*Mapper.xml + mapper-locations: classpath:db/mapper/**/*Mapper.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: diff --git a/src/main/resources/db/mapper/runner/JobMapper.xml b/src/main/resources/db/mapper/runner/JobMapper.xml new file mode 100644 index 0000000..73d1818 --- /dev/null +++ b/src/main/resources/db/mapper/runner/JobMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db/migration/R__AZ_sys_i18n.sql b/src/main/resources/db/migration/R__AZ_sys_i18n.sql index 1243b1a..26d72a6 100644 --- a/src/main/resources/db/migration/R__AZ_sys_i18n.sql +++ b/src/main/resources/db/migration/R__AZ_sys_i18n.sql @@ -39,6 +39,14 @@ INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_ INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (35, '100008', 'SYS_RECORD_NOT_FOUND', '找不到记录', 'zh', '', 'admin', 1719280800000); INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (37, '200', 'SUCCESS', 'success', 'en', '', 'admin', 1719280800000); INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (39, '200', 'SUCCESS', '成功', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (41, '201001', 'APP_ID_CANNOT_EMPTY', 'application id cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (43, '201001', 'APP_ID_CANNOT_EMPTY', '应用ID不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (45, '202001', 'PACKAGE_ID_CANNOT_EMPTY', 'package id cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (47, '202001', 'PACKAGE_ID_CANNOT_EMPTY', '安装包ID不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (49, '301001', 'RUNNER_ID_CANNOT_EMPTY', 'runner id cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (51, '301001', 'RUNNER_ID_CANNOT_EMPTY', 'Runner ID不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (53, '302001', 'PLAYBOOK_ID_CANNOT_EMPTY', 'playbook id cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (55, '302001', 'PLAYBOOK_ID_CANNOT_EMPTY', '任务信息ID不能为空', 'zh', '', 'admin', 1719280800000); SET FOREIGN_KEY_CHECKS = 1; 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 fb2a4c6..bdc2043 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 @@ -132,4 +132,165 @@ CREATE TABLE `sys_file_content` ( `id` varchar(64) NOT NULL, `content` longblob NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/** + * 新增 job 表 + */ +DROP TABLE IF EXISTS `job`; +CREATE TABLE `job` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `playbook_id` varchar(64) NOT NULL COMMENT 'Playbook ID', + `package_id` varchar(64) NOT NULL COMMENT 'Package ID', + `runner_id` varchar(64) NOT NULL COMMENT 'Runner ID', + `schedule_id` varchar(64) NOT NULL COMMENT '定时器ID', + `signature_ids` text NOT NULL COMMENT '特征ID,多个逗号分隔', + `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签; 默认:"";多个用逗号分隔;例:kz,vpn,android', + `start_timestamp` bigint(20) NOT NULL COMMENT '开始时间戳', + `end_timestamp` bigint(20) NOT NULL COMMENT '结束时间戳', + `status` varchar(64) NOT NULL COMMENT '状态; 可选值: created,pending,running,passed,failed,cancel', + `pcap_id` varchar(64) NOT NULL COMMENT 'PCAP ID', + `log_path` varchar(256) NOT NULL 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 '更新人', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_playbook_id` (`playbook_id`) USING BTREE, + KEY `idx_package_id` (`package_id`) USING BTREE, + KEY `idx_runner_id` (`runner_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/** + * 新增 playbook 表 + */ +DROP TABLE IF EXISTS `playbook`; +CREATE TABLE `playbook` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `name` varchar(256) NOT NULL COMMENT '名称', + `app_id` varchar(64) NOT NULL COMMENT '应用程序 ID', + `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签', + `script` text NOT NULL COMMENT '脚本内容', + `op_version` bigint(20) NOT NULL COMMENT '更新版本号, 默认:1;每次更新递增', + `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 '更新人', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_name` (`name`) USING BTREE, + KEY `idx_app_id` (`app_id`) USING BTREE, + KEY `idx_op_version` (`op_version`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/** + * 新增 pcap 表 + */ +DROP TABLE IF EXISTS `pcap`; +CREATE TABLE `pcap` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签', + `description` text NOT NULL COMMENT '描述信息', + `path` varchar(64) NOT NULL COMMENT 'PCAP文件路径', + `create_timestamp` bigint(20) NOT NULL COMMENT '创建时间戳', + `create_user_id` varchar(64) NOT NULL COMMENT '创建人', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_tags` (`tags`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +/** + * 新增 application 表 + */ +DROP TABLE IF EXISTS `application`; +CREATE TABLE `application` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `name` varchar(256) NOT NULL COMMENT '应用名称', + `long_name` varchar(256) NOT NULL COMMENT '应用全称', + `properties` text NOT NULL COMMENT '应用数据', + `description` text NOT NULL COMMENT '描述信息', + `surrogates` text NOT NULL 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 '更新人', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_name` (`name`) USING BTREE, + KEY `idx_long_name` (`long_name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/** + * 新增 package 表 + */ +DROP TABLE IF EXISTS `package`; +CREATE TABLE `package` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `logo` varchar(512) NOT NULL COMMENT '图标,图标文件 url 地址', + `description` text NOT NULL COMMENT '描述信息', + `platform` varchar(256) NOT NULL COMMENT '操作系统; 可选值:android,ios,windows,linux', + `version` varchar(256) NOT NULL COMMENT '安装包版本', + `identifier` varchar(256) NOT NULL COMMENT '唯一标识;android:package name,ios:bundle id', + `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 '更新人', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_version` (`version`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/** + * 新增 runner 表 + */ +DROP TABLE IF EXISTS `runner`; +CREATE TABLE `runner` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `name` varchar(256) NOT NULL COMMENT '名称', + `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签,多个逗号分隔', + `support_platforms` varchar(256) NOT NULL COMMENT '支持的平台; 可选值:android,ios,windows; 多个逗号分隔; 例:android,ios', + `share_flag` int(1) NOT NULL COMMENT '共享标识; 1:共享 0:不共享,仅创建人可用', + `description` text NOT NULL COMMENT '描述信息', + `status` varchar(64) NOT NULL COMMENT '状态;可选值:online,offline', + `last_heartbeat_timestamp` bigint(20) NOT NULL 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 '更新人', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_name` (`name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +/** + * 新增 workbook,workbook_member,workbook_resource 表 + */ +DROP TABLE IF EXISTS `workbook`; +CREATE TABLE `workbook` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `name` varchar(256) NOT NULL COMMENT '名称', + `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签,多个逗号分隔', + `visibility` varchar(16) NOT NULL DEFAULT 'private' COMMENT '可见程度,可选值:private,public 默认:private', + `description` text NOT NULL 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 '更新人', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_name` (`name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +DROP TABLE IF EXISTS `workbook_member`; +CREATE TABLE `workbook_member` ( + `workbook_id` varchar(64) NOT NULL COMMENT '主键', + `user_id` varchar(64) NOT NULL COMMENT 'user ID', + `create_timestamp` bigint(20) NOT NULL COMMENT '创建时间戳', + `create_user_id` varchar(64) NOT NULL COMMENT '创建人', + PRIMARY KEY (`workbook_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +DROP TABLE IF EXISTS `workbook_resource`; +CREATE TABLE `workbook_resource` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `workbook_id` varchar(64) NOT NULL COMMENT 'workbook ID', + `resource_type` varchar(64) NOT NULL COMMENT '资源类型 可选值:package,signature,job,pcap,decode_record', + `resource_id` varchar(64) NOT NULL COMMENT '资源id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;