mirror of
https://github.com/tale/headplane.git
synced 2026-07-27 08:08:56 +00:00
57 lines
1.0 KiB
Go
57 lines
1.0 KiB
Go
package sshutil
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/tale/headplane/agent/internal/util"
|
|
)
|
|
|
|
func StartInputReader(fd3 io.Reader) {
|
|
log := util.GetLogger();
|
|
|
|
log.Info("Starting SSH fd3 input reader")
|
|
go func() {
|
|
buffer := make([]byte, 8192)
|
|
for {
|
|
n, err := fd3.Read(buffer)
|
|
if err != nil {
|
|
log.Error("fd3 read error: %v", err)
|
|
return
|
|
}
|
|
offset := 0
|
|
for offset < n {
|
|
id, payload, ok := decodeFrame(buffer[offset:n])
|
|
if !ok {
|
|
break // Wait for more data
|
|
}
|
|
offset += 1 + len(id) + 4 + len(payload)
|
|
|
|
sessionsMu.RLock()
|
|
sess, ok := sessions[id]
|
|
sessionsMu.RUnlock()
|
|
if !ok {
|
|
log.Error("invalid session id: %s", id)
|
|
continue
|
|
}
|
|
_, err := sess.Stdin.Write(payload)
|
|
if err != nil {
|
|
log.Error("failed to write to session stdin: %v", err)
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
func streamSSHOutput(id string, r io.Reader, fd4 io.Writer) {
|
|
buf := make([]byte, 1024)
|
|
for {
|
|
n, err := r.Read(buf)
|
|
if err != nil {
|
|
break
|
|
}
|
|
frame, _ := encodeFrame(id, buf[:n])
|
|
fd4.Write(frame)
|
|
}
|
|
}
|