kconfig/cmd/kconfig/main.go

116 lines
2.5 KiB
Go

package main
import (
"flag"
"fmt"
"io/ioutil"
"net/http"
"os"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"kumoly.io/lib/guard"
"kumoly.io/tools/kconfig"
)
var (
Version = "0.0.0"
Build = "alpha"
flagVer bool
flagFile string
flagAddr string
flagAppName string
flagDev bool
flagLogLevel int
flagLogPretty bool
)
func init() {
flag.BoolVar(&flagVer, "v", false, "show version")
flag.StringVar(&flagFile, "f", "", "file to use as schema, if will watch file change every 120ms")
flag.StringVar(&flagAddr, "addr", ":8000", "address to listen")
flag.StringVar(&flagAppName, "name", "kconfig", "name of the app")
flag.BoolVar(&flagDev, "dev", false, "turn on dev mode")
flag.IntVar(&flagLogLevel, "level", 1, "log level [-1(trace):5(panic)] 7 to disable")
flag.BoolVar(&flagLogPretty, "pretty", false, "log message in human readable format (the original log is json)")
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: kconfig [options]\n")
flag.PrintDefaults()
}
}
func main() {
flag.Parse()
if flagVer {
fmt.Printf("%v - %v\n", Version, Build)
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()
}
mux := http.NewServeMux()
k := kconfig.New()
k.AppName = flagAppName
if flagFile != "" {
k.Load = func() []byte { return nil }
go func() {
fi, err := os.Stat(flagFile)
if err != nil {
log.Panic().Err(err).Msg("")
}
last := fi.ModTime().Add(-time.Second)
for {
fi, err := os.Stat(flagFile)
if err != nil {
log.Panic().Err(err).Msg("")
}
if fi.ModTime().After(last) {
last = fi.ModTime()
file, err := os.Open(flagFile)
if err != nil {
log.Panic().Err(err).Msg("")
}
schema, err := ioutil.ReadAll(file)
if err != nil {
log.Panic().Err(err).Msg("")
}
k.Schema = schema
}
<-time.After(time.Millisecond * 120)
}
}()
}
// k.Apply = func(b []byte) error { return fmt.Errorf("error %s", "test") }
// mux.Handle("/k/", http.StripPrefix("/k", k))
mux.Handle("/", k)
g := guard.New()
g.Skip = guard.SkipStatic
server := &http.Server{
Addr: flagAddr,
Handler: g.Guard(mux),
}
log.Info().Msgf("%s started at %s", flagAppName, flagAddr)
err := server.ListenAndServe()
if err != nil {
log.Error().Err(err)
}
}