server now opens a web server on the specified addr/port
This commit is contained in:
parent
8b438b6f3e
commit
cd7bcd5d55
24
main.go
24
main.go
@ -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
19
server/http.go
Normal 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!")
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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),
|
||||||
|
Loading…
Reference in New Issue
Block a user