diff --git a/assets/overview.tmpl b/assets/overview.tmpl index 2d0b6b8..299983a 100644 --- a/assets/overview.tmpl +++ b/assets/overview.tmpl @@ -71,11 +71,19 @@ No permanent storage mounted. To create a filesystem for permanent storage, plug

private network addresses

+

public network addresses

+ + + diff --git a/internal/bundled/GENERATED_bundled.go b/internal/bundled/GENERATED_bundled.go index b1430d9..fb5594f 100644 --- a/internal/bundled/GENERATED_bundled.go +++ b/internal/bundled/GENERATED_bundled.go @@ -9,5 +9,5 @@ var assets = map[string][]byte{ } var assets_0 = []byte("\n\ngokrazy\n\n\n\n\n \n\n
\n") var assets_1 = []byte("\n
\n\n\n\n\n") -var assets_2 = []byte("{{ template \"header\" . }}\n\n
\n
\n\n

services

\n\n\n\n\n\n\n\n{{ range $idx, $svc := .Services }}\n\n\n\n\n{{ end }}\n\n
pathlast log line
\n{{ $svc.Name }}\n{{ if restarting $svc.Started }}\nrestarting\n{{ end }}\n{{ if $svc.Stopped }}\nstopped\n{{ end }}\n\n{{ last $svc.Stdout.Lines $svc.Stderr.Lines }}\n
\n
\n
\n

memory

\n{{ megabytes (index .Meminfo \"MemTotal\") }} total, {{ megabytes (index .Meminfo \"MemAvailable\") }} available
\nresident set size (RSS) by service:\n
\n\n{{ with $rss := initRss }}\n
\n\ninit\n
\n{{ end }}\n\n{{ range $idx, $svc := .Services }}\n{{ with $rss := $svc.RSS }}\n
\n\n{{ baseName $svc.Name }}\n
\n{{ end }}\n{{ end }}\n
\n\nunaccounted\n
\n
\n
\n\n
\n\n\n

storage

\n\n{{ if eq .PermAvail 0 }}\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 /dev/sdb, use mkfs.ext4 /dev/sdb4.\n{{ else }}\n/dev/mmcblk0p4: {{ gigabytes .PermTotal }} total, {{ gigabytes .PermUsed }} used, {{ gigabytes .PermAvail }} avail
\n{{ end }}\n\n

private network addresses

\n\n\n
\n
\n\n{{ template \"footer\" . }}") +var assets_2 = []byte("{{ template \"header\" . }}\n\n
\n
\n\n

services

\n\n\n\n\n\n\n\n{{ range $idx, $svc := .Services }}\n\n\n\n\n{{ end }}\n\n
pathlast log line
\n{{ $svc.Name }}\n{{ if restarting $svc.Started }}\nrestarting\n{{ end }}\n{{ if $svc.Stopped }}\nstopped\n{{ end }}\n\n{{ last $svc.Stdout.Lines $svc.Stderr.Lines }}\n
\n
\n
\n

memory

\n{{ megabytes (index .Meminfo \"MemTotal\") }} total, {{ megabytes (index .Meminfo \"MemAvailable\") }} available
\nresident set size (RSS) by service:\n
\n\n{{ with $rss := initRss }}\n
\n\ninit\n
\n{{ end }}\n\n{{ range $idx, $svc := .Services }}\n{{ with $rss := $svc.RSS }}\n
\n\n{{ baseName $svc.Name }}\n
\n{{ end }}\n{{ end }}\n
\n\nunaccounted\n
\n
\n
\n\n
\n\n\n

storage

\n\n{{ if eq .PermAvail 0 }}\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 /dev/sdb, use mkfs.ext4 /dev/sdb4.\n{{ else }}\n/dev/mmcblk0p4: {{ gigabytes .PermTotal }} total, {{ gigabytes .PermUsed }} used, {{ gigabytes .PermAvail }} avail
\n{{ end }}\n\n

private network addresses

\n\n\n

public network addresses

\n\n\n\n
\n
\n\n{{ template \"footer\" . }}") var assets_3 = []byte("{{ template \"header\" . }}\n\n
\n
\n\n\n\n\n\n\n\n\n\n\n\n
NameStartedActions
{{ .Service.Name }}{{ .Service.Started }}
\n\n

stdout

\n
\n  {{ range $idx, $line := .Service.Stdout.Lines -}}\n    {{ $line }}\n  {{ end }}\n  
\n\n

stderr

\n
\n  {{ range $idx, $line := .Service.Stderr.Lines -}}\n    {{ $line }}\n  {{ end }}\n  
\n
\n
\n\n{{ template \"footer\" . }}") diff --git a/listeners.go b/listeners.go index e9f00a6..faf9a56 100644 --- a/listeners.go +++ b/listeners.go @@ -51,10 +51,7 @@ func isPrivate(ipaddr net.IP) bool { return false } -// PrivateInterfaceAddrs returns all private (as per RFC1918, RFC4193, -// RFC3330, RFC3513, RFC3927, RFC4291) host addresses of all active -// interfaces, suitable to be passed to net.Listen. -func PrivateInterfaceAddrs() ([]string, error) { +func interfaceAddrs(keep func(net.IP) bool) ([]string, error) { ifaces, err := net.Interfaces() if err != nil { return nil, err @@ -76,7 +73,7 @@ func PrivateInterfaceAddrs() ([]string, error) { return nil, err } - if !isPrivate(ipaddr) { + if !keep(ipaddr) { continue } @@ -90,6 +87,24 @@ func PrivateInterfaceAddrs() ([]string, error) { return hosts, nil } +// PrivateInterfaceAddrs returns all private (as per RFC1918, RFC4193, +// RFC3330, RFC3513, RFC3927, RFC4291) host addresses of all active +// interfaces, suitable to be passed to net.JoinHostPort. +func PrivateInterfaceAddrs() ([]string, error) { + return interfaceAddrs(func(addr net.IP) bool { + return isPrivate(addr) + }) +} + +// PublicInterfaceAddrs returns all public (excluding RFC1918, RFC4193, +// RFC3330, RFC3513, RFC3927, RFC4291) host addresses of all active +// interfaces, suitable to be passed to net.JoinHostPort. +func PublicInterfaceAddrs() ([]string, error) { + return interfaceAddrs(func(addr net.IP) bool { + return !isPrivate(addr) + }) +} + var ( listeners = make(map[string]*http.Server) listenersMu sync.Mutex diff --git a/status.go b/status.go index e105fb4..2decb33 100644 --- a/status.go +++ b/status.go @@ -124,9 +124,13 @@ func initStatus(services []*service) { if err := unix.Statfs("/perm", &st); err != nil { log.Printf("could not stat /perm: %v", err) } - hosts, err := PrivateInterfaceAddrs() + privateAddrs, err := PrivateInterfaceAddrs() if err != nil { - log.Printf("could not get addrs: %v", err) + log.Printf("could not get private addrs: %v", err) + } + publicAddrs, err := PublicInterfaceAddrs() + if err != nil { + log.Printf("could not get public addrs: %v", err) } var buf bytes.Buffer if err := overviewTmpl.Execute(&buf, struct { @@ -134,7 +138,8 @@ func initStatus(services []*service) { PermUsed int64 PermAvail int64 PermTotal int64 - Hosts []string + PrivateAddrs []string + PublicAddrs []string BuildTimestamp string Meminfo map[string]int64 Hostname string @@ -143,7 +148,8 @@ func initStatus(services []*service) { PermUsed: int64(st.Bsize) * int64(st.Blocks-st.Bfree), PermAvail: int64(st.Bsize) * int64(st.Bavail), PermTotal: int64(st.Bsize) * int64(st.Blocks), - Hosts: hosts, + PrivateAddrs: privateAddrs, + PublicAddrs: publicAddrs, BuildTimestamp: buildTimestamp, Meminfo: parseMeminfo(), Hostname: hostname,