From 6c0171e9d9be4761af25ae2fd3dfdc77b0222c63 Mon Sep 17 00:00:00 2001 From: Vasile Popescu Date: Sat, 3 Oct 2020 13:22:25 +0200 Subject: [PATCH] Log improvements - fixup in the other one --- client.go | 14 +++--- main.go | 44 +++++++++-------- proxy/proxy.go | 54 +++++++++++++-------- pty_master.go | 2 +- rw_combiner.go | 4 +- server/Makefile | 25 +--------- server/assets_bundle.go | 35 +++---------- server/frontend/static/404.html | 23 --------- server/frontend/templates/tty-share.in.html | 2 +- server/server.go | 15 +++--- server/session.go | 6 +-- 11 files changed, 87 insertions(+), 137 deletions(-) delete mode 100644 server/frontend/static/404.html diff --git a/client.go b/client.go index eaabd11..8d10bfc 100644 --- a/client.go +++ b/client.go @@ -2,7 +2,6 @@ package main import ( "encoding/json" - "fmt" "io" "net/http" "net/url" @@ -36,7 +35,7 @@ func (w *wsTextWriter) Write(data []byte) (n int, err error) { } func (c *ttyShareClient) Run() (err error) { - log.Debugf("Starting tty-share client on %s", c.url) + log.Debugf("Connecting as a client to %s ..", c.url) resp, err := http.Get(c.url) @@ -58,11 +57,11 @@ func (c *ttyShareClient) Run() (err error) { } wsURL := wsScheme + "://" + httpURL.Host + wsPath - log.Debugf("Connecting to WS URL: %s", wsURL) + log.Debugf("Built the WS URL from the headers: %s", wsURL) conn, _, err := websocket.DefaultDialer.Dial(wsURL, nil) if err != nil { - log.Fatal("Cannot create the websocket connection:", err) + return } state, err := terminal.MakeRaw(0) @@ -74,7 +73,7 @@ func (c *ttyShareClient) Run() (err error) { var msg ttyServer.MsgAll _, r, err := conn.NextReader() if err != nil { - fmt.Printf("Connection closed\n") + log.Debugf("Connection closed\n") return } err = json.NewDecoder(r).Decode(&msg) @@ -93,7 +92,7 @@ func (c *ttyShareClient) Run() (err error) { os.Stdout.Write(msgWrite.Data) case ttyServer.MsgIDWinSize: - log.Debugf("Remote window changed its size") + log.Infof("Remote window changed its size") // We ignore the window size changes - can't do much about that for // now. @@ -108,11 +107,10 @@ func (c *ttyShareClient) Run() (err error) { ww := &wsTextWriter{ conn: conn, } - _, err := io.Copy(ttyServer.NewTTYProtocolWriter(ww), os.Stdin) if err != nil { - fmt.Printf("Connection closed.\n") + log.Debugf("Connection closed.\n") return } } diff --git a/main.go b/main.go index ca0633e..d30c85c 100644 --- a/main.go +++ b/main.go @@ -16,7 +16,6 @@ import ( var version string = "0.0.0" - func createServer(frontListenAddress string, frontendPath string, tty io.Writer, sessionID string) *server.TTYServer { config := ttyServer.TTYServerConfig{ FrontListenAddress: frontListenAddress, @@ -51,7 +50,7 @@ Examples: Join a remote session by providing the URL created another tty-share command: - tty-share http://localhost:8000/local/ + tty-share http://localhost:8000/s/local/ Flags: ` @@ -64,16 +63,16 @@ Flags: listenAddress := flag.String("listen", "localhost:8000", "tty-server address") versionFlag := flag.Bool("version", false, "Print the tty-share version") frontendPath := flag.String("frontend-path", "", "The path to the frontend resources. By default, these resources are included in the server binary, so you only need this path if you don't want to use the bundled ones.") - proxyServerAddress := flag.String("tty-proxy", "localhost:9000", "Address of the proxy for public facing connections") + proxyServerAddress := flag.String("tty-proxy", "on.tty-share.com:4567", "Address of the proxy for public facing connections") readOnly := flag.Bool("readonly", false, "Start a read only session") publicSession := flag.Bool("public", false, "Create a public session") noTLS := flag.Bool("no-tls", false, "Don't use TLS to connect to the tty-proxy server. Useful for local debugging") + verbose := flag.Bool("verbose", false, "Verbose logging") flag.Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), "%s", usageString) flag.PrintDefaults() fmt.Fprintf(flag.CommandLine.Output(), "\n") } - flag.Parse() if *versionFlag { @@ -81,6 +80,20 @@ Flags: return } + // Log setup + log.SetLevel(log.WarnLevel) + if *verbose { + log.SetLevel(log.DebugLevel) + } + + if *logFileName != "-" { + logFile, err := os.Create(*logFileName) + if err != nil { + fmt.Printf("Can't open %s for writing logs\n", *logFileName) + } + log.SetOutput(logFile) + } + // tty-share can work in two modes: either starting a command to be shared by acting as a // server, or by acting as a client for the remote side If we have an argument, that is not // a flag, passed to tty-share, we expect that to be the URl to connect to, as a @@ -92,22 +105,12 @@ Flags: err := client.Run() if err != nil { - fmt.Printf("Cannot connect to the remote session: %s\n", err.Error()) + log.Errorf("Cannot connect to the remote session. Make sure the URL points to a valid tty-share session.", err.Error()) } return } - log.SetLevel(log.InfoLevel) - if *logFileName != "-" { - fmt.Printf("Writing logs to: %s\n", *logFileName) - logFile, err := os.Create(*logFileName) - if err != nil { - fmt.Printf("Can't open %s for writing logs\n", *logFileName) - } - log.SetLevel(log.DebugLevel) - log.SetOutput(logFile) - } - + // tty-share works as a server, from here on if !isStdinTerminal() { fmt.Printf("Input not a tty\n") os.Exit(1) @@ -117,7 +120,7 @@ Flags: if *publicSession { proxy, err := proxy.NewProxyConnection(*listenAddress, *proxyServerAddress, *noTLS) if err != nil { - fmt.Printf("Can't connect to the proxy: %s\n", err.Error()) + log.Errorf("Can't connect to the proxy: %s\n", err.Error()) return } @@ -129,7 +132,7 @@ Flags: // Display the session information to the user, before showing any output from the command. // Wait until the user presses Enter - fmt.Printf("local session: http://%s/local/\n", *listenAddress) + fmt.Printf("local session: http://%s/s/local/\n", *listenAddress) fmt.Printf("Press Enter to continue!\n") bufio.NewReader(os.Stdin).ReadString('\n') @@ -158,7 +161,7 @@ Flags: ptyMaster.Refresh() }) if err != nil { - log.Error(err.Error()) + log.Debugf("Server done: %s", err.Error()) } }() @@ -175,7 +178,6 @@ Flags: }() ptyMaster.Wait() - fmt.Printf("tty-share finished.\n\r") + fmt.Printf("tty-share finished\n\n") server.Stop() - } diff --git a/proxy/proxy.go b/proxy/proxy.go index 5c89089..4c00db7 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -51,8 +51,9 @@ func NewProxyConnection(backConnAddrr, proxyAddr string, noTLS bool) (*proxyConn } // C -> S: HelloCLient - // S -> C: HelloServer (sesionID) + // S -> C: HelloServer {sesionID} je := json.NewEncoder(conn) + // TODO: extract these strings constants somewhere at some point helloC := HelloClient{ Version: "1", Data: "-", @@ -69,7 +70,7 @@ func NewProxyConnection(backConnAddrr, proxyAddr string, noTLS bool) (*proxyConn return nil, err } - log.Debugf("Got from the ReverseProxy: version=%s, sessionID=%s", helloS.Version, helloS.SessionID) + log.Debugf("Connected to %s tty-proxy: version=%s, sessionID=%s", helloS.PublicURL, helloS.Version, helloS.SessionID) session, err := yamux.Server(conn, nil) return &proxyConnection{ @@ -82,21 +83,23 @@ func NewProxyConnection(backConnAddrr, proxyAddr string, noTLS bool) (*proxyConn func (p *proxyConnection) RunProxy() { for { - conn, err := p.muxSession.Accept() + frontConn, err := p.muxSession.Accept() if err != nil { - log.Errorf("tty-proxy connection closed.\n") + log.Debugf("tty-proxy connection closed: %s", err.Error()) return } + defer frontConn.Close() go func() { - dst, err := net.Dial("tcp", p.backConnAddress) - defer dst.Close() - defer conn.Close() + backConn, err := net.Dial("tcp", p.backConnAddress) if err != nil { - log.Errorf("Client: Can't connect to the target HTTP server: %s\n", err.Error()) + log.Errorf("Cannot proxy the connection to the target HTTP server: %s", err.Error()) + return } - glueConnAndWait(dst, conn) + defer backConn.Close() + + pipeConnectionsAndWait(backConn, frontConn) }() } } @@ -112,25 +115,36 @@ func errToString(err error) string { return "nil" } -func glueConnAndWait(conn1, conn2 net.Conn) error { +func pipeConnectionsAndWait(backConn, frontConn net.Conn) error { errChan := make(chan error, 2) - log.Debugf("Starting the glue of the two conn %s %s", conn1.LocalAddr().String(), conn2.LocalAddr().String()) + backConnAddr := backConn.RemoteAddr().String() + frontConnAddr := frontConn.RemoteAddr().String() + + log.Debugf("Piping the two conn %s <-> %s ..", backConnAddr, frontConnAddr) - copyAndNotify := func(dst, src net.Conn) { + copyAndNotify := func(dst, src net.Conn, info string) { n, err := io.Copy(dst, src) - log.Debugf("Wrote %d bytes, %s -> %s\n", n, src.LocalAddr().String(), dst.LocalAddr().String()) - if err != nil { - log.Debugf(" -- ended with error: %s\n", err.Error()) - } + log.Debugf("%s: piping done with %d bytes, and err %s", info, n, errToString(err)) errChan <- err + + // Close both connections when done with copying. Yeah, both will beclosed two + // times, but it doesn't matter. By closing them both, we unblock the other copy + // call which would block indefinitely otherwise + dst.Close() + src.Close() } - go copyAndNotify(conn1, conn2) - go copyAndNotify(conn2, conn1) + go copyAndNotify(backConn, frontConn, "front->back") + go copyAndNotify(frontConn, backConn, "back->front") err1 := <-errChan err2 := <-errChan - log.Debugf("Finished the glued connections with: %s and %s", errToString(err1), errToString(err2)) - return err1 + log.Debugf("Piping finished for %s <-> %s .", backConnAddr, frontConnAddr) + + // Return one of the two error that is not nil + if err1 != nil { + return err1 + } + return err2 } diff --git a/pty_master.go b/pty_master.go index 369c8aa..b39366b 100644 --- a/pty_master.go +++ b/pty_master.go @@ -8,8 +8,8 @@ import ( "time" ptyDevice "github.com/elisescu/pty" - "golang.org/x/crypto/ssh/terminal" log "github.com/sirupsen/logrus" + "golang.org/x/crypto/ssh/terminal" ) type onWindowChangedCB func(int, int) diff --git a/rw_combiner.go b/rw_combiner.go index b69bf30..becc7f5 100644 --- a/rw_combiner.go +++ b/rw_combiner.go @@ -16,10 +16,10 @@ func newReadWriter(r io.Reader, w io.Writer) io.ReadWriter { } } -func (c *combiner)Read(p []byte) (n int, err error) { +func (c *combiner) Read(p []byte) (n int, err error) { return c.r.Read(p) } -func (c *combiner)Write(p []byte) (n int, err error) { +func (c *combiner) Write(p []byte) (n int, err error) { return c.w.Write(p) } diff --git a/server/Makefile b/server/Makefile index 580de21..bd47585 100644 --- a/server/Makefile +++ b/server/Makefile @@ -1,26 +1,16 @@ -TTY_SERVER=./tty-server - TTY_SERVER_ASSETS=$(wildcard frontend/public/*) frontend/public/index.html -TTY_SERVER_SRC=$(wildcard *.go) assets_bundle.go .PHONY: all frontend clean cleanfront rebuild -all: $(TTY_SERVER) +all: assets_bundle.go @echo "Done" rebuild: clean all -# Building the server and tty-share -$(TTY_SERVER): $(TTY_SERVER_SRC) - go build -o $@ - assets_bundle.go: $(TTY_SERVER_ASSETS) go get github.com/go-bindata/go-bindata/... go-bindata --prefix frontend/public/ -pkg server -o $@ frontend/public/* -%.zip: % - zip $@ $^ - frontend: cleanfront frontend/public/index.html assets_bundle.go frontend/public/index.html: @@ -30,16 +20,5 @@ cleanfront: rm -fr frontend/public clean: cleanfront - rm -fr tty-server assets_bundle.go + rm -fr assets_bundle.go @echo "Cleaned" - -## Development helper targets -### Runs the server, without TLS/HTTPS (no need for localhost testing) -runs: $(TTY_SERVER) - $(TTY_SERVER) --url http://localhost:9090 --web_address :9090 --sender_address :7654 -frontend_path ./frontend/public -### Runs the sender, without TLS (no need for localhost testing) -runc: - tty-share --useTLS=false --server localhost:7654 - -test: - @go test github.com/elisescu/tty-share/testing -v diff --git a/server/assets_bundle.go b/server/assets_bundle.go index abe6d9b..87bae5d 100644 --- a/server/assets_bundle.go +++ b/server/assets_bundle.go @@ -1,7 +1,6 @@ // Code generated for package server by go-bindata DO NOT EDIT. (@generated) // sources: // frontend/public/404.css -// frontend/public/404.html // frontend/public/404.in.html // frontend/public/bootstrap.min.css // frontend/public/tty-share.in.html @@ -97,27 +96,7 @@ func _404Css() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "404.css", size: 3393, mode: os.FileMode(420), modTime: time.Unix(1601583738, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var __404Html = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x91\xbd\x8e\xeb\x20\x10\x85\x7b\x3f\xc5\x84\xe6\x56\x84\x14\xae\x22\x4c\x73\xef\xad\x37\xd2\xa6\xd9\x12\xe3\xb1\x8d\x82\x01\x31\xb3\xc9\xe6\xed\x57\xb6\x53\xe4\xa7\xd8\xad\x90\xbe\xf9\x74\x74\xc4\xd1\x1b\x29\xe1\x38\x7a\x02\x4f\xc0\xf6\x84\x11\xfa\x92\xa6\x3d\x8c\xcc\x99\xf6\x4a\xb9\x14\x52\x09\xbe\xdd\xba\x34\xa9\x4b\x56\x7d\x41\x94\xf5\xae\x96\x58\x4a\x2a\x32\xdb\x01\x25\xe3\x94\x83\x65\x24\x05\x52\x9a\x4a\x6f\xfe\xbd\xfd\x3d\x7e\x1c\xfe\xc3\xc8\x53\x30\x55\xa5\xe7\x17\x82\x8d\x43\x23\x30\x0a\x53\xe9\x11\x6d\x67\x2a\x00\x00\x1d\x7c\x3c\x41\xc1\xd0\x08\xe2\x6b\x40\x1a\x11\x59\x00\x5f\x33\x36\x82\xf1\x8b\x95\x23\x12\x30\x16\xec\x1b\xa1\x88\x2d\x7b\xa7\xea\x5d\xbd\x9d\xb1\xa9\xb4\x5a\xa3\x74\x9b\xba\xeb\x2d\x91\xd0\xb1\x4f\x11\x7c\xd7\x88\x98\x58\xf6\xe9\x33\x76\x62\x3d\x2e\x42\xe7\xcf\xcb\x91\x3d\x07\x14\xe6\x3d\x4d\xc8\xa3\x8f\xc3\x1f\x82\x4b\x49\x71\xd0\xaa\xf3\xe7\x27\xdf\x05\x4b\xd4\x08\xe7\x8b\x0b\x48\x77\x69\x8b\x91\x4d\xbd\xab\x1f\xd0\x82\xdb\x62\x5e\x21\x4d\x36\x04\x73\xb0\x03\x42\x4c\x0c\x4b\x3b\xad\x56\xfa\x98\xaa\xf2\x13\xa0\x6c\xe3\x63\x13\x68\xfd\x20\x8c\x56\xf3\xe5\x67\x79\xc2\xee\xf7\xf2\xd2\xe8\x55\xbf\xfb\x1c\xad\x6e\x5f\x3d\xef\xb0\x0e\x30\x0f\xb2\x8c\xfe\x1d\x00\x00\xff\xff\xd2\xed\xfa\x10\x59\x02\x00\x00") - -func _404HtmlBytes() ([]byte, error) { - return bindataRead( - __404Html, - "404.html", - ) -} - -func _404Html() (*asset, error) { - bytes, err := _404HtmlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "404.html", size: 601, mode: os.FileMode(420), modTime: time.Unix(1601583738, 0)} + info := bindataFileInfo{name: "404.css", size: 3393, mode: os.FileMode(420), modTime: time.Unix(1601755149, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -137,7 +116,7 @@ func _404InHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "404.in.html", size: 616, mode: os.FileMode(420), modTime: time.Unix(1601583738, 0)} + info := bindataFileInfo{name: "404.in.html", size: 616, mode: os.FileMode(420), modTime: time.Unix(1601755149, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -157,12 +136,12 @@ func bootstrapMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bootstrap.min.css", size: 140930, mode: os.FileMode(420), modTime: time.Unix(1601583738, 0)} + info := bindataFileInfo{name: "bootstrap.min.css", size: 140930, mode: os.FileMode(420), modTime: time.Unix(1601755149, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _ttyShareInHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x92\xcf\xaf\xdb\x20\x0c\xc7\xef\xef\xaf\xf0\xe3\x4e\xd0\x6e\xd3\x44\x7a\x9a\x26\xed\x56\x69\x9d\x76\x76\x82\x37\x5c\x25\x10\x81\x97\x34\x8a\xf2\xbf\x4f\x09\x52\x9b\xaa\x7b\x5c\xc0\xe6\xeb\x8f\x7f\x80\x7d\x77\xb1\x95\x79\x20\xf0\xd2\x77\xa7\x37\x5b\x36\x00\x00\xeb\x09\x5d\x39\xee\x66\x4f\x82\xd0\x7a\x4c\x99\xa4\x56\x3f\x2f\xdf\xf4\x67\x75\xb8\x16\x96\x8e\x4e\x22\xb3\xce\x1e\x13\x59\x53\x1c\x05\x65\x1e\x2c\xdb\x44\x37\x1f\xe2\xde\xb5\x86\x8b\xe7\x0c\x8e\x47\x40\x91\xc4\xcd\x5f\xa1\x0c\x13\x77\x1d\x34\x04\x89\xd0\x41\x33\x83\x78\x82\x3b\x1d\xda\xd8\xf7\x18\x1c\x4c\x9e\x02\x24\x0c\x10\xc3\xae\x48\xd4\x47\x21\xc8\xec\x08\xb4\x3e\xa4\xd9\xe8\xec\x6a\x75\x47\xe8\xad\x1f\x05\x43\x8a\x12\xf5\x48\x29\x73\x0c\xb5\xfa\xa4\x60\xca\x7a\x40\xf1\xb5\x5a\x96\xea\xd7\x8f\x33\x8a\x5f\x57\x75\xb2\xc6\xf1\xf8\x3f\x1e\xa5\x9e\x03\x76\x1f\x2b\x32\x89\x70\xf8\x93\x5f\x15\xb9\x4d\x3c\x08\x6c\xe3\xdf\x40\x37\x31\x57\x1c\xb1\x78\x0f\xa3\xdd\xd6\xc4\xc1\xc5\xa9\x12\x99\xbf\x07\x16\xc6\xee\x2b\x0a\x42\x0d\xcb\x93\x6a\x57\xe6\xad\xe4\x2f\x70\xa8\xfe\x49\xf3\xb0\xac\x29\xa9\x5e\x2b\xca\xa9\xad\x95\x59\x96\x6a\x8b\x3f\x27\xfa\xcd\xb7\x75\x35\x59\x50\xb8\x35\xf7\x09\x56\xd7\xbd\xa7\x23\xc4\x9a\xf2\xba\xd6\x94\x7f\xf4\xf6\x2f\x00\x00\xff\xff\x73\xbb\x5a\x79\x60\x02\x00\x00") +var _ttyShareInHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x91\x4d\x6b\xc3\x30\x0c\x86\xef\xfd\x15\x5a\xee\x8d\xaf\x63\x38\x39\x8d\xc1\x6e\x85\x6d\xec\xac\xd9\xde\xac\x92\x8f\x62\xbf\xa4\x0d\x26\xff\x7d\x38\x86\x35\xa5\xf3\xc5\x92\xfc\xe8\xb5\x3e\xf4\x83\x1d\x0d\xe6\x93\x23\x8f\xbe\x6b\x77\xba\x5c\x44\x44\xda\x3b\xb6\xc5\x5c\xdd\xde\x81\xc9\x78\x0e\xd1\xa1\xa9\x3e\xde\x5f\xf6\x8f\xd5\xe6\x19\x82\xce\xb5\xc0\xbc\x8f\x9e\x83\xd3\xaa\x04\x8a\x94\xba\x6a\xe9\xaf\xd1\xce\x9b\x3c\x2b\x13\x89\x6d\x2a\xb8\xd0\xcb\xc0\x5d\xd5\x6a\x65\x65\xfa\x87\x88\x0e\x90\xe1\x27\xde\x13\xd1\x04\x39\x81\x72\x1f\x59\xe8\x02\x75\xe4\x89\x4b\x74\x53\x63\x3e\x67\x19\xec\x78\xae\x81\xf9\x75\x10\x08\x77\xcf\x0c\xa6\x86\xd2\x0d\xb5\x92\xf1\xc0\xf0\x4f\x94\x52\xfd\xf9\x96\xcd\x65\xb9\x61\xae\x9e\x56\xe5\xab\xfb\x8a\x62\x30\x4d\x95\x52\x9d\xd3\x0f\xc1\x7d\xcb\x65\x59\x54\x04\x43\x8c\xfa\x1b\x55\x7d\x5c\x5b\xda\x6a\x68\x55\xa6\xa4\x55\xd9\xc7\xee\x37\x00\x00\xff\xff\xe1\xc2\xa8\xce\xa8\x01\x00\x00") func ttyShareInHtmlBytes() ([]byte, error) { return bindataRead( @@ -177,7 +156,7 @@ func ttyShareInHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "tty-share.in.html", size: 608, mode: os.FileMode(420), modTime: time.Unix(1601583738, 0)} + info := bindataFileInfo{name: "tty-share.in.html", size: 424, mode: os.FileMode(420), modTime: time.Unix(1601755149, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -197,7 +176,7 @@ func ttyShareJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "tty-share.js", size: 404641, mode: os.FileMode(420), modTime: time.Unix(1601583738, 0)} + info := bindataFileInfo{name: "tty-share.js", size: 404641, mode: os.FileMode(420), modTime: time.Unix(1601755149, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -255,7 +234,6 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ "404.css": _404Css, - "404.html": _404Html, "404.in.html": _404InHtml, "bootstrap.min.css": bootstrapMinCss, "tty-share.in.html": ttyShareInHtml, @@ -304,7 +282,6 @@ type bintree struct { var _bintree = &bintree{nil, map[string]*bintree{ "404.css": &bintree{_404Css, map[string]*bintree{}}, - "404.html": &bintree{_404Html, map[string]*bintree{}}, "404.in.html": &bintree{_404InHtml, map[string]*bintree{}}, "bootstrap.min.css": &bintree{bootstrapMinCss, map[string]*bintree{}}, "tty-share.in.html": &bintree{ttyShareInHtml, map[string]*bintree{}}, diff --git a/server/frontend/static/404.html b/server/frontend/static/404.html deleted file mode 100644 index 4ffb69a..0000000 --- a/server/frontend/static/404.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - -
-
Something's wrong
-
-

404 -
- Page not found -

- - - -
-
- - - diff --git a/server/frontend/templates/tty-share.in.html b/server/frontend/templates/tty-share.in.html index 309e9b5..a156ab3 100644 --- a/server/frontend/templates/tty-share.in.html +++ b/server/frontend/templates/tty-share.in.html @@ -12,7 +12,7 @@ wsPath: {{.WSPath}} } - + diff --git a/server/server.go b/server/server.go index 0b23330..2830bc8 100644 --- a/server/server.go +++ b/server/server.go @@ -88,25 +88,28 @@ func NewTTYServer(config TTYServerConfig) (server *TTYServer) { routesHandler := mux.NewRouter() installHandlers := func(session string) { - path := fmt.Sprintf("/%s/static/", session) + path := fmt.Sprintf("/s/%s/static/", session) routesHandler.PathPrefix(path).Handler(http.StripPrefix(path, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server.serveContent(w, r, r.URL.Path) }))) - routesHandler.HandleFunc(fmt.Sprintf("/%s/", session), func(w http.ResponseWriter, r *http.Request) { - wsPath := "/" + session + "/ws" + routesHandler.HandleFunc(fmt.Sprintf("/s/%s/", session), func(w http.ResponseWriter, r *http.Request) { + wsPath := "/s/" + session + "/ws" + pathPrefix := "/s/" + session + // Check the frontend/templates/tty-share.in.html file to see where the template applies templateModel := struct { PathPrefix string WSPath string - }{session, wsPath} - // Extract these in constants + }{pathPrefix, wsPath} + + // TODO Extract these in constants w.Header().Add("TTYSHARE-VERSION", "1") w.Header().Add("TTYSHARE-WSPATH", wsPath) server.handleWithTemplateHtml(w, r, "tty-share.in.html", templateModel) }) - routesHandler.HandleFunc(fmt.Sprintf("/%s/ws", session), func(w http.ResponseWriter, r *http.Request) { + routesHandler.HandleFunc(fmt.Sprintf("/s/%s/ws", session), func(w http.ResponseWriter, r *http.Request) { server.handleWebsocket(w, r) }) routesHandler.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/server/session.go b/server/session.go index 98c4032..340f33b 100644 --- a/server/session.go +++ b/server/session.go @@ -126,7 +126,7 @@ func (session *ttyShareSession) HandleWSConnection(wsConn *WSConnection) { lastWindowSizeData, _ := MarshalMsg(session.lastWindowSizeMsg) session.mainRWLock.Unlock() - log.Debugf("Got new TTYReceiver connection (%s). Serving it..", wsConn.Address()) + log.Debugf("New WS connection (%s). Serving ..", wsConn.Address()) // Sending the initial size of the window, if we have one rcvWriter.WriteRawData(lastWindowSizeData) @@ -135,13 +135,13 @@ func (session *ttyShareSession) HandleWSConnection(wsConn *WSConnection) { for { msg, err := rcvReader.ReadMessage() if err != nil { - log.Warnf("Finishing handling the TTYReceiver loop because: %s", err.Error()) + log.Debugf("Finished the WS reading loop: %s", err.Error()) break } // We only support MsgTTYWrite from the web terminal for now if msg.Type != MsgIDWrite { - log.Warnf("TTYReceiver sent unknown message type %s", msg.Type) + log.Warnf("Unknown message over the WS connection: type %s", msg.Type) break }