gterm/cmd/gterm/main.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)
})
}