diff --git a/Makefile b/Makefile index 8e7cd5e..c576d32 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,19 @@ -SUDO=GOPATH=$(shell go env GOPATH) sudo --preserve-env=GOPATH +SUDO=GOPATH=$(shell go env GOPATH) sudo --preserve-env=GOPATH --preserve-env=PATH --preserve-env=HOME -PKGS := github.com/rtr7/router7/cmd/... \ - github.com/gokrazy/breakglass \ +PKGS := github.com/gokrazy/breakglass \ github.com/gokrazy/timestamps \ - github.com/stapelberg/zkj-nas-tools/wolgw \ - github.com/gokrazy/gdns + github.com/gokrazy/gdns \ + github.com/gokrazy/serial-busybox \ + github.com/prometheus/node_exporter \ + github.com/gokrazy/fbstatus \ + github.com/gokrazy/iptables \ + github.com/gokrazy/nsenter \ + github.com/gokrazy/podman \ + github.com/greenpau/cni-plugins/cmd/cni-nftables-portmap \ + github.com/greenpau/cni-plugins/cmd/cni-nftables-firewall \ + github.com/gokrazy/syslogd/cmd/gokr-syslogd \ + github.com/gokrazy/stat/cmd/... \ + github.com/rtr7/router7/cmd/... build: mkdir -p result @@ -29,14 +38,13 @@ endif -overwrite_boot=${DIR}/boot.img \ -overwrite_root=${DIR}/root.img \ -overwrite_mbr=${DIR}/mbr.img \ - -serial_console=ttyS0,115200n8 \ + -serial_console=ttyS0,115200 \ -hostname=router7 \ ${PKGS} recover: #test - go install \ - github.com/gokrazy/tools/cmd/gokr-packer@lastet \ - github.com/rtr7/tools/cmd/rtr7-recover@latest + go install github.com/gokrazy/tools/cmd/gokr-packer@latest + go install github.com/rtr7/tools/cmd/rtr7-recover@latest GOARCH=amd64 gokr-packer \ -gokrazy_pkgs=github.com/gokrazy/gokrazy/cmd/ntp,github.com/gokrazy/gokrazy/cmd/randomd \ -kernel_package=github.com/rtr7/kernel \ @@ -47,16 +55,19 @@ recover: #test -serial_console=ttyS0,115200n8 \ -hostname=router7 \ ${PKGS} - ${SUDO} /home/michael/go/bin/rtr7-recover \ - -boot=/tmp/recovery/boot.img \ - -root=/tmp/recovery/root.img + ${SUDO} $(which rtr7-recover) \ + --boot /tmp/recovery/boot.img \ + --root /tmp/recovery/root.img \ + --mbr /tmp/recovery/mbr.img \ + --hostname router7 \ + --interface enp0s31f6 test: # simulate recover (quick, for early for feedback) - go build ${PKGS} github.com/rtr7/tools/cmd/... - go test -count=1 -v -race github.com/rtr7/router7/internal/... + go build -mod=mod ${PKGS} github.com/rtr7/tools/cmd/... + go test -mod=mod -count=1 -v -race github.com/rtr7/router7/internal/... # integration tests - ${SUDO} $(shell go env GOROOT)/bin/go test -count=1 -v -race github.com/rtr7/router7/... + ${SUDO} $(shell go env GOROOT)/bin/go test -buildvcs=false -count=1 -v -race github.com/rtr7/router7/... testdhcp: go test -v -coverprofile=/tmp/cov github.com/rtr7/router7/internal/dhcp4d @@ -70,15 +81,17 @@ strace: (cd /tmp && go test -c router7) && ${SUDO} strace -f -o /tmp/st -s 2048 /tmp/router7.test -test.v #-test.race update: - rtr7-safe-update -build_command='make -C ~/go/src/github.com/rtr7/router7 image DIR=$$GOKR_DIR' + rtr7-safe-update -build_command='make image DIR=$$GOKR_DIR' -# sudo ip link add link enp0s31f6 name macvtap0 type macvtap +# sudo ip link add link enp3s0 name macvtap0 type macvtap # sudo ip link set macvtap0 address 52:55:00:d1:55:03 up +# sudo chown $USER /dev/tap* # # TODO: use veth pairs for router7’s lan0? # e.g. get a network namespace to talk through router7 # ip link add dev veth1 type veth peer name veth2 qemu: + mkdir -p /tmp/router7-qemu GOARCH=amd64 gokr-packer \ -gokrazy_pkgs=github.com/gokrazy/gokrazy/cmd/ntp,github.com/gokrazy/gokrazy/cmd/randomd \ -hostname=qemu-router7 \ @@ -98,6 +111,7 @@ qemu: -device virtio-net-pci,netdev=uplink,mac=52:55:00:d1:55:03 \ -device virtio-net-pci,id=lan,mac=52:55:00:d1:55:04 \ -device i6300esb,id=watchdog0 -watchdog-action reset \ + -bios /usr/share/edk2-ovmf/x64/OVMF_CODE.fd \ -smp 8 \ -machine accel=kvm \ -m 4096 \ diff --git a/cmd/diagd/diagd.go b/cmd/diagd/diagd.go index 0f5da25..29400d6 100644 --- a/cmd/diagd/diagd.go +++ b/cmd/diagd/diagd.go @@ -80,44 +80,53 @@ func firstError(re *diag.EvalResult) string { return "" } +func graph(uplink string, ipv6 bool) *diag.Monitor { + const ip6allrouters = "ff02::2" // no /etc/hosts on gokrazy + graph := diag.Link(uplink). + Then(diag.DHCPv4(). + Then(diag.Ping4Gateway(). + Then(diag.TCP4("www.google.com:80")))) + + if ipv6 { + graph = graph. + Then(diag.DHCPv6(). + Then(diag.TCP6("lan0", "www.google.com:80"))). + Then(diag.RouterAdvertisments(uplink). + Then(diag.Ping6Gateway(). + Then(diag.TCP6(uplink, "www.google.com:80")))). + Then(diag.Ping6("", ip6allrouters+"%"+uplink)) + } + return diag.NewMonitor(graph) +} + func logic() error { var ( ifname = flag.String("interface", "uplink0", "interface name to query") + ipv6 = flag.Bool("ipv6", + true, + "whether to expect IPv6 connectivity in health.json") perm = flag.String("perm", "/perm", "path to replace /perm") ) - const ( - ip6allrouters = "ff02::2" // no /etc/hosts on gokrazy - ) flag.Parse() uplink := *ifname diag.Perm = *perm - m := diag.NewMonitor(diag.Link(uplink). - Then(diag.DHCPv4(). - Then(diag.Ping4Gateway(). - Then(diag.Ping4("google.com"). - Then(diag.TCP4("www.google.com:80"))))). - Then(diag.DHCPv6(). - Then(diag.Ping6("lan0", "google.com"))). - Then(diag.RouterAdvertisments(uplink). - Then(diag.Ping6Gateway(). - Then(diag.Ping6(uplink, "google.com"). - Then(diag.TCP6("www.google.com:80"))))). - Then(diag.Ping6("", ip6allrouters+"%"+uplink))) + mHumanReadable := graph(uplink, true) // for display only + mJSON := graph(uplink, *ipv6) // for updates var mu sync.Mutex http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { mu.Lock() - re := m.Evaluate() + re := mHumanReadable.Evaluate() mu.Unlock() fmt.Fprintf(w, `

Connect a network cable on net0, the port closest to the serial console port:

-

router7 development setup

-

Next, build a router7 image:

-
go get -u github.com/gokrazy/tools/cmd/gokr-packer github.com/rtr7/tools/cmd/...
-go get -u -d github.com/rtr7/router7
-mkdir /tmp/recovery
-GOARCH=amd64 gokr-packer \
-	-hostname=router7 \
-	-overwrite_boot=/tmp/recovery/boot.img \
-	-overwrite_mbr=/tmp/recovery/mbr.img \
-	-overwrite_root=/tmp/recovery/root.img \
-	-eeprom_package= \
-	-kernel_package=github.com/rtr7/kernel \
-	-firmware_package=github.com/rtr7/kernel \
-	-gokrazy_pkgs=github.com/gokrazy/gokrazy/cmd/ntp \
-	-serial_console=ttyS0,115200n8 \
-	github.com/rtr7/router7/cmd/...
-

Run rtr7-recover -boot=/tmp/recovery/boot.img -mbr=/tmp/recovery/mbr.img -root=/tmp/recovery/root.img to:

+

Next, create a router7 gokrazy instance (see gokrazy +quickstart if you’re unfamiliar with gokrazy):

+
go install github.com/gokrazy/tools/cmd/gok@main
+go install github.com/rtr7/tools/cmd/...@latest
+mkdir /tmp/recovery
+gok -i router7 new
+gok -i router7 edit
+

Change the config until you have the following fields set:

+
{
+    "Hostname": "router7",
+    "Packages": [
+        "github.com/gokrazy/fbstatus",
+        "github.com/gokrazy/hello",
+        "github.com/gokrazy/serial-busybox",
+        "github.com/gokrazy/breakglass"
+        "github.com/rtr7/router7/cmd/..."
+    ],
+    "SerialConsole": "ttyS0,115200",
+    "GokrazyPackages": [
+        "github.com/gokrazy/gokrazy/cmd/ntp",
+        "github.com/gokrazy/gokrazy/cmd/randomd"
+    ],
+    "KernelPackage": "github.com/rtr7/kernel",
+    "FirmwarePackage": "github.com/rtr7/kernel",
+    "EEPROMPackage": ""
+}
+

Then, build an image:

+
GOARCH=amd64 gok -i router7 overwrite \
+    --boot /tmp/recovery/boot.img \
+	--mbr /tmp/recovery/mbr.img \
+	--root /tmp/recovery/root.img
+

And serve the image for netboot installation:

+
rtr7-recover \
+    --boot /tmp/recovery/boot.img \
+    --mbr /tmp/recovery/mbr.img \
+    --root /tmp/recovery/root.img
+

Specifically, rtr7-recover: