修改表名.

This commit is contained in:
lijiahang
2024-10-15 12:36:11 +08:00
parent 7ceb7e162a
commit 6306baa51a
44 changed files with 731 additions and 731 deletions

View File

@@ -197,8 +197,8 @@ app:
exec-log:
enabled: false
keep-period: 30
# 主机连接日志
host-connect-log:
# 终端连接日志
terminal-connect-log:
enabled: false
keep-period: 30

View File

@@ -1,117 +0,0 @@
/*
* Copyright (c) 2023 - present Jiahang Li (visor.orionsec.cn ljh1553488six@139.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orion.visor.module.asset.controller;
import com.orion.lang.define.wrapper.DataGrid;
import com.orion.visor.framework.biz.operator.log.core.annotation.OperatorLog;
import com.orion.visor.framework.common.validator.group.Id;
import com.orion.visor.framework.common.validator.group.Page;
import com.orion.visor.framework.log.core.annotation.IgnoreLog;
import com.orion.visor.framework.log.core.enums.IgnoreLogMode;
import com.orion.visor.framework.web.core.annotation.DemoDisableApi;
import com.orion.visor.framework.web.core.annotation.RestWrapper;
import com.orion.visor.module.asset.define.operator.HostConnectLogOperatorType;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogClearRequest;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogQueryRequest;
import com.orion.visor.module.asset.entity.vo.HostConnectLogVO;
import com.orion.visor.module.asset.service.HostConnectLogService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* 主机连接日志 api
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-12-26 22:09
*/
@Tag(name = "asset - 主机连接日志服务")
@Slf4j
@Validated
@RestWrapper
@RestController
@RequestMapping("/asset/host-connect-log")
public class HostConnectLogController {
@Resource
private HostConnectLogService hostConnectLogService;
@IgnoreLog(IgnoreLogMode.RET)
@PostMapping("/query")
@Operation(summary = "分页查询主机连接日志")
@PreAuthorize("@ss.hasPermission('asset:host-connect-log:management:query')")
public DataGrid<HostConnectLogVO> getHostConnectLogPage(@Validated(Page.class) @RequestBody HostConnectLogQueryRequest request) {
return hostConnectLogService.getHostConnectLogPage(request);
}
@PostMapping("/count")
@Operation(summary = "查询主机连接日志数量")
@PreAuthorize("@ss.hasPermission('asset:host-connect-log:management:query')")
public Long getHostConnectLogCount(@Validated @RequestBody HostConnectLogQueryRequest request) {
return hostConnectLogService.getHostConnectLogCount(request);
}
@IgnoreLog(IgnoreLogMode.RET)
@PostMapping("/session")
@Operation(summary = "查询全部主机连接会话")
@PreAuthorize("@ss.hasPermission('asset:host-connect-session:management:query')")
public List<HostConnectLogVO> getHostConnectSessions(@Validated @RequestBody HostConnectLogQueryRequest request) {
return hostConnectLogService.getHostConnectSessions(request);
}
@IgnoreLog(IgnoreLogMode.RET)
@PostMapping("/latest-connect")
@Operation(summary = "查询用户最近连接的主机")
public List<Long> getLatestConnectHostId(@RequestBody HostConnectLogQueryRequest request) {
return hostConnectLogService.getLatestConnectHostId(request);
}
@OperatorLog(HostConnectLogOperatorType.DELETE)
@DeleteMapping("/delete")
@Operation(summary = "删除主机连接日志")
@Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('asset:host-connect-log:management:delete')")
public Integer deleteHostConnectLog(@RequestParam("idList") List<Long> idList) {
return hostConnectLogService.deleteHostConnectLog(idList);
}
@OperatorLog(HostConnectLogOperatorType.CLEAR)
@PostMapping("/clear")
@Operation(summary = "清空主机连接日志")
@PreAuthorize("@ss.hasPermission('asset:host-connect-log:management:clear')")
public Integer clearHostConnectLog(@Validated @RequestBody HostConnectLogClearRequest request) {
return hostConnectLogService.clearHostConnectLog(request);
}
@DemoDisableApi
@OperatorLog(HostConnectLogOperatorType.FORCE_OFFLINE)
@PutMapping("/force-offline")
@Operation(summary = "强制断开主机连接")
@PreAuthorize("@ss.hasAnyPermission('asset:host-connect-log:management:force-offline', 'asset:host-connect-session:management:force-offline')")
public Integer forceOffline(@Validated(Id.class) @RequestBody HostConnectLogQueryRequest request) {
return hostConnectLogService.forceOffline(request);
}
}

View File

@@ -0,0 +1,117 @@
/*
* Copyright (c) 2023 - present Jiahang Li (visor.orionsec.cn ljh1553488six@139.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orion.visor.module.asset.controller;
import com.orion.lang.define.wrapper.DataGrid;
import com.orion.visor.framework.biz.operator.log.core.annotation.OperatorLog;
import com.orion.visor.framework.common.validator.group.Id;
import com.orion.visor.framework.common.validator.group.Page;
import com.orion.visor.framework.log.core.annotation.IgnoreLog;
import com.orion.visor.framework.log.core.enums.IgnoreLogMode;
import com.orion.visor.framework.web.core.annotation.DemoDisableApi;
import com.orion.visor.framework.web.core.annotation.RestWrapper;
import com.orion.visor.module.asset.define.operator.TerminalConnectLogOperatorType;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogClearRequest;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogQueryRequest;
import com.orion.visor.module.asset.entity.vo.TerminalConnectLogVO;
import com.orion.visor.module.asset.service.TerminalConnectLogService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* 终端连接日志 api
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-12-26 22:09
*/
@Tag(name = "asset - 终端连接日志服务")
@Slf4j
@Validated
@RestWrapper
@RestController
@RequestMapping("/asset/terminal-connect-log")
public class TerminalConnectLogController {
@Resource
private TerminalConnectLogService terminalConnectLogService;
@IgnoreLog(IgnoreLogMode.RET)
@PostMapping("/query")
@Operation(summary = "分页查询终端连接日志")
@PreAuthorize("@ss.hasPermission('asset:terminal-connect-log:management:query')")
public DataGrid<TerminalConnectLogVO> getTerminalConnectLogPage(@Validated(Page.class) @RequestBody TerminalConnectLogQueryRequest request) {
return terminalConnectLogService.getTerminalConnectLogPage(request);
}
@PostMapping("/count")
@Operation(summary = "查询终端连接日志数量")
@PreAuthorize("@ss.hasPermission('asset:terminal-connect-log:management:query')")
public Long getTerminalConnectLogCount(@Validated @RequestBody TerminalConnectLogQueryRequest request) {
return terminalConnectLogService.getTerminalConnectLogCount(request);
}
@IgnoreLog(IgnoreLogMode.RET)
@PostMapping("/session")
@Operation(summary = "查询全部终端连接会话")
@PreAuthorize("@ss.hasPermission('asset:terminal-connect-session:management:query')")
public List<TerminalConnectLogVO> getHostConnectSessions(@Validated @RequestBody TerminalConnectLogQueryRequest request) {
return terminalConnectLogService.getTerminalConnectSessions(request);
}
@IgnoreLog(IgnoreLogMode.RET)
@PostMapping("/latest-connect")
@Operation(summary = "查询用户最近连接的主机")
public List<Long> getLatestConnectHostId(@RequestBody TerminalConnectLogQueryRequest request) {
return terminalConnectLogService.getLatestConnectHostId(request);
}
@OperatorLog(TerminalConnectLogOperatorType.DELETE)
@DeleteMapping("/delete")
@Operation(summary = "删除终端连接日志")
@Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('asset:terminal-connect-log:management:delete')")
public Integer deleteTerminalConnectLog(@RequestParam("idList") List<Long> idList) {
return terminalConnectLogService.deleteTerminalConnectLog(idList);
}
@OperatorLog(TerminalConnectLogOperatorType.CLEAR)
@PostMapping("/clear")
@Operation(summary = "清空终端连接日志")
@PreAuthorize("@ss.hasPermission('asset:terminal-connect-log:management:clear')")
public Integer clearTerminalConnectLog(@Validated @RequestBody TerminalConnectLogClearRequest request) {
return terminalConnectLogService.clearTerminalConnectLog(request);
}
@DemoDisableApi
@OperatorLog(TerminalConnectLogOperatorType.FORCE_OFFLINE)
@PutMapping("/force-offline")
@Operation(summary = "强制断开终端连接")
@PreAuthorize("@ss.hasAnyPermission('asset:terminal-connect-log:management:force-offline', 'asset:terminal-connect-session:management:force-offline')")
public Integer forceOffline(@Validated(Id.class) @RequestBody TerminalConnectLogQueryRequest request) {
return terminalConnectLogService.forceOffline(request);
}
}

View File

@@ -15,36 +15,36 @@
*/
package com.orion.visor.module.asset.convert;
import com.orion.visor.module.asset.entity.domain.HostConnectLogDO;
import com.orion.visor.module.asset.entity.domain.TerminalConnectLogDO;
import com.orion.visor.module.asset.entity.dto.HostTerminalConnectDTO;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogCreateRequest;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogQueryRequest;
import com.orion.visor.module.asset.entity.vo.HostConnectLogVO;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogCreateRequest;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogQueryRequest;
import com.orion.visor.module.asset.entity.vo.TerminalConnectLogVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 主机连接日志 内部对象转换器
* 终端连接日志 内部对象转换器
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-12-26 22:09
*/
@Mapper
public interface HostConnectLogConvert {
public interface TerminalConnectLogConvert {
HostConnectLogConvert MAPPER = Mappers.getMapper(HostConnectLogConvert.class);
TerminalConnectLogConvert MAPPER = Mappers.getMapper(TerminalConnectLogConvert.class);
HostConnectLogDO to(HostConnectLogCreateRequest request);
TerminalConnectLogDO to(TerminalConnectLogCreateRequest request);
HostConnectLogDO to(HostConnectLogQueryRequest request);
TerminalConnectLogDO to(TerminalConnectLogQueryRequest request);
HostConnectLogVO to(HostConnectLogDO domain);
TerminalConnectLogVO to(TerminalConnectLogDO domain);
HostConnectLogCreateRequest to(HostTerminalConnectDTO dto);
TerminalConnectLogCreateRequest to(HostTerminalConnectDTO dto);
List<HostConnectLogVO> to(List<HostConnectLogDO> list);
List<TerminalConnectLogVO> to(List<TerminalConnectLogDO> list);
}

View File

@@ -16,21 +16,21 @@
package com.orion.visor.module.asset.dao;
import com.orion.visor.framework.mybatis.core.mapper.IMapper;
import com.orion.visor.module.asset.entity.domain.HostConnectLogDO;
import com.orion.visor.module.asset.entity.domain.TerminalConnectLogDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 主机连接日志 Mapper 接口
* 终端连接日志 Mapper 接口
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-12-26 22:09
*/
@Mapper
public interface HostConnectLogDAO extends IMapper<HostConnectLogDO> {
public interface TerminalConnectLogDAO extends IMapper<TerminalConnectLogDO> {
/**
* 查询最近连接的 hostId

View File

@@ -22,7 +22,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 主机连接日志自动清理配置
* 终端连接日志自动清理配置
*
* @author Jiahang Li
* @version 1.0.0
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
@Data
@Component
@EqualsAndHashCode(callSuper = true)
@ConfigurationProperties(prefix = "app.auto-clear.host-connect-log")
public class AppHostConnectLogAutoClearConfig extends AutoClearConfig {
@ConfigurationProperties(prefix = "app.auto-clear.terminal-connect-log")
public class AppTerminalConnectLogAutoClearConfig extends AutoClearConfig {
}

View File

@@ -23,27 +23,27 @@ import static com.orion.visor.framework.biz.operator.log.core.enums.OperatorRisk
import static com.orion.visor.framework.biz.operator.log.core.enums.OperatorRiskLevel.M;
/**
* 主机连接日志 操作日志类型
* 终端连接日志 操作日志类型
*
* @author Jiahang Li
* @version 1.0.0
* @since 2024/3/2 14:37
*/
@Module("asset:host-connect-log")
public class HostConnectLogOperatorType extends InitializingOperatorTypes {
@Module("asset:terminal-connect-log")
public class TerminalConnectLogOperatorType extends InitializingOperatorTypes {
public static final String DELETE = "host-connect-log:delete";
public static final String DELETE = "terminal-connect-log:delete";
public static final String CLEAR = "host-connect-log:clear";
public static final String CLEAR = "terminal-connect-log:clear";
public static final String FORCE_OFFLINE = "host-connect-log:force-offline";
public static final String FORCE_OFFLINE = "terminal-connect-log:force-offline";
@Override
public OperatorType[] types() {
return new OperatorType[]{
new OperatorType(H, DELETE, "删除主机连接记录 <sb>${count}</sb> 条"),
new OperatorType(H, CLEAR, "清空主机连接记录 <sb>${count}</sb> 条"),
new OperatorType(M, FORCE_OFFLINE, "强制下线主机连接 <sb>${hostName}</sb>"),
new OperatorType(H, DELETE, "删除终端连接记录 <sb>${count}</sb> 条"),
new OperatorType(H, CLEAR, "清空终端连接记录 <sb>${count}</sb> 条"),
new OperatorType(M, FORCE_OFFLINE, "强制下线终端连接 <sb>${hostName}</sb>"),
};
}

View File

@@ -26,7 +26,7 @@ import lombok.*;
import java.util.Date;
/**
* 主机连接日志 实体对象
* 终端连接日志 实体对象
*
* @author Jiahang Li
* @version 1.0.0
@@ -37,9 +37,9 @@ import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName(value = "host_connect_log", autoResultMap = true)
@Schema(name = "HostConnectLogDO", description = "主机连接日志 实体对象")
public class HostConnectLogDO extends BaseDO {
@TableName(value = "terminal_connect_log", autoResultMap = true)
@Schema(name = "TerminalConnectLogDO", description = "终端连接日志 实体对象")
public class TerminalConnectLogDO extends BaseDO {
private static final long serialVersionUID = 1L;

View File

@@ -22,7 +22,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 主机连接日志拓展信息对象
* 终端连接日志拓展信息对象
*
* @author Jiahang Li
* @version 1.0.0
@@ -32,8 +32,8 @@ import lombok.NoArgsConstructor;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "HostConnectLogExtraDTO", description = "主机连接日志拓展信息对象")
public class HostConnectLogExtraDTO {
@Schema(name = "TerminalConnectLogExtraDTO", description = "终端连接日志拓展信息对象")
public class TerminalConnectLogExtraDTO {
@Schema(description = "hostId")
private Long hostId;

View File

@@ -25,7 +25,7 @@ import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* 主机连接日志 清理请求对象
* 终端连接日志 清理请求对象
*
* @author Jiahang Li
* @version 1.0.0
@@ -33,8 +33,8 @@ import javax.validation.constraints.NotNull;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(name = "HostConnectLogClearRequest", description = "主机连接日志 清理请求对象")
public class HostConnectLogClearRequest extends HostConnectLogQueryRequest implements DataClearRequest {
@Schema(name = "TerminalConnectLogClearRequest", description = "终端连接日志 清理请求对象")
public class TerminalConnectLogClearRequest extends TerminalConnectLogQueryRequest implements DataClearRequest {
@NotNull
@Min(value = 1)

View File

@@ -25,7 +25,7 @@ import javax.validation.constraints.Size;
import java.util.Map;
/**
* 主机连接日志 创建请求对象
* 终端连接日志 创建请求对象
*
* @author Jiahang Li
* @version 1.0.0
@@ -35,8 +35,8 @@ import java.util.Map;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "HostConnectLogCreateRequest", description = "主机连接日志 创建请求对象")
public class HostConnectLogCreateRequest {
@Schema(name = "TerminalConnectLogCreateRequest", description = "终端连接日志 创建请求对象")
public class TerminalConnectLogCreateRequest {
@Schema(description = "用户id")
private Long userId;

View File

@@ -27,7 +27,7 @@ import java.util.Date;
import java.util.List;
/**
* 主机连接日志 查询请求对象
* 终端连接日志 查询请求对象
*
* @author Jiahang Li
* @version 1.0.0
@@ -38,8 +38,8 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Schema(name = "HostConnectLogQueryRequest", description = "主机连接日志 查询请求对象")
public class HostConnectLogQueryRequest extends PageRequest {
@Schema(name = "TerminalConnectLogQueryRequest", description = "终端连接日志 查询请求对象")
public class TerminalConnectLogQueryRequest extends PageRequest {
@NotNull(groups = Id.class)
@Schema(description = "id")

View File

@@ -15,7 +15,7 @@
*/
package com.orion.visor.module.asset.entity.vo;
import com.orion.visor.module.asset.entity.dto.HostConnectLogExtraDTO;
import com.orion.visor.module.asset.entity.dto.TerminalConnectLogExtraDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -26,7 +26,7 @@ import java.io.Serializable;
import java.util.Date;
/**
* 主机连接日志 视图响应对象
* 终端连接日志 视图响应对象
*
* @author Jiahang Li
* @version 1.0.0
@@ -36,8 +36,8 @@ import java.util.Date;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "HostConnectLogVO", description = "主机连接日志 视图响应对象")
public class HostConnectLogVO implements Serializable {
@Schema(name = "TerminalConnectLogVO", description = "终端连接日志 视图响应对象")
public class TerminalConnectLogVO implements Serializable {
private static final long serialVersionUID = 1L;
@@ -72,6 +72,6 @@ public class HostConnectLogVO implements Serializable {
private Date endTime;
@Schema(description = "额外信息")
private HostConnectLogExtraDTO extra;
private TerminalConnectLogExtraDTO extra;
}

View File

@@ -20,13 +20,13 @@ import com.orion.lang.utils.collect.Lists;
import java.util.List;
/**
* 主机连接状态
* 终端连接状态
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/26 22:27
*/
public enum HostConnectStatusEnum {
public enum TerminalConnectStatusEnum {
/**
* 连接中
@@ -52,11 +52,11 @@ public enum HostConnectStatusEnum {
public static final List<String> FINISH_STATUS_LIST = Lists.of(COMPLETE.name(), FAILED.name(), FORCE_OFFLINE.name());
public static HostConnectStatusEnum of(String type) {
public static TerminalConnectStatusEnum of(String type) {
if (type == null) {
return null;
}
for (HostConnectStatusEnum value : values()) {
for (TerminalConnectStatusEnum value : values()) {
if (value.name().equals(type)) {
return value;
}

View File

@@ -16,13 +16,13 @@
package com.orion.visor.module.asset.enums;
/**
* 主机连接类型
* 终端连接类型
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/26 22:27
*/
public enum HostConnectTypeEnum {
public enum TerminalConnectTypeEnum {
/**
* ssh
@@ -36,11 +36,11 @@ public enum HostConnectTypeEnum {
;
public static HostConnectTypeEnum of(String type) {
public static TerminalConnectTypeEnum of(String type) {
if (type == null) {
return null;
}
for (HostConnectTypeEnum value : values()) {
for (TerminalConnectTypeEnum value : values()) {
if (value.name().equalsIgnoreCase(type)) {
return value;
}

View File

@@ -35,7 +35,7 @@ import javax.annotation.PostConstruct;
public enum InputTypeEnum {
/**
* 主机连接检查
* 终端连接检查
*/
CHECK("ck",
TerminalCheckHandler.class,

View File

@@ -31,12 +31,12 @@ import lombok.Getter;
public enum OutputTypeEnum {
/**
* 主机连接检查
* 终端连接检查
*/
CHECK("ck", "${type}|${sessionId}|${result}|${msg}"),
/**
* 主机连接
* 终端连接
*/
CONNECT("co", "${type}|${sessionId}|${result}|${msg}"),

View File

@@ -28,19 +28,19 @@ import com.orion.visor.framework.common.enums.BooleanBit;
import com.orion.visor.framework.websocket.core.utils.WebSockets;
import com.orion.visor.module.asset.dao.HostDAO;
import com.orion.visor.module.asset.define.operator.HostTerminalOperatorType;
import com.orion.visor.module.asset.entity.domain.HostConnectLogDO;
import com.orion.visor.module.asset.entity.domain.TerminalConnectLogDO;
import com.orion.visor.module.asset.entity.domain.HostDO;
import com.orion.visor.module.asset.entity.dto.HostTerminalConnectDTO;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogCreateRequest;
import com.orion.visor.module.asset.enums.HostConnectStatusEnum;
import com.orion.visor.module.asset.enums.HostConnectTypeEnum;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogCreateRequest;
import com.orion.visor.module.asset.enums.TerminalConnectStatusEnum;
import com.orion.visor.module.asset.enums.TerminalConnectTypeEnum;
import com.orion.visor.module.asset.handler.host.terminal.constant.TerminalMessage;
import com.orion.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
import com.orion.visor.module.asset.handler.host.terminal.model.request.TerminalCheckRequest;
import com.orion.visor.module.asset.handler.host.terminal.model.response.TerminalCheckResponse;
import com.orion.visor.module.asset.handler.host.terminal.session.ITerminalSession;
import com.orion.visor.module.asset.handler.host.terminal.utils.TerminalUtils;
import com.orion.visor.module.asset.service.HostConnectLogService;
import com.orion.visor.module.asset.service.TerminalConnectLogService;
import com.orion.visor.module.asset.service.HostTerminalService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -50,7 +50,7 @@ import javax.annotation.Resource;
import java.util.Map;
/**
* 主机连接检查
* 终端连接检查
*
* @author Jiahang Li
* @version 1.0.0
@@ -67,7 +67,7 @@ public class TerminalCheckHandler extends AbstractTerminalHandler<TerminalCheckR
private HostTerminalService hostTerminalService;
@Resource
private HostConnectLogService hostConnectLogService;
private TerminalConnectLogService terminalConnectLogService;
@Resource
private OperatorLogFrameworkService operatorLogFrameworkService;
@@ -77,7 +77,7 @@ public class TerminalCheckHandler extends AbstractTerminalHandler<TerminalCheckR
Long hostId = payload.getHostId();
Long userId = WebSockets.getAttr(channel, ExtraFieldConst.USER_ID);
long startTime = System.currentTimeMillis();
HostConnectTypeEnum connectType = HostConnectTypeEnum.of(payload.getConnectType());
TerminalConnectTypeEnum connectType = TerminalConnectTypeEnum.of(payload.getConnectType());
String sessionId = payload.getSessionId();
log.info("TerminalCheckHandler-handle start userId: {}, hostId: {}, sessionId: {}", userId, hostId, sessionId);
// 检查 session 是否存在
@@ -111,7 +111,7 @@ public class TerminalCheckHandler extends AbstractTerminalHandler<TerminalCheckR
log.error("TerminalCheckHandler-handle exception userId: {}, hostId: {}, sessionId: {}", userId, hostId, sessionId, e);
}
// 记录主机日志
HostConnectLogDO connectLog = this.saveHostLog(channel, userId, host, startTime, ex, sessionId, connectType);
TerminalConnectLogDO connectLog = this.saveHostLog(channel, userId, host, startTime, ex, sessionId, connectType);
if (connect != null) {
connect.setLogId(connectLog.getId());
}
@@ -188,13 +188,13 @@ public class TerminalCheckHandler extends AbstractTerminalHandler<TerminalCheckR
* @param connectType connectType
* @return connectLog
*/
private HostConnectLogDO saveHostLog(WebSocketSession channel,
Long userId,
HostDO host,
long startTime,
Exception ex,
String sessionId,
HostConnectTypeEnum connectType) {
private TerminalConnectLogDO saveHostLog(WebSocketSession channel,
Long userId,
HostDO host,
long startTime,
Exception ex,
String sessionId,
TerminalConnectTypeEnum connectType) {
Long hostId = host.getId();
String hostName = host.getName();
String username = WebSockets.getAttr(channel, ExtraFieldConst.USERNAME);
@@ -211,13 +211,13 @@ public class TerminalCheckHandler extends AbstractTerminalHandler<TerminalCheckR
// 记录操作日志
operatorLogFrameworkService.insert(logModel);
// 记录连接日志
HostConnectLogCreateRequest connectLog = HostConnectLogCreateRequest.builder()
TerminalConnectLogCreateRequest connectLog = TerminalConnectLogCreateRequest.builder()
.userId(userId)
.username(username)
.hostId(hostId)
.hostName(hostName)
.hostAddress(host.getAddress())
.status(ex == null ? HostConnectStatusEnum.CONNECTING.name() : HostConnectStatusEnum.FAILED.name())
.status(ex == null ? TerminalConnectStatusEnum.CONNECTING.name() : TerminalConnectStatusEnum.FAILED.name())
.token(sessionId)
.extra(extra)
.build();
@@ -228,7 +228,7 @@ public class TerminalCheckHandler extends AbstractTerminalHandler<TerminalCheckR
extra.put(OperatorLogs.USER_AGENT, logModel.getUserAgent());
extra.put(OperatorLogs.ERROR_MESSAGE, logModel.getErrorMessage());
// 记录连接日志
return hostConnectLogService.create(connectType, connectLog);
return terminalConnectLogService.create(connectType, connectLog);
}
}

View File

@@ -27,8 +27,8 @@ import com.orion.visor.framework.common.constant.ExtraFieldConst;
import com.orion.visor.framework.common.enums.BooleanBit;
import com.orion.visor.framework.websocket.core.utils.WebSockets;
import com.orion.visor.module.asset.entity.dto.HostTerminalConnectDTO;
import com.orion.visor.module.asset.enums.HostConnectStatusEnum;
import com.orion.visor.module.asset.enums.HostConnectTypeEnum;
import com.orion.visor.module.asset.enums.TerminalConnectStatusEnum;
import com.orion.visor.module.asset.enums.TerminalConnectTypeEnum;
import com.orion.visor.module.asset.handler.host.jsch.SessionStores;
import com.orion.visor.module.asset.handler.host.terminal.constant.TerminalMessage;
import com.orion.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
@@ -38,7 +38,7 @@ import com.orion.visor.module.asset.handler.host.terminal.model.response.Termina
import com.orion.visor.module.asset.handler.host.terminal.session.ITerminalSession;
import com.orion.visor.module.asset.handler.host.terminal.session.SftpSession;
import com.orion.visor.module.asset.handler.host.terminal.session.SshSession;
import com.orion.visor.module.asset.service.HostConnectLogService;
import com.orion.visor.module.asset.service.TerminalConnectLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;
@@ -58,13 +58,13 @@ import java.util.Map;
public class TerminalConnectHandler extends AbstractTerminalHandler<TerminalConnectRequest> {
@Resource
private HostConnectLogService hostConnectLogService;
private TerminalConnectLogService terminalConnectLogService;
@Override
public void handle(WebSocketSession channel, TerminalConnectRequest payload) {
String sessionId = payload.getSessionId();
log.info("TerminalConnectHandler-handle start sessionId: {}", sessionId);
// 获取主机连接信息
// 获取终端连接信息
HostTerminalConnectDTO connect = WebSockets.getAttr(channel, sessionId);
if (connect == null) {
log.info("TerminalConnectHandler-handle unknown sessionId: {}", sessionId);
@@ -92,7 +92,7 @@ public class TerminalConnectHandler extends AbstractTerminalHandler<TerminalConn
// 修改连接状态为失败
Map<String, Object> extra = Maps.newMap(4);
extra.put(ExtraFieldConst.ERROR_MESSAGE, this.getConnectErrorMessage(e));
hostConnectLogService.updateStatusById(connect.getLogId(), HostConnectStatusEnum.FAILED, extra);
terminalConnectLogService.updateStatusById(connect.getLogId(), TerminalConnectStatusEnum.FAILED, extra);
}
// 返回连接状态
this.send(channel,
@@ -132,12 +132,12 @@ public class TerminalConnectHandler extends AbstractTerminalHandler<TerminalConn
.build();
// 建立连接
SessionStore sessionStore = SessionStores.openSessionStore(connect);
if (HostConnectTypeEnum.SSH.name().equals(connectType)) {
if (TerminalConnectTypeEnum.SSH.name().equals(connectType)) {
// 打开 ssh 会话
SshSession sshSession = new SshSession(sessionId, channel, sessionStore, config);
sshSession.connect(body.getTerminalType(), body.getCols(), body.getRows());
session = sshSession;
} else if (HostConnectTypeEnum.SFTP.name().equals(connectType)) {
} else if (TerminalConnectTypeEnum.SFTP.name().equals(connectType)) {
// 打开 sftp 会话
SftpSession sftpSession = new SftpSession(sessionId, channel, sessionStore, config);
sftpSession.connect();

View File

@@ -23,7 +23,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* 主机连接检查请求 实体对象
* 终端连接检查请求 实体对象
* <p>
* ck|eff00a1|1
*

View File

@@ -23,7 +23,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* 主机连接检查响应 实体对象
* 终端连接检查响应 实体对象
*
* @author Jiahang Li
* @version 1.0.0

View File

@@ -23,7 +23,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* 主机连接关闭响应 实体对象
* 终端连接关闭响应 实体对象
*
* @author Jiahang Li
* @version 1.0.0

View File

@@ -18,12 +18,12 @@ package com.orion.visor.module.asset.handler.host.terminal.session;
import com.orion.spring.SpringHolder;
import com.orion.visor.framework.common.enums.BooleanBit;
import com.orion.visor.framework.websocket.core.utils.WebSockets;
import com.orion.visor.module.asset.enums.HostConnectStatusEnum;
import com.orion.visor.module.asset.enums.TerminalConnectStatusEnum;
import com.orion.visor.module.asset.handler.host.terminal.constant.TerminalMessage;
import com.orion.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalConfig;
import com.orion.visor.module.asset.handler.host.terminal.model.response.TerminalCloseResponse;
import com.orion.visor.module.asset.service.HostConnectLogService;
import com.orion.visor.module.asset.service.TerminalConnectLogService;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.WebSocketSession;
@@ -83,8 +83,8 @@ public abstract class TerminalSession implements ITerminalSession {
// 检查并且关闭
if (this.checkAndClose()) {
// 修改状态
SpringHolder.getBean(HostConnectLogService.class)
.updateStatusById(config.getLogId(), HostConnectStatusEnum.COMPLETE, null);
SpringHolder.getBean(TerminalConnectLogService.class)
.updateStatusById(config.getLogId(), TerminalConnectStatusEnum.COMPLETE, null);
}
}

View File

@@ -26,7 +26,7 @@ import com.orion.visor.module.asset.handler.host.jsch.SessionStores;
import com.orion.visor.module.asset.handler.host.transfer.enums.TransferOperator;
import com.orion.visor.module.asset.handler.host.transfer.enums.TransferReceiver;
import com.orion.visor.module.asset.handler.host.transfer.enums.TransferType;
import com.orion.visor.module.asset.handler.host.transfer.model.HostConnection;
import com.orion.visor.module.asset.handler.host.transfer.model.TerminalConnection;
import com.orion.visor.module.asset.handler.host.transfer.model.TransferOperatorRequest;
import com.orion.visor.module.asset.handler.host.transfer.session.DownloadSession;
import com.orion.visor.module.asset.handler.host.transfer.session.ITransferSession;
@@ -56,12 +56,12 @@ public class TransferHandler implements ITransferHandler {
private final ConcurrentHashMap<String, ITransferSession> sessions;
private final ConcurrentHashMap<Long, HostConnection> hostConnections;
private final ConcurrentHashMap<Long, TerminalConnection> terminalConnections;
public TransferHandler(WebSocketSession channel) {
this.channel = channel;
this.sessions = new ConcurrentHashMap<>();
this.hostConnections = new ConcurrentHashMap<>();
this.terminalConnections = new ConcurrentHashMap<>();
}
@Override
@@ -105,17 +105,17 @@ public class TransferHandler implements ITransferHandler {
TransferType type = TransferType.of(payload.getType());
String sessionKey = hostId + "_" + type.getType();
try {
// 获取主机连接信息
HostConnection hostConnection = hostConnections.get(hostId);
if (hostConnection == null) {
// 获取主机连接信息
// 获取终端连接信息
TerminalConnection terminalConnection = terminalConnections.get(hostId);
if (terminalConnection == null) {
// 获取终端连接信息
Long userId = WebSockets.getAttr(channel, ExtraFieldConst.USER_ID);
HostTerminalConnectDTO connectInfo = hostTerminalService.getTerminalConnectInfo(userId, hostId);
hostConnection = new HostConnection(connectInfo, SessionStores.openSessionStore(connectInfo));
hostConnections.put(hostId, hostConnection);
terminalConnection = new TerminalConnection(connectInfo, SessionStores.openSessionStore(connectInfo));
terminalConnections.put(hostId, terminalConnection);
}
SessionStore sessionStore = hostConnection.getSessionStore();
HostTerminalConnectDTO connectInfo = hostConnection.getConnectInfo();
SessionStore sessionStore = terminalConnection.getSessionStore();
HostTerminalConnectDTO connectInfo = terminalConnection.getConnectInfo();
// 获取会话
ITransferSession session = sessions.get(sessionKey);
if (session == null) {

View File

@@ -23,7 +23,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 主机连接信息
* 终端连接信息
*
* @author Jiahang Li
* @version 1.0.0
@@ -33,7 +33,7 @@ import lombok.NoArgsConstructor;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HostConnection {
public class TerminalConnection {
/**
* connectInfo

View File

@@ -17,51 +17,51 @@ package com.orion.visor.module.asset.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.orion.lang.define.wrapper.DataGrid;
import com.orion.visor.module.asset.entity.domain.HostConnectLogDO;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogClearRequest;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogCreateRequest;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogQueryRequest;
import com.orion.visor.module.asset.entity.vo.HostConnectLogVO;
import com.orion.visor.module.asset.enums.HostConnectStatusEnum;
import com.orion.visor.module.asset.enums.HostConnectTypeEnum;
import com.orion.visor.module.asset.entity.domain.TerminalConnectLogDO;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogClearRequest;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogCreateRequest;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogQueryRequest;
import com.orion.visor.module.asset.entity.vo.TerminalConnectLogVO;
import com.orion.visor.module.asset.enums.TerminalConnectStatusEnum;
import com.orion.visor.module.asset.enums.TerminalConnectTypeEnum;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
/**
* 主机连接日志 服务类
* 终端连接日志 服务类
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-12-26 22:09
*/
public interface HostConnectLogService {
public interface TerminalConnectLogService {
/**
* 创建主机连接日志
* 创建终端连接日志
*
* @param type type
* @param request request
* @return record
*/
HostConnectLogDO create(HostConnectTypeEnum type, HostConnectLogCreateRequest request);
TerminalConnectLogDO create(TerminalConnectTypeEnum type, TerminalConnectLogCreateRequest request);
/**
* 分页查询主机连接日志
* 分页查询终端连接日志
*
* @param request request
* @return rows
*/
DataGrid<HostConnectLogVO> getHostConnectLogPage(HostConnectLogQueryRequest request);
DataGrid<TerminalConnectLogVO> getTerminalConnectLogPage(TerminalConnectLogQueryRequest request);
/**
* 分页查询主机连接会话
* 分页查询终端连接会话
*
* @param request request
* @return rows
*/
List<HostConnectLogVO> getHostConnectSessions(HostConnectLogQueryRequest request);
List<TerminalConnectLogVO> getTerminalConnectSessions(TerminalConnectLogQueryRequest request);
/**
* 更新连接状态
@@ -71,7 +71,7 @@ public interface HostConnectLogService {
* @param extra extra
* @return effect
*/
Integer updateStatusById(Long id, HostConnectStatusEnum status, Map<String, Object> extra);
Integer updateStatusById(Long id, TerminalConnectStatusEnum status, Map<String, Object> extra);
/**
* 查询用户最近连接的主机
@@ -79,7 +79,7 @@ public interface HostConnectLogService {
* @param request request
* @return hostId
*/
List<Long> getLatestConnectHostId(HostConnectLogQueryRequest request);
List<Long> getLatestConnectHostId(TerminalConnectLogQueryRequest request);
/**
* 查询用户最近连接的主机
@@ -88,39 +88,39 @@ public interface HostConnectLogService {
* @param userId userId
* @return hostId
*/
Future<List<Long>> getLatestConnectHostIdAsync(HostConnectTypeEnum type, Long userId);
Future<List<Long>> getLatestConnectHostIdAsync(TerminalConnectTypeEnum type, Long userId);
/**
* 删除主机连接日志
* 删除终端连接日志
*
* @param idList idList
* @return effect
*/
Integer deleteHostConnectLog(List<Long> idList);
Integer deleteTerminalConnectLog(List<Long> idList);
/**
* 获取主机连接日志数量
* 获取终端连接日志数量
*
* @param request request
* @return count
*/
Long getHostConnectLogCount(HostConnectLogQueryRequest request);
Long getTerminalConnectLogCount(TerminalConnectLogQueryRequest request);
/**
* 清空主机连接日志
* 清空终端连接日志
*
* @param request request
* @return effect
*/
Integer clearHostConnectLog(HostConnectLogClearRequest request);
Integer clearTerminalConnectLog(TerminalConnectLogClearRequest request);
/**
* 强制断开主机连接
* 强制断开终端连接
*
* @param request request
* @return effect
*/
Integer forceOffline(HostConnectLogQueryRequest request);
Integer forceOffline(TerminalConnectLogQueryRequest request);
/**
* 构建查询 wrapper
@@ -128,6 +128,6 @@ public interface HostConnectLogService {
* @param request request
* @return wrapper
*/
LambdaQueryWrapper<HostConnectLogDO> buildQueryWrapper(HostConnectLogQueryRequest request);
LambdaQueryWrapper<TerminalConnectLogDO> buildQueryWrapper(TerminalConnectLogQueryRequest request);
}

View File

@@ -26,7 +26,7 @@ import com.orion.visor.module.asset.convert.HostGroupConvert;
import com.orion.visor.module.asset.dao.HostDAO;
import com.orion.visor.module.asset.entity.request.asset.AssetAuthorizedDataQueryRequest;
import com.orion.visor.module.asset.entity.vo.*;
import com.orion.visor.module.asset.enums.HostConnectTypeEnum;
import com.orion.visor.module.asset.enums.TerminalConnectTypeEnum;
import com.orion.visor.module.asset.enums.HostExtraItemEnum;
import com.orion.visor.module.asset.enums.HostStatusEnum;
import com.orion.visor.module.asset.enums.HostTypeEnum;
@@ -79,7 +79,7 @@ public class AssetAuthorizedDataServiceImpl implements AssetAuthorizedDataServic
private HostIdentityService hostIdentityService;
@Resource
private HostConnectLogService hostConnectLogService;
private TerminalConnectLogService terminalConnectLogService;
@Resource
private FavoriteApi favoriteApi;
@@ -151,7 +151,7 @@ public class AssetAuthorizedDataServiceImpl implements AssetAuthorizedDataServic
// 查询我的收藏
Future<List<Long>> favoriteResult = favoriteApi.getFavoriteRelIdListAsync(FavoriteTypeEnum.HOST, userId);
// 查询最近连接的主机
Future<List<Long>> latestConnectHostIdList = hostConnectLogService.getLatestConnectHostIdAsync(HostConnectTypeEnum.of(type), userId);
Future<List<Long>> latestConnectHostIdList = terminalConnectLogService.getLatestConnectHostIdAsync(TerminalConnectTypeEnum.of(type), userId);
// 查询主机拓展信息
Future<Map<Long, String>> labelExtraResult = dataExtraApi.getExtraItemValuesByCacheAsync(userId,
DataExtraTypeEnum.HOST,

View File

@@ -1,275 +0,0 @@
/*
* Copyright (c) 2023 - present Jiahang Li (visor.orionsec.cn ljh1553488six@139.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orion.visor.module.asset.service.impl;
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.Arrays1;
import com.orion.lang.utils.collect.Lists;
import com.orion.visor.framework.biz.operator.log.core.utils.OperatorLogs;
import com.orion.visor.framework.common.constant.Const;
import com.orion.visor.framework.common.constant.ErrorMessage;
import com.orion.visor.framework.common.utils.SqlUtils;
import com.orion.visor.framework.common.utils.Valid;
import com.orion.visor.framework.security.core.utils.SecurityUtils;
import com.orion.visor.module.asset.convert.HostConnectLogConvert;
import com.orion.visor.module.asset.dao.HostConnectLogDAO;
import com.orion.visor.module.asset.entity.domain.HostConnectLogDO;
import com.orion.visor.module.asset.entity.dto.HostConnectLogExtraDTO;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogClearRequest;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogCreateRequest;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogQueryRequest;
import com.orion.visor.module.asset.entity.vo.HostConnectLogVO;
import com.orion.visor.module.asset.enums.HostConnectStatusEnum;
import com.orion.visor.module.asset.enums.HostConnectTypeEnum;
import com.orion.visor.module.asset.handler.host.terminal.manager.HostTerminalManager;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalConfig;
import com.orion.visor.module.asset.handler.host.terminal.session.ITerminalSession;
import com.orion.visor.module.asset.service.HostConnectLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
/**
* 主机连接日志 服务实现类
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-12-26 22:09
*/
@Slf4j
@Service
public class HostConnectLogServiceImpl implements HostConnectLogService {
@Resource
private HostConnectLogDAO hostConnectLogDAO;
@Resource
private HostTerminalManager hostTerminalManager;
@Override
public HostConnectLogDO create(HostConnectTypeEnum type, HostConnectLogCreateRequest request) {
HostConnectLogDO record = HostConnectLogConvert.MAPPER.to(request);
record.setType(type.name());
String status = request.getStatus();
record.setStatus(status);
record.setStartTime(new Date());
record.setExtraInfo(JSON.toJSONString(request.getExtra()));
// 失败直接设置结束时间
if (HostConnectStatusEnum.FAILED.name().equals(status)) {
record.setEndTime(new Date());
}
hostConnectLogDAO.insert(record);
return record;
}
@Override
public DataGrid<HostConnectLogVO> getHostConnectLogPage(HostConnectLogQueryRequest request) {
// 条件
LambdaQueryWrapper<HostConnectLogDO> wrapper = this.buildQueryWrapper(request)
.orderByDesc(HostConnectLogDO::getId);
// 查询
return hostConnectLogDAO.of(wrapper)
.page(request)
.dataGrid(s -> {
HostConnectLogVO vo = HostConnectLogConvert.MAPPER.to(s);
vo.setExtra(JSON.parseObject(s.getExtraInfo(), HostConnectLogExtraDTO.class));
return vo;
});
}
@Override
public List<HostConnectLogVO> getHostConnectSessions(HostConnectLogQueryRequest request) {
// 查询全部
List<Long> idList = hostTerminalManager.getChannelSessions()
.values()
.stream()
.map(ConcurrentHashMap::values)
.flatMap(Collection::stream)
.filter(s -> !s.isClosed())
.map(ITerminalSession::getConfig)
.filter(Objects::nonNull)
.map(TerminalConfig::getLogId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (idList.isEmpty()) {
return Lists.empty();
}
// 条件
request.setIdList(idList);
request.setStatus(HostConnectStatusEnum.CONNECTING.name());
LambdaQueryWrapper<HostConnectLogDO> wrapper = this.buildQueryWrapper(request)
.orderByDesc(HostConnectLogDO::getId);
// 查询
return hostConnectLogDAO.of(wrapper)
.list(s -> {
HostConnectLogVO vo = HostConnectLogConvert.MAPPER.to(s);
vo.setExtra(JSON.parseObject(s.getExtraInfo(), HostConnectLogExtraDTO.class));
return vo;
});
}
@Override
public Integer updateStatusById(Long id, HostConnectStatusEnum status, Map<String, Object> partial) {
log.info("HostConnectLogService-updateStatusById start id: {}, status: {}", id, status);
// 查询
HostConnectLogDO record = hostConnectLogDAO.of()
.createWrapper()
.eq(HostConnectLogDO::getId, id)
.orderByDesc(HostConnectLogDO::getId)
.then()
.getOne();
if (record == null) {
log.info("HostConnectLogService-updateStatusById no record id: {}", id);
return Const.N_0;
}
return this.updateStatus(record, status, partial);
}
/**
* 更新状态
*
* @param record record
* @param status status
* @param partial partial
* @return effect
*/
private int updateStatus(HostConnectLogDO record, HostConnectStatusEnum status, Map<String, Object> partial) {
// 更新
HostConnectLogDO update = new HostConnectLogDO();
update.setId(record.getId());
update.setStatus(status.name());
update.setEndTime(new Date());
if (partial != null) {
Map<String, Object> extra = JSON.parseObject(record.getExtraInfo());
if (extra == null) {
extra = partial;
} else {
extra.putAll(partial);
}
update.setExtraInfo(JSON.toJSONString(extra));
}
return hostConnectLogDAO.updateById(update);
}
@Override
public List<Long> getLatestConnectHostId(HostConnectLogQueryRequest request) {
return hostConnectLogDAO.selectLatestConnectHostId(SecurityUtils.getLoginUserId(), request.getType(), request.getLimit());
}
@Override
@Async("asyncExecutor")
public Future<List<Long>> getLatestConnectHostIdAsync(HostConnectTypeEnum type, Long userId) {
List<Long> hostIdList = hostConnectLogDAO.selectLatestConnectHostId(userId, type.name(), Const.N_10);
return CompletableFuture.completedFuture(hostIdList);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer deleteHostConnectLog(List<Long> idList) {
log.info("HostConnectLogService.deleteHostConnectLog start {}", JSON.toJSONString(idList));
if (Lists.isEmpty(idList)) {
OperatorLogs.add(OperatorLogs.COUNT, Const.N_0);
return Const.N_0;
}
// 删除日志表
int effect = hostConnectLogDAO.deleteBatchIds(idList);
log.info("HostConnectLogService.deleteHostConnectLog finish {}", effect);
// 设置日志参数
OperatorLogs.add(OperatorLogs.COUNT, effect);
return effect;
}
@Override
public Long getHostConnectLogCount(HostConnectLogQueryRequest request) {
// 条件
LambdaQueryWrapper<HostConnectLogDO> wrapper = this.buildQueryWrapper(request);
// 查询
return hostConnectLogDAO.of()
.wrapper(wrapper)
.countMax(request.getLimit());
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer clearHostConnectLog(HostConnectLogClearRequest request) {
log.info("HostConnectLogService.clearHostConnectLog start {}", JSON.toJSONString(request));
// 查询
LambdaQueryWrapper<HostConnectLogDO> wrapper = this.buildQueryWrapper(request)
.select(HostConnectLogDO::getId)
.orderByAsc(HostConnectLogDO::getId)
.last(SqlUtils.limit(request.getLimit()));
List<HostConnectLogDO> list = hostConnectLogDAO.selectList(wrapper);
if (list.isEmpty()) {
log.info("HostConnectLogService.clearHostConnectLog empty");
// 设置日志参数
OperatorLogs.add(OperatorLogs.COUNT, Const.N_0);
return Const.N_0;
}
// 删除
List<Long> idList = list.stream()
.map(HostConnectLogDO::getId)
.collect(Collectors.toList());
return this.deleteHostConnectLog(idList);
}
@Override
public Integer forceOffline(HostConnectLogQueryRequest request) {
Long id = request.getId();
// 查询数据是否存在
HostConnectLogDO record = hostConnectLogDAO.selectById(id);
Valid.notNull(record, ErrorMessage.LOG_ABSENT);
Valid.eq(record.getStatus(), HostConnectStatusEnum.CONNECTING.name(), ErrorMessage.ILLEGAL_STATUS);
// 设置日志参数
OperatorLogs.add(OperatorLogs.HOST_NAME, record.getHostName());
// 获取会话
HostConnectLogExtraDTO extra = JSON.parseObject(record.getExtraInfo(), HostConnectLogExtraDTO.class);
ITerminalSession session = hostTerminalManager.getSession(extra.getChannelId(), extra.getSessionId());
if (session != null) {
// 关闭会话
session.forceOffline();
}
// 更新状态
return this.updateStatus(record, HostConnectStatusEnum.FORCE_OFFLINE, null);
}
@Override
public LambdaQueryWrapper<HostConnectLogDO> buildQueryWrapper(HostConnectLogQueryRequest request) {
return hostConnectLogDAO.wrapper()
.eq(HostConnectLogDO::getId, request.getId())
.in(HostConnectLogDO::getId, request.getIdList())
.eq(HostConnectLogDO::getUserId, request.getUserId())
.eq(HostConnectLogDO::getHostId, request.getHostId())
.like(HostConnectLogDO::getHostAddress, request.getHostAddress())
.eq(HostConnectLogDO::getType, request.getType())
.like(HostConnectLogDO::getToken, request.getToken())
.eq(HostConnectLogDO::getStatus, request.getStatus())
.in(HostConnectLogDO::getStatus, request.getStatusList())
.ge(HostConnectLogDO::getStartTime, Arrays1.getIfPresent(request.getStartTimeRange(), 0))
.le(HostConnectLogDO::getStartTime, Arrays1.getIfPresent(request.getStartTimeRange(), 1))
.le(HostConnectLogDO::getCreateTime, request.getCreateTimeLe());
}
}

View File

@@ -52,7 +52,7 @@ import java.util.Optional;
import java.util.stream.Collectors;
/**
* 主机连接服务
* 终端连接服务
*
* @author Jiahang Li
* @version 1.0.0

View File

@@ -0,0 +1,275 @@
/*
* Copyright (c) 2023 - present Jiahang Li (visor.orionsec.cn ljh1553488six@139.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orion.visor.module.asset.service.impl;
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.Arrays1;
import com.orion.lang.utils.collect.Lists;
import com.orion.visor.framework.biz.operator.log.core.utils.OperatorLogs;
import com.orion.visor.framework.common.constant.Const;
import com.orion.visor.framework.common.constant.ErrorMessage;
import com.orion.visor.framework.common.utils.SqlUtils;
import com.orion.visor.framework.common.utils.Valid;
import com.orion.visor.framework.security.core.utils.SecurityUtils;
import com.orion.visor.module.asset.convert.TerminalConnectLogConvert;
import com.orion.visor.module.asset.dao.TerminalConnectLogDAO;
import com.orion.visor.module.asset.entity.domain.TerminalConnectLogDO;
import com.orion.visor.module.asset.entity.dto.TerminalConnectLogExtraDTO;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogClearRequest;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogCreateRequest;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogQueryRequest;
import com.orion.visor.module.asset.entity.vo.TerminalConnectLogVO;
import com.orion.visor.module.asset.enums.TerminalConnectStatusEnum;
import com.orion.visor.module.asset.enums.TerminalConnectTypeEnum;
import com.orion.visor.module.asset.handler.host.terminal.manager.HostTerminalManager;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalConfig;
import com.orion.visor.module.asset.handler.host.terminal.session.ITerminalSession;
import com.orion.visor.module.asset.service.TerminalConnectLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
/**
* 终端连接日志 服务实现类
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-12-26 22:09
*/
@Slf4j
@Service
public class TerminalConnectLogServiceImpl implements TerminalConnectLogService {
@Resource
private TerminalConnectLogDAO terminalConnectLogDAO;
@Resource
private HostTerminalManager hostTerminalManager;
@Override
public TerminalConnectLogDO create(TerminalConnectTypeEnum type, TerminalConnectLogCreateRequest request) {
TerminalConnectLogDO record = TerminalConnectLogConvert.MAPPER.to(request);
record.setType(type.name());
String status = request.getStatus();
record.setStatus(status);
record.setStartTime(new Date());
record.setExtraInfo(JSON.toJSONString(request.getExtra()));
// 失败直接设置结束时间
if (TerminalConnectStatusEnum.FAILED.name().equals(status)) {
record.setEndTime(new Date());
}
terminalConnectLogDAO.insert(record);
return record;
}
@Override
public DataGrid<TerminalConnectLogVO> getTerminalConnectLogPage(TerminalConnectLogQueryRequest request) {
// 条件
LambdaQueryWrapper<TerminalConnectLogDO> wrapper = this.buildQueryWrapper(request)
.orderByDesc(TerminalConnectLogDO::getId);
// 查询
return terminalConnectLogDAO.of(wrapper)
.page(request)
.dataGrid(s -> {
TerminalConnectLogVO vo = TerminalConnectLogConvert.MAPPER.to(s);
vo.setExtra(JSON.parseObject(s.getExtraInfo(), TerminalConnectLogExtraDTO.class));
return vo;
});
}
@Override
public List<TerminalConnectLogVO> getTerminalConnectSessions(TerminalConnectLogQueryRequest request) {
// 查询全部
List<Long> idList = hostTerminalManager.getChannelSessions()
.values()
.stream()
.map(ConcurrentHashMap::values)
.flatMap(Collection::stream)
.filter(s -> !s.isClosed())
.map(ITerminalSession::getConfig)
.filter(Objects::nonNull)
.map(TerminalConfig::getLogId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (idList.isEmpty()) {
return Lists.empty();
}
// 条件
request.setIdList(idList);
request.setStatus(TerminalConnectStatusEnum.CONNECTING.name());
LambdaQueryWrapper<TerminalConnectLogDO> wrapper = this.buildQueryWrapper(request)
.orderByDesc(TerminalConnectLogDO::getId);
// 查询
return terminalConnectLogDAO.of(wrapper)
.list(s -> {
TerminalConnectLogVO vo = TerminalConnectLogConvert.MAPPER.to(s);
vo.setExtra(JSON.parseObject(s.getExtraInfo(), TerminalConnectLogExtraDTO.class));
return vo;
});
}
@Override
public Integer updateStatusById(Long id, TerminalConnectStatusEnum status, Map<String, Object> partial) {
log.info("TerminalConnectLogService-updateStatusById start id: {}, status: {}", id, status);
// 查询
TerminalConnectLogDO record = terminalConnectLogDAO.of()
.createWrapper()
.eq(TerminalConnectLogDO::getId, id)
.orderByDesc(TerminalConnectLogDO::getId)
.then()
.getOne();
if (record == null) {
log.info("TerminalConnectLogService-updateStatusById no record id: {}", id);
return Const.N_0;
}
return this.updateStatus(record, status, partial);
}
/**
* 更新状态
*
* @param record record
* @param status status
* @param partial partial
* @return effect
*/
private int updateStatus(TerminalConnectLogDO record, TerminalConnectStatusEnum status, Map<String, Object> partial) {
// 更新
TerminalConnectLogDO update = new TerminalConnectLogDO();
update.setId(record.getId());
update.setStatus(status.name());
update.setEndTime(new Date());
if (partial != null) {
Map<String, Object> extra = JSON.parseObject(record.getExtraInfo());
if (extra == null) {
extra = partial;
} else {
extra.putAll(partial);
}
update.setExtraInfo(JSON.toJSONString(extra));
}
return terminalConnectLogDAO.updateById(update);
}
@Override
public List<Long> getLatestConnectHostId(TerminalConnectLogQueryRequest request) {
return terminalConnectLogDAO.selectLatestConnectHostId(SecurityUtils.getLoginUserId(), request.getType(), request.getLimit());
}
@Override
@Async("asyncExecutor")
public Future<List<Long>> getLatestConnectHostIdAsync(TerminalConnectTypeEnum type, Long userId) {
List<Long> hostIdList = terminalConnectLogDAO.selectLatestConnectHostId(userId, type.name(), Const.N_10);
return CompletableFuture.completedFuture(hostIdList);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer deleteTerminalConnectLog(List<Long> idList) {
log.info("TerminalConnectLogService.deleteTerminalConnectLog start {}", JSON.toJSONString(idList));
if (Lists.isEmpty(idList)) {
OperatorLogs.add(OperatorLogs.COUNT, Const.N_0);
return Const.N_0;
}
// 删除日志表
int effect = terminalConnectLogDAO.deleteBatchIds(idList);
log.info("TerminalConnectLogService.deleteTerminalConnectLog finish {}", effect);
// 设置日志参数
OperatorLogs.add(OperatorLogs.COUNT, effect);
return effect;
}
@Override
public Long getTerminalConnectLogCount(TerminalConnectLogQueryRequest request) {
// 条件
LambdaQueryWrapper<TerminalConnectLogDO> wrapper = this.buildQueryWrapper(request);
// 查询
return terminalConnectLogDAO.of()
.wrapper(wrapper)
.countMax(request.getLimit());
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer clearTerminalConnectLog(TerminalConnectLogClearRequest request) {
log.info("TerminalConnectLogService.clearTerminalConnectLog start {}", JSON.toJSONString(request));
// 查询
LambdaQueryWrapper<TerminalConnectLogDO> wrapper = this.buildQueryWrapper(request)
.select(TerminalConnectLogDO::getId)
.orderByAsc(TerminalConnectLogDO::getId)
.last(SqlUtils.limit(request.getLimit()));
List<TerminalConnectLogDO> list = terminalConnectLogDAO.selectList(wrapper);
if (list.isEmpty()) {
log.info("TerminalConnectLogService.clearTerminalConnectLog empty");
// 设置日志参数
OperatorLogs.add(OperatorLogs.COUNT, Const.N_0);
return Const.N_0;
}
// 删除
List<Long> idList = list.stream()
.map(TerminalConnectLogDO::getId)
.collect(Collectors.toList());
return this.deleteTerminalConnectLog(idList);
}
@Override
public Integer forceOffline(TerminalConnectLogQueryRequest request) {
Long id = request.getId();
// 查询数据是否存在
TerminalConnectLogDO record = terminalConnectLogDAO.selectById(id);
Valid.notNull(record, ErrorMessage.LOG_ABSENT);
Valid.eq(record.getStatus(), TerminalConnectStatusEnum.CONNECTING.name(), ErrorMessage.ILLEGAL_STATUS);
// 设置日志参数
OperatorLogs.add(OperatorLogs.HOST_NAME, record.getHostName());
// 获取会话
TerminalConnectLogExtraDTO extra = JSON.parseObject(record.getExtraInfo(), TerminalConnectLogExtraDTO.class);
ITerminalSession session = hostTerminalManager.getSession(extra.getChannelId(), extra.getSessionId());
if (session != null) {
// 关闭会话
session.forceOffline();
}
// 更新状态
return this.updateStatus(record, TerminalConnectStatusEnum.FORCE_OFFLINE, null);
}
@Override
public LambdaQueryWrapper<TerminalConnectLogDO> buildQueryWrapper(TerminalConnectLogQueryRequest request) {
return terminalConnectLogDAO.wrapper()
.eq(TerminalConnectLogDO::getId, request.getId())
.in(TerminalConnectLogDO::getId, request.getIdList())
.eq(TerminalConnectLogDO::getUserId, request.getUserId())
.eq(TerminalConnectLogDO::getHostId, request.getHostId())
.like(TerminalConnectLogDO::getHostAddress, request.getHostAddress())
.eq(TerminalConnectLogDO::getType, request.getType())
.like(TerminalConnectLogDO::getToken, request.getToken())
.eq(TerminalConnectLogDO::getStatus, request.getStatus())
.in(TerminalConnectLogDO::getStatus, request.getStatusList())
.ge(TerminalConnectLogDO::getStartTime, Arrays1.getIfPresent(request.getStartTimeRange(), 0))
.le(TerminalConnectLogDO::getStartTime, Arrays1.getIfPresent(request.getStartTimeRange(), 1))
.le(TerminalConnectLogDO::getCreateTime, request.getCreateTimeLe());
}
}

View File

@@ -17,10 +17,10 @@ package com.orion.visor.module.asset.task;
import com.orion.lang.utils.time.Dates;
import com.orion.visor.framework.common.utils.LockerUtils;
import com.orion.visor.module.asset.define.config.AppHostConnectLogAutoClearConfig;
import com.orion.visor.module.asset.entity.request.host.HostConnectLogClearRequest;
import com.orion.visor.module.asset.enums.HostConnectStatusEnum;
import com.orion.visor.module.asset.service.HostConnectLogService;
import com.orion.visor.module.asset.define.config.AppTerminalConnectLogAutoClearConfig;
import com.orion.visor.module.asset.entity.request.host.TerminalConnectLogClearRequest;
import com.orion.visor.module.asset.enums.TerminalConnectStatusEnum;
import com.orion.visor.module.asset.service.TerminalConnectLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
@@ -30,7 +30,7 @@ import javax.annotation.Resource;
import java.util.Date;
/**
* 主机连接日志自动清理
* 终端连接日志自动清理
*
* @author Jiahang Li
* @version 1.0.0
@@ -38,8 +38,8 @@ import java.util.Date;
*/
@Slf4j
@Component
@ConditionalOnProperty(value = "app.auto-clear.host-connect-log.enabled", havingValue = "true")
public class HostConnectLogAutoClearTask {
@ConditionalOnProperty(value = "app.auto-clear.terminal-connect-log.enabled", havingValue = "true")
public class TerminalConnectLogAutoClearTask {
/**
* 分布式锁名称
@@ -47,20 +47,20 @@ public class HostConnectLogAutoClearTask {
private static final String LOCK_KEY = "clear:hcl:lock";
@Resource
private AppHostConnectLogAutoClearConfig appHostConnectLogAutoClearConfig;
private AppTerminalConnectLogAutoClearConfig appTerminalConnectLogAutoClearConfig;
@Resource
private HostConnectLogService hostConnectLogService;
private TerminalConnectLogService terminalConnectLogService;
/**
* 清理
*/
@Scheduled(cron = "0 10 3 * * ?")
public void clear() {
log.info("HostConnectLogAutoClearTask.clear start");
log.info("TerminalConnectLogAutoClearTask.clear start");
// 获取锁并执行
LockerUtils.tryLock(LOCK_KEY, this::doClear);
log.info("HostConnectLogAutoClearTask.clear finish");
log.info("TerminalConnectLogAutoClearTask.clear finish");
}
/**
@@ -69,13 +69,13 @@ public class HostConnectLogAutoClearTask {
private void doClear() {
// 删除的时间区间
Date createLessEq = Dates.stream()
.subDay(appHostConnectLogAutoClearConfig.getKeepPeriod())
.subDay(appTerminalConnectLogAutoClearConfig.getKeepPeriod())
.date();
// 清理
HostConnectLogClearRequest request = new HostConnectLogClearRequest();
TerminalConnectLogClearRequest request = new TerminalConnectLogClearRequest();
request.setCreateTimeLe(createLessEq);
request.setStatusList(HostConnectStatusEnum.FINISH_STATUS_LIST);
hostConnectLogService.clearHostConnectLog(request);
request.setStatusList(TerminalConnectStatusEnum.FINISH_STATUS_LIST);
terminalConnectLogService.clearTerminalConnectLog(request);
}
}

View File

@@ -21,9 +21,9 @@
"sourceType": "com.orion.visor.module.asset.define.config.AppExecLogAutoClearConfig"
},
{
"name": "app.auto-clear.host-connect-log",
"type": "com.orion.visor.module.asset.define.config.AppHostConnectLogAutoClearConfig",
"sourceType": "com.orion.visor.module.asset.define.config.AppHostConnectLogAutoClearConfig"
"name": "app.auto-clear.terminal-connect-log",
"type": "com.orion.visor.module.asset.define.config.AppTerminalConnectLogAutoClearConfig",
"sourceType": "com.orion.visor.module.asset.define.config.AppTerminalConnectLogAutoClearConfig"
}
],
"properties": [
@@ -74,14 +74,14 @@
"description": "批量执行日志自动清理 保留周期 (天)."
},
{
"name": "app.auto-clear.host-connect-log.enabled",
"name": "app.auto-clear.terminal-connect-log.enabled",
"type": "java.lang.Boolean",
"description": "开启 主机连接日志自动清理."
"description": "开启 终端连接日志自动清理."
},
{
"name": "app.auto-clear.host-connect-log.keep-period",
"name": "app.auto-clear.terminal-connect-log.keep-period",
"type": "java.lang.Integer",
"description": "主机连接日志自动清理 保留周期 (天)."
"description": "终端连接日志自动清理 保留周期 (天)."
}
]
}

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.orion.visor.module.asset.dao.HostConnectLogDAO">
<mapper namespace="com.orion.visor.module.asset.dao.TerminalConnectLogDAO">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.orion.visor.module.asset.entity.domain.HostConnectLogDO">
<resultMap id="BaseResultMap" type="com.orion.visor.module.asset.entity.domain.TerminalConnectLogDO">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="username" property="username"/>
@@ -28,7 +28,7 @@
<select id="selectLatestConnectHostId" resultType="java.lang.Long">
SELECT host_id
FROM host_connect_log
FROM terminal_connect_log
WHERE deleted = 0
AND type = #{type}
AND user_id = #{userId}

View File

@@ -1,112 +0,0 @@
import type { ClearRequest, DataGrid, Pagination } from '@/types/global';
import type { TableData } from '@arco-design/web-vue/es/table/interface';
import axios from 'axios';
import qs from 'query-string';
/**
* 主机连接日志查询请求
*/
export interface HostConnectLogQueryRequest extends Pagination {
id?: number;
userId?: number;
hostId?: number;
hostAddress?: string;
type?: string;
token?: string;
status?: string;
startTimeRange?: string[];
}
/**
* 主机连接日志清理请求
*/
export interface HostConnectLogClearRequest extends HostConnectLogQueryRequest, ClearRequest {
}
/**
* 主机连接日志查询响应
*/
export interface HostConnectLogQueryResponse extends TableData {
id: number;
userId: number;
username: number;
hostId: number;
hostName: string;
hostAddress: string;
type: string;
token: string;
status: string;
startTime: number;
endTime: number;
extra: HostConnectLogExtra;
}
/**
* 主机连接日志拓展对象
*/
export interface HostConnectLogExtra {
traceId: string;
channelId: string;
sessionId: string;
address: string;
location: string;
userAgent: string;
errorMessage: string;
}
/**
* 分页查询主机连接日志
*/
export function getHostConnectLogPage(request: HostConnectLogQueryRequest) {
return axios.post<DataGrid<HostConnectLogQueryResponse>>('/asset/host-connect-log/query', request);
}
/**
* 查询全部主机连接会话
*/
export function getHostConnectSessions(request: HostConnectLogQueryRequest) {
return axios.post<Array<HostConnectLogQueryResponse>>('/asset/host-connect-log/session', request);
}
/**
* 查询用户最近连接的主机
*/
export function getLatestConnectHostId(type: string, limit: number) {
return axios.post<Array<number>>('/asset/host-connect-log/latest-connect', {
type,
limit
});
}
/**
* 删除主机连接日志
*/
export function deleteHostConnectLog(idList: Array<number>) {
return axios.delete('/asset/host-connect-log/delete', {
params: { idList },
paramsSerializer: params => {
return qs.stringify(params, { arrayFormat: 'comma' });
}
});
}
/**
* 查询主机连接日志数量
*/
export function getHostConnectLogCount(request: HostConnectLogQueryRequest) {
return axios.post<number>('/asset/host-connect-log/count', request);
}
/**
* 清空主机连接日志
*/
export function clearHostConnectLog(request: HostConnectLogClearRequest) {
return axios.post<number>('/asset/host-connect-log/clear', request);
}
/**
* 强制断开主机连接
*/
export function hostForceOffline(request: HostConnectLogQueryRequest) {
return axios.put('/asset/host-connect-log/force-offline', request);
}

View File

@@ -0,0 +1,112 @@
import type { ClearRequest, DataGrid, Pagination } from '@/types/global';
import type { TableData } from '@arco-design/web-vue/es/table/interface';
import axios from 'axios';
import qs from 'query-string';
/**
* 终端连接日志查询请求
*/
export interface TerminalConnectLogQueryRequest extends Pagination {
id?: number;
userId?: number;
hostId?: number;
hostAddress?: string;
type?: string;
token?: string;
status?: string;
startTimeRange?: string[];
}
/**
* 终端连接日志清理请求
*/
export interface TerminalConnectLogClearRequest extends TerminalConnectLogQueryRequest, ClearRequest {
}
/**
* 终端连接日志查询响应
*/
export interface TerminalConnectLogQueryResponse extends TableData {
id: number;
userId: number;
username: number;
hostId: number;
hostName: string;
hostAddress: string;
type: string;
token: string;
status: string;
startTime: number;
endTime: number;
extra: TerminalConnectLogExtra;
}
/**
* 终端连接日志拓展对象
*/
export interface TerminalConnectLogExtra {
traceId: string;
channelId: string;
sessionId: string;
address: string;
location: string;
userAgent: string;
errorMessage: string;
}
/**
* 分页查询终端连接日志
*/
export function getTerminalConnectLogPage(request: TerminalConnectLogQueryRequest) {
return axios.post<DataGrid<TerminalConnectLogQueryResponse>>('/asset/terminal-connect-log/query', request);
}
/**
* 查询全部终端连接会话
*/
export function getTerminalConnectSessions(request: TerminalConnectLogQueryRequest) {
return axios.post<Array<TerminalConnectLogQueryResponse>>('/asset/terminal-connect-log/session', request);
}
/**
* 查询用户最近连接的主机
*/
export function getLatestConnectHostId(type: string, limit: number) {
return axios.post<Array<number>>('/asset/terminal-connect-log/latest-connect', {
type,
limit
});
}
/**
* 删除终端连接日志
*/
export function deleteTerminalConnectLog(idList: Array<number>) {
return axios.delete('/asset/terminal-connect-log/delete', {
params: { idList },
paramsSerializer: params => {
return qs.stringify(params, { arrayFormat: 'comma' });
}
});
}
/**
* 查询终端连接日志数量
*/
export function getTerminalConnectLogCount(request: TerminalConnectLogQueryRequest) {
return axios.post<number>('/asset/terminal-connect-log/count', request);
}
/**
* 清空终端连接日志
*/
export function clearTerminalConnectLog(request: TerminalConnectLogClearRequest) {
return axios.post<number>('/asset/terminal-connect-log/clear', request);
}
/**
* 强制断开终端连接
*/
export function hostForceOffline(request: TerminalConnectLogQueryRequest) {
return axios.put('/asset/terminal-connect-log/force-offline', request);
}

View File

@@ -172,14 +172,14 @@ export function batchDeleteUploadTask(idList: Array<number>) {
}
/**
* 查询主机连接日志数量
* 查询批量上传任务数量
*/
export function getUploadTaskCount(request: UploadTaskQueryRequest) {
return axios.post<number>('/asset/upload-task/count', request);
}
/**
* 清空主机连接日志
* 清空查询批量上传任务
*/
export function clearUploadTask(request: UploadTaskClearRequest) {
return axios.post<number>('/asset/upload-task/clear', request);

View File

@@ -2,7 +2,7 @@
<a-modal v-model:visible="visible"
modal-class="modal-form-large"
title-align="start"
title="清空主机连接日志"
title="清空终端连接日志"
:align-center="false"
:draggable="true"
:mask-closable="false"
@@ -76,12 +76,12 @@
</script>
<script lang="ts" setup>
import type { HostConnectLogQueryRequest } from '@/api/asset/host-connect-log';
import type { TerminalConnectLogQueryRequest } from '@/api/asset/terminal-connect-log';
import { ref } from 'vue';
import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible';
import { connectStatusKey, connectTypeKey, maxClearLimit } from '../types/const';
import { getHostConnectLogCount, clearHostConnectLog } from '@/api/asset/host-connect-log';
import { getTerminalConnectLogCount, clearTerminalConnectLog } from '@/api/asset/terminal-connect-log';
import { Message, Modal } from '@arco-design/web-vue';
import { useDictStore } from '@/store';
import UserSelector from '@/components/user/user/selector/index.vue';
@@ -93,7 +93,7 @@
const { visible, setVisible } = useVisible();
const { loading, setLoading } = useLoading();
const defaultForm = (): HostConnectLogQueryRequest => {
const defaultForm = (): TerminalConnectLogQueryRequest => {
return {
userId: undefined,
hostId: undefined,
@@ -105,7 +105,7 @@
};
};
const formModel = ref<HostConnectLogQueryRequest>({});
const formModel = ref<TerminalConnectLogQueryRequest>({});
// 打开
const open = (record: any) => {
@@ -129,7 +129,7 @@
setLoading(true);
try {
// 获取总数量
const { data } = await getHostConnectLogCount(formModel.value);
const { data } = await getTerminalConnectLogCount(formModel.value);
if (data) {
// 清空
doClear(data);
@@ -153,7 +153,7 @@
setLoading(true);
try {
// 调用清空
const { data } = await clearHostConnectLog(formModel.value);
const { data } = await clearTerminalConnectLog(formModel.value);
Message.success(`已成功清空 ${data} 条数据`);
emits('clear');
// 清空

View File

@@ -1,6 +1,6 @@
<template>
<a-drawer v-model:visible="visible"
title="主机连接日志详情"
title="终端连接日志详情"
:width="442"
:mask-closable="false"
:unmount-on-close="true"
@@ -98,7 +98,7 @@
</script>
<script lang="ts" setup>
import type { HostConnectLogQueryResponse } from '@/api/asset/host-connect-log';
import type { TerminalConnectLogQueryResponse } from '@/api/asset/terminal-connect-log';
import { ref } from 'vue';
import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible';
@@ -111,7 +111,7 @@
const { visible, setVisible } = useVisible();
const { loading, setLoading } = useLoading();
const record = ref<HostConnectLogQueryResponse>({} as HostConnectLogQueryResponse);
const record = ref<TerminalConnectLogQueryResponse>({} as TerminalConnectLogQueryResponse);
// 打开
const open = (s: any) => {

View File

@@ -57,14 +57,14 @@
<div class="table-left-bar-handle">
<!-- 标题 -->
<div class="table-title">
主机连接日志
终端连接日志
</div>
</div>
<!-- 右侧操作 -->
<div class="table-right-bar-handle">
<a-space>
<!-- 清空 -->
<a-button v-permission="['asset:host-connect-log:management:clear']"
<a-button v-permission="['asset:terminal-connect-log:management:clear']"
status="danger"
@click="openClear">
清空
@@ -77,7 +77,7 @@
position="br"
type="warning"
@ok="deleteSelectRows">
<a-button v-permission="['asset:host-connect-log:management:delete']"
<a-button v-permission="['asset:terminal-connect-log:management:delete']"
type="primary"
status="danger"
:disabled="selectedKeys.length === 0">
@@ -162,12 +162,12 @@
详情
</a-button>
<!-- 下线 -->
<a-popconfirm v-if="record.status === HostConnectStatus.CONNECTING"
<a-popconfirm v-if="record.status === TerminalConnectStatus.CONNECTING"
content="确认要强制下线吗?"
position="left"
type="warning"
@ok="forceOffline(record)">
<a-button v-permission="['asset:host-connect-log:management:force-offline', 'asset:host-connect-session:management:force-offline']"
<a-button v-permission="['asset:terminal-connect-log:management:force-offline', 'asset:terminal-connect-session:management:force-offline']"
type="text"
size="mini"
status="danger">
@@ -179,7 +179,7 @@
position="left"
type="warning"
@ok="deleteRow(record)">
<a-button v-permission="['asset:host-connect-log:management:delete']"
<a-button v-permission="['asset:terminal-connect-log:management:delete']"
type="text"
size="mini"
status="danger">
@@ -199,10 +199,10 @@
</script>
<script lang="ts" setup>
import type { HostConnectLogQueryRequest, HostConnectLogQueryResponse } from '@/api/asset/host-connect-log';
import type { TerminalConnectLogQueryRequest, TerminalConnectLogQueryResponse } from '@/api/asset/terminal-connect-log';
import { reactive, ref, onMounted } from 'vue';
import { deleteHostConnectLog, getHostConnectLogPage, hostForceOffline } from '@/api/asset/host-connect-log';
import { connectStatusKey, connectTypeKey, HostConnectStatus } from '../types/const';
import { deleteTerminalConnectLog, getTerminalConnectLogPage, hostForceOffline } from '@/api/asset/terminal-connect-log';
import { connectStatusKey, connectTypeKey, TerminalConnectStatus } from '../types/const';
import { useTablePagination, useRowSelection } from '@/hooks/table';
import { useDictStore } from '@/store';
import { Message } from '@arco-design/web-vue';
@@ -220,10 +220,10 @@
const { loading, setLoading } = useLoading();
const { toOptions, getDictValue } = useDictStore();
const tableRenderData = ref<Array<HostConnectLogQueryResponse>>([]);
const tableRenderData = ref<Array<TerminalConnectLogQueryResponse>>([]);
const selectedKeys = ref<Array<number>>([]);
const formModel = reactive<HostConnectLogQueryRequest>({
const formModel = reactive<TerminalConnectLogQueryRequest>({
id: undefined,
userId: undefined,
hostId: undefined,
@@ -234,10 +234,10 @@
});
// 加载数据
const doFetchTableData = async (request: HostConnectLogQueryRequest) => {
const doFetchTableData = async (request: TerminalConnectLogQueryRequest) => {
try {
setLoading(true);
const { data } = await getHostConnectLogPage(request);
const { data } = await getTerminalConnectLogPage(request);
tableRenderData.value = data.rows;
pagination.total = data.total;
pagination.current = request.page;
@@ -262,11 +262,11 @@
};
// 强制下线
const forceOffline = async (record: HostConnectLogQueryResponse) => {
const forceOffline = async (record: TerminalConnectLogQueryResponse) => {
try {
setLoading(true);
await hostForceOffline({ id: record.id });
record.status = HostConnectStatus.FORCE_OFFLINE;
record.status = TerminalConnectStatus.FORCE_OFFLINE;
record.endTime = Date.now();
Message.success('已下线');
} catch (e) {
@@ -280,7 +280,7 @@
try {
setLoading(true);
// 调用删除接口
await deleteHostConnectLog(selectedKeys.value);
await deleteTerminalConnectLog(selectedKeys.value);
Message.success(`成功删除 ${selectedKeys.value.length} 条数据`);
selectedKeys.value = [];
// 重新加载数据
@@ -292,11 +292,11 @@
};
// 删除当前行
const deleteRow = async (record: HostConnectLogQueryResponse) => {
const deleteRow = async (record: TerminalConnectLogQueryResponse) => {
try {
setLoading(true);
// 调用删除接口
await deleteHostConnectLog([record.id]);
await deleteTerminalConnectLog([record.id]);
Message.success('删除成功');
selectedKeys.value = [];
// 重新加载数据

View File

@@ -1,11 +1,11 @@
// 主机连接类型
export const HostConnectType = {
// 终端连接类型
export const TerminalConnectType = {
SSH: 'SSH',
SFTP: 'SFTP',
};
// 主机连接状态
export const HostConnectStatus = {
// 终端连接状态
export const TerminalConnectStatus = {
CONNECTING: 'CONNECTING',
COMPLETE: 'COMPLETE',
FAILED: 'FAILED',
@@ -15,11 +15,11 @@ export const HostConnectStatus = {
// 最大清理数量
export const maxClearLimit = 2000;
// 主机连接状态 字典项
export const connectStatusKey = 'hostConnectStatus';
// 终端连接状态 字典项
export const connectStatusKey = 'terminalConnectStatus';
// 主机连接类型 字典项
export const connectTypeKey = 'hostConnectType';
// 终端连接类型 字典项
export const connectTypeKey = 'terminalConnectType';
// 加载的字典值
export const dictKeys = [connectStatusKey, connectTypeKey];

View File

@@ -100,7 +100,7 @@
position="left"
type="warning"
@ok="forceOffline(record)">
<a-button v-permission="['asset:host-connect-log:management:force-offline', 'asset:host-connect-session:management:force-offline']"
<a-button v-permission="['asset:terminal-connect-log:management:force-offline', 'asset:terminal-connect-session:management:force-offline']"
type="text"
size="mini"
status="danger">
@@ -120,9 +120,9 @@
</script>
<script lang="ts" setup>
import type { HostConnectLogQueryRequest, HostConnectLogQueryResponse } from '@/api/asset/host-connect-log';
import type { TerminalConnectLogQueryRequest, TerminalConnectLogQueryResponse } from '@/api/asset/terminal-connect-log';
import { reactive, ref, onMounted } from 'vue';
import { getHostConnectSessions, hostForceOffline } from '@/api/asset/host-connect-log';
import { getTerminalConnectSessions, hostForceOffline } from '@/api/asset/terminal-connect-log';
import { connectTypeKey } from '../types/const';
import { useDictStore } from '@/store';
import { Message } from '@arco-design/web-vue';
@@ -132,12 +132,12 @@
import UserSelector from '@/components/user/user/selector/index.vue';
import HostSelector from '@/components/asset/host/selector/index.vue';
const tableRenderData = ref<HostConnectLogQueryResponse[]>([]);
const tableRenderData = ref<TerminalConnectLogQueryResponse[]>([]);
const { loading, setLoading } = useLoading();
const { toOptions, getDictValue } = useDictStore();
const formModel = reactive<HostConnectLogQueryRequest>({
const formModel = reactive<TerminalConnectLogQueryRequest>({
userId: undefined,
hostId: undefined,
hostAddress: undefined,
@@ -149,7 +149,7 @@
const fetchTableData = async () => {
try {
setLoading(true);
const { data } = await getHostConnectSessions(formModel);
const { data } = await getTerminalConnectSessions(formModel);
tableRenderData.value = data;
} catch (e) {
} finally {
@@ -158,7 +158,7 @@
};
// 强制下线
const forceOffline = async (record: HostConnectLogQueryResponse) => {
const forceOffline = async (record: TerminalConnectLogQueryResponse) => {
try {
setLoading(true);
// 下线

View File

@@ -1,5 +1,5 @@
// 主机连接类型 字典项
export const connectTypeKey = 'hostConnectType';
// 终端连接类型 字典项
export const connectTypeKey = 'terminalConnectType';
// 加载的字典值
export const dictKeys = [connectTypeKey];

View File

@@ -430,10 +430,10 @@ CREATE TABLE `host`
ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for host_connect_log
-- Table structure for terminal_connect_log
-- ----------------------------
DROP TABLE IF EXISTS `host_connect_log`;
CREATE TABLE `host_connect_log`
DROP TABLE IF EXISTS `terminal_connect_log`;
CREATE TABLE `terminal_connect_log`
(
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id',
`user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id',
@@ -457,7 +457,7 @@ CREATE TABLE `host_connect_log`
) ENGINE = InnoDB
AUTO_INCREMENT = 1
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT = '主机连接日志'
COLLATE = utf8mb4_general_ci COMMENT = '终端连接日志'
ROW_FORMAT = Dynamic;
-- ----------------------------

View File

@@ -31,8 +31,8 @@ INSERT INTO `dict_key` VALUES (23, 'terminalFontWeight', 'STRING', '[]', '终端
INSERT INTO `dict_key` VALUES (24, 'terminalCursorStyle', 'STRING', '[]', '终端光标样式', '2023-12-11 18:24:47', '2023-12-11 18:26:11', '1', '1', 0);
INSERT INTO `dict_key` VALUES (25, 'hostNewConnectionType', 'STRING', '[]', '主机新建连接类型', '2023-12-14 17:24:19', '2024-01-31 23:39:19', '1', '1', 0);
INSERT INTO `dict_key` VALUES (26, 'hostExtraSshAuthType', 'STRING', '[]', 'SSH 额外认证方式', '2023-12-25 15:41:22', '2024-08-24 19:19:07', '1', '1', 0);
INSERT INTO `dict_key` VALUES (27, 'hostConnectType', 'STRING', '[{\"name\": \"color\", \"type\": \"COLOR\"}]', '主机连接类型', '2023-12-26 23:23:08', '2024-04-24 16:37:48', '1', '1', 0);
INSERT INTO `dict_key` VALUES (28, 'hostConnectStatus', 'STRING', '[{\"name\": \"color\", \"type\": \"COLOR\"}]', '主机连接状态', '2023-12-26 23:23:51', '2023-12-26 23:28:15', '1', '1', 0);
INSERT INTO `dict_key` VALUES (27, 'hostConnectType', 'STRING', '[{\"name\": \"color\", \"type\": \"COLOR\"}]', '终端连接类型', '2023-12-26 23:23:08', '2024-04-24 16:37:48', '1', '1', 0);
INSERT INTO `dict_key` VALUES (28, 'hostConnectStatus', 'STRING', '[{\"name\": \"color\", \"type\": \"COLOR\"}]', '终端连接状态', '2023-12-26 23:23:51', '2023-12-26 23:28:15', '1', '1', 0);
INSERT INTO `dict_key` VALUES (29, 'terminalConnectStatus', 'INTEGER', '[{\"name\": \"status\", \"type\": \"STRING\"}]', '终端连接状态', '2024-01-09 00:32:00', '2024-01-09 00:32:16', '1', '1', 0);
INSERT INTO `dict_key` VALUES (31, 'terminalEmulationType', 'STRING', '[]', '伪终端类型', '2024-01-11 23:35:01', '2024-01-11 23:35:01', '1', '1', 0);
INSERT INTO `dict_key` VALUES (32, 'terminalTabColor', 'COLOR', '[{\"name\": \"color\", \"type\": \"COLOR\"}, {\"name\": \"bg\", \"type\": \"COLOR\"}]', '终端标签页颜色', '2024-03-01 15:01:44', '2024-08-05 12:36:54', '1', '1', 0);
@@ -211,10 +211,10 @@ INSERT INTO `dict_value` VALUES (210, 32, 'terminalTabColor', 'purple', '紫色'
INSERT INTO `dict_value` VALUES (211, 32, 'terminalTabColor', 'pinkpurple', '粉紫', '{\"bg\": \"rgb(var(--pinkpurple-2))\", \"color\": \"rgb(var(--pinkpurple-6))\"}', 90, '2024-03-01 15:11:41', '2024-08-05 14:23:47', '1', '1', 0);
INSERT INTO `dict_value` VALUES (213, 32, 'terminalTabColor', 'gray', '灰色', '{\"bg\": \"rgb(var(--gray-2))\", \"color\": \"rgb(var(--gray-6))\"}', 100, '2024-03-01 15:12:01', '2024-08-05 14:23:43', '1', '1', 0);
INSERT INTO `dict_value` VALUES (214, 28, 'hostConnectStatus', 'FORCE_OFFLINE', '强制下线', '{\"color\": \"rgb(var(--red-6))\"}', 40, '2024-03-04 12:51:13', '2024-03-04 12:51:13', '1', '1', 0);
INSERT INTO `dict_value` VALUES (215, 1, 'operatorLogModule', 'asset:host-connect-log', '主机连接日志', '{}', 2060, '2024-03-04 13:43:33', '2024-03-04 13:43:33', '1', '1', 0);
INSERT INTO `dict_value` VALUES (216, 2, 'operatorLogType', 'host-connect-log:delete', '删除主机连接日志', '{}', 10, '2024-03-04 13:44:34', '2024-08-29 17:53:21', '1', '1', 0);
INSERT INTO `dict_value` VALUES (217, 2, 'operatorLogType', 'host-connect-log:clear', '清空主机连接日志', '{}', 20, '2024-03-04 13:45:07', '2024-08-29 17:53:16', '1', '1', 0);
INSERT INTO `dict_value` VALUES (218, 2, 'operatorLogType', 'host-connect-log:force-offline', '强制下线', '{}', 30, '2024-03-04 13:45:36', '2024-03-04 13:45:36', '1', '1', 0);
INSERT INTO `dict_value` VALUES (215, 1, 'operatorLogModule', 'asset:terminal-connect-log', '终端连接日志', '{}', 2060, '2024-03-04 13:43:33', '2024-03-04 13:43:33', '1', '1', 0);
INSERT INTO `dict_value` VALUES (216, 2, 'operatorLogType', 'terminal-connect-log:delete', '删除终端连接日志', '{}', 10, '2024-03-04 13:44:34', '2024-08-29 17:53:21', '1', '1', 0);
INSERT INTO `dict_value` VALUES (217, 2, 'operatorLogType', 'terminal-connect-log:clear', '清空终端连接日志', '{}', 20, '2024-03-04 13:45:07', '2024-08-29 17:53:16', '1', '1', 0);
INSERT INTO `dict_value` VALUES (218, 2, 'operatorLogType', 'terminal-connect-log:force-offline', '强制下线', '{}', 30, '2024-03-04 13:45:36', '2024-03-04 13:45:36', '1', '1', 0);
INSERT INTO `dict_value` VALUES (219, 1, 'operatorLogModule', 'infra:operator-log', '操作日志', '{}', 1060, '2024-03-04 16:32:11', '2024-03-04 16:32:11', '1', '1', 0);
INSERT INTO `dict_value` VALUES (220, 2, 'operatorLogType', 'operator-log:delete', '删除操作日志', '{}', 10, '2024-03-04 16:33:11', '2024-03-04 16:33:44', '1', '1', 0);
INSERT INTO `dict_value` VALUES (221, 2, 'operatorLogType', 'operator-log:clear', '清空操作日志', '{}', 20, '2024-03-04 16:33:31', '2024-03-04 16:33:31', '1', '1', 0);
@@ -389,12 +389,12 @@ INSERT INTO `system_menu` VALUES (144, 63, '资产授权', NULL, 2, 50, 1, 1, 1,
INSERT INTO `system_menu` VALUES (145, 0, '主机运维', NULL, 1, 400, 1, 1, 1, 1, 'IconDesktop', NULL, 'hostModule', '2023-12-04 23:33:25', '2024-04-03 00:57:16', '1', '1', 0);
INSERT INTO `system_menu` VALUES (146, 145, '主机终端', NULL, 2, 10, 1, 1, 1, 1, 'icon-code-square', NULL, 'terminal', '2023-12-04 23:38:01', '2024-03-07 19:09:44', '1', '1', 0);
INSERT INTO `system_menu` VALUES (148, 152, '连接日志', NULL, 2, 10, 1, 1, 1, 0, 'IconLink', NULL, 'connectLog', '2023-12-26 22:53:07', '2024-03-07 19:09:59', '1', '1', 0);
INSERT INTO `system_menu` VALUES (149, 148, '查询连接日志', 'asset:host-connect-log:management:query', 3, 10, 1, 1, 1, 0, NULL, NULL, NULL, '2023-12-26 22:53:08', '2024-03-04 13:40:42', '1', '1', 0);
INSERT INTO `system_menu` VALUES (149, 148, '查询连接日志', 'asset:terminal-connect-log:management:query', 3, 10, 1, 1, 1, 0, NULL, NULL, NULL, '2023-12-26 22:53:08', '2024-03-04 13:40:42', '1', '1', 0);
INSERT INTO `system_menu` VALUES (151, 146, '连接终端', 'asset:host-terminal:access', 3, 10, 1, 1, 1, 0, NULL, NULL, NULL, '2023-12-27 18:56:33', '2023-12-27 18:56:33', '2', '2', 0);
INSERT INTO `system_menu` VALUES (152, 0, '运维审计', NULL, 1, 410, 1, 1, 1, 0, 'IconSafe', NULL, 'assetAuditModule', '2024-01-04 17:54:56', '2024-04-28 15:30:04', '1', '1', 0);
INSERT INTO `system_menu` VALUES (153, 148, '删除连接日志', 'asset:host-connect-log:management:delete', 3, 20, 1, 1, 1, 0, NULL, NULL, NULL, '2024-03-04 13:39:46', '2024-03-04 13:40:29', '1', '1', 0);
INSERT INTO `system_menu` VALUES (154, 148, '清空连接日志', 'asset:host-connect-log:management:clear', 3, 30, 1, 1, 1, 0, NULL, NULL, NULL, '2024-03-04 13:40:05', '2024-03-04 13:40:34', '1', '1', 0);
INSERT INTO `system_menu` VALUES (155, 148, '强制断开连接', 'asset:host-connect-log:management:force-offline', 3, 40, 1, 1, 1, 0, NULL, NULL, NULL, '2024-03-04 13:41:02', '2024-03-05 23:32:01', '1', '1', 0);
INSERT INTO `system_menu` VALUES (153, 148, '删除连接日志', 'asset:terminal-connect-log:management:delete', 3, 20, 1, 1, 1, 0, NULL, NULL, NULL, '2024-03-04 13:39:46', '2024-03-04 13:40:29', '1', '1', 0);
INSERT INTO `system_menu` VALUES (154, 148, '清空连接日志', 'asset:terminal-connect-log:management:clear', 3, 30, 1, 1, 1, 0, NULL, NULL, NULL, '2024-03-04 13:40:05', '2024-03-04 13:40:34', '1', '1', 0);
INSERT INTO `system_menu` VALUES (155, 148, '强制断开连接', 'asset:terminal-connect-log:management:force-offline', 3, 40, 1, 1, 1, 0, NULL, NULL, NULL, '2024-03-04 13:41:02', '2024-03-05 23:32:01', '1', '1', 0);
INSERT INTO `system_menu` VALUES (156, 122, '删除操作日志', 'infra:operator-log:delete', 3, 20, 1, 1, 1, 0, NULL, NULL, NULL, '2024-03-04 17:06:55', '2024-03-04 17:08:22', '1', '1', 0);
INSERT INTO `system_menu` VALUES (157, 122, '清空操作日志', 'infra:operator-log:management:clear', 3, 30, 1, 1, 1, 0, NULL, NULL, NULL, '2024-03-04 17:07:25', '2024-04-11 11:16:17', '1', '2', 0);
INSERT INTO `system_menu` VALUES (158, 152, '文件操作日志', NULL, 2, 40, 1, 1, 1, 0, 'IconFile', NULL, 'sftpLog', '2024-03-05 15:30:13', '2024-08-04 20:23:19', '1', '1', 0);
@@ -430,8 +430,8 @@ INSERT INTO `system_menu` VALUES (191, 0, '提交bug', NULL, 1, 1020, 1, 1, 0, 1
INSERT INTO `system_menu` VALUES (192, 0, '点个赞~', NULL, 1, 1030, 1, 1, 0, 1, 'IconThumbUp', 'https://github.com/dromara/orion-visor', NULL, '2024-04-26 11:32:30', '2024-06-12 14:03:25', '1', '1', 0);
INSERT INTO `system_menu` VALUES (193, 0, '计划任务', NULL, 1, 430, 1, 1, 1, 0, 'IconCalendarClock', NULL, 'jobModule', '2024-04-28 15:31:24', '2024-04-28 15:32:56', '1', '1', 0);
INSERT INTO `system_menu` VALUES (194, 152, '在线会话', NULL, 2, 20, 1, 1, 1, 0, 'IconUserGroup', NULL, 'connectSession', '2024-05-07 11:12:17', '2024-05-07 11:12:35', '1', '1', 0);
INSERT INTO `system_menu` VALUES (195, 194, '查询在线会话', 'asset:host-connect-session:management:query', 3, 10, 1, 1, 1, 0, NULL, NULL, NULL, '2024-05-07 11:13:16', '2024-05-07 11:13:16', '1', '1', 0);
INSERT INTO `system_menu` VALUES (196, 194, '强制断开连接', 'asset:host-connect-session:management:force-offline', 3, 20, 1, 1, 1, 0, NULL, NULL, NULL, '2024-05-07 11:13:37', '2024-05-07 11:13:37', '1', '1', 0);
INSERT INTO `system_menu` VALUES (195, 194, '查询在线会话', 'asset:terminal-connect-session:management:query', 3, 10, 1, 1, 1, 0, NULL, NULL, NULL, '2024-05-07 11:13:16', '2024-05-07 11:13:16', '1', '1', 0);
INSERT INTO `system_menu` VALUES (196, 194, '强制断开连接', 'asset:terminal-connect-session:management:force-offline', 3, 20, 1, 1, 1, 0, NULL, NULL, NULL, '2024-05-07 11:13:37', '2024-05-07 11:13:37', '1', '1', 0);
INSERT INTO `system_menu` VALUES (197, 176, '批量上传', NULL, 2, 30, 1, 1, 1, 0, 'IconUpload', NULL, 'batchUpload', '2024-05-08 22:12:23', '2024-05-14 15:58:44', '1', '1', 0);
INSERT INTO `system_menu` VALUES (198, 176, '上传任务', NULL, 2, 40, 1, 1, 1, 0, 'IconCloud', NULL, 'uploadTask', '2024-05-08 22:16:05', '2024-05-14 15:58:46', '1', '1', 0);
INSERT INTO `system_menu` VALUES (199, 197, '上传文件', 'asset:upload-task:upload', 3, 10, 1, 1, 1, 0, NULL, NULL, NULL, '2024-05-08 22:19:35', '2024-05-08 22:19:35', '1', '1', 0);