// Start method fetches and builds Sensu data from each datacenter every Refresh seconds func (d *Daemon) Start(interval int, data chan *structs.Data) { // immediately fetch the first set of data and send it over the data channel d.fetchData() d.buildData() select { case data <- d.Data: logger.Debug("Sending initial results on the 'data' channel") default: logger.Debug("Could not send initial results on the 'data' channel") } // fetch new data every interval duration := time.Duration(interval) * time.Second for _ = range time.Tick(duration) { d.resetData() d.fetchData() d.buildData() // send the result over the data channel select { case data <- d.Data: logger.Debug("Sending results on the 'data' channel") default: logger.Debug("Could not send results on the 'data' channel") } } }
func main() { configFile := flag.String("c", "./config.json", "Full or relative path to the configuration file") publicPath := flag.String("p", "public", "Full or relative path to the public directory") flag.Parse() config, err := config.Load(*configFile) if err != nil { logger.Fatal(err) } logger.Debug("Debug mode enabled") u := uchiwa.Init(config) authentication := auth.New() if config.Uchiwa.Auth == "simple" { authentication.Simple(config.Uchiwa.Users) } else { authentication.None() } uchiwa.FilterGetRequest = filters.GetRequest uchiwa.FilterPostRequest = filters.PostRequest uchiwa.FilterSensuData = filters.SensuData u.WebServer(publicPath, authentication) }
func (c *Config) initUchiwa() { if c.Dashboard != nil { c.Uchiwa = *c.Dashboard } if c.Uchiwa.Host == "" { c.Uchiwa.Host = "0.0.0.0" } if c.Uchiwa.Port == 0 { c.Uchiwa.Port = 3000 } if c.Uchiwa.Refresh == 0 { c.Uchiwa.Refresh = 10 } else if c.Uchiwa.Refresh >= 1000 { // backward compatibility with < 0.3.0 version c.Uchiwa.Refresh = c.Uchiwa.Refresh / 1000 } // authentication if c.Uchiwa.Github.Server != "" { c.Uchiwa.Auth = "github" } else if c.Uchiwa.Ldap.Server != "" { c.Uchiwa.Auth = "ldap" if c.Uchiwa.Ldap.Port == 0 { c.Uchiwa.Ldap.Port = 389 } if c.Uchiwa.Ldap.Security == "" { c.Uchiwa.Ldap.Security = "none" } } else if c.Uchiwa.Db.Driver != "" && c.Uchiwa.Db.Scheme != "" { c.Uchiwa.Auth = "sql" } else if len(c.Uchiwa.Users) != 0 { logger.Debug("Loading multiple users from the config") c.Uchiwa.Auth = "simple" } else if c.Uchiwa.User != "" && c.Uchiwa.Pass != "" { logger.Debug("Loading single user from the config") c.Uchiwa.Auth = "simple" c.Uchiwa.Users = append(c.Uchiwa.Users, auth.User{Username: c.Uchiwa.User, Password: c.Uchiwa.Pass, FullName: c.Uchiwa.User}) } // audit if c.Uchiwa.Audit.Level != "verbose" && c.Uchiwa.Audit.Level != "disabled" { c.Uchiwa.Audit.Level = "default" } if c.Uchiwa.Audit.Logfile == "" { c.Uchiwa.Audit.Logfile = "/var/log/sensu/sensu-enterprise-dashboard-audit.log" } }
// GetBoolFromInterface ... func GetBoolFromInterface(i interface{}) (bool, error) { if i == nil { logger.Debug("The interface is nil") return false, errors.New("The interface is nil") } b, ok := i.(bool) if !ok { logger.Debugf("Could not assert to a boolean the interface: %+v", i) return false, errors.New("Could not assert to a boolean the interface") } return b, nil }
// BuildSubscriptions builds a slice of every client subscriptions func (d *Daemon) BuildSubscriptions() { for _, client := range d.Data.Clients { var generic structs.GenericClient err := mapstructure.Decode(client, &generic) if err != nil { logger.Debug("%s", err) continue } for _, subscription := range generic.Subscriptions { if !StringInArray(subscription, d.Data.Subscriptions) { d.Data.Subscriptions = append(d.Data.Subscriptions, subscription) } } } }
// listener method listens on the data channel for messages from the daemon // and updates the Data structure with results from the Sensu APIs func (u *Uchiwa) listener(interval int, data chan *structs.Data) { for { select { case result := <-data: logger.Debug("Received results on the 'data' channel") u.Mu.Lock() u.Data = result u.Mu.Unlock() // sleep during the interval timer := time.NewTimer(time.Second * time.Duration(interval)) <-timer.C default: // sleep during 1 second timer := time.NewTimer(time.Second * 1) <-timer.C } } }