diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ExtraFieldConst.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ExtraFieldConst.java index efd44060..90eb93ce 100644 --- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ExtraFieldConst.java +++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ExtraFieldConst.java @@ -37,4 +37,8 @@ public interface ExtraFieldConst extends FieldConst { String CONNECT_TYPE = "connectType"; + String HOST_ID = "hostId"; + + String HOST_NAME = "hostName"; + } diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FieldConst.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FieldConst.java index 7dbed1eb..36e22a92 100644 --- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FieldConst.java +++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FieldConst.java @@ -41,4 +41,10 @@ public interface FieldConst { String TOKEN = "token"; + String PATH = "path"; + + String ADDRESS = "address"; + + String MOD = "mod"; + } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-biz-operator-log/src/main/java/com/orion/ops/framework/biz/operator/log/core/uitls/OperatorLogs.java b/orion-ops-framework/orion-ops-spring-boot-starter-biz-operator-log/src/main/java/com/orion/ops/framework/biz/operator/log/core/utils/OperatorLogs.java similarity index 98% rename from orion-ops-framework/orion-ops-spring-boot-starter-biz-operator-log/src/main/java/com/orion/ops/framework/biz/operator/log/core/uitls/OperatorLogs.java rename to orion-ops-framework/orion-ops-spring-boot-starter-biz-operator-log/src/main/java/com/orion/ops/framework/biz/operator/log/core/utils/OperatorLogs.java index de85d934..2858adf5 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-biz-operator-log/src/main/java/com/orion/ops/framework/biz/operator/log/core/uitls/OperatorLogs.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-biz-operator-log/src/main/java/com/orion/ops/framework/biz/operator/log/core/utils/OperatorLogs.java @@ -1,4 +1,4 @@ -package com.orion.ops.framework.biz.operator.log.core.uitls; +package com.orion.ops.framework.biz.operator.log.core.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializeFilter; diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/utils/WebSockets.java b/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/utils/WebSockets.java index 11e97fe1..2ec18417 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/utils/WebSockets.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/utils/WebSockets.java @@ -23,6 +23,19 @@ public class WebSockets { private WebSockets() { } + /** + * 获取属性 + * + * @param channel channel + * @param attr attr + * @param T + * @return T + */ + @SuppressWarnings("unchecked") + public static E getAttr(WebSocketSession channel, String attr) { + return (E) channel.getAttributes().get(attr); + } + /** * 发送消息 忽略并发报错 * diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostTerminalOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostTerminalOperatorType.java index 1f68109f..11ea7a86 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostTerminalOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostTerminalOperatorType.java @@ -4,7 +4,7 @@ import com.orion.ops.framework.biz.operator.log.core.annotation.Module; import com.orion.ops.framework.biz.operator.log.core.factory.InitializingOperatorTypes; import com.orion.ops.framework.biz.operator.log.core.model.OperatorType; -import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.L; +import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.*; /** * 主机终端 操作日志类型 @@ -18,10 +18,37 @@ public class HostTerminalOperatorType extends InitializingOperatorTypes { public static final String CONNECT = "host-terminal:connect"; + public static final String SFTP_MKDIR = "host-terminal:sftp-mkdir"; + + public static final String SFTP_TOUCH = "host-terminal:sftp-touch"; + + public static final String SFTP_MOVE = "host-terminal:sftp-move"; + + public static final String SFTP_REMOVE = "host-terminal:sftp-remove"; + + public static final String SFTP_TRUNCATE = "host-terminal:sftp-truncate"; + + public static final String SFTP_CHMOD = "host-terminal:sftp-chmod"; + + public static final String SFTP_SET_CONTENT = "host-terminal:sftp-set-content"; + + public static final String SFTP_UPLOAD = "host-terminal:sftp-upload"; + + public static final String SFTP_DOWNLOAD = "host-terminal:sftp-download"; + @Override public OperatorType[] types() { return new OperatorType[]{ - new OperatorType(L, CONNECT, "连接主机终端 ${name}"), + new OperatorType(L, CONNECT, "连接主机 ${connectType} ${hostName}"), + new OperatorType(L, SFTP_MKDIR, "创建文件夹 ${hostName} ${path}"), + new OperatorType(L, SFTP_TOUCH, "创建文件 ${hostName} ${path}"), + new OperatorType(M, SFTP_MOVE, "移动文件 ${hostName} ${path}${target}"), + new OperatorType(H, SFTP_REMOVE, "删除文件 ${hostName} ${path}"), + new OperatorType(H, SFTP_TRUNCATE, "截断文件 ${hostName} ${path}"), + new OperatorType(M, SFTP_CHMOD, "文件提权 ${hostName} ${path} ${mod}"), + new OperatorType(M, SFTP_SET_CONTENT, "修改文件内容 ${hostName} ${path}"), + new OperatorType(M, SFTP_UPLOAD, "上传文件 ${hostName} ${path}"), + new OperatorType(M, SFTP_DOWNLOAD, "下载文件 ${hostName} ${path}"), }; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java index 6ad75398..57859e22 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java @@ -53,7 +53,7 @@ public class TerminalMessageDispatcher extends AbstractWebSocketHandler { @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { String id = session.getId(); - log.info("TerminalMessageDispatcher-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason()); + log.info("TerminalMessageDispatcher-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason()); // 关闭会话 terminalManager.closeAll(id); } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java index 0c5a3c60..d903e666 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java @@ -1,14 +1,21 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; import com.orion.lang.exception.argument.InvalidArgumentException; +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.framework.common.constant.ErrorMessage; import com.orion.ops.framework.websocket.core.utils.WebSockets; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.manager.TerminalManager; import com.orion.ops.module.asset.handler.host.terminal.model.TerminalBasePayload; +import com.orion.ops.module.asset.handler.host.terminal.model.TerminalConfig; +import com.orion.ops.module.asset.handler.host.terminal.session.ITerminalSession; +import com.orion.ops.module.asset.handler.host.terminal.utils.TerminalUtils; import org.springframework.web.socket.WebSocketSession; import javax.annotation.Resource; +import java.util.Map; /** * 终端消息处理器 基类 @@ -22,6 +29,9 @@ public abstract class AbstractTerminalHandler imp @Resource protected TerminalManager terminalManager; + @Resource + private OperatorLogFrameworkService operatorLogFrameworkService; + /** * 发送消息 * @@ -47,16 +57,37 @@ public abstract class AbstractTerminalHandler imp } /** - * 获取属性 + * 保存操作日志 * - * @param channel channel - * @param attr attr - * @param T - * @return T + * @param payload payload + * @param channel channel + * @param extra extra + * @param type type + * @param startTime startTime + * @param ex ex */ - @SuppressWarnings("unchecked") - protected E getAttr(WebSocketSession channel, String attr) { - return (E) channel.getAttributes().get(attr); + protected void saveOperatorLog(T payload, + WebSocketSession channel, + Map extra, + String type, + long startTime, + Exception ex) { + String channelId = channel.getId(); + String sessionId = payload.getSessionId(); + // 获取会话并且设置参数 + ITerminalSession session = terminalManager.getSession(channelId, sessionId); + if (session != null) { + TerminalConfig config = session.getConfig(); + extra.put(OperatorLogs.HOST_ID, config.getHostId()); + extra.put(OperatorLogs.HOST_NAME, config.getHostName()); + extra.put(OperatorLogs.ADDRESS, config.getAddress()); + } + extra.put(OperatorLogs.CHANNEL_ID, channelId); + extra.put(OperatorLogs.SESSION_ID, sessionId); + // 获取日志 + OperatorLogModel model = TerminalUtils.getOperatorLogModel(channel, extra, type, startTime, ex); + // 保存 + operatorLogFrameworkService.insert(model); } /** diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpChangeModHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpChangeModHandler.java index f769198c..9e66227f 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpChangeModHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpChangeModHandler.java @@ -1,6 +1,9 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; +import com.orion.lang.utils.collect.Maps; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.enums.BooleanBit; +import com.orion.ops.module.asset.define.operator.HostTerminalOperatorType; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.request.SftpChangeModRequest; import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpBaseResponse; @@ -9,6 +12,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; +import java.util.Map; + /** * sftp 修改文件权限 * @@ -22,27 +27,37 @@ public class SftpChangeModHandler extends AbstractTerminalHandler extra = Maps.newMap(); + extra.put(OperatorLogs.PATH, path); + extra.put(OperatorLogs.MOD, mod); + this.saveOperatorLog(payload, channel, + extra, HostTerminalOperatorType.SFTP_CHMOD, + startTime, ex); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadFlatDirectoryHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadFlatDirectoryHandler.java index 98a81ef6..64d98800 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadFlatDirectoryHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadFlatDirectoryHandler.java @@ -29,23 +29,25 @@ public class SftpDownloadFlatDirectoryHandler extends AbstractTerminalHandler files = Lists.empty(); // 展开文件夹内的全部文件 try { files = session.flatDirectory(paths); + log.info("SftpDownloadFlatDirectoryHandler-handle success sessionId: {}, paths: {}", sessionId, Arrays.toString(paths)); } catch (Exception e) { - log.error("SftpDownloadFlatDirectoryHandler-handle error", e); + log.error("SftpDownloadFlatDirectoryHandler-handle error sessionId: {}", sessionId, e); ex = e; } // 返回 this.send(channel, OutputTypeEnum.SFTP_DOWNLOAD_FLAT_DIRECTORY, SftpDownloadFlatDirectoryResponse.builder() - .sessionId(payload.getSessionId()) + .sessionId(sessionId) .currentPath(payload.getCurrentPath()) .body(JSON.toJSONString(files)) .result(BooleanBit.of(ex == null).getValue()) diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpGetContentHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpGetContentHandler.java index dc2408d4..ce1e716f 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpGetContentHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpGetContentHandler.java @@ -23,23 +23,25 @@ public class SftpGetContentHandler extends AbstractTerminalHandler { @Override public void handle(WebSocketSession channel, SftpListRequest payload) { // 获取会话 - ISftpSession session = terminalManager.getSession(channel.getId(), payload.getSessionId()); + String sessionId = payload.getSessionId(); + ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); String path = payload.getPath(); - log.info("SftpListHandler-handle session: {}, path: {}", payload.getSessionId(), path); + log.info("SftpListHandler-handle start sessionId: {}, path: {}", sessionId, path); Exception ex = null; - List list = null; + List list = Lists.empty(); try { // 空目录则直接获取 home 目录 if (Strings.isBlank(path)) { @@ -40,18 +42,19 @@ public class SftpListHandler extends AbstractTerminalHandler { } // 文件列表 list = session.list(path, BooleanBit.toBoolean(payload.getShowHiddenFile())); + log.info("SftpListHandler-handle success sessionId: {}, path: {}", sessionId, path); } catch (Exception e) { - log.error("SftpListHandler-handle error", e); + log.error("SftpListHandler-handle error sessionId: {}", sessionId, e); ex = e; } // 返回 this.send(channel, OutputTypeEnum.SFTP_LIST, SftpListResponse.builder() - .sessionId(payload.getSessionId()) + .sessionId(sessionId) .result(BooleanBit.of(ex == null).getValue()) .path(path) - .body(list == null ? null : JSON.toJSONString(list)) + .body(JSON.toJSONString(list)) .build()); } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpMakeDirectoryHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpMakeDirectoryHandler.java index e7dac190..3ff07bae 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpMakeDirectoryHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpMakeDirectoryHandler.java @@ -1,6 +1,9 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; +import com.orion.lang.utils.collect.Maps; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.enums.BooleanBit; +import com.orion.ops.module.asset.define.operator.HostTerminalOperatorType; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.request.SftpBaseRequest; import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpBaseResponse; @@ -9,6 +12,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; +import java.util.Map; + /** * sftp 创建文件夹 * @@ -22,26 +27,35 @@ public class SftpMakeDirectoryHandler extends AbstractTerminalHandler extra = Maps.newMap(); + extra.put(OperatorLogs.PATH, path); + this.saveOperatorLog(payload, channel, + extra, HostTerminalOperatorType.SFTP_MKDIR, + startTime, ex); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpMoveHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpMoveHandler.java index 5ef32c72..10d1c04d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpMoveHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpMoveHandler.java @@ -1,6 +1,9 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; +import com.orion.lang.utils.collect.Maps; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.enums.BooleanBit; +import com.orion.ops.module.asset.define.operator.HostTerminalOperatorType; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.request.SftpMoveRequest; import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpBaseResponse; @@ -9,6 +12,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; +import java.util.Map; + /** * sftp 移动文件 * @@ -22,27 +27,37 @@ public class SftpMoveHandler extends AbstractTerminalHandler { @Override public void handle(WebSocketSession channel, SftpMoveRequest payload) { + long startTime = System.currentTimeMillis(); // 获取会话 - ISftpSession session = terminalManager.getSession(channel.getId(), payload.getSessionId()); + String sessionId = payload.getSessionId(); + ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); String path = payload.getPath(); String target = payload.getTarget(); - log.info("SftpMoveHandler-handle session: {}, path: {}, target: {}", payload.getSessionId(), path, target); + log.info("SftpMoveHandler-handle start sessionId: {}, path: {}, target: {}", sessionId, path, target); Exception ex = null; // 移动 try { session.move(path, target); + log.info("SftpMoveHandler-handle success sessionId: {}, path: {}, target: {}", sessionId, path, target); } catch (Exception e) { - log.error("SftpMoveHandler-handle error", e); + log.error("SftpMoveHandler-handle error sessionId: {}", sessionId, e); ex = e; } // 返回 this.send(channel, OutputTypeEnum.SFTP_MOVE, SftpBaseResponse.builder() - .sessionId(payload.getSessionId()) + .sessionId(sessionId) .result(BooleanBit.of(ex == null).getValue()) .msg(this.getErrorMessage(ex)) .build()); + // 保存操作日志 + Map extra = Maps.newMap(); + extra.put(OperatorLogs.PATH, path); + extra.put(OperatorLogs.TARGET, target); + this.saveOperatorLog(payload, channel, + extra, HostTerminalOperatorType.SFTP_MOVE, + startTime, ex); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpRemoveHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpRemoveHandler.java index dd34158b..5e9a603b 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpRemoveHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpRemoveHandler.java @@ -1,6 +1,10 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; +import com.orion.lang.utils.collect.Maps; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; +import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.common.enums.BooleanBit; +import com.orion.ops.module.asset.define.operator.HostTerminalOperatorType; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.request.SftpBaseRequest; import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpBaseResponse; @@ -10,6 +14,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; import java.util.Arrays; +import java.util.Map; /** * sftp 删除文件 @@ -24,26 +29,35 @@ public class SftpRemoveHandler extends AbstractTerminalHandler @Override public void handle(WebSocketSession channel, SftpBaseRequest payload) { + long startTime = System.currentTimeMillis(); // 获取会话 - ISftpSession session = terminalManager.getSession(channel.getId(), payload.getSessionId()); + String sessionId = payload.getSessionId(); + ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); String[] paths = payload.getPath().split("\\|"); - log.info("SftpRemoveHandler-handle session: {}, path: {}", payload.getSessionId(), Arrays.toString(paths)); + log.info("SftpRemoveHandler-handle start sessionId: {}, path: {}", sessionId, Arrays.toString(paths)); Exception ex = null; // 删除 try { session.remove(paths); + log.info("SftpRemoveHandler-handle success sessionId: {}, path: {}", sessionId, Arrays.toString(paths)); } catch (Exception e) { - log.error("SftpRemoveHandler-handle error", e); + log.error("SftpRemoveHandler-handle error sessionId: {}", sessionId, e); ex = e; } // 返回 this.send(channel, OutputTypeEnum.SFTP_REMOVE, SftpBaseResponse.builder() - .sessionId(payload.getSessionId()) + .sessionId(sessionId) .result(BooleanBit.of(ex == null).getValue()) .msg(this.getErrorMessage(ex)) .build()); + // 保存操作日志 + Map extra = Maps.newMap(); + extra.put(OperatorLogs.PATH, String.join(Const.COMMA, paths)); + this.saveOperatorLog(payload, channel, + extra, HostTerminalOperatorType.SFTP_REMOVE, + startTime, ex); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpSetContentHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpSetContentHandler.java index 5258c0f2..177170cb 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpSetContentHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpSetContentHandler.java @@ -1,6 +1,9 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; +import com.orion.lang.utils.collect.Maps; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.enums.BooleanBit; +import com.orion.ops.module.asset.define.operator.HostTerminalOperatorType; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.request.SftpSetContentRequest; import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpBaseResponse; @@ -9,6 +12,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; +import java.util.Map; + /** * sftp 设置文件内容 * @@ -22,26 +27,35 @@ public class SftpSetContentHandler extends AbstractTerminalHandler extra = Maps.newMap(); + extra.put(OperatorLogs.PATH, path); + this.saveOperatorLog(payload, channel, + extra, HostTerminalOperatorType.SFTP_SET_CONTENT, + startTime, ex); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpTouchHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpTouchHandler.java index 98e214c3..7604d5d8 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpTouchHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpTouchHandler.java @@ -1,6 +1,9 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; +import com.orion.lang.utils.collect.Maps; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.enums.BooleanBit; +import com.orion.ops.module.asset.define.operator.HostTerminalOperatorType; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.request.SftpBaseRequest; import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpBaseResponse; @@ -9,6 +12,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; +import java.util.Map; + /** * sftp 创建文件 * @@ -22,26 +27,35 @@ public class SftpTouchHandler extends AbstractTerminalHandler { @Override public void handle(WebSocketSession channel, SftpBaseRequest payload) { + long startTime = System.currentTimeMillis(); // 获取会话 - ISftpSession session = terminalManager.getSession(channel.getId(), payload.getSessionId()); + String sessionId = payload.getSessionId(); + ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); String path = payload.getPath(); - log.info("SftpTouchHandler-handle session: {}, path: {}", payload.getSessionId(), path); + log.info("SftpTouchHandler-handle start sessionId: {}, path: {}", sessionId, path); Exception ex = null; // 创建文件 try { session.touch(path); + log.info("SftpTouchHandler-handle success sessionId: {}, path: {}", sessionId, path); } catch (Exception e) { - log.error("SftpTouchHandler-handle error", e); + log.error("SftpTouchHandler-handle error sessionId: {}", sessionId, e); ex = e; } // 返回 this.send(channel, OutputTypeEnum.SFTP_TOUCH, SftpBaseResponse.builder() - .sessionId(payload.getSessionId()) + .sessionId(sessionId) .result(BooleanBit.of(ex == null).getValue()) .msg(this.getErrorMessage(ex)) .build()); + // 保存操作日志 + Map extra = Maps.newMap(); + extra.put(OperatorLogs.PATH, path); + this.saveOperatorLog(payload, channel, + extra, HostTerminalOperatorType.SFTP_TOUCH, + startTime, ex); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpTruncateHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpTruncateHandler.java index e4c13af4..e5f37a99 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpTruncateHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpTruncateHandler.java @@ -1,6 +1,9 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; +import com.orion.lang.utils.collect.Maps; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.enums.BooleanBit; +import com.orion.ops.module.asset.define.operator.HostTerminalOperatorType; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.request.SftpBaseRequest; import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpBaseResponse; @@ -9,6 +12,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; +import java.util.Map; + /** * sftp 截断文件 * @@ -22,26 +27,35 @@ public class SftpTruncateHandler extends AbstractTerminalHandler extra = Maps.newMap(); + extra.put(OperatorLogs.PATH, path); + this.saveOperatorLog(payload, channel, + extra, HostTerminalOperatorType.SFTP_TRUNCATE, + startTime, ex); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java index 77a0b1c1..3950c022 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java @@ -3,12 +3,13 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; import com.orion.lang.exception.argument.InvalidArgumentException; import com.orion.lang.utils.Exceptions; import com.orion.lang.utils.collect.Maps; +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.uitls.OperatorLogFiller; -import com.orion.ops.framework.biz.operator.log.core.uitls.OperatorLogs; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.constant.ExtraFieldConst; import com.orion.ops.framework.common.enums.BooleanBit; +import com.orion.ops.framework.websocket.core.utils.WebSockets; import com.orion.ops.module.asset.dao.HostDAO; import com.orion.ops.module.asset.define.operator.HostTerminalOperatorType; import com.orion.ops.module.asset.entity.domain.HostDO; @@ -20,6 +21,7 @@ import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.request.TerminalCheckRequest; import com.orion.ops.module.asset.handler.host.terminal.model.response.TerminalCheckResponse; import com.orion.ops.module.asset.handler.host.terminal.session.ITerminalSession; +import com.orion.ops.module.asset.handler.host.terminal.utils.TerminalUtils; import com.orion.ops.module.asset.service.HostConnectLogService; import com.orion.ops.module.asset.service.HostTerminalService; import lombok.extern.slf4j.Slf4j; @@ -55,7 +57,7 @@ public class TerminalCheckHandler extends AbstractTerminalHandler extra = Maps.newMap(); extra.put(OperatorLogs.ID, hostId); - extra.put(OperatorLogs.NAME, hostName); + extra.put(OperatorLogs.HOST_NAME, hostName); extra.put(OperatorLogs.CONNECT_TYPE, connectType.name()); extra.put(OperatorLogs.CHANNEL_ID, channel.getId()); extra.put(OperatorLogs.SESSION_ID, sessionId); // 日志参数 - OperatorLogFiller logModel = OperatorLogFiller.create() - // 填充用户信息 - .fillUserInfo(userId, username) - // 填充 traceId - .fillTraceId(this.getAttr(channel, ExtraFieldConst.TRACE_ID)) - // 填充请求留痕信息 - .fillIdentity(this.getAttr(channel, ExtraFieldConst.IDENTITY)) - // 填充使用时间 - .fillUsedTime(startTime) - // 填充结果信息 - .fillResult(null, ex) - // 填充拓展信息 - .fillExtra(extra) - // 填充日志 - .fillLogInfo(extra, HostTerminalOperatorType.CONNECT); + OperatorLogModel logModel = TerminalUtils.getOperatorLogModel(channel, extra, + HostTerminalOperatorType.CONNECT, startTime, ex); // 记录操作日志 - operatorLogFrameworkService.insert(logModel.get()); + operatorLogFrameworkService.insert(logModel); // 记录连接日志 HostConnectLogCreateRequest connectLog = HostConnectLogCreateRequest.builder() .userId(userId) diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCloseHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCloseHandler.java index f07bbd16..c51da5da 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCloseHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCloseHandler.java @@ -18,7 +18,7 @@ public class TerminalCloseHandler extends AbstractTerminalHandler extra, + String type, + long startTime, + Exception ex) { + // 日志参数 + return OperatorLogFiller.create() + // 填充用户信息 + .fillUserInfo(WebSockets.getAttr(channel, ExtraFieldConst.USER_ID), + WebSockets.getAttr(channel, ExtraFieldConst.USERNAME)) + // 填充 traceId + .fillTraceId(WebSockets.getAttr(channel, ExtraFieldConst.TRACE_ID)) + // 填充请求留痕信息 + .fillIdentity(WebSockets.getAttr(channel, ExtraFieldConst.IDENTITY)) + // 填充使用时间 + .fillUsedTime(startTime) + // 填充结果信息 + .fillResult(null, ex) + // 填充拓展信息 + .fillExtra(extra) + // 填充日志 + .fillLogInfo(extra, type) + .get(); + } + +} 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 f1b647df..9d90f4f6 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 @@ -54,9 +54,9 @@ public class TransferMessageDispatcher extends AbstractWebSocketHandler { @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { String id = session.getId(); + log.info("TransferMessageHandler-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason()); // 关闭会话 Streams.close(handlers.get(id)); - log.info("TransferMessageHandler-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason()); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/handler/TransferHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/handler/TransferHandler.java index da3ff2de..4a44285e 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/handler/TransferHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/handler/TransferHandler.java @@ -5,6 +5,7 @@ import com.orion.lang.utils.io.Streams; import com.orion.net.host.SessionStore; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.constant.ExtraFieldConst; +import com.orion.ops.framework.websocket.core.utils.WebSockets; import com.orion.ops.module.asset.entity.dto.HostTerminalConnectDTO; import com.orion.ops.module.asset.enums.HostConnectTypeEnum; import com.orion.ops.module.asset.handler.host.transfer.enums.TransferOperatorType; @@ -47,7 +48,7 @@ public class TransferHandler implements ITransferHandler { public TransferHandler(WebSocketSession channel) { this.channel = channel; - this.userId = (Long) channel.getAttributes().get(ExtraFieldConst.USER_ID); + this.userId = WebSockets.getAttr(channel, ExtraFieldConst.USER_ID); this.sessions = new ConcurrentHashMap<>(); } @@ -120,11 +121,12 @@ public class TransferHandler implements ITransferHandler { } session.init(); sessions.put(sessionKey, session); + log.info("TransferHandler.getAndInitSession success channelId: {}, hostId: {}", channel.getId(), hostId); } this.currentSession = session; return true; } catch (Exception e) { - log.error("TransferHandler.getAndInitSession error", e); + log.error("TransferHandler.getAndInitSession error channelId: {}", channel.getId(), e); // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.NEXT_TRANSFER, e); return false; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/TransferOperatorRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/TransferOperatorRequest.java index 1fab78be..c22e70e9 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/TransferOperatorRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/TransferOperatorRequest.java @@ -26,9 +26,6 @@ public class TransferOperatorRequest { @Schema(description = "type") private String type; - @Schema(description = "fileId") - private String fileId; - @Schema(description = "主机id") private Long hostId; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/TransferOperatorResponse.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/TransferOperatorResponse.java index a05223f1..b4463d0c 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/TransferOperatorResponse.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/model/TransferOperatorResponse.java @@ -23,9 +23,6 @@ public class TransferOperatorResponse { @Schema(description = "type") private String type; - @Schema(description = "fileId") - private String fileId; - @Schema(description = "主机id") private Long hostId; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/DownloadSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/DownloadSession.java index 4ad13f85..12b4b554 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/DownloadSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/transfer/session/DownloadSession.java @@ -8,6 +8,7 @@ import com.orion.net.host.sftp.SftpFile; import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.module.asset.define.AssetThreadPools; +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; import com.orion.ops.module.asset.handler.host.transfer.utils.TransferUtils; @@ -35,7 +36,11 @@ public class DownloadSession extends TransferHostSession implements IDownloadSes @Override public void startDownload(String path) { + String channelId = channel.getId(); try { + log.info("DownloadSession.startDownload open start channelId: {}, path: {}", channelId, path); + // 保存操作日志 + this.saveOperatorLog(HostTerminalOperatorType.SFTP_DOWNLOAD, path); // 检查连接 this.init(); // 检查文件是否存在 @@ -43,8 +48,9 @@ public class DownloadSession extends TransferHostSession implements IDownloadSes Valid.notNull(file, ErrorMessage.FILE_ABSENT); // 打开输入流 this.inputStream = executor.openInputStream(path); + log.info("DownloadSession.startDownload open success channelId: {}, path: {}", channelId, path); } catch (Exception e) { - log.error("DownloadSession.startDownload error", e); + log.error("DownloadSession.startDownload open error channelId: {}, path: {}", channelId, path, e); // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.DOWNLOAD_ERROR, e); return; @@ -59,9 +65,9 @@ public class DownloadSession extends TransferHostSession implements IDownloadSes while (this.inputStream != null && (len = this.inputStream.read(buffer)) != -1) { this.channel.sendMessage(new BinaryMessage(buffer, 0, len, true)); } - log.info("DownloadSession.startDownload finish"); + log.info("DownloadSession.download finish channelId: {}, path: {}", channelId, path); } catch (Exception e) { - log.error("DownloadSession.startDownload error", e); + log.error("DownloadSession.download error channelId: {}, path: {}", channelId, path, e); ex = e; } // 关闭等待 jsch 内部处理 @@ -79,21 +85,13 @@ public class DownloadSession extends TransferHostSession implements IDownloadSes @Override public void abortDownload() { - log.info("DownloadSession.abortDownload"); + log.info("DownloadSession.abortDownload channelId: {}", channel.getId()); // 关闭流 this.closeStream(); } @Override - public void close() { - this.closeStream(); - super.close(); - } - - /** - * 关闭流 - */ - private void closeStream() { + protected void closeStream() { // 关闭 inputStream 会被阻塞 ??..?? 只能关闭 executor Streams.close(this.executor); this.executor = null; 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 a88fbab8..b284422c 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,11 +1,19 @@ package com.orion.ops.module.asset.handler.host.transfer.session; +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.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.entity.dto.HostTerminalConnectDTO; +import com.orion.ops.module.asset.handler.host.terminal.utils.TerminalUtils; +import com.orion.spring.SpringHolder; import org.springframework.web.socket.WebSocketSession; +import java.util.Map; + /** * 主机传输会话实现 * @@ -43,8 +51,33 @@ public abstract class TransferHostSession implements ITransferHostSession { } } + /** + * 保存操作日志 + * + * @param type type + * @param path path + */ + protected void saveOperatorLog(String type, String path) { + // 设置参数 + Map extra = Maps.newMap(); + extra.put(OperatorLogs.PATH, path); + extra.put(OperatorLogs.HOST_ID, connectInfo.getHostId()); + extra.put(OperatorLogs.HOST_NAME, connectInfo.getHostName()); + extra.put(OperatorLogs.ADDRESS, connectInfo.getHostAddress()); + // 获取日志 + OperatorLogModel model = TerminalUtils.getOperatorLogModel(this.channel, extra, type, System.currentTimeMillis(), null); + // 保存 + SpringHolder.getBean(OperatorLogFrameworkService.class).insert(model); + } + + /** + * 关闭流 + */ + protected abstract void closeStream(); + @Override public void close() { + this.closeStream(); Streams.close(executor); Streams.close(sessionStore); } 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 893e000d..c9dcc3d5 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 @@ -4,6 +4,7 @@ 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; import com.orion.ops.module.asset.handler.host.transfer.utils.TransferUtils; @@ -31,7 +32,11 @@ public class UploadSession extends TransferHostSession implements IUploadSession @Override public void startUpload(String path) { + String channelId = channel.getId(); try { + log.info("UploadSession.startUpload start channelId: {}, path: {}", channelId, path); + // 保存操作日志 + this.saveOperatorLog(HostTerminalOperatorType.SFTP_UPLOAD, path); // 检查连接 this.init(); // 检查文件是否存在 @@ -44,8 +49,9 @@ public class UploadSession extends TransferHostSession implements IUploadSession this.outputStream = executor.openOutputStream(path); // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.UPLOAD_NEXT_BLOCK, null); + log.info("UploadSession.startUpload transfer channelId: {}, path: {}", channelId, path); } catch (Exception e) { - log.error("UploadSession.uploadStart error", e); + log.error("UploadSession.startUpload error channelId: {}, path: {}", channelId, path, e); this.closeStream(); // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.UPLOAD_ERROR, e); @@ -60,7 +66,7 @@ public class UploadSession extends TransferHostSession implements IUploadSession // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.UPLOAD_NEXT_BLOCK, null); } catch (IOException e) { - log.error("UploadSession.putContent error", e); + log.error("UploadSession.putContent error channelId: {}", channel.getId(), e); this.closeStream(); // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.UPLOAD_ERROR, e); @@ -69,7 +75,7 @@ public class UploadSession extends TransferHostSession implements IUploadSession @Override public void uploadFinish() { - log.info("UploadSession.uploadFinish"); + log.info("UploadSession.uploadFinish channelId: {}", channel.getId()); this.closeStream(); // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.UPLOAD_FINISH, null); @@ -77,22 +83,14 @@ public class UploadSession extends TransferHostSession implements IUploadSession @Override public void uploadError() { - log.error("UploadSession.uploadError"); + log.error("UploadSession.uploadError channelId: {}", channel.getId()); this.closeStream(); // 响应结果 TransferUtils.sendMessage(this.channel, TransferReceiverType.UPLOAD_ERROR, new InvalidArgumentException((String) null)); } @Override - public void close() { - this.closeStream(); - super.close(); - } - - /** - * 关闭流 - */ - private void closeStream() { + protected void closeStream() { // 关闭流 Streams.close(outputStream); this.outputStream = null; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/AssetDataGrantServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/AssetDataGrantServiceImpl.java index 44fde62c..35ea541a 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/AssetDataGrantServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/AssetDataGrantServiceImpl.java @@ -1,7 +1,7 @@ package com.orion.ops.module.asset.service.impl; import com.orion.lang.utils.collect.Lists; -import com.orion.ops.framework.biz.operator.log.core.uitls.OperatorLogs; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.utils.Valid; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConfigServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConfigServiceImpl.java index e2986beb..21977063 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConfigServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConfigServiceImpl.java @@ -1,6 +1,6 @@ package com.orion.ops.module.asset.service.impl; -import com.orion.ops.framework.biz.operator.log.core.uitls.OperatorLogs; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.enums.EnableStatus; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostIdentityServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostIdentityServiceImpl.java index 1fda1fa6..fc4d6279 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostIdentityServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostIdentityServiceImpl.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.orion.lang.define.wrapper.DataGrid; import com.orion.lang.utils.Strings; -import com.orion.ops.framework.biz.operator.log.core.uitls.OperatorLogs; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.security.PasswordModifier; import com.orion.ops.framework.common.utils.Valid; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostKeyServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostKeyServiceImpl.java index f340059f..b471e429 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostKeyServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostKeyServiceImpl.java @@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.orion.lang.define.wrapper.DataGrid; import com.orion.lang.utils.Strings; -import com.orion.ops.framework.biz.operator.log.core.uitls.OperatorLogs; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.security.PasswordModifier; import com.orion.ops.framework.common.utils.CryptoUtils; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostServiceImpl.java index 899c9cc7..e3f327ff 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostServiceImpl.java @@ -6,7 +6,7 @@ import com.orion.lang.define.wrapper.DataGrid; import com.orion.lang.utils.Booleans; import com.orion.lang.utils.Strings; import com.orion.lang.utils.collect.Lists; -import com.orion.ops.framework.biz.operator.log.core.uitls.OperatorLogs; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.redis.core.utils.RedisMaps; diff --git a/orion-ops-ui/src/hooks/copy.ts b/orion-ops-ui/src/hooks/copy.ts index 86feab58..71216091 100644 --- a/orion-ops-ui/src/hooks/copy.ts +++ b/orion-ops-ui/src/hooks/copy.ts @@ -1,26 +1,29 @@ import { useClipboard } from '@vueuse/core'; import { Message } from '@arco-design/web-vue'; -export default function useCopy() { - const { copy: c } = useClipboard(); - // 复制 - const copy = async (value: string | undefined, tips: string | boolean = `${value} 已复制`) => { - try { - if (!value) { - return; - } - await c(value); - if (tips) { - Message.success(tips as string); - } - } catch (e) { - Message.error('复制失败'); +const { copy: c } = useClipboard(); + +// 复制 +export const copy = async (value: string | undefined, tips: string | boolean = `${value} 已复制`) => { + try { + if (!value) { + return; } - }; - // 获取剪切板内容 - const readText = () => { - return navigator.clipboard.readText(); - }; + await c(value); + if (tips) { + Message.success(tips as string); + } + } catch (e) { + Message.error('复制失败'); + } +}; + +// 获取剪切板内容 +export const readText = () => { + return navigator.clipboard.readText(); +}; + +export default function useCopy() { return { copy, readText, diff --git a/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-table.vue b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-table.vue index 97c603e3..4523363f 100644 --- a/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-table.vue +++ b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-table.vue @@ -5,7 +5,7 @@ label-align="left" :itemOptions="{ 6: { span: 2 } }" @submit="fetchTableData" - @reset="fetchTableData" + @reset="resetTableData" @keyup.enter="() => fetchTableData()"> @@ -114,7 +114,7 @@ import { getHostConnectLogPage } from '@/api/asset/host-connect-log'; import useLoading from '@/hooks/loading'; import columns from '../types/table.columns'; - import { connectStatusKey, connectTypeKey } from '../types/const'; + import { connectStatusKey, connectTypeKey, HostConnectType } from '../types/const'; import { usePagination } from '@/types/table'; import { useDictStore } from '@/store'; import useCopy from '@/hooks/copy'; @@ -134,7 +134,7 @@ userId: undefined, hostId: undefined, hostAddress: undefined, - type: undefined, + type: HostConnectType.SSH, token: undefined, status: undefined, startTimeRange: undefined, @@ -155,6 +155,12 @@ } }; + // 重置 + const resetTableData = (page = 1, limit = pagination.pageSize, form = formModel) => { + formModel.type = HostConnectType.SSH; + doFetchTableData({ page, limit, ...form }); + }; + // 切换页码 const fetchTableData = (page = 1, limit = pagination.pageSize, form = formModel) => { doFetchTableData({ page, limit, ...form }); diff --git a/orion-ops-ui/src/views/host-audit/connect-log/types/const.ts b/orion-ops-ui/src/views/host-audit/connect-log/types/const.ts index 031e8534..6e620371 100644 --- a/orion-ops-ui/src/views/host-audit/connect-log/types/const.ts +++ b/orion-ops-ui/src/views/host-audit/connect-log/types/const.ts @@ -1,3 +1,9 @@ +// 主机连接类型 +export const HostConnectType = { + SSH: 'SSH', + SFTP: 'SFTP' +}; + // 主机连接状态 字典项 export const connectStatusKey = 'hostConnectStatus'; diff --git a/orion-ops-ui/src/views/host/terminal/handler/sftp-session.ts b/orion-ops-ui/src/views/host/terminal/handler/sftp-session.ts index 45213dbe..1f8fc23a 100644 --- a/orion-ops-ui/src/views/host/terminal/handler/sftp-session.ts +++ b/orion-ops-ui/src/views/host/terminal/handler/sftp-session.ts @@ -86,7 +86,7 @@ export default class SftpSession implements ISftpSession { remove(path: string[]) { Modal.confirm({ title: '删除确认', - content: `确定要删除 ${path} 吗? 确定后将立即删除且无法恢复!`, + content: `确定要删除 ${path.join(',')} 吗? 确定后将立即删除且无法恢复!`, onOk: () => { this.resolver.setLoading(true); this.channel.send(InputProtocol.SFTP_REMOVE, { diff --git a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts index 10f846c0..e38d1dc6 100644 --- a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts +++ b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts @@ -439,7 +439,6 @@ export interface SftpTransferItem { // 传输操作响应 export interface TransferOperatorResponse { type: string; - fileId?: string; hostId?: number; success: boolean; msg?: string; diff --git a/orion-ops-ui/src/views/user/info/index.vue b/orion-ops-ui/src/views/user/info/index.vue index 109a22d5..cafb3145 100644 --- a/orion-ops-ui/src/views/user/info/index.vue +++ b/orion-ops-ui/src/views/user/info/index.vue @@ -103,7 +103,7 @@