···187187188188- `services.monero` now includes the `environmentFile` option for adding secrets to the Monero daemon config.
189189190190+- `services.netbird.server` now uses dedicated packages split out due to relicensing of server components to AGPLv3 with version `0.53.0`,
191191+190192- The new option [networking.ipips](#opt-networking.ipips) has been added to create IP within IP kind of tunnels (including 4in6, ip6ip6 and ipip).
191193 With the existing [networking.sits](#opt-networking.sits) option (6in4), it is now possible to create all combinations of IPv4 and IPv6 encapsulation.
192194
···3131 options.services.netbird.server.signal = {
3232 enable = mkEnableOption "Netbird's Signal Service";
33333434- package = mkPackageOption pkgs "netbird" { };
3434+ package = mkPackageOption pkgs "netbird-signal" { };
35353636 enableNginx = mkEnableOption "Nginx reverse-proxy for the netbird signal service";
3737
+72-28
nixos/tests/netbird.nix
···77 ];
8899 nodes = {
1010- clients =
1010+ node =
1111 { ... }:
1212 {
1313 services.netbird.enable = true;
···1515 };
1616 };
17171818- # TODO: confirm the whole solution is working end-to-end when netbird server is implemented
1919- testScript = ''
2020- start_all()
2121- def did_start(node, name, interval=0.5, timeout=10):
2222- node.wait_for_unit(f"{name}.service")
2323- node.wait_for_file(f"/var/run/{name}/sock")
2424- # `netbird status` returns a full "Disconnected" status during initialization
2525- # only after a while passes it starts returning "NeedsLogin" help message
2626-2727- start = time.time()
2828- output = node.succeed(f"{name} status")
2929- while "Disconnected" in output and (time.time() - start) < timeout:
3030- time.sleep(interval)
3131- output = node.succeed(f"{name} status")
3232- assert "NeedsLogin" in output
3333-3434- did_start(clients, "netbird")
3535- did_start(clients, "netbird-custom")
3636- '';
3737-3818 /*
3939- `netbird status` used to print `Daemon status: NeedsLogin`
4040- https://github.com/netbirdio/netbird/blob/23a14737974e3849fa86408d136cc46db8a885d0/client/cmd/status.go#L154-L164
4141- as the first line, but now it is just:
1919+ Historically waiting for the NetBird client daemon initialization helped catch number of bugs with the service,
2020+ so we keep try to keep it here in as much details as it makes sense.
42214343- Daemon version: 0.26.3
4444- CLI version: 0.26.3
4545- Management: Disconnected
2222+ Initially `netbird status` returns a "Disconnected" messages:
2323+ OS: linux/amd64
2424+ Daemon version: 0.54.0
2525+ CLI version: 0.54.0
2626+ Profile: default
2727+ Management: Disconnected, reason: rpc error: code = FailedPrecondition desc = failed connecting to Management Service : context deadline exceeded
4628 Signal: Disconnected
4729 Relays: 0/0 Available
4830 Nameservers: 0/0 Available
···5032 NetBird IP: N/A
5133 Interface type: N/A
5234 Quantum resistance: false
5353- Routes: -
3535+ Lazy connection: false
3636+ Networks: -
3737+ Forwarding rules: 0
5438 Peers count: 0/0 Connected
3939+4040+ After a while passes it should start returning "NeedsLogin" help message.
4141+4242+ As of ~0.53.0+ in ~30 second intervals the `netbird status` instead of "NeedsLogin" it briefly (for under 2 seconds) crashes with:
4343+4444+ Error: status failed: failed connecting to Management Service : context deadline exceeded
4545+4646+ This might be related to the following log line:
4747+4848+ 2025-08-11T15:03:25Z ERRO shared/management/client/grpc.go:65: failed creating connection to Management Service: context deadline exceeded
5549 */
5050+ # TODO: confirm the whole solution is working end-to-end when netbird server is implemented
5151+ testScript = ''
5252+ import textwrap
5353+ import time
5454+5555+ start_all()
5656+5757+ def run_with_debug(node, cmd, check=True, display=True, **kwargs):
5858+ cmd = f"{cmd} 2>&1"
5959+ start = time.time()
6060+ ret, output = node.execute(cmd, **kwargs)
6161+ duration = time.time() - start
6262+ txt = f">>> {cmd=} {ret=} {duration=:.2f}:\n{textwrap.indent(output, '... ')}"
6363+ if check:
6464+ assert ret == 0, txt
6565+ if display:
6666+ print(txt)
6767+ return ret, output
6868+6969+ def wait_until_rcode(node, cmd, rcode=0, retries=30, **kwargs):
7070+ def check_success(_last_try):
7171+ nonlocal output
7272+ ret, output = run_with_debug(node, cmd, **kwargs)
7373+ return ret == rcode
7474+7575+ kwargs.setdefault('check', False)
7676+ output = None
7777+ with node.nested(f"waiting for {cmd=} to exit with {rcode=}"):
7878+ retry(check_success, retries)
7979+ return output
8080+8181+ instances = ["netbird", "netbird-custom"]
8282+8383+ for name in instances:
8484+ node.wait_for_unit(f"{name}.service")
8585+ node.wait_for_file(f"/var/run/{name}/sock")
8686+8787+ for name in instances:
8888+ wait_until_rcode(node, f"{name} status |& grep -C20 Disconnected", 0, retries=5)
8989+ ''
9090+ # The status used to turn into `NeedsLogin`, but recently started crashing instead.
9191+ # leaving the snippets in here, in case some update goes back to the old behavior and can be tested again
9292+ + lib.optionalString false ''
9393+ for name in instances:
9494+ #wait_until_rcode(node, f"{name} status |& grep -C20 NeedsLogin", 0, retries=20)
9595+ output = wait_until_rcode(node, f"{name} status", 1, retries=61)
9696+ msg = "Error: status failed: failed connecting to Management Service : context deadline exceeded"
9797+ assert output.strip() == msg, f"expected {msg=}, got {output=} instead"
9898+ wait_until_rcode(node, f"{name} status |& grep -C20 Disconnected", 0, retries=10)
9999+ '';
56100}
···48484949stdenv.mkDerivation (finalAttrs: {
5050 pname = "ipxe";
5151- version = "1.21.1-unstable-2025-07-30";
5151+ version = "1.21.1-unstable-2025-08-07";
52525353 nativeBuildInputs = [
5454 mtools
···6666 src = fetchFromGitHub {
6767 owner = "ipxe";
6868 repo = "ipxe";
6969- rev = "f7a1e9ef8e1dc22ebded786507b872a45e3fb05d";
7070- hash = "sha256-dNnZH6ENxx3K2lAIE0B8mLjOo05D/TBguarrGrxXozc=";
6969+ rev = "8460dc4e8ffc98db62377d1c5502d6aac40f5a64";
7070+ hash = "sha256-Xk1lbExR4dyiba4tF0Dm9/KtTVxc78Fs8gjmZU7pdpI=";
7171 };
72727373 # Calling syslinux on a FAT image isn't going to work on Aarch64.
+3-3
pkgs/by-name/ka/kardolus-chatgpt-cli/package.nix
···99 # "chatgpt-cli" is taken by another package with the same upsteam name.
1010 # To keep "pname" and "package attribute name" identical, the owners name (kardolus) gets prefixed as identifier.
1111 pname = "kardolus-chatgpt-cli";
1212- version = "1.8.5";
1212+ version = "1.8.6";
13131414 src = fetchFromGitHub {
1515 owner = "kardolus";
1616 repo = "chatgpt-cli";
1717 rev = "v${finalAttrs.version}";
1818- hash = "sha256-TXdxqPoyt3VUeHVkbB0UjNcCqaf+5Xve95RMQOEagTM=";
1818+ hash = "sha256-ggakrfeV6guGhBbA45A78oMFQSMqh9+yvJK+cic1JdY=";
1919 };
20202121 vendorHash = null;
2222 # The tests of kardolus/chatgpt-cli require an OpenAI API Key to be present in the environment,
2323- # (e.g. https://github.com/kardolus/chatgpt-cli/blob/v1.8.5/test/contract/contract_test.go#L35)
2323+ # (e.g. https://github.com/kardolus/chatgpt-cli/blob/v1.8.6/test/contract/contract_test.go#L35)
2424 # which will not be the case in the pipeline.
2525 # Therefore, tests must be skipped.
2626 doCheck = false;
···15191519 openssl_3_0 = openssl_3; # Added 2022-06-27
15201520 opensycl = lib.warnOnInstantiate "'opensycl' has been renamed to 'adaptivecpp'" adaptivecpp; # Added 2024-12-04
15211521 opensyclWithRocm = lib.warnOnInstantiate "'opensyclWithRocm' has been renamed to 'adaptivecppWithRocm'" adaptivecppWithRocm; # Added 2024-12-04
15221522+ open-timeline-io = lib.warnOnInstantiate "'open-timeline-io' has been renamed to 'opentimelineio'" opentimelineio; # Added 2025-08-10
15221523 opentofu-ls = lib.warnOnInstantiate "'opentofu-ls' has been renamed to 'tofu-ls'" tofu-ls; # Added 2025-06-10
15231524 openvdb_11 = throw "'openvdb_11' has been removed in favor of the latest version'"; # Added 2025-05-03
15241525 opera = throw "'opera' has been removed due to lack of maintenance in nixpkgs"; # Added 2025-05-19
+7-7
pkgs/top-level/all-packages.nix
···15800158001580115801 nix-tree = haskell.lib.compose.justStaticExecutables (haskellPackages.nix-tree);
15802158021580315803- nix-serve-ng = haskell.lib.compose.justStaticExecutables haskellPackages.nix-serve-ng;
1580315803+ nix-serve-ng =
1580415804+ # FIXME: manually eliminate incorrect references on aarch64-darwin,
1580515805+ # see https://github.com/NixOS/nixpkgs/issues/318013
1580615806+ if stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64 then
1580715807+ haskellPackages.nix-serve-ng
1580815808+ else
1580915809+ haskell.lib.compose.justStaticExecutables haskellPackages.nix-serve-ng;
15804158101580515811 nix-visualize = python3.pkgs.callPackage ../tools/package-management/nix-visualize { };
1580615812···1620116207 };
16202162081620316209 sieveshell = with python3.pkgs; toPythonApplication managesieve;
1620416204-1620516205- jami = qt6Packages.callPackage ../applications/networking/instant-messengers/jami {
1620616206- # TODO: remove once `udev` is `systemdMinimal` everywhere.
1620716207- udev = systemdMinimal;
1620816208- jack = libjack2;
1620916209- };
16210162101621116211 gpio-utils = callPackage ../os-specific/linux/kernel/gpio-utils.nix { };
1621216212