diff --git a/flake.nix b/flake.nix index 59ef2e061..08dedd3b7 100644 --- a/flake.nix +++ b/flake.nix @@ -164,4 +164,4 @@ }); }; } -# nix-direnv cache busting line: sha256-lgWFUDa1hHooieOSE/2L74RHtfkzK2q4W2GiDQOrxGw= +# nix-direnv cache busting line: sha256-N9feTY91Q2WUin3De5NYEy/R1ZyuE5cjx49lc1i3nSQ= diff --git a/flakehashes.json b/flakehashes.json index 5f7e75b1d..4d70c25ad 100644 --- a/flakehashes.json +++ b/flakehashes.json @@ -4,7 +4,7 @@ "sri": "sha256-cY5yryX+p/xtoTv+WZEKFagiIl0OREHnJY1Bk5VpVVc=" }, "vendor": { - "goModSum": "sha256-ep5BPjx4MPaldI71++7vgJPSyftdBqlKciKyx08MOQw=", - "sri": "sha256-lgWFUDa1hHooieOSE/2L74RHtfkzK2q4W2GiDQOrxGw=" + "goModSum": "sha256-/CvlMPHEbBEpHd/fTRfxSYUMLaNdDrMi1d8hvoXoSw0=", + "sri": "sha256-N9feTY91Q2WUin3De5NYEy/R1ZyuE5cjx49lc1i3nSQ=" } } diff --git a/go.mod b/go.mod index 819848d3d..e02fbb9d0 100644 --- a/go.mod +++ b/go.mod @@ -47,8 +47,11 @@ require ( github.com/go4org/plan9netshell v0.0.0-20250324183649-788daa080737 github.com/godbus/dbus/v5 v5.1.1-0.20230522191255-76236955d466 github.com/gokrazy/breakglass v0.0.0-20251229072214-9dbc0478d486 + github.com/gokrazy/firmware v0.0.0-20260522070551-527ce0ed43cf github.com/gokrazy/gokrazy v0.0.0-20260418085648-c38c3134b8a7 github.com/gokrazy/kernel.arm64 v0.0.0-20260403054012-807489e0272a + github.com/gokrazy/kernel.rpi v0.0.0-20251127164438-9778ec0261de + github.com/gokrazy/rpi-eeprom v0.0.0-20260518070910-95f7328a8228 github.com/gokrazy/serial-busybox v0.0.0-20250119153030-ac58ba7574e7 github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 github.com/golang/snappy v0.0.4 diff --git a/go.sum b/go.sum index 253c537ea..3cd0adebd 100644 --- a/go.sum +++ b/go.sum @@ -496,6 +496,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gokrazy/breakglass v0.0.0-20251229072214-9dbc0478d486 h1:QBELQyXGy+eCEcWtvSfslJk3y7nUPZldOwBqIz1tkXc= github.com/gokrazy/breakglass v0.0.0-20251229072214-9dbc0478d486/go.mod h1:PFPkRFcazBmCZKo+sBaGjsWouTtfDvg13nCDm0tFOCA= +github.com/gokrazy/firmware v0.0.0-20260522070551-527ce0ed43cf h1:WRmvIwhtcWJfHnrfpfXWPh3Xq6Lztn0y5l3li+NjaYw= +github.com/gokrazy/firmware v0.0.0-20260522070551-527ce0ed43cf/go.mod h1:x8Lwd/ZFqJTBWUGW7yt/qwgxO8/AHh5KGFYJ4yfH+FE= github.com/gokrazy/gokapi v0.0.0-20250222071133-506fdb322775 h1:f5+2UMRRbr3+e/gdWCBNn48chS/KMMljfbmlSSHfRBA= github.com/gokrazy/gokapi v0.0.0-20250222071133-506fdb322775/go.mod h1:q9mIV8al0wqmqFXJhKiO3SOHkL9/7Q4kIMynqUQWhgU= github.com/gokrazy/gokrazy v0.0.0-20200501080617-f3445e01a904/go.mod h1:pq6rGHqxMRPSaTXaCMzIZy0wLDusAJyoVNyNo05RLs0= @@ -506,6 +508,10 @@ github.com/gokrazy/internal v0.0.0-20251208203110-3c1aa9087c82 h1:4ghNfD9NaZLpFr github.com/gokrazy/internal v0.0.0-20251208203110-3c1aa9087c82/go.mod h1:dQY4EMkD4L5ZjYJ0SPtpgYbV7MIUMCxNIXiOfnZ6jP4= github.com/gokrazy/kernel.arm64 v0.0.0-20260403054012-807489e0272a h1:fa11POmSLo6fkkcqc+RUIyiqGJzBAOHEe/CCHAA/NGc= github.com/gokrazy/kernel.arm64 v0.0.0-20260403054012-807489e0272a/go.mod h1:WWx72LXHEesuJxbopusRfSoKJQ6ffdwkT0DZditdrLo= +github.com/gokrazy/kernel.rpi v0.0.0-20251127164438-9778ec0261de h1:RSLWj1Ska9s4cl+n/bC5LY4s8vLr+tZoO2vMm/wGP64= +github.com/gokrazy/kernel.rpi v0.0.0-20251127164438-9778ec0261de/go.mod h1:p5uBeUWKZVv3KJWWD6s9MpAjPjGJUe2CmKDML+5pm6U= +github.com/gokrazy/rpi-eeprom v0.0.0-20260518070910-95f7328a8228 h1:sLyorzF3zTdEiTvTUpctCIf14tZQFXTfayWBhn9QPG4= +github.com/gokrazy/rpi-eeprom v0.0.0-20260518070910-95f7328a8228/go.mod h1:vabxV1M+i6S3rGuWoFieHxCJW3jlob3rqe0KV82j+0o= github.com/gokrazy/serial-busybox v0.0.0-20250119153030-ac58ba7574e7 h1:gurTGc4sL7Ik+IKZ29rhGgHNZQTXPtEXLw+aM9E+/HE= github.com/gokrazy/serial-busybox v0.0.0-20250119153030-ac58ba7574e7/go.mod h1:OYcG5tSb+QrelmUOO4EZVUFcIHyyZb0QDbEbZFUp1TA= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= diff --git a/gokrazy/gokrazy_test.go b/gokrazy/gokrazy_test.go index 76398d49b..8831bada1 100644 --- a/gokrazy/gokrazy_test.go +++ b/gokrazy/gokrazy_test.go @@ -23,6 +23,78 @@ import ( var runVMTests = flag.Bool("run-vm-tests", false, "run tests that require a VM") +func TestTsappConfigs(t *testing.T) { + tests := []struct { + name string + app string + goarch string + kernel string + firmware string + eeprom string + }{ + { + name: "tsapp", + app: "tsapp", + goarch: "amd64", + kernel: "github.com/tailscale/gokrazy-kernel", + firmware: "github.com/tailscale/gokrazy-kernel", + }, + { + name: "tsapp-vm-arm64", + app: "tsapp-vm.arm64", + goarch: "arm64", + kernel: "github.com/gokrazy/kernel.arm64", + firmware: "github.com/gokrazy/kernel.arm64", + eeprom: "", + }, + { + name: "tsapp-pi-arm64", + app: "tsapp-pi.arm64", + goarch: "arm64", + kernel: "github.com/gokrazy/kernel.rpi", + firmware: "github.com/gokrazy/firmware", + eeprom: "github.com/gokrazy/rpi-eeprom", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cfgBytes, err := os.ReadFile(filepath.Join(tt.app, "config.json")) + if err != nil { + t.Fatalf("reading config.json: %v", err) + } + var cfg struct { + Environment []string + KernelPackage string + FirmwarePackage string + EEPROMPackage *string + } + if err := json.Unmarshal(cfgBytes, &cfg); err != nil { + t.Fatalf("unmarshaling config.json: %v", err) + } + var raw map[string]json.RawMessage + if err := json.Unmarshal(cfgBytes, &raw); err != nil { + t.Fatalf("unmarshaling config.json as map: %v", err) + } + gokCfg := gokrazyConfig{Environment: cfg.Environment} + if got := gokCfg.GOARCH(); got != tt.goarch { + t.Errorf("GOARCH = %q; want %q", got, tt.goarch) + } + if cfg.KernelPackage != tt.kernel { + t.Errorf("KernelPackage = %q; want %q", cfg.KernelPackage, tt.kernel) + } + if cfg.FirmwarePackage != tt.firmware { + t.Errorf("FirmwarePackage = %q; want %q", cfg.FirmwarePackage, tt.firmware) + } + if _, ok := raw["EEPROMPackage"]; tt.goarch == "arm64" && !ok { + t.Error("EEPROMPackage is missing") + } + if cfg.EEPROMPackage != nil && *cfg.EEPROMPackage != tt.eeprom { + t.Errorf("EEPROMPackage = %q; want %q", *cfg.EEPROMPackage, tt.eeprom) + } + }) + } +} + func findKernelPath(t *testing.T) string { t.Helper() goModPath := filepath.Join("..", "go.mod") diff --git a/gokrazy/tsapp-pi.arm64/README.md b/gokrazy/tsapp-pi.arm64/README.md new file mode 100644 index 000000000..68d4f8cda --- /dev/null +++ b/gokrazy/tsapp-pi.arm64/README.md @@ -0,0 +1,4 @@ +# Tailscale Appliance Raspberry Pi arm64 + +This is the Raspberry Pi arm64 variant of the Gokrazy Tailscale Appliance image. +See ../tsapp/README.md for more info. diff --git a/gokrazy/tsapp-pi.arm64/config.json b/gokrazy/tsapp-pi.arm64/config.json new file mode 100644 index 000000000..206bb2f34 --- /dev/null +++ b/gokrazy/tsapp-pi.arm64/config.json @@ -0,0 +1,40 @@ +{ + "Hostname": "tsapp", + "Update": { + "NoPassword": true + }, + "SerialConsole": "ttyS0,115200", + "GokrazyPackages": [ + "github.com/gokrazy/gokrazy/cmd/dhcp", + "github.com/gokrazy/gokrazy/cmd/randomd", + "github.com/gokrazy/gokrazy/cmd/ntp" + ], + "Packages": [ + "github.com/gokrazy/serial-busybox", + "github.com/gokrazy/breakglass", + "tailscale.com/cmd/tailscale", + "tailscale.com/cmd/tailscaled" + ], + "PackageConfig": { + "github.com/gokrazy/breakglass": { + "CommandLineFlags": [ + "-authorized_keys=ec2" + ] + }, + "tailscale.com/cmd/tailscale": { + "ExtraFilePaths": { + "/usr": "usr-dir" + } + } + }, + "Environment": [ + "GOOS=linux", + "GOARCH=arm64" + ], + "KernelPackage": "github.com/gokrazy/kernel.rpi", + "FirmwarePackage": "github.com/gokrazy/firmware", + "EEPROMPackage": "github.com/gokrazy/rpi-eeprom", + "InternalCompatibilityFlags": { + "InitImportPath": "github.com/tailscale/ts-gokrazy/gokrazyinit" + } +} diff --git a/gokrazy/tsapp-pi.arm64/gokrazydeps.go b/gokrazy/tsapp-pi.arm64/gokrazydeps.go new file mode 100644 index 000000000..c548629bb --- /dev/null +++ b/gokrazy/tsapp-pi.arm64/gokrazydeps.go @@ -0,0 +1,20 @@ +// Copyright (c) Tailscale Inc & contributors +// SPDX-License-Identifier: BSD-3-Clause + +//go:build for_go_mod_tidy_only + +package gokrazydeps + +import ( + _ "github.com/gokrazy/breakglass" + _ "github.com/gokrazy/firmware" + _ "github.com/gokrazy/gokrazy/cmd/dhcp" + _ "github.com/gokrazy/gokrazy/cmd/ntp" + _ "github.com/gokrazy/gokrazy/cmd/randomd" + _ "github.com/gokrazy/kernel.rpi" + _ "github.com/gokrazy/rpi-eeprom" + _ "github.com/gokrazy/serial-busybox" + _ "github.com/tailscale/ts-gokrazy/gokrazyinit" + _ "tailscale.com/cmd/tailscale" + _ "tailscale.com/cmd/tailscaled" +) diff --git a/gokrazy/tsapp-pi.arm64/usr-dir.tar b/gokrazy/tsapp-pi.arm64/usr-dir.tar new file mode 100644 index 000000000..6ef6cfbfd Binary files /dev/null and b/gokrazy/tsapp-pi.arm64/usr-dir.tar differ diff --git a/gokrazy/tsapp-vm.arm64/README.md b/gokrazy/tsapp-vm.arm64/README.md new file mode 100644 index 000000000..ca33a8a52 --- /dev/null +++ b/gokrazy/tsapp-vm.arm64/README.md @@ -0,0 +1,4 @@ +# Tailscale Appliance VM arm64 + +This is the arm64 VM variant of the Gokrazy Tailscale Appliance image. +See ../tsapp/README.md for more info. diff --git a/gokrazy/tsapp-vm.arm64/config.json b/gokrazy/tsapp-vm.arm64/config.json new file mode 100644 index 000000000..4cb3df2d8 --- /dev/null +++ b/gokrazy/tsapp-vm.arm64/config.json @@ -0,0 +1,40 @@ +{ + "Hostname": "tsapp", + "Update": { + "NoPassword": true + }, + "SerialConsole": "ttyS0,115200", + "GokrazyPackages": [ + "github.com/gokrazy/gokrazy/cmd/dhcp", + "github.com/gokrazy/gokrazy/cmd/randomd", + "github.com/gokrazy/gokrazy/cmd/ntp" + ], + "Packages": [ + "github.com/gokrazy/serial-busybox", + "github.com/gokrazy/breakglass", + "tailscale.com/cmd/tailscale", + "tailscale.com/cmd/tailscaled" + ], + "PackageConfig": { + "github.com/gokrazy/breakglass": { + "CommandLineFlags": [ + "-authorized_keys=ec2" + ] + }, + "tailscale.com/cmd/tailscale": { + "ExtraFilePaths": { + "/usr": "usr-dir" + } + } + }, + "Environment": [ + "GOOS=linux", + "GOARCH=arm64" + ], + "KernelPackage": "github.com/gokrazy/kernel.arm64", + "FirmwarePackage": "github.com/gokrazy/kernel.arm64", + "EEPROMPackage": "", + "InternalCompatibilityFlags": { + "InitImportPath": "github.com/tailscale/ts-gokrazy/gokrazyinit" + } +} diff --git a/gokrazy/tsapp-vm.arm64/gokrazydeps.go b/gokrazy/tsapp-vm.arm64/gokrazydeps.go new file mode 100644 index 000000000..5911053f0 --- /dev/null +++ b/gokrazy/tsapp-vm.arm64/gokrazydeps.go @@ -0,0 +1,18 @@ +// Copyright (c) Tailscale Inc & contributors +// SPDX-License-Identifier: BSD-3-Clause + +//go:build for_go_mod_tidy_only + +package gokrazydeps + +import ( + _ "github.com/gokrazy/breakglass" + _ "github.com/gokrazy/gokrazy/cmd/dhcp" + _ "github.com/gokrazy/gokrazy/cmd/ntp" + _ "github.com/gokrazy/gokrazy/cmd/randomd" + _ "github.com/gokrazy/kernel.arm64" + _ "github.com/gokrazy/serial-busybox" + _ "github.com/tailscale/ts-gokrazy/gokrazyinit" + _ "tailscale.com/cmd/tailscale" + _ "tailscale.com/cmd/tailscaled" +) diff --git a/gokrazy/tsapp-vm.arm64/usr-dir.tar b/gokrazy/tsapp-vm.arm64/usr-dir.tar new file mode 100644 index 000000000..6ef6cfbfd Binary files /dev/null and b/gokrazy/tsapp-vm.arm64/usr-dir.tar differ diff --git a/shell.nix b/shell.nix index 56b10c5ea..9d9df2311 100644 --- a/shell.nix +++ b/shell.nix @@ -16,4 +16,4 @@ ) { src = ./.; }).shellNix -# nix-direnv cache busting line: sha256-lgWFUDa1hHooieOSE/2L74RHtfkzK2q4W2GiDQOrxGw= +# nix-direnv cache busting line: sha256-N9feTY91Q2WUin3De5NYEy/R1ZyuE5cjx49lc1i3nSQ=