⚡ 修改表名.
This commit is contained in:
@@ -197,8 +197,8 @@ app:
|
||||
exec-log:
|
||||
enabled: false
|
||||
keep-period: 30
|
||||
# 主机连接日志
|
||||
host-connect-log:
|
||||
# 终端连接日志
|
||||
terminal-connect-log:
|
||||
enabled: false
|
||||
keep-period: 30
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
@@ -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>"),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -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)
|
||||
@@ -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;
|
||||
@@ -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")
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -35,7 +35,7 @@ import javax.annotation.PostConstruct;
|
||||
public enum InputTypeEnum {
|
||||
|
||||
/**
|
||||
* 主机连接检查
|
||||
* 终端连接检查
|
||||
*/
|
||||
CHECK("ck",
|
||||
TerminalCheckHandler.class,
|
||||
|
||||
@@ -31,12 +31,12 @@ import lombok.Getter;
|
||||
public enum OutputTypeEnum {
|
||||
|
||||
/**
|
||||
* 主机连接检查
|
||||
* 终端连接检查
|
||||
*/
|
||||
CHECK("ck", "${type}|${sessionId}|${result}|${msg}"),
|
||||
|
||||
/**
|
||||
* 主机连接
|
||||
* 终端连接
|
||||
*/
|
||||
CONNECT("co", "${type}|${sessionId}|${result}|${msg}"),
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -23,7 +23,7 @@ import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
/**
|
||||
* 主机连接检查请求 实体对象
|
||||
* 终端连接检查请求 实体对象
|
||||
* <p>
|
||||
* ck|eff00a1|1
|
||||
*
|
||||
|
||||
@@ -23,7 +23,7 @@ import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
/**
|
||||
* 主机连接检查响应 实体对象
|
||||
* 终端连接检查响应 实体对象
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
|
||||
@@ -23,7 +23,7 @@ import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
/**
|
||||
* 主机连接关闭响应 实体对象
|
||||
* 终端连接关闭响应 实体对象
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -52,7 +52,7 @@ import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 主机连接服务
|
||||
* 终端连接服务
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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": "终端连接日志自动清理 保留周期 (天)."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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}
|
||||
@@ -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);
|
||||
}
|
||||
112
orion-visor-ui/src/api/asset/terminal-connect-log.ts
Normal file
112
orion-visor-ui/src/api/asset/terminal-connect-log.ts
Normal 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);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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');
|
||||
// 清空
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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 = [];
|
||||
// 重新加载数据
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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);
|
||||
// 下线
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// 主机连接类型 字典项
|
||||
export const connectTypeKey = 'hostConnectType';
|
||||
// 终端连接类型 字典项
|
||||
export const connectTypeKey = 'terminalConnectType';
|
||||
|
||||
// 加载的字典值
|
||||
export const dictKeys = [connectTypeKey];
|
||||
|
||||
@@ -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;
|
||||
|
||||
-- ----------------------------
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user