diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/HostConnectLogExtraDTO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/HostConnectLogExtraDTO.java index 44e3792d..b314e5cd 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/HostConnectLogExtraDTO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/HostConnectLogExtraDTO.java @@ -20,7 +20,7 @@ import lombok.NoArgsConstructor; @Schema(name = "HostConnectLogExtraDTO", description = "主机连接日志推展信息对象") public class HostConnectLogExtraDTO { - @Schema(description = "主机 id") + @Schema(description = "hostId") private Long hostId; @Schema(description = "主机名称") @@ -29,15 +29,15 @@ public class HostConnectLogExtraDTO { @Schema(description = "连接类型") private String connectType; + @Schema(description = "traceId") + private String traceId; + @Schema(description = "channelId") private String channelId; @Schema(description = "sessionId") private String sessionId; - @Schema(description = "traceId") - private String traceId; - @Schema(description = "请求地址") private String address; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConnectLogVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConnectLogVO.java index 32d0902f..58762711 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConnectLogVO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConnectLogVO.java @@ -1,5 +1,6 @@ package com.orion.ops.module.asset.entity.vo; +import com.orion.ops.module.asset.entity.dto.HostConnectLogExtraDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -8,7 +9,6 @@ import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.Date; -import java.util.Map; /** * 主机连接日志 视图响应对象 @@ -57,6 +57,6 @@ public class HostConnectLogVO implements Serializable { private Date endTime; @Schema(description = "额外信息") - private Map extra; + private HostConnectLogExtraDTO extra; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java index 0b7d4606..d4eba579 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java @@ -5,9 +5,11 @@ import com.orion.lang.exception.ConnectionRuntimeException; import com.orion.lang.exception.TimeoutException; import com.orion.lang.exception.argument.InvalidArgumentException; import com.orion.lang.utils.Exceptions; +import com.orion.lang.utils.collect.Maps; 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.common.enums.BooleanBit; import com.orion.ops.framework.websocket.core.utils.WebSockets; import com.orion.ops.module.asset.entity.dto.HostTerminalConnectDTO; @@ -28,6 +30,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; import javax.annotation.Resource; +import java.util.Map; /** * 连接主机处理器 @@ -74,7 +77,9 @@ public class TerminalConnectHandler extends AbstractTerminalHandler extra = Maps.newMap(4); + extra.put(ExtraFieldConst.ERROR_MESSAGE, this.getConnectErrorMessage(e)); + hostConnectLogService.updateStatusByToken(sessionId, HostConnectStatusEnum.FAILED, extra); } // 返回连接状态 this.send(channel, diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java index 6f2bd276..b02016f0 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java @@ -47,7 +47,8 @@ public abstract class TerminalSession implements ITerminalSession { // 检查并且关闭 if (this.checkAndClose()) { // 修改状态 - SpringHolder.getBean(HostConnectLogService.class).updateStatusByToken(sessionId, HostConnectStatusEnum.COMPLETE); + SpringHolder.getBean(HostConnectLogService.class) + .updateStatusByToken(sessionId, HostConnectStatusEnum.COMPLETE, null); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConnectLogService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConnectLogService.java index 795596dd..e1e34585 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConnectLogService.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConnectLogService.java @@ -8,6 +8,7 @@ import com.orion.ops.module.asset.enums.HostConnectStatusEnum; import com.orion.ops.module.asset.enums.HostConnectTypeEnum; import java.util.List; +import java.util.Map; import java.util.concurrent.Future; /** @@ -40,9 +41,10 @@ public interface HostConnectLogService { * * @param token token * @param status status + * @param extra extra * @return effect */ - Integer updateStatusByToken(String token, HostConnectStatusEnum status); + Integer updateStatusByToken(String token, HostConnectStatusEnum status, Map extra); /** * 查询用户最近连接的主机 diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConnectLogServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConnectLogServiceImpl.java index c4eafc94..91d5e7ef 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConnectLogServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConnectLogServiceImpl.java @@ -8,7 +8,6 @@ import com.orion.lang.utils.Arrays1; import com.orion.lang.utils.Valid; import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.constant.ErrorMessage; -import com.orion.ops.framework.mybatis.core.query.Conditions; import com.orion.ops.framework.security.core.utils.SecurityUtils; import com.orion.ops.module.asset.convert.HostConnectLogConvert; import com.orion.ops.module.asset.dao.HostConnectLogDAO; @@ -29,6 +28,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; @@ -73,18 +73,39 @@ public class HostConnectLogServiceImpl implements HostConnectLogService { .page(request) .dataGrid(s -> { HostConnectLogVO vo = HostConnectLogConvert.MAPPER.to(s); - vo.setExtra(JSON.parseObject(s.getExtraInfo())); + vo.setExtra(JSON.parseObject(s.getExtraInfo(), HostConnectLogExtraDTO.class)); return vo; }); } @Override - public Integer updateStatusByToken(String token, HostConnectStatusEnum status) { - log.info("HostConnectLogService-updateStatusByToken token: {}, status: {}", token, status); + public Integer updateStatusByToken(String token, HostConnectStatusEnum status, Map partial) { + log.info("HostConnectLogService-updateStatusByToken start token: {}, status: {}", token, status); + // 查询 + HostConnectLogDO record = hostConnectLogDAO.of() + .createWrapper() + .eq(HostConnectLogDO::getToken, token) + .then() + .getOne(); + if (record == null) { + log.info("HostConnectLogService-updateStatusByToken no record token: {}", token); + return Const.N_0; + } + // 更新 HostConnectLogDO update = new HostConnectLogDO(); + update.setId(record.getId()); update.setStatus(status.name()); update.setEndTime(new Date()); - return hostConnectLogDAO.update(update, Conditions.eq(HostConnectLogDO::getToken, token)); + if (partial != null) { + Map extra = JSON.parseObject(record.getExtraInfo()); + if (extra == null) { + extra = partial; + } else { + extra.putAll(partial); + } + update.setExtraInfo(JSON.toJSONString(extra)); + } + return hostConnectLogDAO.updateById(update); } @Override @@ -116,7 +137,6 @@ public class HostConnectLogServiceImpl implements HostConnectLogService { @Override public Integer clearHostConnectLog(HostConnectLogQueryRequest request) { - // TODO 测试一下参数 log.info("HostConnectLogService.clearHostConnectLog start {}", JSON.toJSONString(request)); // 删除 LambdaQueryWrapper wrapper = this.buildQueryWrapper(request); @@ -144,7 +164,7 @@ public class HostConnectLogServiceImpl implements HostConnectLogService { session.forceOffline(); } // 更新状态 - return this.updateStatusByToken(connect.getToken(), HostConnectStatusEnum.FORCE_OFFLINE); + return this.updateStatusByToken(connect.getToken(), HostConnectStatusEnum.FORCE_OFFLINE, null); } /** diff --git a/orion-ops-ui/src/api/asset/host-connect-log.ts b/orion-ops-ui/src/api/asset/host-connect-log.ts index e10e0e79..c539b4b6 100644 --- a/orion-ops-ui/src/api/asset/host-connect-log.ts +++ b/orion-ops-ui/src/api/asset/host-connect-log.ts @@ -32,7 +32,20 @@ export interface HostConnectLogQueryResponse extends TableData { status: string; startTime: number; endTime: number; - extra: Record; + extra: HostConnectLogExtra; +} + +/** + * 主机连接日志拓展对象 + */ +export interface HostConnectLogExtra { + traceId: string; + channelId: string; + sessionId: string; + address: string; + location: string; + userAgent: string; + errorMessage: string; } /** diff --git a/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-detail-drawer.vue b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-detail-drawer.vue index 3d330cf6..d94c4fdb 100644 --- a/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-detail-drawer.vue +++ b/orion-ops-ui/src/views/host-audit/connect-log/components/connect-log-detail-drawer.vue @@ -1,7 +1,7 @@ diff --git a/orion-ops-ui/src/views/user/operator-log/types/const.ts b/orion-ops-ui/src/views/user/operator-log/types/const.ts index ef0d1bd2..0b0c3a0b 100644 --- a/orion-ops-ui/src/views/user/operator-log/types/const.ts +++ b/orion-ops-ui/src/views/user/operator-log/types/const.ts @@ -1,3 +1,7 @@ +import type { OperatorLogQueryResponse } from '@/api/user/operator-log'; +import { pick } from 'lodash'; +import { dateFormat } from '@/utils'; + // 结果状态 export const ResultStatus = { // 失败 @@ -6,6 +10,23 @@ export const ResultStatus = { SUCCESS: 1, }; +// 获取日志详情 +export const getLogDetail = (record: OperatorLogQueryResponse): Record => { + try { + const detail = Object.assign({} as Record, + pick(record, 'traceId', 'address', 'location', + 'userAgent', 'errorMessage')); + detail.duration = `${record.duration} ms`; + detail.startTime = dateFormat(new Date(record.startTime)); + detail.endTime = dateFormat(new Date(record.endTime)); + detail.extra = record?.extra; + detail.returnValue = JSON.parse(record?.returnValue); + return detail; + } catch (e) { + return record; + } +}; + // 操作日志模块 字典项 export const operatorLogModuleKey = 'operatorLogModule'; diff --git a/orion-ops-ui/src/views/user/operator-log/types/table.columns.ts b/orion-ops-ui/src/views/user/operator-log/types/table.columns.ts index fdfb236d..1a2ff893 100644 --- a/orion-ops-ui/src/views/user/operator-log/types/table.columns.ts +++ b/orion-ops-ui/src/views/user/operator-log/types/table.columns.ts @@ -3,13 +3,6 @@ import { dateFormat } from '@/utils'; const columns = [ { - title: 'id', - dataIndex: 'id', - slotName: 'id', - width: 70, - align: 'left', - fixed: 'left', - }, { title: '操作用户', dataIndex: 'username', slotName: 'username', @@ -20,16 +13,7 @@ const columns = [ title: '操作模块', dataIndex: 'module', slotName: 'module', - width: 120, - ellipsis: true, - tooltip: true, - }, { - title: '操作类型', - dataIndex: 'type', - slotName: 'type', - width: 150, - ellipsis: true, - tooltip: true, + width: 214, }, { title: '风险等级', dataIndex: 'riskLevel', @@ -61,7 +45,7 @@ const columns = [ title: '操作', dataIndex: 'handle', slotName: 'handle', - width: 90, + width: 138, align: 'center', fixed: 'right', },