Show command and hostname in windows title

This commit is contained in:
Iwasaki Yudai 2015-08-23 14:04:31 +09:00
parent 5ee6356242
commit 67b54b7f20
6 changed files with 113 additions and 53 deletions

8
Godeps/Godeps.json generated
View File

@ -11,6 +11,14 @@
"ImportPath": "github.com/elazarl/go-bindata-assetfs", "ImportPath": "github.com/elazarl/go-bindata-assetfs",
"Rev": "d5cac425555ca5cf00694df246e04f05e6a55150" "Rev": "d5cac425555ca5cf00694df246e04f05e6a55150"
}, },
{
"ImportPath": "github.com/gorilla/context",
"Rev": "1c83b3eabd45b6d76072b66b746c20815fb2872d"
},
{
"ImportPath": "github.com/gorilla/mux",
"Rev": "ee1815431e497d3850809578c93ab6705f1a19f7"
},
{ {
"ImportPath": "github.com/gorilla/websocket", "ImportPath": "github.com/gorilla/websocket",
"Rev": "b6ab76f1fe9803ee1d59e7e5b2a797c1fe897ce5" "Rev": "b6ab76f1fe9803ee1d59e7e5b2a797c1fe897ce5"

View File

@ -3,19 +3,25 @@ gotty: app/resource.go main.go app/*.go
resource: app/resource.go resource: app/resource.go
app/resource.go: bindata/hterm.js bindata/index.html bindata/gotty.js app/resource.go: bindata/static/hterm.js bindata/static/gotty.js bindata/templates/index.html
go-bindata -pkg app -ignore=\\.gitkeep -o app/resource.go bindata/ go-bindata -prefix bindata -pkg app -ignore=\\.gitkeep -o app/resource.go bindata/...
gofmt -w app/resource.go gofmt -w app/resource.go
bindata: bindata:
mkdir bindata mkdir bindata
bindata/hterm.js: bindata libapps/hterm/js/*.js bindata/static: bindata
mkdir bindata/static
bindata/templates: bindata
mkdir bindata/templates
bindata/static/hterm.js: bindata/static libapps/hterm/js/*.js
cd libapps && \ cd libapps && \
LIBDOT_SEARCH_PATH=`pwd` ./libdot/bin/concat.sh -i ./hterm/concat/hterm_all.concat -o ../bindata/hterm.js LIBDOT_SEARCH_PATH=`pwd` ./libdot/bin/concat.sh -i ./hterm/concat/hterm_all.concat -o ../bindata/static/hterm.js
bindata/index.html: bindata resources/index.html bindata/static/gotty.js: bindata/static resources/gotty.js
cp resources/index.html bindata/index.html cp resources/gotty.js bindata/static/gotty.js
bindata/gotty.js: bindata resources/gotty.js bindata/templates/index.html: bindata/templates resources/index.html
cp resources/gotty.js bindata/gotty.js cp resources/index.html bindata/templates/index.html

View File

@ -1,19 +1,23 @@
package app package app
import ( import (
"bytes"
"crypto/rand" "crypto/rand"
"encoding/base64" "encoding/base64"
htemplate "html/template"
"log" "log"
"math/big" "math/big"
"net"
"net/http" "net/http"
"os"
"os/exec" "os/exec"
"strconv" "strconv"
"strings" "strings"
ttemplate "text/template"
"github.com/elazarl/go-bindata-assetfs" "github.com/elazarl/go-bindata-assetfs"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/kr/pty" "github.com/kr/pty"
"net"
) )
type App struct { type App struct {
@ -28,6 +32,7 @@ type Options struct {
PermitWrite bool PermitWrite bool
Credential string Credential string
RandomUrl bool RandomUrl bool
TitleFormat string
Command []string Command []string
} }
@ -44,21 +49,23 @@ func New(options Options) *App {
} }
func (app *App) Run() error { func (app *App) Run() error {
path := "/" path := ""
if app.options.RandomUrl { if app.options.RandomUrl {
path += generateRandomString(8) path += "/" + generateRandomString(8)
} }
endpoint := app.options.Address + ":" + app.options.Port endpoint := app.options.Address + ":" + app.options.Port
staticHandler := http.FileServer( indexHandler := http.HandlerFunc(app.handleIndex)
&assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "bindata"},
)
wsHandler := http.HandlerFunc(app.handleWS) wsHandler := http.HandlerFunc(app.handleWS)
staticHandler := http.FileServer(
&assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "static"},
)
var siteMux = http.NewServeMux() var siteMux = http.NewServeMux()
siteMux.Handle(path, staticHandler) siteMux.Handle(path+"/", indexHandler)
siteMux.Handle(path+"ws", wsHandler) siteMux.Handle(path+"/static/", http.StripPrefix(path+"/static/", staticHandler))
siteMux.Handle(path+"/ws", wsHandler)
siteHandler := http.Handler(siteMux) siteHandler := http.Handler(siteMux)
@ -74,10 +81,10 @@ func (app *App) Run() error {
strings.Join(app.options.Command, " "), strings.Join(app.options.Command, " "),
) )
if app.options.Address != "" { if app.options.Address != "" {
log.Printf("URL: %s", "http://"+endpoint+path) log.Printf("URL: %s", "http://"+endpoint+path+"/")
} else { } else {
for _, address := range listAddresses() { for _, address := range listAddresses() {
log.Printf("URL: %s", "http://"+address+":"+app.options.Port+path) log.Printf("URL: %s", "http://"+address+":"+app.options.Port+path+"/")
} }
} }
if err := http.ListenAndServe(endpoint, siteHandler); err != nil { if err := http.ListenAndServe(endpoint, siteHandler); err != nil {
@ -87,6 +94,36 @@ func (app *App) Run() error {
return nil return nil
} }
type TitleVars struct {
Command string
Hostname string
}
type IndexVars struct {
Title string
}
func (app *App) handleIndex(w http.ResponseWriter, r *http.Request) {
title := make([]byte, 0)
titleBuf := bytes.NewBuffer(title)
hostname, _ := os.Hostname()
titleVars := TitleVars{
Command: strings.Join(app.options.Command, " "),
Hostname: hostname,
}
titleTmpl, _ := ttemplate.New("title").Parse(app.options.TitleFormat)
titleTmpl.Execute(titleBuf, titleVars)
data, _ := Asset("templates/index.html")
tmpl, _ := htemplate.New("index").Parse(string(data))
vars := IndexVars{
Title: titleBuf.String(),
}
tmpl.Execute(w, vars)
}
func (app *App) handleWS(w http.ResponseWriter, r *http.Request) { func (app *App) handleWS(w http.ResponseWriter, r *http.Request) {
log.Printf("New client connected: %s", r.RemoteAddr) log.Printf("New client connected: %s", r.RemoteAddr)

File diff suppressed because one or more lines are too long

View File

@ -43,6 +43,12 @@ func main() {
Usage: "Add a random string to the URL", Usage: "Add a random string to the URL",
EnvVar: "GOTTY_RANDOM_URL", EnvVar: "GOTTY_RANDOM_URL",
}, },
cli.StringFlag{
Name: "title-format",
Value: "GoTTY - {{ .Command }} ({{ .Hostname }})",
Usage: "Title format of browser window",
EnvVar: "GOTTY_title-format",
},
} }
cmd.Action = func(c *cli.Context) { cmd.Action = func(c *cli.Context) {
if len(c.Args()) == 0 { if len(c.Args()) == 0 {
@ -57,6 +63,7 @@ func main() {
c.Bool("permit-write"), c.Bool("permit-write"),
c.String("credential"), c.String("credential"),
c.Bool("random-url"), c.Bool("random-url"),
c.String("title-format"),
c.Args(), c.Args(),
}, },
) )

View File

@ -1,11 +1,11 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<title>GoTTY</title> <title>{{ .Title }}</title>
<style>body {position: absolute; height: 100%; width: 100%; margin: 0px;}</style> <style>body {position: absolute; height: 100%; width: 100%; margin: 0px;}</style>
</head> </head>
<body> <body>
<script src="hterm.js"></script> <script src="static/hterm.js"></script>
<script src="gotty.js"></script> <script src="static/gotty.js"></script>
</body> </body>
</html> </html>