113 lines
2.4 KiB
Go
113 lines
2.4 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()
|
|
if flagFile != "" {
|
|
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()
|
|
|
|
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)
|
|
}
|
|
}
|