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  }