diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 6da5291..74ceb34 100755 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -258,7 +258,7 @@ func main() { log.Println("WebSocket connection error:", err) return } - wsConn := websocketutil.NewWebSocketConn(conn) + wsConn := websocketutil.NewWebSocketConn(conn, false) defer wsConn.Close() serverInfo, err := comms.AgentInitialization(wsConn, comms.NewAgentInfo()) diff --git a/cmd/converge/converge.go b/cmd/converge/converge.go index fba9e0a..30346c8 100644 --- a/cmd/converge/converge.go +++ b/cmd/converge/converge.go @@ -9,12 +9,11 @@ import ( "math/rand" "net" "net/http" + _ "net/http/pprof" "os" "regexp" "strconv" "strings" - - _ "net/http/pprof" ) func parsePublicId(path string) (publicId string, _ error) { @@ -97,6 +96,8 @@ func main() { log.Printf("Using username '%s' and password '%s'", userPassword.Username, userPassword.Password) admin := converge.NewAdmin() + + // For agents connecting registrationService := websocketutil.WebSocketService{ Handler: func(w http.ResponseWriter, r *http.Request, conn net.Conn) { publicId, err := parsePublicId(r.URL.Path) @@ -112,6 +113,8 @@ func main() { } }, } + + // For users connecting with ssh clientService := websocketutil.WebSocketService{ Handler: func(w http.ResponseWriter, r *http.Request, conn net.Conn) { publicId, err := parsePublicId(r.URL.Path) @@ -127,9 +130,16 @@ func main() { }, } + // for the web browser getting live status updates. + sessionService := websocketutil.WebSocketService{ + Handler: sessionHandler, + Text: true, + } + // websocket endpoints http.HandleFunc("/agent/", registrationService.Handle) http.HandleFunc("/client/", clientService.Handle) + http.HandleFunc("/ws/sessions", sessionService.Handle) // create filehandler with templating for html files. http.Handle("/docs/", http.StripPrefix("/docs/", http.HandlerFunc(pageHandler))) diff --git a/cmd/converge/pagehandler.go b/cmd/converge/pagehandler.go index 86c987a..40a16c5 100644 --- a/cmd/converge/pagehandler.go +++ b/cmd/converge/pagehandler.go @@ -32,7 +32,7 @@ func pageHandler(w http.ResponseWriter, r *http.Request) { case "index.html": templates.AboutTab().Render(r.Context(), w) case "usage.html": - templates.UsageTab(secure, r.URL.Host, username).Render(r.Context(), w) + templates.UsageTab(secure, r.Host, username).Render(r.Context(), w) case "downloads.html": templates.DownloadsTab().Render(r.Context(), w) case "sessions.html": diff --git a/cmd/converge/sessionhandler.go b/cmd/converge/sessionhandler.go new file mode 100644 index 0000000..dc90982 --- /dev/null +++ b/cmd/converge/sessionhandler.go @@ -0,0 +1,55 @@ +package main + +import ( + "encoding/json" + "log" + "net" + "net/http" + "strconv" + "time" +) + +type Message struct { + Type string `json:"type"` + Content string `json:"content"` +} + +func sessionHandler(w http.ResponseWriter, r *http.Request, conn net.Conn) { + log.Println("Got sessions websocket connection") + i := 0 + for { + time.Sleep(1 * time.Second) + message := Message{ + Type: "update", + Content: ` +
{` # linux - `}curl http{secure}://{host}/docs/agent > agent{` + `}curl http{secure}://{host}/static/agent > agent{` chmod 755 agent `}./agent --id ID ws{secure}://{host}{` # windows - `}curl http{secure}://{host}/docs/agent.exe > agent.exe{` + `}curl http{secure}://{host}/static/agent.exe > agent.exe{` `}agent --id ID ws{secure}://{host}{` `}
diff --git a/pkg/websocketutil/connections.go b/pkg/websocketutil/connections.go index ea87213..0ac63f3 100644 --- a/pkg/websocketutil/connections.go +++ b/pkg/websocketutil/connections.go @@ -9,6 +9,11 @@ import ( type WebSocketConn struct { conn *websocket.Conn buf []byte + text bool +} + +func NewWebSocketConn(conn *websocket.Conn, text bool) *WebSocketConn { + return &WebSocketConn{conn: conn, text: text} } func (websocketConn *WebSocketConn) Read(p []byte) (n int, err error) { @@ -26,12 +31,12 @@ func (websocketConn *WebSocketConn) Read(p []byte) (n int, err error) { return n, err } -func NewWebSocketConn(conn *websocket.Conn) *WebSocketConn { - return &WebSocketConn{conn: conn} -} - func (websocketConn *WebSocketConn) Write(p []byte) (n int, err error) { - err = websocketConn.conn.WriteMessage(websocket.BinaryMessage, p) + messageType := websocket.BinaryMessage + if websocketConn.text { + messageType = websocket.TextMessage + } + err = websocketConn.conn.WriteMessage(messageType, p) if err == nil { n = len(p) } @@ -73,5 +78,5 @@ func ConnectWebSocket(conn net.Conn, urlStr string) (net.Conn, error) { return nil, err } - return NewWebSocketConn(wsConn), nil + return NewWebSocketConn(wsConn, false), nil } diff --git a/pkg/websocketutil/services.go b/pkg/websocketutil/services.go index 37efbd5..e8c7350 100644 --- a/pkg/websocketutil/services.go +++ b/pkg/websocketutil/services.go @@ -22,13 +22,14 @@ var upgrader = websocket.Upgrader{ } func handleWebSocket(w http.ResponseWriter, r *http.Request, - handler func(w http.ResponseWriter, r *http.Request, websockerConnection net.Conn)) { + handler func(w http.ResponseWriter, r *http.Request, websockerConnection net.Conn), + text bool) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Error upgrading to WebSocket:", err) return } - wsConn := NewWebSocketConn(conn) + wsConn := NewWebSocketConn(conn, text) defer wsConn.Close() handler(w, r, wsConn) @@ -36,8 +37,9 @@ func handleWebSocket(w http.ResponseWriter, r *http.Request, type WebSocketService struct { Handler func(w http.ResponseWriter, r *http.Request, conn net.Conn) + Text bool } func (endpoint *WebSocketService) Handle(w http.ResponseWriter, r *http.Request) { - handleWebSocket(w, r, endpoint.Handler) + handleWebSocket(w, r, endpoint.Handler, endpoint.Text) }