func startApi(done chan struct{}) string { log.NewLogger(0, "console", fmt.Sprintf(`{"level": %d, "formatting":true}`, 1)) stats, err := helper.New(false, "localhost:8125", "standard", "task-server", "default") if err != nil { panic(fmt.Errorf("failed to initialize statsd. %s", err)) } sqlstore.NewEngine("sqlite3", ":memory:", true) //sqlstore.NewEngine("sqlite3", "file:/tmp/task-server-test.db?cache=shared&mode=rwc&_loc=Local", true) addTestData() m := api.NewApi(adminKey, stats) // define our own listner so we can call Close on it l, err := net.Listen("tcp", "localhost:0") if err != nil { panic(err.Error()) } go http.Serve(l, m) go func() { <-done l.Close() }() return fmt.Sprintf("http://%s/", l.Addr().String()) }
func main() { flag.Parse() // Set 'cfile' here if *confFile exists, because we should only try and // parse the conf file if it exists. If we try and parse the default // conf file location when it's not there, we (unsurprisingly) get a // panic. var cfile string if _, err := os.Stat(*confFile); err == nil { cfile = *confFile } // Still parse globalconf, though, even if the config file doesn't exist // because we want to be able to use environment variables. conf, err := globalconf.NewWithOptions(&globalconf.Options{ Filename: cfile, EnvPrefix: "RTPROBE_", }) if err != nil { panic(fmt.Sprintf("error with configuration file: %s", err)) } conf.ParseAll() log.NewLogger(0, "console", fmt.Sprintf(`{"level": %d, "formatting":true}`, *logLevel)) // workaround for https://github.com/grafana/grafana/issues/4055 switch *logLevel { case 0: log.Level(log.TRACE) case 1: log.Level(log.DEBUG) case 2: log.Level(log.INFO) case 3: log.Level(log.WARN) case 4: log.Level(log.ERROR) case 5: log.Level(log.CRITICAL) case 6: log.Level(log.FATAL) } if *showVersion { fmt.Printf("raintank-probe (built with %s, git hash %s)\n", runtime.Version(), GitHash) return } if *nodeName == "" { log.Fatal(4, "name must be set.") } file, err := ioutil.ReadFile(*publicChecksFile) if err != nil { log.Error(3, "Could not read publicChecks file. %s", err.Error()) } else { err = json.Unmarshal(file, &PublicChecks) if err != nil { log.Error(3, "Could not parse publicChecks file. %s", err.Error()) } } jobScheduler := scheduler.New(*healthHosts) go jobScheduler.CheckHealth() interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt) controllerUrl, err := url.Parse(*serverAddr) if err != nil { log.Fatal(4, err.Error()) } controllerUrl.Path = path.Clean(controllerUrl.Path + "/socket.io") version := strings.Split(GitHash, "-")[0] controllerUrl.RawQuery = fmt.Sprintf("EIO=3&transport=websocket&apiKey=%s&name=%s&version=%s", *apiKey, url.QueryEscape(*nodeName), version) if controllerUrl.Scheme != "ws" && controllerUrl.Scheme != "wss" { log.Fatal(4, "invalid server address. scheme must be ws or wss. was %s", controllerUrl.Scheme) } tsdbUrl, err := url.Parse(*tsdbAddr) if err != nil { log.Fatal(4, "Invalid TSDB url.", err) } if !strings.HasPrefix(tsdbUrl.Path, "/") { tsdbUrl.Path += "/" } publisher.Init(tsdbUrl, *apiKey, *concurrency) client, err := gosocketio.Dial(controllerUrl.String(), transport.GetDefaultWebsocketTransport()) if err != nil { log.Fatal(4, "unable to connect to server on url %s: %s", controllerUrl.String(), err) } bindHandlers(client, controllerUrl, jobScheduler, interrupt) //wait for interupt Signal. <-interrupt log.Info("interrupt") jobScheduler.Close() client.Close() return }
func main() { flag.Parse() // Set 'cfile' here if *confFile exists, because we should only try and // parse the conf file if it exists. If we try and parse the default // conf file location when it's not there, we (unsurprisingly) get a // panic. var cfile string if _, err := os.Stat(*confFile); err == nil { cfile = *confFile } // Still parse globalconf, though, even if the config file doesn't exist // because we want to be able to use environment variables. conf, err := globalconf.NewWithOptions(&globalconf.Options{ Filename: cfile, EnvPrefix: "TASKAGENT_", }) if err != nil { panic(fmt.Sprintf("error with configuration file: %s", err)) } conf.ParseAll() log.NewLogger(0, "console", fmt.Sprintf(`{"level": %d, "formatting":true}`, *logLevel)) // workaround for https://github.com/grafana/grafana/issues/4055 switch *logLevel { case 0: log.Level(log.TRACE) case 1: log.Level(log.DEBUG) case 2: log.Level(log.INFO) case 3: log.Level(log.WARN) case 4: log.Level(log.ERROR) case 5: log.Level(log.CRITICAL) case 6: log.Level(log.FATAL) } if *showVersion { fmt.Printf("task-agent (built with %s, git hash %s)\n", runtime.Version(), GitHash) return } if *nodeName == "" { log.Fatal(4, "name must be set.") } snapUrl, err := url.Parse(*snapUrlStr) if err != nil { log.Fatal(4, "could not parse snapUrl. %s", err) } snapClient, err := snap.NewClient(*nodeName, *tsdbAddr, *apiKey, snapUrl) if err != nil { log.Fatal(4, err.Error()) } InitTaskCache(snapClient) interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt) shutdownStart := make(chan struct{}) controllerUrl, err := url.Parse(*serverAddr) if err != nil { log.Fatal(4, err.Error()) } controllerUrl.Path = path.Clean(controllerUrl.Path + fmt.Sprintf("/socket/%s/%d", *nodeName, Version)) if controllerUrl.Scheme != "ws" && controllerUrl.Scheme != "wss" { log.Fatal(4, "invalid server address. scheme must be ws or wss. was %s", controllerUrl.Scheme) } conn, err := connect(controllerUrl) if err != nil { log.Fatal(4, "unable to connect to server on url %s: %s", controllerUrl.String(), err) } //create new session, allow 1000 events to be queued in the writeQueue before Emit() blocks. sess := session.NewSession(conn, 1000) sess.On("disconnect", func() { // on disconnect, reconnect. ticker := time.NewTicker(time.Second) connected := false for !connected { select { case <-shutdownStart: ticker.Stop() return case <-ticker.C: conn, err := connect(controllerUrl) if err == nil { sess.Conn = conn connected = true go sess.Start() } } } ticker.Stop() }) sess.On("heartbeat", func(body []byte) { log.Debug("recieved heartbeat event. %s", body) }) sess.On("taskList", HandleTaskList()) sess.On("taskUpdate", HandleTaskUpdate()) sess.On("taskAdd", HandleTaskAdd()) sess.On("taskRemove", HandleTaskRemove()) go sess.Start() //periodically send an Updated Catalog. go SendCatalog(sess, snapClient, shutdownStart) // connect to the snap server and monitor that it is up. go snapClient.Run() //wait for interupt Signal. <-interrupt log.Info("interrupt") close(shutdownStart) sess.Close() return }