diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index d3f71f314dfb..92f1ecef0269 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -25635,6 +25635,12 @@ name = "Denny Schäfer"; keys = [ { fingerprint = "C752 0E49 4D92 1740 D263 C467 B057 455D 1E56 7270"; } ]; }; + tuxy = { + email = "lastpass7565@gmail.com"; + github = "tuxy"; + githubId = 57819359; + name = "Binh Nguyen"; + }; tv = { email = "tv@krebsco.de"; github = "4z3"; diff --git a/nixos/doc/manual/release-notes/rl-2511.section.md b/nixos/doc/manual/release-notes/rl-2511.section.md index 6d0b6a1aede6..0f31addf708d 100644 --- a/nixos/doc/manual/release-notes/rl-2511.section.md +++ b/nixos/doc/manual/release-notes/rl-2511.section.md @@ -17,6 +17,8 @@ - [FileBrowser](https://filebrowser.org/), a web application for managing and sharing files. Available as [services.filebrowser](#opt-services.filebrowser.enable). +- Options under [networking.getaddrinfo](#opt-networking.getaddrinfo.enable) are now allowed to declaratively configure address selection and sorting behavior of `getaddrinfo` in dual-stack networks. + - [LACT](https://github.com/ilya-zlobintsev/LACT), a GPU monitoring and configuration tool, can now be enabled through [services.lact.enable](#opt-services.lact.enable). Note that for LACT to work properly on AMD GPU systems, you need to enable [hardware.amdgpu.overdrive.enable](#opt-hardware.amdgpu.overdrive.enable). diff --git a/nixos/modules/config/getaddrinfo.nix b/nixos/modules/config/getaddrinfo.nix new file mode 100644 index 000000000000..f18651a9e031 --- /dev/null +++ b/nixos/modules/config/getaddrinfo.nix @@ -0,0 +1,120 @@ +{ + pkgs, + lib, + config, + ... +}: +let + cfg = config.networking.getaddrinfo; + + formatTableEntries = + tableName: table: + if table == null then + [ ] + else + lib.mapAttrsToList (cidr: val: "${tableName} ${cidr} ${toString val}") table; + + gaiConfText = lib.concatStringsSep "\n" ( + [ + "# Generated by NixOS module networking.getaddrinfo" + "# Do not edit manually!" + "reload ${if cfg.reload then "yes" else "no"}" + ] + ++ formatTableEntries "label" cfg.label + ++ formatTableEntries "precedence" cfg.precedence + ++ formatTableEntries "scopev4" cfg.scopev4 + ); +in +{ + options.networking.getaddrinfo = { + enable = lib.mkOption { + type = lib.types.bool; + default = pkgs.stdenv.hostPlatform.libc == "glibc"; + defaultText = lib.literalExpression '' + pkgs.stdenv.hostPlatform.libc == "glibc" + ''; + description = '' + Enables custom address sorting configuration for {manpage}`getaddrinfo(3)` according to RFC 3484. + + This option generates a {file}`/etc/gai.conf` file to override the default address sorting tables, + as described in {manpage}`gai.conf(5)`. + + This setting is only applicable when using the GNU C Library (glibc). + It has no effect with other libc implementations. + ''; + }; + + reload = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Determines whether a process should detect changes to the configuration file since it was last read. + + If enabled, the file is re-read automatically. This may cause issues in multithreaded applications + and is generally discouraged. + ''; + }; + + label = lib.mkOption { + type = lib.types.nullOr (lib.types.attrsOf lib.types.int); + default = null; + description = '' + Adds entries to the label table, as described in section 2.1 of RFC 3484. + + If any label entries are provided, the glibc’s default label table is ignored. + ''; + example = { + "::/0" = 1; + "2002::/16" = 2; + "::/96" = 3; + "::ffff:0:0/96" = 4; + "fec0::/10" = 5; + "fc00::/7" = 6; + "2001:0::/32" = 7; + }; + }; + + precedence = lib.mkOption { + type = lib.types.nullOr (lib.types.attrsOf lib.types.int); + default = null; + description = '' + Similar to {option}`networking.getaddrinfo.label`, but this option + defines entries for the precedence table instead. + + See sections 2.1 and 10.3 of RFC 3484 for details. + + Providing any value will disable the glibc's default precedence table. + ''; + example = { + "::1/128" = 50; + "::/0" = 40; + "2002::/16" = 30; + "::/96" = 20; + "::ffff:0:0/96" = 10; + }; + }; + + scopev4 = lib.mkOption { + type = lib.types.nullOr (lib.types.attrsOf lib.types.int); + default = null; + description = '' + Adds custom rules to the IPv4 scope table. + + By default, the scope IDs described in section 3.2 of RFC 6724 are used. + + Modifying these values is rarely necessary. + ''; + example = { + "::ffff:169.254.0.0/112" = 2; + "::ffff:127.0.0.0/104" = 2; + "::ffff:0.0.0.0/96" = 14; + }; + }; + }; + + config = lib.mkIf cfg.enable { + environment.etc."gai.conf".text = gaiConfText; + }; + + meta.maintainers = with lib.maintainers; [ moraxyc ]; +} diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 29c23ae1bac9..77055c886318 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -8,6 +8,7 @@ ./config/fonts/fontdir.nix ./config/fonts/ghostscript.nix ./config/fonts/packages.nix + ./config/getaddrinfo.nix ./config/gtk/gtk-icon-cache.nix ./config/i18n.nix ./config/iproute2.nix diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index cc4f7641b827..aedc99b1a7e4 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -537,6 +537,7 @@ in gancio = runTest ./gancio.nix; garage = handleTest ./garage { }; gatus = runTest ./gatus.nix; + getaddrinfo = runTest ./getaddrinfo.nix; gemstash = handleTest ./gemstash.nix { }; geoclue2 = runTest ./geoclue2.nix; geoserver = runTest ./geoserver.nix; diff --git a/nixos/tests/getaddrinfo.nix b/nixos/tests/getaddrinfo.nix new file mode 100644 index 000000000000..0e686255fff9 --- /dev/null +++ b/nixos/tests/getaddrinfo.nix @@ -0,0 +1,68 @@ +{ lib, ... }: +let + ip4 = "192.0.2.1"; + ip6 = "2001:db8::1"; + + precedence = { + "::1/128" = 50; + "::/0" = 40; + "2002::/16" = 30; + "::/96" = 20; + "::ffff:0:0/96" = 100; + }; +in +{ + name = "getaddrinfo"; + meta.maintainers = with lib.maintainers; [ moraxyc ]; + + nodes.server = _: { + networking.firewall.enable = false; + networking.useDHCP = false; + + services.dnsmasq = { + enable = true; + settings = { + address = [ + "/nixos.test/${ip4}" + "/nixos.test/${ip6}" + ]; + }; + }; + }; + + nodes.client = + { pkgs, nodes, ... }: + { + networking.nameservers = [ + (lib.head nodes.server.networking.interfaces.eth1.ipv4.addresses).address + ]; + networking.getaddrinfo = { + reload = true; + inherit precedence; + }; + networking.useDHCP = false; + environment.systemPackages = [ + (pkgs.writers.writePython3Bin "request-addr" { } '' + import socket + + results = socket.getaddrinfo("nixos.test", None) + print(results[0][4][0]) + '') + ]; + }; + + testScript = + { ... }: + '' + server.wait_for_unit("dnsmasq.service") + client.wait_for_unit("network.target") + + assert "${ip4}" in client.succeed("request-addr") + + client.succeed(""" + sed 's/100/10/' /etc/gai.conf > /etc/gai.conf.new && \ + mv /etc/gai.conf.new /etc/gai.conf + """) + assert "${ip6}" in client.succeed("request-addr") + ''; +} diff --git a/pkgs/by-name/fi/firewalld/package.nix b/pkgs/by-name/fi/firewalld/package.nix index 7772c2c0fa71..51ee769c84ac 100644 --- a/pkgs/by-name/fi/firewalld/package.nix +++ b/pkgs/by-name/fi/firewalld/package.nix @@ -44,13 +44,13 @@ let in stdenv.mkDerivation rec { pname = "firewalld"; - version = "2.3.0"; + version = "2.3.1"; src = fetchFromGitHub { owner = "firewalld"; repo = "firewalld"; rev = "v${version}"; - sha256 = "sha256-ubE1zMIOcdg2+mgXsk6brCZxS1XkvJYwVY3E+UXIIiU="; + sha256 = "sha256-ONpyJJjIn5kEnkudZe4Nf67wdQgWa+2qEkT1nxRBDpI="; }; patches = [ diff --git a/pkgs/by-name/ka/karmor/package.nix b/pkgs/by-name/ka/karmor/package.nix index 351e8acdb350..55504af7d0c2 100644 --- a/pkgs/by-name/ka/karmor/package.nix +++ b/pkgs/by-name/ka/karmor/package.nix @@ -9,13 +9,13 @@ buildGoModule rec { pname = "karmor"; - version = "1.4.1"; + version = "1.4.2"; src = fetchFromGitHub { owner = "kubearmor"; repo = "kubearmor-client"; rev = "v${version}"; - hash = "sha256-gFcv2VxKTozEAJvcncOc6X1Pn7HWomHgemCfyddZSJs="; + hash = "sha256-+Zk1tPZAk3rQ1ZfdNAPEvtjm0mdsWRELbRctlulvFnE="; }; vendorHash = "sha256-4F/q6vYOGtLef+rrJXKhLwjM71NMNI4es4dKe1pohZU="; diff --git a/pkgs/by-name/pi/pineflash/package.nix b/pkgs/by-name/pi/pineflash/package.nix index b68594035764..a3571a9319cc 100644 --- a/pkgs/by-name/pi/pineflash/package.nix +++ b/pkgs/by-name/pi/pineflash/package.nix @@ -17,14 +17,14 @@ nix-update-script, wayland, }: -rustPlatform.buildRustPackage rec { +rustPlatform.buildRustPackage (finalAttrs: { pname = "pineflash"; version = "0.5.5"; src = fetchFromGitHub { owner = "Spagett1"; repo = "pineflash"; - tag = version; + tag = finalAttrs.version; hash = "sha256-4tcwEok36vuXbtlZNUkLNw1kHFQPBEJM/gWRhRWNLPg="; }; @@ -81,11 +81,11 @@ rustPlatform.buildRustPackage rec { meta = { description = "GUI tool to flash IronOS to the Pinecil V1 and V2"; homepage = "https://github.com/Spagett1/pineflash"; - changelog = "https://github.com/Spagett1/pineflash/releases/tag/${version}"; + changelog = "https://github.com/Spagett1/pineflash/releases/tag/${finalAttrs.version}"; license = lib.licenses.gpl2Only; maintainers = with lib.maintainers; [ acuteaangle ]; mainProgram = "pineflash"; }; -} +}) diff --git a/pkgs/by-name/wa/waybar/package.nix b/pkgs/by-name/wa/waybar/package.nix index d2b27b317029..53a6abb425b3 100644 --- a/pkgs/by-name/wa/waybar/package.nix +++ b/pkgs/by-name/wa/waybar/package.nix @@ -12,7 +12,6 @@ gtk-layer-shell, gtkmm3, howard-hinnant-date, - hyprland, iniparser, jsoncpp, libcava, @@ -38,7 +37,6 @@ sndio, spdlog, systemdMinimal, - sway, udev, upower, versionCheckHook, @@ -51,7 +49,6 @@ enableManpages ? stdenv.buildPlatform.canExecute stdenv.hostPlatform, evdevSupport ? true, experimentalPatches ? true, - hyprlandSupport ? true, inputSupport ? true, jackSupport ? true, mpdSupport ? true, @@ -64,7 +61,6 @@ runTests ? stdenv.buildPlatform.canExecute stdenv.hostPlatform, sndioSupport ? true, systemdSupport ? lib.meta.availableOn stdenv.hostPlatform systemdMinimal, - swaySupport ? true, traySupport ? true, udevSupport ? true, upowerSupport ? true, @@ -128,7 +124,6 @@ stdenv.mkDerivation (finalAttrs: { portaudio ] ++ lib.optional evdevSupport libevdev - ++ lib.optional hyprlandSupport hyprland ++ lib.optional inputSupport libinput ++ lib.optional jackSupport libjack2 ++ lib.optional mpdSupport libmpdclient @@ -136,7 +131,6 @@ stdenv.mkDerivation (finalAttrs: { ++ lib.optional nlSupport libnl ++ lib.optional pulseSupport libpulseaudio ++ lib.optional sndioSupport sndio - ++ lib.optional swaySupport sway ++ lib.optional systemdSupport systemdMinimal ++ lib.optional traySupport libdbusmenu-gtk3 ++ lib.optional udevSupport udev diff --git a/pkgs/by-name/xe/xenia-canary/package.nix b/pkgs/by-name/xe/xenia-canary/package.nix new file mode 100644 index 000000000000..d76e2a4eef9a --- /dev/null +++ b/pkgs/by-name/xe/xenia-canary/package.nix @@ -0,0 +1,102 @@ +{ + lib, + python3, + gtk3, + lz4, + SDL2, + pkg-config, + vulkan-loader, + ninja, + cmake, + libuuid, + wrapGAppsHook3, + makeDesktopItem, + copyDesktopItems, + llvmPackages_18, + autoPatchelfHook, + unstableGitUpdater, + fetchFromGitHub, +}: +llvmPackages_18.stdenv.mkDerivation { + pname = "xenia-canary"; + version = "0-unstable-2025-06-07"; + + src = fetchFromGitHub { + owner = "xenia-canary"; + repo = "xenia-canary"; + fetchSubmodules = true; + rev = "422517c673bba086c2b857946ae5a37ee35b8e50"; + hash = "sha256-88GHKXURfN8vaVNN7wKn562b6FvsIm/sTcUgtuhvVxM="; + }; + + dontConfigure = true; + + nativeBuildInputs = [ + python3 + pkg-config + ninja + cmake + wrapGAppsHook3 + copyDesktopItems + autoPatchelfHook + libuuid + ]; + + NIX_CFLAGS_COMPILE = [ + "-Wno-error=unused-result" + ]; + + buildInputs = [ + gtk3 + lz4 + SDL2 + ]; + + buildPhase = '' + runHook preBuild + python3 xenia-build setup + python3 xenia-build build --config=release -j $NIX_BUILD_CORES + runHook postBuild + ''; + + runtimeDependencies = [ + vulkan-loader + ]; + + desktopItems = [ + (makeDesktopItem { + name = "xenia_canary"; + desktopName = "Xenia Canary"; + genericName = "Xbox 360 Emulator"; + exec = "xenia_canary"; + comment = "Xbox 360 Emulator Research Project"; + icon = "xenia-canary"; + startupWMClass = "Xenia_canary"; + categories = [ + "Game" + "Emulator" + ]; + keywords = [ "xbox" ]; + }) + ]; + + installPhase = '' + runHook preInstall + find ./build/bin -mindepth 3 -maxdepth 3 -type f -executable -exec install -Dm755 {} -t $out/bin \; + for width in 16 32 48 64 128 256; do + install -Dm644 assets/icon/$width.png $out/share/icons/hicolor/''${width}x''${width}/apps/xenia-canary.png + done + runHook postInstall + ''; + + passthru.updateScript = unstableGitUpdater { }; + + meta = { + description = "Xbox 360 Emulator Research Project"; + homepage = "https://github.com/xenia-canary/xenia-canary"; + license = lib.licenses.bsd3; + maintainers = with lib.maintainers; [ tuxy ]; + mainProgram = "xenia_canary"; + platforms = [ "x86_64-linux" ]; + }; +} diff --git a/pkgs/development/ocaml-modules/landmarks-ppx/default.nix b/pkgs/development/ocaml-modules/landmarks-ppx/default.nix index 8025fb90303c..f6676696bb9a 100644 --- a/pkgs/development/ocaml-modules/landmarks-ppx/default.nix +++ b/pkgs/development/ocaml-modules/landmarks-ppx/default.nix @@ -19,5 +19,9 @@ buildDunePackage { meta = landmarks.meta // { description = "Preprocessor instrumenting code using the landmarks library"; + longDescription = '' + Automatically or semi-automatically instrument your code using + landmarks library. + ''; }; } diff --git a/pkgs/development/ocaml-modules/landmarks/default.nix b/pkgs/development/ocaml-modules/landmarks/default.nix index 3a39592a9ecf..40375794fd0c 100644 --- a/pkgs/development/ocaml-modules/landmarks/default.nix +++ b/pkgs/development/ocaml-modules/landmarks/default.nix @@ -5,23 +5,31 @@ ocaml, }: -buildDunePackage { +buildDunePackage rec { pname = "landmarks"; - version = "1.4"; + version = "1.5"; minimalOCamlVersion = "4.08"; src = fetchFromGitHub { owner = "LexiFi"; repo = "landmarks"; - rev = "b0c753cd2a4c4aa00dffdd3be187d8ed592fabf7"; - hash = "sha256-Wpr76JURUFrj7v39rdM/2Lr7boa7nL/bnPEz1vMrmQo"; + tag = "v${version}"; + hash = "sha256-eIq02D19OzDOrMDHE1Ecrgk+T6s9vj2X6B2HY+z+K8Q="; }; doCheck = lib.versionAtLeast ocaml.version "4.08" && lib.versionOlder ocaml.version "5.0"; - meta = with lib; { + meta = { + inherit (src.meta) homepage; description = "Simple Profiling Library for OCaml"; - maintainers = [ maintainers.kenran ]; - license = licenses.mit; + longDescription = '' + Landmarks is a simple profiling library for OCaml. It provides + primitives to measure time spent in portion of instrumented code. The + instrumentation of the code may either done by hand, automatically or + semi-automatically using the ppx pepreprocessor (see landmarks-ppx package). + ''; + changelog = "https://raw.githubusercontent.com/LexiFi/landmarks/refs/tags/v${version}/CHANGES.md"; + maintainers = with lib.maintainers; [ kenran ]; + license = lib.licenses.mit; }; }