mirror of
https://github.com/tale/headplane.git
synced 2026-08-08 05:13:15 +00:00
feat: initial webssh tooling
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user