Add kernel information to web UI header (#67)
Signed-off-by: Matt Layher <mdlayher@gmail.com>
This commit is contained in:
parent
6739b59028
commit
a4c823dc2b
@ -52,6 +52,10 @@ table {
|
||||
<th>host</th>
|
||||
<td>{{ .Hostname }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>kernel</th>
|
||||
<td>{{ .Kernel }}</td>
|
||||
</tr>
|
||||
{{ if (ne .Model "") }}
|
||||
<tr>
|
||||
<th>model</th>
|
||||
|
@ -12,7 +12,7 @@ var assets = map[string][]byte{
|
||||
"assets/bootstrap-table-1.11.0.min.js": assets_7,
|
||||
"assets/jquery-3.1.1.min.js": assets_8,
|
||||
}
|
||||
var assets_0 = []byte("<!DOCTYPE html>\n<html lang=\"en\">\n<title>{{ .Hostname }} — gokrazy</title>\n<link rel=\"stylesheet\" href=\"/bootstrap-3.3.7.min.css\" />\n<link rel=\"stylesheet\" href=\"/bootstrap-table-1.11.0.min.css\" />\n<style type=\"text/css\">\n.progress-bar:nth-child(5n) {\n background-color: #337ab7;\n}\n.progress-bar:nth-child(5n+1) {\n background-color: #5cb85c;\n}\n.progress-bar:nth-child(5n+2) {\n background-color: #5bc0de;\n}\n.progress-bar:nth-child(5n+3) {\n background-color: #f0ad4e;\n}\n.progress-bar:nth-child(5n+4) {\n background-color: #d9534f;\n}\n.lastlog {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\ntable {\n table-layout: fixed;\n}\n</style>\n\n <nav class=\"navbar navbar-default\">\n <div class=\"container-fluid\">\n <!-- Brand and toggle get grouped for better mobile display -->\n <div class=\"navbar-header\">\n <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#navbar-collapse-1\" aria-expanded=\"false\">\n <span class=\"sr-only\">Toggle navigation</span>\n <span class=\"icon-bar\"></span>\n <span class=\"icon-bar\"></span>\n <span class=\"icon-bar\"></span>\n </button>\n <p style=\"width: 50ex; margin-top: 0.25em; font-size: 18px\"><a href=\"/\">gokrazy</a><br>\n <small style=\"font-size: 11px\" class=\"text-muted\">version {{ .BuildTimestamp }}</small></p>\n </div>\n\n <div class=\"collapse navbar-collapse\" id=\"navbar-collapse-1\">\n <ul class=\"nav navbar-nav\">\n </ul>\n\n <table class=\"navbar-text navbar-right\" style=\"border-spacing: 10px 0; border-collapse: separate\">\n <tr>\n <th>host</th>\n <td>{{ .Hostname }}</td>\n </tr>\n {{ if (ne .Model \"\") }}\n <tr>\n <th>model</th>\n <td>{{ .Model }}</td>\n </tr>\n {{ end }}\n {{ if .EEPROM }}\n <tr>\n <th>EEPROM<br>(SHA256)</th>\n <td>{{ shortenSHA256 .EEPROM.PieepromSHA256 }}<br>{{ shortenSHA256 .EEPROM.VL805SHA256 }}</td>\n </tr>\n {{ end }}\n </table>\n\n </div><!-- /.navbar-collapse -->\n </div><!-- /.container-fluid -->\n </nav>\n\n <div class=\"container\">\n")
|
||||
var assets_0 = []byte("<!DOCTYPE html>\n<html lang=\"en\">\n<title>{{ .Hostname }} — gokrazy</title>\n<link rel=\"stylesheet\" href=\"/bootstrap-3.3.7.min.css\" />\n<link rel=\"stylesheet\" href=\"/bootstrap-table-1.11.0.min.css\" />\n<style type=\"text/css\">\n.progress-bar:nth-child(5n) {\n background-color: #337ab7;\n}\n.progress-bar:nth-child(5n+1) {\n background-color: #5cb85c;\n}\n.progress-bar:nth-child(5n+2) {\n background-color: #5bc0de;\n}\n.progress-bar:nth-child(5n+3) {\n background-color: #f0ad4e;\n}\n.progress-bar:nth-child(5n+4) {\n background-color: #d9534f;\n}\n.lastlog {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\ntable {\n table-layout: fixed;\n}\n</style>\n\n <nav class=\"navbar navbar-default\">\n <div class=\"container-fluid\">\n <!-- Brand and toggle get grouped for better mobile display -->\n <div class=\"navbar-header\">\n <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#navbar-collapse-1\" aria-expanded=\"false\">\n <span class=\"sr-only\">Toggle navigation</span>\n <span class=\"icon-bar\"></span>\n <span class=\"icon-bar\"></span>\n <span class=\"icon-bar\"></span>\n </button>\n <p style=\"width: 50ex; margin-top: 0.25em; font-size: 18px\"><a href=\"/\">gokrazy</a><br>\n <small style=\"font-size: 11px\" class=\"text-muted\">version {{ .BuildTimestamp }}</small></p>\n </div>\n\n <div class=\"collapse navbar-collapse\" id=\"navbar-collapse-1\">\n <ul class=\"nav navbar-nav\">\n </ul>\n\n <table class=\"navbar-text navbar-right\" style=\"border-spacing: 10px 0; border-collapse: separate\">\n <tr>\n <th>host</th>\n <td>{{ .Hostname }}</td>\n </tr>\n <tr>\n <th>kernel</th>\n <td>{{ .Kernel }}</td>\n </tr>\n {{ if (ne .Model \"\") }}\n <tr>\n <th>model</th>\n <td>{{ .Model }}</td>\n </tr>\n {{ end }}\n {{ if .EEPROM }}\n <tr>\n <th>EEPROM<br>(SHA256)</th>\n <td>{{ shortenSHA256 .EEPROM.PieepromSHA256 }}<br>{{ shortenSHA256 .EEPROM.VL805SHA256 }}</td>\n </tr>\n {{ end }}\n </table>\n\n </div><!-- /.navbar-collapse -->\n </div><!-- /.container-fluid -->\n </nav>\n\n <div class=\"container\">\n")
|
||||
var assets_1 = []byte("\n</div>\n\n<script src=\"/jquery-3.1.1.min.js\"></script>\n<script src=\"/bootstrap-table-1.11.0.min.js\"></script>\n\n</html>\n")
|
||||
var assets_2 = []byte("{{ template \"header\" . }}\n\n<div class=\"row\">\n<div class=\"col-md-12\">\n\n<h1>services</h1>\n\n<table class=\"table\">\n<tbody><tr>\n<th width=\"20%\">path</th>\n<th width=\"80%\">last log line</th>\n</tr>\n\n{{ range $idx, $svc := .Services }}\n<tr>\n<td>\n<a href=\"/status?path={{ $svc.Name }}\">{{ $svc.Name }}</a>\n{{ if restarting $svc.Started }}\n<span class=\"label label-danger\">restarting</span>\n{{ end }}\n{{ if $svc.Stopped }}\n<span class=\"label label-warning\">stopped</span>\n{{ end }}\n</td>\n<td class=\"lastlog\">\n{{ last $svc.Stdout.Lines $svc.Stderr.Lines }}\n</td>\n</tr>\n{{ end }}\n\n</table>\n</div> \n<div class=\"col-md-12\">\n<h2>memory</h2>\n{{ megabytes (index .Meminfo \"MemTotal\") }} total, {{ megabytes (index .Meminfo \"MemAvailable\") }} available<br>\n<strong>resident set size (RSS) by service</strong>:\n<div class=\"progress\">\n\n{{ with $rss := initRss }}\n<div class=\"progress-bar\" style=\"width: {{ rssPercentage $.Meminfo $rss }}%\" title=\"init uses {{ megabytes $rss }} RSS\">\n<span class=\"sr-only\"></span>\ninit\n</div>\n{{ end }}\n\n{{ range $idx, $svc := .Services }}\n{{ with $rss := $svc.RSS }}\n<div class=\"progress-bar\" style=\"width: {{ rssPercentage $.Meminfo $rss }}%\" title=\"{{ $svc.Name }} uses {{ megabytes $rss }} RSS\">\n<span class=\"sr-only\"></span>\n{{ baseName $svc.Name }}\n</div>\n{{ end }}\n{{ end }}\n<div class=\"progress-bar\" style=\"width: 100%; overflow:initial; float: none\" title=\"memory usage outside of gokrazy services\">\n<span class=\"sr-only\"></span>\nunaccounted\n</div>\n</div>\n</div>\n\n<div class=\"col-md-12\">\n\n\n<h2>storage</h2>\n\n{{ if eq .PermAvail 0 }}\n\n{{ if ne .PARTUUID \"\" }}\nNo permanent storage mounted. To create a filesystem for permanent storage, plug the SD card into a Linux computer and use <code>mkfs.ext4 /dev/disk/by-partuuid/{{ .PARTUUID }}-04</code>.\n{{ else }}\nNo permanent storage mounted. To create a filesystem for permanent storage, plug the SD card into a Linux computer and, if your SD card is <code>/dev/sdb</code>, use <code>mkfs.ext4 /dev/sdb4</code>.\n{{ end }}\n\n{{ else }}\n<strong>{{ .PermDev }}</strong>: {{ gigabytes .PermTotal }} total, {{ gigabytes .PermUsed }} used, {{ gigabytes .PermAvail }} avail<br>\n{{ end }}\n\n<h2>private network addresses</h2>\n<ul>\n{{ range $idx, $addr := .PrivateAddrs }}\n<li>{{ $addr }}</li>\n{{ end }}\n</ul>\n\n<h2>public network addresses</h2>\n<ul>\n{{ range $idx, $addr := .PublicAddrs }}\n<li>{{ $addr }}</li>\n{{ end }}\n</ul>\n\n\n</div>\n</div>\n\n{{ template \"footer\" . }}\n")
|
||||
var assets_3 = []byte("{{ template \"header\" . }}\n\n<div class=\"row\">\n<div class=\"col-md-12\">\n<table>\n<tr>\n<th>Name</th>\n<th>Started</th>\n<th>Actions</th>\n</tr>\n<tr>\n<td><a href=\"#{{ .Service.Name }}\">{{ .Service.Name }}</a></td>\n<td>{{ .Service.Started }}</td>\n<td>\n <form method=\"POST\" action=\"/restart\">\n <input type=\"hidden\" name=\"xsrftoken\" value=\"{{ .XsrfToken }}\">\n <input type=\"hidden\" name=\"path\" value=\"{{ .Service.Name }}\">\n <input type=\"submit\" value=\"restart\">\n </form>\n <form method=\"POST\" action=\"/stop\">\n <input type=\"hidden\" name=\"xsrftoken\" value=\"{{ .XsrfToken }}\">\n <input type=\"hidden\" name=\"path\" value=\"{{ .Service.Name }}\">\n <input type=\"submit\" value=\"stop\">\n </form></td>\n</tr>\n</table>\n\n <h3>module info</h3>\n <pre>{{ .Service.ModuleInfo }}</pre>\n\n <h3>stdout</h3>\n <pre>\n {{ range $idx, $line := .Service.Stdout.Lines -}}\n {{ $line }}\n {{ end }}\n </pre>\n\n <h3>stderr</h3>\n <pre>\n {{ range $idx, $line := .Service.Stderr.Lines -}}\n {{ $line }}\n {{ end }}\n </pre>\n</div>\n</div>\n\n{{ template \"footer\" . }}\n")
|
||||
|
25
status.go
25
status.go
@ -151,6 +151,21 @@ func lastInstalledEepromVersion() (*eepromVersion, error) {
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func parseUtsname(u unix.Utsname) string {
|
||||
if u == (unix.Utsname{}) {
|
||||
// Empty utsname, no info to parse.
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
str := func(b [65]byte) string {
|
||||
// Trim all trailing NULL bytes.
|
||||
return string(bytes.TrimRight(b[:], "\x00"))
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%s %s (%s)",
|
||||
str(u.Sysname), str(u.Release), str(u.Machine))
|
||||
}
|
||||
|
||||
func initStatus(services []*service) {
|
||||
model := Model()
|
||||
|
||||
@ -159,6 +174,12 @@ func initStatus(services []*service) {
|
||||
log.Printf("getting EEPROM version: %v", err)
|
||||
}
|
||||
|
||||
var uname unix.Utsname
|
||||
if err := unix.Uname(&uname); err != nil {
|
||||
log.Printf("getting uname: %v", err)
|
||||
}
|
||||
kernel := parseUtsname(uname)
|
||||
|
||||
commonTmpls := template.New("root").Funcs(map[string]interface{}{
|
||||
"shortenSHA256": func(hash string) string {
|
||||
if len(hash) > 10 {
|
||||
@ -251,6 +272,7 @@ func initStatus(services []*service) {
|
||||
Model string
|
||||
XsrfToken int32
|
||||
EEPROM *eepromVersion
|
||||
Kernel string
|
||||
}{
|
||||
Service: svc,
|
||||
BuildTimestamp: buildTimestamp,
|
||||
@ -258,6 +280,7 @@ func initStatus(services []*service) {
|
||||
Model: model,
|
||||
XsrfToken: token,
|
||||
EEPROM: lastInstalledEepromVersion,
|
||||
Kernel: kernel,
|
||||
}); err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
@ -301,6 +324,7 @@ func initStatus(services []*service) {
|
||||
Model string
|
||||
PARTUUID string
|
||||
EEPROM *eepromVersion
|
||||
Kernel string
|
||||
}{
|
||||
Services: services,
|
||||
PermDev: rootdev.Partition(rootdev.Perm),
|
||||
@ -315,6 +339,7 @@ func initStatus(services []*service) {
|
||||
Model: model,
|
||||
PARTUUID: rootdev.PARTUUID(),
|
||||
EEPROM: lastInstalledEepromVersion,
|
||||
Kernel: kernel,
|
||||
}); err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
|
Loading…
x
Reference in New Issue
Block a user