first commit
This commit is contained in:
35
.gitignore
vendored
Normal file
35
.gitignore
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
HELP.md
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
.log
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
application-prod.properties
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
53
README.md
Normal file
53
README.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# 毕业设计
|
||||
一站式自动化运维及自动化部署平台, 使用多环境的概念, 提供了机器管理、机器监控报警、Web终端、WebSftp、机器批量执行、机器批量上传、在线查看日志、定时调度任务、应用环境维护、应用构建及发布任务、操作流水线等功能, 帮助企业实现一站式轻量化运维治理, 致力于企业级应用的智能运维。
|
||||
|
||||
## 特性
|
||||
|
||||
* 易用方便: 极简配置, 开箱即用, 支持 docker 部署
|
||||
* 在线终端: 支持在线 Web 终端, 记录操作日志, 管理员可强制下线, 录屏回放, 终端监视等
|
||||
* 文件管理: 支持远程机器文件批量上传、批量下载、暂停断点续传、实时传输速率、实时进度、打包传输等功能
|
||||
* 机器监控: 支持维护机器的监控以及报警, 支持采集 agent 的一键安装以及升级
|
||||
* 批量操作: 支持远程机器批量执行命令 以及 批量执行上传文件
|
||||
* 调度任务: 维护 cron 表达式, 定时执行机器命令
|
||||
* 环境隔离: 不同应用环境的配置及环境变量是相互隔离的
|
||||
* 环境变量: 命令执行时使用占位符自动替换, 支持 properties, json, yml, xml多种格式维护
|
||||
* 高兼容性: 自定义构建发布操作, 不论是什么项目都是配置 SSH 执行命令, 灵活操作
|
||||
* 功能强大: 命令批量执行, 任务定时调度, 远程日志查看, 操作日志全记录等
|
||||
* 高扩展性: 前后端代码规范统一, 代码健壮质量高, 写法优雅, 易读好拓展
|
||||
* 免费开源: 前后端代码完全开源, 方便二次开发
|
||||
|
||||
## 技术栈
|
||||
|
||||
* SpringBoot 2.4+
|
||||
* Mysql 8.+
|
||||
* Redis 5+
|
||||
* Vue 2.6+
|
||||
* Ant Design 1.7.8
|
||||
|
||||
## 演示环境
|
||||
* 🔗 演示地址: <a href="https://bishe.youdu.xin" target="_blank">https://bishe.youdu.xin</a>
|
||||
* 🔏 演示账号: wxy/wxy
|
||||
* 注: 演示环境运行在宿舍电脑的虚拟机中, 每日早晨重置一次,半夜不提供演示服务
|
||||
|
||||
## 功能预览
|
||||
|
||||
### 控制台
|
||||

|
||||
|
||||
### 机器管理
|
||||
#### 机器列表
|
||||

|
||||
|
||||
#### 在线终端-连接演示
|
||||
Linux服务器
|
||||

|
||||
H3C防火墙
|
||||

|
||||
H3C交换机
|
||||

|
||||
|
||||
#### 终端日志-可回放审查
|
||||
终端日志总揽
|
||||

|
||||
终端日志回放
|
||||

|
||||
36
orion-ops-api/orion-ops-common/pom.xml
Normal file
36
orion-ops-api/orion-ops-common/pom.xml
Normal file
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
|
||||
<parent>
|
||||
<groupId>cn.orionsec.ops</groupId>
|
||||
<artifactId>orion-ops-api</artifactId>
|
||||
<version>1.3.1</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<name>orion-ops-common</name>
|
||||
<artifactId>orion-ops-common</artifactId>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<dependencies>
|
||||
<!-- lombok -->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- orion-kit -->
|
||||
<dependency>
|
||||
<groupId>cn.orionsec.kit</groupId>
|
||||
<artifactId>orion-all</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- web -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,10 @@
|
||||
package cn.orionsec.ops.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
|
||||
@Target({ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface DemoDisableApi {
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
|
||||
package cn.orionsec.ops.annotation;
|
||||
|
||||
import cn.orionsec.ops.constant.event.EventType;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
|
||||
@Target({ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface EventLog {
|
||||
|
||||
/**
|
||||
* @return 事件类型
|
||||
*/
|
||||
EventType value();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
|
||||
package cn.orionsec.ops.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
|
||||
@Target({ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface IgnoreAuth {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
|
||||
package cn.orionsec.ops.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
|
||||
@Target({ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface IgnoreCheck {
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
package cn.orionsec.ops.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
|
||||
@SuppressWarnings("ALL")
|
||||
@Target({ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface IgnoreLog {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
|
||||
package cn.orionsec.ops.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
|
||||
@Target({ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface IgnoreWrapper {
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
package cn.orionsec.ops.annotation;
|
||||
|
||||
import cn.orionsec.ops.constant.user.RoleType;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
|
||||
@Target({ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface RequireRole {
|
||||
|
||||
/**
|
||||
* 所需角色
|
||||
* <p>
|
||||
* {@link RoleType}
|
||||
*/
|
||||
RoleType[] value();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
package cn.orionsec.ops.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
|
||||
@Target({ElementType.TYPE})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface RestWrapper {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package cn.orionsec.ops.constant;
|
||||
|
||||
public class CnConst {
|
||||
|
||||
private CnConst() {
|
||||
}
|
||||
|
||||
public static final String ENABLE = "启用";
|
||||
|
||||
public static final String DISABLE = "停用";
|
||||
|
||||
public static final String RESOLVE = "通过";
|
||||
|
||||
public static final String REJECT = "驳回";
|
||||
|
||||
public static final String SUCCESS = "成功";
|
||||
|
||||
public static final String FAILURE = "失败";
|
||||
|
||||
public static final String OPEN = "开启";
|
||||
|
||||
public static final String CLOSE = "关闭";
|
||||
|
||||
public static final String YES = "是";
|
||||
|
||||
public static final String NO = "否";
|
||||
|
||||
public static final String APP = "应用";
|
||||
|
||||
public static final String RELEASE = "发布";
|
||||
|
||||
public static final String PASSWORD = "密码";
|
||||
|
||||
public static final String TOKEN = "令牌";
|
||||
|
||||
public static final String SECRET_KEY = "独立密钥";
|
||||
|
||||
public static final String READ = "已读";
|
||||
|
||||
public static final String UNREAD = "未读";
|
||||
|
||||
public static final String ORION_OPS_AUTHOR = "李佳航";
|
||||
|
||||
public static final String UNKNOWN = "未知";
|
||||
|
||||
public static final String INTRANET_IP = "内网IP";
|
||||
|
||||
public static final String INSTALL = "安装";
|
||||
|
||||
public static final String UPGRADE = "升级";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,184 @@
|
||||
package cn.orionsec.ops.constant;
|
||||
|
||||
import cn.orionsec.kit.lang.utils.collect.Lists;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class Const implements cn.orionsec.kit.lang.constant.Const {
|
||||
|
||||
private Const() {
|
||||
}
|
||||
|
||||
public static final String ORION_OPS = "orion-ops";
|
||||
|
||||
public static final String KEYS_PATH = ".keys";
|
||||
|
||||
public static final String PIC_PATH = "pic";
|
||||
|
||||
public static final String SCREEN_PATH = "screen";
|
||||
|
||||
public static final String SWAP_PATH = "swap";
|
||||
|
||||
public static final String LOG_PATH = "logs";
|
||||
|
||||
public static final String TEMP_PATH = "temp";
|
||||
|
||||
public static final String REPO_PATH = "repo";
|
||||
|
||||
public static final String DIST_PATH = "dist";
|
||||
|
||||
public static final String MACHINE_MONITOR_AGENT_PATH = "/lib/machine-monitor-agent-latest.jar";
|
||||
|
||||
public static final String TAIL_FILE_PATH = "tail";
|
||||
|
||||
public static final String TERMINAL_DIR = "/terminal";
|
||||
|
||||
public static final String BUILD_DIR = "/build";
|
||||
|
||||
public static final String RELEASE_DIR = "/release";
|
||||
|
||||
public static final String RELEASE_MACHINE_PREFIX = "/machine";
|
||||
|
||||
public static final String EXEC_DIR = "/exec";
|
||||
|
||||
public static final String COMMAND_DIR = "/command";
|
||||
|
||||
public static final String AVATAR_DIR = "/avatar";
|
||||
|
||||
public static final String UPLOAD_DIR = "/upload";
|
||||
|
||||
public static final String DOWNLOAD_DIR = "/download";
|
||||
|
||||
public static final String PACKAGE_DIR = "/package";
|
||||
|
||||
public static final String EVENT_DIR = "/event";
|
||||
|
||||
public static final String TASK_DIR = "/task";
|
||||
|
||||
public static final String IMPORT_DIR = "/import";
|
||||
|
||||
public static final String EXPORT_DIR = "/export";
|
||||
|
||||
public static final String LIB_DIR = "/lib";
|
||||
|
||||
public static final String INSTALL_DIR = "/install";
|
||||
|
||||
public static final String BUILD = "build";
|
||||
|
||||
public static final String RELEASE = "release";
|
||||
|
||||
public static final String PIPELINE = "pipeline";
|
||||
|
||||
public static final String TASK = "task";
|
||||
|
||||
public static final String ACTION = "action";
|
||||
|
||||
public static final String ROOT = "root";
|
||||
|
||||
public static final String EVENT = "event";
|
||||
|
||||
public static final String PACKAGE = "package";
|
||||
|
||||
public static final String PLUGINS = "plugins";
|
||||
|
||||
public static final String TIMEOUT = "timeout";
|
||||
|
||||
public static final String CAST_SUFFIX = "cast";
|
||||
|
||||
public static final Integer FORBID_DELETE_CAN = 1;
|
||||
|
||||
public static final Integer FORBID_DELETE_NOT = 2;
|
||||
|
||||
public static final int EXEC_COMMAND_OMIT = 80;
|
||||
|
||||
public static final int TEMPLATE_OMIT = 80;
|
||||
|
||||
public static final int TAIL_OFFSET_LINE = 300;
|
||||
|
||||
public static final Long HOST_MACHINE_ID = 1L;
|
||||
|
||||
public static final Long ROOT_TREE_ID = -1L;
|
||||
|
||||
public static final Integer DEFAULT_TREE_SORT = 1;
|
||||
|
||||
public static final String HOST_MACHINE_TAG = "host";
|
||||
|
||||
public static final String SWAP_FILE_SUFFIX = ".swp";
|
||||
|
||||
public static final String SECRET_KEY_SUFFIX = "_id_rsa";
|
||||
|
||||
public static final Integer IS_DEFAULT = 1;
|
||||
|
||||
public static final Integer CONFIGURED = 1;
|
||||
|
||||
public static final Integer IS_SYSTEM = 1;
|
||||
|
||||
public static final Integer NOT_SYSTEM = 2;
|
||||
|
||||
public static final Integer NOT_CONFIGURED = 2;
|
||||
|
||||
public static final Integer COMMIT_LIMIT = 30;
|
||||
|
||||
public static final Integer BUILD_RELEASE_LIMIT = 20;
|
||||
|
||||
public static final String COPY = "Copy";
|
||||
|
||||
public static final String ROLLBACK = "Rollback";
|
||||
|
||||
public static final String COMPRESS_LIST_FILE = "压缩清单.txt";
|
||||
|
||||
public static final int TRACKER_DELAY_MS = 250;
|
||||
|
||||
public static final int MIN_TRACKER_DELAY_MS = 50;
|
||||
|
||||
public static final int DEFAULT_FILE_CLEAN_THRESHOLD = 60;
|
||||
|
||||
public static final int DEFAULT_LOGIN_TOKEN_EXPIRE_HOUR = 24 * 2;
|
||||
|
||||
public static final int SFTP_UPLOAD_THRESHOLD = 512;
|
||||
|
||||
public static final String GITHUB = "github";
|
||||
|
||||
public static final String GITEE = "gitee";
|
||||
|
||||
public static final String GITLAB = "gitlab";
|
||||
|
||||
public static final String OAUTH2 = "oauth2";
|
||||
|
||||
public static final String SOCKS4 = "socks4";
|
||||
|
||||
public static final String SOCKS5 = "socks5";
|
||||
|
||||
public static final String DEFAULT_SHELL = "/bin/bash";
|
||||
|
||||
public static final String LF_2 = "\n\n";
|
||||
|
||||
public static final String LF_3 = "\n\n\n";
|
||||
|
||||
public static final Integer ENABLE = 1;
|
||||
|
||||
public static final Integer DISABLE = 2;
|
||||
|
||||
public static final Integer NOT_DELETED = 1;
|
||||
|
||||
public static final Integer IS_DELETED = 2;
|
||||
|
||||
public static final Integer INCREMENT = 1;
|
||||
|
||||
public static final Integer DECREMENT = 2;
|
||||
|
||||
/**
|
||||
* 不安全的文件夹
|
||||
*/
|
||||
public static final List<String> UNSAFE_FS_DIR = Lists.of(
|
||||
"/", "/bin", "/usr",
|
||||
"/sbin", "/etc", "/tmp",
|
||||
"/lib", "/var", "/home",
|
||||
"/opt", "/root", "/run",
|
||||
"/lib64", "/lost+found", "/media",
|
||||
"/mnt", "/proc", "/sys",
|
||||
"/svr", "/dev", "/boot",
|
||||
"/usr/bin", "/usr/include", "/usr/lib",
|
||||
"/usr/local", "/usr/sbin", ".tmp");
|
||||
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
package cn.orionsec.ops.constant;
|
||||
|
||||
public class KeyConst {
|
||||
|
||||
private KeyConst() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录 token
|
||||
* <p>
|
||||
* auth:login:{id}
|
||||
*/
|
||||
public static final String LOGIN_TOKEN_KEY = "auth:info:{}";
|
||||
|
||||
/**
|
||||
* 登录 token 绑定 token
|
||||
* <p>
|
||||
* auth:login:{id}:{timestamp}
|
||||
*/
|
||||
public static final String LOGIN_TOKEN_BIND_KEY = "auth:bind:{}:{}";
|
||||
|
||||
/**
|
||||
* terminal 访问 token
|
||||
* <p>
|
||||
* terminal:access:{token}
|
||||
*/
|
||||
public static final String TERMINAL_ACCESS_TOKEN = "terminal:access:{}";
|
||||
|
||||
/**
|
||||
* 3min
|
||||
*/
|
||||
public static final int TERMINAL_ACCESS_TOKEN_EXPIRE = 60 * 3;
|
||||
|
||||
/**
|
||||
* terminal 监视 token
|
||||
* <p>
|
||||
* terminal:watcher:{token}
|
||||
*/
|
||||
public static final String TERMINAL_WATCHER_TOKEN = "terminal:watcher:{}";
|
||||
|
||||
/**
|
||||
* 3min
|
||||
*/
|
||||
public static final int TERMINAL_WATCHER_TOKEN_EXPIRE = 60 * 3;
|
||||
|
||||
/**
|
||||
* 文件 tail 访问 token
|
||||
* <p>
|
||||
* file:tail:access{token}
|
||||
*/
|
||||
public static final String FILE_TAIL_ACCESS_TOKEN = "file:tail:access:{}";
|
||||
|
||||
/**
|
||||
* 5 min
|
||||
*/
|
||||
public static final int FILE_TAIL_ACCESS_EXPIRE = 60 * 5;
|
||||
|
||||
/**
|
||||
* 文件下载 token
|
||||
* <p>
|
||||
* file:download:{token}
|
||||
*/
|
||||
public static final String FILE_DOWNLOAD_TOKEN = "file:download:{}";
|
||||
|
||||
/**
|
||||
* 5 min
|
||||
*/
|
||||
public static final int FILE_DOWNLOAD_EXPIRE = 60 * 5;
|
||||
|
||||
/**
|
||||
* sftp 会话 token
|
||||
* <p>
|
||||
* sftp:session:{token}
|
||||
*/
|
||||
public static final String SFTP_SESSION_TOKEN = "sftp:session:{}";
|
||||
|
||||
/**
|
||||
* 12 h
|
||||
*/
|
||||
public static final int SFTP_SESSION_EXPIRE = 60 * 60 * 12;
|
||||
|
||||
/**
|
||||
* sftp 上传请求 token
|
||||
* <p>
|
||||
* sftp:upload:{token}
|
||||
*/
|
||||
public static final String SFTP_UPLOAD_ACCESS_TOKEN = "sftp:upload:{}";
|
||||
|
||||
/**
|
||||
* 5 h
|
||||
*/
|
||||
public static final int SFTP_UPLOAD_ACCESS_EXPIRE = 60 * 60 * 5;
|
||||
|
||||
/**
|
||||
* 主页统计数量 key
|
||||
* <p>
|
||||
* data:statistics:home:count:{profileId}
|
||||
*/
|
||||
public static final String HOME_STATISTICS_COUNT_KEY = "data:statistics:home:count:{}";
|
||||
|
||||
/**
|
||||
* 调度任务统计 key
|
||||
* <p>
|
||||
* data:statistics:scheduler:task:{id}
|
||||
*/
|
||||
public static final String SCHEDULER_TASK_STATISTICS_KEY = "data:statistics:scheduler:task:{}";
|
||||
|
||||
/**
|
||||
* 环境缓存 key
|
||||
* <p>
|
||||
* data:profile
|
||||
*/
|
||||
public static final String DATA_PROFILE_KEY = "data:profile";
|
||||
|
||||
/**
|
||||
* 30 min
|
||||
*/
|
||||
public static final int DATA_PROFILE_EXPIRE = 60 * 30;
|
||||
|
||||
/**
|
||||
* 数据导入缓存 key
|
||||
* <p>
|
||||
* data:import:{userId}:{token}
|
||||
*/
|
||||
public static final String DATA_IMPORT_TOKEN = "data:import:{}:{}";
|
||||
|
||||
/**
|
||||
* 5 min
|
||||
*/
|
||||
public static final int DATA_IMPORT_TOKEN_EXPIRE = 60 * 5;
|
||||
|
||||
/**
|
||||
* 机器分组数据 key
|
||||
* <p>
|
||||
* machine:group:data
|
||||
*/
|
||||
public static final String MACHINE_GROUP_DATA_KEY = "machine:group:data";
|
||||
|
||||
/**
|
||||
* 5 h
|
||||
*/
|
||||
public static final int MACHINE_GROUP_DATA_EXPIRE = 60 * 60 * 5;
|
||||
|
||||
/**
|
||||
* 机器分组引用 key
|
||||
* <p>
|
||||
* machine:group:rel
|
||||
*/
|
||||
public static final String MACHINE_GROUP_REL_KEY = "machine:group:rel";
|
||||
|
||||
/**
|
||||
* 5 h
|
||||
*/
|
||||
public static final int MACHINE_GROUP_REL_EXPIRE = 60 * 60 * 5;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
package cn.orionsec.ops.constant;
|
||||
|
||||
|
||||
public class MessageConst {
|
||||
|
||||
private MessageConst() {
|
||||
}
|
||||
|
||||
public static final String ABSENT = "不存在";
|
||||
|
||||
public static final String UNAUTHORIZED = "会话过期";
|
||||
|
||||
public static final String NO_PERMISSION = "无操作权限";
|
||||
|
||||
public static final String FILE_MISSING = "文件不存在";
|
||||
|
||||
public static final String IP_BAN = "当前IP已被封禁";
|
||||
|
||||
public static final String ILLEGAL_ACCESS = "非法访问";
|
||||
|
||||
public static final String ABSENT_PARAM = "参数缺失";
|
||||
|
||||
public static final String INVALID_PARAM = "非法参数";
|
||||
|
||||
public static final String PARSE_ERROR = "解析失败";
|
||||
|
||||
public static final String OPERATOR_ERROR = "操作失败";
|
||||
|
||||
public static final String DEMO_DISABLE_API = "演示模式不支持此功能";
|
||||
|
||||
public static final String HTTP_API = "api 调用异常";
|
||||
|
||||
public static final String NETWORK_FLUCTUATION = "当前环境网路波动";
|
||||
|
||||
public static final String OPEN_TEMPLATE_ERROR = "模板解析失败 请检查模板和密码";
|
||||
|
||||
public static final String PARSE_TEMPLATE_DATA_ERROR = "模板解析失败 请检查模板数据";
|
||||
|
||||
public static final String REPOSITORY_OPERATOR_ERROR = "应用版本仓库操作执行失败";
|
||||
|
||||
public static final String TASK_ERROR = "任务执行异常";
|
||||
|
||||
public static final String CONNECT_ERROR = "建立连接失败";
|
||||
|
||||
public static final String TIMEOUT_ERROR = "处理超时";
|
||||
|
||||
public static final String INTERRUPT_ERROR = "操作中断";
|
||||
|
||||
public static final String USERNAME_PASSWORD_ERROR = "用户名或密码错误";
|
||||
|
||||
public static final String USER_DISABLED = "用户已被禁用";
|
||||
|
||||
public static final String USER_LOCKED = "用户已被锁定";
|
||||
|
||||
public static final String UNKNOWN_USER = "未查询到用户信息";
|
||||
|
||||
public static final String USERNAME_PRESENT = "用户名已存在";
|
||||
|
||||
public static final String BEFORE_PASSWORD_EMPTY = "原密码为空";
|
||||
|
||||
public static final String BEFORE_PASSWORD_ERROR = "原密码错误";
|
||||
|
||||
public static final String UNSAFE_OPERATOR = "不安全的操作";
|
||||
|
||||
public static final String UNSUPPORTED_OPERATOR = "不支持的操作";
|
||||
|
||||
public static final String ENCRYPT_ERROR = "数据加密异常";
|
||||
|
||||
public static final String DECRYPT_ERROR = "数据解密异常";
|
||||
|
||||
public static final String UNKNOWN_DATA = "未查询到数据";
|
||||
|
||||
public static final String UNKNOWN_EXPORT_TYPE = "未知的导出类型";
|
||||
|
||||
public static final String INVALID_MACHINE = "未知的机器";
|
||||
|
||||
public static final String MACHINE_DISABLE = "机器未启用";
|
||||
|
||||
public static final String INVALID_PROXY = "未查询到代理信息";
|
||||
|
||||
public static final String INVALID_PTY = "终端类型不合法";
|
||||
|
||||
public static final String EXCEPTION_MESSAGE = "系统异常";
|
||||
|
||||
public static final String AUTH_EXCEPTION_MESSAGE = "认证失败";
|
||||
|
||||
public static final String TIMEOUT_EXCEPTION_MESSAGE = "连接超时";
|
||||
|
||||
public static final String IO_EXCEPTION_MESSAGE = "网络异常";
|
||||
|
||||
public static final String SQL_EXCEPTION_MESSAGE = "数据异常";
|
||||
|
||||
public static final String UNCONNECTED = "未建立连接";
|
||||
|
||||
public static final String EXEC_TASK_ABSENT = "未查询到任务信息";
|
||||
|
||||
public static final String EXEC_TASK_THREAD_ABSENT = "未查询到任务进程";
|
||||
|
||||
public static final String TEMPLATE_ABSENT = "未查询到模板信息";
|
||||
|
||||
public static final String HISTORY_VALUE_ABSENT = "未查询到历史值信息";
|
||||
|
||||
public static final String METADATA_ABSENT = "元数据缺失";
|
||||
|
||||
public static final String ENV_ABSENT = "环境变量不存在";
|
||||
|
||||
public static final String TOKEN_EMPTY = "token为空";
|
||||
|
||||
public static final String TOKEN_EXPIRE = "token过期";
|
||||
|
||||
public static final String SESSION_EXPIRE = "会话过期";
|
||||
|
||||
public static final String PATH_NOT_NORMALIZE = "路径不合法";
|
||||
|
||||
public static final String FILE_NOT_FOUND = "文件 {} 不存在";
|
||||
|
||||
public static final String TRANSFER_ITEM_EMPTY = "未找到可传输对象";
|
||||
|
||||
public static final String UNSELECTED_TRANSFER_LOG = "未找到传输对象";
|
||||
|
||||
public static final String FILE_TOO_LARGE = "文件过大";
|
||||
|
||||
public static final String NAME_PRESENT = "名称重复";
|
||||
|
||||
public static final String TAG_PRESENT = "唯一标识重复";
|
||||
|
||||
public static final String FORBID_DELETE = "禁止删除";
|
||||
|
||||
public static final String APP_ABSENT = "应用不存在";
|
||||
|
||||
public static final String PROFILE_ABSENT = "环境不存在";
|
||||
|
||||
public static final String CONFIG_ABSENT = "配置不存在";
|
||||
|
||||
public static final String APP_PROFILE_NOT_CONFIGURED = "应用环境还未配置";
|
||||
|
||||
public static final String CHECKOUT_ACTION_PRESENT = "检出操作只能有一个";
|
||||
|
||||
public static final String TRANSFER_ACTION_PRESENT = "传输操作只能有一个";
|
||||
|
||||
public static final String ILLEGAL_MACHINE_SECRET_KEY = "密钥不合法, 请检查密码或使用 ssh-keygen -m PEM -t rsa 重新生成";
|
||||
|
||||
public static final String AUTO_AUDIT_RESOLVE = "自动审核通过";
|
||||
|
||||
public static final String AUDIT_NOT_REQUIRED = "无需审核";
|
||||
|
||||
public static final String RELEASE_ABSENT = "发布任务不存在";
|
||||
|
||||
public static final String RELEASE_MACHINE_ABSENT = "发布机器不存在";
|
||||
|
||||
public static final String OPERATOR_NOT_ALL_SUCCESS = "未全部执行成功";
|
||||
|
||||
public static final String UNKNOWN_RELEASE_MACHINE = "未知的发布机器";
|
||||
|
||||
public static final String ILLEGAL_STATUS = "当前状态不支持此操作";
|
||||
|
||||
public static final String FILE_ABSENT_UNABLE_ROLLBACK = "产物丢失无法回滚";
|
||||
|
||||
public static final String REPO_INIT_ERROR = "仓库初始化失败";
|
||||
|
||||
public static final String REPO_PATH_ABSENT = "仓库目录不存在";
|
||||
|
||||
public static final String REPO_UNABLE_CONNECT = "无法连接到远程仓库";
|
||||
|
||||
public static final String REPO_UNINITIALIZED = "仓库未初始化";
|
||||
|
||||
public static final String REPO_INITIALIZED = "远程仓库已初始化";
|
||||
|
||||
public static final String REPO_INITIALIZING = "远程仓库初始化中";
|
||||
|
||||
public static final String CHECKOUT_ERROR = "git clone 检出失败";
|
||||
|
||||
public static final String RESET_ERROR = "git reset 操作失败";
|
||||
|
||||
public static final String BUILD_ABSENT = "构建版本不存在";
|
||||
|
||||
public static final String BUNDLE_FILE_ABSENT = "构建产物不存在";
|
||||
|
||||
public static final String BUNDLE_ZIP_FILE_ABSENT = "构建产物压缩文件不存在";
|
||||
|
||||
public static final String UNABLE_CONFIG_RELEASE_MACHINE = "发布机器未配置";
|
||||
|
||||
public static final String NO_SUCH_FILE = "未找到文件或目录";
|
||||
|
||||
public static final String TASK_ABSENT = "任务不存在";
|
||||
|
||||
public static final String TASK_PRESENT = "任务已存在";
|
||||
|
||||
public static final String INVALID_CONFIG = "配置不合法";
|
||||
|
||||
public static final String ERROR_EXPRESSION = "表达式错误";
|
||||
|
||||
public static final String TIMED_GREATER_THAN_NOW = "定时操作时间不能小于当前时间";
|
||||
|
||||
public static final String TASK_NOT_ENABLED = "调度任务未启用";
|
||||
|
||||
public static final String SESSION_PRESENT = "会话不存在";
|
||||
|
||||
public static final String UPLOAD_TOO_LARGE = "上传文件大小不能大于 {}MB, 当前大小 {}";
|
||||
|
||||
public static final String PIPELINE_ABSENT = "流水线不存在";
|
||||
|
||||
public static final String PIPELINE_TASK_ABSENT = "流水线任务不存在";
|
||||
|
||||
public static final String PIPELINE_DETAIL_EMPTY = "流水线操作为空";
|
||||
|
||||
public static final String PIPELINE_DETAIL_ABSENT = "未查询到流水线操作";
|
||||
|
||||
public static final String APP_LAST_BUILD_VERSION_ABSENT = "{} 无构建版本";
|
||||
|
||||
public static final String EXECUTE_SFTP_ZIP_COMMAND_ERROR = "执行 zip 压缩命令失败";
|
||||
|
||||
public static final String SFTP_ZIP_FILE_ABSENT = "压缩文件不存在";
|
||||
|
||||
public static final String OPERATOR_TIMEOUT = "操作超时";
|
||||
|
||||
public static final String UNKNOWN_MACHINE_TAG = "未查询到机器: {}";
|
||||
|
||||
public static final String UNKNOWN_MACHINE_KEY = "未查询到机器密钥: {}";
|
||||
|
||||
public static final String UNKNOWN_APP_REPOSITORY = "未查询到应用仓库: {}";
|
||||
|
||||
public static final String AGENT_STATUS_IS_STARTING = "插件正在启动中";
|
||||
|
||||
public static final String AGENT_FILE_NON_EXIST = "插件包不存在 请参考文档并移动到: {}";
|
||||
|
||||
public static final String WEBHOOK_ABSENT = "webhook 不存在";
|
||||
|
||||
public static final String ALARM_GROUP_ABSENT = "报警组不存在";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package cn.orionsec.ops.constant;
|
||||
|
||||
public class ParamConst {
|
||||
|
||||
private ParamConst() {
|
||||
}
|
||||
|
||||
public static final String LIMIT = "limit";
|
||||
|
||||
public static final String NAME = "name";
|
||||
|
||||
public static final String MACHINE_ID = "machineId";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package cn.orionsec.ops.constant;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class PropertiesConst {
|
||||
|
||||
/**
|
||||
* 当前版本
|
||||
*/
|
||||
public static String ORION_OPS_VERSION;
|
||||
|
||||
/**
|
||||
* 登录 token 请求头
|
||||
*/
|
||||
public static String LOGIN_TOKEN_HEADER;
|
||||
|
||||
/**
|
||||
* 加密密钥
|
||||
*/
|
||||
public static String VALUE_MIX_SECRET_KEY;
|
||||
|
||||
/**
|
||||
* 机器监控插件最新版本
|
||||
*/
|
||||
public static String MACHINE_MONITOR_LATEST_VERSION;
|
||||
|
||||
@Value("${app.version}")
|
||||
private void setVersion(String version) {
|
||||
PropertiesConst.ORION_OPS_VERSION = version;
|
||||
}
|
||||
|
||||
@Value("${login.token.header}")
|
||||
private void setLoginTokenHeader(String loginTokenHeader) {
|
||||
PropertiesConst.LOGIN_TOKEN_HEADER = loginTokenHeader;
|
||||
}
|
||||
|
||||
@Value("${value.mix.secret.key}")
|
||||
private void setValueMixSecretKey(String valueMixSecretKey) {
|
||||
PropertiesConst.VALUE_MIX_SECRET_KEY = valueMixSecretKey;
|
||||
}
|
||||
|
||||
@Value("${machine.monitor.latest.version}")
|
||||
private void setMachineMonitorLatestVersion(String agentVersion) {
|
||||
PropertiesConst.MACHINE_MONITOR_LATEST_VERSION = agentVersion;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package cn.orionsec.ops.constant;
|
||||
|
||||
import cn.orionsec.kit.lang.define.wrapper.CodeInfo;
|
||||
|
||||
public enum ResultCode implements CodeInfo {
|
||||
|
||||
/**
|
||||
* 未认证
|
||||
*/
|
||||
UNAUTHORIZED(700, MessageConst.UNAUTHORIZED),
|
||||
|
||||
/**
|
||||
* 无权限
|
||||
*/
|
||||
NO_PERMISSION(710, MessageConst.NO_PERMISSION),
|
||||
|
||||
/**
|
||||
* 文件未找到
|
||||
*/
|
||||
FILE_MISSING(720, MessageConst.FILE_MISSING),
|
||||
|
||||
/**
|
||||
* IP封禁
|
||||
*/
|
||||
IP_BAN(730, MessageConst.IP_BAN),
|
||||
|
||||
/**
|
||||
* 用户禁用
|
||||
*/
|
||||
USER_DISABLED(740, MessageConst.USER_DISABLED),
|
||||
|
||||
/**
|
||||
* 非法访问
|
||||
*/
|
||||
ILLEGAL_ACCESS(750, MessageConst.ILLEGAL_ACCESS),
|
||||
|
||||
/**
|
||||
* 演示模式不支持此功能
|
||||
*/
|
||||
DEMO_DISABLE_API(760, MessageConst.DEMO_DISABLE_API),
|
||||
|
||||
;
|
||||
|
||||
private final int code;
|
||||
|
||||
private final String message;
|
||||
|
||||
ResultCode(int code, String message) {
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int code() {
|
||||
return code;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String message() {
|
||||
return message;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,245 @@
|
||||
package cn.orionsec.ops.constant;
|
||||
|
||||
import cn.orionsec.kit.lang.define.thread.ExecutorBuilder;
|
||||
import cn.orionsec.kit.lang.utils.Systems;
|
||||
import cn.orionsec.kit.lang.utils.Threads;
|
||||
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.SynchronousQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
public class SchedulerPools {
|
||||
|
||||
private SchedulerPools() {
|
||||
}
|
||||
|
||||
/**
|
||||
* terminal 调度线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor TERMINAL_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("terminal-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_60)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* terminal watcher 调度线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor TERMINAL_WATCHER_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("terminal-watcher-thread-")
|
||||
.corePoolSize(0)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 命令执行 调度线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor EXEC_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("exec-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* tail 调度线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor TAIL_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("tail-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_60)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
|
||||
/**
|
||||
* sftp 传输进度线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor SFTP_TRANSFER_RATE_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("sftp-transfer-rate-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
|
||||
/**
|
||||
* sftp 上传线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor SFTP_UPLOAD_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("sftp-upload-thread-")
|
||||
.corePoolSize(6)
|
||||
.maxPoolSize(6)
|
||||
.keepAliveTime(Const.MS_S_60)
|
||||
.workQueue(new LinkedBlockingQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* sftp 下载线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor SFTP_DOWNLOAD_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("sftp-download-thread-")
|
||||
.corePoolSize(6)
|
||||
.maxPoolSize(6)
|
||||
.keepAliveTime(Const.MS_S_60)
|
||||
.workQueue(new LinkedBlockingQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* sftp 打包线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor SFTP_PACKAGE_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("sftp-package-thread-")
|
||||
.corePoolSize(4)
|
||||
.maxPoolSize(4)
|
||||
.keepAliveTime(Const.MS_S_60)
|
||||
.workQueue(new LinkedBlockingQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 应用构建线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor APP_BUILD_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("app-build-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 应用发布 主线程操作线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor RELEASE_MAIN_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("release-main-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 应用发布 机器操作线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor RELEASE_MACHINE_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("release-machine-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 调度任务 主进程操作线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor SCHEDULER_TASK_MAIN_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("scheduler-task-main-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 调度任务 机器操作线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor SCHEDULER_TASK_MACHINE_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("scheduler-task-machine-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 应用流水线 线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor PIPELINE_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("pipeline-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 异步导入 线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor ASYNC_IMPORT_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("async-import-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(4)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new LinkedBlockingQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 插件安装 线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor AGENT_INSTALL_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("agent-install-thread-")
|
||||
.corePoolSize(4)
|
||||
.maxPoolSize(4)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new LinkedBlockingQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 机器报警 线程池
|
||||
*/
|
||||
public static final ThreadPoolExecutor MACHINE_ALARM_SCHEDULER = ExecutorBuilder.create()
|
||||
.namedThreadFactory("machine-alarm-thread-")
|
||||
.corePoolSize(1)
|
||||
.maxPoolSize(Integer.MAX_VALUE)
|
||||
.keepAliveTime(Const.MS_S_30)
|
||||
.workQueue(new SynchronousQueue<>())
|
||||
.allowCoreThreadTimeout(true)
|
||||
.build();
|
||||
|
||||
|
||||
static {
|
||||
Systems.addShutdownHook(() -> {
|
||||
Threads.shutdownPoolNow(TERMINAL_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(TERMINAL_WATCHER_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(EXEC_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(TAIL_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(SFTP_TRANSFER_RATE_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(SFTP_UPLOAD_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(SFTP_DOWNLOAD_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(SFTP_PACKAGE_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(APP_BUILD_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(RELEASE_MAIN_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(RELEASE_MACHINE_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(SCHEDULER_TASK_MAIN_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(SCHEDULER_TASK_MACHINE_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(PIPELINE_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(ASYNC_IMPORT_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(AGENT_INSTALL_SCHEDULER, Const.MS_S_3);
|
||||
Threads.shutdownPoolNow(MACHINE_ALARM_SCHEDULER, Const.MS_S_3);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
|
||||
package cn.orionsec.ops.constant.alarm;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum AlarmGroupNotifyType {
|
||||
|
||||
/**
|
||||
* webhook 通知
|
||||
*/
|
||||
WEBHOOK(10),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public static AlarmGroupNotifyType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (AlarmGroupNotifyType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ActionStatus {
|
||||
|
||||
/**
|
||||
* 未开始
|
||||
*/
|
||||
WAIT(10),
|
||||
|
||||
/**
|
||||
* 进行中
|
||||
*/
|
||||
RUNNABLE(20),
|
||||
|
||||
/**
|
||||
* 已完成
|
||||
*/
|
||||
FINISH(30),
|
||||
|
||||
/**
|
||||
* 执行失败
|
||||
*/
|
||||
FAILURE(40),
|
||||
|
||||
/**
|
||||
* 已跳过
|
||||
*/
|
||||
SKIPPED(50),
|
||||
|
||||
/**
|
||||
* 已终止
|
||||
*/
|
||||
TERMINATED(60),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static ActionStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (ActionStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@Getter
|
||||
public enum ActionType {
|
||||
|
||||
/**
|
||||
* 构建-检出代码
|
||||
*/
|
||||
BUILD_CHECKOUT(110, StageType.BUILD),
|
||||
|
||||
/**
|
||||
* 构建-机器命令
|
||||
*/
|
||||
BUILD_COMMAND(120, StageType.BUILD),
|
||||
|
||||
/**
|
||||
* 发布-传输产物
|
||||
*/
|
||||
RELEASE_TRANSFER(210, StageType.RELEASE),
|
||||
|
||||
/**
|
||||
* 发布-机器命令
|
||||
*/
|
||||
RELEASE_COMMAND(220, StageType.RELEASE),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final StageType stage;
|
||||
|
||||
private final Integer stageType;
|
||||
|
||||
ActionType(Integer type, StageType stage) {
|
||||
this.type = type;
|
||||
this.stage = stage;
|
||||
this.stageType = stage.getType();
|
||||
}
|
||||
|
||||
public static ActionType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (ActionType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ActionType of(Integer type, Integer stageType) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (ActionType value : values()) {
|
||||
if (value.type.equals(type) && value.stageType.equals(stageType)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否是构建action
|
||||
*
|
||||
* @param type type
|
||||
* @return res
|
||||
*/
|
||||
public static boolean isBuildAction(Integer type) {
|
||||
if (type == null) {
|
||||
return false;
|
||||
}
|
||||
for (ActionType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return StageType.BUILD.equals(value.stage);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否是发布action
|
||||
*
|
||||
* @param type type
|
||||
* @return res
|
||||
*/
|
||||
public static boolean isReleaseAction(Integer type) {
|
||||
if (type == null) {
|
||||
return false;
|
||||
}
|
||||
for (ActionType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return StageType.RELEASE.equals(value.stage);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import cn.orionsec.ops.constant.common.ExceptionHandlerType;
|
||||
import cn.orionsec.ops.constant.common.SerialType;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
|
||||
@Getter
|
||||
public enum ApplicationEnvAttr {
|
||||
|
||||
/**
|
||||
* 构建产物路径
|
||||
*/
|
||||
BUNDLE_PATH("宿主机构建产物路径 (绝对路径/基于版本仓库的相对路径)"),
|
||||
|
||||
/**
|
||||
* 产物传输路径
|
||||
*/
|
||||
TRANSFER_PATH("产物传输目标机器绝对路径"),
|
||||
|
||||
/**
|
||||
* 产物传输方式 (sftp/scp)
|
||||
*
|
||||
* @see TransferMode
|
||||
*/
|
||||
TRANSFER_MODE("产物传输方式 (sftp/scp)"),
|
||||
|
||||
/**
|
||||
* 产物传输文件类型 (normal/zip)
|
||||
*
|
||||
* @see TransferFileType
|
||||
*/
|
||||
TRANSFER_FILE_TYPE("产物传输文件类型 (normal/zip)"),
|
||||
|
||||
/**
|
||||
* 发布序列方式
|
||||
*
|
||||
* @see SerialType
|
||||
*/
|
||||
RELEASE_SERIAL("发布序列方式 (serial/parallel)"),
|
||||
|
||||
/**
|
||||
* 异常处理类型
|
||||
*
|
||||
* @see SerialType#SERIAL
|
||||
* @see ExceptionHandlerType
|
||||
*/
|
||||
EXCEPTION_HANDLER("异常处理类型 (skip_all/skip_error)"),
|
||||
|
||||
/**
|
||||
* 构建序列号
|
||||
*/
|
||||
BUILD_SEQ("构建序列号 (自增)"),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* key
|
||||
*/
|
||||
private final String key;
|
||||
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
private final String description;
|
||||
|
||||
ApplicationEnvAttr(String description) {
|
||||
this.description = description;
|
||||
this.key = this.name().toLowerCase();
|
||||
}
|
||||
|
||||
public static ApplicationEnvAttr of(String key) {
|
||||
if (key == null) {
|
||||
return null;
|
||||
}
|
||||
return Arrays.stream(values())
|
||||
.filter(a -> a.key.equals(key))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum BuildStatus {
|
||||
|
||||
/**
|
||||
* 未开始
|
||||
*/
|
||||
WAIT(10),
|
||||
|
||||
/**
|
||||
* 进行中
|
||||
*/
|
||||
RUNNABLE(20),
|
||||
|
||||
/**
|
||||
* 已完成
|
||||
*/
|
||||
FINISH(30),
|
||||
|
||||
/**
|
||||
* 执行失败
|
||||
*/
|
||||
FAILURE(40),
|
||||
|
||||
/**
|
||||
* 已终止
|
||||
*/
|
||||
TERMINATED(50),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static BuildStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (BuildStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum PipelineDetailStatus {
|
||||
|
||||
/**
|
||||
* 未开始
|
||||
*/
|
||||
WAIT(10),
|
||||
|
||||
/**
|
||||
* 进行中
|
||||
*/
|
||||
RUNNABLE(20),
|
||||
|
||||
/**
|
||||
* 已完成
|
||||
*/
|
||||
FINISH(30),
|
||||
|
||||
/**
|
||||
* 执行失败
|
||||
*/
|
||||
FAILURE(40),
|
||||
|
||||
/**
|
||||
* 已跳过
|
||||
*/
|
||||
SKIPPED(50),
|
||||
|
||||
/**
|
||||
* 已终止
|
||||
*/
|
||||
TERMINATED(60),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static PipelineDetailStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (PipelineDetailStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.ops.utils.Valid;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum PipelineLogStatus {
|
||||
|
||||
/**
|
||||
* 创建
|
||||
*/
|
||||
CREATE(10, "已创建应用 <sb>{}</sb> 构建任务 <sb>#{}</sb>",
|
||||
"已创建应用 <sb>{}</sb> 发布任务 <sb>#{}</sb>"),
|
||||
|
||||
/**
|
||||
* 开始执行
|
||||
*/
|
||||
EXEC(20, "开始执行应用 <sb>{}</sb> 构建任务",
|
||||
"开始执行应用 <sb>{}</sb> 发布任务"),
|
||||
|
||||
/**
|
||||
* 执行成功
|
||||
*/
|
||||
SUCCESS(30, "应用 <sb>{}</sb> 构建任务执行成功",
|
||||
"应用 <sb>{}</sb> 发布任务执行成功"),
|
||||
|
||||
/**
|
||||
* 执行失败
|
||||
*/
|
||||
FAILURE(40, "应用 <sb>{}</sb> 构建任务执行失败",
|
||||
"应用 <sb>{}</sb> 发布任务执行失败"),
|
||||
|
||||
/**
|
||||
* 停止执行
|
||||
*/
|
||||
TERMINATED(50, "应用 <sb>{}</sb> 构建任务已停止执行",
|
||||
"应用 <sb>{}</sb> 发布任务已停止执行"),
|
||||
|
||||
/**
|
||||
* 跳过执行
|
||||
*/
|
||||
SKIP(60, "应用 <sb>{}</sb> 构建任务已跳过执行",
|
||||
"应用 <sb>{}</sb> 发布任务已跳过执行"),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private final Integer status;
|
||||
|
||||
/**
|
||||
* 构建模板
|
||||
*/
|
||||
private final String buildTemplate;
|
||||
|
||||
/**
|
||||
* 发布模板
|
||||
*/
|
||||
private final String releaseTemplate;
|
||||
|
||||
/**
|
||||
* 格式日志
|
||||
*
|
||||
* @param stage stage
|
||||
* @param args 参数
|
||||
* @return log
|
||||
*/
|
||||
public String format(StageType stage, Object... args) {
|
||||
Valid.notNull(stage);
|
||||
if (StageType.BUILD.equals(stage)) {
|
||||
return Strings.format(buildTemplate, args);
|
||||
} else if (StageType.RELEASE.equals(stage)) {
|
||||
return Strings.format(releaseTemplate, args);
|
||||
} else {
|
||||
return Strings.EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum PipelineStatus {
|
||||
|
||||
/**
|
||||
* 待审核
|
||||
*/
|
||||
WAIT_AUDIT(10),
|
||||
|
||||
/**
|
||||
* 审核驳回
|
||||
*/
|
||||
AUDIT_REJECT(20),
|
||||
|
||||
/**
|
||||
* 待执行
|
||||
*/
|
||||
WAIT_RUNNABLE(30),
|
||||
|
||||
/**
|
||||
* 待调度
|
||||
*/
|
||||
WAIT_SCHEDULE(35),
|
||||
|
||||
/**
|
||||
* 执行中
|
||||
*/
|
||||
RUNNABLE(40),
|
||||
|
||||
/**
|
||||
* 执行完成
|
||||
*/
|
||||
FINISH(50),
|
||||
|
||||
/**
|
||||
* 执行停止
|
||||
*/
|
||||
TERMINATED(60),
|
||||
|
||||
/**
|
||||
* 执行失败
|
||||
*/
|
||||
FAILURE(70),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static PipelineStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (PipelineStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ReleaseStatus {
|
||||
|
||||
/**
|
||||
* 待审核
|
||||
*/
|
||||
WAIT_AUDIT(10),
|
||||
|
||||
/**
|
||||
* 审核驳回
|
||||
*/
|
||||
AUDIT_REJECT(20),
|
||||
|
||||
/**
|
||||
* 待发布
|
||||
*/
|
||||
WAIT_RUNNABLE(30),
|
||||
|
||||
/**
|
||||
* 待调度
|
||||
*/
|
||||
WAIT_SCHEDULE(35),
|
||||
|
||||
/**
|
||||
* 发布中
|
||||
*/
|
||||
RUNNABLE(40),
|
||||
|
||||
/**
|
||||
* 发布完成
|
||||
*/
|
||||
FINISH(50),
|
||||
|
||||
/**
|
||||
* 发布停止
|
||||
*/
|
||||
TERMINATED(60),
|
||||
|
||||
/**
|
||||
* 发布失败
|
||||
*/
|
||||
FAILURE(70),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static ReleaseStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (ReleaseStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ReleaseType {
|
||||
|
||||
/**
|
||||
* 正常发布
|
||||
*/
|
||||
NORMAL(10),
|
||||
|
||||
/**
|
||||
* 回滚发布
|
||||
*/
|
||||
ROLLBACK(20),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public static ReleaseType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (ReleaseType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import cn.orionsec.ops.constant.CnConst;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum RepositoryAuthType {
|
||||
|
||||
/**
|
||||
* 密码
|
||||
*/
|
||||
PASSWORD(10, CnConst.PASSWORD),
|
||||
|
||||
/**
|
||||
* 私人令牌
|
||||
*/
|
||||
TOKEN(20, CnConst.TOKEN),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static RepositoryAuthType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (RepositoryAuthType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static RepositoryAuthType of(String label) {
|
||||
if (label == null) {
|
||||
return null;
|
||||
}
|
||||
for (RepositoryAuthType value : values()) {
|
||||
if (value.label.equals(label)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum RepositoryStatus {
|
||||
|
||||
/**
|
||||
* 未初始化
|
||||
*/
|
||||
UNINITIALIZED(10),
|
||||
|
||||
/**
|
||||
* 初始化中
|
||||
*/
|
||||
INITIALIZING(20),
|
||||
|
||||
/**
|
||||
* 正常
|
||||
*/
|
||||
OK(30),
|
||||
|
||||
/**
|
||||
* 失败
|
||||
*/
|
||||
ERROR(40),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private final Integer status;
|
||||
|
||||
public static RepositoryStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (RepositoryStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum RepositoryTokenType {
|
||||
|
||||
/**
|
||||
* github
|
||||
* <p>
|
||||
* username: ''
|
||||
*/
|
||||
GITHUB(10, Const.GITHUB),
|
||||
|
||||
/**
|
||||
* gitee
|
||||
* <p>
|
||||
* username: username
|
||||
*/
|
||||
GITEE(20, Const.GITEE),
|
||||
|
||||
/**
|
||||
* gitlab
|
||||
* <p>
|
||||
* username oauth
|
||||
*/
|
||||
GITLAB(30, Const.GITLAB),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static RepositoryTokenType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (RepositoryTokenType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static RepositoryTokenType of(String label) {
|
||||
if (label == null) {
|
||||
return null;
|
||||
}
|
||||
for (RepositoryTokenType value : values()) {
|
||||
if (value.label.equals(label.toLowerCase())) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum RepositoryType {
|
||||
|
||||
/**
|
||||
* git
|
||||
*/
|
||||
GIT(1),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public static RepositoryType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (RepositoryType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum StageType {
|
||||
|
||||
/**
|
||||
* 构建
|
||||
*/
|
||||
BUILD(10, "构建"),
|
||||
|
||||
/**
|
||||
* 发布
|
||||
*/
|
||||
RELEASE(20, "发布"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static StageType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (StageType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum TimedType {
|
||||
|
||||
/**
|
||||
* 普通
|
||||
*/
|
||||
NORMAL(10),
|
||||
|
||||
/**
|
||||
* 定时
|
||||
*/
|
||||
TIMED(20),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public static TimedType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (TimedType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum TransferFileType {
|
||||
|
||||
/**
|
||||
* 文件 / 文件夹
|
||||
*/
|
||||
NORMAL,
|
||||
|
||||
/**
|
||||
* 文件夹 zip 文件
|
||||
*/
|
||||
ZIP,
|
||||
|
||||
;
|
||||
|
||||
TransferFileType() {
|
||||
this.value = name().toLowerCase();
|
||||
}
|
||||
|
||||
private final String value;
|
||||
|
||||
public static TransferFileType of(String value) {
|
||||
if (value == null) {
|
||||
return NORMAL;
|
||||
}
|
||||
for (TransferFileType type : values()) {
|
||||
if (type.value.equals(value)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
return NORMAL;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
|
||||
package cn.orionsec.ops.constant.app;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum TransferMode {
|
||||
|
||||
/**
|
||||
* scp
|
||||
*/
|
||||
SCP,
|
||||
|
||||
/**
|
||||
* sftp
|
||||
*/
|
||||
SFTP,
|
||||
|
||||
;
|
||||
|
||||
TransferMode() {
|
||||
this.value = name().toLowerCase();
|
||||
}
|
||||
|
||||
private final String value;
|
||||
|
||||
public static TransferMode of(String value) {
|
||||
if (value == null) {
|
||||
return SCP;
|
||||
}
|
||||
for (TransferMode type : values()) {
|
||||
if (type.value.equals(value)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
return SCP;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
|
||||
package cn.orionsec.ops.constant.command;
|
||||
|
||||
import cn.orionsec.ops.constant.env.EnvConst;
|
||||
|
||||
|
||||
public class CommandConst {
|
||||
|
||||
private CommandConst() {
|
||||
}
|
||||
|
||||
public static final String TAIL_FILE_DEFAULT = "tail -f -n "
|
||||
+ EnvConst.getReplaceVariable(EnvConst.OFFSET)
|
||||
+ " '" + EnvConst.getReplaceVariable(EnvConst.FILE)
|
||||
+ "'";
|
||||
|
||||
public static final String SCP_TRANSFER_DEFAULT = "scp \""
|
||||
+ EnvConst.getReplaceVariable(EnvConst.BUNDLE_PATH)
|
||||
+ "\" " + EnvConst.getReplaceVariable(EnvConst.TARGET_USERNAME)
|
||||
+ "@" + EnvConst.getReplaceVariable(EnvConst.TARGET_HOST)
|
||||
+ ":\"" + EnvConst.getReplaceVariable(EnvConst.TRANSFER_PATH)
|
||||
+ "\"";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
|
||||
package cn.orionsec.ops.constant.command;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ExecStatus {
|
||||
|
||||
/**
|
||||
* 10未开始
|
||||
*/
|
||||
WAITING(10),
|
||||
|
||||
/**
|
||||
* 20执行中
|
||||
*/
|
||||
RUNNABLE(20),
|
||||
|
||||
/**
|
||||
* 30执行完成
|
||||
*/
|
||||
COMPLETE(30),
|
||||
|
||||
/**
|
||||
* 40执行异常
|
||||
*/
|
||||
EXCEPTION(40),
|
||||
|
||||
/**
|
||||
* 50执行终止
|
||||
*/
|
||||
TERMINATED(50),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static ExecStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (ExecStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
|
||||
package cn.orionsec.ops.constant.command;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ExecType {
|
||||
|
||||
/**
|
||||
* 批量执行
|
||||
*/
|
||||
BATCH_EXEC(10),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
private final Integer type;
|
||||
|
||||
public static ExecType of(Integer type) {
|
||||
for (ExecType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
|
||||
package cn.orionsec.ops.constant.common;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum AuditStatus {
|
||||
|
||||
/**
|
||||
* 通过
|
||||
*/
|
||||
RESOLVE(10),
|
||||
|
||||
/**
|
||||
* 驳回
|
||||
*/
|
||||
REJECT(20),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static AuditStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (AuditStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
|
||||
package cn.orionsec.ops.constant.common;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum EnableType {
|
||||
|
||||
/**
|
||||
* 启用
|
||||
*/
|
||||
ENABLED(Boolean.TRUE, "enabled"),
|
||||
|
||||
/**
|
||||
* 停用
|
||||
*/
|
||||
DISABLED(Boolean.FALSE, "disabled"),
|
||||
|
||||
;
|
||||
|
||||
private final Boolean value;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static EnableType of(String label) {
|
||||
if (label == null) {
|
||||
return DISABLED;
|
||||
}
|
||||
for (EnableType value : values()) {
|
||||
if (value.label.equals(label)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return DISABLED;
|
||||
}
|
||||
|
||||
public static EnableType of(Boolean value) {
|
||||
if (value == null) {
|
||||
return DISABLED;
|
||||
}
|
||||
for (EnableType type : values()) {
|
||||
if (type.value.equals(value)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
return DISABLED;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
|
||||
package cn.orionsec.ops.constant.common;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum ExceptionHandlerType {
|
||||
|
||||
/**
|
||||
* 跳过所有 中断执行
|
||||
*/
|
||||
SKIP_ALL(10, "skip_all"),
|
||||
|
||||
/**
|
||||
* 跳过错误 继续执行
|
||||
*/
|
||||
SKIP_ERROR(20, "skip_error"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String value;
|
||||
|
||||
public static ExceptionHandlerType of(Integer type) {
|
||||
if (type == null) {
|
||||
return ExceptionHandlerType.SKIP_ALL;
|
||||
}
|
||||
for (ExceptionHandlerType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return ExceptionHandlerType.SKIP_ALL;
|
||||
}
|
||||
|
||||
public static ExceptionHandlerType of(String value) {
|
||||
if (value == null) {
|
||||
return ExceptionHandlerType.SKIP_ALL;
|
||||
}
|
||||
for (ExceptionHandlerType type : values()) {
|
||||
if (type.value.equals(value)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
return ExceptionHandlerType.SKIP_ALL;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package cn.orionsec.ops.constant.common;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum SerialType {
|
||||
|
||||
/**
|
||||
* 串行
|
||||
*/
|
||||
SERIAL(10, "serial"),
|
||||
|
||||
/**
|
||||
* 并行
|
||||
*/
|
||||
PARALLEL(20, "parallel"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String value;
|
||||
|
||||
public static SerialType of(Integer type) {
|
||||
if (type == null) {
|
||||
return PARALLEL;
|
||||
}
|
||||
for (SerialType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return PARALLEL;
|
||||
}
|
||||
|
||||
public static SerialType of(String value) {
|
||||
if (value == null) {
|
||||
return PARALLEL;
|
||||
}
|
||||
for (SerialType type : values()) {
|
||||
if (type.value.equalsIgnoreCase(value)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
return PARALLEL;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,245 @@
|
||||
/*
|
||||
* Copyright (c) 2021 - present Jiahang Li All rights reserved.
|
||||
*
|
||||
* https://ops.orionsec.cn
|
||||
*
|
||||
* Members:
|
||||
* Jiahang Li - ljh1553488six@139.com - author
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.orionsec.ops.constant.common;
|
||||
|
||||
/**
|
||||
* ANSI 高亮颜色转义码
|
||||
* <p>
|
||||
* \u001B = \x1b = 27 = esc
|
||||
* <p>
|
||||
* 基本8色 基本高对比色 xterm 256 色
|
||||
* 30 ~ 37 90 ~ 97 0 ~ 256
|
||||
* <p>
|
||||
* \033[0m 关闭所有属性
|
||||
* \033[1m 设置高亮度
|
||||
* \033[4m 下划线
|
||||
* \033[5m 闪烁
|
||||
* \033[7m 反显
|
||||
* \033[8m 消隐
|
||||
* \033[30m 至 \33[37m 设置前景色
|
||||
* \033[40m 至 \33[47m 设置背景色
|
||||
* \033[nA 光标上移n行
|
||||
* \033[nB 光标下移n行
|
||||
* \033[nC 光标右移n行
|
||||
* \033[nD 光标左移n行
|
||||
* \033[y;xH 设置光标位置
|
||||
* \033[2J 清屏
|
||||
* \033[K 清除从光标到行尾的内容
|
||||
* \033[s 保存光标位置
|
||||
* \033[u 恢复光标位置
|
||||
* \033[?25l 隐藏光标
|
||||
* \033[?25h 显示光标
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
* @since 2022/4/20 23:16
|
||||
*/
|
||||
public class StainCode {
|
||||
|
||||
private StainCode() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 结束
|
||||
* \x1b[0m
|
||||
*/
|
||||
public static String SUFFIX = (char) 27 + "[0m";
|
||||
|
||||
// -------------------- 颜色 --------------------
|
||||
|
||||
/**
|
||||
* 黑色
|
||||
*/
|
||||
public static final int BLACK = 30;
|
||||
|
||||
/**
|
||||
* 红色
|
||||
*/
|
||||
public static final int RED = 31;
|
||||
|
||||
/**
|
||||
* 绿色
|
||||
*/
|
||||
public static final int GREEN = 32;
|
||||
|
||||
/**
|
||||
* 黄色
|
||||
*/
|
||||
public static final int YELLOW = 33;
|
||||
|
||||
/**
|
||||
* 蓝色
|
||||
*/
|
||||
public static final int BLUE = 34;
|
||||
|
||||
/**
|
||||
* 紫色
|
||||
*/
|
||||
public static final int PURPLE = 35;
|
||||
|
||||
/**
|
||||
* 青色
|
||||
*/
|
||||
public static final int CYAN = 36;
|
||||
|
||||
/**
|
||||
* 白色
|
||||
*/
|
||||
public static final int WHITE = 37;
|
||||
|
||||
// -------------------- 背景色 --------------------
|
||||
|
||||
/**
|
||||
* 黑色 背景色
|
||||
*/
|
||||
public static final int BG_BLACK = 40;
|
||||
|
||||
/**
|
||||
* 红色 背景色
|
||||
*/
|
||||
public static final int BG_RED = 41;
|
||||
|
||||
/**
|
||||
* 绿色 背景色
|
||||
*/
|
||||
public static final int BG_GREEN = 42;
|
||||
|
||||
/**
|
||||
* 黄色 背景色
|
||||
*/
|
||||
public static final int BG_YELLOW = 43;
|
||||
|
||||
/**
|
||||
* 蓝色 背景色
|
||||
*/
|
||||
public static final int BG_BLUE = 44;
|
||||
|
||||
/**
|
||||
* 紫色 背景色
|
||||
*/
|
||||
public static final int BG_PURPLE = 45;
|
||||
|
||||
/**
|
||||
* 青色 背景色
|
||||
*/
|
||||
public static final int BG_CYAN = 46;
|
||||
|
||||
/**
|
||||
* 白色 背景色
|
||||
*/
|
||||
public static final int BG_WHITE = 47;
|
||||
|
||||
// -------------------- 亮色 --------------------
|
||||
|
||||
/**
|
||||
* 亮黑色 (灰)
|
||||
*/
|
||||
public static final int GLOSS_BLACK = 90;
|
||||
|
||||
/**
|
||||
* 亮红色
|
||||
*/
|
||||
public static final int GLOSS_RED = 91;
|
||||
|
||||
/**
|
||||
* 亮绿色
|
||||
*/
|
||||
public static final int GLOSS_GREEN = 92;
|
||||
|
||||
/**
|
||||
* 亮黄色
|
||||
*/
|
||||
public static final int GLOSS_YELLOW = 93;
|
||||
|
||||
/**
|
||||
* 亮蓝色
|
||||
*/
|
||||
public static final int GLOSS_BLUE = 94;
|
||||
|
||||
/**
|
||||
* 亮紫色
|
||||
*/
|
||||
public static final int GLOSS_PURPLE = 95;
|
||||
|
||||
/**
|
||||
* 亮青色
|
||||
*/
|
||||
public static final int GLOSS_CYAN = 96;
|
||||
|
||||
/**
|
||||
* 亮白色
|
||||
*/
|
||||
public static final int GLOSS_WHITE = 97;
|
||||
|
||||
// -------------------- 亮背景色 --------------------
|
||||
|
||||
/**
|
||||
* 亮黑色 (灰) 背景色
|
||||
*/
|
||||
public static final int BG_GLOSS_BLACK = 100;
|
||||
|
||||
/**
|
||||
* 亮红色 背景色
|
||||
*/
|
||||
public static final int BG_GLOSS_RED = 101;
|
||||
|
||||
/**
|
||||
* 亮绿色 背景色
|
||||
*/
|
||||
public static final int BG_GLOSS_GREEN = 102;
|
||||
|
||||
/**
|
||||
* 亮黄色 背景色
|
||||
*/
|
||||
public static final int BG_GLOSS_YELLOW = 103;
|
||||
|
||||
/**
|
||||
* 亮蓝色 背景色
|
||||
*/
|
||||
public static final int BG_GLOSS_BLUE = 104;
|
||||
|
||||
/**
|
||||
* 亮紫色 背景色
|
||||
*/
|
||||
public static final int BG_GLOSS_PURPLE = 105;
|
||||
|
||||
/**
|
||||
* 亮青色 背景色
|
||||
*/
|
||||
public static final int BG_GLOSS_CYAN = 106;
|
||||
|
||||
/**
|
||||
* 亮白色 背景色
|
||||
*/
|
||||
public static final int BG_GLOSS_WHITE = 107;
|
||||
|
||||
/**
|
||||
* 获取颜色前缀
|
||||
* .e.g \x1b[31m
|
||||
*
|
||||
* @param code code
|
||||
* @return 前缀
|
||||
*/
|
||||
public static String prefix(int code) {
|
||||
return (char) 27 + "[" + code + "m";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package cn.orionsec.ops.constant.common;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum TreeMoveType {
|
||||
|
||||
/**
|
||||
* 移动到内层 上面
|
||||
*/
|
||||
IN_TOP(1),
|
||||
|
||||
/**
|
||||
* 移动到内层 下面
|
||||
*/
|
||||
IN_BOTTOM(2),
|
||||
|
||||
/**
|
||||
* 移动到节点 上面
|
||||
*/
|
||||
PREV(3),
|
||||
|
||||
/**
|
||||
* 移动到节点 下面
|
||||
*/
|
||||
NEXT(4),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public static TreeMoveType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (TreeMoveType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package cn.orionsec.ops.constant.download;
|
||||
|
||||
import cn.orionsec.ops.constant.system.SystemEnvAttr;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum FileDownloadType {
|
||||
|
||||
/**
|
||||
* 密钥
|
||||
*
|
||||
* @see SystemEnvAttr#KEY_PATH
|
||||
*/
|
||||
SECRET_KEY(10),
|
||||
|
||||
/**
|
||||
* terminal 录屏
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
TERMINAL_SCREEN(20),
|
||||
|
||||
/**
|
||||
* 命令 执行日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
EXEC_LOG(30),
|
||||
|
||||
/**
|
||||
* sftp 下载文件
|
||||
*
|
||||
* @see SystemEnvAttr#SWAP_PATH
|
||||
*/
|
||||
SFTP_DOWNLOAD(40),
|
||||
|
||||
/**
|
||||
* tail 列表文件
|
||||
*/
|
||||
TAIL_LIST_FILE(50),
|
||||
|
||||
/**
|
||||
* 应用构建日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
APP_BUILD_LOG(60),
|
||||
|
||||
/**
|
||||
* 应用构建操作日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
APP_ACTION_LOG(70),
|
||||
|
||||
/**
|
||||
* 应用构建 产物文件
|
||||
*
|
||||
* @see SystemEnvAttr#DIST_PATH
|
||||
*/
|
||||
APP_BUILD_BUNDLE(80),
|
||||
|
||||
/**
|
||||
* 应用发布 机器日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
APP_RELEASE_MACHINE_LOG(90),
|
||||
|
||||
/**
|
||||
* 调度任务机器日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
SCHEDULER_TASK_MACHINE_LOG(110),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
private final Integer type;
|
||||
|
||||
public static FileDownloadType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (FileDownloadType value : values()) {
|
||||
if (type.equals(value.type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
99
orion-ops-api/orion-ops-common/src/main/java/cn/orionsec/ops/constant/env/EnvConst.java
vendored
Normal file
99
orion-ops-api/orion-ops-common/src/main/java/cn/orionsec/ops/constant/env/EnvConst.java
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
|
||||
package cn.orionsec.ops.constant.env;
|
||||
|
||||
public class EnvConst {
|
||||
|
||||
private EnvConst() {
|
||||
}
|
||||
|
||||
// -------------------- symbol --------------------
|
||||
|
||||
public static final String SYMBOL = "@";
|
||||
|
||||
// -------------------- prefix --------------------
|
||||
|
||||
public static final String MACHINE_PREFIX = "machine.";
|
||||
|
||||
public static final String APP_PREFIX = "app.";
|
||||
|
||||
public static final String BUILD_PREFIX = "build.";
|
||||
|
||||
public static final String RELEASE_PREFIX = "release.";
|
||||
|
||||
public static final String SYSTEM_PREFIX = "system.";
|
||||
|
||||
// -------------------- machine --------------------
|
||||
|
||||
public static final String MACHINE_ID = "machine_id";
|
||||
|
||||
public static final String MACHINE_NAME = "machine_name";
|
||||
|
||||
public static final String MACHINE_TAG = "machine_tag";
|
||||
|
||||
public static final String MACHINE_HOST = "machine_host";
|
||||
|
||||
public static final String MACHINE_PORT = "machine_port";
|
||||
|
||||
public static final String MACHINE_USERNAME = "machine_username";
|
||||
|
||||
// -------------------- app --------------------
|
||||
|
||||
public static final String APP_ID = "app_id";
|
||||
|
||||
public static final String APP_NAME = "app_name";
|
||||
|
||||
public static final String APP_TAG = "app_tag";
|
||||
|
||||
public static final String PROFILE_ID = "profile_id";
|
||||
|
||||
public static final String PROFILE_NAME = "profile_name";
|
||||
|
||||
public static final String PROFILE_TAG = "profile_tag";
|
||||
|
||||
// -------------------- build --------------------
|
||||
|
||||
public static final String BUILD_ID = "build_id";
|
||||
|
||||
public static final String BUILD_SEQ = "build_seq";
|
||||
|
||||
public static final String REPO_HOME = "repo_home";
|
||||
|
||||
public static final String REPO_EVENT_HOME = "repo_event_home";
|
||||
|
||||
public static final String BRANCH = "branch";
|
||||
|
||||
public static final String COMMIT = "commit";
|
||||
|
||||
public static final String BUNDLE_PATH = "bundle_path";
|
||||
|
||||
// -------------------- release --------------------
|
||||
|
||||
public static final String RELEASE_ID = "release_id";
|
||||
|
||||
public static final String RELEASE_TITLE = "release_title";
|
||||
|
||||
public static final String TRANSFER_PATH = "transfer_path";
|
||||
|
||||
// -------------------- tail --------------------
|
||||
|
||||
public static final String OFFSET = "offset";
|
||||
|
||||
public static final String FILE = "file";
|
||||
|
||||
// -------------------- scp --------------------
|
||||
|
||||
public static final String TARGET_USERNAME = "target_username";
|
||||
|
||||
public static final String TARGET_HOST = "target_host";
|
||||
|
||||
/**
|
||||
* 获取替换变量
|
||||
*
|
||||
* @param name name
|
||||
* @return command
|
||||
*/
|
||||
public static String getReplaceVariable(String name) {
|
||||
return SYMBOL + "{" + name + "}";
|
||||
}
|
||||
|
||||
}
|
||||
92
orion-ops-api/orion-ops-common/src/main/java/cn/orionsec/ops/constant/env/EnvViewType.java
vendored
Normal file
92
orion-ops-api/orion-ops-common/src/main/java/cn/orionsec/ops/constant/env/EnvViewType.java
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
package cn.orionsec.ops.constant.env;
|
||||
|
||||
import cn.orionsec.kit.lang.define.collect.MutableLinkedHashMap;
|
||||
import cn.orionsec.ops.utils.AttrConverts;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@AllArgsConstructor
|
||||
public enum EnvViewType {
|
||||
|
||||
/**
|
||||
* json
|
||||
*/
|
||||
JSON(10) {
|
||||
@Override
|
||||
public String toValue(Map<String, String> value) {
|
||||
return AttrConverts.toJson(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MutableLinkedHashMap<String, String> toMap(String value) {
|
||||
return AttrConverts.fromJson(value);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* xml
|
||||
*/
|
||||
XML(20) {
|
||||
@Override
|
||||
public String toValue(Map<String, String> value) {
|
||||
return AttrConverts.toXml(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MutableLinkedHashMap<String, String> toMap(String value) {
|
||||
return AttrConverts.fromXml(value);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* yml
|
||||
*/
|
||||
YML(30) {
|
||||
@Override
|
||||
public String toValue(Map<String, String> value) {
|
||||
return AttrConverts.toYml(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MutableLinkedHashMap<String, String> toMap(String value) {
|
||||
return AttrConverts.fromYml(value);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* properties
|
||||
*/
|
||||
PROPERTIES(40) {
|
||||
@Override
|
||||
public String toValue(Map<String, String> value) {
|
||||
return AttrConverts.toProperties(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MutableLinkedHashMap<String, String> toMap(String value) {
|
||||
return AttrConverts.fromProperties(value);
|
||||
}
|
||||
},
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public abstract String toValue(Map<String, String> value);
|
||||
|
||||
public abstract MutableLinkedHashMap<String, String> toMap(String value);
|
||||
|
||||
public static EnvViewType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (EnvViewType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,171 @@
|
||||
package cn.orionsec.ops.constant.event;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum EventClassify {
|
||||
|
||||
/**
|
||||
* 认证操作
|
||||
*/
|
||||
AUTHENTICATION(100, "认证操作"),
|
||||
|
||||
/**
|
||||
* 用户操作
|
||||
*/
|
||||
USER(110, "用户操作"),
|
||||
|
||||
/**
|
||||
* 报警组操作
|
||||
*/
|
||||
ALARM_GROUP(120, "报警组操作"),
|
||||
|
||||
/**
|
||||
* 机器操作
|
||||
*/
|
||||
MACHINE(200, "机器操作"),
|
||||
|
||||
/**
|
||||
* 机器环境变量操作
|
||||
*/
|
||||
MACHINE_ENV(210, "机器环境变量操作"),
|
||||
|
||||
/**
|
||||
* 密钥操作
|
||||
*/
|
||||
MACHINE_KEY(220, "密钥操作"),
|
||||
|
||||
/**
|
||||
* 代理操作
|
||||
*/
|
||||
MACHINE_PROXY(230, "代理操作"),
|
||||
|
||||
/**
|
||||
* 机器监控
|
||||
*/
|
||||
MACHINE_MONITOR(240, "机器监控"),
|
||||
|
||||
/**
|
||||
* 机器报警
|
||||
*/
|
||||
MACHINE_ALARM(250, "机器报警"),
|
||||
|
||||
/**
|
||||
* 终端操作
|
||||
*/
|
||||
TERMINAL(260, "终端操作"),
|
||||
|
||||
/**
|
||||
* sftp 操作
|
||||
*/
|
||||
SFTP(270, "sftp 操作"),
|
||||
|
||||
/**
|
||||
* 批量执行操作
|
||||
*/
|
||||
EXEC(300, "批量执行操作"),
|
||||
|
||||
/**
|
||||
* 日志追踪操作
|
||||
*/
|
||||
TAIL(310, "日志追踪操作"),
|
||||
|
||||
/**
|
||||
* 调度操作
|
||||
*/
|
||||
SCHEDULER(320, "调度操作"),
|
||||
|
||||
/**
|
||||
* 应用操作
|
||||
*/
|
||||
APP(400, "应用操作"),
|
||||
|
||||
/**
|
||||
* 环境操作
|
||||
*/
|
||||
PROFILE(410, "环境操作"),
|
||||
|
||||
/**
|
||||
* 应用环境变量操作
|
||||
*/
|
||||
APP_ENV(420, "应用环境变量操作"),
|
||||
|
||||
/**
|
||||
* 应用仓库操作
|
||||
*/
|
||||
REPOSITORY(430, "应用仓库操作"),
|
||||
|
||||
/**
|
||||
* 应用构建操作
|
||||
*/
|
||||
BUILD(440, "应用构建操作"),
|
||||
|
||||
/**
|
||||
* 应用发布操作
|
||||
*/
|
||||
RELEASE(450, "应用发布操作"),
|
||||
|
||||
/**
|
||||
* 应用流水线
|
||||
*/
|
||||
PIPELINE(460, "应用流水线"),
|
||||
|
||||
/**
|
||||
* 模板操作
|
||||
*/
|
||||
TEMPLATE(500, "模板操作"),
|
||||
|
||||
/**
|
||||
* webhook 操作
|
||||
*/
|
||||
WEBHOOK(510, "webhook操作"),
|
||||
|
||||
/**
|
||||
* 系统操作
|
||||
*/
|
||||
SYSTEM(600, "系统操作"),
|
||||
|
||||
/**
|
||||
* 系统环境变量操作
|
||||
*/
|
||||
SYSTEM_ENV(610, "系统环境变量操作"),
|
||||
|
||||
/**
|
||||
* 数据清理
|
||||
*/
|
||||
DATA_CLEAR(620, "数据清理"),
|
||||
|
||||
/**
|
||||
* 数据导入
|
||||
*/
|
||||
DATA_IMPORT(630, "数据导入"),
|
||||
|
||||
/**
|
||||
* 数据导出
|
||||
*/
|
||||
DATA_EXPORT(640, "数据导出"),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* 分类
|
||||
*/
|
||||
private final Integer classify;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static EventClassify of(Integer classify) {
|
||||
if (classify == null) {
|
||||
return null;
|
||||
}
|
||||
for (EventClassify value : values()) {
|
||||
if (value.classify.equals(classify)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,268 @@
|
||||
package cn.orionsec.ops.constant.event;
|
||||
|
||||
public class EventKeys {
|
||||
|
||||
private EventKeys() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 内置用户id
|
||||
*/
|
||||
public static final String INNER_USER_ID = "_USER_ID_";
|
||||
|
||||
/**
|
||||
* 内置用户名称
|
||||
*/
|
||||
public static final String INNER_USER_NAME = "_USER_NAME_";
|
||||
|
||||
/**
|
||||
* 内置是否保存
|
||||
*/
|
||||
public static final String INNER_SAVE = "_SAVE_";
|
||||
|
||||
/**
|
||||
* 内置模板
|
||||
*/
|
||||
public static final String INNER_TEMPLATE = "_TEMPLATE_";
|
||||
|
||||
/**
|
||||
* 请求序列
|
||||
*/
|
||||
public static final String INNER_REQUEST_SEQ = "_REQUEST_SEQ_";
|
||||
|
||||
/**
|
||||
* 请求 UA
|
||||
*/
|
||||
public static final String INNER_REQUEST_USER_AGENT = "userAgent";
|
||||
|
||||
/**
|
||||
* 请求 ip
|
||||
*/
|
||||
public static final String INNER_REQUEST_IP = "ip";
|
||||
|
||||
/**
|
||||
* 请求时间
|
||||
*/
|
||||
public static final String INNER_REQUEST_TIME = "requestTime";
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
public static final String ID = "id";
|
||||
|
||||
/**
|
||||
* id list
|
||||
*/
|
||||
public static final String ID_LIST = "idList";
|
||||
|
||||
/**
|
||||
* machine id
|
||||
*/
|
||||
public static final String MACHINE_ID = "machineId";
|
||||
|
||||
/**
|
||||
* machine id list
|
||||
*/
|
||||
public static final String MACHINE_ID_LIST = "machineIdList";
|
||||
|
||||
/**
|
||||
* app id
|
||||
*/
|
||||
public static final String APP_ID = "appId";
|
||||
|
||||
/**
|
||||
* profile id
|
||||
*/
|
||||
public static final String PROFILE_ID = "profileId";
|
||||
|
||||
/**
|
||||
* detail id
|
||||
*/
|
||||
public static final String DETAIL_ID = "detailId";
|
||||
|
||||
/**
|
||||
* type
|
||||
*/
|
||||
public static final String TYPE = "type";
|
||||
|
||||
/**
|
||||
* value
|
||||
*/
|
||||
public static final String VALUE = "value";
|
||||
|
||||
/**
|
||||
* token
|
||||
*/
|
||||
public static final String TOKEN = "token";
|
||||
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
public static final String NAME = "name";
|
||||
|
||||
/**
|
||||
* 主机
|
||||
*/
|
||||
public static final String HOST = "host";
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
public static final String USERNAME = "username";
|
||||
|
||||
/**
|
||||
* 源
|
||||
*/
|
||||
public static final String SOURCE = "source";
|
||||
|
||||
/**
|
||||
* 目标
|
||||
*/
|
||||
public static final String TARGET = "target";
|
||||
|
||||
/**
|
||||
* 数量
|
||||
*/
|
||||
public static final String COUNT = "count";
|
||||
|
||||
/**
|
||||
* 环境数量
|
||||
*/
|
||||
public static final String ENV_COUNT = "envCount";
|
||||
|
||||
/**
|
||||
* 机器数量
|
||||
*/
|
||||
public static final String MACHINE_COUNT = "machineCount";
|
||||
|
||||
/**
|
||||
* 机器名称
|
||||
*/
|
||||
public static final String MACHINE_NAME = "machineName";
|
||||
|
||||
/**
|
||||
* 环境数量
|
||||
*/
|
||||
public static final String PROFILE_COUNT = "profileCount";
|
||||
|
||||
/**
|
||||
* 路径
|
||||
*/
|
||||
public static final String PATH = "path";
|
||||
|
||||
/**
|
||||
* 路径
|
||||
*/
|
||||
public static final String PATHS = "paths";
|
||||
|
||||
/**
|
||||
* 操作
|
||||
*/
|
||||
public static final String OPERATOR = "operator";
|
||||
|
||||
/**
|
||||
* 序列
|
||||
*/
|
||||
public static final String SEQ = "seq";
|
||||
|
||||
/**
|
||||
* 构建序列
|
||||
*/
|
||||
public static final String BUILD_SEQ = "buildSeq";
|
||||
|
||||
/**
|
||||
* 环境名称
|
||||
*/
|
||||
public static final String PROFILE_NAME = "profileName";
|
||||
|
||||
/**
|
||||
* 应用名称
|
||||
*/
|
||||
public static final String APP_NAME = "appName";
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
public static final String TITLE = "title";
|
||||
|
||||
/**
|
||||
* 阶段
|
||||
*/
|
||||
public static final String STAGE = "stage";
|
||||
|
||||
/**
|
||||
* 系统
|
||||
*/
|
||||
public static final String SYSTEM = "system";
|
||||
|
||||
/**
|
||||
* before
|
||||
*/
|
||||
public static final String BEFORE = "before";
|
||||
|
||||
/**
|
||||
* after
|
||||
*/
|
||||
public static final String AFTER = "after";
|
||||
|
||||
/**
|
||||
* key
|
||||
*/
|
||||
public static final String KEY = "key";
|
||||
|
||||
/**
|
||||
* label
|
||||
*/
|
||||
public static final String LABEL = "label";
|
||||
|
||||
/**
|
||||
* time
|
||||
*/
|
||||
public static final String TIME = "time";
|
||||
|
||||
/**
|
||||
* details
|
||||
*/
|
||||
public static final String DETAILS = "details";
|
||||
|
||||
/**
|
||||
* 流水线id
|
||||
*/
|
||||
public static final String PIPELINE_ID = "pipelineId";
|
||||
|
||||
/**
|
||||
* 是否导出密码
|
||||
*/
|
||||
public static final String EXPORT_PASSWORD = "exportPassword";
|
||||
|
||||
/**
|
||||
* 保护密码
|
||||
*/
|
||||
public static final String PROTECT = "protect";
|
||||
|
||||
/**
|
||||
* 分类
|
||||
*/
|
||||
public static final String CLASSIFY = "classify";
|
||||
|
||||
/**
|
||||
* 用户id
|
||||
*/
|
||||
public static final String USER_ID = "userId";
|
||||
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
public static final String STATUS = "status";
|
||||
|
||||
/**
|
||||
* 是否为自动续签登录
|
||||
*/
|
||||
public static final String REFRESH_LOGIN = "refreshLogin";
|
||||
|
||||
/**
|
||||
* 导出类型
|
||||
*/
|
||||
public static final String EXPORT_TYPE = "exportType";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,720 @@
|
||||
package cn.orionsec.ops.constant.event;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum EventType {
|
||||
|
||||
// -------------------- 认证操作 --------------------
|
||||
|
||||
/**
|
||||
* 登录
|
||||
*/
|
||||
LOGIN(100010, EventClassify.AUTHENTICATION, "登录系统", "登录系统"),
|
||||
|
||||
/**
|
||||
* 登出
|
||||
*/
|
||||
LOGOUT(100020, EventClassify.AUTHENTICATION, "退出系统", "退出系统"),
|
||||
|
||||
/**
|
||||
* 重置密码
|
||||
*/
|
||||
RESET_PASSWORD(100030, EventClassify.AUTHENTICATION, "重置密码", "重置用户 <sb>${username}</sb> 密码"),
|
||||
|
||||
// -------------------- 用户操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加用户
|
||||
*/
|
||||
ADD_USER(110010, EventClassify.USER, "添加用户", "添加用户 <sb>${username}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改用户信息
|
||||
*/
|
||||
UPDATE_USER(110020, EventClassify.USER, "修改用户信息", "修改用户信息 <sb>${username}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除用户
|
||||
*/
|
||||
DELETE_USER(110030, EventClassify.USER, "删除用户", "删除用户 <sb>${username}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改用户状态
|
||||
*/
|
||||
CHANGE_USER_STATUS(110040, EventClassify.USER, "修改用户状态", "${operator}用户 <sb>${username}</sb>"),
|
||||
|
||||
/**
|
||||
* 解锁用户
|
||||
*/
|
||||
UNLOCK_USER(110050, EventClassify.USER, "解锁用户", "解锁用户 <sb>${username}</sb>"),
|
||||
|
||||
// -------------------- 报警组操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加报警组
|
||||
*/
|
||||
ADD_ALARM_GROUP(120010, EventClassify.ALARM_GROUP, "添加报警组", "添加报警组 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改报警组
|
||||
*/
|
||||
UPDATE_ALARM_GROUP(120020, EventClassify.ALARM_GROUP, "修改报警组", "修改报警组 <sb>${before}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除报警组
|
||||
*/
|
||||
DELETE_ALARM_GROUP(120030, EventClassify.ALARM_GROUP, "删除报警组", "删除报警组 <sb>${name}</sb>"),
|
||||
|
||||
// -------------------- 机器操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加机器
|
||||
*/
|
||||
ADD_MACHINE(200010, EventClassify.MACHINE, "添加机器", "新建机器 <sb>${machineName}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改机器
|
||||
*/
|
||||
UPDATE_MACHINE(200020, EventClassify.MACHINE, "修改机器", "修改机器 <sb>${machineName}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除机器
|
||||
*/
|
||||
DELETE_MACHINE(200030, EventClassify.MACHINE, "删除机器", "删除机器 <sb>${count}</sb>台"),
|
||||
|
||||
/**
|
||||
* 修改机器状态
|
||||
*/
|
||||
CHANGE_MACHINE_STATUS(200040, EventClassify.MACHINE, "修改机器状态", "${operator}机器 <sb>${count}</sb>台"),
|
||||
|
||||
/**
|
||||
* 复制机器
|
||||
*/
|
||||
COPY_MACHINE(200050, EventClassify.MACHINE, "复制机器", "复制机器 <sb>${source}</sb> -> <sb>${target}</sb>"),
|
||||
|
||||
// -------------------- 机器环境变量操作 --------------------
|
||||
|
||||
/**
|
||||
* 删除机器环境变量
|
||||
*/
|
||||
DELETE_MACHINE_ENV(210010, EventClassify.MACHINE_ENV, "删除机器环境变量", "删除机器环境变量 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 同步机器环境变量
|
||||
*/
|
||||
SYNC_MACHINE_ENV(210020, EventClassify.MACHINE_ENV, "同步机器环境变量", "同步 <sb>${envCount}</sb>个环境变量 到 <sb>${machineCount}</sb>台机器"),
|
||||
|
||||
// -------------------- 密钥操作 --------------------
|
||||
|
||||
/**
|
||||
* 新增密钥
|
||||
*/
|
||||
ADD_MACHINE_KEY(220010, EventClassify.MACHINE_KEY, "新增密钥", "新建密钥 <sb>${keyName}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改密钥
|
||||
*/
|
||||
UPDATE_MACHINE_KEY(220020, EventClassify.MACHINE_KEY, "修改密钥", "修改密钥 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除密钥
|
||||
*/
|
||||
DELETE_MACHINE_KEY(220030, EventClassify.MACHINE_KEY, "删除密钥", "删除密钥 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 绑定密钥
|
||||
*/
|
||||
BIND_MACHINE_KEY(220040, EventClassify.MACHINE_KEY, "绑定密钥", "绑定密钥 <sb>${name}</sb> 到<sb 0>${count}</sb>台机器"),
|
||||
|
||||
// -------------------- 代理操作 --------------------
|
||||
|
||||
/**
|
||||
* 新增代理
|
||||
*/
|
||||
ADD_MACHINE_PROXY(230010, EventClassify.MACHINE_PROXY, "新建代理", "新建代理 <sb>${proxyHost}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改代理
|
||||
*/
|
||||
UPDATE_MACHINE_PROXY(230020, EventClassify.MACHINE_PROXY, "修改代理", "修改代理 <sb>${host}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除代理
|
||||
*/
|
||||
DELETE_MACHINE_PROXY(230030, EventClassify.MACHINE_PROXY, "删除代理", "删除代理 <sb>${count}</sb>个"),
|
||||
|
||||
// -------------------- 机器监控 --------------------
|
||||
|
||||
/**
|
||||
* 修改机器监控配置
|
||||
*/
|
||||
UPDATE_MACHINE_MONITOR_CONFIG(240010, EventClassify.MACHINE_MONITOR, "修改配置", "修改 <sb>${name}</sb> 机器监控插件配置"),
|
||||
|
||||
/**
|
||||
* 安装或升级机器监控插件
|
||||
*/
|
||||
INSTALL_UPGRADE_MACHINE_MONITOR(240020, EventClassify.MACHINE_MONITOR, "安装/升级插件", "${operator} <sb>${name}</sb> 机器监控插件"),
|
||||
|
||||
// -------------------- 报警配置 --------------------
|
||||
|
||||
/**
|
||||
* 修改报警配置
|
||||
*/
|
||||
SET_MACHINE_ALARM_CONFIG(250010, EventClassify.MACHINE_ALARM, "修改报警配置", "修改机器 <sb>${name}</sb> ${label}报警配置"),
|
||||
|
||||
/**
|
||||
* 修改报警联系组
|
||||
*/
|
||||
SET_MACHINE_ALARM_GROUP(250020, EventClassify.MACHINE_ALARM, "修改报警联系组", "修改机器 <sb>${name}</sb> 报警联系组"),
|
||||
|
||||
/**
|
||||
* 重新发送报警通知
|
||||
*/
|
||||
RENOTIFY_MACHINE_ALARM_GROUP(250030, EventClassify.MACHINE_ALARM, "重新发送报警通知", "重新发送机器 <sb>${name}</sb> 报警通知"),
|
||||
|
||||
// -------------------- 终端操作 --------------------
|
||||
|
||||
/**
|
||||
* 打开机器终端
|
||||
*/
|
||||
OPEN_TERMINAL(260010, EventClassify.TERMINAL, "打开机器终端", "打开机器终端 <sb>${machineName}</sb>"),
|
||||
|
||||
/**
|
||||
* 强制下线终端
|
||||
*/
|
||||
FORCE_OFFLINE_TERMINAL(260020, EventClassify.TERMINAL, "强制下线终端", "强制下线终端 <sb>${username}</sb> <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改终端配置
|
||||
*/
|
||||
UPDATE_TERMINAL_CONFIG(260030, EventClassify.TERMINAL, "修改终端配置", "修改机器终端配置 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除终端日志
|
||||
*/
|
||||
DELETE_TERMINAL_LOG(260040, EventClassify.TERMINAL, "删除终端日志", "删除终端操作日志 <sb>${count}</sb>个"),
|
||||
|
||||
// -------------------- sftp 操作 --------------------
|
||||
|
||||
/**
|
||||
* 打开机器 SFTP
|
||||
*/
|
||||
OPEN_SFTP(270010, EventClassify.SFTP, "打开机器 SFTP", "打开机器 SFTP <sb>${machineName}</sb>"),
|
||||
|
||||
/**
|
||||
* 创建文件夹
|
||||
*/
|
||||
SFTP_MKDIR(270020, EventClassify.SFTP, "创建文件夹", "创建文件夹 <sb>${path}</sb>"),
|
||||
|
||||
/**
|
||||
* 创建文件
|
||||
*/
|
||||
SFTP_TOUCH(270030, EventClassify.SFTP, "创建文件", "创建文件 <sb>${path}</sb>"),
|
||||
|
||||
/**
|
||||
* 截断文件
|
||||
*/
|
||||
SFTP_TRUNCATE(270040, EventClassify.SFTP, "截断文件", "截断文件 <sb>${path}</sb>"),
|
||||
|
||||
/**
|
||||
* 移动文件
|
||||
*/
|
||||
SFTP_MOVE(270050, EventClassify.SFTP, "移动文件", "移动文件 <sb>${source}</sb> -> <sb>${target}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*/
|
||||
SFTP_REMOVE(270060, EventClassify.SFTP, "删除文件", "删除文件 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 修改文件权限
|
||||
*/
|
||||
SFTP_CHMOD(270070, EventClassify.SFTP, "修改文件权限", "修改文件权限 <sb>${path}</sb> >>> <sb>${permission}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改文件所有者
|
||||
*/
|
||||
SFTP_CHOWN(270080, EventClassify.SFTP, "修改文件所有者", "修改文件所有者 <sb>${path}</sb> >>> <sb>${uid}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改文件所有组
|
||||
*/
|
||||
SFTP_CHGRP(270090, EventClassify.SFTP, "修改文件所有组", "修改文件所有组 <sb>${path}</sb> >>> <sb>${gid}</sb>"),
|
||||
|
||||
/**
|
||||
* 上传文件
|
||||
*/
|
||||
SFTP_UPLOAD(270100, EventClassify.SFTP, "上传文件", "上传 <sb>${count}</sb>个文件"),
|
||||
|
||||
/**
|
||||
* 下载文件
|
||||
*/
|
||||
SFTP_DOWNLOAD(270110, EventClassify.SFTP, "下载文件", "下载 <sb>${count}</sb>个文件"),
|
||||
|
||||
/**
|
||||
* 打包文件
|
||||
*/
|
||||
SFTP_PACKAGE(270120, EventClassify.SFTP, "打包文件", "打包 <sb>${count}</sb>个文件"),
|
||||
|
||||
// -------------------- 批量执行操作 --------------------
|
||||
|
||||
/**
|
||||
* 批量执行
|
||||
*/
|
||||
EXEC_SUBMIT(300010, EventClassify.EXEC, "批量执行", "批量执行机器命令 <sb>${count}</sb>台"),
|
||||
|
||||
/**
|
||||
* 删除执行
|
||||
*/
|
||||
EXEC_DELETE(300020, EventClassify.EXEC, "删除执行", "删除机器执行命令记录 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 终止执行
|
||||
*/
|
||||
EXEC_TERMINATE(300030, EventClassify.EXEC, "终止执行", "终止执行机器命令"),
|
||||
|
||||
// -------------------- 日志操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加日志文件
|
||||
*/
|
||||
ADD_TAIL_FILE(310010, EventClassify.TAIL, "添加日志文件", "添加日志文件 <sb>${aliasName}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改日志文件
|
||||
*/
|
||||
UPDATE_TAIL_FILE(310020, EventClassify.TAIL, "修改日志文件", "修改日志文件 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除日志文件
|
||||
*/
|
||||
DELETE_TAIL_FILE(310030, EventClassify.TAIL, "删除日志文件", "删除日志文件 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 上传日志文件
|
||||
*/
|
||||
UPLOAD_TAIL_FILE(310040, EventClassify.TAIL, "上传日志文件", "上传日志文件 <sb>${count}</sb>个"),
|
||||
|
||||
// -------------------- 调度操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加调度任务
|
||||
*/
|
||||
ADD_SCHEDULER_TASK(320010, EventClassify.SCHEDULER, "添加调度任务", "添加调度任务 <sb>${taskName}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改调度任务
|
||||
*/
|
||||
UPDATE_SCHEDULER_TASK(320020, EventClassify.SCHEDULER, "修改调度任务", "修改调度任务 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 更新调度任务状态
|
||||
*/
|
||||
UPDATE_SCHEDULER_TASK_STATUS(320030, EventClassify.SCHEDULER, "更新任务状态", "${operator}调度任务 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除调度任务
|
||||
*/
|
||||
DELETE_SCHEDULER_TASK(320040, EventClassify.SCHEDULER, "删除调度任务", "删除调度任务 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 手动触发调度任务
|
||||
*/
|
||||
MANUAL_TRIGGER_SCHEDULER_TASK(320050, EventClassify.SCHEDULER, "手动触发任务", "手动触发调度任务 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 停止调度任务
|
||||
*/
|
||||
TERMINATE_ALL_SCHEDULER_TASK(320060, EventClassify.SCHEDULER, "停止任务", "停止调度任务 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 停止调度任务机器操作
|
||||
*/
|
||||
TERMINATE_SCHEDULER_TASK_MACHINE(320070, EventClassify.SCHEDULER, "停止机器操作", "停止调度任务机器操作 <sb>${name}</sb> <sb>${machineName}</sb>"),
|
||||
|
||||
/**
|
||||
* 跳过调度任务机器操作
|
||||
*/
|
||||
SKIP_SCHEDULER_TASK_MACHINE(320080, EventClassify.SCHEDULER, "跳过机器操作", "跳过调度任务机器操作 <sb>${name}</sb> <sb>${machineName}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除任务调度明细
|
||||
*/
|
||||
DELETE_TASK_RECORD(320090, EventClassify.SCHEDULER, "删除调度明细", "删除调度任务明细 <sb>${count}</sb>个"),
|
||||
|
||||
// -------------------- 应用操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加应用
|
||||
*/
|
||||
ADD_APP(400010, EventClassify.APP, "添加应用", "添加应用 <sb>${appName}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改应用
|
||||
*/
|
||||
UPDATE_APP(400020, EventClassify.APP, "修改应用", "修改应用 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除应用
|
||||
*/
|
||||
DELETE_APP(400030, EventClassify.APP, "删除应用", "删除应用 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 配置应用
|
||||
*/
|
||||
CONFIG_APP(400040, EventClassify.APP, "配置应用", "配置应用 <sb>${profileName}</sb> <sb>${appName}</sb>"),
|
||||
|
||||
/**
|
||||
* 同步应用
|
||||
*/
|
||||
SYNC_APP(400050, EventClassify.APP, "同步应用", "同步应用 <sb>${name}</sb> 到 <sb>${count}</sb>个环境"),
|
||||
|
||||
/**
|
||||
* 复制应用
|
||||
*/
|
||||
COPY_APP(400060, EventClassify.APP, "复制应用", "复制应用 <sb>${name}</sb>"),
|
||||
|
||||
// -------------------- 环境操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加应用环境
|
||||
*/
|
||||
ADD_PROFILE(410010, EventClassify.PROFILE, "添加应用环境", "添加应用环境 <sb>${profileName}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改应用环境
|
||||
*/
|
||||
UPDATE_PROFILE(410020, EventClassify.PROFILE, "修改应用环境", "修改应用环境 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除应用环境
|
||||
*/
|
||||
DELETE_PROFILE(410030, EventClassify.PROFILE, "删除应用环境", "删除应用环境 <sb>${name}</sb>"),
|
||||
|
||||
// -------------------- 应用环境变量操作 --------------------
|
||||
|
||||
/**
|
||||
* 删除应用环境变量
|
||||
*/
|
||||
DELETE_APP_ENV(420010, EventClassify.APP_ENV, "删除应用环境变量", "删除应用环境变量 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 同步应用环境变量
|
||||
*/
|
||||
SYNC_APP_ENV(420020, EventClassify.APP_ENV, "同步应用环境变量", "同步 <sb>${envCount}</sb>个环境变量 到 <sb>${profileCount}</sb>个环境"),
|
||||
|
||||
// -------------------- 版本仓库操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加版本仓库
|
||||
*/
|
||||
ADD_REPOSITORY(430010, EventClassify.REPOSITORY, "添加版本仓库", "添加版本仓库 <sb>${repoName}</sb>"),
|
||||
|
||||
/**
|
||||
* 初始化版本仓库
|
||||
*/
|
||||
INIT_REPOSITORY(430020, EventClassify.REPOSITORY, "初始化版本仓库", "初始化版本仓库 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 重新初始化版本仓库
|
||||
*/
|
||||
RE_INIT_REPOSITORY(430030, EventClassify.REPOSITORY, "重新初始化版本仓库", "重新初始化版本仓库 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 更新版本仓库
|
||||
*/
|
||||
UPDATE_REPOSITORY(430040, EventClassify.REPOSITORY, "更新版本仓库", "更新版本仓库 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除版本仓库
|
||||
*/
|
||||
DELETE_REPOSITORY(430050, EventClassify.REPOSITORY, "删除版本仓库", "删除版本仓库 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 清空版本仓库
|
||||
*/
|
||||
CLEAN_REPOSITORY(430060, EventClassify.REPOSITORY, "清空版本仓库", "清空版本仓库 <sb>${name}</sb>"),
|
||||
|
||||
// -------------------- 构建操作 --------------------
|
||||
|
||||
/**
|
||||
* 提交应用构建
|
||||
*/
|
||||
SUBMIT_BUILD(440010, EventClassify.BUILD, "提交应用构建", "提交应用构建 <sb>#${buildSeq}</sb> <sb>${profileName}</sb> <sb>${appName}</sb>"),
|
||||
|
||||
/**
|
||||
* 停止应用构建
|
||||
*/
|
||||
BUILD_TERMINATE(440020, EventClassify.BUILD, "停止应用构建", "停止应用构建 <sb>#${buildSeq}</sb> <sb>${profileName}</sb> <sb>${appName}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除应用构建
|
||||
*/
|
||||
DELETE_BUILD(440030, EventClassify.BUILD, "删除应用构建", "删除应用构建记录 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 重新构建应用
|
||||
*/
|
||||
SUBMIT_REBUILD(440040, EventClassify.BUILD, "重新构建应用", "重新构建应用 <sb>#${buildSeq}</sb> <sb>${profileName}</sb> <sb>${appName}</sb>"),
|
||||
|
||||
// -------------------- 发布操作 --------------------
|
||||
|
||||
/**
|
||||
* 提交应用发布
|
||||
*/
|
||||
SUBMIT_RELEASE(450010, EventClassify.RELEASE, "提交应用发布", "提交应用发布 <sb>${releaseTitle}</sb>"),
|
||||
|
||||
/**
|
||||
* 应用发布审核
|
||||
*/
|
||||
AUDIT_RELEASE(450020, EventClassify.RELEASE, "应用发布审核", "应用发布审核${operator} <sb>${title}</sb>"),
|
||||
|
||||
/**
|
||||
* 执行应用发布
|
||||
*/
|
||||
RUNNABLE_RELEASE(450030, EventClassify.RELEASE, "执行应用发布", "执行应用发布 <sb>${title}</sb>"),
|
||||
|
||||
/**
|
||||
* 应用回滚发布
|
||||
*/
|
||||
ROLLBACK_RELEASE(450040, EventClassify.RELEASE, "应用回滚发布", "应用回滚发布 <sb>${title}</sb>"),
|
||||
|
||||
/**
|
||||
* 停止应用发布
|
||||
*/
|
||||
TERMINATE_RELEASE(450050, EventClassify.RELEASE, "停止应用发布", "停止应用发布 <sb>${title}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除应用发布
|
||||
*/
|
||||
DELETE_RELEASE(450060, EventClassify.RELEASE, "删除应用发布", "删除应用发布记录 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 复制应用发布
|
||||
*/
|
||||
COPY_RELEASE(450070, EventClassify.RELEASE, "复制应用发布", "复制应用发布 <sb>${releaseTitle}</sb>"),
|
||||
|
||||
/**
|
||||
* 取消应用定时发布
|
||||
*/
|
||||
CANCEL_TIMED_RELEASE(450080, EventClassify.RELEASE, "取消定时发布", "取消应用定时发布 <sb>${title}</sb>"),
|
||||
|
||||
/**
|
||||
* 设置应用定时发布
|
||||
*/
|
||||
SET_TIMED_RELEASE(450090, EventClassify.RELEASE, "设置定时发布", "设置应用定时发布 <sb>${title}</sb> -> <sb>${time}</sb>"),
|
||||
|
||||
/**
|
||||
* 停止机器发布操作
|
||||
*/
|
||||
TERMINATE_MACHINE_RELEASE(450100, EventClassify.RELEASE, "停止机器操作", "停止机器发布操作 <sb>${title}</sb> <sb>${machineName}</sb>"),
|
||||
|
||||
/**
|
||||
* 跳过机器发布操作
|
||||
*/
|
||||
SKIP_MACHINE_RELEASE(450110, EventClassify.RELEASE, "跳过机器操作", "跳过机器发布操作 <sb>${title}</sb> <sb>${machineName}</sb>"),
|
||||
|
||||
// -------------------- 应用流水线 --------------------
|
||||
|
||||
/**
|
||||
* 添加应用流水线
|
||||
*/
|
||||
ADD_PIPELINE(460010, EventClassify.PIPELINE, "添加流水线", "添加应用流水线 <sb>${pipelineName}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改应用流水线
|
||||
*/
|
||||
UPDATE_PIPELINE(460020, EventClassify.PIPELINE, "修改流水线", "修改应用流水线 <sb>${pipelineName}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除应用流水线
|
||||
*/
|
||||
DELETE_PIPELINE(460030, EventClassify.PIPELINE, "删除流水线", "删除应用流水线 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 提交应用流水线任务
|
||||
*/
|
||||
SUBMIT_PIPELINE_TASK(460040, EventClassify.PIPELINE, "提交执行任务", "提交应用流水线任务 <sb>${pipelineName}</sb> <sb>${execTitle}</sb>"),
|
||||
|
||||
/**
|
||||
* 审核应用流水线任务
|
||||
*/
|
||||
AUDIT_PIPELINE_TASK(460050, EventClassify.PIPELINE, "审核任务", "审核应用流水线任务${operator} <sb>${name}</sb> <sb>${title}</sb>"),
|
||||
|
||||
/**
|
||||
* 复制应用流水线任务
|
||||
*/
|
||||
COPY_PIPELINE_TASK(460060, EventClassify.PIPELINE, "复制任务", "复制应用流水线任务 <sb>${pipelineName}</sb> <sb>${execTitle}</sb>"),
|
||||
|
||||
/**
|
||||
* 执行应用流水线任务
|
||||
*/
|
||||
EXEC_PIPELINE_TASK(460070, EventClassify.PIPELINE, "执行任务", "执行应用流水线任务 <sb>${name}</sb> <sb>${title}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除应用流水线任务
|
||||
*/
|
||||
DELETE_PIPELINE_TASK(460080, EventClassify.PIPELINE, "删除任务", "删除应用流水线任务 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 设置定时执行应用流水线任务
|
||||
*/
|
||||
SET_PIPELINE_TIMED_TASK(460090, EventClassify.PIPELINE, "设置定时执行", "设置定时执行应用流水线任务 <sb>${name}</sb> <sb>${title}</sb> -> <sb>${time}</sb>"),
|
||||
|
||||
/**
|
||||
* 取消定时执行应用流水线任务
|
||||
*/
|
||||
CANCEL_PIPELINE_TIMED_TASK(460100, EventClassify.PIPELINE, "取消定时执行", "取消定时执行应用流水线任务 <sb>${name}</sb> <sb>${title}</sb>"),
|
||||
|
||||
/**
|
||||
* 停止执行应用流水线任务
|
||||
*/
|
||||
TERMINATE_PIPELINE_TASK(460110, EventClassify.PIPELINE, "停止执行任务", "停止执行应用流水线任务 <sb>${name}</sb> <sb>${title}</sb>"),
|
||||
|
||||
/**
|
||||
* 停止执行应用流水线任务操作
|
||||
*/
|
||||
TERMINATE_PIPELINE_TASK_DETAIL(460120, EventClassify.PIPELINE, "停止执行操作", "停止执行应用流水线任务部分操作 <sb>${name}</sb> <sb>${title}</sb> (<sb 0>${stage} ${appName}</sb>)"),
|
||||
|
||||
/**
|
||||
* 跳过执行应用流水线任务操作
|
||||
*/
|
||||
SKIP_PIPELINE_TASK_DETAIL(460130, EventClassify.PIPELINE, "跳过执行操作", "跳过执行应用流水线任务部分操作 <sb>${name}</sb> <sb>${title}</sb> (<sb 0>${stage} ${appName}</sb>)"),
|
||||
|
||||
// -------------------- 模板操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加模板
|
||||
*/
|
||||
ADD_TEMPLATE(500010, EventClassify.TEMPLATE, "添加模板", "添加模板 <sb>${templateName}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改模板
|
||||
*/
|
||||
UPDATE_TEMPLATE(500020, EventClassify.TEMPLATE, "修改模板", "修改模板 <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除模板
|
||||
*/
|
||||
DELETE_TEMPLATE(500030, EventClassify.TEMPLATE, "删除模板", "删除模板 <sb>${count}</sb>个"),
|
||||
|
||||
// -------------------- webhook 操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加 webhook 配置
|
||||
*/
|
||||
ADD_WEBHOOK(510010, EventClassify.WEBHOOK, "添加配置", "添加 webhook <sb>${webhookName}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改 webhook 配置
|
||||
*/
|
||||
UPDATE_WEBHOOK(510020, EventClassify.WEBHOOK, "修改配置", "修改 webhook <sb>${name}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除 webhook 配置
|
||||
*/
|
||||
DELETE_WEBHOOK(510030, EventClassify.WEBHOOK, "删除配置", "删除 webhook <sb>${name}</sb>个"),
|
||||
|
||||
// -------------------- 系统操作 --------------------
|
||||
|
||||
/**
|
||||
* 配置 ip 过滤器
|
||||
*/
|
||||
CONFIG_IP_LIST(600010, EventClassify.SYSTEM, "配置IP过滤器", "配置 IP 过滤器"),
|
||||
|
||||
/**
|
||||
* 重新进行系统统计分析
|
||||
*/
|
||||
RE_ANALYSIS_SYSTEM(600020, EventClassify.SYSTEM, "系统统计分析", "重新进行系统统计分析"),
|
||||
|
||||
/**
|
||||
* 清理系统文件
|
||||
*/
|
||||
CLEAN_SYSTEM_FILE(600030, EventClassify.SYSTEM, "清理系统文件", "清理系统 <sb>${label}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改系统配置
|
||||
*/
|
||||
UPDATE_SYSTEM_OPTION(600040, EventClassify.SYSTEM, "修改系统配置", "修改系统配置项 <sb>${label}</sb> 原始值:<sb>${before}</sb> 新值:<sb>${after}</sb>"),
|
||||
|
||||
// -------------------- 系统环境变量操作 --------------------
|
||||
|
||||
/**
|
||||
* 添加系统环境变量
|
||||
*/
|
||||
ADD_SYSTEM_ENV(610010, EventClassify.SYSTEM_ENV, "添加系统环境变量", "添加系统环境变量 <sb>${attrKey}</sb>"),
|
||||
|
||||
/**
|
||||
* 修改系统环境变量
|
||||
*/
|
||||
UPDATE_SYSTEM_ENV(610020, EventClassify.SYSTEM_ENV, "修改系统环境变量", "修改系统环境变量 <sb>${attrKey}</sb>"),
|
||||
|
||||
/**
|
||||
* 删除系统环境变量
|
||||
*/
|
||||
DELETE_SYSTEM_ENV(610030, EventClassify.SYSTEM_ENV, "删除系统环境变量", "删除系统环境变量 <sb>${count}</sb>个"),
|
||||
|
||||
/**
|
||||
* 保存系统环境变量
|
||||
*/
|
||||
SAVE_SYSTEM_ENV(610040, EventClassify.SYSTEM_ENV, "保存系统环境变量", "保存系统环境变量 <sb>${count}</sb>个"),
|
||||
|
||||
// -------------------- 数据清理 --------------------
|
||||
|
||||
/**
|
||||
* 清理数据
|
||||
*/
|
||||
DATA_CLEAR(620010, EventClassify.DATA_CLEAR, "清理数据", "清理数据 <sb 0>${label}</sb> <sb>${count}</sb>条"),
|
||||
|
||||
// -------------------- 数据导入 --------------------
|
||||
|
||||
/**
|
||||
* 导入数据
|
||||
*/
|
||||
DATA_IMPORT(630010, EventClassify.DATA_IMPORT, "导入数据", "批量导入 <sb 0>${label}</sb>"),
|
||||
|
||||
// -------------------- 数据导出 --------------------
|
||||
|
||||
/**
|
||||
* 导出数据
|
||||
*/
|
||||
DATA_EXPORT(640010, EventClassify.DATA_EXPORT, "导出数据", "导出 <sb 0>${label}</sb> <sb>${count}</sb>条"),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
private final Integer type;
|
||||
|
||||
/**
|
||||
* 分类
|
||||
*/
|
||||
private final EventClassify classify;
|
||||
|
||||
/**
|
||||
* label
|
||||
*/
|
||||
private final String label;
|
||||
|
||||
/**
|
||||
* 模板
|
||||
*/
|
||||
private final String template;
|
||||
|
||||
public static EventType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (EventType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package cn.orionsec.ops.constant.history;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum HistoryOperator {
|
||||
|
||||
/**
|
||||
* 添加
|
||||
*/
|
||||
ADD(1),
|
||||
|
||||
/**
|
||||
* 更新
|
||||
*/
|
||||
UPDATE(2),
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
DELETE(3),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public static HistoryOperator of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (HistoryOperator value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package cn.orionsec.ops.constant.history;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum HistoryValueType {
|
||||
|
||||
/**
|
||||
* 机器环境变量
|
||||
*/
|
||||
MACHINE_ENV(10),
|
||||
|
||||
/**
|
||||
* 应用环境变量
|
||||
*/
|
||||
APP_ENV(20),
|
||||
|
||||
/**
|
||||
* 系统环境变量
|
||||
*/
|
||||
SYSTEM_ENV(30),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public static HistoryValueType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (HistoryValueType value : values()) {
|
||||
if (type.equals(value.type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package cn.orionsec.ops.constant.machine;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum MachineAlarmType {
|
||||
|
||||
/**
|
||||
* cpu 使用率
|
||||
*/
|
||||
CPU_USAGE(10, "CPU使用率"),
|
||||
|
||||
/**
|
||||
* 内存使用率
|
||||
*/
|
||||
MEMORY_USAGE(20, "内存使用率"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static MachineAlarmType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (MachineAlarmType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package cn.orionsec.ops.constant.machine;
|
||||
|
||||
import cn.orionsec.ops.constant.CnConst;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum MachineAuthType {
|
||||
|
||||
/**
|
||||
* 1 密码认证
|
||||
*/
|
||||
PASSWORD(1, CnConst.PASSWORD),
|
||||
|
||||
/**
|
||||
* 2 独立密钥
|
||||
*/
|
||||
SECRET_KEY(2, CnConst.SECRET_KEY),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static MachineAuthType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (MachineAuthType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static MachineAuthType of(String label) {
|
||||
if (label == null) {
|
||||
return null;
|
||||
}
|
||||
for (MachineAuthType value : values()) {
|
||||
if (value.label.equals(label)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package cn.orionsec.ops.constant.machine;
|
||||
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
|
||||
public class MachineConst {
|
||||
|
||||
private MachineConst() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 远程连接尝试次数
|
||||
*/
|
||||
public static final int CONNECT_RETRY_TIMES = 1;
|
||||
|
||||
/**
|
||||
* 远程连接超时时间
|
||||
*/
|
||||
public static final int CONNECT_TIMEOUT = Const.MS_S_30;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
package cn.orionsec.ops.constant.machine;
|
||||
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
import cn.orionsec.ops.constant.command.CommandConst;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Getter
|
||||
public enum MachineEnvAttr {
|
||||
|
||||
/**
|
||||
* sftp 文件名称编码格式
|
||||
*
|
||||
* @see Const#UTF_8
|
||||
*/
|
||||
SFTP_CHARSET("SFTP 文件名称编码格式"),
|
||||
|
||||
/**
|
||||
* 文件追踪偏移量
|
||||
*
|
||||
* @see Const#TAIL_OFFSET_LINE
|
||||
*/
|
||||
TAIL_OFFSET("文件追踪偏移量(行)"),
|
||||
|
||||
/**
|
||||
* 文件追踪编码格式
|
||||
*
|
||||
* @see Const#UTF_8
|
||||
*/
|
||||
TAIL_CHARSET("文件追踪编码格式"),
|
||||
|
||||
/**
|
||||
* 文件追踪默认命令
|
||||
*
|
||||
* @see CommandConst#TAIL_FILE_DEFAULT
|
||||
*/
|
||||
TAIL_DEFAULT_COMMAND("文件追踪默认命令"),
|
||||
|
||||
/**
|
||||
* 连接超时时间 (ms)
|
||||
*
|
||||
* @see MachineConst#CONNECT_TIMEOUT
|
||||
*/
|
||||
CONNECT_TIMEOUT("连接超时时间 (ms)"),
|
||||
|
||||
/**
|
||||
* 连接失败重试次数
|
||||
*
|
||||
* @see MachineConst#CONNECT_RETRY_TIMES
|
||||
*/
|
||||
CONNECT_RETRY_TIMES("连接失败重试次数"),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* key
|
||||
*/
|
||||
private final String key;
|
||||
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
private final String description;
|
||||
|
||||
MachineEnvAttr(String description) {
|
||||
this.description = description;
|
||||
this.key = this.name().toLowerCase();
|
||||
}
|
||||
|
||||
public static List<String> getKeys() {
|
||||
return Arrays.stream(values())
|
||||
.map(MachineEnvAttr::getKey)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static MachineEnvAttr of(String key) {
|
||||
if (key == null) {
|
||||
return null;
|
||||
}
|
||||
return Arrays.stream(values())
|
||||
.filter(a -> a.key.equals(key))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package cn.orionsec.ops.constant.machine;
|
||||
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ProxyType {
|
||||
|
||||
/**
|
||||
* HTTP 代理
|
||||
*/
|
||||
HTTP(1, Const.PROTOCOL_HTTP),
|
||||
|
||||
/**
|
||||
* SOCKS4 代理
|
||||
*/
|
||||
SOCKS4(2, Const.SOCKS4),
|
||||
|
||||
/**
|
||||
* SOCKS5 代理
|
||||
*/
|
||||
SOCKS5(3, Const.SOCKS5),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static ProxyType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (ProxyType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ProxyType of(String label) {
|
||||
if (label == null) {
|
||||
return null;
|
||||
}
|
||||
for (ProxyType value : values()) {
|
||||
if (value.label.equals(label)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package cn.orionsec.ops.constant.message;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum MessageClassify {
|
||||
|
||||
/**
|
||||
* 系统消息
|
||||
*/
|
||||
SYSTEM(10, "系统消息"),
|
||||
|
||||
/**
|
||||
* 数据导入
|
||||
*/
|
||||
IMPORT(20, "数据导入"),
|
||||
|
||||
/**
|
||||
* 系统报警
|
||||
*/
|
||||
ALARM(30, "系统报警"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer classify;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static MessageClassify of(Integer classify) {
|
||||
if (classify == null) {
|
||||
return null;
|
||||
}
|
||||
for (MessageClassify value : values()) {
|
||||
if (value.classify.equals(classify)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
package cn.orionsec.ops.constant.message;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum MessageType {
|
||||
|
||||
// -------------------- 系统消息 --------------------
|
||||
|
||||
/**
|
||||
* 命令执行完成
|
||||
*/
|
||||
EXEC_SUCCESS(1010, "命令执行完成", MessageClassify.SYSTEM, "机器 <sb>${name}</sb> 命令执行完成"),
|
||||
|
||||
/**
|
||||
* 命令执行失败
|
||||
*/
|
||||
EXEC_FAILURE(1020, "命令执行失败", MessageClassify.SYSTEM, "机器 <sb>${name}</sb> 命令执行失败"),
|
||||
|
||||
/**
|
||||
* 版本仓库初始化成功
|
||||
*/
|
||||
REPOSITORY_INIT_SUCCESS(1030, "版本仓库初始化成功", MessageClassify.SYSTEM, "仓库 <sb>${name}</sb> 初始化成功"),
|
||||
|
||||
/**
|
||||
* 版本仓库初始化失败
|
||||
*/
|
||||
REPOSITORY_INIT_FAILURE(1040, "版本仓库初始化失败", MessageClassify.SYSTEM, "仓库 <sb>${name}</sb> 初始化失败"),
|
||||
|
||||
/**
|
||||
* 构建执行成功
|
||||
*/
|
||||
BUILD_SUCCESS(1050, "构建执行成功", MessageClassify.SYSTEM, "<sb 0>${appName}</sb> <sb>#${seq}</sb> 构建成功"),
|
||||
|
||||
/**
|
||||
* 构建执行失败
|
||||
*/
|
||||
BUILD_FAILURE(1060, "构建执行失败", MessageClassify.SYSTEM, "<sb 0>${appName}</sb> <sb>#${seq}</sb> 构建失败"),
|
||||
|
||||
/**
|
||||
* 发布审批通过
|
||||
*/
|
||||
RELEASE_AUDIT_RESOLVE(1070, "发布审批通过", MessageClassify.SYSTEM, "发布任务 <sb>${title}</sb> 审核已通过"),
|
||||
|
||||
/**
|
||||
* 发布审批驳回
|
||||
*/
|
||||
RELEASE_AUDIT_REJECT(1080, "发布审批驳回", MessageClassify.SYSTEM, "发布任务 <sb>${title}</sb> 审核已被驳回"),
|
||||
|
||||
/**
|
||||
* 发布执行成功
|
||||
*/
|
||||
RELEASE_SUCCESS(1090, "发布执行成功", MessageClassify.SYSTEM, "发布任务 <sb>${title}</sb> 发布成功"),
|
||||
|
||||
/**
|
||||
* 发布执行失败
|
||||
*/
|
||||
RELEASE_FAILURE(1100, "发布执行失败", MessageClassify.SYSTEM, "发布任务 <sb>${title}</sb> 发布失败"),
|
||||
|
||||
/**
|
||||
* 应用流水线审批通过
|
||||
*/
|
||||
PIPELINE_AUDIT_RESOLVE(1110, "应用流水线审批通过", MessageClassify.SYSTEM, "应用流水线 <sb>${name}</sb> <sb>${title}</sb> 审核已通过"),
|
||||
|
||||
/**
|
||||
* 应用流水线审批驳回
|
||||
*/
|
||||
PIPELINE_AUDIT_REJECT(1120, "应用流水线审批驳回", MessageClassify.SYSTEM, "应用流水线 <sb>${name}</sb> <sb>${title}</sb> 审核已被驳回"),
|
||||
|
||||
/**
|
||||
* 应用流水线执行成功
|
||||
*/
|
||||
PIPELINE_EXEC_SUCCESS(1130, "应用流水线执行成功", MessageClassify.SYSTEM, "应用流水线 <sb>${name}</sb> <sb>${title}</sb> 执行成功"),
|
||||
|
||||
/**
|
||||
* 应用流水线执行失败
|
||||
*/
|
||||
PIPELINE_EXEC_FAILURE(1140, "应用流水线执行失败", MessageClassify.SYSTEM, "应用流水线 <sb>${name}</sb> <sb>${title}</sb> 执行失败"),
|
||||
|
||||
/**
|
||||
* 机器监控插件安装成功
|
||||
*/
|
||||
MACHINE_AGENT_INSTALL_SUCCESS(1150, "机器监控插件安装成功", MessageClassify.SYSTEM, "机器 <sb>${name}</sb> 监控插件安装成功"),
|
||||
|
||||
/**
|
||||
* 机器监控插件安装失败
|
||||
*/
|
||||
MACHINE_AGENT_INSTALL_FAILURE(1160, "机器监控插件安装失败", MessageClassify.SYSTEM, "机器 <sb>${name}</sb> 监控插件安装失败, 请手动安装或检查插件配置"),
|
||||
|
||||
// -------------------- 数据导入 --------------------
|
||||
|
||||
/**
|
||||
* 数据导入成功
|
||||
*/
|
||||
DATA_IMPORT_SUCCESS(2010, "数据导入成功", MessageClassify.IMPORT, "您在 <sb>${time}</sb> 进行的<sb 0>${label}</sb>导入操作执行完成"),
|
||||
|
||||
/**
|
||||
* 数据导入失败
|
||||
*/
|
||||
DATA_IMPORT_FAILURE(2020, "数据导入失败", MessageClassify.IMPORT, "您在 <sb>${time}</sb> 进行的<sr 0>${label}</sr>导入操作执行失败"),
|
||||
|
||||
// -------------------- 系统报警 --------------------
|
||||
|
||||
/**
|
||||
* 机器发生报警
|
||||
*/
|
||||
MACHINE_ALARM(3010, "机器发生报警", MessageClassify.ALARM, "机器 <sb 0><b>${name}</b></sb>(<sb 0>${host}</sb>) ${time} <sb>${type}</sb>达到<sr><b>${value}%</b></sr>, 请及时排查!"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
private final MessageClassify classify;
|
||||
|
||||
private final String template;
|
||||
|
||||
public static MessageType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (MessageType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package cn.orionsec.ops.constant.message;
|
||||
|
||||
import cn.orionsec.ops.constant.CnConst;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ReadStatus {
|
||||
|
||||
/**
|
||||
* 未读
|
||||
*/
|
||||
UNREAD(1, CnConst.UNREAD),
|
||||
|
||||
/**
|
||||
* 已读
|
||||
*/
|
||||
READ(2, CnConst.READ),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static ReadStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (ReadStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package cn.orionsec.ops.constant.monitor;
|
||||
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
import cn.orionsec.ops.constant.PropertiesConst;
|
||||
import cn.orionsec.ops.utils.ResourceLoader;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class MonitorConst {
|
||||
|
||||
private MonitorConst() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 最新版本
|
||||
*/
|
||||
public static String LATEST_VERSION;
|
||||
|
||||
/**
|
||||
* 默认 url
|
||||
*/
|
||||
public static String DEFAULT_URL_FORMAT;
|
||||
|
||||
/**
|
||||
* 默认请求头
|
||||
*/
|
||||
public static String DEFAULT_ACCESS_HEADER;
|
||||
|
||||
/**
|
||||
* 默认 accessToken
|
||||
*/
|
||||
public static String DEFAULT_ACCESS_TOKEN;
|
||||
|
||||
/**
|
||||
* agent 文件名称前缀
|
||||
*/
|
||||
public static final String AGENT_FILE_NAME_PREFIX = "machine-monitor-agent";
|
||||
|
||||
/**
|
||||
* 启动脚本资源路径
|
||||
*/
|
||||
public static final String START_SCRIPT_PATH = "/templates/script/start-monitor-agent.sh";
|
||||
|
||||
/**
|
||||
* 启动脚本资源内容
|
||||
*/
|
||||
public static final String START_SCRIPT_VALUE = ResourceLoader.get(START_SCRIPT_PATH, MonitorConst.class);
|
||||
|
||||
/**
|
||||
* 启动脚本文件名称
|
||||
*/
|
||||
public static final String START_SCRIPT_FILE_NAME = "start-machine-monitor-agent.sh";
|
||||
|
||||
@Value("${machine.monitor.latest.version}")
|
||||
private void setLatestVersion(String latestVersion) {
|
||||
MonitorConst.LATEST_VERSION = latestVersion;
|
||||
}
|
||||
|
||||
@Value("${machine.monitor.default.url}")
|
||||
private void setDefaultUrlFormat(String defaultUrlFormat) {
|
||||
MonitorConst.DEFAULT_URL_FORMAT = defaultUrlFormat;
|
||||
}
|
||||
|
||||
@Value("${machine.monitor.default.access.header}")
|
||||
private void setDefaultAccessHeader(String defaultAccessHeader) {
|
||||
MonitorConst.DEFAULT_ACCESS_HEADER = defaultAccessHeader;
|
||||
}
|
||||
|
||||
@Value("${machine.monitor.default.access.token}")
|
||||
private void setDefaultAccessToken(String defaultAccessToken) {
|
||||
MonitorConst.DEFAULT_ACCESS_TOKEN = defaultAccessToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* agent 文件名称
|
||||
*
|
||||
* @return 获取 agent 文件名称
|
||||
*/
|
||||
public static String getAgentFileName() {
|
||||
return AGENT_FILE_NAME_PREFIX
|
||||
+ "_" + PropertiesConst.MACHINE_MONITOR_LATEST_VERSION
|
||||
+ "." + Const.SUFFIX_JAR;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package cn.orionsec.ops.constant.monitor;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum MonitorStatus {
|
||||
|
||||
/**
|
||||
* 未启动
|
||||
*/
|
||||
NOT_START(1),
|
||||
|
||||
/**
|
||||
* 启动中
|
||||
*/
|
||||
STARTING(2),
|
||||
|
||||
/**
|
||||
* 运行中
|
||||
*/
|
||||
RUNNING(3),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static MonitorStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (MonitorStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package cn.orionsec.ops.constant.scheduler;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum SchedulerTaskMachineStatus {
|
||||
|
||||
/**
|
||||
* 待调度
|
||||
*/
|
||||
WAIT(10),
|
||||
|
||||
/**
|
||||
* 执行中
|
||||
*/
|
||||
RUNNABLE(20),
|
||||
|
||||
/**
|
||||
* 成功
|
||||
*/
|
||||
SUCCESS(30),
|
||||
|
||||
/**
|
||||
* 失败
|
||||
*/
|
||||
FAILURE(40),
|
||||
|
||||
/**
|
||||
* 已跳过
|
||||
*/
|
||||
SKIPPED(50),
|
||||
|
||||
/**
|
||||
* 已停止
|
||||
*/
|
||||
TERMINATED(60),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static SchedulerTaskMachineStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (SchedulerTaskMachineStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package cn.orionsec.ops.constant.scheduler;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum SchedulerTaskStatus {
|
||||
|
||||
/**
|
||||
* 待调度
|
||||
*/
|
||||
WAIT(10),
|
||||
|
||||
/**
|
||||
* 执行中
|
||||
*/
|
||||
RUNNABLE(20),
|
||||
|
||||
/**
|
||||
* 成功
|
||||
*/
|
||||
SUCCESS(30),
|
||||
|
||||
/**
|
||||
* 失败
|
||||
*/
|
||||
FAILURE(40),
|
||||
|
||||
/**
|
||||
* 已停止
|
||||
*/
|
||||
TERMINATED(50),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static SchedulerTaskStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (SchedulerTaskStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package cn.orionsec.ops.constant.sftp;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum SftpNotifyType {
|
||||
|
||||
/**
|
||||
* 添加任务
|
||||
*/
|
||||
ADD(10),
|
||||
|
||||
/**
|
||||
* 进度以及速率
|
||||
*/
|
||||
PROGRESS(20),
|
||||
|
||||
/**
|
||||
* 修改状态
|
||||
*/
|
||||
CHANGE_STATUS(30),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public static SftpNotifyType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (SftpNotifyType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package cn.orionsec.ops.constant.sftp;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum SftpPackageType {
|
||||
|
||||
/**
|
||||
* 上传文件
|
||||
*/
|
||||
UPLOAD(1),
|
||||
|
||||
/**
|
||||
* 下载文件
|
||||
*/
|
||||
DOWNLOAD(2),
|
||||
|
||||
/**
|
||||
* 全部
|
||||
*/
|
||||
ALL(3),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
public static SftpPackageType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (SftpPackageType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package cn.orionsec.ops.constant.sftp;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum SftpTransferStatus {
|
||||
|
||||
/**
|
||||
* 10 等待中
|
||||
*/
|
||||
WAIT(10),
|
||||
|
||||
/**
|
||||
* 20 进行中
|
||||
*/
|
||||
RUNNABLE(20),
|
||||
|
||||
/**
|
||||
* 30 已暂停
|
||||
*/
|
||||
PAUSE(30),
|
||||
|
||||
/**
|
||||
* 40 已完成
|
||||
*/
|
||||
FINISH(40),
|
||||
|
||||
/**
|
||||
* 50 已取消
|
||||
*/
|
||||
CANCEL(50),
|
||||
|
||||
/**
|
||||
* 60 传输异常
|
||||
*/
|
||||
ERROR(60),
|
||||
|
||||
;
|
||||
|
||||
private final Integer status;
|
||||
|
||||
public static SftpTransferStatus of(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
for (SftpTransferStatus value : values()) {
|
||||
if (value.status.equals(status)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package cn.orionsec.ops.constant.sftp;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum SftpTransferType {
|
||||
|
||||
/**
|
||||
* 10 上传
|
||||
*/
|
||||
UPLOAD(10, "上传"),
|
||||
|
||||
/**
|
||||
* 20 下载
|
||||
*/
|
||||
DOWNLOAD(20, "下载"),
|
||||
|
||||
/**
|
||||
* 30 传输
|
||||
*/
|
||||
TRANSFER(30, "传输"),
|
||||
|
||||
/**
|
||||
* 40 打包
|
||||
*/
|
||||
PACKAGE(40, "打包"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static SftpTransferType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (SftpTransferType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package cn.orionsec.ops.constant.system;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum SystemCleanType {
|
||||
|
||||
/**
|
||||
* 临时文件
|
||||
*/
|
||||
TEMP_FILE(10, "临时文件"),
|
||||
|
||||
/**
|
||||
* 日志文件
|
||||
*/
|
||||
LOG_FILE(20, "日志文件"),
|
||||
|
||||
/**
|
||||
* 交换文件
|
||||
*/
|
||||
SWAP_FILE(30, "交换文件"),
|
||||
|
||||
/**
|
||||
* 历史产物文件
|
||||
*/
|
||||
DIST_FILE(40, "旧版本构建产物"),
|
||||
|
||||
/**
|
||||
* 版本仓库文件
|
||||
*/
|
||||
REPO_FILE(50, "旧版本应用仓库"),
|
||||
|
||||
/**
|
||||
* 录屏文件
|
||||
*/
|
||||
SCREEN_FILE(60, "录屏文件"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static SystemCleanType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
return Arrays.stream(values())
|
||||
.filter(a -> a.type.equals(type))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,256 @@
|
||||
package cn.orionsec.ops.constant.system;
|
||||
|
||||
import cn.orionsec.kit.lang.exception.argument.InvalidArgumentException;
|
||||
import cn.orionsec.kit.lang.function.Conversion;
|
||||
import cn.orionsec.kit.lang.utils.Exceptions;
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.kit.lang.utils.Valid;
|
||||
import cn.orionsec.ops.constant.MessageConst;
|
||||
import cn.orionsec.ops.constant.common.EnableType;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum SystemConfigKey {
|
||||
|
||||
/**
|
||||
* 文件清理阈值 (天)
|
||||
*/
|
||||
FILE_CLEAN_THRESHOLD(10, SystemEnvAttr.FILE_CLEAN_THRESHOLD) {
|
||||
@Override
|
||||
protected boolean valid(String s) {
|
||||
return Strings.isInteger(s) && Integer.parseInt(s) >= 0 && Integer.parseInt(s) <= 1000;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String validTips() {
|
||||
return FILE_CLEAN_THRESHOLD_TIPS;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 是否启用自动清理
|
||||
*/
|
||||
ENABLE_AUTO_CLEAN_FILE(20, SystemEnvAttr.ENABLE_AUTO_CLEAN_FILE) {
|
||||
@Override
|
||||
protected String conversionValue(String s) {
|
||||
return ENABLED_TYPE.apply(s);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 是否允许多端登录
|
||||
*/
|
||||
ALLOW_MULTIPLE_LOGIN(30, SystemEnvAttr.ALLOW_MULTIPLE_LOGIN) {
|
||||
@Override
|
||||
protected String conversionValue(String s) {
|
||||
return ENABLED_TYPE.apply(s);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 是否启用登录失败锁定
|
||||
*/
|
||||
LOGIN_FAILURE_LOCK(40, SystemEnvAttr.LOGIN_FAILURE_LOCK) {
|
||||
@Override
|
||||
protected String conversionValue(String s) {
|
||||
return ENABLED_TYPE.apply(s);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 是否启用登录IP绑定
|
||||
*/
|
||||
LOGIN_IP_BIND(50, SystemEnvAttr.LOGIN_IP_BIND) {
|
||||
@Override
|
||||
protected String conversionValue(String s) {
|
||||
return ENABLED_TYPE.apply(s);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 是否启用凭证自动续签
|
||||
*/
|
||||
LOGIN_TOKEN_AUTO_RENEW(60, SystemEnvAttr.LOGIN_TOKEN_AUTO_RENEW) {
|
||||
@Override
|
||||
protected String conversionValue(String s) {
|
||||
return ENABLED_TYPE.apply(s);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 登录凭证有效期 (时)
|
||||
*/
|
||||
LOGIN_TOKEN_EXPIRE(70, SystemEnvAttr.LOGIN_TOKEN_EXPIRE) {
|
||||
@Override
|
||||
protected boolean valid(String s) {
|
||||
return Strings.isInteger(s) && Integer.parseInt(s) > 0 && Integer.parseInt(s) <= 720;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String validTips() {
|
||||
return LOGIN_TOKEN_EXPIRE_TIPS;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 登录失败锁定阈值 (次)
|
||||
*/
|
||||
LOGIN_FAILURE_LOCK_THRESHOLD(80, SystemEnvAttr.LOGIN_FAILURE_LOCK_THRESHOLD) {
|
||||
@Override
|
||||
protected boolean valid(String s) {
|
||||
return Strings.isInteger(s) && Integer.parseInt(s) > 0 && Integer.parseInt(s) <= 100;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String validTips() {
|
||||
return LOGIN_FAILURE_LOCK_THRESHOLD_TIPS;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 登录自动续签阈值 (时)
|
||||
*/
|
||||
LOGIN_TOKEN_AUTO_RENEW_THRESHOLD(90, SystemEnvAttr.LOGIN_TOKEN_AUTO_RENEW_THRESHOLD) {
|
||||
@Override
|
||||
protected boolean valid(String s) {
|
||||
return Strings.isInteger(s) && Integer.parseInt(s) > 0 && Integer.parseInt(s) <= 720;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String validTips() {
|
||||
return LOGIN_TOKEN_AUTO_RENEW_THRESHOLD_TIPS;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 自动恢复启用的调度任务
|
||||
*/
|
||||
RESUME_ENABLE_SCHEDULER_TASK(100, SystemEnvAttr.RESUME_ENABLE_SCHEDULER_TASK) {
|
||||
@Override
|
||||
protected String conversionValue(String s) {
|
||||
return ENABLED_TYPE.apply(s);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* SFTP 上传文件最大阈值 (MB)
|
||||
*/
|
||||
SFTP_UPLOAD_THRESHOLD(110, SystemEnvAttr.SFTP_UPLOAD_THRESHOLD) {
|
||||
@Override
|
||||
protected boolean valid(String s) {
|
||||
return Strings.isInteger(s) && Integer.parseInt(s) >= 10 && Integer.parseInt(s) <= 2048;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String validTips() {
|
||||
return SFTP_UPLOAD_THRESHOLD_TIPS;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 统计缓存有效时间 (分)
|
||||
*/
|
||||
STATISTICS_CACHE_EXPIRE(120, SystemEnvAttr.STATISTICS_CACHE_EXPIRE) {
|
||||
@Override
|
||||
protected boolean valid(String s) {
|
||||
return Strings.isInteger(s) && Integer.parseInt(s) > 0 && Integer.parseInt(s) <= 10080;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String validTips() {
|
||||
return STATISTICS_CACHE_EXPIRE_TIPS;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 终端后台主动推送心跳
|
||||
*/
|
||||
TERMINAL_ACTIVE_PUSH_HEARTBEAT(130, SystemEnvAttr.TERMINAL_ACTIVE_PUSH_HEARTBEAT) {
|
||||
@Override
|
||||
protected String conversionValue(String s) {
|
||||
return ENABLED_TYPE.apply(s);
|
||||
}
|
||||
},
|
||||
|
||||
;
|
||||
|
||||
private static final String FILE_CLEAN_THRESHOLD_TIPS = "文件清理阈值需要在 10 ~ 2048 之间";
|
||||
|
||||
private static final String LOGIN_TOKEN_EXPIRE_TIPS = "登录凭证有效期需要在 1 ~ 720 之间";
|
||||
|
||||
private static final String LOGIN_FAILURE_LOCK_THRESHOLD_TIPS = "登录失败锁定阈值需要在 1 ~ 100 之间";
|
||||
|
||||
private static final String LOGIN_TOKEN_AUTO_RENEW_THRESHOLD_TIPS = "登录自动续签阈值需要在 1 ~ 720 之间";
|
||||
|
||||
private static final String SFTP_UPLOAD_THRESHOLD_TIPS = "上传文件阈值需要在 10 ~ 2048 之间";
|
||||
|
||||
private static final String STATISTICS_CACHE_EXPIRE_TIPS = "统计缓存有效时间需要在 1 ~ 10080 之间";
|
||||
|
||||
private static final Conversion<String, String> ENABLED_TYPE = s -> EnableType.of(Boolean.valueOf(s)).getLabel();
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final SystemEnvAttr env;
|
||||
|
||||
/**
|
||||
* 验证
|
||||
*
|
||||
* @param s s
|
||||
* @return value
|
||||
*/
|
||||
protected boolean valid(String s) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证失败提示
|
||||
*
|
||||
* @return 验证失败提示
|
||||
*/
|
||||
protected String validTips() {
|
||||
return MessageConst.INVALID_CONFIG;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转化值
|
||||
*
|
||||
* @param s s
|
||||
* @return value
|
||||
*/
|
||||
protected String conversionValue(String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取值
|
||||
*
|
||||
* @return value
|
||||
*/
|
||||
public String getValue(String s) {
|
||||
// 验证
|
||||
try {
|
||||
Valid.isTrue(this.valid(s), this.validTips());
|
||||
} catch (InvalidArgumentException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
throw Exceptions.argument(this.validTips());
|
||||
}
|
||||
// 转化
|
||||
return this.conversionValue(s);
|
||||
}
|
||||
|
||||
public static SystemConfigKey of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
return Arrays.stream(values())
|
||||
.filter(a -> a.type.equals(type))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,197 @@
|
||||
package cn.orionsec.ops.constant.system;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Getter
|
||||
public enum SystemEnvAttr {
|
||||
|
||||
/**
|
||||
* 密钥存放目录
|
||||
*/
|
||||
KEY_PATH("密钥存放目录", false),
|
||||
|
||||
/**
|
||||
* 图片存放目录
|
||||
*/
|
||||
PIC_PATH("图片存放目录", false),
|
||||
|
||||
/**
|
||||
* 交换分区目录
|
||||
*/
|
||||
SWAP_PATH("交换分区目录", false),
|
||||
|
||||
/**
|
||||
* 录屏存放目录
|
||||
*/
|
||||
SCREEN_PATH("录屏存放目录", false),
|
||||
|
||||
/**
|
||||
* 日志存放目录
|
||||
*/
|
||||
LOG_PATH("日志存放目录", false),
|
||||
|
||||
/**
|
||||
* 临时文件目录
|
||||
*/
|
||||
TEMP_PATH("临时文件目录", false),
|
||||
|
||||
/**
|
||||
* 应用版本仓库目录
|
||||
*/
|
||||
REPO_PATH("应用版本仓库目录", false),
|
||||
|
||||
/**
|
||||
* 构建产物目录
|
||||
*/
|
||||
DIST_PATH("构建产物目录", false),
|
||||
|
||||
/**
|
||||
* 机器监控插件绝对路径
|
||||
*/
|
||||
MACHINE_MONITOR_AGENT_PATH("机器监控插件绝对路径", false),
|
||||
|
||||
/**
|
||||
* 日志文件上传目录
|
||||
*/
|
||||
TAIL_FILE_UPLOAD_PATH("日志文件上传目录", false),
|
||||
|
||||
/**
|
||||
* 日志文件追踪模式 tracker或tail 默认tracker
|
||||
*/
|
||||
TAIL_MODE("日志文件追踪模式 (tracker/tail)", false),
|
||||
|
||||
/**
|
||||
* 文件追踪器等待时间 (ms)
|
||||
*/
|
||||
TRACKER_DELAY_TIME("文件追踪器等待时间 (ms)", false),
|
||||
|
||||
/**
|
||||
* ip 白名单
|
||||
*/
|
||||
WHITE_IP_LIST("ip 白名单", true),
|
||||
|
||||
/**
|
||||
* ip 黑名单
|
||||
*/
|
||||
BLACK_IP_LIST("ip 黑名单", true),
|
||||
|
||||
/**
|
||||
* 是否启用 IP 过滤
|
||||
*/
|
||||
ENABLE_IP_FILTER("是否启用IP过滤", true),
|
||||
|
||||
/**
|
||||
* 是否启用 IP 白名单
|
||||
*/
|
||||
ENABLE_WHITE_IP_LIST("是否启用IP白名单", true),
|
||||
|
||||
/**
|
||||
* 文件清理阈值 (天)
|
||||
*/
|
||||
FILE_CLEAN_THRESHOLD("文件清理阈值 (天)", true),
|
||||
|
||||
/**
|
||||
* 是否启用自动清理
|
||||
*/
|
||||
ENABLE_AUTO_CLEAN_FILE("是否启用自动清理", true),
|
||||
|
||||
/**
|
||||
* 是否允许多端登录
|
||||
*/
|
||||
ALLOW_MULTIPLE_LOGIN("允许多端登录", true),
|
||||
|
||||
/**
|
||||
* 是否启用登录失败锁定
|
||||
*/
|
||||
LOGIN_FAILURE_LOCK("是否启用登录失败锁定", true),
|
||||
|
||||
/**
|
||||
* 是否启用登录IP绑定
|
||||
*/
|
||||
LOGIN_IP_BIND("是否启用登录IP绑定", true),
|
||||
|
||||
/**
|
||||
* 是否启用凭证自动续签
|
||||
*/
|
||||
LOGIN_TOKEN_AUTO_RENEW("是否启用凭证自动续签", true),
|
||||
|
||||
/**
|
||||
* 登录凭证有效期 (时)
|
||||
*/
|
||||
LOGIN_TOKEN_EXPIRE("登录凭证有效期 (时)", true),
|
||||
|
||||
/**
|
||||
* 登录失败锁定阈值 (次)
|
||||
*/
|
||||
LOGIN_FAILURE_LOCK_THRESHOLD("登录失败锁定阈值", true),
|
||||
|
||||
/**
|
||||
* 登录自动续签阈值 (时)
|
||||
*/
|
||||
LOGIN_TOKEN_AUTO_RENEW_THRESHOLD("登录自动续签阈值 (时)", true),
|
||||
|
||||
/**
|
||||
* 自动恢复启用的调度任务
|
||||
*/
|
||||
RESUME_ENABLE_SCHEDULER_TASK("自动恢复启用的调度任务", true),
|
||||
|
||||
/**
|
||||
* 终端后台主动推送心跳
|
||||
*/
|
||||
TERMINAL_ACTIVE_PUSH_HEARTBEAT("终端后台主动推送心跳", true),
|
||||
|
||||
/**
|
||||
* SFTP 上传文件最大阈值 (MB)
|
||||
*/
|
||||
SFTP_UPLOAD_THRESHOLD("sftp 上传文件最大阈值 (MB)", true),
|
||||
|
||||
/**
|
||||
* 统计缓存有效时间 (分)
|
||||
*/
|
||||
STATISTICS_CACHE_EXPIRE("统计缓存有效时间 (分)", true),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* key
|
||||
*/
|
||||
private final String key;
|
||||
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
private final String description;
|
||||
|
||||
private final boolean systemEnv;
|
||||
|
||||
@Setter
|
||||
private String value;
|
||||
|
||||
SystemEnvAttr(String description, boolean systemEnv) {
|
||||
this.description = description;
|
||||
this.systemEnv = systemEnv;
|
||||
this.key = this.name().toLowerCase();
|
||||
}
|
||||
|
||||
public static List<String> getKeys() {
|
||||
return Arrays.stream(values())
|
||||
.map(SystemEnvAttr::getKey)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static SystemEnvAttr of(String key) {
|
||||
if (key == null) {
|
||||
return null;
|
||||
}
|
||||
return Arrays.stream(values())
|
||||
.filter(a -> a.key.equals(key))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
package cn.orionsec.ops.constant.system;
|
||||
|
||||
import cn.orionsec.ops.constant.SchedulerPools;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ThreadPoolMetricsType {
|
||||
|
||||
/**
|
||||
* terminal
|
||||
*/
|
||||
TERMINAL(10, SchedulerPools.TERMINAL_SCHEDULER),
|
||||
|
||||
/**
|
||||
* terminal watcher
|
||||
*/
|
||||
TERMINAL_WATCHER(15, SchedulerPools.TERMINAL_WATCHER_SCHEDULER),
|
||||
|
||||
/**
|
||||
* 命令执行
|
||||
*/
|
||||
EXEC(20, SchedulerPools.EXEC_SCHEDULER),
|
||||
|
||||
/**
|
||||
* tail
|
||||
*/
|
||||
TAIL(30, SchedulerPools.TAIL_SCHEDULER),
|
||||
|
||||
/**
|
||||
* sftp 传输进度
|
||||
*/
|
||||
SFTP_TRANSFER_RATE(40, SchedulerPools.SFTP_TRANSFER_RATE_SCHEDULER),
|
||||
|
||||
/**
|
||||
* sftp 上传
|
||||
*/
|
||||
SFTP_UPLOAD(50, SchedulerPools.SFTP_UPLOAD_SCHEDULER),
|
||||
|
||||
/**
|
||||
* sftp 下载
|
||||
*/
|
||||
SFTP_DOWNLOAD(60, SchedulerPools.SFTP_DOWNLOAD_SCHEDULER),
|
||||
|
||||
/**
|
||||
* sftp 打包
|
||||
*/
|
||||
SFTP_PACKAGE(70, SchedulerPools.SFTP_PACKAGE_SCHEDULER),
|
||||
|
||||
/**
|
||||
* 应用构建
|
||||
*/
|
||||
APP_BUILD(80, SchedulerPools.APP_BUILD_SCHEDULER),
|
||||
|
||||
/**
|
||||
* 应用发布 主线程
|
||||
*/
|
||||
RELEASE_MAIN(90, SchedulerPools.RELEASE_MAIN_SCHEDULER),
|
||||
|
||||
/**
|
||||
* 应用发布 机器操作
|
||||
*/
|
||||
RELEASE_MACHINE(100, SchedulerPools.RELEASE_MACHINE_SCHEDULER),
|
||||
|
||||
/**
|
||||
* 调度任务 主线程
|
||||
*/
|
||||
SCHEDULER_TASK_MAIN(110, SchedulerPools.SCHEDULER_TASK_MAIN_SCHEDULER),
|
||||
|
||||
/**
|
||||
* 调度任务 机器操作
|
||||
*/
|
||||
SCHEDULER_TASK_MACHINE(120, SchedulerPools.SCHEDULER_TASK_MACHINE_SCHEDULER),
|
||||
|
||||
/**
|
||||
* 应用流水线
|
||||
*/
|
||||
PIPELINE(130, SchedulerPools.PIPELINE_SCHEDULER),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final ThreadPoolExecutor executor;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package cn.orionsec.ops.constant.tail;
|
||||
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.ops.constant.system.SystemEnvAttr;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum FileTailMode {
|
||||
|
||||
/**
|
||||
* 仅宿主机
|
||||
*
|
||||
* @see cn.orionsec.ops.tail.Tracker
|
||||
* @see cn.orionsec.ops.handler.tail.impl.TrackerTailFileHandler
|
||||
*/
|
||||
TRACKER("tracker"),
|
||||
|
||||
/**
|
||||
* tail 命令
|
||||
* <p>
|
||||
* 宿主机 远程机器
|
||||
*
|
||||
* @see cn.orionsec.ops.handler.tail.impl.ExecTailFileHandler
|
||||
*/
|
||||
TAIL("tail"),
|
||||
|
||||
;
|
||||
|
||||
private final String mode;
|
||||
|
||||
public static FileTailMode of(String mode) {
|
||||
return of(mode, false);
|
||||
}
|
||||
|
||||
public static FileTailMode of(String mode, boolean hostMachine) {
|
||||
if (Strings.isBlank(mode)) {
|
||||
return hostMachine ? TRACKER : TAIL;
|
||||
}
|
||||
for (FileTailMode value : values()) {
|
||||
if (value.mode.equals(mode)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return hostMachine ? TRACKER : TAIL;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取宿主机 tailMode
|
||||
*
|
||||
* @return tailMode
|
||||
*/
|
||||
public static String getHostTailMode() {
|
||||
String mode = SystemEnvAttr.TAIL_MODE.getValue();
|
||||
return of(mode, true).getMode();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package cn.orionsec.ops.constant.tail;
|
||||
|
||||
import cn.orionsec.ops.constant.system.SystemEnvAttr;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum FileTailType {
|
||||
|
||||
/**
|
||||
* 命令执行日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
EXEC_LOG(10, true),
|
||||
|
||||
/**
|
||||
* tail 列表
|
||||
*/
|
||||
TAIL_LIST(20, false),
|
||||
|
||||
/**
|
||||
* 应用构建日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
APP_BUILD_LOG(30, true),
|
||||
|
||||
/**
|
||||
* 应用发布日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
APP_RELEASE_LOG(40, true),
|
||||
|
||||
/**
|
||||
* 调度任务机器日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
SCHEDULER_TASK_MACHINE_LOG(50, true),
|
||||
|
||||
/**
|
||||
* 应用操作日志
|
||||
*
|
||||
* @see SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
APP_ACTION_LOG(60, true),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
/**
|
||||
* 是否为本地文件
|
||||
*/
|
||||
private final boolean isLocal;
|
||||
|
||||
public static FileTailType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (FileTailType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package cn.orionsec.ops.constant.terminal;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum TerminalClientOperate {
|
||||
|
||||
/**
|
||||
* 键入
|
||||
*/
|
||||
KEY("0", true),
|
||||
|
||||
/**
|
||||
* 连接
|
||||
*/
|
||||
CONNECT("1", true),
|
||||
|
||||
/**
|
||||
* ping
|
||||
*/
|
||||
PING("2", false),
|
||||
|
||||
/**
|
||||
* pong
|
||||
*/
|
||||
PONG("3", false),
|
||||
|
||||
/**
|
||||
* 更改大小
|
||||
*/
|
||||
RESIZE("4", true),
|
||||
|
||||
/**
|
||||
* 键入命令
|
||||
*/
|
||||
COMMAND("5", true),
|
||||
|
||||
/**
|
||||
* ctrl + l
|
||||
*/
|
||||
CLEAR("6", false),
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* 前缀长度
|
||||
*/
|
||||
public static final int PREFIX_SIZE = 1;
|
||||
|
||||
private final String operate;
|
||||
|
||||
private final boolean hasBody;
|
||||
|
||||
public static TerminalClientOperate of(String operate) {
|
||||
for (TerminalClientOperate value : values()) {
|
||||
if (value.operate.equals(operate)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package cn.orionsec.ops.constant.terminal;
|
||||
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
|
||||
public class TerminalConst {
|
||||
|
||||
private TerminalConst() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断终端心跳断开的阀值
|
||||
*/
|
||||
public static final int TERMINAL_CONNECT_DOWN = Const.MS_S_60 + Const.MS_S_15;
|
||||
|
||||
/**
|
||||
* terminal symbol
|
||||
*/
|
||||
public static final String TERMINAL = "terminal";
|
||||
|
||||
/**
|
||||
* 默认背景色
|
||||
*/
|
||||
public static final String BACKGROUND_COLOR = "#212529";
|
||||
|
||||
/**
|
||||
* 默认字体颜色
|
||||
*/
|
||||
public static final String FONT_COLOR = "#FFFFFF";
|
||||
|
||||
/**
|
||||
* 默认字体大小
|
||||
*/
|
||||
public static final int FONT_SIZE = 14;
|
||||
|
||||
/**
|
||||
* 默认字体名称
|
||||
*/
|
||||
public static final String FONT_FAMILY = "courier-new, courier, monospace";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package cn.orionsec.ops.constant.user;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum RoleType {
|
||||
|
||||
/**
|
||||
* 管理员
|
||||
*/
|
||||
ADMINISTRATOR(10, "/menu/menu-admin.json"),
|
||||
|
||||
/**
|
||||
* 开发
|
||||
*/
|
||||
DEVELOPER(20, "/menu/menu-dev.json"),
|
||||
|
||||
/**
|
||||
* 运维
|
||||
*/
|
||||
OPERATION(30, "/menu/menu-opt.json"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String menuPath;
|
||||
|
||||
public static RoleType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (RoleType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否为 管理员
|
||||
*
|
||||
* @return true 管理员
|
||||
*/
|
||||
public static boolean isAdministrator(Integer type) {
|
||||
RoleType role = of(type);
|
||||
if (role == null) {
|
||||
return false;
|
||||
}
|
||||
return ADMINISTRATOR.equals(role);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package cn.orionsec.ops.constant.webhook;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum WebhookType {
|
||||
|
||||
/**
|
||||
* 钉钉机器人
|
||||
*/
|
||||
DING_ROBOT(10, "钉钉机器人"),
|
||||
|
||||
;
|
||||
|
||||
private final Integer type;
|
||||
|
||||
private final String label;
|
||||
|
||||
public static WebhookType of(Integer type) {
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
for (WebhookType value : values()) {
|
||||
if (value.type.equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static WebhookType of(String label) {
|
||||
if (label == null) {
|
||||
return null;
|
||||
}
|
||||
for (WebhookType value : values()) {
|
||||
if (value.label.equals(label)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
package cn.orionsec.ops.constant.ws;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum WsCloseCode {
|
||||
|
||||
/**
|
||||
* 未查询到token
|
||||
*/
|
||||
INCORRECT_TOKEN(4100, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* 伪造token
|
||||
*/
|
||||
FORGE_TOKEN(4120, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* token已被绑定
|
||||
*/
|
||||
TOKEN_BIND(4125, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* 未知的连接
|
||||
*/
|
||||
UNKNOWN_CONNECT(4130, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* 认证失败 id不匹配
|
||||
*/
|
||||
IDENTITY_MISMATCH(4140, WsCloseReason.IDENTITY_MISMATCH),
|
||||
|
||||
/**
|
||||
* 认证信息不匹配
|
||||
*/
|
||||
VALID(4150, WsCloseReason.AUTHENTICATION_FAILURE),
|
||||
|
||||
/**
|
||||
* 机器不合法
|
||||
*/
|
||||
INVALID_MACHINE(4200, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* 连接远程服务器连接超时
|
||||
*/
|
||||
CONNECTION_TIMEOUT(4201, WsCloseReason.CONNECTION_TIMEOUT),
|
||||
|
||||
/**
|
||||
* 连接远程服务器失败
|
||||
*/
|
||||
CONNECTION_FAILURE(4202, WsCloseReason.REMOTE_SERVER_UNREACHABLE),
|
||||
|
||||
/**
|
||||
* 远程服务器认证失败
|
||||
*/
|
||||
CONNECTION_AUTH_FAILURE(4205, WsCloseReason.REMOTE_SERVER_AUTHENTICATION_FAILURE),
|
||||
|
||||
/**
|
||||
* 远程服务器认证出现异常
|
||||
*/
|
||||
CONNECTION_EXCEPTION(4210, WsCloseReason.UNABLE_TO_CONNECT_REMOTE_SERVER),
|
||||
|
||||
/**
|
||||
* 机器未启用
|
||||
*/
|
||||
MACHINE_DISABLED(4215, WsCloseReason.MACHINE_DISABLED),
|
||||
|
||||
/**
|
||||
* 打开shell出现异常
|
||||
*/
|
||||
OPEN_SHELL_EXCEPTION(4220, WsCloseReason.UNABLE_TO_CONNECT_REMOTE_SERVER),
|
||||
|
||||
/**
|
||||
* 打开command出现异常
|
||||
*/
|
||||
OPEN_COMMAND_EXCEPTION(4225, WsCloseReason.UNABLE_TO_CONNECT_REMOTE_SERVER),
|
||||
|
||||
/**
|
||||
* 打开sftp出现异常
|
||||
*/
|
||||
OPEN_SFTP_EXCEPTION(4230, WsCloseReason.UNABLE_TO_CONNECT_REMOTE_SERVER),
|
||||
|
||||
/**
|
||||
* 服务出现异常
|
||||
*/
|
||||
RUNTIME_EXCEPTION(4300, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* 心跳结束
|
||||
*/
|
||||
HEART_DOWN(4310, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* 用户关闭
|
||||
*/
|
||||
DISCONNECT(4320, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* 结束
|
||||
*/
|
||||
EOF(4330, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* 读取失败
|
||||
*/
|
||||
READ_EXCEPTION(4335, WsCloseReason.CLOSED_CONNECTION),
|
||||
|
||||
/**
|
||||
* 强制下线
|
||||
*/
|
||||
FORCED_OFFLINE(4500, WsCloseReason.FORCED_OFFLINE),
|
||||
|
||||
;
|
||||
|
||||
private final int code;
|
||||
|
||||
private final String reason;
|
||||
|
||||
public static WsCloseCode of(int code) {
|
||||
for (WsCloseCode value : values()) {
|
||||
if (value.code == code) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package cn.orionsec.ops.constant.ws;
|
||||
|
||||
|
||||
public class WsCloseReason {
|
||||
|
||||
private WsCloseReason() {
|
||||
}
|
||||
|
||||
public static final String CLOSED_CONNECTION = "closed connection...";
|
||||
|
||||
public static final String IDENTITY_MISMATCH = "identity mismatch...";
|
||||
|
||||
public static final String AUTHENTICATION_FAILURE = "authentication failure...";
|
||||
|
||||
public static final String REMOTE_SERVER_UNREACHABLE = "remote server unreachable...";
|
||||
|
||||
public static final String CONNECTION_TIMEOUT = "connection timeout...";
|
||||
|
||||
public static final String REMOTE_SERVER_AUTHENTICATION_FAILURE = "remote server authentication failure...";
|
||||
|
||||
public static final String MACHINE_DISABLED = "machine disabled...";
|
||||
|
||||
public static final String UNABLE_TO_CONNECT_REMOTE_SERVER = "unable to connect remote server...";
|
||||
|
||||
public static final String FORCED_OFFLINE = "forced offline...";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package cn.orionsec.ops.constant.ws;
|
||||
|
||||
import cn.orionsec.kit.lang.utils.Exceptions;
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.kit.lang.utils.Valid;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
public enum WsProtocol {
|
||||
|
||||
/**
|
||||
* 正常返回
|
||||
*/
|
||||
OK("0"),
|
||||
|
||||
/**
|
||||
* 连接成功
|
||||
*/
|
||||
CONNECTED("1"),
|
||||
|
||||
/**
|
||||
* ping
|
||||
*/
|
||||
PING("2"),
|
||||
|
||||
/**
|
||||
* pong
|
||||
*/
|
||||
PONG("3"),
|
||||
|
||||
/**
|
||||
* 未知操作
|
||||
*/
|
||||
ERROR("4"),
|
||||
|
||||
;
|
||||
|
||||
private final String code;
|
||||
|
||||
/**
|
||||
* 分隔符
|
||||
*/
|
||||
public static final String SYMBOL = "|";
|
||||
|
||||
public byte[] get() {
|
||||
return Strings.bytes(code);
|
||||
}
|
||||
|
||||
public byte[] msg(String body) {
|
||||
Valid.notNull(body);
|
||||
return this.msg(Strings.bytes(body));
|
||||
}
|
||||
|
||||
public byte[] msg(byte[] body) {
|
||||
return this.msg(body, 0, body.length);
|
||||
}
|
||||
|
||||
public byte[] msg(byte[] body, int offset, int len) {
|
||||
Valid.notNull(body);
|
||||
try (ByteArrayOutputStream o = new ByteArrayOutputStream()) {
|
||||
o.write(Strings.bytes(code + SYMBOL));
|
||||
o.write(body, offset, len);
|
||||
return o.toByteArray();
|
||||
} catch (IOException e) {
|
||||
throw Exceptions.ioRuntime(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
package cn.orionsec.ops.utils;
|
||||
|
||||
import cn.orionsec.kit.lang.define.collect.MutableArrayList;
|
||||
import cn.orionsec.kit.lang.define.collect.MutableLinkedHashMap;
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.kit.lang.utils.collect.Lists;
|
||||
import cn.orionsec.kit.lang.utils.collect.Maps;
|
||||
import cn.orionsec.kit.lang.utils.ext.dom.*;
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.fastjson.parser.Feature;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import org.dom4j.io.OutputFormat;
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class AttrConverts {
|
||||
|
||||
private static final String XML_ROOT_TAG = "root";
|
||||
|
||||
private static final String XML_NODE_TAG = "env";
|
||||
|
||||
private static final String XML_NODE_KEY_ATTR = "key";
|
||||
|
||||
private AttrConverts() {
|
||||
}
|
||||
|
||||
/**
|
||||
* env -> json
|
||||
*
|
||||
* @param attrs env
|
||||
* @return json
|
||||
*/
|
||||
public static String toJson(Map<String, String> attrs) {
|
||||
return JSON.toJSONString(attrs, SerializerFeature.PrettyFormat);
|
||||
}
|
||||
|
||||
/**
|
||||
* env -> xml
|
||||
*
|
||||
* @param attrs env
|
||||
* @return xml
|
||||
*/
|
||||
public static String toXml(Map<String, String> attrs) {
|
||||
DomBuilder builder = DomBuilder.create();
|
||||
DomElement root = builder.createRootElement(XML_ROOT_TAG);
|
||||
attrs.forEach((k, v) -> {
|
||||
DomElement child = new DomElement(XML_NODE_TAG, v);
|
||||
child.addAttributes(XML_NODE_KEY_ATTR, k);
|
||||
if (DomSupport.isEscape(v)) {
|
||||
child.cdata();
|
||||
}
|
||||
root.addChildNode(child);
|
||||
});
|
||||
builder.build();
|
||||
OutputFormat format = new OutputFormat(Const.SPACE_4, true);
|
||||
format.setExpandEmptyElements(true);
|
||||
// 隐藏头
|
||||
format.setSuppressDeclaration(true);
|
||||
return DomSupport.format(builder.getDocument(), format).substring(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* env -> yml
|
||||
*
|
||||
* @param attrs env
|
||||
* @return yml
|
||||
*/
|
||||
public static String toYml(Map<String, String> attrs) {
|
||||
return new Yaml().dumpAsMap(attrs);
|
||||
}
|
||||
|
||||
/**
|
||||
* env -> properties
|
||||
*
|
||||
* @param attrs env
|
||||
* @return properties
|
||||
*/
|
||||
public static String toProperties(Map<String, String> attrs) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
attrs.forEach((k, v) -> {
|
||||
sb.append(k).append("=").append(v).append(Const.LF);
|
||||
});
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* json -> env
|
||||
*
|
||||
* @param json xml
|
||||
* @return json
|
||||
*/
|
||||
public static MutableLinkedHashMap<String, String> fromJson(String json) {
|
||||
MutableLinkedHashMap<String, String> map = Maps.newMutableLinkedMap();
|
||||
JSONObject res = JSON.parseObject(json, Feature.OrderedField);
|
||||
res.forEach((k, v) -> map.put(k, v + Strings.EMPTY));
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* xml -> env
|
||||
*
|
||||
* @param xml xml
|
||||
* @return env
|
||||
*/
|
||||
public static MutableLinkedHashMap<String, String> fromXml(String xml) {
|
||||
MutableLinkedHashMap<String, String> map = Maps.newMutableLinkedMap();
|
||||
DomNode domNode = DomExt.of(xml).toDomNode().get(XML_NODE_TAG);
|
||||
MutableArrayList<DomNode> list;
|
||||
if (domNode.getValueClass() == String.class) {
|
||||
list = Lists.newMutableList();
|
||||
list.add(domNode);
|
||||
} else {
|
||||
list = domNode.getListValue();
|
||||
}
|
||||
list.forEach(e -> {
|
||||
Map<String, String> attr = e.getAttr();
|
||||
if (Maps.isEmpty(attr)) {
|
||||
return;
|
||||
}
|
||||
String key = attr.get(XML_NODE_KEY_ATTR);
|
||||
if (Strings.isBlank(key)) {
|
||||
return;
|
||||
}
|
||||
map.put(key, e.getStringValue());
|
||||
});
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* yml -> env
|
||||
*
|
||||
* @param yml yml
|
||||
* @return env
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static MutableLinkedHashMap<String, String> fromYml(String yml) {
|
||||
return new Yaml().loadAs(yml, MutableLinkedHashMap.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* properties -> env
|
||||
*
|
||||
* @param properties properties
|
||||
* @return env
|
||||
*/
|
||||
public static MutableLinkedHashMap<String, String> fromProperties(String properties) {
|
||||
MutableLinkedHashMap<String, String> map = Maps.newMutableLinkedMap();
|
||||
String[] rows = properties.split(Const.LF);
|
||||
for (String row : rows) {
|
||||
String key = row.split("=")[0];
|
||||
String value;
|
||||
if (row.length() > key.length()) {
|
||||
value = row.substring(key.length() + 1);
|
||||
} else {
|
||||
value = Strings.EMPTY;
|
||||
}
|
||||
map.put(key, value);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
package cn.orionsec.ops.utils;
|
||||
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.kit.lang.utils.codec.Base64s;
|
||||
import cn.orionsec.kit.lang.utils.io.FileReaders;
|
||||
import cn.orionsec.kit.lang.utils.io.Files1;
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
import cn.orionsec.ops.constant.system.SystemEnvAttr;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class AvatarPicHolder {
|
||||
|
||||
private AvatarPicHolder() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取头像路径
|
||||
*
|
||||
* @param uid uid
|
||||
* @param suffix 后缀
|
||||
* @return path
|
||||
*/
|
||||
public static String getPicPath(Long uid, String suffix) {
|
||||
return Const.AVATAR_DIR + "/" + uid + "." + suffix;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建并获取头像全路径
|
||||
*
|
||||
* @param uid uid
|
||||
* @param suffix 后缀
|
||||
* @return path
|
||||
*/
|
||||
public static String touchPicFile(Long uid, String suffix) {
|
||||
String path = Files1.getPath(SystemEnvAttr.PIC_PATH.getValue(), getPicPath(uid, suffix));
|
||||
Files1.touch(path);
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除图片
|
||||
*
|
||||
* @param url url
|
||||
*/
|
||||
public static void deletePic(String url) {
|
||||
String path = Files1.getPath(SystemEnvAttr.PIC_PATH.getValue(), url);
|
||||
Files1.delete(path);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取头像
|
||||
*
|
||||
* @param path path
|
||||
* @return avatar base64
|
||||
*/
|
||||
public static String getUserAvatar(String path) {
|
||||
if (isExist(path)) {
|
||||
return getBase64(path);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否存在
|
||||
*
|
||||
* @param path path
|
||||
* @return 是否存在
|
||||
*/
|
||||
public static boolean isExist(String path) {
|
||||
return Strings.isNotBlank(path) && Files1.isFile(Files1.getPath(SystemEnvAttr.PIC_PATH.getValue(), path));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取头像 base64
|
||||
*
|
||||
* @param url url
|
||||
* @return base64
|
||||
*/
|
||||
public static String getBase64(String url) {
|
||||
String path = Files1.getPath(SystemEnvAttr.PIC_PATH.getValue(), url);
|
||||
if (!Files1.isFile(path)) {
|
||||
return null;
|
||||
}
|
||||
return Base64s.imgEncode(FileReaders.readAllBytes(path), Files1.getSuffix(path));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package cn.orionsec.ops.utils;
|
||||
|
||||
import cn.orionsec.ops.constant.event.EventKeys;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class EventLogUtils {
|
||||
|
||||
private EventLogUtils() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除内部key
|
||||
*
|
||||
* @param map map
|
||||
*/
|
||||
public static void removeInnerKeys(Map<String, ?> map) {
|
||||
map.remove(EventKeys.INNER_USER_ID);
|
||||
map.remove(EventKeys.INNER_USER_NAME);
|
||||
map.remove(EventKeys.INNER_SAVE);
|
||||
map.remove(EventKeys.INNER_TEMPLATE);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
package cn.orionsec.ops.utils;
|
||||
|
||||
import cn.orionsec.kit.lang.utils.io.Files1;
|
||||
import cn.orionsec.kit.lang.utils.time.Dates;
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
import cn.orionsec.ops.constant.system.SystemCleanType;
|
||||
import cn.orionsec.ops.constant.system.SystemEnvAttr;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
public class FileCleaner {
|
||||
|
||||
private FileCleaner() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理所有
|
||||
*/
|
||||
public static void cleanAll() {
|
||||
Date threshold = Dates.stream().subDay(Integer.parseInt(SystemEnvAttr.FILE_CLEAN_THRESHOLD.getValue())).get();
|
||||
long thresholdTime = threshold.getTime();
|
||||
log.info("自动清理文件-阈值 {}", Dates.format(threshold));
|
||||
long releasedBytes = 0L;
|
||||
// 清理临时文件
|
||||
releasedBytes += deletePathFiles(thresholdTime, new File(SystemEnvAttr.TEMP_PATH.getValue()));
|
||||
// 日志文件
|
||||
releasedBytes += deletePathFiles(thresholdTime, new File(SystemEnvAttr.LOG_PATH.getValue()));
|
||||
// 交换文件
|
||||
releasedBytes += deletePathFiles(thresholdTime, new File(SystemEnvAttr.SWAP_PATH.getValue()));
|
||||
// 构建产物
|
||||
releasedBytes += deletePathFiles(thresholdTime, new File(SystemEnvAttr.DIST_PATH.getValue()));
|
||||
// 应用仓库 文件太多会 oom
|
||||
// File repoPath = new File(SystemEnvAttr.REPO_PATH.getValue());
|
||||
// List<File> repoPaths = Files1.listFilesFilter(repoPath, (f, n) -> f.isDirectory() && !Const.EVENT.equals(n), false, true);
|
||||
// for (File repo : repoPaths) {
|
||||
// releasedBytes += deletePathFiles(thresholdTime, repo);
|
||||
// }
|
||||
log.info("自动清理文件-释放 {}", Files1.getSize(releasedBytes));
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理目录
|
||||
*
|
||||
* @param cleanType cleanType
|
||||
*/
|
||||
public static void cleanDir(SystemCleanType cleanType) {
|
||||
Date threshold = Dates.stream().subDay(Integer.parseInt(SystemEnvAttr.FILE_CLEAN_THRESHOLD.getValue())).get();
|
||||
long thresholdTime = threshold.getTime();
|
||||
long releasedBytes = 0L;
|
||||
log.info("手动清理文件-阈值 {}", Dates.format(threshold));
|
||||
switch (cleanType) {
|
||||
case TEMP_FILE:
|
||||
// 清理临时文件
|
||||
releasedBytes += deletePathFiles(thresholdTime, new File(SystemEnvAttr.TEMP_PATH.getValue()));
|
||||
break;
|
||||
case LOG_FILE:
|
||||
// 日志文件
|
||||
releasedBytes += deletePathFiles(thresholdTime, new File(SystemEnvAttr.LOG_PATH.getValue()));
|
||||
break;
|
||||
case SWAP_FILE:
|
||||
// 交换文件
|
||||
releasedBytes += deletePathFiles(thresholdTime, new File(SystemEnvAttr.SWAP_PATH.getValue()));
|
||||
break;
|
||||
case DIST_FILE:
|
||||
// 构建产物
|
||||
releasedBytes += deletePathFiles(thresholdTime, new File(SystemEnvAttr.DIST_PATH.getValue()));
|
||||
break;
|
||||
case REPO_FILE:
|
||||
// 应用仓库
|
||||
File repoPath = new File(SystemEnvAttr.REPO_PATH.getValue());
|
||||
List<File> repoPaths = Files1.listFilesFilter(repoPath, f -> f.isDirectory() && !Const.EVENT.equals(f.getName()), false, true);
|
||||
for (File repo : repoPaths) {
|
||||
releasedBytes += deletePathFiles(thresholdTime, repo);
|
||||
}
|
||||
break;
|
||||
case SCREEN_FILE:
|
||||
// 录屏文件
|
||||
releasedBytes += deletePathFiles(thresholdTime, new File(SystemEnvAttr.SCREEN_PATH.getValue()));
|
||||
break;
|
||||
default:
|
||||
}
|
||||
log.info("手动清理文件-释放 {}", Files1.getSize(releasedBytes));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*
|
||||
* @param thresholdTime 阈值
|
||||
* @param path 文件夹
|
||||
* @return size
|
||||
*/
|
||||
private static long deletePathFiles(long thresholdTime, File path) {
|
||||
List<File> files = Files1.listFilesFilter(path, p -> checkLessThanThreshold(thresholdTime, p), true, true);
|
||||
long size = files.stream().mapToLong(File::length).sum();
|
||||
files.stream().filter(File::isFile).forEach(Files1::delete);
|
||||
files.stream().filter(File::isDirectory).forEach(Files1::delete);
|
||||
files.clear();
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查文件是否超过阈值
|
||||
*
|
||||
* @param thresholdTime 阈值
|
||||
* @param file 文件
|
||||
* @return 是否超过
|
||||
*/
|
||||
private static boolean checkLessThanThreshold(long thresholdTime, File file) {
|
||||
return file.lastModified() <= thresholdTime;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,286 @@
|
||||
package cn.orionsec.ops.utils;
|
||||
|
||||
import cn.orionsec.kit.lang.id.ObjectIds;
|
||||
import cn.orionsec.kit.lang.utils.Systems;
|
||||
import cn.orionsec.kit.lang.utils.io.Files1;
|
||||
import cn.orionsec.kit.lang.utils.time.Dates;
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PathBuilders {
|
||||
|
||||
private PathBuilders() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 terminal 录屏路径
|
||||
*
|
||||
* @param userId userId
|
||||
* @param machineId machineId
|
||||
* @return path
|
||||
*/
|
||||
public static String getTerminalScreenPath(Long userId, Long machineId) {
|
||||
return Const.TERMINAL_DIR
|
||||
+ "/" + userId
|
||||
+ "_" + machineId
|
||||
+ "_" + Dates.current(Dates.YMD_HMS2)
|
||||
+ "." + Const.CAST_SUFFIX;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 exec 日志路径
|
||||
*
|
||||
* @param suffix suffix
|
||||
* @param execId execId
|
||||
* @param machineId machineId
|
||||
* @return path
|
||||
*/
|
||||
public static String getExecLogPath(String suffix, Long execId, Long machineId) {
|
||||
return Const.EXEC_DIR + suffix
|
||||
+ "/" + execId
|
||||
+ "_" + machineId
|
||||
+ "_" + Dates.current(Dates.YMD_HMS2)
|
||||
+ "." + Const.SUFFIX_LOG;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取应用构建产物文件目录
|
||||
*
|
||||
* @param buildId buildId
|
||||
* @return path
|
||||
*/
|
||||
public static String getBuildBundlePath(Long buildId) {
|
||||
return Const.BUILD_DIR + "/" + buildId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取应用构建日志文件
|
||||
*
|
||||
* @param buildId buildId
|
||||
* @return path
|
||||
*/
|
||||
public static String getBuildLogPath(Long buildId) {
|
||||
return Const.BUILD_DIR
|
||||
+ "/" + buildId
|
||||
+ "/" + Const.BUILD
|
||||
+ "." + Const.SUFFIX_LOG;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取应用构建操作日志文件
|
||||
*
|
||||
* @param buildId buildId
|
||||
* @return path
|
||||
*/
|
||||
public static String getBuildActionLogPath(Long buildId, Long actionId) {
|
||||
return Const.BUILD_DIR
|
||||
+ "/" + buildId
|
||||
+ "/" + Const.ACTION
|
||||
+ "_" + actionId
|
||||
+ "." + Const.SUFFIX_LOG;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取应用发布目标机器日志文件
|
||||
*
|
||||
* @param releaseId releaseId
|
||||
* @param machineId 机器id
|
||||
* @return path
|
||||
*/
|
||||
public static String getReleaseMachineLogPath(Long releaseId, Long machineId) {
|
||||
return Const.RELEASE_DIR
|
||||
+ "/" + releaseId
|
||||
+ Const.RELEASE_MACHINE_PREFIX
|
||||
+ "_" + machineId
|
||||
+ "." + Const.SUFFIX_LOG;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取应用发布操作日志文件
|
||||
*
|
||||
* @param releaseId releaseId
|
||||
* @param machineId machineId
|
||||
* @param actionId actionId
|
||||
* @return path
|
||||
*/
|
||||
public static String getReleaseActionLogPath(Long releaseId, Long machineId, Long actionId) {
|
||||
return Const.RELEASE_DIR
|
||||
+ "/" + releaseId
|
||||
+ Const.RELEASE_MACHINE_PREFIX
|
||||
+ "_" + machineId
|
||||
+ "_" + Const.ACTION
|
||||
+ "_" + actionId
|
||||
+ "." + Const.SUFFIX_LOG;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 release 产物快照文件
|
||||
*
|
||||
* @param releaseId releaseId
|
||||
* @param distPath distPath
|
||||
* @return path
|
||||
*/
|
||||
public static String getDistSnapshotPath(Long releaseId, String distPath) {
|
||||
return "/" + releaseId + "_" + Files1.getFileName(distPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取调度任务机器日志文件
|
||||
*
|
||||
* @param taskId taskId
|
||||
* @param recordId recordId
|
||||
* @param machineId machineId
|
||||
* @return path
|
||||
*/
|
||||
public static String getSchedulerTaskLogPath(Long taskId, Long recordId, Long machineId) {
|
||||
return Const.TASK_DIR
|
||||
+ "/" + taskId
|
||||
+ "/" + recordId
|
||||
+ "/" + machineId
|
||||
+ "." + Const.SUFFIX_LOG;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取 sftp upload 文件路径
|
||||
*
|
||||
* @param fileToken fileToken
|
||||
* @return path
|
||||
*/
|
||||
public static String getSftpUploadFilePath(String fileToken) {
|
||||
return Const.UPLOAD_DIR + "/" + fileToken + Const.SWAP_FILE_SUFFIX;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 sftp download 文件路径
|
||||
*
|
||||
* @param fileToken fileToken
|
||||
* @return path
|
||||
*/
|
||||
public static String getSftpDownloadFilePath(String fileToken) {
|
||||
return Const.DOWNLOAD_DIR + "/" + fileToken + Const.SWAP_FILE_SUFFIX;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 sftp package 文件路径
|
||||
*
|
||||
* @param fileToken fileToken
|
||||
* @return path
|
||||
*/
|
||||
public static String getSftpPackageFilePath(String fileToken) {
|
||||
return Const.PACKAGE_DIR + "/" + fileToken + "." + Const.SUFFIX_ZIP;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取导出数据 xlsx 文件路径
|
||||
*
|
||||
* @param userId userId
|
||||
* @param type type
|
||||
* @return path
|
||||
*/
|
||||
public static String getExportDataJsonPath(Long userId, Integer type, String password) {
|
||||
return Const.EXPORT_DIR
|
||||
+ "/" + type
|
||||
+ "/" + Dates.current(Dates.YMD_HMS2)
|
||||
+ "-" + userId
|
||||
+ "-" + password
|
||||
+ "." + Const.SUFFIX_XLSX;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取导入数据 json 文件路径
|
||||
*
|
||||
* @param userId userId
|
||||
* @param type type
|
||||
* @param token token
|
||||
* @return path
|
||||
*/
|
||||
public static String getImportDataJsonPath(Long userId, Integer type, String token) {
|
||||
return Const.IMPORT_DIR
|
||||
+ "/" + type
|
||||
+ "/" + Dates.current(Dates.YMD_HMS2)
|
||||
+ "-" + userId
|
||||
+ "-" + token
|
||||
+ "." + Const.SUFFIX_JSON;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户根目录
|
||||
*
|
||||
* @param username 用户名
|
||||
* @return 用户目录
|
||||
*/
|
||||
public static String getHomePath(String username) {
|
||||
if (Const.ROOT.equals(username)) {
|
||||
return "/" + Const.ROOT;
|
||||
} else {
|
||||
return "/home/" + username;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取密钥路径
|
||||
*
|
||||
* @return path
|
||||
*/
|
||||
public static String getSecretKeyPath() {
|
||||
return "/" + ObjectIds.nextId() + Const.SECRET_KEY_SUFFIX;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取宿主机环境目录
|
||||
*
|
||||
* @param path 子目录
|
||||
* @return path
|
||||
*/
|
||||
public static String getHostEnvPath(String path) {
|
||||
return Systems.HOME_DIR + "/" + Const.ORION_OPS + "/" + path;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 sftp 打包临时目录
|
||||
*
|
||||
* @param username username
|
||||
* @param fileToken fileToken
|
||||
* @param paths paths
|
||||
* @return path
|
||||
*/
|
||||
public static String getSftpPackageTempPath(String username, String fileToken, List<String> paths) {
|
||||
return PathBuilders.getHomePath(username)
|
||||
+ "/" + Const.ORION_OPS
|
||||
+ "/" + Const.PACKAGE
|
||||
+ "/" + fileToken
|
||||
+ "/" + Files1.getFileName(paths.get(0))
|
||||
+ " more files"
|
||||
+ "." + Const.SUFFIX_ZIP;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取插件目录
|
||||
*
|
||||
* @param username username
|
||||
* @return path
|
||||
*/
|
||||
public static String getPluginPath(String username) {
|
||||
return PathBuilders.getHomePath(username)
|
||||
+ "/" + Const.ORION_OPS
|
||||
+ "/" + Const.PLUGINS;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取安装日志路径
|
||||
*
|
||||
* @param machineId machineId
|
||||
* @param app app
|
||||
* @return path
|
||||
*/
|
||||
public static String getInstallLogPath(Long machineId, String app) {
|
||||
return Const.INSTALL_DIR
|
||||
+ "/" + app
|
||||
+ "/" + machineId
|
||||
+ "-" + Dates.current(Dates.YMD_HMS2)
|
||||
+ "." + Const.SUFFIX_LOG;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package cn.orionsec.ops.utils;
|
||||
|
||||
import cn.orionsec.kit.lang.utils.Exceptions;
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.kit.lang.utils.collect.Maps;
|
||||
import cn.orionsec.kit.lang.utils.io.Streams;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
@Slf4j
|
||||
public class ResourceLoader {
|
||||
|
||||
/**
|
||||
* key: resource
|
||||
* value: content
|
||||
*/
|
||||
private static final Map<String, String> RESOURCE = Maps.newMap();
|
||||
|
||||
/**
|
||||
* 获取资源
|
||||
*
|
||||
* @param resource resource
|
||||
* @param loader 加载类
|
||||
* @return content
|
||||
*/
|
||||
public static String get(String resource, Class<?> loader) {
|
||||
try (InputStream stream = loader.getResourceAsStream(resource)) {
|
||||
String content = Streams.toString(Objects.requireNonNull(stream));
|
||||
RESOURCE.put(resource, content);
|
||||
return content;
|
||||
} catch (IOException e) {
|
||||
throw Exceptions.notFound(Strings.format("resource not found {} by {}", resource, loader.getName()), e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,263 @@
|
||||
package cn.orionsec.ops.utils;
|
||||
|
||||
import cn.orionsec.kit.ext.location.Region;
|
||||
import cn.orionsec.kit.ext.location.region.LocationRegions;
|
||||
import cn.orionsec.kit.lang.id.UUIds;
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.kit.lang.utils.io.Files1;
|
||||
import cn.orionsec.kit.lang.utils.net.IPs;
|
||||
import cn.orionsec.kit.lang.utils.time.Dates;
|
||||
import cn.orionsec.ops.constant.CnConst;
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
import cn.orionsec.ops.constant.common.StainCode;
|
||||
import cn.orionsec.ops.constant.system.SystemEnvAttr;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class Utils {
|
||||
|
||||
private Utils() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取随机后缀
|
||||
*
|
||||
* @return suffix
|
||||
*/
|
||||
public static String getRandomSuffix() {
|
||||
return UUIds.random32().substring(0, 5).toUpperCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取后缀
|
||||
*
|
||||
* @param symbol symbol
|
||||
* @return suffix
|
||||
*/
|
||||
public static String getSymbolSuffix(String symbol) {
|
||||
return " - " + symbol + Strings.SPACE + UUIds.random32().substring(0, 5).toUpperCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否是合法 ip 配置行
|
||||
*
|
||||
* @param line line
|
||||
* @return 是否合法
|
||||
*/
|
||||
public static boolean validIpLine(String line) {
|
||||
// 普通ip
|
||||
line = line.trim();
|
||||
if (!line.contains(Const.SLASH)) {
|
||||
return IPs.isIpv4(line);
|
||||
}
|
||||
return validIpRange(line);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否为合法 ip 区间
|
||||
*
|
||||
* @param range range
|
||||
* @return 是否合法
|
||||
*/
|
||||
public static boolean validIpRange(String range) {
|
||||
// ip区间
|
||||
String[] split = range.split(Const.SLASH);
|
||||
String first = split[0];
|
||||
String last = split[1];
|
||||
if (split.length != 2) {
|
||||
return false;
|
||||
}
|
||||
// 检查第一段
|
||||
if (!IPs.isIpv4(first)) {
|
||||
return false;
|
||||
}
|
||||
// 尾ip
|
||||
if (!last.contains(Const.DOT)) {
|
||||
last = first.substring(0, first.lastIndexOf(Const.DOT)) + Const.DOT + last;
|
||||
}
|
||||
return IPs.isIpv4(last);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查 ip 是否在范围内
|
||||
*
|
||||
* @param ip ip
|
||||
* @param filter filter
|
||||
* @return 是否在范围内
|
||||
*/
|
||||
public static boolean checkIpIn(String ip, String filter) {
|
||||
filter = filter.trim();
|
||||
// 单个ip
|
||||
if (!filter.contains(Const.SLASH)) {
|
||||
return ip.equals(filter);
|
||||
}
|
||||
// ip区间
|
||||
String[] split = filter.split(Const.SLASH);
|
||||
String first = split[0];
|
||||
String last = split[1];
|
||||
// 尾ip
|
||||
if (!last.contains(Const.DOT)) {
|
||||
last = first.substring(0, first.lastIndexOf(Const.DOT)) + Const.DOT + last;
|
||||
}
|
||||
return IPs.ipInRange(first, last, ip);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取事件仓库路径
|
||||
*
|
||||
* @param id id
|
||||
* @return 路径
|
||||
*/
|
||||
public static String getRepositoryEventDir(Long id) {
|
||||
return Files1.getPath(SystemEnvAttr.REPO_PATH.getValue(), Const.EVENT_DIR + "/" + id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取时差
|
||||
*
|
||||
* @param ms ms
|
||||
* @return 时差
|
||||
*/
|
||||
public static String interval(Long ms) {
|
||||
if (ms == null) {
|
||||
return null;
|
||||
}
|
||||
return Dates.interval(ms, false, "d ", "h ", "m ", "s");
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 ANSI 高亮颜色行
|
||||
*
|
||||
* @param key key
|
||||
* @param code code
|
||||
* @return 高亮字体
|
||||
* @see StainCode
|
||||
*/
|
||||
public static String getStainKeyWords(Object key, int code) {
|
||||
return StainCode.prefix(code) + key + StainCode.SUFFIX;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除 ANSI 高亮颜色行
|
||||
*
|
||||
* @param s s
|
||||
* @return 清除 ANSI 颜色属性
|
||||
* @see StainCode
|
||||
*/
|
||||
public static String cleanStainAnsiCode(String s) {
|
||||
return s.replaceAll("\\u001B\\[\\w{1,3}m", Const.EMPTY);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为 \n 结尾
|
||||
* 是则返回 \n
|
||||
* 否则返回 \n\n
|
||||
*
|
||||
* @param s s
|
||||
* @return lf
|
||||
*/
|
||||
public static String getEndLfWithEof(String s) {
|
||||
return s.endsWith(Const.LF) ? s + Const.LF : s + Const.LF_2;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 sftp 压缩命令
|
||||
*
|
||||
* @param zipPath zipPath
|
||||
* @param paths paths
|
||||
* @return zip 命令
|
||||
*/
|
||||
public static String getSftpPackageCommand(String zipPath, List<String> paths) {
|
||||
return "mkdir -p " + Files1.getParentPath(zipPath) + " && zip -r \"" + zipPath + "\" "
|
||||
+ paths.stream()
|
||||
.map(Files1::getPath)
|
||||
.map(s -> "\"" + s + "\"")
|
||||
.collect(Collectors.joining(Const.SPACE));
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空高亮标签
|
||||
*
|
||||
* @param m m
|
||||
* @return clean
|
||||
*/
|
||||
public static String cleanStainTag(String m) {
|
||||
if (Strings.isEmpty(m)) {
|
||||
return m;
|
||||
}
|
||||
return m.replaceAll("<sb>", Const.EMPTY)
|
||||
.replaceAll("<sb 0>", Const.EMPTY)
|
||||
.replaceAll("<sb 2>", Const.EMPTY)
|
||||
.replaceAll("</sb>", Const.EMPTY)
|
||||
.replaceAll("<sr>", Const.EMPTY)
|
||||
.replaceAll("<sr 0>", Const.EMPTY)
|
||||
.replaceAll("<sr 2>", Const.EMPTY)
|
||||
.replaceAll("</sr>", Const.EMPTY)
|
||||
.replaceAll("<b>", Const.EMPTY)
|
||||
.replaceAll("</b>", Const.EMPTY);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 ip 位置
|
||||
*
|
||||
* @param ip ip
|
||||
* @return ip 位置
|
||||
*/
|
||||
public static String getIpLocation(String ip) {
|
||||
if (ip == null) {
|
||||
return CnConst.UNKNOWN;
|
||||
}
|
||||
Region region;
|
||||
try {
|
||||
region = LocationRegions.getRegion(ip, 3);
|
||||
} catch (Exception e) {
|
||||
return CnConst.UNKNOWN;
|
||||
}
|
||||
if (region != null) {
|
||||
String net = region.getNet();
|
||||
String province = region.getProvince();
|
||||
if (net.equals(CnConst.INTRANET_IP)) {
|
||||
return net;
|
||||
}
|
||||
if (province.equals(CnConst.UNKNOWN)) {
|
||||
return province;
|
||||
}
|
||||
StringBuilder location = new StringBuilder()
|
||||
.append(region.getCountry())
|
||||
.append(Const.DASHED)
|
||||
.append(province)
|
||||
.append(Const.DASHED)
|
||||
.append(region.getCity());
|
||||
location.append(" (").append(net).append(')');
|
||||
return location.toString();
|
||||
}
|
||||
return CnConst.UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换控制字符 unicode
|
||||
*
|
||||
* @param str str
|
||||
* @return unicode
|
||||
*/
|
||||
public static String convertControlUnicode(String str) {
|
||||
char[] chars = str.toCharArray();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (char c : chars) {
|
||||
if (c < 32 || c == 34 || c == 92 || c == 127) {
|
||||
sb.append("\\u00");
|
||||
int code = (c & 0xFF);
|
||||
String tmp = Integer.toHexString(code);
|
||||
if (tmp.length() == 1) {
|
||||
sb.append("0");
|
||||
}
|
||||
sb.append(tmp);
|
||||
} else {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
package cn.orionsec.ops.utils;
|
||||
|
||||
import cn.orionsec.kit.lang.define.wrapper.HttpWrapper;
|
||||
import cn.orionsec.kit.lang.utils.Arrays1;
|
||||
import cn.orionsec.kit.lang.utils.Exceptions;
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.kit.lang.utils.io.Files1;
|
||||
import cn.orionsec.ops.constant.Const;
|
||||
import cn.orionsec.ops.constant.MessageConst;
|
||||
import cn.orionsec.ops.constant.system.SystemEnvAttr;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class Valid extends cn.orionsec.kit.lang.utils.Valid {
|
||||
|
||||
public static <T> T notNull(T object) {
|
||||
return notNull(object, MessageConst.ABSENT_PARAM);
|
||||
}
|
||||
|
||||
public static String notBlank(String s) {
|
||||
return notBlank(s, MessageConst.ABSENT_PARAM);
|
||||
}
|
||||
|
||||
public static <T extends Collection<?>> T notEmpty(T object) {
|
||||
return notEmpty(object, MessageConst.ABSENT_PARAM);
|
||||
}
|
||||
|
||||
public static void eq(Object o1, Object o2) {
|
||||
eq(o1, o2, MessageConst.INVALID_PARAM);
|
||||
}
|
||||
|
||||
public static void allNotNull(Object... objects) {
|
||||
if (objects != null) {
|
||||
for (Object t : objects) {
|
||||
notNull(t, MessageConst.ABSENT_PARAM);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void allNotBlank(String... ss) {
|
||||
if (ss != null) {
|
||||
for (String s : ss) {
|
||||
notBlank(s, MessageConst.ABSENT_PARAM);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isTrue(boolean s) {
|
||||
return isTrue(s, MessageConst.INVALID_PARAM);
|
||||
}
|
||||
|
||||
public static boolean isFalse(boolean s) {
|
||||
return isFalse(s, MessageConst.INVALID_PARAM);
|
||||
}
|
||||
|
||||
public static <T extends Comparable<T>> T gte(T t1, T t2) {
|
||||
return gte(t1, t2, MessageConst.INVALID_PARAM);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <T> T in(T t, T... ts) {
|
||||
notNull(t);
|
||||
notEmpty(ts);
|
||||
isTrue(Arrays1.contains(ts, t), MessageConst.INVALID_PARAM);
|
||||
return t;
|
||||
}
|
||||
|
||||
public static void isSafe(boolean s) {
|
||||
isTrue(s, MessageConst.UNSAFE_OPERATOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查路径是否合法化 即不包含 ./ ../
|
||||
*
|
||||
* @param path path
|
||||
*/
|
||||
public static void checkNormalize(String path) {
|
||||
Valid.notBlank(path);
|
||||
Valid.isTrue(Files1.isNormalize(path), MessageConst.PATH_NOT_NORMALIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否超过文件上传阈值
|
||||
*
|
||||
* @param size size
|
||||
*/
|
||||
public static void checkUploadSize(Long size) {
|
||||
Valid.notNull(size);
|
||||
String uploadThreshold = SystemEnvAttr.SFTP_UPLOAD_THRESHOLD.getValue();
|
||||
if (size / Const.BUFFER_KB_1 / Const.BUFFER_KB_1 > Long.parseLong(uploadThreshold)) {
|
||||
throw Exceptions.argument(Strings.format(MessageConst.UPLOAD_TOO_LARGE, uploadThreshold, Files1.getSize(size)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查 api 调用是否成功
|
||||
*
|
||||
* @param wrapper wrapper
|
||||
* @param <T> T
|
||||
* @return value
|
||||
*/
|
||||
public static <T> T api(HttpWrapper<T> wrapper) {
|
||||
if (wrapper.isOk()) {
|
||||
return wrapper.getData();
|
||||
} else {
|
||||
throw Exceptions.httpRequest(null, String.valueOf(wrapper.getData()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
package cn.orionsec.ops.utils;
|
||||
|
||||
import cn.orionsec.kit.lang.utils.Arrays1;
|
||||
import cn.orionsec.kit.lang.utils.Strings;
|
||||
import cn.orionsec.kit.lang.utils.codec.Base62s;
|
||||
import cn.orionsec.kit.lang.utils.crypto.Signatures;
|
||||
import cn.orionsec.kit.lang.utils.crypto.enums.PaddingMode;
|
||||
import cn.orionsec.kit.lang.utils.crypto.enums.WorkingMode;
|
||||
import cn.orionsec.kit.lang.utils.crypto.symmetric.EcbSymmetric;
|
||||
import cn.orionsec.kit.lang.utils.crypto.symmetric.SymmetricBuilder;
|
||||
import cn.orionsec.ops.constant.PropertiesConst;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
|
||||
public class ValueMix {
|
||||
|
||||
private static final EcbSymmetric ECB = SymmetricBuilder.aes()
|
||||
.workingMode(WorkingMode.ECB)
|
||||
.paddingMode(PaddingMode.PKCS5_PADDING)
|
||||
.generatorSecretKey(PropertiesConst.VALUE_MIX_SECRET_KEY)
|
||||
.buildEcb();
|
||||
|
||||
private ValueMix() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 加密
|
||||
*
|
||||
* @param value 明文
|
||||
* @return 密文
|
||||
*/
|
||||
public static String encrypt(String value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return ValueMix.ECB.encryptAsString(value);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 加密
|
||||
*
|
||||
* @param value 明文
|
||||
* @param key key
|
||||
* @return 密文
|
||||
*/
|
||||
public static String encrypt(String value, String key) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return SymmetricBuilder.aes()
|
||||
.workingMode(WorkingMode.ECB)
|
||||
.paddingMode(PaddingMode.PKCS5_PADDING)
|
||||
.generatorSecretKey(key)
|
||||
.buildEcb()
|
||||
.encryptAsString(value);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解密
|
||||
*
|
||||
* @param value 密文
|
||||
* @return 明文
|
||||
*/
|
||||
public static String decrypt(String value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return ECB.decryptAsString(value);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解密
|
||||
*
|
||||
* @param value 密文
|
||||
* @param key key
|
||||
* @return 明文
|
||||
*/
|
||||
public static String decrypt(String value, String key) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return SymmetricBuilder.aes()
|
||||
.workingMode(WorkingMode.ECB)
|
||||
.paddingMode(PaddingMode.PKCS5_PADDING)
|
||||
.generatorSecretKey(key)
|
||||
.buildEcb()
|
||||
.decryptAsString(value);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 明文 -> ecb -> base62 -> 密文
|
||||
*
|
||||
* @param value value
|
||||
* @param key key
|
||||
* @return 密文
|
||||
*/
|
||||
public static String base62ecbEnc(String value, String key) {
|
||||
return Optional.ofNullable(value)
|
||||
.map(v -> encrypt(value, key))
|
||||
.map(Base62s::encode)
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 密文 -> base62 -> ecb -> 明文
|
||||
*
|
||||
* @param value value
|
||||
* @param key key
|
||||
* @return 明文
|
||||
*/
|
||||
public static String base62ecbDec(String value, String key) {
|
||||
return Optional.ofNullable(value)
|
||||
.map(Base62s::decode)
|
||||
.map(v -> decrypt(v, key))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 密码签名
|
||||
*
|
||||
* @param password password
|
||||
* @param salt 盐
|
||||
* @return 密文
|
||||
*/
|
||||
public static String encPassword(String password, String salt) {
|
||||
return Signatures.md5(password, salt, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* 密码验签
|
||||
*
|
||||
* @param password password
|
||||
* @param salt salt
|
||||
* @param sign 密码签名
|
||||
* @return 是否正确
|
||||
*/
|
||||
public static boolean validPassword(String password, String salt, String sign) {
|
||||
return sign.equals(Signatures.md5(password, salt, 3));
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建登录token
|
||||
*
|
||||
* @param uid uid
|
||||
* @param timestamp 时间戳
|
||||
* @return token
|
||||
*/
|
||||
public static String createLoginToken(Long uid, Long timestamp) {
|
||||
return ValueMix.base62ecbEnc(uid + "_" + timestamp, PropertiesConst.VALUE_MIX_SECRET_KEY);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查loginToken是否合法
|
||||
*
|
||||
* @param token token
|
||||
* @return true合法
|
||||
*/
|
||||
public static boolean validLoginToken(String token) {
|
||||
return ValueMix.base62ecbDec(token, PropertiesConst.VALUE_MIX_SECRET_KEY) != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取loginToken的uid
|
||||
*
|
||||
* @param token token
|
||||
* @return uid
|
||||
*/
|
||||
public static Long getLoginTokenUserId(String token) {
|
||||
return Optional.ofNullable(ValueMix.base62ecbDec(token, PropertiesConst.VALUE_MIX_SECRET_KEY))
|
||||
.map(s -> s.split("_"))
|
||||
.map(s -> s[0])
|
||||
.filter(Strings::isInteger)
|
||||
.map(Long::valueOf)
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取loginToken的信息
|
||||
*
|
||||
* @param token token
|
||||
* @return [uid, loginTimestamp]
|
||||
*/
|
||||
public static Long[] getLoginTokenInfo(String token) {
|
||||
return Optional.ofNullable(ValueMix.base62ecbDec(token, PropertiesConst.VALUE_MIX_SECRET_KEY))
|
||||
.map(s -> s.split("_"))
|
||||
.filter(s -> Arrays.stream(s).allMatch(Strings::isInteger))
|
||||
.map(s -> Arrays1.mapper(s, Long[]::new, Long::valueOf))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
package cn.orionsec.ops.constant.event;
|
||||
|
||||
import cn.orionsec.kit.lang.define.StopWatch;
|
||||
import cn.orionsec.kit.lang.utils.io.FileReaders;
|
||||
import cn.orionsec.kit.lang.utils.io.FileWriters;
|
||||
import cn.orionsec.kit.lang.utils.io.Files1;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
|
||||
public class AddLicenseHeader {
|
||||
|
||||
private static final String LICENSE = "/*\n" +
|
||||
" * Copyright (c) 2021 - present Jiahang Li, All rights reserved.\n" +
|
||||
" *\n" +
|
||||
" * https://ops.orionsec.cn\n" +
|
||||
" *\n" +
|
||||
" * Members:\n" +
|
||||
" * Jiahang Li - ljh1553488six@139.com - author\n" +
|
||||
" *\n" +
|
||||
" * Licensed under the Apache License, Version 2.0 (the \"License\");\n" +
|
||||
" * you may not use this file except in compliance with the License.\n" +
|
||||
" * You may obtain a copy of the License at\n" +
|
||||
" *\n" +
|
||||
" * http://www.apache.org/licenses/LICENSE-2.0\n" +
|
||||
" *\n" +
|
||||
" * Unless required by applicable law or agreed to in writing, software\n" +
|
||||
" * distributed under the License is distributed on an \"AS IS\" BASIS,\n" +
|
||||
" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" +
|
||||
" * See the License for the specific language governing permissions and\n" +
|
||||
" * limitations under the License.\n" +
|
||||
" */";
|
||||
|
||||
private static final String PATH = new File("").getAbsolutePath();
|
||||
|
||||
public static void main(String[] args) {
|
||||
StopWatch sw = StopWatch.begin();
|
||||
// 扫描文件
|
||||
List<File> files = Files1.listFilesFilter(PATH, file -> file.isFile()
|
||||
&& (file.getName().endsWith(".java") || file.getName().endsWith(".java.vm"))
|
||||
&& !file.getAbsolutePath().contains("generated-sources")
|
||||
&& !file.getAbsolutePath().contains("node_modules"), true, false);
|
||||
sw.tag("list");
|
||||
// 添加头
|
||||
files.forEach(AddLicenseHeader::addLicenseToFile);
|
||||
sw.tag(" add");
|
||||
sw.stop();
|
||||
System.out.println();
|
||||
System.out.println(sw);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加 license
|
||||
*
|
||||
* @param file file
|
||||
*/
|
||||
private static void addLicenseToFile(File file) {
|
||||
String path = file.getAbsolutePath().substring(PATH.length());
|
||||
try {
|
||||
String line = FileReaders.readLine(file);
|
||||
if (line != null && line.trim().equals("/*")) {
|
||||
System.out.println("Exists " + path);
|
||||
return;
|
||||
}
|
||||
// 读取原始文件内容
|
||||
byte[] bytes = FileReaders.readAllBytesFast(file);
|
||||
// 在头部添加许可证
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
out.write(LICENSE.getBytes(StandardCharsets.UTF_8));
|
||||
out.write('\n');
|
||||
out.write(new String(bytes).replaceAll("\r\n", "\n").getBytes(StandardCharsets.UTF_8));
|
||||
// 写入
|
||||
FileWriters.writeFast(file, out.toByteArray());
|
||||
System.out.println("Added " + path);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed " + path);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package cn.orionsec.ops.constant.event;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import cn.orionsec.kit.lang.utils.collect.Maps;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
public class EventClassifyTest {
|
||||
|
||||
@Test
|
||||
public void generatorEnumJson() {
|
||||
EventClassify[] values = EventClassify.values();
|
||||
LinkedHashMap<String, EventClassifyJson> map = Maps.newLinkedMap();
|
||||
for (EventClassify value : values) {
|
||||
map.put(value.name(), new EventClassifyJson(value.getClassify(), value.getLabel()));
|
||||
}
|
||||
System.out.println(JSONArray.toJSONString(map, SerializerFeature.PrettyFormat, SerializerFeature.MapSortField));
|
||||
}
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
static class EventClassifyJson {
|
||||
|
||||
@JSONField(ordinal = 0)
|
||||
private Integer value;
|
||||
|
||||
@JSONField(ordinal = 1)
|
||||
private String label;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package cn.orionsec.ops.constant.event;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import cn.orionsec.kit.lang.utils.collect.Maps;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
public class EventTypeTest {
|
||||
|
||||
@Test
|
||||
public void generatorEnumJson() {
|
||||
EventType[] values = EventType.values();
|
||||
LinkedHashMap<String, EventTypeTest.EventTypeJson> map = Maps.newLinkedMap();
|
||||
for (EventType value : values) {
|
||||
map.put(value.name(), new EventTypeTest.EventTypeJson(value.getType(), value.getLabel(), value.getClassify().getClassify()));
|
||||
}
|
||||
System.out.println(JSONArray.toJSONString(map, SerializerFeature.PrettyFormat, SerializerFeature.MapSortField));
|
||||
}
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
static class EventTypeJson {
|
||||
|
||||
@JSONField(ordinal = 0)
|
||||
private Integer value;
|
||||
|
||||
@JSONField(ordinal = 1)
|
||||
private String label;
|
||||
|
||||
@JSONField(ordinal = 2)
|
||||
private Integer classify;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
package cn.orionsec.ops.constant.event;
|
||||
|
||||
import cn.orionsec.kit.lang.utils.io.FileReaders;
|
||||
import cn.orionsec.kit.lang.utils.io.FileWriters;
|
||||
import cn.orionsec.kit.lang.utils.io.Files1;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class ReplaceVersion {
|
||||
|
||||
private static final String TARGET_VERSION = "1.3.1";
|
||||
|
||||
private static final String REPLACE_VERSION = "1.3.2";
|
||||
|
||||
private static final String PATH = new File("").getAbsolutePath();
|
||||
|
||||
private static final String[] DOCKER_FILES = new String[]{
|
||||
"docker/push.sh",
|
||||
"docker/adminer/build.sh",
|
||||
"docker/adminer/build.sh",
|
||||
"docker/mysql/build.sh",
|
||||
"docker/redis/build.sh",
|
||||
"docker/service/build.sh",
|
||||
"docker-compose.yml",
|
||||
};
|
||||
|
||||
private static final String[] POM_FILES = new String[]{
|
||||
"orion-ops-api/pom.xml",
|
||||
"orion-ops-api/orion-ops-common/pom.xml",
|
||||
"orion-ops-api/orion-ops-dao/pom.xml",
|
||||
"orion-ops-api/orion-ops-data/pom.xml",
|
||||
"orion-ops-api/orion-ops-mapping/pom.xml",
|
||||
"orion-ops-api/orion-ops-model/pom.xml",
|
||||
"orion-ops-api/orion-ops-runner/pom.xml",
|
||||
"orion-ops-api/orion-ops-service/pom.xml",
|
||||
"orion-ops-api/orion-ops-web/pom.xml",
|
||||
};
|
||||
|
||||
private static final String APPLICATION_PROP_FILE = "orion-ops-api/orion-ops-web/src/main/resources/application.properties";
|
||||
|
||||
private static final String PACKAGE_JSON_FILE = "orion-ops-vue/package.json";
|
||||
|
||||
public static void main(String[] args) {
|
||||
replaceDockerFiles();
|
||||
replacePomFiles();
|
||||
replaceApplicationProp();
|
||||
replacePackageJson();
|
||||
}
|
||||
|
||||
/**
|
||||
* 替换 docker 文件
|
||||
*/
|
||||
private static void replaceDockerFiles() {
|
||||
for (String file : DOCKER_FILES) {
|
||||
readAndWrite(file, s -> s.replaceAll(TARGET_VERSION, REPLACE_VERSION));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 替换 pom 文件
|
||||
*/
|
||||
private static void replacePomFiles() {
|
||||
for (String file : POM_FILES) {
|
||||
readAndWrite(file, s -> s.replaceAll("<version>" + TARGET_VERSION + "</version>", "<version>" + REPLACE_VERSION + "</version>"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 替换 application.properties 文件
|
||||
*/
|
||||
private static void replaceApplicationProp() {
|
||||
readAndWrite(APPLICATION_PROP_FILE, s -> s.replaceAll("app.version=" + TARGET_VERSION, "app.version=" + REPLACE_VERSION));
|
||||
}
|
||||
|
||||
/**
|
||||
* 替换 package.json 文件
|
||||
*/
|
||||
private static void replacePackageJson() {
|
||||
readAndWrite(PACKAGE_JSON_FILE, s -> s.replaceAll("\"version\": \"" + TARGET_VERSION + "\"", "\"version\": \"" + REPLACE_VERSION + "\""));
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取并且写入
|
||||
*
|
||||
* @param path path
|
||||
* @param mapping mapping
|
||||
*/
|
||||
private static void readAndWrite(String path, Function<String, String> mapping) {
|
||||
String filePath = Files1.getPath(PATH, path);
|
||||
try {
|
||||
// 读取文件内容
|
||||
byte[] bytes = FileReaders.readAllBytesFast(filePath);
|
||||
// 写入文件内容
|
||||
FileWriters.writeFast(filePath, mapping.apply(new String(bytes)).getBytes(StandardCharsets.UTF_8));
|
||||
System.out.println("OK: " + path);
|
||||
} catch (Exception e) {
|
||||
System.err.println("ERR: " + path);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
68
orion-ops-api/orion-ops-dao/pom.xml
Normal file
68
orion-ops-api/orion-ops-dao/pom.xml
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<groupId>cn.orionsec.ops</groupId>
|
||||
<artifactId>orion-ops-api</artifactId>
|
||||
<version>1.3.1</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>orion-ops-dao</artifactId>
|
||||
<name>orion-ops-dao</name>
|
||||
|
||||
<dependencies>
|
||||
<!-- lombok -->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- swagger -->
|
||||
<dependency>
|
||||
<groupId>io.springfox</groupId>
|
||||
<artifactId>springfox-swagger2</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- aspectj -->
|
||||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
<artifactId>aspectjweaver</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- mybatis plus -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- mybatis plus -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-generator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.velocity</groupId>
|
||||
<artifactId>velocity-engine-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- mysql -->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- orion-kit -->
|
||||
<dependency>
|
||||
<groupId>cn.orionsec.kit</groupId>
|
||||
<artifactId>orion-all</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,9 @@
|
||||
package cn.orionsec.ops.dao;
|
||||
|
||||
import cn.orionsec.ops.entity.domain.AlarmGroupDO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
|
||||
public interface AlarmGroupDAO extends BaseMapper<AlarmGroupDO> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package cn.orionsec.ops.dao;
|
||||
|
||||
import cn.orionsec.ops.entity.domain.AlarmGroupNotifyDO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
|
||||
public interface AlarmGroupNotifyDAO extends BaseMapper<AlarmGroupNotifyDO> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package cn.orionsec.ops.dao;
|
||||
|
||||
import cn.orionsec.ops.entity.domain.AlarmGroupUserDO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
public interface AlarmGroupUserDAO extends BaseMapper<AlarmGroupUserDO> {
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user