converge/pkg/comms/agentlistener.go
Erik Brakkee 7d25f39f5b test for connecting clients and bidirectional communication to agent.
Required lots of rework since the GOBChannel appeared to be reading
ahead of the data it actually needed. Now using more low-level IO
to send the clientId over to the agent instead.
2024-08-22 16:16:02 +02:00

54 lines
1.0 KiB
Go

package comms
import (
"git.wamblee.org/converge/pkg/support/websocketutil"
"net"
)
type AgentListener struct {
decorated net.Listener
}
func NewAgentListener(listener net.Listener) AgentListener {
return AgentListener{decorated: listener}
}
type LocalAddrHackConn struct {
net.Conn
localAddr net.Addr
}
func (conn LocalAddrHackConn) LocalAddr() net.Addr {
return conn.localAddr
}
func NewLocalAddrHackConn(conn net.Conn, clientId string) LocalAddrHackConn {
addr := LocalAddrHackConn{
localAddr: websocketutil.WebSocketAddr(clientId),
}
addr.Conn = conn
return addr
}
func (listener AgentListener) Accept() (net.Conn, error) {
conn, err := listener.decorated.Accept()
if err != nil {
return nil, err
}
clientId, err := ReceiveClientInfo(conn)
if err != nil {
conn.Close()
return nil, err
}
return NewLocalAddrHackConn(conn, clientId), nil
}
func (listener AgentListener) Close() error {
return listener.decorated.Close()
}
func (listener AgentListener) Addr() net.Addr {
return listener.decorated.Addr()
}