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: ` +
+New data: ` + strconv.Itoa(i) + ` +
+`, + } + _, err := json.Marshal(message) + if err != nil { + log.Printf("ERROR marshalling json: %v", err) + return + } + //conn.Write(data) + go func() { + for { + b := make([]byte, 1024) + _, err := conn.Read(b) + if err != nil { + return + } + } + }() + _, err = conn.Write([]byte(message.Content)) + if err == nil { + _, err = conn.Write([]byte("\n")) + } + if err != nil { + log.Printf("ERROR sending message: %v", err) + return + } + i++ + } +} diff --git a/cmd/tcptows/tcptows.go b/cmd/tcptows/tcptows.go index b0e1738..462f89a 100644 --- a/cmd/tcptows/tcptows.go +++ b/cmd/tcptows/tcptows.go @@ -36,7 +36,7 @@ func handleConnection(conn net.Conn, wsURL string, insecure bool) { log.Println("WebSocket connection error:", err) return } - wsConn := websocketutil.NewWebSocketConn(_wsConn) + wsConn := websocketutil.NewWebSocketConn(_wsConn, false) defer wsConn.Close() iowrappers.SynchronizeStreams(wsConn, conn) diff --git a/cmd/wsproxy/wsproxy.go b/cmd/wsproxy/wsproxy.go index 1ad271b..a54c719 100644 --- a/cmd/wsproxy/wsproxy.go +++ b/cmd/wsproxy/wsproxy.go @@ -70,7 +70,7 @@ func main() { log.Println("WebSocket connection error:", err) panic(err) } - wsConn := websocketutil.NewWebSocketConn(_wsConn) + wsConn := websocketutil.NewWebSocketConn(_wsConn, false) defer wsConn.Close() iowrappers.SynchronizeStreams(wsConn, Stdio{}) diff --git a/cmd/wstotcp/wstotcp.go b/cmd/wstotcp/wstotcp.go index 8f2cff5..99afe69 100644 --- a/cmd/wstotcp/wstotcp.go +++ b/cmd/wstotcp/wstotcp.go @@ -35,7 +35,7 @@ func main() { func handleWebSocket(w http.ResponseWriter, r *http.Request, tcpConn net.Conn) { conn, err := upgrader.Upgrade(w, r, nil) - wsConn := websocketutil.NewWebSocketConn(conn) + wsConn := websocketutil.NewWebSocketConn(conn, false) if err != nil { log.Println("Error upgrading to WebSocket:", err) return diff --git a/compose.yaml b/compose.yaml index 71ed4b8..95d93bf 100644 --- a/compose.yaml +++ b/compose.yaml @@ -7,3 +7,6 @@ services: context: . ports: - 8000:8000 + environment: + CONVERGE_USERNAME: abc + CONVERGE_PASSWORD: "123" diff --git a/pkg/templates/basepage.templ b/pkg/templates/basepage.templ index d4de252..54e2871 100644 --- a/pkg/templates/basepage.templ +++ b/pkg/templates/basepage.templ @@ -17,9 +17,17 @@ templ BasePage(tab int) { + + + + Converge + + diff --git a/pkg/templates/sessions.templ b/pkg/templates/sessions.templ index 4828917..a7cffa9 100644 --- a/pkg/templates/sessions.templ +++ b/pkg/templates/sessions.templ @@ -2,9 +2,12 @@ package templates templ Sessions() { -
- To be done +
+
+ Initial content +
+ } diff --git a/pkg/templates/usage.templ b/pkg/templates/usage.templ index 1cbd56f..5bc894d 100644 --- a/pkg/templates/usage.templ +++ b/pkg/templates/usage.templ @@ -12,12 +12,12 @@ templ Usage(secure string, host string, username string) {

{`
            # 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) }