Compare commits

..
5 Commits
Author SHA1 Message Date
sneak 49457a6abf more idiomatic makefile
check / check (push) Successful in 2m9s
2026-11-06 20:29:02 -08:00
sneak fe1fbeb177 Merge pull request 'Milestone: repo standards and macOS support' (#6) from next into main
check / check (push) Successful in 2m6s
Reviewed-on: #6
2026-11-07 05:24:17 +01:00
sneak 5b16fd3310 Merge pull request 'Show UTC as the first header clock instead of hardcoded Los Angeles time' (#19) from header-utc-clock into next
check / check (push) Successful in 2m10s
Reviewed-on: #19
2026-11-07 05:23:53 +01:00
sneak 8746591889 Merge branch 'next' into header-utc-clock
check / check (push) Successful in 2m6s
2026-11-07 05:23:40 +01:00
sneak bbceab0b24 Show UTC as the first header clock instead of hardcoded Los Angeles time
check / check (push) Successful in 2m0s
The header drew the host's local time and then America/Los_Angeles
time, so on a Mac in that zone both clocks read the same and neither
was UTC. The first clock is now UTC and the second the host's local
time, which also drops the hardcoded zone and its load-failure path.
2026-11-06 19:12:41 -08:00
4 changed files with 46 additions and 12 deletions

No files matched your search

+4 -2
View File
@@ -3,7 +3,7 @@
# Target bodies live in script/ (Scripts to Rule Them All); the targets # Target bodies live in script/ (Scripts to Rule Them All); the targets
# below are thin shims that call them. # below are thin shims that call them.
.DEFAULT_GOAL := check .DEFAULT_GOAL := build
VERSION ?= $(shell git describe --tags --always) VERSION ?= $(shell git describe --tags --always)
@@ -37,7 +37,9 @@ cibuild:
hooks: hooks:
@script/install-precommit @script/install-precommit
build: build: ./bin/rtnetmon
./bin/rtnetmon: ./cmd ./internal go.sum go.mod
CGO_ENABLED=0 go build -trimpath -ldflags "-X main.Version=$(VERSION)" \ CGO_ENABLED=0 go build -trimpath -ldflags "-X main.Version=$(VERSION)" \
-o bin/rtnetmon ./cmd/rtnetmon -o bin/rtnetmon ./cmd/rtnetmon
+4
View File
@@ -2,6 +2,7 @@ package monitor
import ( import (
"context" "context"
"time"
"git.eeqj.de/sneak/rtnetmon/internal/starlink" "git.eeqj.de/sneak/rtnetmon/internal/starlink"
) )
@@ -59,6 +60,9 @@ func (m *Monitor) TCPHosts() []string { return m.tcpHosts }
// Interfaces returns the monitored interfaces. // Interfaces returns the monitored interfaces.
func (m *Monitor) Interfaces() []*InterfaceStatus { return m.interfaces } func (m *Monitor) Interfaces() []*InterfaceStatus { return m.interfaces }
// ClockStrings exposes clockStrings for external tests.
func ClockStrings(now time.Time) (string, string) { return clockStrings(now) }
// PingArgs exposes pingArgs for external tests. // PingArgs exposes pingArgs for external tests.
func PingArgs(goos, iface, host string) []string { return pingArgs(goos, iface, host) } func PingArgs(goos, iface, host string) []string { return pingArgs(goos, iface, host) }
+11 -10
View File
@@ -337,6 +337,15 @@ func drawICMPStats(scr tcell.Screen, y int, st *InterfaceStatus) int {
} }
// uiLoop runs the UI event loop. // uiLoop runs the UI event loop.
// clockFormat is the layout of both header clocks.
const clockFormat = time.RFC1123Z
// clockStrings renders the header clocks: UTC first, then the host's local
// time in whatever location now carries.
func clockStrings(now time.Time) (string, string) {
return now.UTC().Format(clockFormat), now.Format(clockFormat)
}
func (m *Monitor) uiLoop(ctx context.Context) { func (m *Monitor) uiLoop(ctx context.Context) {
m.logf("UI loop started") m.logf("UI loop started")
@@ -348,13 +357,6 @@ func (m *Monitor) uiLoop(ctx context.Context) {
m.logf("Screen finalized") m.logf("Screen finalized")
}() }()
pstLoc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
m.logf("Error loading PST location: %v", err)
pstLoc = time.UTC
}
timestampSpinFrame := 0 timestampSpinFrame := 0
lastTimestampSpinUpdate := time.Now() lastTimestampSpinUpdate := time.Now()
@@ -365,8 +367,7 @@ func (m *Monitor) uiLoop(ctx context.Context) {
Put(m.screen, colLeft, rowTopRule, HLine(w), tcell.StyleDefault) Put(m.screen, colLeft, rowTopRule, HLine(w), tcell.StyleDefault)
now := time.Now() now := time.Now()
timeStr := now.Format(time.RFC1123Z) timeStr, localTimeStr := clockStrings(now)
pstTimeStr := now.In(pstLoc).Format(time.RFC1123Z)
if time.Since(lastTimestampSpinUpdate) >= time.Second { if time.Since(lastTimestampSpinUpdate) >= time.Second {
timestampSpinFrame = (timestampSpinFrame + 1) % len(brailleSpins()) timestampSpinFrame = (timestampSpinFrame + 1) % len(brailleSpins())
@@ -380,7 +381,7 @@ func (m *Monitor) uiLoop(ctx context.Context) {
Put(m.screen, colSpinner, rowClock, string(brailleChar)+" ", tcell.StyleDefault) Put(m.screen, colSpinner, rowClock, string(brailleChar)+" ", tcell.StyleDefault)
DrawRainbowText(m.screen, colMeter, rowClock, timeStr, colors) DrawRainbowText(m.screen, colMeter, rowClock, timeStr, colors)
DrawRainbowText(m.screen, colMeter+len(timeStr)+clockGap, rowClock, DrawRainbowText(m.screen, colMeter+len(timeStr)+clockGap, rowClock,
pstTimeStr, colors) localTimeStr, colors)
Put(m.screen, colLeft, rowBottomRule, HLine(w), tcell.StyleDefault) Put(m.screen, colLeft, rowBottomRule, HLine(w), tcell.StyleDefault)
runtime := time.Since(m.startTime).Round(time.Second).String() runtime := time.Since(m.startTime).Round(time.Second).String()
+27
View File
@@ -0,0 +1,27 @@
package monitor_test
import (
"testing"
"time"
"git.eeqj.de/sneak/rtnetmon/internal/monitor"
)
// TestClockStrings checks that the header shows UTC first and the host's
// local time second, so the two differ whenever the host is not on UTC.
func TestClockStrings(t *testing.T) {
t.Parallel()
berlin := time.FixedZone("CET", 3600)
now := time.Date(2026, time.November, 6, 20, 30, 0, 0, berlin)
utc, local := monitor.ClockStrings(now)
if want := "Fri, 06 Nov 2026 19:30:00 +0000"; utc != want {
t.Errorf("utc = %q, want %q", utc, want)
}
if want := "Fri, 06 Nov 2026 20:30:00 +0100"; local != want {
t.Errorf("local = %q, want %q", local, want)
}
}