Skip to content

Commit

Permalink
日常
Browse files Browse the repository at this point in the history
  • Loading branch information
白衣 committed Jul 23, 2021
1 parent 6d8e6af commit 5af5207
Show file tree
Hide file tree
Showing 36 changed files with 482 additions and 103 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.baiyi.opscloud.common.redis;

import com.google.common.base.Joiner;

/**
* @Author baiyi
* @Date 2020/5/30 1:03 下午
* @Version 1.0
*/
public class TerminalLogUtil {

public static String toAuditLogKey(String sessionId, String instanceId) {
return Joiner.on("#").join(sessionId, instanceId, "auditLog");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public interface ISessionInstances {
@NoArgsConstructor
@ApiModel
public static class SessionInstance extends BaseVO {
@ApiModelProperty(value = "会话时长")
private Integer sessionDuration;

private Integer id;
private String sessionId;
Expand All @@ -47,5 +49,7 @@ public static class SessionInstance extends BaseVO {
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date closeTime;



}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.baiyi.opscloud.common.datasource.KubernetesDsInstanceConfig;
import com.baiyi.opscloud.common.exception.common.CommonRuntimeException;
import com.baiyi.opscloud.common.redis.RedisUtil;
import com.baiyi.opscloud.common.redis.TerminalKeyUtil;
import com.baiyi.opscloud.common.type.DsAssetTypeEnum;
import com.baiyi.opscloud.datasource.factory.DsConfigFactory;
import com.baiyi.opscloud.domain.generator.opscloud.DatasourceConfig;
Expand Down Expand Up @@ -102,7 +101,7 @@ protected Boolean isBatch(TerminalSession terminalSession) {
// }

protected void heartbeat(String sessionId) {
redisUtil.set(TerminalKeyUtil.buildSessionHeartbeatKey(sessionId), true, 60L);
// redisUtil.set(TerminalKeyUtil.buildSessionHeartbeatKey(sessionId), true, 60L);
}

/**
Expand Down
5 changes: 5 additions & 0 deletions opscloud-manage/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@
<artifactId>opscloud-terminal</artifactId>
</dependency>

<dependency>
<groupId>com.baiyi</groupId>
<artifactId>opscloud-terminal-audit</artifactId>
</dependency>

<dependency>
<groupId>com.baiyi</groupId>
<artifactId>opscloud-ssh-server</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,13 @@ public void setTerminalSessionService(TerminalSessionService terminalSessionServ
*/
@OnOpen
public void onOpen(Session session) {
log.info("终端会话尝试链接,sessionId = {}", sessionId);
log.info("Kubernetes终端会话尝试链接,sessionId = {}", sessionId);
TerminalSession terminalSession = TerminalSessionBuilder.build(sessionId, serverInfo, SessionTypeEnum.KUBERNETES_TERMINAL);
this.terminalSession = terminalSession;
terminalSessionService.add(terminalSession);
sessionSet.add(session);
int cnt = onlineCount.incrementAndGet(); // 在线数加1
log.info("有连接加入,当前连接数为:{}", cnt);
log.info("Kubernetes终端会话有连接加入,当前连接数为:{}", cnt);
session.setMaxIdleTimeout(WEBSOCKET_TIMEOUT);
this.session = session;
// 线程启动
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package com.baiyi.opscloud.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baiyi.opscloud.controller.base.SimpleAuthentication;
import com.baiyi.opscloud.terminal.audit.ITerminalAuditProcess;
import com.baiyi.opscloud.terminal.audit.TerminalAuditProcessFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;

/**
* @Author baiyi
* @Date 2021/7/23 2:39 下午
* @Version 1.0
*/
@Slf4j
@ServerEndpoint(value = "/api/ws/terminal/session/audit")
@Component
public class TerminalSessionAuditController extends SimpleAuthentication {

private static final AtomicInteger onlineCount = new AtomicInteger(0);
// concurrent包的线程安全Set,用来存放每个客户端对应的Session对象。
private static CopyOnWriteArraySet<Session> sessionSet = new CopyOnWriteArraySet<>();

private Session session = null;
// 超时时间1H
public static final Long WEBSOCKET_TIMEOUT = 60 * 60 * 1000L;

/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session) {
sessionSet.add(session);
int cnt = onlineCount.incrementAndGet(); // 在线数加1
log.info("终端会话审计有连接加入,当前连接数为:{}", cnt);
session.setMaxIdleTimeout(WEBSOCKET_TIMEOUT);
this.session = session;
// 线程启动
// Runnable run = new SentOutputTask(sessionId, session);
// Thread thread = new Thread(run);
// thread.start();
}

/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {


// KubernetesTerminalProcessFactory.getProcessByKey(MessageState.CLOSE.getState()).process("", session, terminalSession);
sessionSet.remove(session);
int cnt = onlineCount.decrementAndGet();
log.info("有连接关闭,当前连接数为:{}", cnt);
}

protected String getState(String message) {
JSONObject jsonObject = JSON.parseObject(message);
return jsonObject.getString(MESSAGE_STATE);
}

/**
* 收到客户端消息后调用的方法
* Session session
*
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
if (!session.isOpen() || StringUtils.isEmpty(message)) return;
String state = getState(message);
ITerminalAuditProcess iTerminalAuditProcess = TerminalAuditProcessFactory.getProcessByKey(state);
if (iTerminalAuditProcess != null) iTerminalAuditProcess.process(message, session);
}


/**
* 出现错误
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误:{},Session ID: {}", error.getMessage(), session.getId());
}

/**
* 发送消息,实践表明,每次浏览器刷新,session会发生变化。
*
* @param session
* @param message
*/
public static void sendMessage(Session session, String message) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
log.error("发送消息出错:{}", e.getMessage());
e.printStackTrace();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
* @Author baiyi
Expand All @@ -22,6 +24,14 @@ public class TerminalSessionInstancePacker {

public void wrapVO(TerminalSessionInstanceVO.ISessionInstances iSessionInstances) {
List<TerminalSessionInstance> sessionInstances = terminalSessionInstanceService.queryBySessionId(iSessionInstances.getSessionId());
iSessionInstances.setSessionInstances(BeanCopierUtil.copyListProperties(sessionInstances, TerminalSessionInstanceVO.SessionInstance.class));
iSessionInstances.setSessionInstances(sessionInstances.stream().map(this::wrapVO).collect(Collectors.toList()));
}

public TerminalSessionInstanceVO.SessionInstance wrapVO(TerminalSessionInstance terminalSessionInstance) {
TerminalSessionInstanceVO.SessionInstance vo = BeanCopierUtil.copyProperties(terminalSessionInstance, TerminalSessionInstanceVO.SessionInstance.class);
// 会话时长
Date endTime = vo.getInstanceClosed() ? vo.getCloseTime() : new Date();
vo.setSessionDuration(Long.valueOf((endTime.getTime() - vo.getOpenTime().getTime()) / 1000).intValue());
return vo;
}
}
3 changes: 2 additions & 1 deletion opscloud-manage/src/main/resources/application-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ white:
- /swagger-resources
- /swagger-ui.html
- /v2/api-docs
- /doc.html
- /api/ws/guacamole/tunnel
- /api/ws/terminal
- /api/ws/kubernetes/terminal
- /doc.html
- /api/ws/terminal/session/audit


spring:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
package com.baiyi.opscloud.service.terminal.impl;

import com.baiyi.opscloud.domain.DataTable;
import com.baiyi.opscloud.domain.generator.opscloud.Env;
import com.baiyi.opscloud.domain.generator.opscloud.ServerGroupType;
import com.baiyi.opscloud.domain.generator.opscloud.TerminalSession;
import com.baiyi.opscloud.domain.generator.opscloud.TerminalSessionInstance;
import com.baiyi.opscloud.domain.param.terminal.TerminalSessionParam;
import com.baiyi.opscloud.domain.vo.terminal.TerminalSessionVO;
import com.baiyi.opscloud.mapper.opscloud.TerminalSessionMapper;
import com.baiyi.opscloud.service.terminal.TerminalSessionService;
import com.baiyi.opscloud.util.SQLUtil;
Expand Down Expand Up @@ -50,7 +46,7 @@ public DataTable<TerminalSession> queryTerminalSessionPage(TerminalSessionParam.
}
if(!StringUtils.isEmpty(pageQuery.getSessionType()))
criteria.andEqualTo("sessionType",pageQuery.getSessionType());
example.setOrderByClause("create_time");
example.setOrderByClause("create_time desc");
List<TerminalSession> data = sessionMapper.selectByExample(example);
return new DataTable<>(data, page.getTotal());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@ public enum MessageState {
RESIZE("RESIZE", "改变形体"),
CLOSE("CLOSE", "关闭所有Term会话"),
LOGOUT("LOGOUT", "关闭Term会话"),
BATCH_COMMAND("BATCH_COMMAND","批量命令");
BATCH_COMMAND("BATCH_COMMAND","批量命令"),

PLAY("PLAY","播放"),


;
private String state;
private String desc;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package com.baiyi.opscloud.sshcore.handler;

import com.baiyi.opscloud.common.redis.RedisUtil;
import com.baiyi.opscloud.common.redis.TerminalKeyUtil;
import com.baiyi.opscloud.common.util.IOUtil;
import com.baiyi.opscloud.sshcore.config.TerminalConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


/**
* @Author baiyi
* @Date 2020/5/25 3:08 下午
Expand All @@ -17,44 +16,49 @@
@Component
public class AuditRecordHandler {

private static RedisUtil redisUtil;
// private static RedisUtil redisUtil;

private static TerminalConfig terminalConfig;

@Autowired
private void setRedisUtil(RedisUtil redisUtil) {
AuditRecordHandler.redisUtil = redisUtil;
}
// @Autowired
// private void setRedisUtil(RedisUtil redisUtil) {
// AuditRecordHandler.redisUtil = redisUtil;
// }

@Autowired
private void setXTerminalConfig(TerminalConfig terminalConfig) {
private void setTerminalConfig(TerminalConfig terminalConfig) {
AuditRecordHandler.terminalConfig = terminalConfig;
}

public static void recordAuditLog(String sessionId, String instanceId,char[] buf) {
public static void recordAuditLog(String sessionId, String instanceId, char[] buf, int off, int len) {
try {
IOUtil.appendFile(new String(buf), terminalConfig.buildAuditLogPath(sessionId, instanceId));
IOUtil.appendFile(new String(buf).substring(off, len), terminalConfig.buildAuditLogPath(sessionId, instanceId));
} catch (Exception e) {
log.error("Web终端会话日志写入失败! sessionId = {}, instanceId = {}", sessionId, instanceId);
}
}

private static void recordAuditLog(String sessionId, String instanceId) {
String cacheKey = TerminalKeyUtil.buildAuditLogKey(sessionId, instanceId);
try {
if (redisUtil.hasKey(cacheKey)) {
// 追加内容
String log = (String) redisUtil.get(cacheKey);
IOUtil.appendFile(log, terminalConfig.buildAuditLogPath(sessionId, instanceId));
redisUtil.del(cacheKey); // 清空缓存
}
} catch (Exception e) {
log.error("Web终端会话日志写入失败! sessionId = {}, instanceId = {}", sessionId, instanceId);
}
public static String getAuditLogPath(String sessionId, String instanceId) {
return terminalConfig.buildAuditLogPath(sessionId, instanceId);
}

// private static void recordAuditLog(String sessionId, String instanceId) {
// String cacheKey = TerminalKeyUtil.buildAuditLogKey(sessionId, instanceId);
// try {
// if (redisUtil.hasKey(cacheKey)) {
// // 追加内容
// String log = (String) redisUtil.get(cacheKey);
// IOUtil.appendFile(log, terminalConfig.buildAuditLogPath(sessionId, instanceId));
// redisUtil.del(cacheKey); // 清空缓存
// }
// } catch (Exception e) {
// log.error("Web终端会话日志写入失败! sessionId = {}, instanceId = {}", sessionId, instanceId);
// }
// }

/**
* 用户命令操作审计日志,暂不使用
*
* @param commander
* @param sessionId
* @param instanceId
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.baiyi.opscloud.sshcore.message.audit;

import com.baiyi.opscloud.domain.model.message.IState;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;

/**
* @Author baiyi
* @Date 2021/7/23 2:59 下午
* @Version 1.0
*/
@Data
@JsonIgnoreProperties
public class BaseAuditMessage implements IState {

private String state;

private String sessionId;

private String instanceId;

}
Loading

0 comments on commit 5af5207

Please sign in to comment.