From c5f0e88700ee11be7343ff11bcddf3c9a2a28486 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Wed, 9 May 2018 23:30:30 -0700 Subject: refactor commands (cobra) --- golang/cmd/fatcatd/main.go | 118 +------------------------------------------- golang/cmd/fatcatd/root.go | 65 ++++++++++++++++++++++++ golang/cmd/fatcatd/serve.go | 110 +++++++++++++++++++++++++++++++++++++++++ golang/fatcatd.toml | 1 + 4 files changed, 178 insertions(+), 116 deletions(-) create mode 100644 golang/cmd/fatcatd/root.go create mode 100644 golang/cmd/fatcatd/serve.go create mode 100644 golang/fatcatd.toml diff --git a/golang/cmd/fatcatd/main.go b/golang/cmd/fatcatd/main.go index 15309345..a2ad8ee2 100644 --- a/golang/cmd/fatcatd/main.go +++ b/golang/cmd/fatcatd/main.go @@ -1,123 +1,9 @@ - + package main import ( - "os" - "net/http" - - log "github.com/sirupsen/logrus" - loads "github.com/go-openapi/loads" - flags "github.com/jessevdk/go-flags" - //middleware "github.com/go-openapi/runtime/middleware" - "github.com/spf13/viper" - "github.com/getsentry/raven-go" - "github.com/carbocation/interpose" - "github.com/carbocation/interpose/adaptors" - "github.com/meatballhat/negroni-logrus" - "github.com/go-pg/pg" - - "git.archive.org/bnewbold/fatcat/golang/api/handlers" - "git.archive.org/bnewbold/fatcat/golang/gen/restapi" - "git.archive.org/bnewbold/fatcat/golang/gen/restapi/operations" ) -func init() { - - viper.SetDefault("port", 9411) - viper.SetDefault("verbose", true) - - viper.SetEnvPrefix("FATCAT") - viper.AutomaticEnv() - - viper.SetConfigType("toml") - viper.SetConfigName("fatcatd.toml") - viper.AddConfigPath(".") - //err := viper.ReadInConfig() - //if err != nil { - // log.Fatalf("Error loading config: %s \n", err) - //} - - // not default of stderr - log.SetOutput(os.Stdout); - - raven.SetDSN(viper.GetString("sentry_dsn")); - -} - func main() { - - log.Warn("Starting up..."); - - // load embedded swagger file - swaggerSpec, err := loads.Analyzed(restapi.SwaggerJSON, "") - if err != nil { - log.Fatalln(err) - } - - // create new service API - api := operations.NewFatcatAPI(swaggerSpec) - - // Set your custom logger if needed. Default one is log.Printf - // Expected interface func(string, ...interface{}) - api.Logger = log.Printf - - server := restapi.NewServer(api) - defer server.Shutdown() - - parser := flags.NewParser(server, flags.Default) - parser.ShortDescription = "fatcat" - parser.LongDescription = "A scalable, versioned, API-oriented catalog of bibliographic entities and file metadata" - - server.ConfigureFlags() - for _, optsGroup := range api.CommandLineOptionsGroups { - _, err := parser.AddGroup(optsGroup.ShortDescription, optsGroup.LongDescription, optsGroup.Options) - if err != nil { - log.Fatalln(err) - } - } - - if _, err := parser.Parse(); err != nil { - code := 1 - if fe, ok := err.(*flags.Error); ok { - if fe.Type == flags.ErrHelp { - code = 0 - } - } - os.Exit(code) - } - - server.Port = viper.GetInt("port") - - db := pg.Connect(&pg.Options{ - User: "bnewbold", // XXX: - Database: "fatcat", - }) - defer db.Close() - - // register all the many handlers here - api.GetCreatorIDHandler = handlers.NewGetCreatorIDHandler(db); - api.PostCreatorHandler = handlers.NewPostCreatorHandler(db); - - middle := interpose.New() - - // sentry and upstream - // XXX: middle.UseHandler(sentry.Recovery(raven.DefaultClient, false)) - - // logging - negroniMiddleware := negronilogrus.NewMiddleware() - middle.Use(adaptors.FromNegroni(negroniMiddleware)) - - // add clacks (TODO: only production) - middle.UseHandler(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - rw.Header().Set("X-Clacks-Overhead:", "GNU Aaron Swartz, John Perry Barlow") - })) - - middle.UseHandler(api.Serve(nil)) - - server.SetHandler(middle) - - if err := server.Serve(); err != nil { - log.Fatalln(err) - } - + Execute() } diff --git a/golang/cmd/fatcatd/root.go b/golang/cmd/fatcatd/root.go new file mode 100644 index 00000000..8c1bc586 --- /dev/null +++ b/golang/cmd/fatcatd/root.go @@ -0,0 +1,65 @@ + +package main + +import ( + "os" + "fmt" + + log "github.com/sirupsen/logrus" + //middleware "github.com/go-openapi/runtime/middleware" + "github.com/spf13/viper" + "github.com/spf13/cobra" + "github.com/getsentry/raven-go" +) + +var cfgFile = ""; + +var rootCmd = &cobra.Command{ + Use: "fatcatd", + Short: "REST API Server", + Long: "A scalable, versioned, API-oriented catalog of bibliographic entities and file metadata", +} + +func init() { + cobra.OnInitialize(initConfig) + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is ./fatcatd.toml)") + rootCmd.PersistentFlags().BoolP("verbose", "v", false, "increase logging volume") + + rootCmd.AddCommand(serveCmd) +} + +func initConfig() { + viper.SetDefault("port", 9411) + viper.SetDefault("verbose", true) + + viper.SetEnvPrefix("FATCAT") + viper.AutomaticEnv() + + + if cfgFile != "" { + // Use config file from the flag. + viper.SetConfigFile(cfgFile) + } else { + viper.SetConfigType("toml") + viper.AddConfigPath(".") + viper.SetConfigName("fatcatd") + } + + err := viper.ReadInConfig() + if err != nil { + log.Fatalf("Error loading config: %s \n", err) + } + + // not default of stderr + log.SetOutput(os.Stdout); + + raven.SetDSN(viper.GetString("sentry_dsn")); + +} + +func Execute() { + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/golang/cmd/fatcatd/serve.go b/golang/cmd/fatcatd/serve.go new file mode 100644 index 00000000..dcee4f4f --- /dev/null +++ b/golang/cmd/fatcatd/serve.go @@ -0,0 +1,110 @@ + +package main + +import ( + //"os" + "net/http" + + "github.com/spf13/viper" + log "github.com/sirupsen/logrus" + loads "github.com/go-openapi/loads" + //flags "github.com/jessevdk/go-flags" + //"github.com/getsentry/raven-go" + "github.com/carbocation/interpose" + "github.com/carbocation/interpose/adaptors" + "github.com/meatballhat/negroni-logrus" + "github.com/go-pg/pg" + "github.com/spf13/cobra" + + "git.archive.org/bnewbold/fatcat/golang/api/handlers" + "git.archive.org/bnewbold/fatcat/golang/gen/restapi" + "git.archive.org/bnewbold/fatcat/golang/gen/restapi/operations" +) + +var serveCmd = &cobra.Command{ + Use: "serve [options]", + Short: "Run fatcat REST API server", + Run: func(cmd *cobra.Command, args[] string) { + main_serve() + }, +} + +func main_serve() { + + log.Warn("Starting up..."); + + // load embedded swagger file + swaggerSpec, err := loads.Analyzed(restapi.SwaggerJSON, "") + if err != nil { + log.Fatalln(err) + } + + // create new service API + api := operations.NewFatcatAPI(swaggerSpec) + + // Set your custom logger if needed. Default one is log.Printf + // Expected interface func(string, ...interface{}) + api.Logger = log.Printf + + server := restapi.NewServer(api) + defer server.Shutdown() + +/* + parser := flags.NewParser(server, flags.Default) + parser.ShortDescription = "fatcat" + parser.LongDescription = "A scalable, versioned, API-oriented catalog of bibliographic entities and file metadata" + + server.ConfigureFlags() + for _, optsGroup := range api.CommandLineOptionsGroups { + _, err := parser.AddGroup(optsGroup.ShortDescription, optsGroup.LongDescription, optsGroup.Options) + if err != nil { + log.Fatalln(err) + } + } + + if _, err := parser.Parse(); err != nil { + code := 1 + if fe, ok := err.(*flags.Error); ok { + if fe.Type == flags.ErrHelp { + code = 0 + } + } + os.Exit(code) + } +*/ + + server.Port = viper.GetInt("port") + + db := pg.Connect(&pg.Options{ + User: "bnewbold", // XXX: + Database: "fatcat", + }) + defer db.Close() + + // register all the many handlers here + api.GetCreatorIDHandler = handlers.NewGetCreatorIDHandler(db); + api.PostCreatorHandler = handlers.NewPostCreatorHandler(db); + + middle := interpose.New() + + // sentry and upstream + // XXX: middle.UseHandler(sentry.Recovery(raven.DefaultClient, false)) + + // logging + negroniMiddleware := negronilogrus.NewMiddleware() + middle.Use(adaptors.FromNegroni(negroniMiddleware)) + + // add clacks (TODO: only production) + middle.UseHandler(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + rw.Header().Set("X-Clacks-Overhead:", "GNU Aaron Swartz, John Perry Barlow") + })) + + middle.UseHandler(api.Serve(nil)) + + server.SetHandler(middle) + + if err := server.Serve(); err != nil { + log.Fatalln(err) + } + +} diff --git a/golang/fatcatd.toml b/golang/fatcatd.toml new file mode 100644 index 00000000..72ddd2d9 --- /dev/null +++ b/golang/fatcatd.toml @@ -0,0 +1 @@ +verbose = true -- cgit v1.2.3