diff --git a/docker-compose.yml b/docker-compose.yml
index be79e6a6..28984ec5 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
version: '3.3'
services:
orion-ops-pro:
- image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-ops-pro:1.0.4
+ image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-ops-pro:1.0.5
ports:
- 1081:80
environment:
diff --git a/docker/orion-ops-pro/build.sh b/docker/orion-ops-pro/build.sh
index 33ce7019..221d537d 100644
--- a/docker/orion-ops-pro/build.sh
+++ b/docker/orion-ops-pro/build.sh
@@ -1,3 +1,3 @@
mv ../../orion-ops-launch/target/orion-ops-launch.jar ./
mv ../../orion-ops-ui/dist ./dist
-docker build -t orion-ops-pro:1.0.4 .
+docker build -t orion-ops-pro:1.0.5 .
diff --git a/docs/DISCLAIMER.md b/docs/DISCLAIMER.md
index 59aca48f..6ff544f8 100644
--- a/docs/DISCLAIMER.md
+++ b/docs/DISCLAIMER.md
@@ -14,4 +14,4 @@
7. 任何单位或个人不得在未经本人书面授权的情况下对本项目本身申请相关的知识产权。
8. 如果本声明的任何部分被认为无效或不可执行,则该部分将被解释为反映本人的初衷,其余部分仍具有完全效力。不可执行的部分声明,并不构成我们放弃执行该声明的权利。
9. 本人有权随时对本声明条款及附件内容进行单方面的变更,并以消息推送、网页公告等方式予以公布,公布后立即自动生效,无需另行单独通知;若您在本声明内容公告变更后继续使用的,表示您已充分阅读、理解并接受修改后的声明内容。
-10. 本人对本声明拥有最终解释权。
+10. 本人保留对本声明的最终解释权。
diff --git a/docs/README.md b/docs/README.md
index 6f271ea7..077e072f 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -3,8 +3,7 @@
`orion-ops-pro`
-是一款现代化、高颜值的一站式智能运维管理平台,集资产管理、资产授权、批量执行、计划任务、Web终端、WebSftp、角色管理、系统管理等功能于一体,致力于简化运维团队的治理工作。它是基于 `orion-ops`
-的产品思路进行重构,技术架构升级,并优化了交互逻辑,让操作更快捷更友好。
+是一款现代化、高颜值的一站式智能运维管理平台,集资产管理、资产授权、批量执行、计划任务、WebShell、WebSftp、角色管理、系统管理等功能于一体,致力于简化运维团队的治理工作。
+当前版本: **1.0.5**
-当前版本: **1.0.4**
-github: https://github.com/lijiahangmax/orion-ops-pro
-gitee: https://gitee.com/lijiahangmax/orion-ops-pro
-文档: https://lijiahangmax.gitee.io/orion-ops-pro/#/
-demo: http://101.43.254.243:1081/
+**github:** https://github.com/lijiahangmax/orion-ops-pro
+**gitee:** https://gitee.com/lijiahangmax/orion-ops-pro
+**文档:** https://lijiahangmax.gitee.io/orion-ops-pro/#/
+**demo:** http://101.43.254.243:1081/
演示账号: `admin`
演示密码: `admin`
-⭐ 体验后可以点一下 `star` 这对我很重要
+⭐ 体验后可以点一下 `star` 这对我很重要!
+🌈 如果本项目对你有帮助请帮忙推广一下 让更多的人知道此项目!
📞 合作/功能定制请联系底部 备注: '合作'
## 特性
-* 易用便捷: 极简配置, 开箱即用, 支持 Docker 部署方式。
-* 资产管理: 支持灵活配置主机分组, 实现对主机、秘钥和身份的统一管理。
-* 资产授权: 可将资产数据授权给指定角色和用户, 确保数据安全性。
-* 权限控制: 全面管理用户角色, 支持动态菜单配置和强制下线等功能。
-* 在线终端: 提供便捷的在线 Web 终端服务, 支持快捷命令、自定义快捷键和主题风格。
-* 文件管理: 实现远程主机大文件的批量上传、下载和在线编辑等操作。
-* 批量操作: 支持远程主机批量执行 shell 命令。
-* 计划任务: 支持配置 cron 表达式, 定时执行主机 shell 命令。
-* 操作日志: 记录用户操作日志,确保操作可追溯, 提高系统安全性。
-* 可扩展性: 前后端代码规范统一、代码质量高、健壮且易于阅读和扩展。
+* **快速稳定**: 使用全新的系统架构, 提高系统性能以及稳定性。
+* **交互友好**: 对与用户的交互进行了细致化的打磨, 操作更加方便快捷。
+* **资产管理**: 支持对资产进行分组, 实现对主机、秘钥和身份的统一管理和授权。
+* **权限控制**: 全面管理用户角色, 支持动态菜单配置和强制下线等功能。
+* **在线终端**: 提供便捷的在线 Web 终端服务, 支持快捷命令、自定义快捷键和主题风格。
+* **文件管理**: 实现远程主机大文件的批量上传、下载和在线编辑等操作。
+* **批量操作**: 支持远程主机批量执行主机命令。
+* **计划任务**: 支持配置 cron 表达式, 定时执行主机命令。
+* **操作审计**: 记录用户操作日志,确保操作可追溯, 提高系统安全性。
## 快速开始
-docker安装: https://lijiahangmax.gitee.io/orion-ops-pro/#/quickstart/docker-install
-安装文档: https://lijiahangmax.gitee.io/orion-ops-pro/#/quickstart/install
-开发文档: https://lijiahangmax.gitee.io/orion-ops-pro/#/advance/dev
-操作手册: https://lijiahangmax.gitee.io/orion-ops-pro/#/operator/asset
-常见问题: https://lijiahangmax.gitee.io/orion-ops-pro/#/quickstart/faq
-roadmap: https://lijiahangmax.gitee.io/orion-ops-pro/#/about/roadmap
+* [docker安装](https://lijiahangmax.gitee.io/orion-ops-pro/#/quickstart/docker-install)
+* [普通安装](https://lijiahangmax.gitee.io/orion-ops-pro/#/quickstart/install)
+* [更新日志](https://lijiahangmax.gitee.io/orion-ops-pro/#/about/change-log)
+* [操作手册](https://lijiahangmax.gitee.io/orion-ops-pro/#/operator/asset)
+* [常见问题](https://lijiahangmax.gitee.io/orion-ops-pro/#/quickstart/faq)
## 技术栈
@@ -71,25 +68,15 @@ roadmap: https://lijiahangmax.gitee.io/orion-ops-pro/#/about/roadmap
* Vue3
* Arco Design
-## 功能预览
-
-> 工作台
-
-
-
-> 资产管理
-
-
-
+## 主要功能预览
> 主机终端
+

-
+


-
-
> 批量执行
@@ -101,19 +88,12 @@ roadmap: https://lijiahangmax.gitee.io/orion-ops-pro/#/about/roadmap


-
> 用户管理
-


-> 系统管理
-
-
-
-
## 联系我
diff --git a/docs/_coverpage.md b/docs/_coverpage.md
index 2435784f..6e1bdafe 100644
--- a/docs/_coverpage.md
+++ b/docs/_coverpage.md
@@ -1,4 +1,4 @@
-# orion-ops-pro
1.0.4
+# orion-ops-pro
1.0.5
> 一款开箱即用的运维平台。
diff --git a/docs/about/change-log.md b/docs/about/change-log.md
index 9ce8c8b5..0a958145 100644
--- a/docs/about/change-log.md
+++ b/docs/about/change-log.md
@@ -1,6 +1,32 @@
> 版本号严格遵循 Semver 规范。
-⚡ 注意: 应用不支持跨版本升级, 可以进行多次升级
+* ⚡ **sql 脚本可以在 adminer 中执行。**
+* ⚡ **应用不支持跨版本升级, 可以进行多次升级。**
+
+## v1.0.5
+
+`2024-04-22` `release`
+
+* 🐞 修复 用户列表用户名显示错误
+* 🐞 修复 主机分组页面无法编辑的问题
+* 🐞 修复 资产授权时提示数据发生变更的问题
+* 🐞 修复 删除资产时授权记录未删除的问题
+* 🐞 修复 命令执行权限控制失效的问题
+* 🌈 新增 定时删除未引用的 `tag`
+* 🌈 新增 执行命令时可使用脚本文件执行
+* 🌈 新增 主机身份添加类型字段
+* 🔨 优化 文件传输列表进度显示
+* 🔨 优化 命令执行日志持续时间
+* 🔨 优化 命令执行添加内置参数
+* 🔨 优化 tracker 监听文件可配置 `app.tracker`
+* 🔨 优化 sftp 上传文件重复处理可配置 `app.sftp`
+* 🔨 优化 用户状态调整交互逻辑
+* 🔨 优化 角色状态调整交互逻辑
+* 🔨 优化 优化资产授权交互逻辑
+* 🔨 优化 SFTP 交互逻辑
+* 🧹 删除 用户锁定状态
+
+[如何升级](/update/v1.0.5.md)
## v1.0.4
@@ -69,7 +95,7 @@
* 🌈 新增 主机连接日志删除/清理
* 🌈 新增 用户操作日志日志删除/清理
* 🌈 新增 用户操作日志日志删除/清理
-* 🔨 优化 用户锁定次数/时间可配置
+* 🔨 优化 用户锁定次数/时间可配置 `app.authentication`
[如何升级](/update/v1.0.1.md)
diff --git a/docs/about/roadmap.md b/docs/about/roadmap.md
index 07fcbefc..429fbf22 100644
--- a/docs/about/roadmap.md
+++ b/docs/about/roadmap.md
@@ -1,24 +1,18 @@
-## 功能排期 ⏳
+## 功能排期
-* tracker 使用配置文件
-* 文件重复删除/重命名 可配置
-* 定时删除未引用的 tag
-* 管理员也需要自行授权资产
-* 使用文件执行命令
-* 主机身份类型
-* 文件夹书签
+* 默认主机
* 批量上传
-* 优化文件传输列表进度显示
-* 终端断开连接后回车重新连接
+* 文件夹书签
* 站内消息
* 终端背景图片
* 资产授权 UI 改版
* RDP 远程桌面
* 接入 config 后端动态配置
* 文档中巡检模板
-* 批量执行 模板 定时任务 配置是否使用文件执行
+* 导入快捷命令
+* 导入命令模板
* 使用 vite press 开发文档
-## 已知问题 🐞
+## 已知问题
* 顶部菜单折叠宽度计算有问题 (arco 框架内问题)
diff --git a/docs/assert/img/asset_grant.png b/docs/assert/img/asset_grant.png
deleted file mode 100644
index d3e025d1..00000000
Binary files a/docs/assert/img/asset_grant.png and /dev/null differ
diff --git a/docs/assert/img/asset_host_list.png b/docs/assert/img/asset_host_list.png
deleted file mode 100644
index a647a8b1..00000000
Binary files a/docs/assert/img/asset_host_list.png and /dev/null differ
diff --git a/docs/assert/img/batch_exec.png b/docs/assert/img/batch_exec.png
index 3194ad0f..18bc5899 100644
Binary files a/docs/assert/img/batch_exec.png and b/docs/assert/img/batch_exec.png differ
diff --git a/docs/assert/img/exec_job_edit.png b/docs/assert/img/exec_job_edit.png
index 53f5f392..525c4c20 100644
Binary files a/docs/assert/img/exec_job_edit.png and b/docs/assert/img/exec_job_edit.png differ
diff --git a/docs/assert/img/exec_job_log.png b/docs/assert/img/exec_job_log.png
deleted file mode 100644
index 457f7234..00000000
Binary files a/docs/assert/img/exec_job_log.png and /dev/null differ
diff --git a/docs/assert/img/system_menu.png b/docs/assert/img/system_menu.png
deleted file mode 100644
index 20e3f594..00000000
Binary files a/docs/assert/img/system_menu.png and /dev/null differ
diff --git a/docs/assert/img/terminal_collections.png b/docs/assert/img/terminal_collections.png
new file mode 100644
index 00000000..362df238
Binary files /dev/null and b/docs/assert/img/terminal_collections.png differ
diff --git a/docs/assert/img/terminal_sftp.png b/docs/assert/img/terminal_sftp.png
index ae452f80..eb0f931c 100644
Binary files a/docs/assert/img/terminal_sftp.png and b/docs/assert/img/terminal_sftp.png differ
diff --git a/docs/assert/img/terminal_snippet.png b/docs/assert/img/terminal_snippet.png
deleted file mode 100644
index bb4afee6..00000000
Binary files a/docs/assert/img/terminal_snippet.png and /dev/null differ
diff --git a/docs/assert/img/terminal_ssh.png b/docs/assert/img/terminal_ssh.png
index 1b4661dd..8923cf3f 100644
Binary files a/docs/assert/img/terminal_ssh.png and b/docs/assert/img/terminal_ssh.png differ
diff --git a/docs/assert/img/terminal_transfer.png b/docs/assert/img/terminal_transfer.png
deleted file mode 100644
index be85b875..00000000
Binary files a/docs/assert/img/terminal_transfer.png and /dev/null differ
diff --git a/docs/assert/img/user_grant_menu.png b/docs/assert/img/user_grant_menu.png
deleted file mode 100644
index ac67e722..00000000
Binary files a/docs/assert/img/user_grant_menu.png and /dev/null differ
diff --git a/docs/assert/img/user_list.png b/docs/assert/img/user_list.png
deleted file mode 100644
index 3c040919..00000000
Binary files a/docs/assert/img/user_list.png and /dev/null differ
diff --git a/docs/assert/img/workplace.png b/docs/assert/img/workplace.png
deleted file mode 100644
index 7547b4f5..00000000
Binary files a/docs/assert/img/workplace.png and /dev/null differ
diff --git a/docs/operator/exec.md b/docs/operator/exec.md
index b79178e0..4a474498 100644
--- a/docs/operator/exec.md
+++ b/docs/operator/exec.md
@@ -75,13 +75,19 @@
| source | 执行来源 (BATCH/JOB) |
| sourceId | 执行来源id (JOB特有) |
| seq | 执行序列 (JOB特有) |
+| userId | 执行用户id |
+| username | 执行用户名 |
| execId | 执行记录id |
| hostId | 执行主机id |
| hostName | 执行主机名称 |
| hostCode | 执行主机编码 |
| hostAddress | 执行主机地址 |
-| userId | 执行用户id |
-| username | 执行用户名 |
+| hostUsername | 执行主机用户名 |
+| osType | 执行主机系统版本 |
+| port | SSH 端口 |
+| charset | SSH 编码集 |
+| scriptExec | 是否使用脚本执行 |
+| scriptPath | 脚本文件路径 |
| uuid | 生成任务维度 uuid |
| uuidShort | 生成任务维度 uuid 无 '-' |
| hostUuid | 生成机器维度 uuid |
diff --git a/docs/quickstart/faq.md b/docs/quickstart/faq.md
index 62675c14..c7a21698 100644
--- a/docs/quickstart/faq.md
+++ b/docs/quickstart/faq.md
@@ -6,7 +6,6 @@
> ##### 2. 是否支持维护 Windows 主机?
支持, 但是 Windows 的 ssh 命令兼容性不好, 一切需要执行ssh命令的地方都不友好
-如: 批量执行, 调度任务兼容性非常不友好
> ##### 3. 执行命令时为什么会找不到环境变量?
diff --git a/docs/update/v1.0.5.md b/docs/update/v1.0.5.md
index 12cda601..fb693977 100644
--- a/docs/update/v1.0.5.md
+++ b/docs/update/v1.0.5.md
@@ -3,9 +3,55 @@
> sql 脚本 - DDL
```sql
+ALTER TABLE `system_user`
+MODIFY COLUMN `status` tinyint(0) NULL DEFAULT 1 COMMENT '用户状态 0停用 1启用' AFTER `email`;
+
+ALTER TABLE `host_identity`
+ADD COLUMN `type` char(12) NULL COMMENT '类型' AFTER `name`;
+
+ALTER TABLE `exec_log`
+ADD COLUMN `script_exec` tinyint(0) NULL DEFAULT 0 COMMENT '是否使用脚本执行' AFTER `timeout`;
+
+ALTER TABLE `exec_job`
+ADD COLUMN `script_exec` tinyint(0) NULL DEFAULT 0 COMMENT '是否使用脚本执行' AFTER `timeout`;
+
+ALTER TABLE `exec_template`
+ADD COLUMN `script_exec` tinyint(0) NULL DEFAULT 0 COMMENT '是否使用脚本执行' AFTER `timeout`;
+
+ALTER TABLE `exec_host_log`
+ADD COLUMN `script_path` varchar(512) NULL COMMENT '脚本路径' AFTER `log_path`;
```
> sql 脚本 - DML
```sql
+-- 初始化主机身份类型
+UPDATE `host_identity` SET type = IF(key_id IS NOT NULL, 'KEY', 'PASSWORD');
+-- 重新设置用户状态
+UPDATE `system_user` SET status = 0 WHERE status = 2;
+DELETE FROM `dict_value` WHERE id = 19;
+-- 设置主机配置中的 osType
+UPDATE host_config SET config = JSON_SET(config, '$.osType', 'LINUX') WHERE type = 'ssh' AND deleted = 0;
+-- 重新设置额外数据
+UPDATE data_extra alias
+LEFT JOIN data_extra color
+ON alias.user_id = color.user_id
+AND alias.rel_id = color.rel_id
+AND alias.type= color.type
+AND color.item = 'color'
+SET alias.item = 'label',
+alias.value = JSON_OBJECT('alias', JSON_EXTRACT(alias.value, '$.value'), 'color', JSON_EXTRACT(color.value, '$.color'))
+WHERE alias.item = 'alias';
+-- 删除 color 数据
+DELETE FROM data_extra WHERE type = 'HOST' AND item = 'color';
+-- 初始化字典项
+DELETE FROM dict_key WHERE id >= 37;
+INSERT INTO `dict_key` VALUES (37, 'hostIdentityType', 'STRING', '[{\"name\": \"color\", \"type\": \"COLOR\"}]', '主机身份类型', '2024-04-16 17:15:31', '2024-04-16 17:15:31', '2', '2', 0);
+INSERT INTO `dict_key` VALUES (38, 'hostSshOsType', 'STRING', '[]', '主机系统类型', '2024-04-16 22:18:59', '2024-04-16 22:30:59', '1', '1', 0);
+-- 初始化字典值
+DELETE FROM dict_value WHERE id >= 270;
+INSERT INTO `dict_value` VALUES (270, 37, 'hostIdentityType', 'PASSWORD', '密码', '{\"color\": \"purple\"}', 10, '2024-04-16 17:17:49', '2024-04-16 17:17:49', '2', '2', 0);
+INSERT INTO `dict_value` VALUES (271, 37, 'hostIdentityType', 'KEY', '秘钥', '{\"color\": \"arcoblue\"}', 20, '2024-04-16 17:18:12', '2024-04-16 17:18:12', '2', '2', 0);
+INSERT INTO `dict_value` VALUES (272, 38, 'hostSshOsType', 'LINUX', 'linux', '{}', 10, '2024-04-16 22:19:25', '2024-04-16 22:30:59', '1', '1', 0);
+INSERT INTO `dict_value` VALUES (273, 38, 'hostSshOsType', 'WINDOWS', 'windows', '{}', 20, '2024-04-16 22:19:39', '2024-04-16 22:30:59', '1', '1', 0);
```
diff --git a/docs/update/v1.0.6.md b/docs/update/v1.0.6.md
new file mode 100644
index 00000000..c1a85c78
--- /dev/null
+++ b/docs/update/v1.0.6.md
@@ -0,0 +1,11 @@
+## v1.0.6
+
+> sql 脚本 - DDL
+
+```sql
+```
+
+> sql 脚本 - DML
+
+```sql
+```
diff --git a/orion-ops-dependencies/pom.xml b/orion-ops-dependencies/pom.xml
index 38b9fa09..10ea452d 100644
--- a/orion-ops-dependencies/pom.xml
+++ b/orion-ops-dependencies/pom.xml
@@ -14,7 +14,7 @@
https://github.com/lijiahangmax/orion-ops-pro
- 1.0.4
+ 1.0.5
2.7.17
2.7.15
1.5.0
diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/OrionOpsProConst.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/AppConst.java
similarity index 72%
rename from orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/OrionOpsProConst.java
rename to orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/AppConst.java
index fb62af59..4b1eb8f7 100644
--- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/OrionOpsProConst.java
+++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/AppConst.java
@@ -1,5 +1,7 @@
package com.orion.ops.framework.common.constant;
+import com.orion.lang.constant.OrionConst;
+
/**
* 项目常量
*
@@ -7,12 +9,14 @@ package com.orion.ops.framework.common.constant;
* @version 1.0.0
* @since 2023/6/19 18:56
*/
-public interface OrionOpsProConst {
+public interface AppConst extends OrionConst {
/**
* 同 ${orion.version} 迭代时候需要手动更改
*/
- String VERSION = "1.0.4";
+ String VERSION = "1.0.5";
+
+ String ORION_OPS_PRO = "orion-ops-pro";
String GITHUB = "https://github.com/lijiahangmax/orion-ops-pro";
diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/Const.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/Const.java
index 63e72e96..9aa812d8 100644
--- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/Const.java
+++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/Const.java
@@ -35,6 +35,4 @@ public interface Const extends com.orion.lang.constant.Const, FieldConst, CnCons
String SYSTEM_USERNAME = "system";
- String ERROR_LOG = "error.log";
-
}
diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ErrorCode.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ErrorCode.java
index ab3e9944..06c91935 100644
--- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ErrorCode.java
+++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ErrorCode.java
@@ -38,7 +38,7 @@ public enum ErrorCode implements CodeInfo {
PAYLOAD_TOO_LARGE(413, "请求过大"),
- LOCKED(423, "当前已被锁定"),
+ LOCKED(423, "当前操作已被锁定"),
TOO_MANY_REQUESTS(429, "请求过快"),
@@ -48,11 +48,9 @@ public enum ErrorCode implements CodeInfo {
USER_DISABLED(700, "当前用户已禁用"),
- USER_LOCKED(701, "当前用户已被锁定"),
+ USER_OTHER_DEVICE_LOGIN(701, "该账号于 {} 已在其他设备登录 {}({})"),
- OTHER_DEVICE_LOGIN(702, "该账号于 {} 已在其他设备登录 {}({})"),
-
- SESSION_OFFLINE(703, "该账号于 {} 已被强制下线 {}({})"),
+ USER_OFFLINE(702, "该账号于 {} 已被强制下线 {}({})"),
// -------------------- 自定义 - 通用 --------------------
diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/PathConst.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/PathConst.java
new file mode 100644
index 00000000..05f79581
--- /dev/null
+++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/PathConst.java
@@ -0,0 +1,18 @@
+package com.orion.ops.framework.common.constant;
+
+/**
+ * 路径常量
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/4/17 10:35
+ */
+public interface PathConst {
+
+ String ERROR_LOG = "error.log";
+
+ String EXEC = "exec";
+
+ String SCRIPT = "script";
+
+}
diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/utils/PathUtils.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/utils/PathUtils.java
new file mode 100644
index 00000000..491bdf09
--- /dev/null
+++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/utils/PathUtils.java
@@ -0,0 +1,70 @@
+package com.orion.ops.framework.common.utils;
+
+import com.orion.lang.utils.Objects1;
+import com.orion.ops.framework.common.constant.AppConst;
+import com.orion.ops.framework.common.constant.Const;
+
+/**
+ * 路径工具类
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/4/17 10:28
+ */
+public class PathUtils {
+
+ private PathUtils() {
+ }
+
+ /**
+ * 获取用户根目录
+ *
+ * @param isWindows isWindows
+ * @param username 用户名
+ * @return 用户目录
+ */
+ public static String getHomePath(boolean isWindows, String username) {
+ if (isWindows) {
+ // windows
+ return "C:/Users/" + username;
+ } else {
+ // linux
+ if (Const.ROOT.equals(username)) {
+ return "/" + Const.ROOT;
+ } else {
+ return "/home/" + username;
+ }
+ }
+ }
+
+
+ /**
+ * 获取应用路径
+ *
+ * @param isWindows isWindows
+ * @param username username
+ * @return path
+ */
+ public static String getAppPath(boolean isWindows, String username) {
+ return getHomePath(isWindows, username)
+ + "/" + AppConst.ORION
+ + "/" + AppConst.ORION_OPS_PRO;
+ }
+
+ /**
+ * 构建应用路径
+ *
+ * @param isWindows isWindows,
+ * @param username username
+ * @param paths paths
+ * @return path
+ */
+ public static String buildAppPath(boolean isWindows, String username, Object... paths) {
+ StringBuilder path = new StringBuilder(getAppPath(isWindows, username));
+ for (Object o : paths) {
+ path.append("/").append(Objects1.toString(o));
+ }
+ return path.toString();
+ }
+
+}
diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/core/CodeGeneratorEngine.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/core/CodeGeneratorEngine.java
index 3e6d1506..374a1385 100644
--- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/core/CodeGeneratorEngine.java
+++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/core/CodeGeneratorEngine.java
@@ -10,7 +10,7 @@ import com.orion.lang.utils.io.Files1;
import com.orion.lang.utils.reflect.BeanMap;
import com.orion.lang.utils.reflect.Fields;
import com.orion.ops.framework.common.constant.Const;
-import com.orion.ops.framework.common.constant.OrionOpsProConst;
+import com.orion.ops.framework.common.constant.AppConst;
import com.orion.ops.framework.mybatis.core.generator.template.Table;
import org.jetbrains.annotations.NotNull;
@@ -97,7 +97,7 @@ public class CodeGeneratorEngine extends VelocityTemplateEngine {
// http 注释标识
objectMap.put("httpComment", "###");
// 版本
- objectMap.put("version", OrionOpsProConst.VERSION);
+ objectMap.put("version", AppConst.VERSION);
// api 注释
Map apiComment = new HashMap<>(12);
String comment = tableInfo.getComment();
diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm
index cdc0e27f..e3604341 100644
--- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm
+++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-card-list.vue.vm
@@ -20,8 +20,7 @@
size="small"
ref="formRef"
label-align="right"
- :label-col-props="{ span: 6 }"
- :wrapper-col-props="{ span: 18 }"
+ :auto-label-width="true"
@keyup.enter="() => fetchCardData()">
#foreach($field in ${table.fields})
diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm
index b5e4c98c..e4c51c42 100644
--- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm
+++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm
@@ -8,12 +8,11 @@
:cancel-button-props="{ disabled: loading }"
:on-before-ok="handlerOk"
@cancel="handleClose">
-
+
#foreach($field in ${table.fields})
#if("$field.propertyName" != "id")
diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm
index ebda1055..c69dde87 100644
--- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm
+++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm
@@ -1,6 +1,6 @@
#foreach($field in ${table.fields})
#if("$field.propertyName" != "id")
diff --git a/orion-ops-launch/src/main/resources/application.yaml b/orion-ops-launch/src/main/resources/application.yaml
index 8d9bb076..b4ea3092 100644
--- a/orion-ops-launch/src/main/resources/application.yaml
+++ b/orion-ops-launch/src/main/resources/application.yaml
@@ -84,8 +84,7 @@ spring:
tablePrefix: QRTZ_
misfireThreshold: 60000
clusterCheckinInterval: 5000
- # 打开群集功能
- isClustered: false
+ isClustered: true
#连接池
threadPool:
class: org.quartz.simpl.SimpleThreadPool
@@ -152,6 +151,7 @@ logging:
# 应用配置
app:
+ # 认证配置
authentication:
# 是否允许多端登录
allow-multi-device: true
@@ -163,6 +163,20 @@ app:
login-failed-lock-count: 5
# 登录失败锁定时间 (分)
login-failed-lock-time: 30
+ # tracker 配置
+ tracker:
+ # 加载偏移量 (行)
+ offset: 300
+ # 延迟时间 (ms)
+ delay: 100
+ # 文件未找到等待次数
+ wait-times: 100
+ # sftp 配置
+ sftp:
+ # 上传文件时 文件存在是否备份
+ upload-present-backup: true
+ # 备份文件名称
+ backup-file-name: bk_${fileName}_${timestamp}
# orion framework config
orion:
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.http b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.http
index d7d38ceb..2f0bd511 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.http
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.http
@@ -6,6 +6,7 @@ Authorization: {{token}}
{
"description": 1,
"timeout": 10,
+ "scriptExec": 0,
"command": "echo 这是日志@{{ hostAddress }}\nsleep 1\necho @{{ hostName }}",
"parameterSchema": "[]",
"hostIdList": [1]
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.http b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.http
index b6dc8990..053e4425 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.http
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.http
@@ -6,7 +6,8 @@ Authorization: {{token}}
{
"name": "测试 1",
"expression": "0 */3 * * * ?",
- "timeout": "0",
+ "timeout": 0,
+ "scriptExec": 0,
"command": "echo 123",
"parameterSchema": "[]",
"hostIdList": [1]
@@ -22,7 +23,8 @@ Authorization: {{token}}
"id": 5,
"name": "测试 1",
"expression": "0 */10 * * * ?",
- "timeout": "0",
+ "timeout": 0,
+ "scriptExec": 0,
"command": "echo 123",
"parameterSchema": "[]",
"hostIdList": [
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecTemplateController.http b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecTemplateController.http
index dee08705..018c5cf9 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecTemplateController.http
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecTemplateController.http
@@ -6,7 +6,8 @@ Authorization: {{token}}
{
"name": "",
"command": "",
- "timeout": "",
+ "timeout": 0,
+ "scriptExec": 0,
"parameterSchema": ""
}
@@ -20,7 +21,8 @@ Authorization: {{token}}
"id": "",
"name": "",
"command": "",
- "timeout": "",
+ "timeout": 0,
+ "scriptExec": 0,
"parameterSchema": ""
}
@@ -47,7 +49,8 @@ Authorization: {{token}}
"id": "",
"name": "",
"command": "",
- "timeout": "",
+ "timeout": 0,
+ "scriptExec": 0,
"parameterSchema": ""
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostExtraController.http b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostExtraController.http
index fc70d1fb..0e016d9a 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostExtraController.http
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostExtraController.http
@@ -1,13 +1,3 @@
-### 修改主机别名
-PUT {{baseUrl}}/asset/host-extra/update-alias
-Content-Type: application/json
-Authorization: {{token}}
-
-{
- "id": 1,
- "name": "alias"
-}
-
### 获取主机拓展信息
GET {{baseUrl}}/asset/host-extra/get?hostId=1&item=ssh
Authorization: {{token}}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostExtraController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostExtraController.java
index d4912be5..d3c0c95c 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostExtraController.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostExtraController.java
@@ -3,7 +3,6 @@ package com.orion.ops.module.asset.controller;
import com.orion.ops.framework.log.core.annotation.IgnoreLog;
import com.orion.ops.framework.log.core.enums.IgnoreLogMode;
import com.orion.ops.framework.web.core.annotation.RestWrapper;
-import com.orion.ops.module.asset.entity.request.host.HostAliasUpdateRequest;
import com.orion.ops.module.asset.entity.request.host.HostExtraQueryRequest;
import com.orion.ops.module.asset.entity.request.host.HostExtraUpdateRequest;
import com.orion.ops.module.asset.service.HostExtraService;
@@ -36,12 +35,6 @@ public class HostExtraController {
@Resource
private HostExtraService hostExtraService;
- @PutMapping("/update-alias")
- @Operation(summary = "修改主机别名")
- public Integer updateHostAlias(@Validated @RequestBody HostAliasUpdateRequest request) {
- return hostExtraService.updateHostAlias(request);
- }
-
@IgnoreLog(IgnoreLogMode.RET)
@GetMapping("/get")
@Operation(summary = "获取主机拓展信息")
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/ExecConvert.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/ExecConvert.java
index cea0fb80..f0f79111 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/ExecConvert.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/ExecConvert.java
@@ -1,6 +1,6 @@
package com.orion.ops.module.asset.convert;
-import com.orion.ops.module.asset.entity.request.exec.ExecCommandExecRequest;
+import com.orion.ops.module.asset.entity.dto.ExecCommandExecDTO;
import com.orion.ops.module.asset.entity.request.exec.ExecCommandRequest;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@@ -17,6 +17,6 @@ public interface ExecConvert {
ExecConvert MAPPER = Mappers.getMapper(ExecConvert.class);
- ExecCommandExecRequest to(ExecCommandRequest request);
+ ExecCommandExecDTO to(ExecCommandRequest request);
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/config/AppSftpConfig.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/config/AppSftpConfig.java
new file mode 100644
index 00000000..5815dd55
--- /dev/null
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/config/AppSftpConfig.java
@@ -0,0 +1,34 @@
+package com.orion.ops.module.asset.define.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 应用 sftp 配置
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/4/15 22:00
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "app.sftp")
+public class AppSftpConfig {
+
+ /**
+ * 上传文件时 文件存在是否备份
+ */
+ private Boolean uploadPresentBackup;
+
+ /**
+ * 备份文件名称
+ */
+ private String backupFileName;
+
+ public AppSftpConfig() {
+ this.uploadPresentBackup = true;
+ this.backupFileName = "bk_${fileName}_${timestamp}";
+ }
+
+}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/config/AppTrackerConfig.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/config/AppTrackerConfig.java
new file mode 100644
index 00000000..8118b1f2
--- /dev/null
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/config/AppTrackerConfig.java
@@ -0,0 +1,39 @@
+package com.orion.ops.module.asset.define.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 应用 tracker 配置
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/4/15 22:00
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "app.tracker")
+public class AppTrackerConfig {
+
+ /**
+ * 加载偏移量 (行)
+ */
+ private Integer offset;
+
+ /**
+ * 延迟时间 (ms)
+ */
+ private Integer delay;
+
+ /**
+ * 文件未找到等待次数
+ */
+ private Integer waitTimes;
+
+ public AppTrackerConfig() {
+ this.offset = 300;
+ this.delay = 100;
+ this.waitTimes = 100;
+ }
+}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecTemplateOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecTemplateOperatorType.java
index d03194b3..509cad29 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecTemplateOperatorType.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecTemplateOperatorType.java
@@ -25,9 +25,9 @@ public class ExecTemplateOperatorType extends InitializingOperatorTypes {
@Override
public OperatorType[] types() {
return new OperatorType[]{
- new OperatorType(L, CREATE, "创建执行模板 ${name}"),
- new OperatorType(M, UPDATE, "更新执行模板 ${name}"),
- new OperatorType(H, DELETE, "删除执行模板 ${name}"),
+ new OperatorType(L, CREATE, "创建执行模板 ${name}"),
+ new OperatorType(M, UPDATE, "更新执行模板 ${name}"),
+ new OperatorType(H, DELETE, "删除执行模板 ${name}"),
};
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecHostLogDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecHostLogDO.java
index 1981ac2c..e6e950c5 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecHostLogDO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecHostLogDO.java
@@ -68,6 +68,10 @@ public class ExecHostLogDO extends BaseDO {
@TableField("log_path")
private String logPath;
+ @Schema(description = "脚本路径")
+ @TableField("script_path")
+ private String scriptPath;
+
@Schema(description = "错误信息")
@TableField("error_message")
private String errorMessage;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecJobDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecJobDO.java
index 109a6c9d..2c089959 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecJobDO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecJobDO.java
@@ -46,6 +46,10 @@ public class ExecJobDO extends BaseDO {
@TableField("timeout")
private Integer timeout;
+ @Schema(description = "是否使用脚本执行")
+ @TableField("script_exec")
+ private Integer scriptExec;
+
@Schema(description = "执行命令")
@TableField("command")
private String command;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecLogDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecLogDO.java
index e0a1fc78..7a4239f9 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecLogDO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecLogDO.java
@@ -68,6 +68,10 @@ public class ExecLogDO extends BaseDO {
@TableField("timeout")
private Integer timeout;
+ @Schema(description = "是否使用脚本执行")
+ @TableField("script_exec")
+ private Integer scriptExec;
+
@Schema(description = "执行状态")
@TableField("status")
private String status;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecTemplateDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecTemplateDO.java
index 19b26aec..bf8cd871 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecTemplateDO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecTemplateDO.java
@@ -42,6 +42,10 @@ public class ExecTemplateDO extends BaseDO {
@TableField("timeout")
private Integer timeout;
+ @Schema(description = "是否使用脚本执行")
+ @TableField("script_exec")
+ private Integer scriptExec;
+
@Schema(description = "参数定义")
@TableField("parameter_schema")
private String parameterSchema;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/HostIdentityDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/HostIdentityDO.java
index 900a24ca..f7c340b3 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/HostIdentityDO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/HostIdentityDO.java
@@ -31,6 +31,10 @@ public class HostIdentityDO extends BaseDO {
@TableField("name")
private String name;
+ @Schema(description = "类型")
+ @TableField("type")
+ private String type;
+
@Schema(description = "用户名")
@TableField("username")
private String username;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandExecRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/ExecCommandExecDTO.java
similarity index 81%
rename from orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandExecRequest.java
rename to orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/ExecCommandExecDTO.java
index 5db1a782..ffae7537 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandExecRequest.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/ExecCommandExecDTO.java
@@ -1,4 +1,4 @@
-package com.orion.ops.module.asset.entity.request.exec;
+package com.orion.ops.module.asset.entity.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
@@ -19,8 +19,8 @@ import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
-@Schema(name = "ExecCommandExecRequest", description = "批量执行命令 请求对象")
-public class ExecCommandExecRequest {
+@Schema(name = "ExecCommandExecDTO", description = "批量执行命令对象")
+public class ExecCommandExecDTO {
@Schema(description = "执行用户id")
private Long userId;
@@ -43,6 +43,9 @@ public class ExecCommandExecRequest {
@Schema(description = "超时时间")
private Integer timeout;
+ @Schema(description = "是否使用脚本执行")
+ private Integer scriptExec;
+
@Schema(description = "执行命令")
private String command;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/HostIdentityCacheDTO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/HostIdentityCacheDTO.java
index eccdd7a3..27d2ced3 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/HostIdentityCacheDTO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/HostIdentityCacheDTO.java
@@ -30,6 +30,9 @@ public class HostIdentityCacheDTO implements LongCacheIdModel, Serializable {
@Schema(description = "名称")
private String name;
+ @Schema(description = "类型")
+ private String type;
+
@Schema(description = "用户名")
private String username;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandRequest.java
index 9b5307b5..8401d96d 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandRequest.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecCommandRequest.java
@@ -1,5 +1,7 @@
package com.orion.ops.module.asset.entity.request.exec;
+import com.orion.ops.framework.desensitize.core.annotation.Desensitize;
+import com.orion.ops.framework.desensitize.core.annotation.DesensitizeObject;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@@ -19,6 +21,7 @@ import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
+@DesensitizeObject
@Schema(name = "ExecCommandRequest", description = "批量执行命令 请求对象")
public class ExecCommandRequest {
@@ -30,7 +33,12 @@ public class ExecCommandRequest {
@Schema(description = "超时时间")
private Integer timeout;
+ @NonNull
+ @Schema(description = "是否使用脚本执行")
+ private Integer scriptExec;
+
@NotBlank
+ @Desensitize(toEmpty = true)
@Schema(description = "执行命令")
private String command;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobCreateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobCreateRequest.java
index 0b23b9cd..195b4543 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobCreateRequest.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobCreateRequest.java
@@ -1,10 +1,9 @@
package com.orion.ops.module.asset.entity.request.exec;
+import com.orion.ops.framework.desensitize.core.annotation.Desensitize;
+import com.orion.ops.framework.desensitize.core.annotation.DesensitizeObject;
import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import lombok.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
@@ -24,6 +23,7 @@ import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
+@DesensitizeObject
@Schema(name = "ExecJobCreateRequest", description = "计划任务 创建请求对象")
public class ExecJobCreateRequest implements Serializable {
@@ -43,7 +43,12 @@ public class ExecJobCreateRequest implements Serializable {
@Schema(description = "超时时间")
private Integer timeout;
+ @NonNull
+ @Schema(description = "是否使用脚本执行")
+ private Integer scriptExec;
+
@NotBlank
+ @Desensitize(toEmpty = true)
@Schema(description = "执行命令")
private String command;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobUpdateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobUpdateRequest.java
index eb5c642e..48d404fb 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobUpdateRequest.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobUpdateRequest.java
@@ -1,10 +1,9 @@
package com.orion.ops.module.asset.entity.request.exec;
+import com.orion.ops.framework.desensitize.core.annotation.Desensitize;
+import com.orion.ops.framework.desensitize.core.annotation.DesensitizeObject;
import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import lombok.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
@@ -24,6 +23,7 @@ import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
+@DesensitizeObject
@Schema(name = "ExecJobUpdateRequest", description = "计划任务 更新请求对象")
public class ExecJobUpdateRequest implements Serializable {
@@ -47,7 +47,12 @@ public class ExecJobUpdateRequest implements Serializable {
@Schema(description = "超时时间")
private Integer timeout;
+ @NonNull
+ @Schema(description = "是否使用脚本执行")
+ private Integer scriptExec;
+
@NotBlank
+ @Desensitize(toEmpty = true)
@Schema(description = "执行命令")
private String command;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateCreateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateCreateRequest.java
index f958a1f7..d46b2768 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateCreateRequest.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateCreateRequest.java
@@ -1,5 +1,7 @@
package com.orion.ops.module.asset.entity.request.exec;
+import com.orion.ops.framework.desensitize.core.annotation.Desensitize;
+import com.orion.ops.framework.desensitize.core.annotation.DesensitizeObject;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -22,6 +24,7 @@ import java.io.Serializable;
@Builder
@NoArgsConstructor
@AllArgsConstructor
+@DesensitizeObject
@Schema(name = "ExecTemplateCreateRequest", description = "执行模板 创建请求对象")
public class ExecTemplateCreateRequest implements Serializable {
@@ -33,6 +36,7 @@ public class ExecTemplateCreateRequest implements Serializable {
private String name;
@NotBlank
+ @Desensitize(toEmpty = true)
@Schema(description = "命令")
private String command;
@@ -40,6 +44,10 @@ public class ExecTemplateCreateRequest implements Serializable {
@Schema(description = "超时时间秒 0不超时")
private Integer timeout;
+ @NotNull
+ @Schema(description = "是否使用脚本执行")
+ private Integer scriptExec;
+
@Schema(description = "参数定义")
private String parameterSchema;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateUpdateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateUpdateRequest.java
index 1e69a40d..8d4e78af 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateUpdateRequest.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateUpdateRequest.java
@@ -1,5 +1,7 @@
package com.orion.ops.module.asset.entity.request.exec;
+import com.orion.ops.framework.desensitize.core.annotation.Desensitize;
+import com.orion.ops.framework.desensitize.core.annotation.DesensitizeObject;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -22,6 +24,7 @@ import java.io.Serializable;
@Builder
@NoArgsConstructor
@AllArgsConstructor
+@DesensitizeObject
@Schema(name = "ExecTemplateUpdateRequest", description = "执行模板 更新请求对象")
public class ExecTemplateUpdateRequest implements Serializable {
@@ -38,12 +41,17 @@ public class ExecTemplateUpdateRequest implements Serializable {
@NotBlank
@Schema(description = "命令")
+ @Desensitize(toEmpty = true)
private String command;
@NotNull
@Schema(description = "超时时间秒 0不超时")
private Integer timeout;
+ @NotNull
+ @Schema(description = "是否使用脚本执行")
+ private Integer scriptExec;
+
@Schema(description = "参数定义")
private String parameterSchema;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostAliasUpdateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostAliasUpdateRequest.java
deleted file mode 100644
index f929f814..00000000
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostAliasUpdateRequest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.orion.ops.module.asset.entity.request.host;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
-import java.io.Serializable;
-
-/**
- * 主机别名 更新请求对象
- *
- * @author Jiahang Li
- * @version 1.0.0
- * @since 2023-9-13 14:31
- */
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-@Schema(name = "HostAliasUpdateRequest", description = "主机别名 更新请求对象")
-public class HostAliasUpdateRequest implements Serializable {
-
- @NotNull
- @Schema(description = "id")
- private Long id;
-
- @NotNull
- @Size(max = 32)
- @Schema(description = "别名")
- private String name;
-
-}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityCreateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityCreateRequest.java
index 92e6e771..2e513039 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityCreateRequest.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityCreateRequest.java
@@ -29,6 +29,11 @@ public class HostIdentityCreateRequest implements Serializable {
@Schema(description = "名称")
private String name;
+ @NotBlank
+ @Size(max = 12)
+ @Schema(description = "类型")
+ private String type;
+
@NotBlank
@Size(max = 128)
@Schema(description = "用户名")
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityQueryRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityQueryRequest.java
index 5cba3c0f..0e0cab0e 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityQueryRequest.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityQueryRequest.java
@@ -31,6 +31,10 @@ public class HostIdentityQueryRequest extends PageRequest {
@Schema(description = "名称")
private String name;
+ @Size(max = 12)
+ @Schema(description = "类型")
+ private String type;
+
@Size(max = 128)
@Schema(description = "用户名")
private String username;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityUpdateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityUpdateRequest.java
index 4515beb9..24268622 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityUpdateRequest.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostIdentityUpdateRequest.java
@@ -34,6 +34,11 @@ public class HostIdentityUpdateRequest implements UpdatePasswordAction {
@Schema(description = "名称")
private String name;
+ @NotBlank
+ @Size(max = 12)
+ @Schema(description = "类型")
+ private String type;
+
@NotBlank
@Size(max = 128)
@Schema(description = "用户名")
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecJobVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecJobVO.java
index 42f9d989..bab5ab3e 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecJobVO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecJobVO.java
@@ -38,6 +38,9 @@ public class ExecJobVO implements Serializable {
@Schema(description = "超时时间")
private Integer timeout;
+ @Schema(description = "是否使用脚本执行")
+ private Integer scriptExec;
+
@Schema(description = "执行命令")
private String command;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecLogVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecLogVO.java
index 3d5f8b43..83856679 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecLogVO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecLogVO.java
@@ -50,6 +50,9 @@ public class ExecLogVO implements Serializable {
@Schema(description = "超时时间")
private Integer timeout;
+ @Schema(description = "是否使用脚本执行")
+ private Integer scriptExec;
+
@Schema(description = "执行状态")
private String status;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecTemplateVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecTemplateVO.java
index f1ee8cef..a5d0ed0d 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecTemplateVO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecTemplateVO.java
@@ -37,6 +37,9 @@ public class ExecTemplateVO implements Serializable {
@Schema(description = "超时时间秒 0不超时")
private Integer timeout;
+ @Schema(description = "是否使用脚本执行")
+ private Integer scriptExec;
+
@Schema(description = "参数定义")
private String parameterSchema;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostIdentityVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostIdentityVO.java
index 3889eb11..4fa0db74 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostIdentityVO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostIdentityVO.java
@@ -31,6 +31,9 @@ public class HostIdentityVO implements Serializable {
@Schema(description = "名称")
private String name;
+ @Schema(description = "类型")
+ private String type;
+
@Schema(description = "用户名")
private String username;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostExtraItemEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostExtraItemEnum.java
index 1d89770d..7478650b 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostExtraItemEnum.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostExtraItemEnum.java
@@ -3,9 +3,9 @@ package com.orion.ops.module.asset.enums;
import com.orion.ops.framework.common.handler.data.GenericsDataDefinition;
import com.orion.ops.framework.common.handler.data.model.GenericsDataModel;
import com.orion.ops.framework.common.handler.data.strategy.MapDataStrategy;
-import com.orion.ops.module.asset.handler.host.extra.model.HostColorExtraModel;
+import com.orion.ops.module.asset.handler.host.extra.model.HostLabelExtraModel;
import com.orion.ops.module.asset.handler.host.extra.model.HostSshExtraModel;
-import com.orion.ops.module.asset.handler.host.extra.strategy.HostColorExtraStrategy;
+import com.orion.ops.module.asset.handler.host.extra.strategy.HostLabelExtraStrategy;
import com.orion.ops.module.asset.handler.host.extra.strategy.HostSshExtraStrategy;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -27,9 +27,9 @@ public enum HostExtraItemEnum implements GenericsDataDefinition {
SSH("ssh", HostSshExtraModel.class, HostSshExtraStrategy.class),
/**
- * 颜色额外配置
+ * 标签额外配置
*/
- COLOR("color", HostColorExtraModel.class, HostColorExtraStrategy.class),
+ LABEL("label", HostLabelExtraModel.class, HostLabelExtraStrategy.class),
;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostIdentityTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostIdentityTypeEnum.java
new file mode 100644
index 00000000..d9a884fd
--- /dev/null
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostIdentityTypeEnum.java
@@ -0,0 +1,36 @@
+package com.orion.ops.module.asset.enums;
+
+/**
+ * 主机身份类型
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/9/21 19:01
+ */
+public enum HostIdentityTypeEnum {
+
+ /**
+ * 密码
+ */
+ PASSWORD,
+
+ /**
+ * 秘钥
+ */
+ KEY,
+
+ ;
+
+ public static HostIdentityTypeEnum of(String type) {
+ if (type == null) {
+ return null;
+ }
+ for (HostIdentityTypeEnum value : values()) {
+ if (value.name().equals(type)) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostSshOsTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostSshOsTypeEnum.java
new file mode 100644
index 00000000..c9273989
--- /dev/null
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostSshOsTypeEnum.java
@@ -0,0 +1,44 @@
+package com.orion.ops.module.asset.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 主机系统类型
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/4/16 21:58
+ */
+@Getter
+@AllArgsConstructor
+public enum HostSshOsTypeEnum {
+
+ /**
+ * linux
+ */
+ LINUX(".sh"),
+
+ /**
+ * windows
+ */
+ WINDOWS(".cmd"),
+
+ ;
+
+ private final String scriptSuffix;
+
+ public static HostSshOsTypeEnum of(String type) {
+ if (type == null) {
+ return null;
+ }
+ for (HostSshOsTypeEnum value : values()) {
+ if (value.name().equals(type)) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+
+}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/ScriptExecEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/ScriptExecEnum.java
new file mode 100644
index 00000000..ab075318
--- /dev/null
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/ScriptExecEnum.java
@@ -0,0 +1,54 @@
+package com.orion.ops.module.asset.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 脚本执行枚举
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/4/17 10:17
+ */
+@Getter
+@AllArgsConstructor
+public enum ScriptExecEnum {
+
+ /**
+ * 不使用
+ */
+ DISABLED(0),
+
+ /**
+ * 使用
+ */
+ ENABLED(1),
+
+ ;
+
+ private final Integer value;
+
+ public static ScriptExecEnum of(Integer value) {
+ if (value == null) {
+ return null;
+ }
+ for (ScriptExecEnum val : values()) {
+ if (val.value.equals(value)) {
+ return val;
+ }
+ }
+ return null;
+
+ }
+
+ /**
+ * 检查是否启用
+ *
+ * @param value value
+ * @return 是否启用
+ */
+ public static boolean isEnabled(Integer value) {
+ return ENABLED.value.equals(value);
+ }
+
+}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java
index 9d9c9330..413c13fa 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java
@@ -38,8 +38,14 @@ public class HostSshConfigModel implements GenericsDataModel, UpdatePasswordActi
@NotBlank
@Size(max = 12)
+ @Schema(description = "认证方式")
private String authType;
+ @NotBlank
+ @Size(max = 12)
+ @Schema(description = "系统类型")
+ private String osType;
+
@Schema(description = "密码")
private String password;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java
index 3ad6d3ee..2fdd1533 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java
@@ -12,6 +12,7 @@ import com.orion.ops.framework.common.security.PasswordModifier;
import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.module.asset.dao.HostIdentityDAO;
import com.orion.ops.module.asset.dao.HostKeyDAO;
+import com.orion.ops.module.asset.enums.HostSshOsTypeEnum;
import com.orion.ops.module.asset.enums.HostSshAuthTypeEnum;
import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel;
import org.springframework.stereotype.Component;
@@ -45,6 +46,7 @@ public class HostSshConfigStrategy implements MapDataStrategy hosts;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/dto/ExecCommandHostDTO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/dto/ExecCommandHostDTO.java
index 03f299d4..397b0459 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/dto/ExecCommandHostDTO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/dto/ExecCommandHostDTO.java
@@ -29,10 +29,19 @@ public class ExecCommandHostDTO {
@Schema(description = "日志文件路径")
private String logPath;
+ @Schema(description = "脚本路径")
+ private String scriptPath;
+
@Schema(description = "执行命令")
private String command;
- @Schema(description = "超时时间")
- private Integer timeout;
+ @Schema(description = "命令编码")
+ private String charset;
+
+ @Schema(description = "文件名称编码")
+ private String fileNameCharset;
+
+ @Schema(description = "文件内容编码")
+ private String fileContentCharset;
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecCommandHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecCommandHandler.java
index 137fa8dd..9531aebc 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecCommandHandler.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecCommandHandler.java
@@ -3,16 +3,21 @@ package com.orion.ops.module.asset.handler.host.exec.command.handler;
import com.alibaba.fastjson.JSON;
import com.orion.lang.exception.AuthenticationException;
import com.orion.lang.exception.ConnectionRuntimeException;
+import com.orion.lang.exception.SftpException;
import com.orion.lang.exception.argument.InvalidArgumentException;
import com.orion.lang.support.timeout.TimeoutChecker;
+import com.orion.lang.utils.Booleans;
+import com.orion.lang.utils.Exceptions;
import com.orion.lang.utils.Strings;
import com.orion.lang.utils.io.Streams;
import com.orion.net.host.SessionStore;
+import com.orion.net.host.sftp.SftpExecutor;
import com.orion.net.host.ssh.command.CommandExecutor;
import com.orion.ops.framework.common.file.FileClient;
import com.orion.ops.module.asset.dao.ExecHostLogDAO;
import com.orion.ops.module.asset.entity.domain.ExecHostLogDO;
import com.orion.ops.module.asset.enums.ExecHostStatusEnum;
+import com.orion.ops.module.asset.handler.host.exec.command.dto.ExecCommandDTO;
import com.orion.ops.module.asset.handler.host.exec.command.dto.ExecCommandHostDTO;
import com.orion.ops.module.asset.handler.host.exec.log.manager.ExecLogManager;
import com.orion.ops.module.asset.service.HostTerminalService;
@@ -43,6 +48,8 @@ public class ExecCommandHandler implements IExecCommandHandler {
private final ExecHostLogDAO execHostLogDAO = SpringHolder.getBean(ExecHostLogDAO.class);
+ private final ExecCommandDTO execCommand;
+
private final ExecCommandHostDTO execHostCommand;
private final TimeoutChecker timeoutChecker;
@@ -60,8 +67,11 @@ public class ExecCommandHandler implements IExecCommandHandler {
private volatile boolean interrupted;
- public ExecCommandHandler(ExecCommandHostDTO execHostCommand, TimeoutChecker timeoutChecker) {
+ public ExecCommandHandler(ExecCommandDTO execCommand,
+ ExecCommandHostDTO execHostCommand,
+ TimeoutChecker timeoutChecker) {
this.status = ExecHostStatusEnum.WAITING;
+ this.execCommand = execCommand;
this.execHostCommand = execHostCommand;
this.timeoutChecker = timeoutChecker;
}
@@ -109,15 +119,52 @@ public class ExecCommandHandler implements IExecCommandHandler {
this.logOutputStream = fileClient.getContentOutputStream(execHostCommand.getLogPath());
// 打开会话
this.sessionStore = hostTerminalService.openSessionStore(execHostCommand.getHostId());
- this.executor = sessionStore.getCommandExecutor(Strings.replaceCRLF(execHostCommand.getCommand()));
+ if (Booleans.isTrue(execCommand.getScriptExec())) {
+ // 上传脚本文件
+ this.uploadScriptFile();
+ // 执行脚本文件
+ this.executor = sessionStore.getCommandExecutor(execHostCommand.getScriptPath());
+ } else {
+ // 执行命令
+ byte[] command = Strings.replaceCRLF(execHostCommand.getCommand()).getBytes(execHostCommand.getCharset());
+ this.executor = sessionStore.getCommandExecutor(command);
+ }
// 执行命令
- executor.timeout(execHostCommand.getTimeout(), TimeUnit.SECONDS, timeoutChecker);
+ executor.timeout(execCommand.getTimeout(), TimeUnit.SECONDS, timeoutChecker);
executor.merge();
executor.transfer(logOutputStream);
executor.connect();
executor.exec();
}
+ /**
+ * 上传脚本文件
+ */
+ private void uploadScriptFile() {
+ SftpExecutor sftpExecutor = null;
+ try {
+ // 打开 sftp
+ sftpExecutor = sessionStore.getSftpExecutor(execHostCommand.getFileNameCharset());
+ sftpExecutor.connect();
+ // 必须要以 / 开头
+ String scriptPath = execHostCommand.getScriptPath();
+ if (!scriptPath.startsWith("/")) {
+ scriptPath = "/" + scriptPath;
+ }
+ // 创建文件
+ sftpExecutor.touch(scriptPath);
+ // 写入命令
+ byte[] command = Strings.replaceCRLF(execHostCommand.getCommand()).getBytes(execHostCommand.getFileContentCharset());
+ sftpExecutor.write(scriptPath, command);
+ // 修改权限
+ sftpExecutor.changeMode(scriptPath, 777);
+ } catch (Exception e) {
+ throw Exceptions.sftp(e);
+ } finally {
+ Streams.close(sftpExecutor);
+ }
+ }
+
/**
* 更新状态
*
@@ -199,6 +246,8 @@ public class ExecCommandHandler implements IExecCommandHandler {
message = "连接失败";
} else if (ex instanceof AuthenticationException) {
message = "认证失败";
+ } else if (ex instanceof SftpException) {
+ message = "脚本上传失败";
} else {
message = "执行失败";
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java
index 02150b59..585c2604 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java
@@ -56,7 +56,7 @@ public class ExecTaskHandler implements IExecTaskHandler {
this.updateStatus(ExecStatusEnum.RUNNING);
try {
// 执行命令
- this.runHostCommand(execCommand.getHosts());
+ this.runHostCommand();
// 更新状态-执行完成
log.info("ExecTaskHandler.run completed id: {}", id);
this.updateStatus(ExecStatusEnum.COMPLETED);
@@ -81,23 +81,24 @@ public class ExecTaskHandler implements IExecTaskHandler {
/**
* 执行主机命令
*
- * @param hosts hosts
* @throws Exception Exception
*/
- private void runHostCommand(List hosts) throws Exception {
+ private void runHostCommand() throws Exception {
// 超时检查
if (execCommand.getTimeout() != 0) {
this.timeoutChecker = TimeoutCheckers.create();
AssetThreadPools.TIMEOUT_CHECK.execute(this.timeoutChecker);
}
+ // 执行命令
+ List hosts = execCommand.getHosts();
if (hosts.size() == 1) {
// 单个主机直接执行
- ExecCommandHandler handler = new ExecCommandHandler(hosts.get(0), timeoutChecker);
+ ExecCommandHandler handler = new ExecCommandHandler(execCommand, hosts.get(0), timeoutChecker);
handlers.add(handler);
handler.run();
} else {
hosts.stream()
- .map(s -> new ExecCommandHandler(s, timeoutChecker))
+ .map(s -> new ExecCommandHandler(execCommand, s, timeoutChecker))
.forEach(handlers::add);
// 多个主机异步阻塞执行
Threads.blockRun(handlers, AssetThreadPools.EXEC_HOST);
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/log/constant/LogConst.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/log/constant/LogConst.java
index 14838dbe..0b6e019b 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/log/constant/LogConst.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/log/constant/LogConst.java
@@ -15,10 +15,4 @@ public interface LogConst {
String SEPARATOR = "|";
- int TRACKER_OFFSET_LINE = 200;
-
- int TRACKER_DELAY_MS = 200;
-
- int TRACKER_WAIT_TIMES = 100;
-
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/log/tracker/ExecLogTracker.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/log/tracker/ExecLogTracker.java
index db74d8b8..c7dc891a 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/log/tracker/ExecLogTracker.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/log/tracker/ExecLogTracker.java
@@ -5,8 +5,10 @@ import com.orion.ext.tail.delay.DelayTrackerListener;
import com.orion.ext.tail.mode.FileNotFoundMode;
import com.orion.ext.tail.mode.FileOffsetMode;
import com.orion.ops.framework.websocket.core.utils.WebSockets;
+import com.orion.ops.module.asset.define.config.AppTrackerConfig;
import com.orion.ops.module.asset.entity.dto.ExecHostLogTailDTO;
import com.orion.ops.module.asset.handler.host.exec.log.constant.LogConst;
+import com.orion.spring.SpringHolder;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.WebSocketSession;
@@ -21,6 +23,8 @@ import org.springframework.web.socket.WebSocketSession;
@Slf4j
public class ExecLogTracker implements IExecLogTracker {
+ private static final AppTrackerConfig TRACKER_CONFIG = SpringHolder.getBean(AppTrackerConfig.class);
+
private final WebSocketSession session;
private final ExecHostLogTailDTO config;
@@ -50,9 +54,9 @@ public class ExecLogTracker implements IExecLogTracker {
try {
this.tracker = new DelayTrackerListener(absolutePath, this);
tracker.charset(config.getCharset());
- tracker.delayMillis(LogConst.TRACKER_DELAY_MS);
- tracker.offset(FileOffsetMode.LINE, LogConst.TRACKER_OFFSET_LINE);
- tracker.notFoundMode(FileNotFoundMode.WAIT_COUNT, LogConst.TRACKER_WAIT_TIMES);
+ tracker.delayMillis(TRACKER_CONFIG.getDelay());
+ tracker.offset(FileOffsetMode.LINE, TRACKER_CONFIG.getOffset());
+ tracker.notFoundMode(FileNotFoundMode.WAIT_COUNT, TRACKER_CONFIG.getWaitTimes());
// 开始监听文件
tracker.run();
} catch (Exception e) {
@@ -80,7 +84,7 @@ public class ExecLogTracker implements IExecLogTracker {
@Override
public void close() {
- log.info("ExecLogTracker.close path: {}", absolutePath);
+ log.info("ExecLogTracker.close path: {}, closed: {}", absolutePath, close);
if (close) {
return;
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/model/HostColorExtraModel.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/model/HostLabelExtraModel.java
similarity index 66%
rename from orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/model/HostColorExtraModel.java
rename to orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/model/HostLabelExtraModel.java
index a6212499..86e43189 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/model/HostColorExtraModel.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/model/HostLabelExtraModel.java
@@ -8,7 +8,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
- * 主机拓展信息 - color 模型
+ * 主机拓展信息 - 标签模型
*
* @author Jiahang Li
* @version 1.0.0
@@ -18,8 +18,11 @@ import lombok.NoArgsConstructor;
@Builder
@NoArgsConstructor
@AllArgsConstructor
-@Schema(name = "HostExtraSshModel", description = "主机拓展信息 - color 模型")
-public class HostColorExtraModel implements GenericsDataModel {
+@Schema(name = "HostLabelExtraModel", description = "主机拓展信息 - 标签模型")
+public class HostLabelExtraModel implements GenericsDataModel {
+
+ @Schema(description = "别名")
+ private String alias;
@Schema(description = "颜色")
private String color;
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostColorExtraStrategy.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostColorExtraStrategy.java
deleted file mode 100644
index 241fcaf2..00000000
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostColorExtraStrategy.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.orion.ops.module.asset.handler.host.extra.strategy;
-
-import com.orion.ops.framework.common.handler.data.strategy.MapDataStrategy;
-import com.orion.ops.module.asset.handler.host.extra.model.HostColorExtraModel;
-import org.springframework.stereotype.Component;
-
-/**
- * 主机拓展信息 - 颜色 模型处理策略
- *
- * @author Jiahang Li
- * @version 1.0.0
- * @since 2024/2/29 23:16
- */
-@Component
-public class HostColorExtraStrategy implements MapDataStrategy {
-
- @Override
- public HostColorExtraModel getDefault() {
- return HostColorExtraModel.builder()
- // 默认透明
- .color("")
- .build();
- }
-
- @Override
- public void updateFill(HostColorExtraModel beforeModel, HostColorExtraModel afterModel) {
- }
-
- @Override
- public void preValid(HostColorExtraModel model) {
- }
-
- @Override
- public void valid(HostColorExtraModel model) {
- }
-
-}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostLabelExtraStrategy.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostLabelExtraStrategy.java
new file mode 100644
index 00000000..35bee13b
--- /dev/null
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostLabelExtraStrategy.java
@@ -0,0 +1,47 @@
+package com.orion.ops.module.asset.handler.host.extra.strategy;
+
+import com.orion.ops.framework.common.constant.Const;
+import com.orion.ops.framework.common.handler.data.strategy.MapDataStrategy;
+import com.orion.ops.module.asset.handler.host.extra.model.HostLabelExtraModel;
+import org.springframework.stereotype.Component;
+
+/**
+ * 主机拓展信息 - 标签模型处理策略
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/2/29 23:16
+ */
+@Component
+public class HostLabelExtraStrategy implements MapDataStrategy {
+
+ @Override
+ public HostLabelExtraModel getDefault() {
+ return HostLabelExtraModel.builder()
+ // 透明
+ .color(Const.EMPTY)
+ // 无别名
+ .alias(Const.EMPTY)
+ .build();
+ }
+
+ @Override
+ public void updateFill(HostLabelExtraModel beforeModel, HostLabelExtraModel afterModel) {
+ // 为空则覆盖
+ if (afterModel.getAlias() == null) {
+ afterModel.setAlias(beforeModel.getAlias());
+ }
+ if (afterModel.getColor() == null) {
+ afterModel.setColor(beforeModel.getColor());
+ }
+ }
+
+ @Override
+ public void preValid(HostLabelExtraModel model) {
+ }
+
+ @Override
+ public void valid(HostLabelExtraModel model) {
+ }
+
+}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostSshExtraStrategy.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostSshExtraStrategy.java
index 04d5c5fb..cef231dd 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostSshExtraStrategy.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/extra/strategy/HostSshExtraStrategy.java
@@ -9,7 +9,6 @@ import com.orion.ops.module.asset.dao.HostKeyDAO;
import com.orion.ops.module.asset.enums.HostExtraSshAuthTypeEnum;
import com.orion.ops.module.asset.handler.host.extra.model.HostSshExtraModel;
import com.orion.ops.module.infra.api.DataPermissionApi;
-import com.orion.ops.module.infra.api.SystemUserApi;
import com.orion.ops.module.infra.enums.DataPermissionTypeEnum;
import org.springframework.stereotype.Component;
@@ -31,9 +30,6 @@ public class HostSshExtraStrategy implements MapDataStrategy
@Resource
private HostIdentityDAO hostIdentityDAO;
- @Resource
- private SystemUserApi systemUserApi;
-
@Resource
private DataPermissionApi dataPermissionApi;
@@ -68,21 +64,18 @@ public class HostSshExtraStrategy implements MapDataStrategy
if (identityId != null) {
Valid.notNull(hostIdentityDAO.selectById(identityId), ErrorMessage.IDENTITY_ABSENT);
}
- // 非管理员验证权限
Long userId = SecurityUtils.getLoginUserId();
- if (!systemUserApi.isAdminUser(userId)) {
- // 验证主机秘钥是否有权限
- if (keyId != null) {
- Valid.isTrue(dataPermissionApi.hasPermission(DataPermissionTypeEnum.HOST_KEY, userId, keyId),
- ErrorMessage.ANY_NO_PERMISSION,
- DataPermissionTypeEnum.HOST_KEY.getPermissionName());
- }
- // 验证主机身份是否有权限
- if (identityId != null) {
- Valid.isTrue(dataPermissionApi.hasPermission(DataPermissionTypeEnum.HOST_IDENTITY, userId, identityId),
- ErrorMessage.ANY_NO_PERMISSION,
- DataPermissionTypeEnum.HOST_IDENTITY.getPermissionName());
- }
+ // 验证主机秘钥是否有权限
+ if (keyId != null) {
+ Valid.isTrue(dataPermissionApi.hasPermission(DataPermissionTypeEnum.HOST_KEY, userId, keyId),
+ ErrorMessage.ANY_NO_PERMISSION,
+ DataPermissionTypeEnum.HOST_KEY.getPermissionName());
+ }
+ // 验证主机身份是否有权限
+ if (identityId != null) {
+ Valid.isTrue(dataPermissionApi.hasPermission(DataPermissionTypeEnum.HOST_IDENTITY, userId, identityId),
+ ErrorMessage.ANY_NO_PERMISSION,
+ DataPermissionTypeEnum.HOST_IDENTITY.getPermissionName());
}
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/TransferMessageDispatcher.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/TransferMessageDispatcher.java
index 9d90f4f6..384b248b 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/TransferMessageDispatcher.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/TransferMessageDispatcher.java
@@ -56,7 +56,7 @@ public class TransferMessageDispatcher extends AbstractWebSocketHandler {
String id = session.getId();
log.info("TransferMessageHandler-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason());
// 关闭会话
- Streams.close(handlers.get(id));
+ Streams.close(handlers.remove(id));
}
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/SftpFileBackupParams.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/SftpFileBackupParams.java
new file mode 100644
index 00000000..a6e4ebfb
--- /dev/null
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/SftpFileBackupParams.java
@@ -0,0 +1,29 @@
+package com.orion.ops.module.asset.handler.host.transfer.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * sftp 文件备份参数
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/4/15 23:13
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "SftpFileBackupParams", description = "sftp 文件备份参数")
+public class SftpFileBackupParams {
+
+ @Schema(description = "文件名称")
+ private String fileName;
+
+ @Schema(description = "时间戳")
+ private Long timestamp;
+
+}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/TransferHostSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/TransferHostSession.java
index b284422c..6f8b3964 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/TransferHostSession.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/TransferHostSession.java
@@ -1,14 +1,20 @@
package com.orion.ops.module.asset.handler.host.transfer.session;
+import com.alibaba.fastjson.JSON;
+import com.orion.lang.utils.Booleans;
+import com.orion.lang.utils.Strings;
import com.orion.lang.utils.collect.Maps;
import com.orion.lang.utils.io.Streams;
import com.orion.net.host.SessionStore;
import com.orion.net.host.sftp.SftpExecutor;
+import com.orion.net.host.sftp.SftpFile;
import com.orion.ops.framework.biz.operator.log.core.model.OperatorLogModel;
import com.orion.ops.framework.biz.operator.log.core.service.OperatorLogFrameworkService;
import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs;
+import com.orion.ops.module.asset.define.config.AppSftpConfig;
import com.orion.ops.module.asset.entity.dto.HostTerminalConnectDTO;
import com.orion.ops.module.asset.handler.host.terminal.utils.TerminalUtils;
+import com.orion.ops.module.asset.handler.host.transfer.model.SftpFileBackupParams;
import com.orion.spring.SpringHolder;
import org.springframework.web.socket.WebSocketSession;
@@ -23,6 +29,8 @@ import java.util.Map;
*/
public abstract class TransferHostSession implements ITransferHostSession {
+ protected static final AppSftpConfig SFTP_CONFIG = SpringHolder.getBean(AppSftpConfig.class);
+
protected final HostTerminalConnectDTO connectInfo;
protected final SessionStore sessionStore;
@@ -51,6 +59,27 @@ public abstract class TransferHostSession implements ITransferHostSession {
}
}
+ /**
+ * 检查文件是否存在 并且执行响应策略
+ *
+ * @param path path
+ */
+ protected void doCheckFilePresent(String path) {
+ // 重复不备份
+ if (!Booleans.isTrue(SFTP_CONFIG.getUploadPresentBackup())) {
+ return;
+ }
+ // 检查文件是否存在
+ SftpFile file = executor.getFile(path);
+ if (file != null) {
+ // 文件存在则备份
+ SftpFileBackupParams backupParams = new SftpFileBackupParams(file.getName(), System.currentTimeMillis());
+ String target = Strings.format(SFTP_CONFIG.getBackupFileName(), JSON.parseObject(JSON.toJSONString(backupParams)));
+ // 移动
+ executor.move(path, target);
+ }
+ }
+
/**
* 保存操作日志
*
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/UploadSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/UploadSession.java
index c9dcc3d5..811b8344 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/UploadSession.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/UploadSession.java
@@ -3,7 +3,6 @@ package com.orion.ops.module.asset.handler.host.transfer.session;
import com.orion.lang.exception.argument.InvalidArgumentException;
import com.orion.lang.utils.io.Streams;
import com.orion.net.host.SessionStore;
-import com.orion.net.host.sftp.SftpFile;
import com.orion.ops.module.asset.define.operator.HostTerminalOperatorType;
import com.orion.ops.module.asset.entity.dto.HostTerminalConnectDTO;
import com.orion.ops.module.asset.handler.host.transfer.enums.TransferReceiverType;
@@ -40,11 +39,7 @@ public class UploadSession extends TransferHostSession implements IUploadSession
// 检查连接
this.init();
// 检查文件是否存在
- SftpFile file = executor.getFile(path);
- if (file != null) {
- // 文件存在则重命名
- executor.move(path, file.getName() + "_bk_" + System.currentTimeMillis());
- }
+ this.doCheckFilePresent(path);
// 打开输出流
this.outputStream = executor.openOutputStream(path);
// 响应结果
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/AssetAuthorizedDataService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/AssetAuthorizedDataService.java
index 294cc40d..73b79995 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/AssetAuthorizedDataService.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/AssetAuthorizedDataService.java
@@ -28,13 +28,21 @@ public interface AssetAuthorizedDataService {
List getAuthorizedDataRelId(DataPermissionTypeEnum type, AssetAuthorizedDataQueryRequest request);
/**
- * 查询用户已授权的主机
+ * 获取用户已授权的主机id 查询角色
+ *
+ * @param userId userId
+ * @return hostId
+ */
+ List getUserAuthorizedHostId(Long userId);
+
+ /**
+ * 获取用户已授权&配置已启用的主机id 查询角色
*
* @param userId userId
* @param type type
* @return hostId
*/
- List getUserAuthorizedHostId(Long userId, HostConfigTypeEnum type);
+ List getUserAuthorizedHostIdWithEnabledConfig(Long userId, HostConfigTypeEnum type);
/**
* 查询用户已授权的主机
@@ -45,14 +53,6 @@ public interface AssetAuthorizedDataService {
*/
AuthorizedHostWrapperVO getUserAuthorizedHost(Long userId, String type);
- /**
- * 获取用户已授权的主机id 不查询角色
- *
- * @param userId userId
- * @return hostId
- */
- List getUserAuthorizedHostId(Long userId);
-
/**
* 查询用户已授权的主机秘钥
*
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecCommandService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecCommandService.java
index 9d84f7ac..7b9221cf 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecCommandService.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecCommandService.java
@@ -1,6 +1,6 @@
package com.orion.ops.module.asset.service;
-import com.orion.ops.module.asset.entity.request.exec.ExecCommandExecRequest;
+import com.orion.ops.module.asset.entity.dto.ExecCommandExecDTO;
import com.orion.ops.module.asset.entity.request.exec.ExecCommandRequest;
import com.orion.ops.module.asset.entity.vo.ExecLogVO;
@@ -27,7 +27,7 @@ public interface ExecCommandService {
* @param request request
* @return result
*/
- ExecLogVO execCommandWithSource(ExecCommandExecRequest request);
+ ExecLogVO execCommandWithSource(ExecCommandExecDTO request);
/**
* 重新执行命令
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConfigService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConfigService.java
index 6023e69f..3dbe9550 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConfigService.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConfigService.java
@@ -7,6 +7,7 @@ import com.orion.ops.module.asset.entity.vo.HostConfigVO;
import com.orion.ops.module.asset.enums.HostConfigTypeEnum;
import java.util.List;
+import java.util.Map;
/**
* 主机配置 服务类
@@ -27,10 +28,11 @@ public interface HostConfigService {
HostConfigVO getHostConfig(Long hostId, String type);
/**
- * 获取配置
+ * 获取配置 配置未启用会报错
*
* @param hostId hostId
* @param type type
+ * @param T
* @return config
*/
T getHostConfig(Long hostId, HostConfigTypeEnum type);
@@ -52,6 +54,16 @@ public interface HostConfigService {
*/
List getHostConfigList(List hostIdList, String type);
+ /**
+ * 获取配置
+ *
+ * @param hostIdList hostIdList
+ * @param type type
+ * @param T
+ * @return config
+ */
+ Map getHostConfigMap(List hostIdList, HostConfigTypeEnum type);
+
/**
* 更新配置
*
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostExtraService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostExtraService.java
index 6efc57c6..94f98621 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostExtraService.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostExtraService.java
@@ -1,7 +1,6 @@
package com.orion.ops.module.asset.service;
import com.orion.ops.framework.common.handler.data.model.GenericsDataModel;
-import com.orion.ops.module.asset.entity.request.host.HostAliasUpdateRequest;
import com.orion.ops.module.asset.entity.request.host.HostExtraQueryRequest;
import com.orion.ops.module.asset.entity.request.host.HostExtraUpdateRequest;
import com.orion.ops.module.asset.enums.HostExtraItemEnum;
@@ -17,14 +16,6 @@ import java.util.Map;
*/
public interface HostExtraService {
- /**
- * 修改主机别名
- *
- * @param request request
- * @return effect
- */
- Integer updateHostAlias(HostAliasUpdateRequest request);
-
/**
* 获取主机额外配置
*
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/AssetAuthorizedDataServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/AssetAuthorizedDataServiceImpl.java
index bd6d3a2e..b70cff6c 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/AssetAuthorizedDataServiceImpl.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/AssetAuthorizedDataServiceImpl.java
@@ -1,10 +1,9 @@
package com.orion.ops.module.asset.service.impl;
-import com.alibaba.fastjson.JSON;
import com.orion.lang.function.Functions;
-import com.orion.lang.utils.Refs;
import com.orion.lang.utils.collect.Lists;
import com.orion.lang.utils.collect.Maps;
+import com.orion.lang.utils.collect.Sets;
import com.orion.ops.framework.common.constant.Const;
import com.orion.ops.framework.common.utils.TreeUtils;
import com.orion.ops.framework.common.utils.Valid;
@@ -13,10 +12,10 @@ import com.orion.ops.module.asset.entity.request.asset.AssetAuthorizedDataQueryR
import com.orion.ops.module.asset.entity.vo.*;
import com.orion.ops.module.asset.enums.HostConfigTypeEnum;
import com.orion.ops.module.asset.enums.HostConnectTypeEnum;
-import com.orion.ops.module.asset.handler.host.extra.model.HostColorExtraModel;
+import com.orion.ops.module.asset.enums.HostExtraItemEnum;
+import com.orion.ops.module.asset.handler.host.extra.model.HostLabelExtraModel;
import com.orion.ops.module.asset.service.*;
import com.orion.ops.module.infra.api.*;
-import com.orion.ops.module.infra.constant.DataExtraItems;
import com.orion.ops.module.infra.entity.dto.data.DataGroupDTO;
import com.orion.ops.module.infra.entity.dto.tag.TagDTO;
import com.orion.ops.module.infra.enums.*;
@@ -50,9 +49,6 @@ public class AssetAuthorizedDataServiceImpl implements AssetAuthorizedDataServic
@Resource
private DataPermissionApi dataPermissionApi;
- @Resource
- private SystemUserApi systemUserApi;
-
@Resource
private HostService hostService;
@@ -91,39 +87,6 @@ public class AssetAuthorizedDataServiceImpl implements AssetAuthorizedDataServic
}
}
- @Override
- public List getUserAuthorizedHostId(Long userId, HostConfigTypeEnum type) {
- final boolean allData = systemUserApi.isAdminUser(userId);
- if (allData) {
- // 管理员查询所有
- return this.getEnabledConfigHostId(true, Maps.empty(), type.name());
- } else {
- // 其他用户 查询授权的数据
- Map> dataGroupRel = dataGroupRelApi.getGroupRelList(DataGroupTypeEnum.HOST);
- // 查询配置启用的主机
- return this.getEnabledConfigHostId(false, dataGroupRel, type.name());
- }
- }
-
- @Override
- public AuthorizedHostWrapperVO getUserAuthorizedHost(Long userId, String type) {
- if (systemUserApi.isAdminUser(userId)) {
- // 管理员查询所有
- return this.buildUserAuthorizedHost(userId, null, type);
- } else {
- // 其他用户 查询授权的数据
- List authorizedIdList = dataPermissionApi.getUserAuthorizedRelIdList(DataPermissionTypeEnum.HOST_GROUP, userId);
- if (authorizedIdList.isEmpty()) {
- // 无数据
- return AuthorizedHostWrapperVO.builder()
- .groupTree(Lists.empty())
- .hostList(Lists.empty())
- .build();
- }
- return this.buildUserAuthorizedHost(userId, authorizedIdList, type);
- }
- }
-
@Override
public List getUserAuthorizedHostId(Long userId) {
// 查询授权的分组
@@ -143,132 +106,117 @@ public class AssetAuthorizedDataServiceImpl implements AssetAuthorizedDataServic
}
@Override
- public List getUserAuthorizedHostKey(Long userId) {
- if (systemUserApi.isAdminUser(userId)) {
- // 管理员查询所有
- return hostKeyService.getHostKeyList();
- } else {
- // 其他用户 查询授权的数据
- List authorizedIdList = dataPermissionApi.getUserAuthorizedRelIdList(DataPermissionTypeEnum.HOST_KEY, userId);
- if (authorizedIdList.isEmpty()) {
- return Lists.empty();
- }
- // 映射数据
- Map keys = hostKeyService.getHostKeyList()
- .stream()
- .collect(Collectors.toMap(HostKeyVO::getId, Function.identity(), Functions.right()));
- return authorizedIdList.stream()
- .map(keys::get)
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
+ public List getUserAuthorizedHostIdWithEnabledConfig(Long userId, HostConfigTypeEnum type) {
+ // 获取启用的主机
+ List hostIdList = this.getUserAuthorizedHostId(userId);
+ if (hostIdList.isEmpty()) {
+ return hostIdList;
}
+ // 获取启用配置的主机
+ return hostConfigService.getEnabledConfigHostId(type.name(), hostIdList);
}
- @Override
- public List getUserAuthorizedHostIdentity(Long userId) {
- if (systemUserApi.isAdminUser(userId)) {
- // 管理员查询所有
- return hostIdentityService.getHostIdentityList();
- } else {
- // 其他用户 查询授权的数据
- List authorizedIdList = dataPermissionApi.getUserAuthorizedRelIdList(DataPermissionTypeEnum.HOST_IDENTITY, userId);
- if (authorizedIdList.isEmpty()) {
- return Lists.empty();
- }
- // 映射数据
- Map identities = hostIdentityService.getHostIdentityList()
- .stream()
- .collect(Collectors.toMap(HostIdentityVO::getId, Function.identity(), Functions.right()));
- return authorizedIdList.stream()
- .map(identities::get)
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
- }
- }
-
- /**
- * 构建授权的主机分组树
- *
- * @param userId userId
- * @param authorizedGroupIdList authorizedGroupIdList
- * @param type type
- * @return tree
- */
@SneakyThrows
- private AuthorizedHostWrapperVO buildUserAuthorizedHost(Long userId, List authorizedGroupIdList, String type) {
- final boolean allData = Lists.isEmpty(authorizedGroupIdList);
+ @Override
+ public AuthorizedHostWrapperVO getUserAuthorizedHost(Long userId, String type) {
+ // 查询授权的数据
+ List authorizedGroupIdList = dataPermissionApi.getUserAuthorizedRelIdList(DataPermissionTypeEnum.HOST_GROUP, userId);
+ if (Lists.isEmpty(authorizedGroupIdList)) {
+ // 无数据
+ return AuthorizedHostWrapperVO.builder()
+ .groupTree(Lists.empty())
+ .treeNodes(Maps.empty())
+ .hostList(Lists.empty())
+ .latestHosts(Sets.empty())
+ .build();
+ }
AuthorizedHostWrapperVO wrapper = new AuthorizedHostWrapperVO();
// 查询我的收藏
Future> favoriteResult = favoriteApi.getFavoriteRelIdListAsync(FavoriteTypeEnum.HOST, userId);
// 查询最近连接的主机
Future> latestConnectHostIdList = hostConnectLogService.getLatestConnectHostIdAsync(HostConnectTypeEnum.of(type), userId);
// 查询主机拓展信息
- Future>> hostExtraResult = dataExtraApi.getExtraItemsValuesByCacheAsync(userId,
+ Future
diff --git a/orion-ops-ui/src/views/asset/grant/components/host-identity-grant.vue b/orion-ops-ui/src/views/asset/grant/components/host-identity-grant.vue
index 24811bff..4240bbbe 100644
--- a/orion-ops-ui/src/views/asset/grant/components/host-identity-grant.vue
+++ b/orion-ops-ui/src/views/asset/grant/components/host-identity-grant.vue
@@ -1,8 +1,10 @@
+ @fetch="fetchAuthorizedData"
+ @grant="doGrant"
+ @select-all="selectAll"
+ @reverse="reverseSelect">
+
+
+
+ {{ getDictValue(identityTypeKey, record.type) }}
+
+
-
- {{ hostKeys.find(s => s.id === record.keyId)?.name }}
-
+
+
+
+ {{ hostKeys.find(s => s.id === record.keyId)?.name }}
+
+
+
+
+ -
+
@@ -38,11 +53,12 @@
import type { HostKeyQueryResponse } from '@/api/asset/host-key';
import { ref, onMounted } from 'vue';
import useLoading from '@/hooks/loading';
- import { getAuthorizedHostIdentity, grantHostIdentity } from '@/api/asset/asset-data-grant';
- import { Message } from '@arco-design/web-vue';
- import { hostIdentityColumns } from '../types/table.columns';
- import { useCacheStore } from '@/store';
import { useRowSelection } from '@/types/table';
+ import { getAuthorizedHostIdentity, grantHostIdentity } from '@/api/asset/asset-data-grant';
+ import { useCacheStore, useDictStore } from '@/store';
+ import { hostIdentityColumns } from '../types/table.columns';
+ import { identityTypeKey } from '../types/const';
+ import { Message } from '@arco-design/web-vue';
import GrantLayout from './grant-layout.vue';
const props = defineProps<{
@@ -51,6 +67,7 @@
const cacheStore = useCacheStore();
const rowSelection = useRowSelection();
+ const { getDictValue } = useDictStore();
const { loading, setLoading } = useLoading();
const selectedKeys = ref>([]);
@@ -58,7 +75,7 @@
const hostKeys = ref>([]);
// 获取授权列表
- const fetchAuthorizedGroup = async (request: AssetAuthorizedDataQueryRequest) => {
+ const fetchAuthorizedData = async (request: AssetAuthorizedDataQueryRequest) => {
setLoading(true);
try {
const { data } = await getAuthorizedHostIdentity(request);
@@ -73,6 +90,7 @@
const doGrant = async (request: AssetDataGrantRequest) => {
setLoading(true);
try {
+ // 执行授权
await grantHostIdentity({
...request,
idList: selectedKeys.value
@@ -82,6 +100,19 @@
} finally {
setLoading(false);
}
+ // 查询数据
+ await fetchAuthorizedData(request);
+ };
+
+ // 全选
+ const selectAll = () => {
+ selectedKeys.value = hostIdentities.value.map(s => s.id);
+ };
+
+ // 反选
+ const reverseSelect = () => {
+ selectedKeys.value = hostIdentities.value.map(s => s.id)
+ .filter(s => !selectedKeys.value.includes(s));
};
// 点击行
@@ -94,7 +125,7 @@
}
};
- // 初始化数据
+ // 初始化身份数据
onMounted(async () => {
setLoading(true);
try {
@@ -106,7 +137,7 @@
}
});
- // 初始化数据
+ // 初始化秘钥数据
onMounted(async () => {
// 加载主机秘钥
hostKeys.value = await cacheStore.loadHostKeys();
diff --git a/orion-ops-ui/src/views/asset/grant/components/host-key-grant.vue b/orion-ops-ui/src/views/asset/grant/components/host-key-grant.vue
index 4a774057..1c5cb355 100644
--- a/orion-ops-ui/src/views/asset/grant/components/host-key-grant.vue
+++ b/orion-ops-ui/src/views/asset/grant/components/host-key-grant.vue
@@ -1,8 +1,10 @@
+ @fetch="fetchAuthorizedData"
+ @grant="doGrant"
+ @select-all="selectAll"
+ @reverse="reverseSelect">
>([]);
// 获取授权列表
- const fetchAuthorizedGroup = async (request: AssetAuthorizedDataQueryRequest) => {
+ const fetchAuthorizedData = async (request: AssetAuthorizedDataQueryRequest) => {
setLoading(true);
try {
const { data } = await getAuthorizedHostKey(request);
@@ -64,6 +66,7 @@
const doGrant = async (request: AssetDataGrantRequest) => {
setLoading(true);
try {
+ // 执行授权
await grantHostKey({
...request,
idList: selectedKeys.value
@@ -73,6 +76,19 @@
} finally {
setLoading(false);
}
+ // 查询数据
+ await fetchAuthorizedData(request);
+ };
+
+ // 全选
+ const selectAll = () => {
+ selectedKeys.value = hostKeys.value.map(s => s.id);
+ };
+
+ // 反选
+ const reverseSelect = () => {
+ selectedKeys.value = hostKeys.value.map(s => s.id)
+ .filter(s => !selectedKeys.value.includes(s));
};
// 点击行
diff --git a/orion-ops-ui/src/views/asset/grant/index.vue b/orion-ops-ui/src/views/asset/grant/index.vue
index 0d468130..1b7e0d87 100644
--- a/orion-ops-ui/src/views/asset/grant/index.vue
+++ b/orion-ops-ui/src/views/asset/grant/index.vue
@@ -26,8 +26,8 @@
diff --git a/orion-ops-ui/src/views/exec/exec-template/components/exec-template-form-drawer.vue b/orion-ops-ui/src/views/exec/exec-template/components/exec-template-form-drawer.vue
index 472e213d..3fa001a8 100644
--- a/orion-ops-ui/src/views/exec/exec-template/components/exec-template-form-drawer.vue
+++ b/orion-ops-ui/src/views/exec/exec-template/components/exec-template-form-drawer.vue
@@ -8,24 +8,28 @@
:cancel-button-props="{ disabled: loading }"
:on-before-ok="handlerOk"
@cancel="handleClose">
-
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+ label="命令参数">
添加参数
@@ -115,6 +134,7 @@
import formRules from '../types/form.rules';
import { createExecTemplate, updateExecTemplate } from '@/api/exec/exec-template';
import { Message } from '@arco-design/web-vue';
+ import { EnabledStatus } from '@/types/const';
import ExecEditor from '@/components/view/exec-editor/index.vue';
const { visible, setVisible } = useVisible();
@@ -129,6 +149,7 @@
name: undefined,
command: undefined,
timeout: 0,
+ scriptExec: EnabledStatus.DISABLED,
parameterSchema: undefined,
};
};
@@ -295,7 +316,7 @@
.command-editor {
width: 100%;
- height: 65vh;
+ height: 62vh;
}
diff --git a/orion-ops-ui/src/views/exec/exec-template/types/form.rules.ts b/orion-ops-ui/src/views/exec/exec-template/types/form.rules.ts
index 202663e2..e18e0607 100644
--- a/orion-ops-ui/src/views/exec/exec-template/types/form.rules.ts
+++ b/orion-ops-ui/src/views/exec/exec-template/types/form.rules.ts
@@ -23,8 +23,14 @@ export const timeout = [{
message: '超时时间需要在 0 - 100000 之间'
}] as FieldRule[];
+export const scriptExec = [{
+ required: true,
+ message: '请选择是否使用脚本执行'
+}] as FieldRule[];
+
export default {
name,
command,
timeout,
+ scriptExec,
} as Record;
diff --git a/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-group-select.vue b/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-group-select.vue
index 2c71d950..e8e2035e 100644
--- a/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-group-select.vue
+++ b/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-group-select.vue
@@ -21,9 +21,9 @@
import useLoading from '@/hooks/loading';
import { createCommandSnippetGroup } from '@/api/asset/command-snippet-group';
- const props = defineProps<{
- modelValue: number | undefined
- }>();
+ const props = defineProps>();
const emits = defineEmits(['update:modelValue']);
diff --git a/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-list-group.vue b/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-list-group.vue
index 0eacbd3d..c7b0cf0f 100644
--- a/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-list-group.vue
+++ b/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-list-group.vue
@@ -31,7 +31,7 @@
import CommandSnippetListItem from './command-snippet-list-item.vue';
defineProps<{
- snippet: CommandSnippetWrapperResponse
+ snippet: CommandSnippetWrapperResponse;
}>();
// 计算总量
diff --git a/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-list-item.vue b/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-list-item.vue
index 5d8d8742..f5e2727a 100644
--- a/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-list-item.vue
+++ b/orion-ops-ui/src/views/host/command-snippet/components/command-snippet-list-item.vue
@@ -121,7 +121,7 @@
import { openUpdateSnippetKey, removeSnippetKey } from '../types/const';
const props = defineProps<{
- item: CommandSnippetQueryResponse
+ item: CommandSnippetQueryResponse;
}>();
const { getAndCheckCurrentSshSession } = useTerminalStore();
diff --git a/orion-ops-ui/src/views/host/terminal/components/layout/icon-actions.vue b/orion-ops-ui/src/views/host/terminal/components/layout/icon-actions.vue
index 911bfd9b..0e89bdaa 100644
--- a/orion-ops-ui/src/views/host/terminal/components/layout/icon-actions.vue
+++ b/orion-ops-ui/src/views/host/terminal/components/layout/icon-actions.vue
@@ -10,7 +10,7 @@
:content="action.content">