github.com/Cloud-Foundations/Dominator@v0.3.4/hypervisor/dhcpd/html.go (about) 1 package dhcpd 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "net/http" 8 "sort" 9 "time" 10 11 "github.com/Cloud-Foundations/Dominator/lib/html" 12 "github.com/Cloud-Foundations/Dominator/lib/verstr" 13 ) 14 15 func (s *DhcpServer) writeHtml(writer io.Writer) { 16 fmt.Fprintln(writer, 17 `DHCP server <a href="showDhcpStatus">status</a><br>`) 18 } 19 20 func (s *DhcpServer) showDhcpStatusHandler(w http.ResponseWriter, 21 req *http.Request) { 22 writer := bufio.NewWriter(w) 23 defer writer.Flush() 24 fmt.Fprintln(writer, "<title>hypervisor DHCP server status page</title>") 25 fmt.Fprintln(writer, `<style> 26 table, th, td { 27 border-collapse: collapse; 28 } 29 </style>`) 30 fmt.Fprintln(writer, "<body>") 31 fmt.Fprintln(writer, "<center>") 32 fmt.Fprintln(writer, "<h1>hypervisor DHCP server status page</h1>") 33 fmt.Fprintln(writer, "</center>") 34 s.writeDashboard(writer) 35 fmt.Fprintln(writer, "<hr>") 36 html.WriteFooter(writer) 37 fmt.Fprintln(writer, "</body>") 38 } 39 40 func (s *DhcpServer) writeDashboard(writer io.Writer) { 41 s.mutex.RLock() 42 defer s.mutex.RUnlock() 43 fmt.Fprintln(writer, "<b>Interfaces</b><br>") 44 fmt.Fprintln(writer, `<table border="1">`) 45 tw, _ := html.NewTableWriter(writer, true, "Interface", "IPs") 46 for interfaceName, IPs := range s.interfaceIPs { 47 tw.WriteRow("", "", interfaceName, fmt.Sprintf("%v", IPs)) 48 } 49 tw.Close() 50 fmt.Fprintln(writer, "<br>") 51 52 fmt.Fprintln(writer, "<b>Route Table</b><br>") 53 fmt.Fprintln(writer, `<table border="1">`) 54 tw, _ = html.NewTableWriter(writer, true, 55 "Interface", "Base", "Broadcast", "Gateway", "Mask") 56 for interfaceName, entry := range s.routeTable { 57 tw.WriteRow("", "", 58 interfaceName, entry.BaseAddr.String(), 59 entry.BroadcastAddr.String(), 60 entry.GatewayAddr.String(), entry.Mask.String()) 61 } 62 tw.Close() 63 fmt.Fprintln(writer, "<br>") 64 65 fmt.Fprintln(writer, "<b>Static leases</b><br>") 66 fmt.Fprintln(writer, `<table border="1">`) 67 tw, _ = html.NewTableWriter(writer, true, 68 "MAC", "IP", "Hostname", "SubnetID") 69 staticLeases := make([]leaseType, 0, len(s.staticLeases)) 70 for _, lease := range s.staticLeases { 71 staticLeases = append(staticLeases, lease) 72 } 73 sort.Slice(staticLeases, func(i, j int) bool { 74 return verstr.Less(staticLeases[i].Address.IpAddress.String(), 75 staticLeases[j].Address.IpAddress.String()) 76 }) 77 for _, lease := range staticLeases { 78 tw.WriteRow("", "", lease.MacAddress, lease.IpAddress.String(), 79 lease.hostname, lease.subnet.Id) 80 } 81 tw.Close() 82 fmt.Fprintln(writer, "<br>") 83 84 fmt.Fprintln(writer, "<b>Dynamic leases</b><br>") 85 fmt.Fprintln(writer, `<table border="1">`) 86 tw, _ = html.NewTableWriter(writer, true, 87 "MAC", "IP", "Client Hostname", "SubnetID", "Expires") 88 dynamicLeases := make([]*leaseType, 0, len(s.dynamicLeases)) 89 for _, lease := range s.dynamicLeases { 90 dynamicLeases = append(dynamicLeases, lease) 91 } 92 sort.Slice(dynamicLeases, func(i, j int) bool { 93 return verstr.Less(dynamicLeases[i].Address.IpAddress.String(), 94 dynamicLeases[j].Address.IpAddress.String()) 95 }) 96 for _, lease := range dynamicLeases { 97 var subnetId string 98 if lease.subnet != nil { 99 subnetId = lease.subnet.Id 100 } 101 tw.WriteRow("", "", lease.MacAddress, lease.IpAddress.String(), 102 lease.clientHostname, subnetId, 103 lease.expires.Round(time.Second).String()) 104 } 105 tw.Close() 106 fmt.Fprintln(writer, "<br>") 107 }