Browse Source
changed server to use channels instead of cond for wakeup, removed config hashing, added config path to config struct
master
changed server to use channels instead of cond for wakeup, removed config hashing, added config path to config struct
master
Christopher Ramey
3 years ago
7 changed files with 98 additions and 73 deletions
-
5config/config.go
-
5config/parser.go
-
5config/tokenizer.go
-
26main.go
-
51server.go
-
47server/server.go
-
32server/worker.go
@ -1,51 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"fmt" |
|||
"git.binarythought.com/cdramey/alrm/config" |
|||
"sync" |
|||
"time" |
|||
) |
|||
|
|||
func startServer(cfg *config.Config, debuglvl int) error { |
|||
c := sync.NewCond(&sync.Mutex{}) |
|||
for _, g := range cfg.Groups { |
|||
go worker(g, c, debuglvl) |
|||
} |
|||
|
|||
t := time.NewTicker(cfg.Interval) |
|||
defer t.Stop() |
|||
for { |
|||
select { |
|||
case r := <-t.C: |
|||
if debuglvl > 0 { |
|||
fmt.Printf("Interval check at %s\n", r) |
|||
} |
|||
c.Broadcast() |
|||
} |
|||
} |
|||
return nil |
|||
} |
|||
|
|||
func worker(g *config.Group, c *sync.Cond, debuglvl int) { |
|||
for { |
|||
if debuglvl > 2 { |
|||
fmt.Printf("%s goroutine waiting.. \n", g.Name) |
|||
} |
|||
c.L.Lock() |
|||
c.Wait() |
|||
c.L.Unlock() |
|||
if debuglvl > 2 { |
|||
fmt.Printf("%s goroutine wake.. \n", g.Name) |
|||
} |
|||
|
|||
for _, h := range g.Hosts { |
|||
for _, c := range h.Checks { |
|||
err := c.Check(debuglvl) |
|||
if err != nil { |
|||
fmt.Printf("Check error: %s\n", err) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,47 @@ |
|||
package server |
|||
|
|||
import ( |
|||
"fmt" |
|||
"git.binarythought.com/cdramey/alrm/config" |
|||
"time" |
|||
) |
|||
|
|||
type Server struct { |
|||
workers []*worker |
|||
cfg *config.Config |
|||
debuglvl int |
|||
httpsrv http.Server |
|||
} |
|||
|
|||
func (srv *Server) Start() { |
|||
for _, w := range srv.workers { |
|||
go w.start(srv.debuglvl) |
|||
} |
|||
|
|||
t := time.NewTicker(srv.cfg.Interval) |
|||
defer t.Stop() |
|||
for { |
|||
select { |
|||
case r := <-t.C: |
|||
if srv.debuglvl > 0 { |
|||
fmt.Printf("interval check at %s\n", r) |
|||
} |
|||
|
|||
for _, w := range srv.workers { |
|||
select { |
|||
case w.wake <- true: |
|||
default: |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
func NewServer(cfg *config.Config, debuglvl int) *Server { |
|||
srv := &Server{cfg: cfg, debuglvl: debuglvl} |
|||
for _, g := range cfg.Groups { |
|||
w := &worker{group: g, wake: make(chan bool)} |
|||
srv.workers = append(srv.workers, w) |
|||
} |
|||
return srv |
|||
} |
@ -0,0 +1,32 @@ |
|||
package server |
|||
|
|||
import ( |
|||
"fmt" |
|||
"git.binarythought.com/cdramey/alrm/config" |
|||
) |
|||
|
|||
type worker struct { |
|||
wake chan bool |
|||
group *config.Group |
|||
} |
|||
|
|||
func (w *worker) start(debuglvl int) { |
|||
for { |
|||
if debuglvl > 2 { |
|||
fmt.Printf("%s worker waiting.. \n", w.group.Name) |
|||
} |
|||
<-w.wake |
|||
if debuglvl > 2 { |
|||
fmt.Printf("%s worker wake.. \n", w.group.Name) |
|||
} |
|||
|
|||
for _, h := range w.group.Hosts { |
|||
for _, c := range h.Checks { |
|||
err := c.Check(debuglvl) |
|||
if err != nil { |
|||
fmt.Printf("check error: %s\n", err) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue