github.com/billybanfield/evergreen@v0.0.0-20170525200750-eeee692790f7/service/ui_main/ui.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 htmlTemplate "html/template" 7 "net/http" 8 "os" 9 "path/filepath" 10 textTemplate "text/template" 11 "time" 12 13 "github.com/codegangsta/negroni" 14 "github.com/evergreen-ci/evergreen" 15 _ "github.com/evergreen-ci/evergreen/plugin/config" 16 "github.com/evergreen-ci/evergreen/service" 17 "github.com/evergreen-ci/evergreen/util" 18 "github.com/evergreen-ci/render" 19 "github.com/mongodb/grip" 20 "github.com/mongodb/grip/level" 21 "github.com/mongodb/grip/message" 22 "github.com/mongodb/grip/send" 23 "gopkg.in/tylerb/graceful.v1" 24 ) 25 26 var ( 27 // requestTimeout is the duration to wait until killing 28 // active requests and stopping the server. 29 requestTimeout = 10 * time.Second 30 ) 31 32 func init() { 33 flag.Usage = func() { 34 fmt.Fprintf(os.Stderr, "%s serves Evergreen's web interface.\n\n", os.Args[0]) 35 fmt.Fprintf(os.Stderr, "Usage:\n %s [flags]\n\n", os.Args[0]) 36 fmt.Fprintf(os.Stderr, "Supported flags are:\n") 37 flag.PrintDefaults() 38 } 39 } 40 41 func main() { 42 settings := evergreen.GetSettingsOrExit() 43 if settings.Ui.LogFile != "" { 44 sender, err := send.MakeFileLogger(settings.Ui.LogFile) 45 grip.CatchEmergencyFatal(err) 46 defer sender.Close() 47 grip.CatchEmergencyFatal(grip.SetSender(sender)) 48 } else { 49 sender := send.MakeNative() 50 defer sender.Close() 51 grip.CatchEmergencyFatal(grip.SetSender(sender)) 52 } 53 evergreen.SetLegacyLogger() 54 grip.SetName("evg-ui-server") 55 grip.SetDefaultLevel(level.Info) 56 grip.SetThreshold(level.Debug) 57 grip.Notice(message.Fields{"build": evergreen.BuildRevision, "process": grip.Name()}) 58 59 defer util.RecoverAndLogStackTrace() 60 61 home := evergreen.FindEvergreenHome() 62 if home == "" { 63 fmt.Println("EVGHOME environment variable must be set to run UI server") 64 os.Exit(1) 65 } 66 uis, err := service.NewUIServer(settings, home) 67 if err != nil { 68 fmt.Println("Failed to create ui server: %v", err) 69 os.Exit(1) 70 } 71 router, err := uis.NewRouter() 72 if err != nil { 73 fmt.Println("Failed to create router:", err) 74 os.Exit(1) 75 } 76 77 webHome := filepath.Join(home, "public") 78 79 functionOptions := service.FuncOptions{webHome, settings.Ui.HelpUrl, true, router} 80 81 functions, err := service.MakeTemplateFuncs(functionOptions, settings.SuperUsers) 82 htmlFunctions := htmlTemplate.FuncMap(functions) 83 textFunctions := textTemplate.FuncMap(functions) 84 85 if err != nil { 86 fmt.Println("Failed to create template function map:", err) 87 os.Exit(1) 88 } 89 90 uis.Render = render.New(render.Options{ 91 Directory: filepath.Join(home, service.WebRootPath, service.Templates), 92 DisableCache: !settings.Ui.CacheTemplates, 93 HtmlFuncs: htmlFunctions, 94 TextFuncs: textFunctions, 95 }) 96 err = uis.InitPlugins() 97 if err != nil { 98 grip.Warningln("problem initializing plugins:", err) 99 } 100 101 n := negroni.New() 102 n.Use(negroni.NewStatic(http.Dir(webHome))) 103 n.Use(service.NewLogger()) 104 n.Use(negroni.HandlerFunc(service.UserMiddleware(uis.UserManager))) 105 n.UseHandler(router) 106 graceful.Run(settings.Ui.HttpListenAddr, requestTimeout, n) 107 grip.Info("UI server cleanly terminated") 108 }