diff --git a/.nixos-test-history b/.nixos-test-history new file mode 100644 index 0000000..f629f73 --- /dev/null +++ b/.nixos-test-history @@ -0,0 +1,66 @@ + +# 2026-07-03 15:16:59.761793 ++start_all() + +# 2026-07-03 15:59:47.059616 ++start_all + +# 2026-07-03 15:59:50.141067 ++start_all() + +# 2026-07-03 16:43:20.774527 ++print(peer1.execute("cat /var/run/atalkd/atalkd")) + +# 2026-07-03 16:44:26.221605 ++print(peer1.execute("journalctl -u atalkd.service")) + +# 2026-07-03 16:44:42.191918 ++print(peer1.execute("journalctl -u atalkd.service")[0]) + +# 2026-07-03 16:44:45.978651 ++print(peer1.execute("journalctl -u atalkd.service")[1]) + +# 2026-07-03 17:51:11.040778 ++start_all() + +# 2026-07-06 17:44:27.118611 ++print(peer1.execute("ip a")[1]) + +# 2026-07-06 17:45:01.863872 ++print(peer1.execute("cat /etc/systemd/network/10-apl-vxlan-peer2.netdev")[1]) + +# 2026-07-07 09:34:38.065278 ++start_all() + +# 2026-07-07 09:35:55.775140 ++print(peer1.execute("systemctl status systemd-networkd")[1]) + +# 2026-07-07 09:37:26.188445 ++print(peer1.execute("networkctl list")[1]) + +# 2026-07-07 09:42:08.366386 ++print(peer1.execute("ls -al /etc/systemd/network")[1]) + +# 2026-07-07 09:48:06.711410 ++print(peer1.execute("cat -A /etc/static/systemd/network/10-apl-vxlan-peer2.netdev")[1]) + +# 2026-07-07 09:49:18.464752 ++print(peer1.execute("cat /etc/static/systemd/network/10-apl-vxlan-peer2.network")[1]) + +# 2026-07-07 09:59:03.756589 ++start_all() + +# 2026-07-07 10:08:30.763297 ++print(peer1.execute("lsmod | grep vxlan")[1]) + +# 2026-07-07 10:25:48.657742 ++start_all() + +# 2026-07-07 14:39:33.295864 ++print(peer1.execute("cat /etc/systemd/network/10-apl-vxlan-peer2.netdev")[1]) + +# 2026-07-07 14:39:37.548180 ++print(peer1.execute("cat /etc/systemd/network/10-apl-vxlan-peer3.netdev")[1]) + +# 2026-07-07 15:13:37.987439 ++start_all() diff --git a/inventories/default.nix b/inventories/default.nix index 26944b6..1ec68f4 100644 --- a/inventories/default.nix +++ b/inventories/default.nix @@ -442,6 +442,22 @@ }; }; }; + + apple-network = { + module = { + name = "apple-network"; + input = "self"; + }; + roles.peer.machines = { + rigel = { + settings.vx_address = "169.254.0.1/24"; + }; + vega = { + settings.vx_address = "169.254.0.2/24"; + }; + sirius.settings.vx_address = "169.254.0.3/24"; + }; + }; }; }; }; diff --git a/modules/clan/apple-network/README.md b/modules/clan/apple-network/README.md new file mode 100644 index 0000000..e69de29 diff --git a/modules/clan/apple-network/default.nix b/modules/clan/apple-network/default.nix new file mode 100644 index 0000000..300a005 --- /dev/null +++ b/modules/clan/apple-network/default.nix @@ -0,0 +1,139 @@ +{ clanLib, ... }: +{ + _class = "clan.service"; + manifest.name = "apple-network"; + manifest.description = "This service allows atalkd instances to connect to peers over vxlan over Yggdrasil. We need to use vxlan due to the support of broadcasting it provides"; + manifest.readme = builtins.readFile ./README.md; + manifest.categories = [ "Network" ]; + + roles.peer = { + description = ""; + + interface = + { lib, ... }: + { + options = { + zone_name = lib.mkOption { + type = with lib.types; str; + description = "Zone name for Apple Talk protocol"; + }; + }; + }; + + perInstance = + { roles, ... }: + { + nixosModule = + { + lib, + config, + pkgs, + ... + }: + let + vxlanPort = 4789; + + getYggdrasilIP = + machineName: + if config.clan.core.vars.generators.yggdrasil.files.address ? value then + clanLib.getPublicValue { + flake = config.clan.core.settings.directory; + machine = machineName; + generator = "yggdrasil"; + file = "address"; + default = null; + } + else + throw "clanService/yggdrasil is required"; + + noSelfPeers = builtins.filter (peerName: peerName != config.clan.core.settings.machine.name) ( + lib.mapAttrsToList (machineName: _: machineName) roles.peer.machines + ); + + sortedPeers = builtins.sort (x: y: x < y) ( + lib.mapAttrsToList (machineName: _: machineName) roles.peer.machines + ); + + getMachineIndex = machineName: lib.lists.findFirstIndex (x: x == machineName) null sortedPeers; + + selfVXAddress = "192.168.254.${ + lib.toString ((getMachineIndex config.clan.core.settings.machine.name) + 1) + }/24"; + in + { + + services.atalkd = { + enable = true; + interfaces = { + vxlan.config = '' + -router -phase 2 -net 1 -zone "Default" + ''; + }; + }; + + networking.useNetworkd = true; + + networking.firewall.interfaces.ygg.allowedUDPPorts = [ vxlanPort ]; + networking.firewall.allowedUDPPorts = [ vxlanPort ]; # TODO rm + + boot.kernelModules = [ "vxlan" ]; + + systemd.network.netdevs = + builtins.listToAttrs ( + map ( + peerName: + (lib.nameValuePair "10-apl-vxlan-${peerName}" { + enable = true; + netdevConfig = { + Name = "vxlan-${peerName}"; + Kind = "vxlan"; + }; + vxlanConfig = { + VNI = (getMachineIndex config.clan.core.settings.machine.name) + (getMachineIndex peerName); + Remote = getYggdrasilIP peerName; + DestinationPort = vxlanPort; + Independent = true; + }; + }) + ) noSelfPeers + ) + // { + "10-apl-vxlan" = { + enable = true; + netdevConfig = { + Kind = "bridge"; + Name = "vxlan"; + }; + bridgeConfig = { + STP = true; + }; + }; + }; + + systemd.network.networks = + builtins.listToAttrs ( + map ( + peerName: + (lib.nameValuePair "10-apl-vxlan-${peerName}" { + enable = true; + matchConfig.Name = "vxlan-${peerName}"; + networkConfig.Bridge = "vxlan"; + }) + ) noSelfPeers + ) + // { + "10-apl-vxlan" = { + enable = true; + matchConfig.Name = "vxlan"; + address = [ selfVXAddress ]; + }; + }; + + environment.systemPackages = [ + pkgs.netatalk + pkgs.bridge-utils + ]; + }; + }; + }; +} diff --git a/modules/clan/apple-network/flake-module.nix b/modules/clan/apple-network/flake-module.nix new file mode 100644 index 0000000..b8bb2e9 --- /dev/null +++ b/modules/clan/apple-network/flake-module.nix @@ -0,0 +1,19 @@ +{ inputs, self, ... }: +let + module = ./default.nix; +in +{ + clan.modules = { + apple-network = module; + }; + perSystem = + { ... }: + { + clan.nixosTests.service-apple-network = { + imports = [ ./tests/vm/default.nix ]; + _module.args = { inherit self inputs; }; + + clan.modules."@clan/apple-network" = module; + }; + }; +} diff --git a/modules/clan/apple-network/tests/vm/default.nix b/modules/clan/apple-network/tests/vm/default.nix new file mode 100644 index 0000000..4009746 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/default.nix @@ -0,0 +1,67 @@ +{ + self, + lib, + config, + hostPkgs, + ... +}: +{ + name = "service-apple-network"; + + result.update-vars = + let + relativeDir = lib.removePrefix "${self}/" (toString config.clan.directory); + in + hostPkgs.writeShellScriptBin "update-vars" '' + set -x + export PRJ_ROOT=$(git rev-parse --show-toplevel) + ${ + self.inputs.clan-core.packages.${hostPkgs.system}.clan-cli + }/bin/clan-generate-test-vars $PRJ_ROOT/${relativeDir} ${config.name} + ''; + + clan = { + directory = ./.; + test.useContainers = false; + + inventory = { + meta.domain = "test.clan"; + + machines.peer1 = { }; + machines.peer2 = { }; + machines.peer3 = { }; + + instances = { + apple-network = { + module.name = "@clan/apple-network"; + module.input = "self"; + roles.peer.machines = { + peer1 = { }; + peer2 = { }; + peer3 = { }; + }; + }; + yggdrasil = { + module.name = "yggdrasil"; + roles.default.tags.all = { }; + roles.default.settings.extraPeers = [ + "tls://ygg.jjolly.dev:3443" + "tls://[2602:fc24:18:7a42::1]:993" + "tcp://leo.node.3dt.net:9002" + "tcp://ygg-kcmo.incognet.io:8883" + ]; + }; + }; + }; + }; + + nodes = { + peer1 = { }; + peer2 = { }; + peer3 = { }; + }; + + testScript = _: '' + start_all() + ''; +} diff --git a/modules/clan/apple-network/tests/vm/sops/machines/peer1/key.json b/modules/clan/apple-network/tests/vm/sops/machines/peer1/key.json new file mode 100755 index 0000000..cd6cdde --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/machines/peer1/key.json @@ -0,0 +1,6 @@ +[ + { + "publickey": "age1f92zl8y70z5w9gn0l5leg2fhyvxy6m93dfh7n6ltgvuu9nyg6epsrw6t8x", + "type": "age" + } +] \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/sops/machines/peer2/key.json b/modules/clan/apple-network/tests/vm/sops/machines/peer2/key.json new file mode 100755 index 0000000..d4f07f1 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/machines/peer2/key.json @@ -0,0 +1,6 @@ +[ + { + "publickey": "age1u36fr87cru90vfznf5szasya9nhvvseh4atk8zsdj0rrsu0nnvwqsyt8g6", + "type": "age" + } +] \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/sops/machines/peer3/key.json b/modules/clan/apple-network/tests/vm/sops/machines/peer3/key.json new file mode 100755 index 0000000..cfc67f3 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/machines/peer3/key.json @@ -0,0 +1,6 @@ +[ + { + "publickey": "age1rka3368ltqc787xw99uu762lqfk7qxld9265u2t62fpxnp9xhufsc2q5rw", + "type": "age" + } +] \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/sops/secrets/peer1-age.key/secret b/modules/clan/apple-network/tests/vm/sops/secrets/peer1-age.key/secret new file mode 100644 index 0000000..f224d28 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/secrets/peer1-age.key/secret @@ -0,0 +1,14 @@ +{ + "data": "ENC[AES256_GCM,data:hC4Lle6mXuTFq//wBHUTyH3X778u/gYJSXJOiQ7xUb+gnC8beH1olxL2ZhtUiMkktzhsPM/j6cxhltPp25UTeJnUOcoYesqZcp8=,iv:WOx2P2Cu4v58xM9ePjAw1gdA0fFnGG2UqEXH2iksGoo=,tag:43n1ibVSy2AeS9f5qQBKNQ==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtT244N1Q3Zk9pRjFFQlUr\ncDExSTBwSWk5UXVyMjhWclQwSFZaYnpTRFY0CnE5YStVdzMrS3BKYzYvc3V3QVFY\nbDVwVytoNERveU1xQllqNUFGV2hYbGMKLS0tIDJSUmkwMUQzL3Y0MU5qZTJ3eFN3\nNGdwamM1UDBPdzhvSWsyZzR6anZ0eFEKKnr1/7rf3fH1i7KUoZdilLDgb44K2qzn\nI9Y+7FbV4gzQUzKWjAQeFN37Z4Qiuy0xJVA0lw8KvM+NCxSZDfh3kw==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg" + } + ], + "lastmodified": "2026-07-03T10:46:56Z", + "mac": "ENC[AES256_GCM,data:hmpbOtra6EyNiPg7EsA3F4elHEO87JPUr4VKVppvzUwLX1HSj67WrU6k3rEoJT+k7Hq1lxnAzDEckSG1fUOap11rk8ksp1IAGR0+yqykC/Qj/Nl8wXqP84gr49bJK6xE/DDdCRCcBff2d6IpnehyEr8fGFEZbWGygblec8U8GPo=,iv:+M1C3rL22foowr0VD80jwrNFb5xz4k5JQ/DJm4ThKHk=,tag:wabFAC5NTCVGfIQQzm0yGg==,type:str]", + "version": "3.13.1" + } +} diff --git a/modules/clan/apple-network/tests/vm/sops/secrets/peer1-age.key/users/admin b/modules/clan/apple-network/tests/vm/sops/secrets/peer1-age.key/users/admin new file mode 120000 index 0000000..9e21a99 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/secrets/peer1-age.key/users/admin @@ -0,0 +1 @@ +../../../users/admin \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/sops/secrets/peer2-age.key/secret b/modules/clan/apple-network/tests/vm/sops/secrets/peer2-age.key/secret new file mode 100644 index 0000000..9a01ca6 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/secrets/peer2-age.key/secret @@ -0,0 +1,14 @@ +{ + "data": "ENC[AES256_GCM,data:ndWIEOqP2ybCN7Ak5g+8q3YG5rLQ7OuSv/vCbnMA8AK6Lby2JMGRkRGysqJdyEF7eh4w7PpZ/AtKPtPbUucjeTB5+8g76PPJTBE=,iv:EYy0GGqEBmIc5rSWP7Zleb5eQ0JzTz84HqeJPpCSpxk=,tag:iMgTUb9+wxE9S2kKoOEvsQ==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQTEF6OXN4K0dHdXhWWmt2\neG5wdkNIc2F0UnFEeHFLQkdTWkFpUWhTa0NBCmw2N2J1T0FJVE9JR3VBRWV0THh5\nVEZlbVZrcXAwK3BsYXFOZUF6c3lRSkUKLS0tIFRCQzNUaGFHdERWNWR4enVWRGpx\nbDEzRU9jWHgxWHovaENjbkFlZERIbkkKvAW31gTJg9izrWuAMeDHS9SWPQYtxRBY\necDCn8QORFrnDdxEusCnGJrAU4kmS3Y3CwSHCtEijs3JdIgg9wl/MA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg" + } + ], + "lastmodified": "2026-07-03T10:47:04Z", + "mac": "ENC[AES256_GCM,data:y1U2vsdqR97fPAnp6iZiLY1KbWYmgDqgZ5bwIkWPCr7Gjjrn+qV+sc2T1BTVz3Zo0JOz4ScCc+f6snVsFKdCDU/NmDVFt/sqyH4NHUPRQ3StsQim8C7IkSwUtm3EhrqpLYFD21MEjrYYdHMHbWybxrOI0qI6mDwZymHJFeCLdQA=,iv:lVvPn69eQE/huwDmwePepfpi2l9ZOPQO7W20o4AJBFQ=,tag:7VPfjKZsBVJTZxNwTcI6sg==,type:str]", + "version": "3.13.1" + } +} diff --git a/modules/clan/apple-network/tests/vm/sops/secrets/peer2-age.key/users/admin b/modules/clan/apple-network/tests/vm/sops/secrets/peer2-age.key/users/admin new file mode 120000 index 0000000..9e21a99 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/secrets/peer2-age.key/users/admin @@ -0,0 +1 @@ +../../../users/admin \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/sops/secrets/peer3-age.key/secret b/modules/clan/apple-network/tests/vm/sops/secrets/peer3-age.key/secret new file mode 100644 index 0000000..eb78711 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/secrets/peer3-age.key/secret @@ -0,0 +1,14 @@ +{ + "data": "ENC[AES256_GCM,data:JPdetkhtF9eSmgEfCO2exXlGQ5KWLeIM3mnW5BfyTY8r0PxWSEGAwBskC1SiDdRERWB2VEbPiPgCNXMnGaYlDqSdZN6R9wSFvsQ=,iv:qGveNhUtgxvKnmdsPoPpffKyi5srlq0Pd6aW283B5C0=,tag:TcJsCrBlzfjXvztcRaxYFQ==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvdjNHa1RlcFJHazB5TXFu\nOUQ4REpCZm5Yc3ZhcVhwT1FqRHlvbnoxZWlFCnNrVUEyK2ZYSmlacmJ2b2QrclZl\nSDV1eWxXVmJxZlhMMXgrTWtjcjVhQlkKLS0tIHZPN3pCUVBLQmpRVGx6SDBQNDZo\nSitheGhXNGl5QW9HTGNsTTdTdWVwaE0KfuM5xZOPbR1lxkJPJUOVrtlW5Ujobemp\nid40reDqxKQxP3khJv8lf9ZoN8LAx2Iwh0DeAl+UJpsoVWgS7uI2qQ==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg" + } + ], + "lastmodified": "2026-07-07T04:54:10Z", + "mac": "ENC[AES256_GCM,data:Tt8yqzfAnSDe2n7KDt1Z/D73hkS1w7DsqIh+s5WljLzar9PEt5vUCLb8DIvBwITyzGAoHH1ym3v3NrnJWCdxajKExTMBf4aY3MJCtykeCG37701S/KxumjTW9/fJw74gcET5I6NafTWb6H5XHsrRaQX1Xnspcs8B7uLGZZ28dSM=,iv:Fo5UPVhnjuOx6Cp4grofHOiD2pm0TXuRRuoTwvxKn1s=,tag:VQ/TF1TiyJADj7/3RwPCAg==,type:str]", + "version": "3.13.1" + } +} diff --git a/modules/clan/apple-network/tests/vm/sops/secrets/peer3-age.key/users/admin b/modules/clan/apple-network/tests/vm/sops/secrets/peer3-age.key/users/admin new file mode 120000 index 0000000..9e21a99 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/secrets/peer3-age.key/users/admin @@ -0,0 +1 @@ +../../../users/admin \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/sops/users/admin/key.json b/modules/clan/apple-network/tests/vm/sops/users/admin/key.json new file mode 100644 index 0000000..e408aa9 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/sops/users/admin/key.json @@ -0,0 +1,4 @@ +{ + "publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg", + "type": "age" +} diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/state-version/version/value b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/state-version/version/value new file mode 100644 index 0000000..fbadb25 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/state-version/version/value @@ -0,0 +1 @@ +26.11 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/address/value b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/address/value new file mode 100644 index 0000000..28c0b2d --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/address/value @@ -0,0 +1 @@ +200:e6cc:c86:f02d:b0d5:fba9:9b2c:eb77 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/privateKey/machines/peer1 b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/privateKey/machines/peer1 new file mode 120000 index 0000000..3e5f3fa --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/privateKey/machines/peer1 @@ -0,0 +1 @@ +../../../../../../sops/machines/peer1 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/privateKey/secret b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/privateKey/secret new file mode 100644 index 0000000..400e50d --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/privateKey/secret @@ -0,0 +1,18 @@ +{ + "data": "ENC[AES256_GCM,data:6YDp5S2TzEnhDgGhcz8cA3uBsfDt0Oc4JpztB1JUcg/+tDBbeaQN4MLxuZKstXn2Hb1mYtBLlX0vHw++T181Js2sIznyfC1lr68GOvQAp4NYgf23dXpdZk/CMPNUMiGOYVwKWQ/Z0/p0azJ6xV29dYQcM4Q9hys=,iv:Ijzz8hm0looCWoSpjg/rYKp9jhvzRuLboKWHrlwVeFA=,tag:kJcH/1Pu+9q9f2J68LETug==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYNDNEL3kvdEpEMjYyOFJG\nMk5adU04M3hxa21jTTZNM2dQREpmUlVES1NvCjh6eDNFZ1hzUVlTY3Nidnp3TkYr\nRVl4TFlrNUE3dVIzZzg2VWMwTFBYUXMKLS0tIFE0dVFQQmxwOFJ6YkdaQlh6dUlW\nTi8rdXdQbGR1eXpLcTdOandqQmxka3cKImbmJQo2YMYMSQD8kNTgol3VJ4YGIaoz\nl3AY4u/fobg5qlzVQwV33G0/Wf72Z2aTjSLnP4thnasQ89PdYvs7hA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1f92zl8y70z5w9gn0l5leg2fhyvxy6m93dfh7n6ltgvuu9nyg6epsrw6t8x" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiaWw5SU9KWmJnVVVmTVpr\nL1V6RnRYUGg2UnhXR1BnVTh5eFhnNFpidGdjCmdMeU1nZkZmTTVwbkNaVElFa0Z4\nVkdGdjc4c2lPWGNrVGxocE9iQUZ3QTAKLS0tIHIzTzRRbXVkM3I4ZVRxeSs5eHV5\nTUxOaytzb2MxQ2UybkVCYWVWVmVEcUEKPeK+CC7r3CP5BJqg9thWNHWjPBp/ueHU\nRif6T79kqf+c3B34qXwR0zfyM1+a0r9GAVVC2/q+Ha/As5sPJU39ww==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg" + } + ], + "lastmodified": "2026-07-03T10:46:56Z", + "mac": "ENC[AES256_GCM,data:PffiPU1GR9DojTb7TxzBkpivKV2ybmmq9h4pOOyq7p5BAIPF+JSe+BDtbItQ+Gn5LnitQRUVvhat8E2iYfz3JgNxNKcsNFU/mWtCz3PlqyiuRzUBtEL3zYfhdMi8hYYlVdfMumaK3VMk+b4uDGExR+MpURL97TFku47qRbzbILs=,iv:3//fj7WtIX2QNYB9ub1JKAFIn5vJeuZl6rqaEsX0oQc=,tag:njU+WAVq7xBgE0sna2dMKA==,type:str]", + "version": "3.13.1" + } +} diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/privateKey/users/admin b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/privateKey/users/admin new file mode 120000 index 0000000..ca714e1 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/privateKey/users/admin @@ -0,0 +1 @@ +../../../../../../sops/users/admin \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/publicKey/value b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/publicKey/value new file mode 100644 index 0000000..9887be9 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer1/yggdrasil/publicKey/value @@ -0,0 +1 @@ +8c99f9bc87e92795022b32698a440d6f9fe01d1110f867de8176bb190b92acab \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/state-version/version/value b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/state-version/version/value new file mode 100644 index 0000000..fbadb25 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/state-version/version/value @@ -0,0 +1 @@ +26.11 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/address/value b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/address/value new file mode 100644 index 0000000..22cc6b8 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/address/value @@ -0,0 +1 @@ +200:eb95:7d1b:3ac3:62e7:24af:2274:3771 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/privateKey/machines/peer2 b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/privateKey/machines/peer2 new file mode 120000 index 0000000..6370c90 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/privateKey/machines/peer2 @@ -0,0 +1 @@ +../../../../../../sops/machines/peer2 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/privateKey/secret b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/privateKey/secret new file mode 100644 index 0000000..e000bea --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/privateKey/secret @@ -0,0 +1,18 @@ +{ + "data": "ENC[AES256_GCM,data:vOwMqT12A5ap5hRvCGTjTUX4sXKO3N7KE8eQ+/SCcBWndU9/b2AehiNgplWWMGcYdmeDL9qI8V2pPkgBkQ/tWH6N8DccSM/zQzrBUkXvRApl6hvNZAWuBVf/P4MW4/EbRGtMg2tEXkaPDtRn2TsDK7ygmXmqArI=,iv:FkxFx/ClAftLu85S6Uq3ZOom+YDOpeWGlYLOFBmFfnk=,tag:zprw62qiu+hmLZEZbnqYXA==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA0WVB1M2ttd0FocGhTSjNo\nUDFIcmpsL051TndWbkJVakJHbUxjY3Q3NjM0CnkrbFlHS1E4bkZJQTIvMDJ3VDFv\nNW1OdmwvalBEelN2d3YwbHVqTW94OFEKLS0tIGtpOWxCM29xdXhQL2Yzb094OG1n\nT21mc25yU1dJL29vekRHdldzdDR3dEkKoZ1dPRaPg8iVsuec6IhV3cLPchokV2wv\nu6qb92hsLQuyPHDA01Oey0jxmaYMQGtAVjo2zEM+E+zrKY+f2pHIUQ==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArcmo5d2x6c3J0YTkwMGJE\nanphd2FiUjdGdmdNeW0rL0FpcTVSM3dublZ3CnphajNVV2YrTGl2a3ZqMTJKeU4v\nTzZRS2F5MlA5Ny84cFFoNWZQZnpBZTgKLS0tIHVKQUJWcmlPdy9GNXNBYnpJcEVC\nNmJVMlpvSzZPdk1JY2hIZVEvc3cwV2MKE/cMJU/j5g62njJ49AfnLutmxkpz/gxX\nIqWe1m7Uxl/awVFa7F8N7TUkd0jLbAGXZaonDjiBxOTwg/jr/apnuQ==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1u36fr87cru90vfznf5szasya9nhvvseh4atk8zsdj0rrsu0nnvwqsyt8g6" + } + ], + "lastmodified": "2026-07-03T10:47:04Z", + "mac": "ENC[AES256_GCM,data:wiIkwEDwGJZe0u8qLHthPkCXubeIGyHV8yBo8CsSengLVTOtRZ877zTrFvE74ATF1pGE3DFJ5qGRrOGgKJ4VOl043LbEBs0bxZC495pPMPYszimp2UAf/XE3QWlNi9p4Ce/kbvUDd0W3SRt4hIv6HOLWApiRoqfS2qSMUnBQeW0=,iv:Hs7EysUnje/iWZRhJLlqf8wuFJnIMpWfXWHrilfmM5I=,tag:Rgj9x4ZOM2fihKKNQ4ux3g==,type:str]", + "version": "3.13.1" + } +} diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/privateKey/users/admin b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/privateKey/users/admin new file mode 120000 index 0000000..ca714e1 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/privateKey/users/admin @@ -0,0 +1 @@ +../../../../../../sops/users/admin \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/publicKey/value b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/publicKey/value new file mode 100644 index 0000000..438ba89 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer2/yggdrasil/publicKey/value @@ -0,0 +1 @@ +8a354172629e4e8c6da86ec5e447411e4238cf7bb439b798fae56509a82d7472 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/state-version/version/value b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/state-version/version/value new file mode 100644 index 0000000..fbadb25 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/state-version/version/value @@ -0,0 +1 @@ +26.11 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/address/value b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/address/value new file mode 100644 index 0000000..9a06ce9 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/address/value @@ -0,0 +1 @@ +200:3dcd:9b0d:103c:f953:1e8:e3a2:ed90 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/privateKey/machines/peer3 b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/privateKey/machines/peer3 new file mode 120000 index 0000000..356dfec --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/privateKey/machines/peer3 @@ -0,0 +1 @@ +../../../../../../sops/machines/peer3 \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/privateKey/secret b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/privateKey/secret new file mode 100644 index 0000000..f0035d5 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/privateKey/secret @@ -0,0 +1,18 @@ +{ + "data": "ENC[AES256_GCM,data:7no9ZnfatNLEykz+JOUExxmaRzBr7B5PEcevETySJWHTCCjSULdRb2KLxbXP5OKWSuJbR8pJ+p+nZuyr7aOTyXrU+fgwf/Pff4KGaZbKf1t3HJun8wJ2q62uaFYu8ACbNFfwIzJ51SPGcO7IHxfjWn5k9zG7av4=,iv:+VNvFKAJ+HDCGZciug8SKHOcM1JZQUAbZpRT5en4xcU=,tag:3kcDHWIs9ITzTKDiyyYhnQ==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvZ0VFcGhPR0NrMGU4dStU\nZGpnMHZmbUF0R0NFNWQzNGVpZXhYQ24xNXk0CnJIYmJYMnBmeURLZytBcXNRNG5u\nZzk4cXdPdnJIU0JVam1NWFA3TkhuWFkKLS0tIDZYUEVGMUtCQWdSM3k4WEZhdUt3\naElkc3o5SXlFYTJLNUpGZ0ptNm96M2MKYKW5emktK2M+IYX0v/swCV1fgrQXQVlb\nmz11rN5fJWV5wvLcTtyU9imgZLB9MfRMyIYlHzD2HPbW+zr8Fe+bBQ==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZVDVxY3JrWk1TY3ZsazNz\naVl4Vk1vRUdkRTdlaDU1TE15dC96ZHlxQ1ZBCmYvSmh1QlBNRnJyRy9kcDR0cXhY\neDdPUXZ6b2FkWnBXbzA4bzU1aFo3bEUKLS0tIHMrb05Oa3FrRzh5VHN1RWRmUU9W\ndGZUYTVVQkIzM3FRRHp6NXlEdEU0VTgK7ibTaEcvbVTQjcbgeylu2s5tmI5kAadM\nFGiOgJhDFuzbHxXIEQlsCBIaXe6LlGhBo41VZbMxme5py6nJFTBHKg==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1rka3368ltqc787xw99uu762lqfk7qxld9265u2t62fpxnp9xhufsc2q5rw" + } + ], + "lastmodified": "2026-07-07T04:54:10Z", + "mac": "ENC[AES256_GCM,data:gonhuGY61G3Gdtj7q23aTNYU95fjLMz2uVTsSX+Hw10LGUTEMM8LF/Phae9kr5BZKD8BYaIgH32As2+n0B9jZ4WV77A5hUe2NJze9d0A40P2MtMh9xFWWh7yEXXnx5dy1UDrthL2LBa7ebPspuaC0mFhRHdoJK3J2W1m41PGjZc=,iv:H4yNuE8i3UxVjAUIpnaFX6i8/DaO4uIlHrEY9VaSiRs=,tag:9lJtixSNv7tpox0V3ZoNnA==,type:str]", + "version": "3.13.1" + } +} diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/privateKey/users/admin b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/privateKey/users/admin new file mode 120000 index 0000000..ca714e1 --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/privateKey/users/admin @@ -0,0 +1 @@ +../../../../../../sops/users/admin \ No newline at end of file diff --git a/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/publicKey/value b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/publicKey/value new file mode 100644 index 0000000..f843a9c --- /dev/null +++ b/modules/clan/apple-network/tests/vm/vars/per-machine/peer3/yggdrasil/publicKey/value @@ -0,0 +1 @@ +e119327977e183567f0b8e2e8937c9d04708e296beed57792a1b6935eacf69d9 \ No newline at end of file