From 4c16211e894be34e5ba9c2ab92c998b7bca4d17b Mon Sep 17 00:00:00 2001 From: Christopher Ramey Date: Sun, 14 Feb 2021 09:26:56 -0900 Subject: [PATCH] changed server to use channels instead of cond for wakeup, removed config hashing, added config path to config struct --- config/config.go | 5 ++++- config/parser.go | 5 +++-- config/tokenizer.go | 5 ----- main.go | 26 +++++++++++------------ server.go | 51 --------------------------------------------- server/server.go | 47 +++++++++++++++++++++++++++++++++++++++++ server/worker.go | 32 ++++++++++++++++++++++++++++ 7 files changed, 98 insertions(+), 73 deletions(-) delete mode 100644 server.go create mode 100644 server/server.go create mode 100644 server/worker.go diff --git a/config/config.go b/config/config.go index acdaf6a..e15cf56 100644 --- a/config/config.go +++ b/config/config.go @@ -10,13 +10,16 @@ type Config struct { Groups map[string]*Group Alarms map[string]alarm.Alarm Interval time.Duration - Hash string + Listen string + Path string } func NewConfig() *Config { return &Config{ // Default check interval, 30 seconds Interval: time.Second * 30, + // Default listen address + Listen: "127.0.0.1:8282", } } diff --git a/config/parser.go b/config/parser.go index e84bb01..b2510b4 100644 --- a/config/parser.go +++ b/config/parser.go @@ -1,7 +1,6 @@ package config import ( - "encoding/hex" "fmt" "git.binarythought.com/cdramey/alrm/alarm" "git.binarythought.com/cdramey/alrm/check" @@ -30,6 +29,7 @@ type Parser struct { func (p *Parser) Parse(fn string) (*Config, error) { config := NewConfig() + config.Path = fn tok, err := NewTokenizer(fn) if err != nil { return nil, err @@ -70,6 +70,8 @@ func (p *Parser) Parse(fn string) (*Config, error) { fn, tok.Line(), value, ) } + case "listen": + config.Listen = value default: return nil, fmt.Errorf("unknown key for set in %s, line %d: \"%s\"", fn, tok.Line(), tk, @@ -200,7 +202,6 @@ func (p *Parser) Parse(fn string) (*Config, error) { if err := tok.Err(); err != nil { return nil, err } - config.Hash = hex.EncodeToString(tok.Hash.Sum(nil)) return config, nil } diff --git a/config/tokenizer.go b/config/tokenizer.go index 3db4050..5277404 100644 --- a/config/tokenizer.go +++ b/config/tokenizer.go @@ -2,9 +2,7 @@ package config import ( "bufio" - "crypto/sha256" "fmt" - "hash" "io" "os" "strings" @@ -19,7 +17,6 @@ const ( ) type Tokenizer struct { - Hash hash.Hash curline int repline int file *os.File @@ -36,7 +33,6 @@ func NewTokenizer(fn string) (*Tokenizer, error) { return nil, err } - tk.Hash = sha256.New() tk.reader = bufio.NewReader(tk.file) return tk, nil } @@ -62,7 +58,6 @@ func (t *Tokenizer) Scan() bool { t.err = fmt.Errorf("invalid utf-8 encoding on line %s", t.repline) break } - t.Hash.Write([]byte(string(r))) switch state { case TK_NONE: diff --git a/main.go b/main.go index 947268f..2450367 100644 --- a/main.go +++ b/main.go @@ -5,26 +5,27 @@ import ( "flag" "fmt" "git.binarythought.com/cdramey/alrm/config" + "git.binarythought.com/cdramey/alrm/server" "os" "strings" ) func main() { - cfgPath := flag.String("c", "", "path to configuration file") + cfgpath := flag.String("c", "", "path to configuration file") debuglvl := flag.Int("d", 0, "debug level") flag.Usage = printUsage flag.Parse() - if *cfgPath == "" { + if *cfgpath == "" { searchpaths := []string{"/etc/alrmrc", "./alrmrc"} for _, sp := range searchpaths { if _, err := os.Stat(sp); err == nil { - *cfgPath = sp + *cfgpath = sp break } } - if *cfgPath == "" { + if *cfgpath == "" { fmt.Fprintf(os.Stderr, "cannot find configuration\n") os.Exit(1) } @@ -34,10 +35,10 @@ func main() { switch command { case "config": if *debuglvl > 0 { - fmt.Printf("checking config %s .. \n", *cfgPath) + fmt.Printf("checking config %s .. \n", *cfgpath) } - cfg, err := config.ReadConfig(*cfgPath, *debuglvl) + cfg, err := config.ReadConfig(*cfgpath, *debuglvl) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) os.Exit(1) @@ -61,7 +62,7 @@ func main() { os.Exit(1) } - cfg, err := config.ReadConfig(*cfgPath, 0) + cfg, err := config.ReadConfig(*cfgpath, 0) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) os.Exit(1) @@ -90,7 +91,7 @@ func main() { os.Exit(1) } - cfg, err := config.ReadConfig(*cfgPath, 0) + cfg, err := config.ReadConfig(*cfgpath, 0) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) os.Exit(1) @@ -110,17 +111,14 @@ func main() { fmt.Printf("check successful\n") case "server": - cfg, err := config.ReadConfig(*cfgPath, *debuglvl) + cfg, err := config.ReadConfig(*cfgpath, *debuglvl) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) os.Exit(1) } - err = startServer(cfg, *debuglvl) - if err != nil { - fmt.Fprintf(os.Stderr, "%s\n", err.Error()) - os.Exit(1) - } + srv := server.NewServer(cfg, *debuglvl) + srv.Start() case "help", "": printUsage() diff --git a/server.go b/server.go deleted file mode 100644 index 10ae568..0000000 --- a/server.go +++ /dev/null @@ -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) - } - } - } - } -} diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..d6ec9a7 --- /dev/null +++ b/server/server.go @@ -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 +} diff --git a/server/worker.go b/server/worker.go new file mode 100644 index 0000000..7afd758 --- /dev/null +++ b/server/worker.go @@ -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) + } + } + } + } +}