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  }