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  }