feat: initial webssh tooling

This commit is contained in:
Aarnav Tale
2025-05-30 19:35:47 -04:00
parent f6d8ad25e1
commit 7dfcbef774
16 changed files with 792 additions and 83 deletions
+56
View File
@@ -0,0 +1,56 @@
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)
}
}