forked from boyska/circolog
add control socket (HTTP server)
also there is some refactoring on circologd: connection handling, closing, etc. Not as much as needed, though: shutdown is still unclean, and websocket clean shutdown is not tested
This commit is contained in:
parent
515e910683
commit
1b08df0ce0
2 changed files with 56 additions and 8 deletions
26
cmd/circologd/http_ctl.go
Normal file
26
cmd/circologd/http_ctl.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"git.lattuga.net/boyska/circolog"
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
)
|
||||||
|
|
||||||
|
func setupHTTPCtl(hub circolog.Hub) *mux.Router {
|
||||||
|
mux := mux.NewRouter()
|
||||||
|
mux.HandleFunc("/pause/toggle", togglePause(hub)).Methods("POST")
|
||||||
|
return mux
|
||||||
|
}
|
||||||
|
|
||||||
|
func togglePause(hub circolog.Hub) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
hub.Commands <- circolog.HubFullCommand{Command: circolog.CommandPauseToggle}
|
||||||
|
resp := <-hub.Responses
|
||||||
|
active := resp.Value.(bool)
|
||||||
|
w.Header().Set("content-type", "application/json")
|
||||||
|
enc := json.NewEncoder(w)
|
||||||
|
enc.Encode(map[string]interface{}{"paused": !active})
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,7 +16,7 @@ import (
|
||||||
|
|
||||||
func cleanSocket(socket string) {
|
func cleanSocket(socket string) {
|
||||||
if err := os.Remove(socket); err != nil {
|
if err := os.Remove(socket); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, socket, ":", err)
|
fmt.Fprintln(os.Stderr, "Error cleaning", socket, ":", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ func main() {
|
||||||
syslogAddr := flag.String("syslog-addr", "127.0.0.1:9514", "Address:port where to listen for syslog messages")
|
syslogAddr := flag.String("syslog-addr", "127.0.0.1:9514", "Address:port where to listen for syslog messages")
|
||||||
queryAddr := flag.String("query-addr", "127.0.0.1:9080", "Address:port where to bind the query service")
|
queryAddr := flag.String("query-addr", "127.0.0.1:9080", "Address:port where to bind the query service")
|
||||||
querySocket := flag.String("query-socket", "", "Path to a unix domain socket for the HTTP server; recommended for security reasons!")
|
querySocket := flag.String("query-socket", "", "Path to a unix domain socket for the HTTP server; recommended for security reasons!")
|
||||||
|
ctlSocket := flag.String("ctl-socket", "/tmp/circologd-ctl.sock", "Path to a unix domain socket for the control server; leave empty to disable")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
interrupt := make(chan os.Signal, 1)
|
interrupt := make(chan os.Signal, 1)
|
||||||
|
@ -59,7 +60,7 @@ func main() {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
httpServer := http.Server{Handler: setupHTTP(hub)}
|
httpQueryServer := http.Server{Handler: setupHTTP(hub)}
|
||||||
if *querySocket != "" {
|
if *querySocket != "" {
|
||||||
fmt.Printf("Binding address `%s` [http]\n", *querySocket)
|
fmt.Printf("Binding address `%s` [http]\n", *querySocket)
|
||||||
unixListener, err := net.Listen("unix", *querySocket)
|
unixListener, err := net.Listen("unix", *querySocket)
|
||||||
|
@ -69,21 +70,39 @@ func main() {
|
||||||
}
|
}
|
||||||
defer cleanSocket(*querySocket)
|
defer cleanSocket(*querySocket)
|
||||||
go func() {
|
go func() {
|
||||||
if err := httpServer.Serve(unixListener); err != nil {
|
if err := httpQueryServer.Serve(unixListener); err != nil && err != http.ErrServerClosed {
|
||||||
fmt.Fprintln(os.Stderr, "error binding:", err)
|
fmt.Fprintln(os.Stderr, "error binding", *querySocket, ":", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
} else {
|
} else {
|
||||||
httpServer.Addr = *queryAddr
|
httpQueryServer.Addr = *queryAddr
|
||||||
fmt.Printf("Binding address `%s` [http]\n", *queryAddr)
|
fmt.Printf("Binding address `%s` [http]\n", *queryAddr)
|
||||||
go func() {
|
go func() {
|
||||||
err := httpServer.ListenAndServe()
|
err := httpQueryServer.ListenAndServe()
|
||||||
|
if err != nil && err != http.ErrServerClosed {
|
||||||
|
fmt.Fprintln(os.Stderr, "error binding", *queryAddr, ":", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
httpCtlServer := http.Server{Handler: setupHTTPCtl(hub)}
|
||||||
|
if *ctlSocket != "" {
|
||||||
|
fmt.Printf("Binding address `%s` [http]\n", *ctlSocket)
|
||||||
|
unixListener, err := net.Listen("unix", *ctlSocket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, "Error binding HTTP unix domain socket", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer cleanSocket(*ctlSocket)
|
||||||
|
go func() {
|
||||||
|
if err := httpCtlServer.Serve(unixListener); err != nil && err != http.ErrServerClosed {
|
||||||
fmt.Fprintln(os.Stderr, "error binding:", err)
|
fmt.Fprintln(os.Stderr, "error binding:", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: now we are ready
|
// TODO: now we are ready
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case sig := <-interrupt:
|
case sig := <-interrupt:
|
||||||
|
@ -104,9 +123,12 @@ func main() {
|
||||||
if sig == syscall.SIGTERM || sig == syscall.SIGINT {
|
if sig == syscall.SIGTERM || sig == syscall.SIGINT {
|
||||||
log.Println("Quitting because of signal", sig)
|
log.Println("Quitting because of signal", sig)
|
||||||
server.Kill()
|
server.Kill()
|
||||||
if err := httpServer.Close(); err != nil {
|
if err := httpQueryServer.Shutdown(nil); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "Error closing http server:", err)
|
fmt.Fprintln(os.Stderr, "Error closing http server:", err)
|
||||||
}
|
}
|
||||||
|
if err := httpCtlServer.Shutdown(nil); err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, "Error closing control server:", err)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue