github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/mdbd/httpd.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "net" 8 "net/http" 9 10 "github.com/Cloud-Foundations/Dominator/lib/html" 11 "github.com/Cloud-Foundations/Dominator/lib/json" 12 "github.com/Cloud-Foundations/Dominator/lib/mdb" 13 ) 14 15 type HtmlWriter interface { 16 WriteHtml(writer io.Writer) 17 } 18 19 type httpServer struct { 20 htmlWriters []HtmlWriter 21 mdb *mdb.Mdb 22 } 23 24 func startHttpServer(portNum uint) (*httpServer, error) { 25 listener, err := net.Listen("tcp", fmt.Sprintf(":%d", portNum)) 26 if err != nil { 27 return nil, err 28 } 29 s := &httpServer{mdb: &mdb.Mdb{}} 30 html.HandleFunc("/", s.statusHandler) 31 html.HandleFunc("/showMdb", s.showMdbHandler) 32 go http.Serve(listener, nil) 33 return s, nil 34 } 35 36 func (s *httpServer) statusHandler(w http.ResponseWriter, req *http.Request) { 37 if req.URL.Path != "/" { 38 http.NotFound(w, req) 39 return 40 } 41 writer := bufio.NewWriter(w) 42 defer writer.Flush() 43 fmt.Fprintln(writer, "<title>MDB daemon status page</title>") 44 fmt.Fprintln(writer, "<body>") 45 fmt.Fprintln(writer, "<center>") 46 fmt.Fprintln(writer, "<h1><b>MDB daemon</b> status page</h1>") 47 fmt.Fprintln(writer, "</center>") 48 html.WriteHeaderWithRequestNoGC(writer, req) 49 fmt.Fprintln(writer, "<h3>") 50 fmt.Fprintf(writer, "Number of machines: <a href=\"showMdb\">%d</a><br>\n", 51 len(s.mdb.Machines)) 52 for _, htmlWriter := range s.htmlWriters { 53 htmlWriter.WriteHtml(writer) 54 } 55 fmt.Fprintln(writer, "</h3>") 56 fmt.Fprintln(writer, "<hr>") 57 html.WriteFooter(writer) 58 fmt.Fprintln(writer, "</body>") 59 } 60 61 func (s *httpServer) AddHtmlWriter(htmlWriter HtmlWriter) { 62 s.htmlWriters = append(s.htmlWriters, htmlWriter) 63 } 64 65 func (s *httpServer) showMdbHandler(w http.ResponseWriter, req *http.Request) { 66 writer := bufio.NewWriter(w) 67 defer writer.Flush() 68 json.WriteWithIndent(writer, " ", s.mdb) 69 } 70 71 func (s *httpServer) UpdateMdb(new *mdb.Mdb) { 72 if new == nil { 73 new = &mdb.Mdb{} 74 } 75 s.mdb = new 76 }