138 lines
3.0 KiB
Go
138 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"bash_go_service/shared/pkg/client"
|
|
"bash_go_service/shared/pkg/constants"
|
|
"bash_go_service/shared/pkg/logger"
|
|
"encoding/binary"
|
|
"net"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
type ExecParams struct {
|
|
Filename string `json:"filename"`
|
|
Pwd string `json:"pwd"`
|
|
Args []string `json:"args"`
|
|
Env []string `json:"env"`
|
|
LogPath string `json:"logPath"`
|
|
Error string `json:"error"`
|
|
}
|
|
|
|
func main() {
|
|
socketPath := constants.SocketPath
|
|
|
|
// 删除已存在的socket文件
|
|
os.Remove(socketPath)
|
|
|
|
listener, err := net.Listen("unix", socketPath)
|
|
if err != nil {
|
|
logger.Error("Listen error: %v\n", err)
|
|
return
|
|
}
|
|
defer listener.Close()
|
|
|
|
logger.Info("Waiting for connections.")
|
|
for {
|
|
conn, err := listener.Accept()
|
|
if err != nil {
|
|
logger.Error("Accept error: %v\n", err)
|
|
continue
|
|
}
|
|
|
|
go handleConnection(conn)
|
|
}
|
|
}
|
|
|
|
func writeMessage(conn net.Conn, message string) error {
|
|
// 先发送消息长度
|
|
messageLen := uint32(len(message))
|
|
if err := binary.Write(conn, binary.LittleEndian, messageLen); err != nil {
|
|
return err
|
|
}
|
|
// 再发送消息内容
|
|
_, err := conn.Write([]byte(message))
|
|
return err
|
|
}
|
|
|
|
func handleConnection(conn net.Conn) {
|
|
defer conn.Close()
|
|
|
|
params := &ExecParams{}
|
|
|
|
// 读取文件名
|
|
var filenameLen uint64
|
|
binary.Read(conn, binary.LittleEndian, &filenameLen)
|
|
filename := make([]byte, filenameLen)
|
|
conn.Read(filename)
|
|
params.Filename = string(filename)
|
|
|
|
// 读取pwd
|
|
var pwdLen uint64
|
|
binary.Read(conn, binary.LittleEndian, &pwdLen)
|
|
pwd := make([]byte, pwdLen)
|
|
conn.Read(pwd)
|
|
params.Pwd = string(pwd)
|
|
|
|
// 读取argv
|
|
var argc int32
|
|
binary.Read(conn, binary.LittleEndian, &argc)
|
|
params.Args = make([]string, argc)
|
|
|
|
for i := 0; i < int(argc); i++ {
|
|
var argLen uint64
|
|
binary.Read(conn, binary.LittleEndian, &argLen)
|
|
arg := make([]byte, argLen)
|
|
conn.Read(arg)
|
|
params.Args[i] = string(arg)
|
|
}
|
|
|
|
// 读取envp
|
|
var envc int32
|
|
binary.Read(conn, binary.LittleEndian, &envc)
|
|
params.Env = make([]string, envc)
|
|
|
|
for i := 0; i < int(envc); i++ {
|
|
var envLen uint64
|
|
binary.Read(conn, binary.LittleEndian, &envLen)
|
|
env := make([]byte, envLen)
|
|
conn.Read(env)
|
|
params.Env[i] = string(env)
|
|
}
|
|
|
|
// 读取logPath
|
|
var logPathLen uint64
|
|
binary.Read(conn, binary.LittleEndian, &logPathLen)
|
|
logPath := make([]byte, logPathLen)
|
|
conn.Read(logPath)
|
|
params.LogPath = string(logPath)
|
|
|
|
context, readErr := os.ReadFile(params.LogPath)
|
|
if readErr != nil {
|
|
params.Error = ""
|
|
} else {
|
|
params.Error = string(context)
|
|
}
|
|
|
|
// 在HTTP调用前发送[start]标记
|
|
writeMessage(conn, "[sthttp]")
|
|
|
|
time.Sleep(200 * time.Millisecond)
|
|
client := client.NewClient()
|
|
|
|
handleQuestion := func(question string) {
|
|
if question != "" {
|
|
// 当收到非空question时发送[res]响应
|
|
res := "[res]" + question + "[wait]"
|
|
writeMessage(conn, res)
|
|
}
|
|
}
|
|
|
|
client.PostToStream("/question", params, nil, handleQuestion)
|
|
|
|
// 结束后发送结束标记
|
|
writeMessage(conn, "[end]")
|
|
logger.Debug("connection done.")
|
|
conn.Close() // 显式关闭连接
|
|
}
|