mirror of
https://github.com/sorenisanerd/gotty.git
synced 2024-11-09 15:24:25 +00:00
Show command and hostname in windows title
This commit is contained in:
parent
5ee6356242
commit
67b54b7f20
8
Godeps/Godeps.json
generated
8
Godeps/Godeps.json
generated
@ -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"
|
||||||
|
24
Makefile
24
Makefile
@ -1,21 +1,27 @@
|
|||||||
gotty: app/resource.go main.go app/*.go
|
gotty: app/resource.go main.go app/*.go
|
||||||
go build
|
go build
|
||||||
|
|
||||||
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
|
||||||
|
57
app/app.go
57
app/app.go
@ -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
7
main.go
7
main.go
@ -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(),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user