commit 8b3445266f32f04c7bd46718dd5948a6e1543f27 from: Oliver Lowe date: Wed Mar 08 22:16:58 2023 UTC delete experimental object watcher commit - 9016a0fbf4855edbd3463ae2edf332d3a8f44466 commit + 8b3445266f32f04c7bd46718dd5948a6e1543f27 blob - d619bf13ce259580676700dc4f34061acc56a17d (mode 644) blob + /dev/null --- cmd/i2cache/i2cache.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -type Cache struct { - client *icinga.Client - hosts map[string]*hostEntry - services map[string]*serviceEntry -} - -func NewCache(client *icinga.Client) *Cache { - return &Cache{ - client: client, - hosts: make(map[string]*hostEntry), - services: make(map[string]*serviceEntry), - } -} - -type serviceEntry struct { - accessTime time.Time - watcher *ServiceWatcher - services []Service -} - -func (c *Cache) GetServices(expr string) []icinga.Service { - entry, ok := c.services[expr] - if !ok { - return nil - } - entry.accessTime = time.Now() - if entry.wacher == nil { - entry := entry - entry.watcher = WatchServices(c.client, expr) - go func() { - for msg := range entry.watcher.Updates { - if msg.Err != nil { - // TODO(otl) ?? - } - entry.services = msg.Services - } - }() - } - return entry.services -} - -type hostEntry struct { - accessTime time.Time - hosts []Host -} - -func (c *Cache) GetHosts(expr string) *hostEntry {} - -func (c *Cache) evictOlderThan(d time.Duration) { - t := time.Now().Sub(d) - for _, entry := range c.services { - if entry.accessTime.Before(t) { - entry.kill <- true - delete(c.services[expr]) - } - } - for _, entry := range c.Hosts { - if entry.accessTime.Before(t) { - entry.kill <- true - delete(c.hosts[expr]) - } - } -} blob - 053c8422dbb89f47a6db1921ef5d82dcc969e749 (mode 644) blob + /dev/null --- watch.go +++ /dev/null @@ -1,71 +0,0 @@ -package icinga - -// A ServiceWatcher continuously queries Icinga about a set of Services. -// A ServiceWatcher uses the next check time of Services to determine when to query Icinga again. -// If it cannot determine the next check time, the Watcher waits 1 minute before trying again. -type ServiceWatcher struct { - kill chan bool - Updates chan ServiceMsg -} - -type HostWatcher struct { - Kill chan bool - Updates chan HostMsg -} - -type ServiceMsg struct { - Services []Service - Err error -} - -type HostMsg struct { - Hosts []Host - Err error -} - -// Kill stops the Watcher irrevocably. -// A new Watcher must be created with WatchServices. -func (w *ServiceWatcher) Kill() { - w.kill <- true -} - -// WatchServices returns a new Watcher which uses client to -// continuously query Icinga for Services matching the given filter -// expression. -func WatchServices(client *Client, expr string) *Watcher { - timer := time.NewTimer(0) - kill := make(chan bool) - ch := make(chan ServiceMsg) - go func() { - select { - case <-kill: - close(ch) - return - case <-timer.C: - services, err := client.Services(expr) - ch <- ServiceMsg{services, err} - if err != nil { - timer.Reset(1*time.Minute) - } else { - timer.Reset(time.Until(nextCheck(services))) - } - } - } - return &Watcher{ - kill: kill - Updates: ch - } -} - -func WatchHosts(expr string, ch chan HostMsg, stop chan bool) { - timer := time.NewTimer(0) - select { - case <-stop: - close(ch) - return - case <-timer.C: - hosts, err := client.Hosts(expr) - ch <- HostMsg{hosts, err} - timer.Reset(time.Until(NextCheck(hosts))) - } -}