package main import ( "flag" "fmt" "net/http" _ "net/http/pprof" "os" "runtime" "github.com/go-gost/core/logger" "github.com/go-gost/core/metrics" "github.com/go-gost/x/config" "github.com/go-gost/x/config/parsing" xlogger "github.com/go-gost/x/logger" xmetrics "github.com/go-gost/x/metrics" ) var ( log logger.Logger cfgFile string outputFormat string services stringList nodes stringList debug bool apiAddr string metricsAddr string ) func init() { var printVersion bool flag.Var(&services, "L", "service list") flag.Var(&nodes, "F", "chain node list") flag.StringVar(&cfgFile, "C", "", "configure file") flag.BoolVar(&printVersion, "V", false, "print version") flag.StringVar(&outputFormat, "O", "", "output format, one of yaml|json format") flag.BoolVar(&debug, "D", false, "debug mode") flag.StringVar(&apiAddr, "api", "", "api service address") flag.StringVar(&metricsAddr, "metrics", "", "metrics service address") flag.Parse() if printVersion { fmt.Fprintf(os.Stdout, "gost %s (%s %s/%s)\n", version, runtime.Version(), runtime.GOOS, runtime.GOARCH) os.Exit(0) } log = xlogger.NewLogger() logger.SetDefault(log) } func main() { cfg := &config.Config{} var err error if len(services) > 0 || apiAddr != "" { cfg, err = buildConfigFromCmd(services, nodes) if debug && cfg != nil { if cfg.Log == nil { cfg.Log = &config.LogConfig{} } cfg.Log.Level = string(logger.DebugLevel) } if apiAddr != "" { cfg.API = &config.APIConfig{ Addr: apiAddr, } } if metricsAddr != "" { cfg.Metrics = &config.MetricsConfig{ Addr: metricsAddr, } } } else { if cfgFile != "" { err = cfg.ReadFile(cfgFile) } else { err = cfg.Load() } } if err != nil { log.Fatal(err) } log = logFromConfig(cfg.Log) logger.SetDefault(log) if outputFormat != "" { if err := cfg.Write(os.Stdout, outputFormat); err != nil { log.Fatal(err) } os.Exit(0) } if cfg.Profiling != nil { go func() { addr := cfg.Profiling.Addr if addr == "" { addr = ":6060" } log.Info("profiling server on ", addr) log.Fatal(http.ListenAndServe(addr, nil)) }() } if cfg.API != nil { s, err := buildAPIService(cfg.API) if err != nil { log.Fatal(err) } defer s.Close() go func() { log.Info("api service on ", s.Addr()) log.Fatal(s.Serve()) }() } if cfg.Metrics != nil { metrics.SetGlobal(xmetrics.NewMetrics()) if cfg.Metrics.Addr != "" { s, err := buildMetricsService(cfg.Metrics) if err != nil { log.Fatal(err) } go func() { defer s.Close() log.Info("metrics service on ", s.Addr()) log.Fatal(s.Serve()) }() } } parsing.BuildDefaultTLSConfig(cfg.TLS) services := buildService(cfg) for _, svc := range services { svc := svc go func() { svc.Serve() svc.Close() }() } config.SetGlobal(cfg) select {} }