From 5a4c15b00aef8968ec17ad1727834a9d3675825f Mon Sep 17 00:00:00 2001 From: shizhendong Date: Fri, 12 Jul 2024 14:27:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ASW-7=20=E6=96=B0=E5=A2=9E=20Package=20?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../net/geedge/asw/common/util/RCode.java | 5 + .../java/net/geedge/asw/common/util/T.java | 56 +++-- .../app/controller/PackageController.java | 65 ++++++ .../geedge/asw/module/app/dao/PackageDao.java | 6 + .../asw/module/app/dao/SignatureDao.java | 10 + .../module/app/entity/ApplicationEntity.java | 2 + .../asw/module/app/entity/PackageEntity.java | 7 + .../module/app/entity/SignatureEntity.java | 29 +++ .../module/app/service/IPackageService.java | 11 + .../module/app/service/ISignatureService.java | 8 + .../app/service/impl/PackageServiceImpl.java | 77 +++++++ .../service/impl/SignatureServiceImpl.java | 13 ++ .../runner/controller/JobController.java | 9 +- .../module/runner/dao/DecodeRecordDao.java | 10 + .../runner/entity/DecodeRecordEntity.java | 19 ++ .../asw/module/runner/entity/JobEntity.java | 2 + .../asw/module/runner/entity/PcapEntity.java | 11 +- .../module/runner/entity/PlaybookEntity.java | 4 +- .../module/runner/entity/RunnerEntity.java | 2 + .../runner/service/IDecodeRecordService.java | 8 + .../service/impl/DecodeRecordServiceImpl.java | 13 ++ .../runner/service/impl/JobServiceImpl.java | 21 +- .../service/IWorkbookResourceService.java | 6 + .../impl/WorkbookResourceServiceImpl.java | 37 ++++ .../module/workspace/dao/WorkspaceDao.java | 10 + .../workspace/dao/WorkspaceMemberDao.java | 10 + .../workspace/entity/WorkspaceEntity.java | 26 +++ .../entity/WorkspaceMemberEntity.java | 17 ++ .../service/IWorkspaceMemberService.java | 8 + .../workspace/service/IWorkspaceService.java | 8 + .../impl/WorkspaceMemberServiceImpl.java | 13 ++ .../service/impl/WorkspaceServiceImpl.java | 13 ++ .../resources/db/mapper/app/PackageMapper.xml | 41 ++++ .../resources/db/mapper/runner/JobMapper.xml | 14 ++ .../resources/db/migration/R__AZ_sys_i18n.sql | 4 + .../db/migration/V1.0.01__INIT_TABLES.sql | 201 +++++++++++++----- 36 files changed, 700 insertions(+), 96 deletions(-) create mode 100644 src/main/java/net/geedge/asw/module/app/controller/PackageController.java create mode 100644 src/main/java/net/geedge/asw/module/app/dao/SignatureDao.java create mode 100644 src/main/java/net/geedge/asw/module/app/entity/SignatureEntity.java create mode 100644 src/main/java/net/geedge/asw/module/app/service/ISignatureService.java create mode 100644 src/main/java/net/geedge/asw/module/app/service/impl/SignatureServiceImpl.java create mode 100644 src/main/java/net/geedge/asw/module/runner/dao/DecodeRecordDao.java create mode 100644 src/main/java/net/geedge/asw/module/runner/entity/DecodeRecordEntity.java create mode 100644 src/main/java/net/geedge/asw/module/runner/service/IDecodeRecordService.java create mode 100644 src/main/java/net/geedge/asw/module/runner/service/impl/DecodeRecordServiceImpl.java create mode 100644 src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java create mode 100644 src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java create mode 100644 src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java create mode 100644 src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java create mode 100644 src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java create mode 100644 src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java create mode 100644 src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java create mode 100644 src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java create mode 100644 src/main/resources/db/mapper/app/PackageMapper.xml 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 03a85ae..14c410a 100644 --- a/src/main/java/net/geedge/asw/common/util/RCode.java +++ b/src/main/java/net/geedge/asw/common/util/RCode.java @@ -26,6 +26,7 @@ public enum RCode { // Package PACKAGE_ID_CANNOT_EMPTY(202001, "package id cannot be empty"), + PACKAGE_DESCRIPTION_CANNOT_EMPTY(202002, "package description cannot be empty"), // Runner @@ -35,6 +36,10 @@ public enum RCode { // Playbook PLAYBOOK_ID_CANNOT_EMPTY(302001, "playbook id cannot be empty"), + + // Workspace + WORKSPACE_ID_CANNOT_EMPTY(401001, "workspace id cannot be empty"), + SUCCESS(200, "success"); // 成功 private RCode(Integer code, String msg) { diff --git a/src/main/java/net/geedge/asw/common/util/T.java b/src/main/java/net/geedge/asw/common/util/T.java index 23011ac..2eadb9b 100644 --- a/src/main/java/net/geedge/asw/common/util/T.java +++ b/src/main/java/net/geedge/asw/common/util/T.java @@ -1,12 +1,17 @@ package net.geedge.asw.common.util; -import java.awt.Graphics; -import java.awt.Robot; -import java.lang.ref.PhantomReference; -import java.lang.ref.Reference; -import java.lang.ref.ReferenceQueue; -import java.lang.ref.SoftReference; -import java.lang.ref.WeakReference; +import cn.hutool.core.date.DateTime; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import java.awt.*; +import java.lang.ref.*; import java.lang.reflect.Type; import java.math.BigDecimal; import java.net.Socket; @@ -16,24 +21,10 @@ import java.security.SecureRandom; import java.time.LocalDateTime; import java.time.temporal.Temporal; import java.time.temporal.TemporalAccessor; -import java.util.Calendar; -import java.util.Collection; -import java.util.Iterator; -import java.util.Spliterator; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.crypto.Cipher; -import javax.crypto.KeyGenerator; -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; -import javax.tools.JavaCompiler; -import javax.tools.JavaFileObject; - -import com.baomidou.mybatisplus.core.metadata.OrderItem; - -import cn.hutool.core.date.DateTime; - public class T { public static final Pattern REGEX_SPECIAL_DATE = Pattern @@ -315,6 +306,27 @@ public class T { * @author xiaoleilu */ public static class PageUtil extends cn.hutool.core.util.PageUtil { + public static final Integer DEFAULT_PAGENO = 1; + public static final Integer DEFAULT_PAGESIZE = 20; + + public static Page getPage(Map params) { + // 分页参数 + Integer pageNo = T.MapUtil.getInt(params, "current", DEFAULT_PAGENO); + Integer pageSize = T.MapUtil.getInt(params, "size", DEFAULT_PAGESIZE); + if (pageSize == -1) { + pageNo = 0; + pageSize = Integer.MAX_VALUE; + } + + Page page = Page.of(pageNo, pageSize); + + String orderBy = T.MapUtil.getStr(params, "orderBy"); + if (T.StrUtil.isNotEmpty(orderBy)) { + page.addOrder(T.PageUtil.decodeOrderByStr(orderBy)); + } + return page; + } + public static OrderItem decodeOrderByStr(String orderBy) { if (cn.hutool.core.util.StrUtil.isBlank(orderBy)) { return null; diff --git a/src/main/java/net/geedge/asw/module/app/controller/PackageController.java b/src/main/java/net/geedge/asw/module/app/controller/PackageController.java new file mode 100644 index 0000000..a7f2ebf --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/controller/PackageController.java @@ -0,0 +1,65 @@ +package net.geedge.asw.module.app.controller; + +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.app.entity.PackageEntity; +import net.geedge.asw.module.app.service.IPackageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequestMapping("/api/v1/package") +public class PackageController { + + @Autowired + private IPackageService packageService; + + @GetMapping("/{id}") + public R detail(@PathVariable("id") String id) { + PackageEntity entity = packageService.getById(id); + return R.ok().putData("record", entity); + } + + @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 = packageService.queryList(params); + return R.ok(page); + } + + @PostMapping + public R add(@RequestBody PackageEntity entity) { + T.VerifyUtil.is(entity).notNull() + .and(entity.getName()).notEmpty(RCode.NAME_CANNOT_EMPTY) + .and(entity.getDescription()).notEmpty(RCode.PACKAGE_DESCRIPTION_CANNOT_EMPTY) + .and(entity.getWorkspaceId()).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY); + + PackageEntity pkgEntity = packageService.savePackage(entity); + return R.ok().putData("id", pkgEntity.getId()); + } + + @PutMapping + public R update(@RequestBody PackageEntity entity) { + T.VerifyUtil.is(entity).notNull() + .and(entity.getId()).notEmpty(RCode.ID_CANNOT_EMPTY) + .and(entity.getName()).notEmpty(RCode.NAME_CANNOT_EMPTY) + .and(entity.getDescription()).notEmpty(RCode.PACKAGE_DESCRIPTION_CANNOT_EMPTY) + .and(entity.getWorkspaceId()).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY); + + PackageEntity pkgEntity = packageService.updatePackage(entity); + return R.ok().putData("id", pkgEntity.getId()); + } + + @DeleteMapping + public R delete(String[] ids) { + T.VerifyUtil.is(ids).notEmpty(); + packageService.removePackage(T.ListUtil.of(ids)); + return R.ok(); + } + +} \ No newline at end of file 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 index b5ec9cd..1894fb0 100644 --- a/src/main/java/net/geedge/asw/module/app/dao/PackageDao.java +++ b/src/main/java/net/geedge/asw/module/app/dao/PackageDao.java @@ -1,10 +1,16 @@ package net.geedge.asw.module.app.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import net.geedge.asw.module.app.entity.PackageEntity; import org.apache.ibatis.annotations.Mapper; +import java.util.List; +import java.util.Map; + @Mapper public interface PackageDao extends BaseMapper{ + List queryList(Page page, Map params); + } diff --git a/src/main/java/net/geedge/asw/module/app/dao/SignatureDao.java b/src/main/java/net/geedge/asw/module/app/dao/SignatureDao.java new file mode 100644 index 0000000..f23dd15 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/dao/SignatureDao.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.SignatureEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SignatureDao 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 index a2c2186..51fccf0 100644 --- a/src/main/java/net/geedge/asw/module/app/entity/ApplicationEntity.java +++ b/src/main/java/net/geedge/asw/module/app/entity/ApplicationEntity.java @@ -22,4 +22,6 @@ public class ApplicationEntity { 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/app/entity/PackageEntity.java b/src/main/java/net/geedge/asw/module/app/entity/PackageEntity.java index 21a692f..6d878c9 100644 --- a/src/main/java/net/geedge/asw/module/app/entity/PackageEntity.java +++ b/src/main/java/net/geedge/asw/module/app/entity/PackageEntity.java @@ -1,6 +1,7 @@ package net.geedge.asw.module.app.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 lombok.Data; @@ -11,6 +12,7 @@ public class PackageEntity { @TableId(type = IdType.ASSIGN_UUID) private String id; + private String name; private String logo; private String description; private String platform; @@ -22,4 +24,9 @@ public class PackageEntity { private String createUserId; private String updateUserId; + private String workspaceId; + + @TableField(exist = false) + private String workbookId; + } \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/app/entity/SignatureEntity.java b/src/main/java/net/geedge/asw/module/app/entity/SignatureEntity.java new file mode 100644 index 0000000..1ef28db --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/entity/SignatureEntity.java @@ -0,0 +1,29 @@ +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("signature") +public class SignatureEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String appId; + private String name; + private String tags; + private String description; + private Integer displayFlag; + private String conditions; + private Long opVersion; + + 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/app/service/IPackageService.java b/src/main/java/net/geedge/asw/module/app/service/IPackageService.java index 5a874e8..c86eb03 100644 --- a/src/main/java/net/geedge/asw/module/app/service/IPackageService.java +++ b/src/main/java/net/geedge/asw/module/app/service/IPackageService.java @@ -1,8 +1,19 @@ package net.geedge.asw.module.app.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import net.geedge.asw.module.app.entity.PackageEntity; +import java.util.List; +import java.util.Map; + public interface IPackageService extends IService{ + Page queryList(Map params); + + PackageEntity savePackage(PackageEntity entity); + + PackageEntity updatePackage(PackageEntity entity); + + void removePackage(List ids); } diff --git a/src/main/java/net/geedge/asw/module/app/service/ISignatureService.java b/src/main/java/net/geedge/asw/module/app/service/ISignatureService.java new file mode 100644 index 0000000..6860d1d --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/service/ISignatureService.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.SignatureEntity; + +public interface ISignatureService extends IService{ + +} 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 05fa333..d36084a 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 @@ -1,13 +1,90 @@ package net.geedge.asw.module.app.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.ASWException; +import net.geedge.asw.common.util.RCode; +import net.geedge.asw.common.util.T; 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 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 PackageServiceImpl extends ServiceImpl implements IPackageService { + @Autowired + private IWorkbookResourceService workbookResourceService; + + @Override + public Page queryList(Map params) { + Page page = T.PageUtil.getPage(params); + List packageList = this.getBaseMapper().queryList(page, params); + page.setRecords(packageList); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public PackageEntity savePackage(PackageEntity entity) { + PackageEntity one = this.getOne(new LambdaQueryWrapper() + .eq(PackageEntity::getWorkspaceId, entity.getWorkspaceId()) + .eq(PackageEntity::getName, entity.getName())); + if (T.ObjectUtil.isNotNull(one)) { + throw ASWException.builder().rcode(RCode.SYS_DUPLICATE_RECORD).build(); + } + + entity.setCreateTimestamp(System.currentTimeMillis()); + entity.setUpdateTimestamp(System.currentTimeMillis()); + entity.setCreateUserId(StpUtil.getLoginIdAsString()); + entity.setUpdateUserId(StpUtil.getLoginIdAsString()); + + // save + this.save(entity); + + // workbook resource + workbookResourceService.saveResource(entity.getWorkbookId(), entity.getId(), WorkbookConstant.ResourceType.PACKAGE.getValue()); + return entity; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public PackageEntity updatePackage(PackageEntity entity) { + PackageEntity one = this.getOne(new LambdaQueryWrapper() + .eq(PackageEntity::getWorkspaceId, entity.getWorkspaceId()) + .eq(PackageEntity::getName, entity.getName()) + .ne(PackageEntity::getId, entity.getId())); + if (T.ObjectUtil.isNotNull(one)) { + throw ASWException.builder().rcode(RCode.SYS_DUPLICATE_RECORD).build(); + } + + entity.setUpdateTimestamp(System.currentTimeMillis()); + entity.setUpdateUserId(StpUtil.getLoginIdAsString()); + + // update + this.updateById(entity); + + // workbook resource + workbookResourceService.saveResource(entity.getWorkbookId(), entity.getId(), WorkbookConstant.ResourceType.PACKAGE.getValue()); + return entity; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void removePackage(List ids) { + // remove + this.removeBatchByIds(ids); + // workbook resource + workbookResourceService.removeResource(ids, WorkbookConstant.ResourceType.PACKAGE.getValue()); + } } diff --git a/src/main/java/net/geedge/asw/module/app/service/impl/SignatureServiceImpl.java b/src/main/java/net/geedge/asw/module/app/service/impl/SignatureServiceImpl.java new file mode 100644 index 0000000..10ed915 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/app/service/impl/SignatureServiceImpl.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.SignatureDao; +import net.geedge.asw.module.app.entity.SignatureEntity; +import net.geedge.asw.module.app.service.ISignatureService; +import org.springframework.stereotype.Service; + +@Service +public class SignatureServiceImpl extends ServiceImpl implements ISignatureService { + + +} 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 index 7c2cbb9..b12aa05 100644 --- a/src/main/java/net/geedge/asw/module/runner/controller/JobController.java +++ b/src/main/java/net/geedge/asw/module/runner/controller/JobController.java @@ -27,6 +27,8 @@ public class JobController { @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 = jobService.queryList(params); return R.ok(page); } @@ -34,9 +36,9 @@ public class JobController { @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); + .and(entity.getRunnerId()).notEmpty(RCode.RUNNER_ID_CANNOT_EMPTY) + .and(entity.getPackageId()).notEmpty(RCode.PACKAGE_ID_CANNOT_EMPTY) + .and(entity.getWorkspaceId()).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY); JobEntity jobEntity = jobService.saveJob(entity); return R.ok().putData("id", jobEntity.getId()); @@ -51,6 +53,7 @@ public class JobController { @PutMapping("/cancel") public R cancel(String[] ids) { + T.VerifyUtil.is(ids).notEmpty(); // TODO 其他处理 // update state diff --git a/src/main/java/net/geedge/asw/module/runner/dao/DecodeRecordDao.java b/src/main/java/net/geedge/asw/module/runner/dao/DecodeRecordDao.java new file mode 100644 index 0000000..96b3921 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/dao/DecodeRecordDao.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.DecodeRecordEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DecodeRecordDao extends BaseMapper{ + +} diff --git a/src/main/java/net/geedge/asw/module/runner/entity/DecodeRecordEntity.java b/src/main/java/net/geedge/asw/module/runner/entity/DecodeRecordEntity.java new file mode 100644 index 0000000..2f67a52 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/entity/DecodeRecordEntity.java @@ -0,0 +1,19 @@ +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("decode_record") +public class DecodeRecordEntity { + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + private String pcapId; + private Long streamId; + private String streamAttributes; + private String workspaceId; + +} \ No newline at end of file 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 index 1bc13d9..151c376 100644 --- a/src/main/java/net/geedge/asw/module/runner/entity/JobEntity.java +++ b/src/main/java/net/geedge/asw/module/runner/entity/JobEntity.java @@ -32,6 +32,8 @@ public class JobEntity { private String createUserId; private String updateUserId; + private String workspaceId; + @TableField(exist = false) private String workbookId; 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 index 230519e..2e610b9 100644 --- a/src/main/java/net/geedge/asw/module/runner/entity/PcapEntity.java +++ b/src/main/java/net/geedge/asw/module/runner/entity/PcapEntity.java @@ -11,11 +11,20 @@ public class PcapEntity { @TableId(type = IdType.ASSIGN_UUID) private String id; + private String name; private String tags; private String description; private String path; - + private Long size; + private Long connections; + private Long hosts; + private String md5; + private Long connectionTimeFirst; + private Long connectionTimeLast; + private String protocols; + private String status; private Long createTimestamp; private String createUserId; + private String workspaceId; } \ 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 index 2d63be8..6c49070 100644 --- a/src/main/java/net/geedge/asw/module/runner/entity/PlaybookEntity.java +++ b/src/main/java/net/geedge/asw/module/runner/entity/PlaybookEntity.java @@ -15,11 +15,13 @@ public class PlaybookEntity { private String appId; private String tags; private String script; - private String opVersion; + private Long opVersion; 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/entity/RunnerEntity.java b/src/main/java/net/geedge/asw/module/runner/entity/RunnerEntity.java index 0f74660..ff42c5e 100644 --- a/src/main/java/net/geedge/asw/module/runner/entity/RunnerEntity.java +++ b/src/main/java/net/geedge/asw/module/runner/entity/RunnerEntity.java @@ -24,4 +24,6 @@ public class RunnerEntity { 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/IDecodeRecordService.java b/src/main/java/net/geedge/asw/module/runner/service/IDecodeRecordService.java new file mode 100644 index 0000000..defed4f --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/IDecodeRecordService.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.DecodeRecordEntity; + +public interface IDecodeRecordService extends IService{ + +} diff --git a/src/main/java/net/geedge/asw/module/runner/service/impl/DecodeRecordServiceImpl.java b/src/main/java/net/geedge/asw/module/runner/service/impl/DecodeRecordServiceImpl.java new file mode 100644 index 0000000..e99f937 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/runner/service/impl/DecodeRecordServiceImpl.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.DecodeRecordDao; +import net.geedge.asw.module.runner.entity.DecodeRecordEntity; +import net.geedge.asw.module.runner.service.IDecodeRecordService; +import org.springframework.stereotype.Service; + +@Service +public class DecodeRecordServiceImpl extends ServiceImpl implements IDecodeRecordService { + + +} 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 index 2cd4241..4cff4ad 100644 --- 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 @@ -1,7 +1,6 @@ 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; @@ -17,7 +16,6 @@ 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; @@ -68,12 +66,7 @@ public class JobServiceImpl extends ServiceImpl implements IJ @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)); - + Page page = T.PageUtil.getPage(params); List jobList = this.getBaseMapper().queryList(page, params); page.setRecords(jobList); return page; @@ -91,13 +84,7 @@ public class JobServiceImpl extends ServiceImpl implements IJ 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); - } + workbookResourceService.saveResource(entity.getWorkbookId(), entity.getId(), WorkbookConstant.ResourceType.JOB.getValue()); return entity; } @@ -107,9 +94,7 @@ public class JobServiceImpl extends ServiceImpl implements IJ // remove this.removeBatchByIds(ids); // workbook resource - workbookResourceService.remove(new LambdaQueryWrapper() - .eq(WorkbookResourceEntity::getResourceType, WorkbookConstant.ResourceType.JOB.getValue()) - .in(WorkbookResourceEntity::getResourceId, ids)); + workbookResourceService.removeResource(ids, WorkbookConstant.ResourceType.JOB.getValue()); } } 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 index b60b6da..13e0d9a 100644 --- a/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookResourceService.java +++ b/src/main/java/net/geedge/asw/module/workbook/service/IWorkbookResourceService.java @@ -3,6 +3,12 @@ package net.geedge.asw.module.workbook.service; import com.baomidou.mybatisplus.extension.service.IService; import net.geedge.asw.module.workbook.entity.WorkbookResourceEntity; +import java.util.List; + public interface IWorkbookResourceService extends IService{ + void saveResource(String workbookId, String resourceId, String type); + + void removeResource(List resourceIdList, String type); + } 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 index 6641b72..1f50b81 100644 --- 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 @@ -1,13 +1,50 @@ package net.geedge.asw.module.workbook.service.impl; +import cn.hutool.log.Log; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.common.util.T; 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; +import java.util.List; + @Service public class WorkbookResourceServiceImpl extends ServiceImpl implements IWorkbookResourceService { + private static final Log log = Log.get(); + + @Override + public void saveResource(String wbId, String resId, String type) { + if (T.StrUtil.hasEmpty(wbId, resId, type)) { + return; + } + + // remove + this.remove(new LambdaQueryWrapper() + .eq(WorkbookResourceEntity::getResourceId, resId) + .eq(WorkbookResourceEntity::getResourceType, type)); + + // insert + WorkbookResourceEntity res = new WorkbookResourceEntity(); + res.setWorkbookId(wbId); + res.setResourceId(resId); + res.setResourceType(type); + this.save(res); + } + + @Override + public void removeResource(List resIdList, String type) { + if (T.CollUtil.isEmpty(resIdList) || T.StrUtil.isEmpty(type)) { + return; + } + + // remove + this.remove(new LambdaQueryWrapper() + .eq(WorkbookResourceEntity::getResourceType, type) + .in(WorkbookResourceEntity::getResourceId, resIdList)); + } } diff --git a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java new file mode 100644 index 0000000..d75872d --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.workspace.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.workspace.entity.WorkspaceEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WorkspaceDao extends BaseMapper { + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java new file mode 100644 index 0000000..2f7bfcd --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java @@ -0,0 +1,10 @@ +package net.geedge.asw.module.workspace.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WorkspaceMemberDao extends BaseMapper { + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java new file mode 100644 index 0000000..e30742a --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java @@ -0,0 +1,26 @@ +package net.geedge.asw.module.workspace.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("workspace") +public class WorkspaceEntity { + + @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; + + private String workspaceId; + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java new file mode 100644 index 0000000..e82ef79 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java @@ -0,0 +1,17 @@ +package net.geedge.asw.module.workspace.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("workspace_member") +public class WorkspaceMemberEntity { + + private String workspaceId; + private String userId; + private String roleId; + + private Long createTimestamp; + private String createUserId; + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java new file mode 100644 index 0000000..4a6b78e --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.workspace.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity; + +public interface IWorkspaceMemberService extends IService{ + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java new file mode 100644 index 0000000..0c62760 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java @@ -0,0 +1,8 @@ +package net.geedge.asw.module.workspace.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.geedge.asw.module.workspace.entity.WorkspaceEntity; + +public interface IWorkspaceService extends IService{ + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java new file mode 100644 index 0000000..97409d7 --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.workspace.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.module.workspace.dao.WorkspaceMemberDao; +import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity; +import net.geedge.asw.module.workspace.service.IWorkspaceMemberService; +import org.springframework.stereotype.Service; + +@Service +public class WorkspaceMemberServiceImpl extends ServiceImpl implements IWorkspaceMemberService { + + +} \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java new file mode 100644 index 0000000..43b992b --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java @@ -0,0 +1,13 @@ +package net.geedge.asw.module.workspace.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.module.workspace.dao.WorkspaceDao; +import net.geedge.asw.module.workspace.entity.WorkspaceEntity; +import net.geedge.asw.module.workspace.service.IWorkspaceService; +import org.springframework.stereotype.Service; + +@Service +public class WorkspaceServiceImpl extends ServiceImpl implements IWorkspaceService { + + +} \ No newline at end of file diff --git a/src/main/resources/db/mapper/app/PackageMapper.xml b/src/main/resources/db/mapper/app/PackageMapper.xml new file mode 100644 index 0000000..9d1287e --- /dev/null +++ b/src/main/resources/db/mapper/app/PackageMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + \ 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 73d1818..6e32e1a 100644 --- a/src/main/resources/db/mapper/runner/JobMapper.xml +++ b/src/main/resources/db/mapper/runner/JobMapper.xml @@ -21,6 +21,7 @@ + @@ -70,6 +71,7 @@ LEFT JOIN package pkg ON job.package_id = pkg.id LEFT JOIN playbook pb ON job.playbook_id = pb.id LEFT JOIN application app ON pb.app_id = app.id + LEFT JOIN workbook_resource wr ON job.id = wr.resource_id AND wr.resource_type = 'job' job.id in @@ -101,10 +103,22 @@ locate(#{item}, job.signature_ids) + + + AND wr.workbook_id = #{params.workbookId} + + + + AND job.workspace_id = #{params.workspaceId} + GROUP BY job.id + + + ORDER BY job.id + \ 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 26d72a6..7d6d1ec 100644 --- a/src/main/resources/db/migration/R__AZ_sys_i18n.sql +++ b/src/main/resources/db/migration/R__AZ_sys_i18n.sql @@ -47,6 +47,10 @@ 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 (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); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (57, '202002', 'PACKAGE_DESCRIPTION_CANNOT_EMPTY', 'package description cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (59, '202002', 'PACKAGE_DESCRIPTION_CANNOT_EMPTY', '安装包描述信息不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (61, '401001', 'WORKSPACE_ID_CANNOT_EMPTY', 'workspace id cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (63, '401001', 'WORKSPACE_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 bdc2043..575e40a 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 @@ -135,30 +135,26 @@ CREATE TABLE `sys_file_content` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /** - * 新增 job 表 + * 新增 runner 表 */ -DROP TABLE IF EXISTS `job`; -CREATE TABLE `job` ( +DROP TABLE IF EXISTS `runner`; +CREATE TABLE `runner` ( `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 '日志文件路径', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '名称', + `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签,多个逗号分隔', + `support_platforms` varchar(256) NOT NULL DEFAULT '' COMMENT '支持的平台; 可选值:android,ios,windows; 多个逗号分隔; 例:android,ios', + `share_flag` int(1) NOT NULL DEFAULT 1 COMMENT '共享标识; 1:共享 0:不共享,仅创建人可用', + `description` text NOT NULL DEFAULT '' COMMENT '描述信息', + `status` varchar(64) NOT NULL DEFAULT 'online' COMMENT '状态;可选值:online,offline', + `last_heartbeat_timestamp` bigint(20) NOT NULL DEFAULT (UNIX_TIMESTAMP(NOW()) * 1000) 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_playbook_id` (`playbook_id`) USING BTREE, - KEY `idx_package_id` (`package_id`) USING BTREE, - KEY `idx_runner_id` (`runner_id`) USING BTREE + KEY `idx_name` (`name`) USING BTREE, + KEY `idx_workspace_id` (`workspace_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /** @@ -167,19 +163,50 @@ CREATE TABLE `job` ( 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', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '名称', + `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT '应用程序 ID', `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签', - `script` text NOT NULL COMMENT '脚本内容', - `op_version` bigint(20) NOT NULL COMMENT '更新版本号, 默认:1;每次更新递增', + `script` text NOT NULL DEFAULT '' COMMENT '脚本内容', + `op_version` bigint(20) NOT NULL DEFAULT 1 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 '更新人', + `workspace_id` varchar(64) NOT NULL DEFAULT '' COMMENT '工作空间ID', 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 + KEY `idx_op_version` (`op_version`) USING BTREE, + KEY `idx_workspace_id` (`workspace_id`) USING BTREE +) 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 DEFAULT '' COMMENT 'Playbook ID', + `package_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'Package ID', + `runner_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'Runner ID', + `schedule_id` varchar(64) NOT NULL DEFAULT '' COMMENT '定时器ID', + `signature_ids` text NOT NULL DEFAULT '' COMMENT '特征ID,多个逗号分隔', + `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签; 默认:"";多个用逗号分隔;例:kz,vpn,android', + `start_timestamp` bigint(20) NOT NULL DEFAULT (UNIX_TIMESTAMP(NOW()) * 1000) COMMENT '开始时间戳', + `end_timestamp` bigint(20) NOT NULL DEFAULT (UNIX_TIMESTAMP(NOW()) * 1000) COMMENT '结束时间戳', + `status` varchar(64) NOT NULL DEFAULT '' COMMENT '状态; 可选值: created,pending,running,passed,failed,cancel', + `pcap_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'PCAP ID', + `log_path` varchar(256) 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_playbook_id` (`playbook_id`) USING BTREE, + KEY `idx_package_id` (`package_id`) USING BTREE, + KEY `idx_runner_id` (`runner_id`) USING BTREE, + KEY `idx_workspace_id` (`workspace_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /** @@ -188,13 +215,42 @@ CREATE TABLE `playbook` ( DROP TABLE IF EXISTS `pcap`; CREATE TABLE `pcap` ( `id` varchar(64) NOT NULL COMMENT '主键', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '文件名称', `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签', - `description` text NOT NULL COMMENT '描述信息', - `path` varchar(64) NOT NULL COMMENT 'PCAP文件路径', + `description` text NOT NULL DEFAULT '' COMMENT '描述信息', + `path` varchar(64) NOT NULL DEFAULT '' COMMENT 'PCAP文件路径', + `size` bigint(20) NOT NULL DEFAULT 0 COMMENT '文件大小', + `connections` bigint(20) NOT NULL DEFAULT 0 COMMENT '连接数量', + `hosts` bigint(20) NOT NULL DEFAULT 0 COMMENT 'IP数量', + `md5` varchar(64) NOT NULL DEFAULT '' COMMENT '摘要值,根据文件md5值判断是否已上存在,存在则响应当前id', + `connection_time_first` bigint(20) NOT NULL DEFAULT (UNIX_TIMESTAMP(NOW()) * 1000) COMMENT '连接开始时间', + `connection_time_last` bigint(20) NOT NULL DEFAULT (UNIX_TIMESTAMP(NOW()) * 1000) COMMENT '连接结束时间', + `protocols` varchar(64) NOT NULL DEFAULT '' COMMENT '包含的协议,多个逗号分隔', + `status` varchar(64) NOT NULL DEFAULT '' COMMENT '状态,可选值 Uploaded,Analyzing,Completed', `create_timestamp` bigint(20) NOT NULL COMMENT '创建时间戳', `create_user_id` varchar(64) NOT NULL COMMENT '创建人', + `workspace_id` varchar(64) NOT NULL DEFAULT '' COMMENT '工作空间ID', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_tags` (`tags`) USING BTREE + KEY `idx_name` (`name`) USING BTREE, + KEY `idx_md5` (`md5`) USING BTREE, + KEY `idx_tags` (`tags`) USING BTREE, + KEY `idx_workspace_id` (`workspace_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/** + * 新增 decode_record 表 + */ +DROP TABLE IF EXISTS `decode_record`; +CREATE TABLE `decode_record` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `pcap_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'PCAP文件ID', + `stream_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '流ID', + `stream_attributes` text NOT NULL DEFAULT '' COMMENT '流属性', + `workspace_id` varchar(64) NOT NULL DEFAULT '' COMMENT '工作空间ID', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_pcap_id` (`pcap_id`) USING BTREE, + KEY `idx_stream_id` (`stream_id`) USING BTREE, + KEY `idx_workspace_id` (`workspace_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; @@ -204,18 +260,20 @@ CREATE TABLE `pcap` ( 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 '', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '应用名称', + `long_name` varchar(256) NOT NULL DEFAULT '' COMMENT '应用全称', + `properties` text NOT NULL DEFAULT '' COMMENT '应用数据', + `description` text NOT NULL DEFAULT '' COMMENT '描述信息', + `surrogates` 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_long_name` (`long_name`) USING BTREE + KEY `idx_long_name` (`long_name`) USING BTREE, + KEY `idx_workspace_id` (`workspace_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /** @@ -224,57 +282,67 @@ CREATE TABLE `application` ( 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', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '名称', + `logo` varchar(512) NOT NULL DEFAULT '' COMMENT '图标,图标文件 url 地址', + `description` text NOT NULL DEFAULT '' COMMENT '描述信息', + `platform` varchar(256) NOT NULL DEFAULT '' COMMENT '操作系统; 可选值:android,ios,windows,linux', + `version` varchar(256) NOT NULL DEFAULT '' COMMENT '安装包版本', + `identifier` varchar(256) NOT NULL DEFAULT '' 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 '更新人', + `workspace_id` varchar(64) NOT NULL DEFAULT '' COMMENT '工作空间ID', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_version` (`version`) USING BTREE + KEY `idx_name` (`name`) USING BTREE, + KEY `idx_version` (`version`) USING BTREE, + KEY `idx_workspace_id` (`workspace_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + /** - * 新增 runner 表 + * 新增 signature 表 */ -DROP TABLE IF EXISTS `runner`; -CREATE TABLE `runner` ( +DROP TABLE IF EXISTS `signature`; +CREATE TABLE `signature` ( `id` varchar(64) NOT NULL COMMENT '主键', - `name` varchar(256) NOT NULL COMMENT '名称', + `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT '应用ID', + `name` varchar(256) NOT NULL DEFAULT '' 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 '最后心跳时间戳', + `description` text NOT NULL DEFAULT '' COMMENT '描述信息', + `display_flag` int(1) NOT NULL DEFAULT 1 COMMENT '是否显示; 1:显示 0:不显示', + `conditions` text NOT NULL DEFAULT '' COMMENT '条件', + `op_version` bigint(20) NOT NULL DEFAULT 1 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 '更新人', + `workspace_id` varchar(64) NOT NULL DEFAULT '' COMMENT '工作空间ID', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_name` (`name`) USING BTREE + KEY `idx_app_id` (`app_id`) USING BTREE, + KEY `idx_name` (`name`) USING BTREE, + KEY `idx_op_version` (`op_version`) USING BTREE, + KEY `idx_workspace_id` (`workspace_id`) 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 '名称', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '名称', `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签,多个逗号分隔', `visibility` varchar(16) NOT NULL DEFAULT 'private' COMMENT '可见程度,可选值:private,public 默认:private', - `description` text NOT NULL COMMENT '描述信息', + `description` 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_name` (`name`) USING BTREE, + KEY `idx_workspace_id` (`workspace_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; DROP TABLE IF EXISTS `workbook_member`; @@ -294,3 +362,34 @@ CREATE TABLE `workbook_resource` ( `resource_id` varchar(64) NOT NULL COMMENT '资源id', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +/** + * 新增 workspace, workspace_member 表 + */ +DROP TABLE IF EXISTS `workspace`; +CREATE TABLE `workspace` ( + `id` varchar(64) NOT NULL COMMENT '主键', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '名称', + `tags` varchar(256) NOT NULL DEFAULT '' COMMENT '标签,多个逗号分隔', + `visibility` varchar(16) NOT NULL DEFAULT 'private' COMMENT '可见程度,可选值:private,public 默认:private', + `description` 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 '更新人', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_name` (`name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +DROP TABLE IF EXISTS `workspace_member`; +CREATE TABLE `workspace_member` ( + `workspace_id` varchar(64) NOT NULL, + `user_id` varchar(64) NOT NULL, + `role_id` varchar(64) NOT NULL, + `create_timestamp` bigint(20) NOT NULL COMMENT '创建时间戳', + `create_user_id` varchar(64) NOT NULL COMMENT '创建人', + KEY `idx_workspace_id` (`workspace_id`) USING BTREE, + KEY `idx_user_id` (`user_id`) USING BTREE, + KEY `idx_role_id` (`role_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file