123 lines
3.1 KiB
Go
123 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
"kumoly.io/lib/guard"
|
|
"kumoly.io/tools/gterm"
|
|
)
|
|
|
|
type arrayFlags []string
|
|
|
|
func (i *arrayFlags) String() string {
|
|
return strings.Join(*i, ", ")
|
|
}
|
|
|
|
func (i *arrayFlags) Set(value string) error {
|
|
*i = append(*i, strings.TrimSpace(value))
|
|
return nil
|
|
}
|
|
|
|
var Version = "0.0.0"
|
|
var Build = "alpha"
|
|
|
|
var (
|
|
flagAllowIPNet string
|
|
flagAppName string
|
|
flagAddr string
|
|
flagShell string
|
|
flagDir string
|
|
flagLogLevel int
|
|
flagLogPretty bool
|
|
flagDev bool
|
|
flagVer bool
|
|
flagArgs arrayFlags
|
|
flagProfile bool
|
|
flagSalt string
|
|
flagUsr string
|
|
flagPasswd string
|
|
)
|
|
|
|
func init() {
|
|
flag.StringVar(&flagAppName, "name", "gterm", "the application name")
|
|
flag.StringVar(&flagAddr, "addr", ":8000", "address to bind")
|
|
flag.StringVar(&flagShell, "shell", "bash", "the shell to use")
|
|
flag.StringVar(&flagDir, "dir", "", "the working dir that the shell will start from")
|
|
flag.Var(&flagArgs, "arg", "additional args to pass to cmd, multiple args can be passed, ex. -arg a -arg b")
|
|
flag.BoolVar(&flagDev, "dev", false, "set the system to development mode")
|
|
flag.IntVar(&flagLogLevel, "log-level", 1, "log level [-1(trace):5(panic)] 7 to disable")
|
|
flag.StringVar(&flagAllowIPNet, "allow", "", "restrict ip in a specific ip net")
|
|
flag.BoolVar(&flagProfile, "profile", false, "print default profile, could be invoked with <(..)")
|
|
flag.StringVar(&flagSalt, "salt", "", "add salt to encoded keyparam")
|
|
flag.BoolVar(&flagVer, "v", false, "show version")
|
|
flag.BoolVar(&flagLogPretty, "pretty", false, "log message in human readable format (the original log is json)")
|
|
flag.StringVar(&flagUsr, "usr", "", "username, use basic auth for authentication if user and password are set")
|
|
flag.StringVar(&flagPasswd, "passwd", "", "password, use basic auth for authentication if user and password are set")
|
|
|
|
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
|
|
}
|
|
if flagProfile {
|
|
fmt.Println(gterm.BashProfile)
|
|
return
|
|
}
|
|
|
|
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
|
|
zerolog.SetGlobalLevel(zerolog.Level(flagLogLevel))
|
|
if flagLogPretty {
|
|
log.Logger = log.Output(zerolog.ConsoleWriter{
|
|
Out: os.Stdout,
|
|
TimeFormat: "2006/01/02 15:04:05",
|
|
})
|
|
}
|
|
if flagDev {
|
|
log.Logger = log.With().Caller().Logger()
|
|
}
|
|
log.Logger = log.With().Str("mod", "gtrem").Logger()
|
|
|
|
g := gterm.New()
|
|
g.AppName = flagAppName
|
|
g.Cmd = flagShell
|
|
g.Args = flagArgs
|
|
g.Dir = flagDir
|
|
g.Salt = flagSalt
|
|
|
|
gd := guard.New()
|
|
if flagAllowIPNet != "" {
|
|
_, ipnet, err := net.ParseCIDR(flagAllowIPNet)
|
|
if err != nil {
|
|
log.Panic().Err(err).Msg("")
|
|
}
|
|
gd.AllowIPNet = ipnet
|
|
}
|
|
if flagUsr != "" && flagPasswd != "" {
|
|
gd.SetBasicAuth(flagUsr, flagPasswd)
|
|
}
|
|
|
|
server := &http.Server{
|
|
Addr: flagAddr,
|
|
Handler: gd.Guard(g),
|
|
}
|
|
log.Info().Msgf("gterm starting at %s", flagAddr)
|
|
err := server.ListenAndServe()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|