func setupHeketiServer(app *glusterfs.App) *httptest.Server { router := mux.NewRouter() app.SetRoutes(router) n := negroni.New() jwtconfig := &middleware.JwtAuthConfig{} jwtconfig.Admin.PrivateKey = TEST_ADMIN_KEY jwtconfig.User.PrivateKey = "userkey" // Setup middleware n.Use(middleware.NewJwtAuth(jwtconfig)) n.UseFunc(app.Auth) n.UseHandler(router) // Create server return httptest.NewServer(n) }
func main() { flag.Parse() printVersion() // Quit here if all we needed to do was show version if showVersion { return } // Check configuration file was given if configfile == "" { fmt.Fprintln(os.Stderr, "Please provide configuration file") os.Exit(1) } // Read configuration fp, err := os.Open(configfile) if err != nil { fmt.Fprintf(os.Stderr, "ERROR: Unable to open config file %v: %v\n", configfile, err.Error()) os.Exit(1) } defer fp.Close() configParser := json.NewDecoder(fp) var options Config if err = configParser.Decode(&options); err != nil { fmt.Fprintf(os.Stderr, "ERROR: Unable to parse %v: %v\n", configfile, err.Error()) os.Exit(1) } // Substitue values using any set environment variables setWithEnvVariables(&options) // Go to the beginning of the file when we pass it // to the application fp.Seek(0, os.SEEK_SET) // Setup a new GlusterFS application var app apps.Application glusterfsApp := glusterfs.NewApp(fp) if glusterfsApp == nil { fmt.Fprintln(os.Stderr, "ERROR: Unable to start application") os.Exit(1) } app = glusterfsApp // Add /hello router router := mux.NewRouter() router.Methods("GET").Path("/hello").Name("Hello").HandlerFunc( func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain; charset=UTF-8") w.WriteHeader(http.StatusOK) fmt.Fprint(w, "Hello from Heketi") }) // Create a router and do not allow any routes // unless defined. heketiRouter := mux.NewRouter().StrictSlash(true) err = app.SetRoutes(heketiRouter) if err != nil { fmt.Fprintln(os.Stderr, "ERROR: Unable to create http server endpoints") os.Exit(1) } // Use negroni to add middleware. Here we add two // middlewares: Recovery and Logger, which come with // Negroni n := negroni.New(negroni.NewRecovery(), negroni.NewLogger()) // Load authorization JWT middleware if options.AuthEnabled { jwtauth := middleware.NewJwtAuth(&options.JwtConfig) if jwtauth == nil { fmt.Fprintln(os.Stderr, "ERROR: Missing JWT information in config file") os.Exit(1) } // Add Token parser n.Use(jwtauth) // Add application middleware check n.UseFunc(app.Auth) fmt.Println("Authorization loaded") } // Add all endpoints after the middleware was added n.UseHandler(heketiRouter) // Setup complete routing router.NewRoute().Handler(n) // Shutdown on CTRL-C signal // For a better cleanup, we should shutdown the server and signalch := make(chan os.Signal, 1) signal.Notify(signalch, os.Interrupt, os.Kill, syscall.SIGINT, syscall.SIGTERM) // Create a channel to know if the server was unable to start done := make(chan bool) go func() { // Start the server. fmt.Printf("Listening on port %v\n", options.Port) err = http.ListenAndServe(":"+options.Port, router) if err != nil { fmt.Printf("ERROR: HTTP Server error: %v\n", err) } done <- true }() // Block here for signals and errors from the HTTP server select { case <-signalch: case <-done: } fmt.Printf("Shutting down...\n") // Shutdown the application // :TODO: Need to shutdown the server app.Close() }
func main() { flag.Parse() printVersion() // Quit here if all we needed to do was show version if showVersion { return } // Check configuration file was given if configfile == "" { fmt.Fprintln(os.Stderr, "Please provide configuration file") os.Exit(1) } // Read configuration fp, err := os.Open(configfile) if err != nil { fmt.Fprintf(os.Stderr, "Unable to open config file %v: %v\n", configfile, err.Error()) os.Exit(1) } defer fp.Close() configParser := json.NewDecoder(fp) var options Config if err = configParser.Decode(&options); err != nil { fmt.Fprintf(os.Stderr, "Unable to parse %v: %v\n", configfile, err.Error()) os.Exit(1) } // Go to the beginning of the file when we pass it // to the application fp.Seek(0, os.SEEK_SET) // Setup a new GlusterFS application var app apps.Application app = glusterfs.NewApp(fp) if app == nil { fmt.Println("Unable to start application") os.Exit(1) } // Create a router and do not allow any routes // unless defined. router := mux.NewRouter().StrictSlash(true) err = app.SetRoutes(router) if err != nil { fmt.Fprintln(os.Stderr, "Unable to create http server endpoints") os.Exit(1) } // Use negroni to add middleware. Here we add two // middlewares: Recovery and Logger, which come with // Negroni n := negroni.New(negroni.NewRecovery(), negroni.NewLogger()) // Load authorization JWT middleware if options.AuthEnabled { jwtauth := middleware.NewJwtAuth(&options.JwtConfig) if jwtauth == nil { fmt.Fprintln(os.Stderr, "Missing JWT information in config file") os.Exit(1) } // Add Token parser n.Use(jwtauth) // Add application middleware check n.UseFunc(app.Auth) fmt.Println("Authorization loaded") } // Setup routes n.UseHandler(router) // Shutdown on CTRL-C signal // For a better cleanup, we should shutdown the server and signalch := make(chan os.Signal, 1) signal.Notify(signalch, os.Interrupt) go func() { select { case <-signalch: fmt.Printf("Shutting down...\n") // :TODO: Need to stop the server before closing the app // Close the application app.Close() // Quit os.Exit(0) } }() // Start the server. log.Fatal(http.ListenAndServe(":"+options.Port, n)) }