converge/cmd/wsproxy/wsproxy.go
Erik Brakkee 2ed81c3174 communication between agent and server. Removed the flags libray for command-line parsing.
Heartbeat mechanism from client to server over the custom connection for sending events to guarantee that the connectoin stays up.
2024-07-25 19:51:11 +02:00

78 lines
1.6 KiB
Go

package main
import (
"converge/pkg/iowrappers"
"converge/pkg/websocketutil"
"crypto/tls"
"fmt"
"github.com/gorilla/websocket"
"log"
"net"
"net/http"
"os"
"time"
)
func closeConnection(conn net.Conn) {
if tcpConn, ok := conn.(*net.TCPConn); ok {
tcpConn.SetLinger(0)
}
_ = conn.Close()
}
type Stdio struct{}
func (stdio Stdio) Read(b []byte) (n int, err error) {
return os.Stdin.Read(b)
}
func (stdio Stdio) Write(b []byte) (n int, err error) {
return os.Stdout.Write(b)
}
func main() {
usage := "Usage: wsproxy [--insecure] ws[s]://<host>[:port]/client/<ID>\n\n" +
"\n" +
"Here <ID> is the rendez-vous id of a continuous integration job\n" +
"\n" +
"Use this in an ssh command like this: \n" +
"\n" +
" ssh -oServerAliveInterval=10 -oProxyCommand='wsproxy ws[s]://<host>[:port]/client/<ID>' abc@localhost\n" +
"\n" +
"This latssh connect through wsproxy tocalhost\n"
args := os.Args[1:]
insecure := false
if len(args) == 2 && args[0] == "--insecure" {
insecure = true
args = args[1:]
}
if len(args) != 1 {
fmt.Fprintf(os.Stderr, usage)
os.Exit(1)
}
wsURL := args[0]
dialer := websocket.Dialer{
Proxy: http.ProxyFromEnvironment,
HandshakeTimeout: 45 * time.Second,
}
if insecure {
dialer.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
}
_wsConn, _, err := dialer.Dial(wsURL, nil)
if err != nil {
panic(err)
}
if err != nil {
log.Println("WebSocket connection error:", err)
panic(err)
}
wsConn := websocketutil.NewWebSocketConn(_wsConn)
defer wsConn.Close()
iowrappers.SynchronizeStreams(wsConn, Stdio{})
}