feat: 网元主机添加redis连接终端控制
This commit is contained in:
@@ -4,9 +4,12 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"reflect"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"be.ems/src/framework/logger"
|
||||
"be.ems/src/framework/redis"
|
||||
"be.ems/src/framework/telnet"
|
||||
"be.ems/src/framework/utils/ssh"
|
||||
"be.ems/src/framework/vo/result"
|
||||
@@ -104,7 +107,7 @@ func (s *WSReceive) Shell(client *model.WSClient, reqMsg model.WSRequest) {
|
||||
command := reqMsg.Data.(string)
|
||||
sshClientSession := client.ChildConn.(*ssh.SSHClientSession)
|
||||
_, err = sshClientSession.Write(command)
|
||||
case "ssh_resize":
|
||||
case "resize":
|
||||
// SSH会话窗口重置
|
||||
msgByte, _ := json.Marshal(reqMsg.Data)
|
||||
var data struct {
|
||||
@@ -225,7 +228,7 @@ func (s *WSReceive) Telnet(client *model.WSClient, reqMsg model.WSRequest) {
|
||||
command := reqMsg.Data.(string)
|
||||
telnetClientSession := client.ChildConn.(*telnet.TelnetClientSession)
|
||||
_, err = telnetClientSession.Write(command)
|
||||
case "telnet_resize":
|
||||
case "resize":
|
||||
// Telnet会话窗口重置
|
||||
msgByte, _ := json.Marshal(reqMsg.Data)
|
||||
var data struct {
|
||||
@@ -256,3 +259,76 @@ func (s *WSReceive) Telnet(client *model.WSClient, reqMsg model.WSRequest) {
|
||||
client.MsgChan <- resByte
|
||||
}
|
||||
}
|
||||
|
||||
// Redis 接收终端交互业务处理
|
||||
func (s *WSReceive) Redis(client *model.WSClient, reqMsg model.WSRequest) {
|
||||
// 必传requestId确认消息
|
||||
if reqMsg.RequestID == "" {
|
||||
msg := "message requestId is required"
|
||||
logger.Infof("ws Shell UID %s err: %s", client.BindUid, msg)
|
||||
msgByte, _ := json.Marshal(result.ErrMsg(msg))
|
||||
client.MsgChan <- msgByte
|
||||
return
|
||||
}
|
||||
|
||||
var resByte []byte
|
||||
var err error
|
||||
|
||||
switch reqMsg.Type {
|
||||
case "close":
|
||||
s.close(client)
|
||||
return
|
||||
case "redis":
|
||||
// Redis会话消息接收写入会话
|
||||
command := fmt.Sprint(reqMsg.Data)
|
||||
redisClientSession := client.ChildConn.(*redis.ConnRedis)
|
||||
output, err := redisClientSession.RunCMD(command)
|
||||
dataStr := ""
|
||||
if err != nil {
|
||||
dataStr = fmt.Sprintf("%s \r\n", err.Error())
|
||||
} else {
|
||||
// 获取结果的反射类型
|
||||
resultType := reflect.TypeOf(output)
|
||||
switch resultType.Kind() {
|
||||
case reflect.Slice:
|
||||
// 如果是切片类型需要进一步判断是否是 []string 或 []interface{}
|
||||
if resultType.Elem().Kind() == reflect.String {
|
||||
dataStr = fmt.Sprintf("%s \r\n", strings.Join(output.([]string), "\r\n"))
|
||||
} else if resultType.Elem().Kind() == reflect.Interface {
|
||||
arr := []string{}
|
||||
for _, v := range output.([]any) {
|
||||
arr = append(arr, fmt.Sprintf("%s", v))
|
||||
}
|
||||
dataStr = fmt.Sprintf("%s \r\n", strings.Join(arr, "\r\n"))
|
||||
}
|
||||
case reflect.Ptr:
|
||||
dataStr = "\r\n"
|
||||
case reflect.String, reflect.Int64:
|
||||
dataStr = fmt.Sprintf("%s \r\n", output)
|
||||
default:
|
||||
dataStr = fmt.Sprintf("%s \r\n", output)
|
||||
}
|
||||
}
|
||||
resByte, _ = json.Marshal(result.Ok(map[string]any{
|
||||
"requestId": reqMsg.RequestID,
|
||||
"data": dataStr,
|
||||
}))
|
||||
default:
|
||||
err = fmt.Errorf("message type %s not supported", reqMsg.Type)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
logger.Warnf("ws Shell UID %s err: %s", client.BindUid, err.Error())
|
||||
msgByte, _ := json.Marshal(result.ErrMsg(err.Error()))
|
||||
client.MsgChan <- msgByte
|
||||
if err == io.EOF {
|
||||
// 等待1s后关闭连接
|
||||
time.Sleep(1 * time.Second)
|
||||
client.StopChan <- struct{}{}
|
||||
}
|
||||
return
|
||||
}
|
||||
if len(resByte) > 0 {
|
||||
client.MsgChan <- resByte
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user