feat: 去除 WebTerminal 的 websocket 依赖

This commit is contained in:
naiba
2024-07-14 12:48:10 +08:00
parent f02d1ee04e
commit 52f6cf5fdf
8 changed files with 205 additions and 90 deletions
+28 -44
View File
@@ -21,7 +21,6 @@ import (
"github.com/blang/semver"
"github.com/ebi-yade/altsvc-go"
"github.com/go-ping/ping"
"github.com/gorilla/websocket"
"github.com/nezhahq/go-github-selfupdate/selfupdate"
"github.com/nezhahq/service"
"github.com/quic-go/quic-go/http3"
@@ -374,8 +373,6 @@ func doTask(task *pb.Task) {
result.Id = task.GetId()
result.Type = task.GetType()
switch task.GetType() {
case model.TaskTypeTerminal:
handleTerminalTask(task)
case model.TaskTypeHTTPGET:
handleHttpGetTask(task, &result)
case model.TaskTypeICMPPing:
@@ -386,10 +383,14 @@ func doTask(task *pb.Task) {
handleCommandTask(task, &result)
case model.TaskTypeUpgrade:
handleUpgradeTask(task, &result)
case model.TaskTypeTerminalGRPC:
handleTerminalTask(task)
return
case model.TaskTypeKeepalive:
return
default:
println("不支持的任务:", task)
return
}
client.ReportTask(context.Background(), &result)
}
@@ -438,7 +439,7 @@ func doSelfUpdate(useLocalVersion bool) {
}
}
func handleUpgradeTask(task *pb.Task, result *pb.TaskResult) {
func handleUpgradeTask(*pb.Task, *pb.TaskResult) {
if agentCliParam.DisableForceUpdate {
return
}
@@ -628,24 +629,20 @@ func handleTerminalTask(task *pb.Task) {
println("Terminal 任务解析错误:", err)
return
}
protocol := "ws"
if terminal.UseSSL {
protocol += "s"
}
header := http.Header{}
header.Add("Secret", agentCliParam.ClientSecret)
// 目前只兼容Cloudflare验证
// 后续可能需要兼容更多的Cookie验证情况
if terminal.Cookie != "" {
cfCookie := fmt.Sprintf("CF_Authorization=%s", terminal.Cookie)
header.Add("Cookie", cfCookie)
}
conn, _, err := websocket.DefaultDialer.Dial(fmt.Sprintf("%s://%s/terminal/%s", protocol, terminal.Host, terminal.Session), header)
remoteIO, err := client.IOStream(context.Background())
if err != nil {
println("Terminal 连接失败:", err)
println("Terminal IOStream失败:", err)
return
}
// 发送 StreamID
if err := remoteIO.Send(&pb.IOStreamData{Data: append([]byte{
0xff, 0x05, 0xff, 0x05,
}, []byte(terminal.StreamID)...)}); err != nil {
println("Terminal 发送StreamID失败:", err)
return
}
defer conn.Close()
tty, err := pty.Start()
if err != nil {
@@ -655,50 +652,37 @@ func handleTerminalTask(task *pb.Task) {
defer func() {
err := tty.Close()
conn.Close()
println("terminal exit", terminal.Session, err)
errCloseSend := remoteIO.CloseSend()
println("terminal exit", terminal.StreamID, err, errCloseSend)
}()
println("terminal init", terminal.Session)
println("terminal init", terminal.StreamID)
go func() {
for {
buf := make([]byte, 1024)
read, err := tty.Read(buf)
if err != nil {
conn.WriteMessage(websocket.TextMessage, []byte(err.Error()))
conn.Close()
remoteIO.Send(&pb.IOStreamData{Data: []byte(err.Error())})
remoteIO.CloseSend()
return
}
conn.WriteMessage(websocket.BinaryMessage, buf[:read])
remoteIO.Send(&pb.IOStreamData{Data: buf[:read]})
}
}()
for {
messageType, reader, err := conn.NextReader()
if err != nil {
var remoteData *pb.IOStreamData
if remoteData, err = remoteIO.Recv(); err != nil {
return
}
if messageType == websocket.TextMessage {
continue
}
dataTypeBuf := make([]byte, 1)
read, err := reader.Read(dataTypeBuf)
if err != nil {
conn.WriteMessage(websocket.TextMessage, []byte("Unable to read message type from reader"))
if remoteData.Data == nil || len(remoteData.Data) == 0 {
return
}
if read != 1 {
return
}
switch dataTypeBuf[0] {
switch remoteData.Data[0] {
case 0:
io.Copy(tty, reader)
tty.Write(remoteData.Data[1:])
case 1:
decoder := util.Json.NewDecoder(reader)
decoder := util.Json.NewDecoder(strings.NewReader(string(remoteData.Data[1:])))
var resizeMessage WindowSize
err := decoder.Decode(&resizeMessage)
if err != nil {
-2
View File
@@ -50,8 +50,6 @@ func (p *program) run() {
}()
run()
return
}
func init() {