lots of restructuring.
Experimensts with websockets over yamux failed. Now going to use a second connection to the server from the agent.
This commit is contained in:
		
							parent
							
								
									98e46ff7cc
								
							
						
					
					
						commit
						8981efd0b5
					
				| @ -3,6 +3,7 @@ package main | |||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
| 	"cidebug/pkg/iowrappers" | 	"cidebug/pkg/iowrappers" | ||||||
|  | 	"cidebug/pkg/websocketutil" | ||||||
| 	"crypto/rand" | 	"crypto/rand" | ||||||
| 	"crypto/rsa" | 	"crypto/rsa" | ||||||
| 	"crypto/x509" | 	"crypto/x509" | ||||||
| @ -98,6 +99,7 @@ func sshServer(hostKeyFile string) *ssh.Server { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func echoServer(conn io.ReadWriter) { | func echoServer(conn io.ReadWriter) { | ||||||
|  | 	log.Println("Echo service started") | ||||||
| 	io.Copy(conn, conn) | 	io.Copy(conn, conn) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -168,7 +170,7 @@ func main() { | |||||||
| 		log.Println("WebSocket connection error:", err) | 		log.Println("WebSocket connection error:", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	wsConn := iowrappers.NewWebSocketConn(conn) | 	wsConn := websocketutil.NewWebSocketConn(conn) | ||||||
| 	defer wsConn.Close() | 	defer wsConn.Close() | ||||||
| 
 | 
 | ||||||
| 	listener, err := yamux.Server(wsConn, nil) | 	listener, err := yamux.Server(wsConn, nil) | ||||||
| @ -176,14 +178,12 @@ func main() { | |||||||
| 		panic(err) | 		panic(err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	log.Println("Connection established to rendez-vous server, waiting for debug sessions") | 	// Need to create listener implementation that aactually listens for websocket connections.
 | ||||||
| 
 |  | ||||||
| 	var service AgentService | 	var service AgentService | ||||||
| 	service = ListenerServer(func() *ssh.Server { | 	service = ListenerServer(func() *ssh.Server { | ||||||
| 		return sshServer("hostkey.pem") | 		return sshServer("hostkey.pem") | ||||||
| 	}) | 	}) | ||||||
|  | 	//service = ConnectionServer(netCatServer)
 | ||||||
| 	//service = ConnectionServer(echoServer)
 | 	//service = ConnectionServer(echoServer)
 | ||||||
| 	//service := ConnectionServer(netCatServer)
 |  | ||||||
| 	service.Run(listener) | 	service.Run(listener) | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,10 +2,10 @@ package main | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"cidebug/pkg/converge" | 	"cidebug/pkg/converge" | ||||||
| 	"cidebug/pkg/iowrappers" |  | ||||||
| 	"cidebug/pkg/websocketutil" | 	"cidebug/pkg/websocketutil" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"log" | 	"log" | ||||||
|  | 	"net" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"regexp" | 	"regexp" | ||||||
| ) | ) | ||||||
| @ -23,7 +23,7 @@ func main() { | |||||||
| 
 | 
 | ||||||
| 	admin := converge.NewAdmin() | 	admin := converge.NewAdmin() | ||||||
| 	registrationService := websocketutil.WebSocketService{ | 	registrationService := websocketutil.WebSocketService{ | ||||||
| 		Handler: func(w http.ResponseWriter, r *http.Request, conn iowrappers.ReadWriteAddrCloser) { | 		Handler: func(w http.ResponseWriter, r *http.Request, conn net.Conn) { | ||||||
| 			publicId, err := parsePublicId(r.URL.Path) | 			publicId, err := parsePublicId(r.URL.Path) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				log.Printf("Cannot parse public id from url: '%v'\n", err) | 				log.Printf("Cannot parse public id from url: '%v'\n", err) | ||||||
| @ -37,7 +37,7 @@ func main() { | |||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	clientService := websocketutil.WebSocketService{ | 	clientService := websocketutil.WebSocketService{ | ||||||
| 		Handler: func(w http.ResponseWriter, r *http.Request, conn iowrappers.ReadWriteAddrCloser) { | 		Handler: func(w http.ResponseWriter, r *http.Request, conn net.Conn) { | ||||||
| 			publicId, err := parsePublicId(r.URL.Path) | 			publicId, err := parsePublicId(r.URL.Path) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				log.Printf("Cannot parse public id from url: '%v'\n", err) | 				log.Printf("Cannot parse public id from url: '%v'\n", err) | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package main | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"cidebug/pkg/iowrappers" | 	"cidebug/pkg/iowrappers" | ||||||
|  | 	"cidebug/pkg/websocketutil" | ||||||
| 	"github.com/gorilla/websocket" | 	"github.com/gorilla/websocket" | ||||||
| 	"log" | 	"log" | ||||||
| 	"net" | 	"net" | ||||||
| @ -24,7 +25,7 @@ func handleConnection(conn net.Conn, wsURL string) { | |||||||
| 		log.Println("WebSocket connection error:", err) | 		log.Println("WebSocket connection error:", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	wsConn := iowrappers.NewWebSocketConn(_wsConn) | 	wsConn := websocketutil.NewWebSocketConn(_wsConn) | ||||||
| 	defer wsConn.Close() | 	defer wsConn.Close() | ||||||
| 
 | 
 | ||||||
| 	iowrappers.SynchronizeStreams(wsConn, conn) | 	iowrappers.SynchronizeStreams(wsConn, conn) | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package main | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"cidebug/pkg/iowrappers" | 	"cidebug/pkg/iowrappers" | ||||||
|  | 	"cidebug/pkg/websocketutil" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"github.com/gorilla/websocket" | 	"github.com/gorilla/websocket" | ||||||
| 	"log" | 	"log" | ||||||
| @ -34,7 +35,7 @@ func main() { | |||||||
| 
 | 
 | ||||||
| func handleWebSocket(w http.ResponseWriter, r *http.Request, tcpConn net.Conn) { | func handleWebSocket(w http.ResponseWriter, r *http.Request, tcpConn net.Conn) { | ||||||
| 	conn, err := upgrader.Upgrade(w, r, nil) | 	conn, err := upgrader.Upgrade(w, r, nil) | ||||||
| 	wsConn := iowrappers.NewWebSocketConn(conn) | 	wsConn := websocketutil.NewWebSocketConn(conn) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Println("Error upgrading to WebSocket:", err) | 		log.Println("Error upgrading to WebSocket:", err) | ||||||
| 		return | 		return | ||||||
|  | |||||||
| @ -34,7 +34,8 @@ func NewAgent(publicId string, | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewClient(publicId string, clientConn iowrappers.ReadWriteAddrCloser, agentConn net.Conn) *Client { | func NewClient(publicId string, clientConn iowrappers.ReadWriteAddrCloser, | ||||||
|  | 	agentConn net.Conn) *Client { | ||||||
| 	return &Client{ | 	return &Client{ | ||||||
| 		publicId:  publicId, | 		publicId:  publicId, | ||||||
| 		agent:     agentConn, | 		agent:     agentConn, | ||||||
| @ -105,10 +106,13 @@ func (admin *Admin) addClient(publicId string, clientConn iowrappers.ReadWriteAd | |||||||
| 		// we should setup on-demend connections ot agents later.
 | 		// we should setup on-demend connections ot agents later.
 | ||||||
| 		return nil, fmt.Errorf("No agent found for publicId '%s'", publicId) | 		return nil, fmt.Errorf("No agent found for publicId '%s'", publicId) | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	agentConn, err := agent.clientSession.Open() | 	agentConn, err := agent.clientSession.Open() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	log.Println("Successful websocket connection to agent") | ||||||
|  | 
 | ||||||
| 	client := NewClient(publicId, clientConn, agentConn) | 	client := NewClient(publicId, clientConn, agentConn) | ||||||
| 	admin.clients = append(admin.clients, client) | 	admin.clients = append(admin.clients, client) | ||||||
| 	admin.logStatus() | 	admin.logStatus() | ||||||
| @ -180,6 +184,7 @@ func (admin *Admin) Connect(publicId string, conn iowrappers.ReadWriteAddrCloser | |||||||
| 		admin.RemoveClient(client) | 		admin.RemoveClient(client) | ||||||
| 	}() | 	}() | ||||||
| 	log.Printf("Connecting client and agent: '%s'\n", publicId) | 	log.Printf("Connecting client and agent: '%s'\n", publicId) | ||||||
|  | 
 | ||||||
| 	iowrappers.SynchronizeStreams(client.client, client.agent) | 	iowrappers.SynchronizeStreams(client.client, client.agent) | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,53 +1,12 @@ | |||||||
| package iowrappers | package iowrappers | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"github.com/gorilla/websocket" |  | ||||||
| 	"io" | 	"io" | ||||||
| 	"net" | 	"net" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type WebSocketConn struct { |  | ||||||
| 	conn *websocket.Conn |  | ||||||
| 	buf  []byte |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type ReadWriteAddrCloser interface { | type ReadWriteAddrCloser interface { | ||||||
| 	io.ReadWriteCloser | 	io.ReadWriteCloser | ||||||
| 
 | 
 | ||||||
| 	RemoteAddr() net.Addr | 	RemoteAddr() net.Addr | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func (websocketConn *WebSocketConn) Read(p []byte) (n int, err error) { |  | ||||||
| 	if len(websocketConn.buf) == 0 { |  | ||||||
| 		_, message, err := websocketConn.conn.ReadMessage() |  | ||||||
| 		if err != nil { |  | ||||||
| 			return 0, err |  | ||||||
| 		} |  | ||||||
| 		websocketConn.buf = message |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	n = copy(p, websocketConn.buf) |  | ||||||
| 	websocketConn.buf = websocketConn.buf[n:] |  | ||||||
| 
 |  | ||||||
| 	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) |  | ||||||
| 	if err == nil { |  | ||||||
| 		n = len(p) |  | ||||||
| 	} |  | ||||||
| 	return n, err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (websocketConn *WebSocketConn) Close() error { |  | ||||||
| 	return websocketConn.conn.Close() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (websocketConn *WebSocketConn) RemoteAddr() net.Addr { |  | ||||||
| 	return websocketConn.conn.RemoteAddr() |  | ||||||
| } |  | ||||||
|  | |||||||
							
								
								
									
										77
									
								
								pkg/websocketutil/connections.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								pkg/websocketutil/connections.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | |||||||
|  | package websocketutil | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/gorilla/websocket" | ||||||
|  | 	"net" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type WebSocketConn struct { | ||||||
|  | 	conn *websocket.Conn | ||||||
|  | 	buf  []byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (websocketConn *WebSocketConn) Read(p []byte) (n int, err error) { | ||||||
|  | 	if len(websocketConn.buf) == 0 { | ||||||
|  | 		_, message, err := websocketConn.conn.ReadMessage() | ||||||
|  | 		if err != nil { | ||||||
|  | 			return 0, err | ||||||
|  | 		} | ||||||
|  | 		websocketConn.buf = message | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	n = copy(p, websocketConn.buf) | ||||||
|  | 	websocketConn.buf = websocketConn.buf[n:] | ||||||
|  | 
 | ||||||
|  | 	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) | ||||||
|  | 	if err == nil { | ||||||
|  | 		n = len(p) | ||||||
|  | 	} | ||||||
|  | 	return n, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (websocketConn *WebSocketConn) Close() error { | ||||||
|  | 	return websocketConn.conn.Close() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (WebSocketConn *WebSocketConn) LocalAddr() net.Addr { | ||||||
|  | 	return WebSocketConn.conn.LocalAddr() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (websocketConn *WebSocketConn) RemoteAddr() net.Addr { | ||||||
|  | 	return websocketConn.conn.RemoteAddr() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (websocketConn *WebSocketConn) SetDeadline(t time.Time) error { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (websocketConn *WebSocketConn) SetReadDeadline(t time.Time) error { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (websocketConn *WebSocketConn) SetWriteDeadline(t time.Time) error { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ConnectWebSocket(conn net.Conn, urlStr string) (net.Conn, error) { | ||||||
|  | 	dialer := *websocket.DefaultDialer | ||||||
|  | 	dialer.NetDial = func(network, addr string) (net.Conn, error) { | ||||||
|  | 		return conn, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	wsConn, _, err := dialer.Dial(urlStr, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return NewWebSocketConn(wsConn), nil | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								pkg/websocketutil/listener.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								pkg/websocketutil/listener.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | package websocketutil | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"log" | ||||||
|  | 	"net" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type WebSocketListener struct { | ||||||
|  | 	connections chan net.Conn | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewWebSocketListener() WebSocketListener { | ||||||
|  | 	return WebSocketListener{ | ||||||
|  | 		connections: make(chan net.Conn), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (listener WebSocketListener) Accept() (net.Conn, error) { | ||||||
|  | 	conn := <-listener.connections | ||||||
|  | 	log.Printf("Got client connection: %v\n", conn) | ||||||
|  | 	return conn, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (listener *WebSocketListener) NewConnection(conn net.Conn) { | ||||||
|  | 	listener.connections <- conn | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (listener WebSocketListener) Close() error { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (listener WebSocketListener) Addr() net.Addr { | ||||||
|  | 	return WebSocketAddr("rendez-vous") | ||||||
|  | } | ||||||
| @ -1,32 +1,41 @@ | |||||||
| package websocketutil | package websocketutil | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"cidebug/pkg/iowrappers" |  | ||||||
| 	"github.com/gorilla/websocket" | 	"github.com/gorilla/websocket" | ||||||
| 	"log" | 	"log" | ||||||
|  | 	"net" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | type WebSocketAddr string | ||||||
|  | 
 | ||||||
|  | func (r WebSocketAddr) Network() string { | ||||||
|  | 	return "websocket" | ||||||
|  | } | ||||||
|  | func (r WebSocketAddr) String() string { | ||||||
|  | 	return string(r) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var upgrader = websocket.Upgrader{ | var upgrader = websocket.Upgrader{ | ||||||
| 	ReadBufferSize:  1024, | 	ReadBufferSize:  1024, | ||||||
| 	WriteBufferSize: 1024, | 	WriteBufferSize: 1024, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func handleWebSocket(w http.ResponseWriter, r *http.Request, | func handleWebSocket(w http.ResponseWriter, r *http.Request, | ||||||
| 	handler func(w http.ResponseWriter, r *http.Request, websockerConnection iowrappers.ReadWriteAddrCloser)) { | 	handler func(w http.ResponseWriter, r *http.Request, websockerConnection net.Conn)) { | ||||||
| 	conn, err := upgrader.Upgrade(w, r, nil) | 	conn, err := upgrader.Upgrade(w, r, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Println("Error upgrading to WebSocket:", err) | 		log.Println("Error upgrading to WebSocket:", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	wsConn := iowrappers.NewWebSocketConn(conn) | 	wsConn := NewWebSocketConn(conn) | ||||||
| 	defer wsConn.Close() | 	defer wsConn.Close() | ||||||
| 
 | 
 | ||||||
| 	handler(w, r, wsConn) | 	handler(w, r, wsConn) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type WebSocketService struct { | type WebSocketService struct { | ||||||
| 	Handler func(w http.ResponseWriter, r *http.Request, conn iowrappers.ReadWriteAddrCloser) | 	Handler func(w http.ResponseWriter, r *http.Request, conn net.Conn) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (endpoint *WebSocketService) Handle(w http.ResponseWriter, r *http.Request) { | func (endpoint *WebSocketService) Handle(w http.ResponseWriter, r *http.Request) { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user