server now opens a web server on the specified addr/port

This commit is contained in:
Christopher Ramey 2021-02-14 16:55:56 -09:00
parent 8b438b6f3e
commit cd7bcd5d55
4 changed files with 70 additions and 16 deletions

24
main.go
View File

@ -111,14 +111,24 @@ func main() {
fmt.Printf("check successful\n") fmt.Printf("check successful\n")
case "server": case "server":
cfg, err := config.ReadConfig(*cfgpath, *debuglvl) for {
if err != nil { cfg, err := config.ReadConfig(*cfgpath, *debuglvl)
fmt.Fprintf(os.Stderr, "%s\n", err.Error()) if err != nil {
os.Exit(1) fmt.Fprintf(os.Stderr, "%s\n", err.Error())
} os.Exit(1)
}
srv := server.NewServer(cfg, *debuglvl) srv := server.NewServer(cfg, *debuglvl)
srv.Start()
r, err := srv.Start()
if err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
os.Exit(1)
}
if !r {
return
}
}
case "help", "": case "help", "":
printUsage() printUsage()

19
server/http.go Normal file
View File

@ -0,0 +1,19 @@
package server
import (
"fmt"
"net/http"
)
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case "/shutdown":
fmt.Fprintf(w, "shutting down .. ")
s.shutdownc <- false
case "/restart":
fmt.Fprintf(w, "restarting .. ")
s.shutdownc <- true
default:
fmt.Fprintf(w, "Hello, world!")
}
}

View File

@ -1,22 +1,35 @@
package server package server
import ( import (
"context"
"fmt" "fmt"
"git.binarythought.com/cdramey/alrm/config" "git.binarythought.com/cdramey/alrm/config"
"net"
"net/http"
"time" "time"
) )
type Server struct { type Server struct {
workers []*worker workers []*worker
cfg *config.Config cfg *config.Config
debuglvl int shutdownc chan bool
debuglvl int
http http.Server
} }
func (srv *Server) Start() { func (srv *Server) Start() (bool, error) {
listen, err := net.Listen("tcp", srv.cfg.Listen)
if err != nil {
return false, err
}
for _, w := range srv.workers { for _, w := range srv.workers {
go w.start() go w.start()
} }
srv.http = http.Server{Handler: srv}
go srv.http.Serve(listen)
t := time.NewTicker(srv.cfg.Interval) t := time.NewTicker(srv.cfg.Interval)
defer t.Stop() defer t.Stop()
for { for {
@ -28,14 +41,26 @@ func (srv *Server) Start() {
for _, w := range srv.workers { for _, w := range srv.workers {
w.wake() w.wake()
} }
case b := <-srv.shutdownc:
srv.http.Shutdown(context.Background())
for _, w := range srv.workers {
w.shutdown()
}
return b, nil
} }
} }
} }
func NewServer(cfg *config.Config, debuglvl int) *Server { func NewServer(cfg *config.Config, debuglvl int) *Server {
srv := &Server{cfg: cfg, debuglvl: debuglvl} srv := &Server{
cfg: cfg,
debuglvl: debuglvl,
shutdownc: make(chan bool, 1),
}
for _, g := range cfg.Groups { for _, g := range cfg.Groups {
srv.workers = append(srv.workers, makeworker(g, debuglvl)) srv.workers = append(
srv.workers, makeworker(g, debuglvl),
)
} }
return srv return srv
} }

View File

@ -53,11 +53,11 @@ func (w *worker) shutdown() {
func makeworker(g *config.Group, d int) *worker { func makeworker(g *config.Group, d int) *worker {
return &worker{ return &worker{
group: g, group: g,
debuglvl: d, debuglvl: d,
// This channel is unbuffered so that checks that take // This channel is unbuffered so that checks that take
// over the set interval don't backlog // over the set interval don't backlog
wakec: make(chan bool), wakec: make(chan bool),
// This channel is buffered because we want it to remember // This channel is buffered because we want it to remember
// an order to shutdown // an order to shutdown
shutdownc: make(chan bool, 1), shutdownc: make(chan bool, 1),