80 lines
1.6 KiB
Go
80 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
|
|
"kumoly.io/lib/klog"
|
|
"kumoly.io/lib/ksrv"
|
|
"kumoly.io/tools/gterm"
|
|
)
|
|
|
|
var Version = "0.0.0"
|
|
var Build = "alpha"
|
|
|
|
var (
|
|
flagAllowIP string
|
|
flagAppName string = "gterm"
|
|
flagAddr string
|
|
flagShell string
|
|
flagLogLevel int
|
|
flagDev bool
|
|
flagVer bool
|
|
)
|
|
|
|
func init() {
|
|
flag.StringVar(&flagAppName, "name", "gterm", "the application title")
|
|
flag.StringVar(&flagAddr, "addr", ":8000", "address to bind")
|
|
flag.StringVar(&flagShell, "shell", "bash", "the shell behind")
|
|
flag.BoolVar(&flagDev, "dev", false, "is development mode")
|
|
flag.IntVar(&flagLogLevel, "log-level", 9, "log level")
|
|
flag.StringVar(&flagAllowIP, "allow", "", "restrict ip")
|
|
flag.BoolVar(&flagVer, "v", false, "show version")
|
|
|
|
flag.Usage = func() {
|
|
fmt.Fprintf(os.Stderr, "Usage: gterm [options]\n")
|
|
flag.PrintDefaults()
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
if flagVer {
|
|
fmt.Printf("%v - %v\n", Version, Build)
|
|
return
|
|
}
|
|
|
|
klog.LEVEL = klog.Llevel(flagLogLevel)
|
|
klog.PROD = !flagDev
|
|
|
|
g := gterm.New()
|
|
g.AppName = flagAppName
|
|
g.Cmd = flagShell
|
|
|
|
server := &http.Server{
|
|
Addr: flagAddr,
|
|
Handler: Middleware(g),
|
|
}
|
|
server.ListenAndServe()
|
|
}
|
|
|
|
func Middleware(next http.Handler) http.Handler {
|
|
log := klog.Sub(flagAppName)
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
log.Error(err)
|
|
}
|
|
}()
|
|
if flagAllowIP != "" {
|
|
if !ksrv.MatchIPGlob(ksrv.GetIP(r), flagAllowIP) {
|
|
w.WriteHeader(http.StatusForbidden)
|
|
w.Write([]byte("permission denied"))
|
|
}
|
|
}
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|