func NewSession(agent *model.AgentDTO, agentVer int64, conn *websocket.Conn) *AgentSession { a := &AgentSession{ Agent: agent, AgentVersion: agentVer, Done: make(chan struct{}), Shutdown: make(chan struct{}), SocketSession: session.NewSession(conn, 10), } return a }
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 }