// Run the BugChomper server. func main() { common.InitWithMetrics("bug_chomper", graphiteServer) v, err := skiaversion.GetVersion() if err != nil { glog.Fatal(err) } glog.Infof("Version %s, built at %s", v.Commit, v.Date) loadTemplates() if *testing { *useMetadata = false } serverURL := "https://" + *host if *testing { serverURL = "http://" + *host + *port } // By default use a set of credentials setup for localhost access. var cookieSalt = "notverysecret" var clientID = "31977622648-1873k0c1e5edaka4adpv1ppvhr5id3qm.apps.googleusercontent.com" var clientSecret = "cw0IosPu4yjaG2KWmppj2guj" var redirectURL = serverURL + "/oauth2callback/" if *useMetadata { cookieSalt = metadata.Must(metadata.ProjectGet(metadata.COOKIESALT)) clientID = metadata.Must(metadata.ProjectGet(metadata.CLIENT_ID)) clientSecret = metadata.Must(metadata.ProjectGet(metadata.CLIENT_SECRET)) } login.Init(clientID, clientSecret, redirectURL, cookieSalt, strings.Join(issue_tracker.OAUTH_SCOPE, " "), login.DEFAULT_DOMAIN_WHITELIST, false) runServer(serverURL) }
func pullInit() { hostname, err := os.Hostname() if err != nil { // Never call glog before common.Init*. os.Exit(1) } common.InitWithMetrics("pulld."+hostname, graphiteServer) glog.Infof("Running with hostname: %s", hostname) client, err := auth.NewClient(*doOauth, *oauthCacheFile, storage.DevstorageFullControlScope, compute.ComputeReadonlyScope) if err != nil { glog.Fatalf("Failed to create authenticated HTTP client: %s", err) } glog.Info("Got authenticated client.") store, err = storage.New(client) if err != nil { glog.Fatalf("Failed to create storage service client: %s", err) } step(client, store, hostname) timeCh := time.Tick(time.Second * 60) go func() { for { select { case <-timeCh: case <-httpTriggerCh: } step(client, store, hostname) } }() }
func main() { defer common.LogPanic() common.InitWithMetrics("grandcentral", graphiteServer) v, err := skiaversion.GetVersion() if err != nil { glog.Fatal(err) } glog.Infof("Version %s, built at %s", v.Commit, v.Date) if *nsqdAddress == "" { glog.Fatal("Missing address of nsqd server.") } globalEventBus, err := geventbus.NewNSQEventBus(*nsqdAddress) if err != nil { glog.Fatalf("Unable to connect to NSQ server: %s", err) } eventBus = eventbus.New(globalEventBus) // Add a subscription for the each event type. This prevents the messages // to queue up if there are no other clients connected. eventBus.SubscribeAsync(event.GLOBAL_GOOGLE_STORAGE, func(evData interface{}) {}) eventBus.SubscribeAsync(event.GLOBAL_BUILDBOT, func(evData interface{}) {}) if *testing { *useMetadata = false } serverURL := "https://" + *host if *testing { serverURL = "http://" + *host + *port } runServer(serverURL) }
func main() { defer common.LogPanic() common.InitWithMetrics("skia-ingestion", graphiteServer) // Initialize oauth client and start the ingesters. client, err := auth.NewJWTServiceAccountClient("", *serviceAccountFile, nil, storage.CloudPlatformScope) if err != nil { glog.Fatalf("Failed to auth: %s", err) } // Start the ingesters. config, err := sharedconfig.ConfigFromTomlFile(*configFilename) if err != nil { glog.Fatalf("Unable to read config file %s. Got error: %s", *configFilename, err) } ingesters, err := ingestion.IngestersFromConfig(config, client) if err != nil { glog.Fatalf("Unable to instantiate ingesters: %s", err) } for _, oneIngester := range ingesters { oneIngester.Start() } // Run the ingesters forever. select {} }
func main() { common.InitWithMetrics(filepath.Base(os.Args[0]), graphiteServer) ts, err := traceservice.NewTraceServiceServer(*db_file) if err != nil { glog.Fatalf("Failed to initialize the tracestore server: %s", err) } lis, err := net.Listen("tcp", *port) if err != nil { glog.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() traceservice.RegisterTraceServiceServer(s, ts) go func() { if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { glog.Fatalf("Failed to open profiling file: %s", err) } if err := pprof.StartCPUProfile(f); err != nil { glog.Fatalf("Failed to start profiling: %s", err) } } glog.Fatalf("Failure while serving: %s", s.Serve(lis)) }() // Handle SIGINT and SIGTERM. ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) log.Println(<-ch) if *cpuprofile != "" { pprof.StopCPUProfile() } }
func main() { defer common.LogPanic() common.InitWithMetrics("grandcentral", graphiteServer) v, err := skiaversion.GetVersion() if err != nil { glog.Fatal(err) } glog.Infof("Version %s, built at %s", v.Commit, v.Date) if *nsqdAddress == "" { glog.Fatal("Missing address of nsqd server.") } globalEventBus, err := geventbus.NewNSQEventBus(*nsqdAddress) if err != nil { glog.Fatalf("Unable to connect to NSQ server: %s", err) } eventBus = eventbus.New(globalEventBus) if *testing { *useMetadata = false } serverURL := "https://" + *host if *testing { serverURL = "http://" + *host + *port } runServer(serverURL) }
func main() { defer common.LogPanic() common.InitWithMetrics("push", graphiteServer) Init() redirectURL := fmt.Sprintf("http://localhost%s/oauth2callback/", *port) if !*local { redirectURL = "https://push.skia.org/oauth2callback/" } if err := login.InitFromMetadataOrJSON(redirectURL, login.DEFAULT_SCOPE, login.DEFAULT_DOMAIN_WHITELIST); err != nil { glog.Fatalf("Failed to initialize the login system: %s", err) } r := mux.NewRouter() r.PathPrefix("/res/").HandlerFunc(util.MakeResourceHandler(*resourcesDir)) r.HandleFunc("/", mainHandler) r.HandleFunc("/_/change", changeHandler) r.HandleFunc("/_/state", stateHandler) r.HandleFunc("/_/status", statusHandler) r.HandleFunc("/loginstatus/", login.StatusHandler) r.HandleFunc("/logout/", login.LogoutHandler) r.HandleFunc("/oauth2callback/", login.OAuth2CallbackHandler) http.Handle("/", util.LoggingGzipRequestResponse(r)) glog.Infoln("Ready to serve.") glog.Fatal(http.ListenAndServe(*port, nil)) }
func main() { common.InitWithMetrics("push", graphiteServer) Init() // By default use a set of credentials setup for localhost access. var cookieSalt = "notverysecret" var clientID = "31977622648-1873k0c1e5edaka4adpv1ppvhr5id3qm.apps.googleusercontent.com" var clientSecret = "cw0IosPu4yjaG2KWmppj2guj" var redirectURL = fmt.Sprintf("http://localhost%s/oauth2callback/", *port) if !*local { cookieSalt = metadata.Must(metadata.ProjectGet(metadata.COOKIESALT)) clientID = metadata.Must(metadata.ProjectGet(metadata.CLIENT_ID)) clientSecret = metadata.Must(metadata.ProjectGet(metadata.CLIENT_SECRET)) redirectURL = "https://push.skia.org/oauth2callback/" } login.Init(clientID, clientSecret, redirectURL, cookieSalt, login.DEFAULT_SCOPE, login.DEFAULT_DOMAIN_WHITELIST, *local) r := mux.NewRouter() r.PathPrefix("/res/").HandlerFunc(util.MakeResourceHandler(*resourcesDir)) r.HandleFunc("/", mainHandler) r.HandleFunc("/_/change", changeHandler) r.HandleFunc("/_/state", stateHandler) r.HandleFunc("/_/status", statusHandler) r.HandleFunc("/loginstatus/", login.StatusHandler) r.HandleFunc("/logout/", login.LogoutHandler) r.HandleFunc("/oauth2callback/", login.OAuth2CallbackHandler) http.Handle("/", util.LoggingGzipRequestResponse(r)) glog.Infoln("Ready to serve.") glog.Fatal(http.ListenAndServe(*port, nil)) }
func main() { common.InitWithMetrics("certpoller", graphiteServer) client := util.NewTimeoutClient() certs := []*cert{} // Populate certs based on cmd-line args. for _, metadata := range flag.Args() { c := &cert{ metadata: metadata, file: fileFromMetadata(metadata), etag: "", } err := get(client, c) if err != nil { glog.Fatalf("Failed to retrieve the cert %s: %s", c, err) } certs = append(certs, c) } for _ = range time.Tick(30 * time.Minute) { for _, c := range certs { if err := get(client, c); err != nil { glog.Errorf("Failed to update cert %s: %s", c.metadata, err) } } } }
func main() { defer common.LogPanic() // Setup flags. dbConf := buildbot.DBConfigFromFlags() // Global init. common.InitWithMetrics(APP_NAME, graphiteServer) // Parse the time period. period, err := human.ParseDuration(*timePeriod) if err != nil { glog.Fatal(err) } // Initialize the buildbot database. if !*local { if err := dbConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } } if err := dbConf.InitDB(); err != nil { glog.Fatal(err) } // Initialize the BuildBucket client. c, err := auth.NewClient(*local, path.Join(*workdir, "oauth_token_cache"), buildbucket.DEFAULT_SCOPES...) if err != nil { glog.Fatal(err) } bb := buildbucket.NewClient(c) // Build the queue. repos := gitinfo.NewRepoMap(*workdir) for _, r := range REPOS { if _, err := repos.Repo(r); err != nil { glog.Fatal(err) } } q, err := build_queue.NewBuildQueue(period, repos, *scoreThreshold, *scoreDecay24Hr, BOT_BLACKLIST) if err != nil { glog.Fatal(err) } // Start scheduling builds in a loop. liveness := metrics.NewLiveness(APP_NAME) if err := scheduleBuilds(q, bb); err != nil { glog.Errorf("Failed to schedule builds: %v", err) } for _ = range time.Tick(time.Minute) { liveness.Update() if err := scheduleBuilds(q, bb); err != nil { glog.Errorf("Failed to schedule builds: %v", err) } } }
func main() { common.InitWithMetrics("docserver", graphiteServer) Init() // Resources are served directly. http.HandleFunc("/res/", autogzip.HandleFunc(makeResourceHandler())) http.HandleFunc("/", autogzip.HandleFunc(mainHandler)) glog.Infoln("Ready to serve.") glog.Fatal(http.ListenAndServe(*port, nil)) }
func main() { defer common.LogPanic() // Calls flag.Parse() common.InitWithMetrics("fuzzer", graphiteServer) if err := writeFlagsToConfig(); err != nil { glog.Fatalf("Problem with configuration: %s", err) } Init() if err := setupOAuth(); err != nil { glog.Fatal(err) } go func() { if err := fcommon.DownloadSkiaVersionForFuzzing(storageClient, config.FrontEnd.SkiaRoot, &config.FrontEnd); err != nil { glog.Fatalf("Problem downloading Skia: %s", err) } fuzzSyncer = syncer.New(storageClient) fuzzSyncer.Start() cache, err := fuzzcache.New(config.FrontEnd.BoltDBPath) if err != nil { glog.Fatalf("Could not create fuzz report cache at %s: %s", config.FrontEnd.BoltDBPath, err) } defer util.Close(cache) if err := gsloader.LoadFromBoltDB(cache); err != nil { glog.Errorf("Could not load from boltdb. Loading from source of truth anyway. %s", err) } var finder functionnamefinder.Finder if !*local { finder = functionnamefinder.NewAsync() } gsLoader := gsloader.New(storageClient, finder, cache) if err := gsLoader.LoadFreshFromGoogleStorage(); err != nil { glog.Fatalf("Error loading in data from GCS: %s", err) } fuzzSyncer.SetGSLoader(gsLoader) updater := frontend.NewVersionUpdater(gsLoader, fuzzSyncer) versionWatcher = fcommon.NewVersionWatcher(storageClient, config.FrontEnd.VersionCheckPeriod, updater.HandlePendingVersion, updater.HandleCurrentVersion) versionWatcher.Start() err = <-versionWatcher.Status glog.Fatal(err) }() runServer() }
func main() { defer common.LogPanic() common.InitWithMetrics("logserver", graphiteServer) if err := os.MkdirAll(*dir, 0777); err != nil { glog.Fatalf("Failed to create dir for log files: %s", err) } go dirWatcher(*dirWatchDuration, *dir) http.Handle("/file_server/", http.StripPrefix("/file_server/", FileServer(http.Dir(*dir)))) http.HandleFunc("/", FileServerWrapperHandler) glog.Fatal(http.ListenAndServe(*port, nil)) }
func main() { common.InitWithMetrics("pulld", graphiteServer) Init() pullInit() r := mux.NewRouter() r.PathPrefix("/res/").HandlerFunc(util.MakeResourceHandler(*resourcesDir)) r.HandleFunc("/", mainHandler).Methods("GET") r.HandleFunc("/_/list", listHandler).Methods("GET") r.HandleFunc("/_/change", changeHandler).Methods("POST") r.HandleFunc("/pullpullpull", pullHandler) http.Handle("/", util.LoggingGzipRequestResponse(r)) glog.Infoln("Ready to serve.") glog.Fatal(http.ListenAndServe(*port, nil)) }
func main() { defer common.LogPanic() common.InitWithMetrics("probeserver", graphiteServer) client, err := auth.NewDefaultJWTServiceAccountClient("https://www.googleapis.com/auth/userinfo.email") if err != nil { glog.Fatalf("Failed to create client for talking to the issue tracker: %s", err) } go monitorIssueTracker(client) glog.Infoln("Looking for Graphite server.") addr, err := net.ResolveTCPAddr("tcp", *graphiteServer) if err != nil { glog.Fatalln("Failed to resolve the Graphite server: ", err) } glog.Infoln("Found Graphite server.") liveness := imetrics.NewLiveness("probes") // We have two sets of metrics, one for the probes and one for the probe // server itself. The server's metrics are handled by common.Init() probeRegistry := metrics.NewRegistry() go graphite.Graphite(probeRegistry, common.SAMPLE_PERIOD, *prefix, addr) // TODO(jcgregorio) Monitor config file and reload if it changes. cfg, err := readConfigFiles(*config) if err != nil { glog.Fatalln("Failed to read config file: ", err) } glog.Infoln("Successfully read config file.") // Register counters for each probe. for name, probe := range cfg { probe.failure = metrics.NewRegisteredGauge(name+".failure", probeRegistry) probe.latency = metrics.NewRegisteredGauge(name+".latency", probeRegistry) } // Create a client that uses our dialer with a timeout. c := &http.Client{ Transport: &http.Transport{ Dial: dialTimeout, }, } probeOneRound(cfg, c) for _ = range time.Tick(*runEvery) { probeOneRound(cfg, c) liveness.Update() } }
func main() { hostname, err := os.Hostname() if err != nil { glog.Fatalf("Failed to get Hostname: %s", err) } appName := "logserver." + hostname common.InitWithMetrics(appName, graphiteServer) if err := os.MkdirAll(*dir, 0777); err != nil { glog.Fatalf("Failed to create dir for log files: %s", err) } go dirWatcher(*dirWatchDuration, *dir) http.Handle("/file_server/", http.StripPrefix("/file_server/", FileServer(http.Dir(*dir)))) http.HandleFunc("/", FileServerWrapperHandler) glog.Fatal(http.ListenAndServe(*port, nil)) }
func main() { defer common.LogPanic() common.InitWithMetrics("android_stats", graphiteServer) pollFreq, err := time.ParseDuration(*frequency) if err != nil { glog.Fatalf("Invalid value for frequency %q: %s", *frequency, err) } if err := generateStats(); err != nil { glog.Fatal(err) } for _ = range time.Tick(pollFreq) { if err := generateStats(); err != nil { glog.Error(err) } } }
func main() { defer common.LogPanic() common.InitWithMetrics("mathserv", graphiteServer) Init() // By default use a set of credentials setup for localhost access. var cookieSalt = "notverysecret" var clientID = "952643138919-5a692pfevie766aiog15io45kjpsh33v.apps.googleusercontent.com" var clientSecret = "QQfqRYU1ELkds90ku8xlIGl1" var redirectURL = fmt.Sprintf("http://localhost%s/oauth2callback/", *port) if !*local { cookieSalt = metadata.Must(metadata.ProjectGet(metadata.COOKIESALT)) clientID = metadata.Must(metadata.ProjectGet(metadata.CLIENT_ID)) clientSecret = metadata.Must(metadata.ProjectGet(metadata.CLIENT_SECRET)) redirectURL = "https://mathinate.com/oauth2callback/" } login.Init(clientID, clientSecret, redirectURL, cookieSalt, login.DEFAULT_SCOPE, "", *local) r := mux.NewRouter() r.PathPrefix("/res/").HandlerFunc(util.MakeResourceHandler(*resourcesDir)) r.HandleFunc("/", mainHandler) r.HandleFunc("/loginstatus/", login.StatusHandler) r.HandleFunc("/logout/", login.LogoutHandler) r.HandleFunc("/oauth2callback/", login.OAuth2CallbackHandler) http.Handle("/", util.LoggingGzipRequestResponse(r)) AttemptLoadCertFromMetadata() glog.Infoln("Ready to serve.") if *certChainFile != "" { glog.Infof("Serving TLS") go func() { redir := mux.NewRouter() redir.HandleFunc("/", redirHandler) glog.Fatal(http.ListenAndServe(*httpPort, redir)) }() glog.Fatal(http.ListenAndServeTLS(*port, *certChainFile, *keyFile, nil)) } else { glog.Infof("Only serving HTTP") glog.Fatal(http.ListenAndServe(*port, nil)) } }
func main() { defer common.LogPanic() flag.Parse() common.InitWithMetrics("pdfxform", graphiteServer) client, err := getClient() if err != nil { glog.Fatal(err) } xformer := pdfXformer{ client: client, results: map[string]map[int]string{}, } err = xformer.uploadErrorImage(*failureImage) if err != nil { // If we can't upload this, we can't upload anything. glog.Fatalf("Filed to upload error image: %s", err) } for _, rasterizer := range []pdf.Rasterizer{pdf.Pdfium{}, pdf.Poppler{}} { if rasterizer.Enabled() { xformer.rasterizers = append(xformer.rasterizers, rasterizer) } else { glog.Infof("rasterizer %s is disabled", rasterizer.String()) } } if len(xformer.rasterizers) == 0 { glog.Fatalf("no rasterizers found") } end := time.Now() start := end.Add(-172 * time.Hour) xformer.processTimeRange(start, end) glog.Flush() // Flush before waiting for next tick; it may be a while. for _ = range time.Tick(time.Minute) { start, end = end, time.Now() xformer.processTimeRange(start, end) glog.Flush() } }
func main() { defer common.LogPanic() // Calls flag.Parse() common.InitWithMetrics("fuzzer", graphiteServer) if err := writeFlagsToConfig(); err != nil { glog.Fatalf("Problem with configuration: %v", err) } Init() if err := setupOAuth(); err != nil { glog.Fatal(err) } if finder, err := functionnamefinder.New(); err != nil { glog.Fatalf("Error loading Skia Source: %s", err) } else if err := frontend.LoadFromGoogleStorage(storageService, finder); err != nil { glog.Fatalf("Error loading in data from GCS: %s", err) } runServer() }
func main() { defer common.LogPanic() // Calls flag.Parse() common.InitWithMetrics("fuzzer-be", graphiteServer) if err := writeFlagsToConfig(); err != nil { glog.Fatalf("Problem with configuration: %v", err) } if err := setupOAuth(); err != nil { glog.Fatalf("Problem with OAuth: %s", err) } if err := fcommon.DownloadSkiaVersionForFuzzing(storageClient, config.Generator.SkiaRoot, &config.Generator); err != nil { glog.Fatalf("Problem downloading Skia: %s", err) } if err := generator.DownloadBinarySeedFiles(storageClient); err != nil { glog.Fatalf("Problem downloading binary seed files: %s", err) } glog.Infof("Starting generator with configuration %#v", config.Generator) if err := generator.StartBinaryGenerator(); err != nil { glog.Fatalf("Problem starting binary generator: %s", err) } glog.Infof("Starting aggregator with configuration %#v", config.Aggregator) agg, err := aggregator.StartBinaryAggregator(storageClient) if err != nil { glog.Fatalf("Could not start aggregator: %s", err) } glog.Info("Starting version watcher") updater := generator.NewVersionUpdater(storageClient, agg) watcher := fcommon.NewVersionWatcher(storageClient, config.Generator.VersionCheckPeriod, updater.UpdateToNewSkiaVersion, nil) watcher.Start() err = <-watcher.Status glog.Fatal(err) }
func Init() { defer common.LogPanic() rand.Seed(time.Now().UnixNano()) config.Fiddle.UseChroot = false config.Fiddle.Port = ":8000" config.Fiddle.ResourcePath = "" config.Fiddle.CachePath = "../../cache" config.Fiddle.InoutPath = "../../inout" config.Fiddle.UseMetadata = true common.DecodeTomlFile(*configFilename, &config.Fiddle) path, err := filepath.Abs(config.Fiddle.ResourcePath) if err != nil { glog.Fatal(err) } if err := os.Chdir(path); err != nil { glog.Fatal(err) } codeTemplate = template.Must(template.ParseFiles(filepath.Join(path, "templates/template.cpp"))) gypTemplate = template.Must(template.ParseFiles(filepath.Join(path, "templates/template.gyp"))) indexTemplate = htemplate.Must(htemplate.ParseFiles( filepath.Join(path, "templates/index.html"), filepath.Join(path, "templates/titlebar.html"), filepath.Join(path, "templates/content.html"), filepath.Join(path, "templates/header.html"), filepath.Join(path, "templates/footer.html"), )) iframeTemplate = htemplate.Must(htemplate.ParseFiles( filepath.Join(path, "templates/iframe.html"), filepath.Join(path, "templates/content.html"), filepath.Join(path, "templates/header.html"), filepath.Join(path, "templates/footer.html"), )) recentTemplate = htemplate.Must(htemplate.ParseFiles( filepath.Join(path, "templates/recent.html"), filepath.Join(path, "templates/titlebar.html"), filepath.Join(path, "templates/header.html"), filepath.Join(path, "templates/footer.html"), )) workspaceTemplate = htemplate.Must(htemplate.ParseFiles( filepath.Join(path, "templates/workspace.html"), filepath.Join(path, "templates/titlebar.html"), filepath.Join(path, "templates/content.html"), filepath.Join(path, "templates/header.html"), filepath.Join(path, "templates/footer.html"), )) // The git command returns output of the format: // // f672cead70404080a991ebfb86c38316a4589b23 2014-04-27 19:21:51 +0000 // logOutput, err := exec.RunSimple(`git log --format=%H%x20%ai HEAD^..HEAD`) if err != nil { panic(err) } logInfo := strings.Split(logOutput, " ") gitHash = logInfo[0] gitInfo = logInfo[1] + " " + logInfo[2] + " " + logInfo[0][0:6] if config.Fiddle.UseMetadata { password := metadata.MustGet(PASSWORD_METADATA_KEY) // The IP address of the database is found here: // https://console.developers.google.com/project/31977622648/sql/instances/webtry/overview // And 3306 is the default port for MySQL. db, err = sql.Open("mysql", fmt.Sprintf("webtry:%s@tcp(173.194.83.52:3306)/webtry?parseTime=true", password)) if err != nil { glog.Fatalf("ERROR: Failed to open connection to SQL server: %q\n", err) } } else { // Fallback to sqlite for local use. db, err = sql.Open("sqlite3", "./webtry.db") if err != nil { glog.Errorf("Failed to open: %q\n", err) panic(err) } sql := `CREATE TABLE IF NOT EXISTS source_images ( id INTEGER PRIMARY KEY NOT NULL, image MEDIUMBLOB DEFAULT '' NOT NULL, -- formatted as a PNG. width INTEGER DEFAULT 0 NOT NULL, height INTEGER DEFAULT 0 NOT NULL, create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, hidden INTEGER DEFAULT 0 NOT NULL )` _, err = db.Exec(sql) if err != nil { glog.Errorf("Creating source_images table failed: %s", err) } sql = `CREATE TABLE IF NOT EXISTS webtry ( code TEXT DEFAULT '' NOT NULL, create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, hash CHAR(64) DEFAULT '' NOT NULL, width INTEGER DEFAULT 256 NOT NULL, height INTEGER DEFAULT 256 NOT NULL, source_image_id INTEGER DEFAULT 0 NOT NULL, PRIMARY KEY(hash) )` _, err = db.Exec(sql) if err != nil { glog.Errorf("Creating webtry table failed: %s", err) } sql = `CREATE TABLE IF NOT EXISTS workspace ( name CHAR(64) DEFAULT '' NOT NULL, create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY(name) )` _, err = db.Exec(sql) if err != nil { glog.Errorf("Creating workspace table failed: %s", err) } sql = `CREATE TABLE IF NOT EXISTS workspacetry ( name CHAR(64) DEFAULT '' NOT NULL, create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, hash CHAR(64) DEFAULT '' NOT NULL, width INTEGER DEFAULT 256 NOT NULL, height INTEGER DEFAULT 256 NOT NULL, hidden INTEGER DEFAULT 0 NOT NULL, source_image_id INTEGER DEFAULT 0 NOT NULL, FOREIGN KEY (name) REFERENCES workspace(name) )` _, err = db.Exec(sql) if err != nil { glog.Errorf("Creating workspacetry table failed: %s", err) } } // Ping the database to keep the connection fresh. go func() { c := time.Tick(1 * time.Minute) for _ = range c { if err := db.Ping(); err != nil { glog.Errorf("Database failed to respond: %q\n", err) } } }() common.InitWithMetrics("webtry", graphiteServer) writeOutAllSourceImages() }
func main() { defer common.LogPanic() // Setup flags. influxdb.SetupFlags() common.InitWithMetrics("status", graphiteServer) v, err := skiaversion.GetVersion() if err != nil { glog.Fatal(err) } glog.Infof("Version %s, built at %s", v.Commit, v.Date) Init() if *testing { *useMetadata = false } serverURL := "https://" + *host if *testing { serverURL = "http://" + *host + *port } // Create buildbot remote DB. db, err = buildbot.NewRemoteDB(*buildbotDbHost) if err != nil { glog.Fatal(err) } // Setup InfluxDB client. dbClient, err = influxdb.NewClientFromFlagsAndMetadata(*testing) if err != nil { glog.Fatal(err) } // By default use a set of credentials setup for localhost access. var cookieSalt = "notverysecret" var clientID = "31977622648-1873k0c1e5edaka4adpv1ppvhr5id3qm.apps.googleusercontent.com" var clientSecret = "cw0IosPu4yjaG2KWmppj2guj" var redirectURL = serverURL + "/oauth2callback/" if *useMetadata { cookieSalt = metadata.Must(metadata.ProjectGet(metadata.COOKIESALT)) clientID = metadata.Must(metadata.ProjectGet(metadata.CLIENT_ID)) clientSecret = metadata.Must(metadata.ProjectGet(metadata.CLIENT_SECRET)) } login.Init(clientID, clientSecret, redirectURL, cookieSalt, login.DEFAULT_SCOPE, login.DEFAULT_DOMAIN_WHITELIST, false) // Check out source code. skiaRepo, err := gitinfo.CloneOrUpdate("https://skia.googlesource.com/skia.git", path.Join(*workdir, "skia"), true) if err != nil { glog.Fatalf("Failed to check out Skia: %v", err) } infraRepoPath := path.Join(*workdir, "infra") infraRepo, err := gitinfo.CloneOrUpdate("https://skia.googlesource.com/buildbot.git", infraRepoPath, true) if err != nil { glog.Fatalf("Failed to checkout Infra: %v", err) } glog.Info("CloneOrUpdate complete") // Create the commit caches. commitCaches = map[string]*commit_cache.CommitCache{} skiaCache, err := commit_cache.New(skiaRepo, path.Join(*workdir, "commit_cache.gob"), DEFAULT_COMMITS_TO_LOAD, db) if err != nil { glog.Fatalf("Failed to create commit cache: %v", err) } commitCaches[SKIA_REPO] = skiaCache infraCache, err := commit_cache.New(infraRepo, path.Join(*workdir, "commit_cache_infra.gob"), DEFAULT_COMMITS_TO_LOAD, db) if err != nil { glog.Fatalf("Failed to create commit cache: %v", err) } commitCaches[INFRA_REPO] = infraCache glog.Info("commit_cache complete") // Load Perf and Gold data in a loop. perfStatus, err = dbClient.Int64PollingStatus("select value from \"alerting.new.value\" where app='skiaperf' and host='skia-perf' order by time desc limit 1", time.Minute) if err != nil { glog.Fatalf("Failed to create polling Perf status: %v", err) } goldGMStatus, err = dbClient.Int64PollingStatus(fmt.Sprintf(GOLD_STATUS_QUERY_TMPL, "gm"), time.Minute) if err != nil { glog.Fatalf("Failed to create polling Gold status: %v", err) } goldImageStatus, err = dbClient.Int64PollingStatus(fmt.Sprintf(GOLD_STATUS_QUERY_TMPL, "image"), time.Minute) if err != nil { glog.Fatalf("Failed to create polling Gold status: %v", err) } // Load slave_hosts_cfg and device cfgs in a loop. slaveHosts, err = buildbot.SlaveHostsCfgPoller(infraRepoPath) if err != nil { glog.Fatal(err) } androidDevices, err = device_cfg.AndroidDeviceCfgPoller(*workdir) if err != nil { glog.Fatal(err) } sshDevices, err = device_cfg.SSHDeviceCfgPoller(*workdir) if err != nil { glog.Fatal(err) } runServer(serverURL) }
func main() { defer common.LogPanic() // Setup DB flags. dbConf := idb.DBConfigFromFlags() common.InitWithMetrics("skiaperf", graphiteServer) Init() if !*local { if err := dbConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } } if err := dbConf.InitDB(); err != nil { glog.Fatal(err) } stats.Start(masterTileBuilder, git) alerting.Start(masterTileBuilder) var redirectURL = fmt.Sprintf("http://localhost%s/oauth2callback/", *port) if !*local { redirectURL = "https://perf.skia.org/oauth2callback/" } if err := login.InitFromMetadataOrJSON(redirectURL, login.DEFAULT_SCOPE, login.DEFAULT_DOMAIN_WHITELIST); err != nil { glog.Fatalf("Failed to initialize the login system: %s", err) } // Resources are served directly. router := mux.NewRouter() router.PathPrefix("/res/").HandlerFunc(makeResourceHandler()) router.HandleFunc("/", templateHandler("index.html")) router.HandleFunc("/frame/", templateHandler("frame.html")) router.HandleFunc("/shortcuts/", shortcutHandler) router.PathPrefix("/tiles/").HandlerFunc(tileHandler) router.PathPrefix("/single/").HandlerFunc(singleHandler) router.PathPrefix("/query/").HandlerFunc(queryHandler) router.HandleFunc("/commits/", commitsHandler) router.HandleFunc("/_/commits/", commitsJSONHandler) router.HandleFunc("/shortcommits/", shortCommitsHandler) router.HandleFunc("/trybots/", trybotHandler) router.HandleFunc("/clusters/", templateHandler("clusters.html")) router.HandleFunc("/clustering/", clusteringHandler) router.PathPrefix("/cl/").HandlerFunc(clHandler) router.PathPrefix("/activitylog/").HandlerFunc(activityHandler) router.HandleFunc("/alerts/", templateHandler("alerting.html")) router.HandleFunc("/alerting/", alertingHandler) router.HandleFunc("/alert_reset/", alertResetHandler) router.HandleFunc("/annotate/", annotate.Handler) router.HandleFunc("/compare/", templateHandler("compare.html")) router.HandleFunc("/kernel/", templateHandler("kernel.html")) router.HandleFunc("/_/kernel/", kernelJSONHandler) router.HandleFunc("/calc/", calcHandler) router.HandleFunc("/help/", helpHandler) router.HandleFunc("/oauth2callback/", login.OAuth2CallbackHandler) router.HandleFunc("/logout/", login.LogoutHandler) router.HandleFunc("/loginstatus/", login.StatusHandler) http.Handle("/", util.LoggingGzipRequestResponse(router)) glog.Infoln("Ready to serve.") glog.Fatal(http.ListenAndServe(*port, nil)) }
func InitWithMetrics(appName string, graphiteServer *string) { common.InitWithMetrics(appName, graphiteServer) initRest() }
func main() { // Setup DB flags. dbConf := db.DBConfigFromFlags() common.InitWithMetrics("skiaperf", graphiteServer) Init() if !*local { if err := dbConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } } if err := dbConf.InitDB(); err != nil { glog.Fatal(err) } stats.Start(nanoTileStore, git) alerting.Start(nanoTileStore, *apikey) // By default use a set of credentials setup for localhost access. var cookieSalt = "notverysecret" var clientID = "31977622648-1873k0c1e5edaka4adpv1ppvhr5id3qm.apps.googleusercontent.com" var clientSecret = "cw0IosPu4yjaG2KWmppj2guj" var redirectURL = fmt.Sprintf("http://localhost%s/oauth2callback/", *port) if !*local { cookieSalt = metadata.Must(metadata.ProjectGet(metadata.COOKIESALT)) clientID = metadata.Must(metadata.ProjectGet(metadata.CLIENT_ID)) clientSecret = metadata.Must(metadata.ProjectGet(metadata.CLIENT_SECRET)) redirectURL = "https://perf.skia.org/oauth2callback/" } login.Init(clientID, clientSecret, redirectURL, cookieSalt, login.DEFAULT_SCOPE, login.DEFAULT_DOMAIN_WHITELIST, *local) glog.Infoln("Begin loading data.") // Resources are served directly. router := mux.NewRouter() router.PathPrefix("/res/").HandlerFunc(makeResourceHandler()) router.HandleFunc("/", mainHandler) router.HandleFunc("/shortcuts/", shortcutHandler) router.PathPrefix("/tiles/").HandlerFunc(tileHandler) router.PathPrefix("/single/").HandlerFunc(singleHandler) router.PathPrefix("/query/").HandlerFunc(queryHandler) router.HandleFunc("/commits/", commitsHandler) router.HandleFunc("/shortcommits/", shortCommitsHandler) router.HandleFunc("/trybots/", trybotHandler) router.HandleFunc("/clusters/", clustersHandler) router.HandleFunc("/clustering/", clusteringHandler) router.PathPrefix("/cl/").HandlerFunc(clHandler) router.PathPrefix("/activitylog/").HandlerFunc(activityHandler) router.HandleFunc("/alerts/", alertsHandler) router.HandleFunc("/alerting/", alertingHandler) router.HandleFunc("/alert_reset/", alertResetHandler) router.HandleFunc("/annotate/", annotate.Handler) router.HandleFunc("/compare/", compareHandler) router.HandleFunc("/calc/", calcHandler) router.HandleFunc("/help/", helpHandler) router.HandleFunc("/oauth2callback/", login.OAuth2CallbackHandler) router.HandleFunc("/logout/", login.LogoutHandler) router.HandleFunc("/loginstatus/", login.StatusHandler) http.Handle("/", util.LoggingGzipRequestResponse(router)) glog.Infoln("Ready to serve.") glog.Fatal(http.ListenAndServe(*port, nil)) }
func main() { if *hostname == "" { var err error *hostname, err = os.Hostname() if err != nil { // Never call glog before common.Init*. os.Exit(1) } } common.InitWithMetrics("pull."+*hostname, graphiteServer) glog.Infof("Running with hostname: %s", *hostname) client, err := auth.NewClient(*doOauth, *oauthCacheFile, storage.DevstorageFull_controlScope, compute.ComputeReadonlyScope) if err != nil { glog.Fatalf("Failed to create authenticated HTTP client: %s", err) } glog.Info("Got authenticated client.") store, err := storage.New(client) if err != nil { glog.Fatalf("Failed to create storage service client: %s", err) } for _ = range time.Tick(time.Second * 15) { before, err := filepath.Glob("/etc/monit/conf.d/*") if err != nil { glog.Errorf("Failed to list all monit config files: %s", err) continue } glog.Info("About to read package list.") // Read the old and new packages from their respective storage locations. serverList, err := packages.InstalledForServer(client, store, *hostname) if err != nil { glog.Errorf("Failed to retrieve remote package list: %s", err) continue } localList, err := packages.FromLocalFile(*installedPackagesFile) if err != nil { glog.Errorf("Failed to retrieve local package list: %s", err) continue } glog.Info("Comparing against currently installed packages.") // Install any new or updated packages. newPackages, installedPackages := differences(serverList.Names, localList) for _, p := range newPackages { glog.Infof("New Package:%s", p) } for _, p := range installedPackages { glog.Infof("Installed Package:%s", p) } save := false for _, name := range newPackages { // If just an appname appears w/o a packge name then that means // that package hasn't been selected, so just skip it for now. if len(strings.Split(name, "/")) == 1 { continue } if err := packages.Install(client, store, name); err != nil { glog.Errorf("Failed to install package %s: %s", name, err) continue } installedPackages = append(installedPackages, name) save = true } // Only write out the file if any new packages were installed. if !save { continue } if err := packages.ToLocalFile(installedPackages, *installedPackagesFile); err != nil { glog.Errorf("Failed to write local package list: %s", err) } after, err := filepath.Glob("/etc/monit/conf.d/*") if err != nil { glog.Errorf("Failed to list all monit config files: %s", err) continue } // Tell monit to reload if the name or number of files under /etc/monit/conf.d have changed. if !util.SSliceEqual(before, after) { cmd := exec.Command("sudo", "monit", "reload") var out bytes.Buffer cmd.Stdout = &out if err := cmd.Run(); err != nil { glog.Errorf("Failed to reload monit: %s", err) glog.Errorf("Failed to reload monit (stdout): %s", out.String()) break } } // The pull application is special and not monitored by monit to restart on // timestamp changes because that might kill pull while it was updating // itself. Instead pull will just exit when it notices that it has been // updated and count on monit to restart pull. if containsPull(newPackages) { glog.Info("The pull package has been updated, exiting to allow a restart.") os.Exit(0) } } }
func main() { defer common.LogPanic() alertDBConf := alerting.DBConfigFromFlags() buildbotDBConf := buildbot.DBConfigFromFlags() common.InitWithMetrics("alertserver", graphiteServer) v, err := skiaversion.GetVersion() if err != nil { glog.Fatal(err) } glog.Infof("Version %s, built at %s", v.Commit, v.Date) Init() if *validateAndExit { if _, err := rules.MakeRules(*alertsFile, nil, time.Second, nil, *testing); err != nil { glog.Fatalf("Failed to set up rules: %v", err) } return } parsedPollInterval, err := time.ParseDuration(*alertPollInterval) if err != nil { glog.Fatalf("Failed to parse -alertPollInterval: %s", *alertPollInterval) } if *testing { *useMetadata = false } if *useMetadata { *influxDbName = metadata.Must(metadata.ProjectGet(metadata.INFLUXDB_NAME)) *influxDbPassword = metadata.Must(metadata.ProjectGet(metadata.INFLUXDB_PASSWORD)) } dbClient, err := client.New(&client.ClientConfig{ Host: *influxDbHost, Username: *influxDbName, Password: *influxDbPassword, Database: *influxDbDatabase, HttpClient: nil, IsSecure: false, IsUDP: false, }) if err != nil { glog.Fatalf("Failed to initialize InfluxDB client: %s", err) } serverURL := "https://" + *host if *testing { serverURL = "http://" + *host + *port } usr, err := user.Current() if err != nil { glog.Fatal(err) } tokenFile, err := filepath.Abs(usr.HomeDir + "/" + GMAIL_TOKEN_CACHE_FILE) if err != nil { glog.Fatal(err) } // By default use a set of credentials setup for localhost access. var cookieSalt = "notverysecret" var clientID = "31977622648-1873k0c1e5edaka4adpv1ppvhr5id3qm.apps.googleusercontent.com" var clientSecret = "cw0IosPu4yjaG2KWmppj2guj" var redirectURL = serverURL + "/oauth2callback/" var emailClientId = *emailClientIdFlag var emailClientSecret = *emailClientSecretFlag if *useMetadata { cookieSalt = metadata.Must(metadata.ProjectGet(metadata.COOKIESALT)) clientID = metadata.Must(metadata.ProjectGet(metadata.CLIENT_ID)) clientSecret = metadata.Must(metadata.ProjectGet(metadata.CLIENT_SECRET)) emailClientId = metadata.Must(metadata.ProjectGet(metadata.GMAIL_CLIENT_ID)) emailClientSecret = metadata.Must(metadata.ProjectGet(metadata.GMAIL_CLIENT_SECRET)) cachedGMailToken := metadata.Must(metadata.ProjectGet(metadata.GMAIL_CACHED_TOKEN)) err = ioutil.WriteFile(tokenFile, []byte(cachedGMailToken), os.ModePerm) if err != nil { glog.Fatalf("Failed to cache token: %s", err) } } login.Init(clientID, clientSecret, redirectURL, cookieSalt, login.DEFAULT_SCOPE, login.DEFAULT_DOMAIN_WHITELIST, false) var emailAuth *email.GMail if !*testing { if !*useMetadata && (emailClientId == "" || emailClientSecret == "") { glog.Fatal("If -use_metadata=false, you must provide -email_clientid and -email_clientsecret") } emailAuth, err = email.NewGMail(emailClientId, emailClientSecret, tokenFile) if err != nil { glog.Fatalf("Failed to create email auth: %v", err) } } // Initialize the database. if !*testing && *useMetadata { if err := alertDBConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } if err := buildbotDBConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } } if err := alertDBConf.InitDB(); err != nil { glog.Fatal(err) } if err := buildbotDBConf.InitDB(); err != nil { glog.Fatal(err) } // Create the AlertManager. alertManager, err = alerting.MakeAlertManager(parsedPollInterval, emailAuth) if err != nil { glog.Fatalf("Failed to create AlertManager: %v", err) } rulesList, err = rules.MakeRules(*alertsFile, dbClient, parsedPollInterval, alertManager, *testing) if err != nil { glog.Fatalf("Failed to set up rules: %v", err) } StartAlertRoutines(alertManager, 10*parsedPollInterval, dbClient) runServer(serverURL) }
func main() { // Setup flags. dbConf := buildbot.DBConfigFromFlags() influxdb.SetupFlags() // Global init to initialize glog and parse arguments. common.InitWithMetrics("datahopper", graphiteServer) // Initialize the buildbot database. if !*local { if err := dbConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } } if err := dbConf.InitDB(); err != nil { glog.Fatal(err) } // Data generation goroutines. // Buildbot data ingestion. go buildbot.IngestNewBuildsLoop(*workdir) // Measure buildbot data ingestion progress. totalGuage := metrics.GetOrRegisterGauge("buildbot.builds.total", metrics.DefaultRegistry) ingestGuage := metrics.GetOrRegisterGauge("buildbot.builds.ingested", metrics.DefaultRegistry) go func() { for _ = range time.Tick(common.SAMPLE_PERIOD) { totalBuilds, err := buildbot.NumTotalBuilds() if err != nil { glog.Error(err) continue } ingestedBuilds, err := buildbot.NumIngestedBuilds() if err != nil { glog.Error(err) continue } totalGuage.Update(int64(totalBuilds)) ingestGuage.Update(int64(ingestedBuilds)) } }() // Average duration of buildsteps over a time period. go func() { period := 24 * time.Hour type stepData struct { Name string `db:"name"` Duration float64 `db:"duration"` } stmt, err := buildbot.DB.Preparex(fmt.Sprintf("SELECT name, AVG(finished-started) AS duration FROM %s WHERE started > ? AND finished > started GROUP BY name ORDER BY duration;", buildbot.TABLE_BUILD_STEPS)) if err != nil { glog.Fatalf("Failed to prepare buildbot database query: %v", err) } defer util.Close(stmt) for _ = range time.Tick(common.SAMPLE_PERIOD) { glog.Info("Loading buildstep duration data.") t := time.Now().UTC().Add(-period).Unix() steps := []stepData{} if err := stmt.Select(&steps, t); err != nil { glog.Error(err) continue } for _, s := range steps { v := int64(s.Duration * float64(time.Millisecond)) metric := fmt.Sprintf("buildbot.buildsteps.%s.duration", fixName(s.Name)) metrics.GetOrRegisterGauge(metric, metrics.DefaultRegistry).Update(v) } } }() // Average duration of builds over a time period. go func() { period := 24 * time.Hour type buildData struct { Builder string `db:"builder"` Duration float64 `db:"duration"` } stmt, err := buildbot.DB.Preparex(fmt.Sprintf("SELECT builder, AVG(finished-started) AS duration FROM %s WHERE started > ? AND finished > started GROUP BY builder ORDER BY duration;", buildbot.TABLE_BUILDS)) if err != nil { glog.Fatalf("Failed to prepare buildbot database query: %v", err) } defer util.Close(stmt) for _ = range time.Tick(common.SAMPLE_PERIOD) { glog.Info("Loading build duration data.") t := time.Now().UTC().Add(-period).Unix() builds := []buildData{} if err := stmt.Select(&builds, t); err != nil { glog.Error(err) continue } for _, s := range builds { v := int64(s.Duration * float64(time.Millisecond)) metric := fmt.Sprintf("buildbot.builds.%s.duration", fixName(s.Builder)) metrics.GetOrRegisterGauge(metric, metrics.DefaultRegistry).Update(v) } } }() // Average build step time broken down by builder. go func() { period := 24 * time.Hour type stepData struct { Builder string `db:"builder"` StepName string `db:"stepName"` Duration float64 `db:"duration"` } stmt, err := buildbot.DB.Preparex(fmt.Sprintf("SELECT b.builder as builder, s.name as stepName, AVG(s.finished-s.started) AS duration FROM %s s INNER JOIN %s b ON (s.buildId = b.id) WHERE s.started > ? AND s.finished > s.started GROUP BY b.builder, s.name ORDER BY b.builder, duration;", buildbot.TABLE_BUILD_STEPS, buildbot.TABLE_BUILDS)) if err != nil { glog.Fatalf("Failed to prepare buildbot database query: %v", err) } defer util.Close(stmt) for _ = range time.Tick(common.SAMPLE_PERIOD) { glog.Info("Loading per-builder buildstep duration data.") t := time.Now().UTC().Add(-period).Unix() steps := []stepData{} if err := stmt.Select(&steps, t); err != nil { glog.Error(err) continue } for _, s := range steps { v := int64(s.Duration * float64(time.Millisecond)) metric := fmt.Sprintf("buildbot.buildstepsbybuilder.%s.%s.duration", fixName(s.Builder), fixName(s.StepName)) metrics.GetOrRegisterGauge(metric, metrics.DefaultRegistry).Update(v) } } }() // Wait while the above goroutines generate data. select {} }
func main() { defer common.LogPanic() var err error mainTimer := timer.New("main init") // Setup DB flags. dbConf := database.ConfigFromFlags(db.PROD_DB_HOST, db.PROD_DB_PORT, database.USER_RW, db.PROD_DB_NAME, db.MigrationSteps()) // Global init to initialize common.InitWithMetrics("skiacorrectness", graphiteServer) v, err := skiaversion.GetVersion() if err != nil { glog.Fatalf("Unable to retrieve version: %s", err) } glog.Infof("Version %s, built at %s", v.Commit, v.Date) // Enable the memory profiler if memProfile was set. // TODO(stephana): This should be moved to a HTTP endpoint that // only responds to internal IP addresses/ports. if *memProfile > 0 { time.AfterFunc(*memProfile, func() { glog.Infof("Writing Memory Profile") f, err := ioutil.TempFile("./", "memory-profile") if err != nil { glog.Fatalf("Unable to create memory profile file: %s", err) } if err := pprof.WriteHeapProfile(f); err != nil { glog.Fatalf("Unable to write memory profile file: %v", err) } util.Close(f) glog.Infof("Memory profile written to %s", f.Name()) os.Exit(0) }) } if *cpuProfile > 0 { glog.Infof("Writing CPU Profile") f, err := ioutil.TempFile("./", "cpu-profile") if err != nil { glog.Fatalf("Unable to create cpu profile file: %s", err) } if err := pprof.StartCPUProfile(f); err != nil { glog.Fatalf("Unable to write cpu profile file: %v", err) } time.AfterFunc(*cpuProfile, func() { pprof.StopCPUProfile() util.Close(f) glog.Infof("CPU profile written to %s", f.Name()) os.Exit(0) }) } // Init this module. Init() // Initialize submodules. filediffstore.Init() // Set up login // TODO (stephana): Factor out to go/login/login.go and removed hard coded // values. var cookieSalt = "notverysecret" var clientID = "31977622648-ubjke2f3staq6ouas64r31h8f8tcbiqp.apps.googleusercontent.com" var clientSecret = "rK-kRY71CXmcg0v9I9KIgWci" var useRedirectURL = fmt.Sprintf("http://localhost%s/oauth2callback/", *port) if !*local { cookieSalt = metadata.Must(metadata.ProjectGet(metadata.COOKIESALT)) clientID = metadata.Must(metadata.ProjectGet(metadata.CLIENT_ID)) clientSecret = metadata.Must(metadata.ProjectGet(metadata.CLIENT_SECRET)) useRedirectURL = *redirectURL } login.Init(clientID, clientSecret, useRedirectURL, cookieSalt, login.DEFAULT_SCOPE, *authWhiteList, *local) // get the Oauthclient if necessary. client := getOAuthClient(*oauthCacheFile) // Set up the cache implementation to use. cacheFactory := filediffstore.MemCacheFactory if *redisHost != "" { cacheFactory = func(uniqueId string, codec util.LRUCodec) util.LRUCache { return redisutil.NewRedisLRUCache(*redisHost, *redisDB, uniqueId, codec) } } // Get the expecations storage, the filediff storage and the tilestore. diffStore, err := filediffstore.NewFileDiffStore(client, *imageDir, *gsBucketName, filediffstore.DEFAULT_GS_IMG_DIR_NAME, cacheFactory, filediffstore.RECOMMENDED_WORKER_POOL_SIZE) if err != nil { glog.Fatalf("Allocating DiffStore failed: %s", err) } if !*local { if err := dbConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } } vdb, err := dbConf.NewVersionedDB() if err != nil { glog.Fatal(err) } if !vdb.IsLatestVersion() { glog.Fatal("Wrong DB version. Please updated to latest version.") } digestStore, err := digeststore.New(*storageDir) if err != nil { glog.Fatal(err) } eventBus := eventbus.New(nil) storages = &storage.Storage{ DiffStore: diffStore, ExpectationsStore: expstorage.NewCachingExpectationStore(expstorage.NewSQLExpectationStore(vdb), eventBus), IgnoreStore: ignore.NewSQLIgnoreStore(vdb), TileStore: filetilestore.NewFileTileStore(*tileStoreDir, config.DATASET_GOLD, 2*time.Minute), DigestStore: digestStore, NCommits: *nCommits, EventBus: eventBus, TrybotResults: trybot.NewTrybotResultStorage(vdb), RietveldAPI: rietveld.New(*rietveldURL, nil), } if err := history.Init(storages, *nTilesToBackfill); err != nil { glog.Fatalf("Unable to initialize history package: %s", err) } if blamer, err = blame.New(storages); err != nil { glog.Fatalf("Unable to create blamer: %s", err) } if err := ignore.Init(storages.IgnoreStore); err != nil { glog.Fatalf("Failed to start monitoring for expired ignore rules: %s", err) } // Enable the experimental features. tallies, err = tally.New(storages) if err != nil { glog.Fatalf("Failed to build tallies: %s", err) } paramsetSum = paramsets.New(tallies, storages) if !*local { *issueTrackerKey = metadata.Must(metadata.ProjectGet(metadata.APIKEY)) } issueTracker = issues.NewIssueTracker(*issueTrackerKey) summaries, err = summary.New(storages, tallies, blamer) if err != nil { glog.Fatalf("Failed to build summary: %s", err) } statusWatcher, err = status.New(storages) if err != nil { glog.Fatalf("Failed to initialize status watcher: %s", err) } imgFS := NewURLAwareFileServer(*imageDir, IMAGE_URL_PREFIX) pathToURLConverter = imgFS.GetURL if err := warmer.Init(storages, summaries, tallies); err != nil { glog.Fatalf("Failed to initialize the warmer: %s", err) } mainTimer.Stop() // Everything is wired up at this point. Run the self tests if requested. if *selfTest { search.SelfTest(storages, tallies, blamer, paramsetSum) } router := mux.NewRouter() // Set up the resource to serve the image files. router.PathPrefix(IMAGE_URL_PREFIX).Handler(imgFS.Handler) // New Polymer based UI endpoints. router.PathPrefix("/res/").HandlerFunc(makeResourceHandler()) // TODO(stephana): Remove the 'poly' prefix from all the handlers and clean // up main2.go by either merging it it into main.go or making it clearer that // it contains all the handlers. Make it clearer what variables are shared // between the different file. // All the handlers will be prefixed with poly to differentiate it from the // angular code until the angular code is removed. router.HandleFunc(OAUTH2_CALLBACK_PATH, login.OAuth2CallbackHandler) router.HandleFunc("/", byBlameHandler).Methods("GET") router.HandleFunc("/list", templateHandler("list.html")).Methods("GET") router.HandleFunc("/_/details", polyDetailsHandler).Methods("GET") router.HandleFunc("/_/diff", polyDiffJSONDigestHandler).Methods("GET") router.HandleFunc("/_/hashes", polyAllHashesHandler).Methods("GET") router.HandleFunc("/_/ignores", polyIgnoresJSONHandler).Methods("GET") router.HandleFunc("/_/ignores/add/", polyIgnoresAddHandler).Methods("POST") router.HandleFunc("/_/ignores/del/{id}", polyIgnoresDeleteHandler).Methods("POST") router.HandleFunc("/_/ignores/save/{id}", polyIgnoresUpdateHandler).Methods("POST") router.HandleFunc("/_/list", polyListTestsHandler).Methods("GET") router.HandleFunc("/_/paramset", polyParamsHandler).Methods("GET") router.HandleFunc("/_/nxn", nxnJSONHandler).Methods("GET") // TODO(stephana): Once /_/search3 is stable it will replace /_/search and the // /search*.html pages will be consolidated into one. router.HandleFunc("/_/search", polySearchJSONHandler).Methods("GET") router.HandleFunc("/_/search3", search3JSONHandler).Methods("GET") router.HandleFunc("/_/status/{test}", polyTestStatusHandler).Methods("GET") router.HandleFunc("/_/test", polyTestHandler).Methods("POST") router.HandleFunc("/_/triage", polyTriageHandler).Methods("POST") router.HandleFunc("/_/triagelog", polyTriageLogHandler).Methods("GET") router.HandleFunc("/_/triagelog/undo", triageUndoHandler).Methods("POST") router.HandleFunc("/_/failure", failureListJSONHandler).Methods("GET") router.HandleFunc("/_/failure/clear", failureClearJSONHandler).Methods("POST") router.HandleFunc("/_/trybot", listTrybotsJSONHandler).Methods("GET") router.HandleFunc("/byblame", byBlameHandler).Methods("GET") router.HandleFunc("/cluster", templateHandler("cluster.html")).Methods("GET") router.HandleFunc("/search2", search2Handler).Methods("GET") router.HandleFunc("/cmp/{test}", templateHandler("compare.html")).Methods("GET") router.HandleFunc("/detail", templateHandler("single.html")).Methods("GET") router.HandleFunc("/diff", templateHandler("diff.html")).Methods("GET") router.HandleFunc("/help", templateHandler("help.html")).Methods("GET") router.HandleFunc("/ignores", templateHandler("ignores.html")).Methods("GET") router.HandleFunc("/loginstatus/", login.StatusHandler) router.HandleFunc("/logout/", login.LogoutHandler) router.HandleFunc("/search", templateHandler("search.html")).Methods("GET") router.HandleFunc("/triagelog", templateHandler("triagelog.html")).Methods("GET") router.HandleFunc("/trybot", templateHandler("trybot.html")).Methods("GET") router.HandleFunc("/failures", templateHandler("failures.html")).Methods("GET") // Add the necessary middleware and have the router handle all requests. // By structuring the middleware this way we only log requests that are // authenticated. rootHandler := util.LoggingGzipRequestResponse(router) if *forceLogin { rootHandler = login.ForceAuth(rootHandler, OAUTH2_CALLBACK_PATH) } // The polyStatusHandler is being polled, so we exclude it from logging. http.HandleFunc("/_/trstatus", polyStatusHandler) http.Handle("/", rootHandler) // Start the server glog.Infoln("Serving on http://127.0.0.1" + *port) glog.Fatal(http.ListenAndServe(*port, nil)) }