mirror of
https://gitee.com/lijiahangmax/orion-ops.git
synced 2026-09-01 14:50:18 +08:00
add terminal screen api.
This commit is contained in:
+2
-2
@@ -22,11 +22,11 @@ public enum FileDownloadType {
|
||||
SECRET_KEY(10),
|
||||
|
||||
/**
|
||||
* terminal 日志
|
||||
* terminal 录屏
|
||||
*
|
||||
* @see com.orion.ops.constant.system.SystemEnvAttr#LOG_PATH
|
||||
*/
|
||||
TERMINAL_LOG(20),
|
||||
TERMINAL_SCREEN(20),
|
||||
|
||||
/**
|
||||
* 命令 执行日志
|
||||
|
||||
+24
@@ -1,14 +1,18 @@
|
||||
package com.orion.ops.controller;
|
||||
|
||||
import com.orion.lang.define.wrapper.DataGrid;
|
||||
import com.orion.lang.define.wrapper.HttpWrapper;
|
||||
import com.orion.lang.define.wrapper.Wrapper;
|
||||
import com.orion.lang.utils.Strings;
|
||||
import com.orion.lang.utils.codec.Base64s;
|
||||
import com.orion.lang.utils.io.FileReaders;
|
||||
import com.orion.net.remote.TerminalType;
|
||||
import com.orion.ops.annotation.EventLog;
|
||||
import com.orion.ops.annotation.RequireRole;
|
||||
import com.orion.ops.annotation.RestWrapper;
|
||||
import com.orion.ops.constant.Const;
|
||||
import com.orion.ops.constant.MessageConst;
|
||||
import com.orion.ops.constant.ResultCode;
|
||||
import com.orion.ops.constant.event.EventType;
|
||||
import com.orion.ops.constant.user.RoleType;
|
||||
import com.orion.ops.entity.request.MachineTerminalLogRequest;
|
||||
@@ -26,6 +30,9 @@ import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@@ -99,6 +106,23 @@ public class MachineTerminalController {
|
||||
return machineTerminalService.deleteTerminalLog(idList);
|
||||
}
|
||||
|
||||
@PostMapping("/log/screen")
|
||||
@ApiOperation(value = "获取终端录屏文件 base64")
|
||||
public HttpWrapper<String> getLogScreen(@RequestBody MachineTerminalLogRequest request) {
|
||||
Long id = Valid.notNull(request.getId());
|
||||
String path = machineTerminalService.getTerminalScreenFilePath(id);
|
||||
if (path == null) {
|
||||
return HttpWrapper.of(ResultCode.FILE_MISSING);
|
||||
}
|
||||
Path file = Paths.get(path);
|
||||
if (!Files.exists(file)) {
|
||||
return HttpWrapper.of(ResultCode.FILE_MISSING);
|
||||
}
|
||||
String base64 = Base64s.encodeToString(FileReaders.readAllBytesFast(path));
|
||||
// FIXME
|
||||
return HttpWrapper.ok(Wrapper.HTTP_OK_MESSAGE, base64);
|
||||
}
|
||||
|
||||
@PostMapping("/manager/session")
|
||||
@ApiOperation(value = "获取终端会话列表")
|
||||
@RequireRole(RoleType.ADMINISTRATOR)
|
||||
|
||||
+1
-1
@@ -203,7 +203,7 @@ public class TerminalMessageHandler implements WebSocketHandler {
|
||||
return;
|
||||
}
|
||||
// 获取token信息
|
||||
Long tokenUserId = MachineTerminalService.getTokenUserId(token);
|
||||
Long tokenUserId = MachineTerminalService.getTerminalAccessTokenUserId(token);
|
||||
String tokenKey = Strings.format(KeyConst.TERMINAL_ACCESS_TOKEN, token);
|
||||
Long machineId = Optional.ofNullable(redisTemplate.opsForValue().get(tokenKey))
|
||||
.map(Long::valueOf)
|
||||
|
||||
+9
-1
@@ -87,13 +87,21 @@ public interface MachineTerminalService {
|
||||
*/
|
||||
Integer deleteTerminalByMachineId(Long machineId);
|
||||
|
||||
/**
|
||||
* 获取下载 terminal 录屏路径
|
||||
*
|
||||
* @param id id
|
||||
* @return path
|
||||
*/
|
||||
String getTerminalScreenFilePath(Long id);
|
||||
|
||||
/**
|
||||
* 获取 token 中的 userId
|
||||
*
|
||||
* @param token token
|
||||
* @return userId
|
||||
*/
|
||||
static Long getTokenUserId(String token) {
|
||||
static Long getTerminalAccessTokenUserId(String token) {
|
||||
return Optional.ofNullable(ValueMix.base62ecbDec(token, TerminalConst.TERMINAL))
|
||||
.map(s -> s.split("_"))
|
||||
.map(s -> s[0])
|
||||
|
||||
+5
-27
@@ -1,7 +1,6 @@
|
||||
package com.orion.ops.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.orion.lang.define.wrapper.HttpWrapper;
|
||||
import com.orion.lang.id.UUIds;
|
||||
import com.orion.lang.utils.Exceptions;
|
||||
@@ -12,14 +11,11 @@ import com.orion.ops.constant.Const;
|
||||
import com.orion.ops.constant.KeyConst;
|
||||
import com.orion.ops.constant.ResultCode;
|
||||
import com.orion.ops.constant.download.FileDownloadType;
|
||||
import com.orion.ops.constant.system.SystemEnvAttr;
|
||||
import com.orion.ops.dao.FileTailListDAO;
|
||||
import com.orion.ops.dao.MachineSecretKeyDAO;
|
||||
import com.orion.ops.dao.MachineTerminalLogDAO;
|
||||
import com.orion.ops.entity.domain.FileTailListDO;
|
||||
import com.orion.ops.entity.domain.FileTransferLogDO;
|
||||
import com.orion.ops.entity.domain.MachineSecretKeyDO;
|
||||
import com.orion.ops.entity.domain.MachineTerminalLogDO;
|
||||
import com.orion.ops.entity.dto.FileDownloadDTO;
|
||||
import com.orion.ops.handler.sftp.direct.DirectDownloader;
|
||||
import com.orion.ops.service.api.*;
|
||||
@@ -48,10 +44,10 @@ public class FileDownloadServiceImpl implements FileDownloadService {
|
||||
private MachineSecretKeyDAO machineSecretKeyDAO;
|
||||
|
||||
@Resource
|
||||
private MachineTerminalLogDAO machineTerminalLogDAO;
|
||||
private CommandExecService commandExecService;
|
||||
|
||||
@Resource
|
||||
private CommandExecService commandExecService;
|
||||
private MachineTerminalService machineTerminalService;
|
||||
|
||||
@Resource
|
||||
private FileTailListDAO fileTailListDAO;
|
||||
@@ -86,9 +82,9 @@ public class FileDownloadServiceImpl implements FileDownloadService {
|
||||
path = this.getDownloadSecretKeyFilePath(id);
|
||||
name = Optional.ofNullable(path).map(Files1::getFileName).orElse(null);
|
||||
break;
|
||||
case TERMINAL_LOG:
|
||||
// terminal 日志
|
||||
path = this.getDownloadTerminalLogFilePath(id);
|
||||
case TERMINAL_SCREEN:
|
||||
// terminal 录屏
|
||||
path = machineTerminalService.getTerminalScreenFilePath(id);
|
||||
name = Optional.ofNullable(path).map(Files1::getFileName).orElse(null);
|
||||
break;
|
||||
case EXEC_LOG:
|
||||
@@ -229,22 +225,4 @@ public class FileDownloadServiceImpl implements FileDownloadService {
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取下载 terminal日志路径
|
||||
*
|
||||
* @param id id
|
||||
* @return path
|
||||
* @see FileDownloadType#TERMINAL_LOG
|
||||
*/
|
||||
private String getDownloadTerminalLogFilePath(Long id) {
|
||||
LambdaQueryWrapper<MachineTerminalLogDO> wrapper = new LambdaQueryWrapper<MachineTerminalLogDO>()
|
||||
.eq(!Currents.isAdministrator(), MachineTerminalLogDO::getUserId, Currents.getUserId())
|
||||
.eq(MachineTerminalLogDO::getId, id);
|
||||
return Optional.ofNullable(machineTerminalLogDAO.selectOne(wrapper))
|
||||
.map(MachineTerminalLogDO::getScreenPath)
|
||||
.filter(Strings::isNotBlank)
|
||||
.map(s -> Files1.getPath(SystemEnvAttr.SCREEN_PATH.getValue(), s))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+15
@@ -5,12 +5,14 @@ import com.orion.lang.define.wrapper.DataGrid;
|
||||
import com.orion.lang.utils.Exceptions;
|
||||
import com.orion.lang.utils.Strings;
|
||||
import com.orion.lang.utils.convert.Converts;
|
||||
import com.orion.lang.utils.io.Files1;
|
||||
import com.orion.net.remote.TerminalType;
|
||||
import com.orion.ops.constant.Const;
|
||||
import com.orion.ops.constant.KeyConst;
|
||||
import com.orion.ops.constant.MessageConst;
|
||||
import com.orion.ops.constant.event.EventKeys;
|
||||
import com.orion.ops.constant.event.EventParamsHolder;
|
||||
import com.orion.ops.constant.system.SystemEnvAttr;
|
||||
import com.orion.ops.constant.terminal.TerminalConst;
|
||||
import com.orion.ops.dao.MachineTerminalDAO;
|
||||
import com.orion.ops.dao.MachineTerminalLogDAO;
|
||||
@@ -36,6 +38,7 @@ import javax.annotation.Resource;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
@@ -199,4 +202,16 @@ public class MachineTerminalServiceImpl implements MachineTerminalService {
|
||||
return machineTerminalLogDAO.delete(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTerminalScreenFilePath(Long id) {
|
||||
LambdaQueryWrapper<MachineTerminalLogDO> wrapper = new LambdaQueryWrapper<MachineTerminalLogDO>()
|
||||
.eq(!Currents.isAdministrator(), MachineTerminalLogDO::getUserId, Currents.getUserId())
|
||||
.eq(MachineTerminalLogDO::getId, id);
|
||||
return Optional.ofNullable(machineTerminalLogDAO.selectOne(wrapper))
|
||||
.map(MachineTerminalLogDO::getScreenPath)
|
||||
.filter(Strings::isNotBlank)
|
||||
.map(s -> Files1.getPath(SystemEnvAttr.SCREEN_PATH.getValue(), s))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -306,7 +306,8 @@ public class Utils {
|
||||
* @param str str
|
||||
* @return unicode
|
||||
*/
|
||||
@Removed("orion-kit 1.0.4")
|
||||
@Removed("kit 1.0.4")
|
||||
// TODO
|
||||
public static String convertControlUnicode(String str) {
|
||||
char[] chars = str.toCharArray();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
Reference in New Issue
Block a user