add terminal screen api.

This commit is contained in:
lijiahang
2022-07-27 19:04:38 +08:00
parent a516502af2
commit 5f1fe721f0
7 changed files with 58 additions and 32 deletions
@@ -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),
/**
* 命令 执行日志
@@ -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)
@@ -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)
@@ -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])
@@ -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);
}
}
@@ -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();