diff --git a/docs/about/change-log.md b/docs/about/change-log.md index 9ce8c8b5..a11debb1 100644 --- a/docs/about/change-log.md +++ b/docs/about/change-log.md @@ -2,6 +2,17 @@ ⚡ 注意: 应用不支持跨版本升级, 可以进行多次升级 +## v1.0.5 + +`2024-04-` `release` + +* 🔨 优化 定时删除未引用的 `tag` +* 🔨 优化 命令执行日志时间不自增 +* 🔨 优化 tracker 监听文件可配置 `app.tracker` +* 🔨 优化 sftp 上传文件重复处理可配置 `app.sftp` + +[如何升级](/update/v1.0.5.md) + ## v1.0.4 `2024-04-15` `release` @@ -69,7 +80,7 @@ * 🌈 新增 主机连接日志删除/清理 * 🌈 新增 用户操作日志日志删除/清理 * 🌈 新增 用户操作日志日志删除/清理 -* 🔨 优化 用户锁定次数/时间可配置 +* 🔨 优化 用户锁定次数/时间可配置 `app.authentication` [如何升级](/update/v1.0.1.md) diff --git a/docs/about/roadmap.md b/docs/about/roadmap.md index 07fcbefc..e921cdbe 100644 --- a/docs/about/roadmap.md +++ b/docs/about/roadmap.md @@ -1,15 +1,12 @@ ## 功能排期 ⏳ -* tracker 使用配置文件 -* 文件重复删除/重命名 可配置 -* 定时删除未引用的 tag -* 管理员也需要自行授权资产 -* 使用文件执行命令 +* 优化文件传输列表进度显示 * 主机身份类型 +* 终端断开连接后回车重新连接 +* 使用文件执行命令 +* 管理员也需要自行授权资产 * 文件夹书签 * 批量上传 -* 优化文件传输列表进度显示 -* 终端断开连接后回车重新连接 * 站内消息 * 终端背景图片 * 资产授权 UI 改版 diff --git a/orion-ops-launch/src/main/resources/application.yaml b/orion-ops-launch/src/main/resources/application.yaml index 8d9bb076..14447be7 100644 --- a/orion-ops-launch/src/main/resources/application.yaml +++ b/orion-ops-launch/src/main/resources/application.yaml @@ -152,6 +152,7 @@ logging: # 应用配置 app: + # 认证配置 authentication: # 是否允许多端登录 allow-multi-device: true @@ -163,6 +164,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/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/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..a2991cf9 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) { 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/resources/META-INF/spring-configuration-metadata.json b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/META-INF/spring-configuration-metadata.json new file mode 100644 index 00000000..f656493c --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/META-INF/spring-configuration-metadata.json @@ -0,0 +1,46 @@ +{ + "groups": [ + { + "name": "app.tracker", + "type": "com.orion.ops.module.asset.define.config.AppTrackerConfig", + "sourceType": "com.orion.ops.module.asset.define.config.AppTrackerConfig" + }, + { + "name": "app.sftp", + "type": "com.orion.ops.module.asset.define.config.AppSftpConfig", + "sourceType": "com.orion.ops.module.asset.define.config.AppSftpConfig" + } + ], + "properties": [ + { + "name": "app.tracker.offset", + "type": "java.lang.Integer", + "description": "加载偏移量 (行)", + "defaultValue": "300" + }, + { + "name": "app.tracker.delay", + "type": "java.lang.Integer", + "description": "延迟时间 (ms)", + "defaultValue": "100" + }, + { + "name": "app.tracker.wait-times", + "type": "java.lang.Integer", + "description": "文件未找到等待次数", + "defaultValue": "100" + }, + { + "name": "app.sftp.upload-present-backup", + "type": "java.lang.Boolean", + "description": "上传文件时 文件存在是否备份.", + "defaultValue": "true" + }, + { + "name": "app.sftp.backup-file-name", + "type": "java.lang.String", + "description": "备份文件名称.", + "defaultValue": "bk_${fileName}_${timestamp}" + } + ] +} \ No newline at end of file diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/config/AppAuthenticationConfig.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/define/config/AppAuthenticationConfig.java similarity index 94% rename from orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/config/AppAuthenticationConfig.java rename to orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/define/config/AppAuthenticationConfig.java index 1abc66d4..a7eb3e4a 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/config/AppAuthenticationConfig.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/define/config/AppAuthenticationConfig.java @@ -1,4 +1,4 @@ -package com.orion.ops.module.infra.config; +package com.orion.ops.module.infra.define.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/AuthenticationServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/AuthenticationServiceImpl.java index ac8a2530..c31b5379 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/AuthenticationServiceImpl.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/AuthenticationServiceImpl.java @@ -16,7 +16,7 @@ import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.redis.core.utils.RedisStrings; import com.orion.ops.framework.redis.core.utils.RedisUtils; import com.orion.ops.framework.security.core.utils.SecurityUtils; -import com.orion.ops.module.infra.config.AppAuthenticationConfig; +import com.orion.ops.module.infra.define.config.AppAuthenticationConfig; import com.orion.ops.module.infra.convert.SystemUserConvert; import com.orion.ops.module.infra.dao.SystemUserDAO; import com.orion.ops.module.infra.dao.SystemUserRoleDAO; diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemUserServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemUserServiceImpl.java index 9c79ec89..5044b943 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemUserServiceImpl.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemUserServiceImpl.java @@ -14,7 +14,7 @@ import com.orion.ops.framework.redis.core.utils.RedisStrings; import com.orion.ops.framework.redis.core.utils.RedisUtils; import com.orion.ops.framework.redis.core.utils.barrier.CacheBarriers; import com.orion.ops.framework.security.core.utils.SecurityUtils; -import com.orion.ops.module.infra.config.AppAuthenticationConfig; +import com.orion.ops.module.infra.define.config.AppAuthenticationConfig; import com.orion.ops.module.infra.convert.SystemUserConvert; import com.orion.ops.module.infra.dao.OperatorLogDAO; import com.orion.ops.module.infra.dao.SystemRoleDAO; diff --git a/orion-ops-launch/src/main/resources/META-INF/spring-configuration-metadata.json b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/resources/META-INF/spring-configuration-metadata.json similarity index 83% rename from orion-ops-launch/src/main/resources/META-INF/spring-configuration-metadata.json rename to orion-ops-module-infra/orion-ops-module-infra-service/src/main/resources/META-INF/spring-configuration-metadata.json index a4099a50..f2ae1e51 100644 --- a/orion-ops-launch/src/main/resources/META-INF/spring-configuration-metadata.json +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/resources/META-INF/spring-configuration-metadata.json @@ -2,8 +2,8 @@ "groups": [ { "name": "app.authentication", - "type": "com.orion.ops.module.infra.config.AppAuthenticationConfig", - "sourceType": "com.orion.ops.module.infra.config.AppAuthenticationConfig" + "type": "com.orion.ops.module.infra.define.config.AppAuthenticationConfig", + "sourceType": "com.orion.ops.module.infra.define.config.AppAuthenticationConfig" } ], "properties": [