Merge master into staging-nixos

This commit is contained in:
nixpkgs-ci[bot]
2026-02-27 18:13:23 +00:00
committed by GitHub
60 changed files with 739 additions and 232 deletions
+1
View File
@@ -210,6 +210,7 @@
- `mold` is now wrapped by default.
- `neovim` now disables by default the `python3` and `ruby` providers, unused by most users and reducing closure size from 365MiB to 240MiB.
### Deprecations {#sec-nixpkgs-release-26.05-lib-deprecations}
-1
View File
@@ -21810,7 +21810,6 @@
email = "aaron@bolddaemon.com";
github = "qbit";
githubId = 68368;
matrix = "@qbit:tapenet.org";
keys = [ { fingerprint = "3586 3350 BFEA C101 DB1A 4AF0 1F81 112D 62A9 ADCE"; } ];
};
qdlmcfresh = {
+1 -1
View File
@@ -78,7 +78,7 @@ luadbi-postgresql,,,,,,
luadbi-sqlite3,,,,,,
luaepnf,,,,,,
luaevent,,,,,,
luaexpat,,,,1.4.1-1,,arobyn flosse
luaexpat,,,,,,arobyn flosse
luaffi,,,https://luarocks.org/dev,,,
luafilesystem,,,,,,flosse
lualdap,,,,,,aanderse
1 name rockspec ref server version luaversion maintainers
78 luadbi-sqlite3
79 luaepnf
80 luaevent
81 luaexpat 1.4.1-1 arobyn flosse
82 luaffi https://luarocks.org/dev
83 luafilesystem flosse
84 lualdap aanderse
+7 -10
View File
@@ -10,8 +10,9 @@ let
# Partition environment variables into regular and file-based (_FILE suffix)
envVarToCredName = varName: lib.toLower varName;
partitionEnv =
env:
allEnv:
let
env = lib.filterAttrs (_name: value: value != null) allEnv;
regular = lib.filterAttrs (name: _value: !(lib.hasSuffix "_FILE" name)) env;
fileBased = lib.filterAttrs (name: _value: lib.hasSuffix "_FILE" name) env;
fileBasedTransformed = lib.mapAttrs' (
@@ -240,14 +241,6 @@ in
(coercedTo bool builtins.toJSON str)
]);
options = {
N8N_RUNNERS_CONFIG_PATH = lib.mkOption {
internal = true;
type = with lib.types; nullOr path;
default = launcherConfigFile;
description = ''
Path to the configuration file for the task runner launcher.
'';
};
N8N_RUNNERS_AUTH_TOKEN_FILE = lib.mkOption {
type = with lib.types; nullOr path;
default = cfg.environment.N8N_RUNNERS_AUTH_TOKEN_FILE;
@@ -401,7 +394,11 @@ in
after = [ "n8n.service" ];
requires = [ "n8n.service" ];
wantedBy = [ "multi-user.target" ];
environment = runnersEnv.regular // runnersEnv.fileBasedTransformed;
environment = {
N8N_RUNNERS_CONFIG_PATH = launcherConfigFile;
}
// runnersEnv.regular
// runnersEnv.fileBasedTransformed;
serviceConfig = {
Type = "simple";
ExecStart = "${lib.getExe runnersCfg.launcherPackage} ${lib.concatStringsSep " " runnerTypes}";
+112 -13
View File
@@ -7,10 +7,21 @@
let
settingsFormat = pkgs.formats.yaml { };
cfg = config.services.reaction;
inherit (lib)
mkOption
concatMapStringsSep
filterAttrs
getExe
mkDefault
mkEnableOption
mkIf
mkOption
mkPackageOption
mapAttrs
optional
optionals
optionalString
types
;
in
@@ -30,7 +41,65 @@ in
default = { };
type = types.submodule {
freeformType = settingsFormat.type;
options = { };
options = {
plugins = mkOption {
description = ''
Nixpkgs provides a `reaction-plugins` package set which includes both offical and community plugins for reaction.
To use the plugins in your module configuration, in `settings.plugins` you can use for e.g. `''${lib.getExe reaction-plugins.reaction-plugin-ipset}`
See https://reaction.ppom.me/plugins/ to configure plugins.
'';
default = { };
type = types.attrsOf (
types.submodule (
{ name, ... }:
{
options = {
enable = mkOption {
description = "enable reaction-plugin-${name}";
type = types.bool;
default = true;
};
path = mkOption {
description = "path to the plugin binary";
type = types.str;
default = "${cfg.package.plugins."reaction-plugin-${name}"}/bin/reaction-plugin-${name}";
defaultText = lib.literalExpression ''''${cfg.package.plugins."reaction-plugin-${name}"}/bin/reaction-plugin-${name}'';
};
check_root = mkOption {
description = "Whether reaction must check that the executable is owned by root";
type = types.bool;
default = true;
};
systemd = mkOption {
description = "Whether reaction must isolate the plugin using systemd's run0";
type = types.bool;
default = cfg.runAsRoot;
defaultText = "config.services.reaction.runAsRoot";
};
systemd_options = mkOption {
description = ''
A key-value map of systemd options.
Keys must be strings and values must be string arrays.
See `man systemd.directives` for all supported options, and particularly options in `man systemd.exec`
'';
type = types.attrsOf (types.listOf types.str);
default = { };
};
};
}
)
);
# Filter plugins which are disabled
apply =
self:
lib.pipe self [
(filterAttrs (name: p: p.enable))
(mapAttrs (name: p: removeAttrs p [ "enable" ]))
];
};
};
};
};
@@ -113,25 +182,39 @@ in
services.openssh.settings.LogLevel = lib.mkDefault "VERBOSE";
}
```
```nix
# core ipset plugin requires these if running as non-root
systemd.services.reaction.serviceConfig = {
CapabilityBoundingSet = [
"CAP_NET_ADMIN"
"CAP_NET_RAW"
"CAP_DAC_READ_SEARCH" # for journalctl
];
AmbientCapabilities = [
"CAP_NET_ADMIN"
"CAP_NET_RAW"
"CAP_DAC_READ_SEARCH"
];
};
```
'';
};
};
config =
let
cfg = config.services.reaction;
generatedSettings = settingsFormat.generate "reaction.yml" cfg.settings;
settingsDir = pkgs.runCommand "reaction-settings-dir" { } ''
mkdir -p $out
${lib.concatMapStringsSep "\n" (file: ''
${concatMapStringsSep "\n" (file: ''
filename=$(basename "${file}")
ln -s "${file}" "$out/$filename"
'') cfg.settingsFiles}
ln -s ${generatedSettings} $out/reaction.yml
'';
in
lib.mkIf cfg.enable {
mkIf cfg.enable {
assertions = [
{
assertion = cfg.settings != { } || (builtins.length cfg.settingsFiles) != 0;
@@ -139,7 +222,7 @@ in
}
];
users = lib.mkIf (!cfg.runAsRoot) {
users = mkIf (!cfg.runAsRoot) {
users.reaction = {
isSystemUser = true;
group = "reaction";
@@ -148,27 +231,29 @@ in
};
system.checks =
lib.optional (cfg.checkConfig && pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform)
optional (cfg.checkConfig && pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform)
(
pkgs.runCommand "reaction-config-validation" { } ''
${lib.getExe cfg.package} test-config -c ${settingsDir} >/dev/null
${getExe cfg.package} test-config -c ${settingsDir} >/dev/null
echo "reaction config ${settingsDir} is valid"
touch $out
''
);
systemd.services.reaction = {
description = "Scan logs and take action";
description = "A daemon that scans program outputs for repeated patterns, and takes action.";
documentation = [ "https://reaction.ppom.me" ];
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
partOf = lib.optionals cfg.stopForFirewall [ "firewall.service" ];
partOf = optionals cfg.stopForFirewall [ "firewall.service" ];
path = [ pkgs.iptables ];
serviceConfig = {
Type = "simple";
KillMode = "mixed"; # for plugins
User = if (!cfg.runAsRoot) then "reaction" else "root";
ExecStart = ''
${lib.getExe cfg.package} start -c ${settingsDir}${
lib.optionalString (cfg.loglevel != null) " -l ${cfg.loglevel}"
${getExe cfg.package} start -c ${settingsDir}${
optionalString (cfg.loglevel != null) " -l ${cfg.loglevel}"
}
'';
@@ -197,6 +282,20 @@ in
};
};
# pre-configure official plugins
services.reaction.settings.plugins = {
ipset = {
enable = mkDefault true;
systemd_options = {
CapabilityBoundingSet = [
"~CAP_NET_ADMIN"
"~CAP_PERFMON"
];
};
};
virtual.enable = mkDefault true;
};
environment.systemPackages = [ cfg.package ];
};
+4 -2
View File
@@ -1386,8 +1386,10 @@ in
rasdaemon = runTest ./rasdaemon.nix;
rathole = runTest ./rathole.nix;
rauc = runTest ./rauc.nix;
reaction = runTest ./reaction.nix;
reaction-firewall = runTest ./reaction-firewall.nix;
reaction = import ./reaction {
inherit (pkgs) lib;
inherit runTest;
};
readarr = runTest ./readarr.nix;
readeck = runTest ./readeck.nix;
realm = runTest ./realm.nix;
+37 -29
View File
@@ -16,9 +16,11 @@ in
node.pkgsReadOnly = false;
nodes.machine =
{ ... }:
{
nodes = {
machine_simple = {
services.n8n.enable = true;
};
machine_configured = {
services.n8n = {
enable = true;
customNodes = [ pkgs.n8n-nodes-carbonejs ];
@@ -49,52 +51,58 @@ in
};
};
};
};
testScript = ''
machine.wait_for_unit("n8n.service")
machine.wait_for_console_text("Editor is now accessible via")
machine_simple.wait_for_unit("n8n.service")
machine_simple.wait_for_console_text("Editor is now accessible via")
machine_simple.succeed("curl --fail -vvv http://localhost:${toString port}/")
machine_configured.wait_for_unit("n8n.service")
machine_configured.wait_for_console_text("Editor is now accessible via")
# Test regular environment variables
machine.succeed("curl --fail -vvv http://localhost:${toString port}/")
machine.succeed("grep -qF ${webhookUrl} /etc/systemd/system/n8n.service")
machine.succeed("grep -qF 'HOME=/var/lib/n8n' /etc/systemd/system/n8n.service")
machine.fail("grep -qF 'GENERIC_TIMEZONE=' /etc/systemd/system/n8n.service")
machine.succeed("grep -qF 'N8N_DIAGNOSTICS_ENABLED=false' /etc/systemd/system/n8n.service")
machine.succeed("grep -qF 'N8N_TEMPLATES_ENABLED=false' /etc/systemd/system/n8n.service")
machine.succeed("grep -qF 'DB_PING_INTERVAL_SECONDS=2' /etc/systemd/system/n8n.service")
machine_configured.succeed("curl --fail -vvv http://localhost:${toString port}/")
machine_configured.succeed("grep -qF ${webhookUrl} /etc/systemd/system/n8n.service")
machine_configured.succeed("grep -qF 'HOME=/var/lib/n8n' /etc/systemd/system/n8n.service")
machine_configured.fail("grep -qF 'GENERIC_TIMEZONE=' /etc/systemd/system/n8n.service")
machine_configured.succeed("grep -qF 'N8N_DIAGNOSTICS_ENABLED=false' /etc/systemd/system/n8n.service")
machine_configured.succeed("grep -qF 'N8N_TEMPLATES_ENABLED=false' /etc/systemd/system/n8n.service")
machine_configured.succeed("grep -qF 'DB_PING_INTERVAL_SECONDS=2' /etc/systemd/system/n8n.service")
# Test _FILE environment variables
machine.succeed("grep -qF 'LoadCredential=n8n_encryption_key_file:${secretFile}' /etc/systemd/system/n8n.service")
machine.succeed("grep -qF 'N8N_ENCRYPTION_KEY_FILE=%d/n8n_encryption_key_file' /etc/systemd/system/n8n.service")
machine_configured.succeed("grep -qF 'LoadCredential=n8n_encryption_key_file:${secretFile}' /etc/systemd/system/n8n.service")
machine_configured.succeed("grep -qF 'N8N_ENCRYPTION_KEY_FILE=%d/n8n_encryption_key_file' /etc/systemd/system/n8n.service")
# Test custom nodes
machine.succeed("grep -qF 'N8N_CUSTOM_EXTENSIONS=' /etc/systemd/system/n8n.service")
custom_extensions_dir = machine.succeed("grep -oP 'N8N_CUSTOM_EXTENSIONS=\\K[^\"]+' /etc/systemd/system/n8n.service").strip()
machine.succeed(f"test -L {custom_extensions_dir}/n8n-nodes-carbonejs")
machine.succeed(f"test -f {custom_extensions_dir}/n8n-nodes-carbonejs/package.json")
machine_configured.succeed("grep -qF 'N8N_CUSTOM_EXTENSIONS=' /etc/systemd/system/n8n.service")
custom_extensions_dir = machine_configured.succeed("grep -oP 'N8N_CUSTOM_EXTENSIONS=\\K[^\"]+' /etc/systemd/system/n8n.service").strip()
machine_configured.succeed(f"test -L {custom_extensions_dir}/n8n-nodes-carbonejs")
machine_configured.succeed(f"test -f {custom_extensions_dir}/n8n-nodes-carbonejs/package.json")
# Test task runner integration on n8n service
machine.succeed("grep -qF 'N8N_RUNNERS_MODE=external' /etc/systemd/system/n8n.service")
machine.succeed("grep -qF 'N8N_RUNNERS_BROKER_PORT=${toString brokerPort}' /etc/systemd/system/n8n.service")
machine.succeed("grep -qF 'LoadCredential=n8n_runners_auth_token_file:${authTokenFile}' /etc/systemd/system/n8n.service")
machine_configured.succeed("grep -qF 'N8N_RUNNERS_MODE=external' /etc/systemd/system/n8n.service")
machine_configured.succeed("grep -qF 'N8N_RUNNERS_BROKER_PORT=${toString brokerPort}' /etc/systemd/system/n8n.service")
machine_configured.succeed("grep -qF 'LoadCredential=n8n_runners_auth_token_file:${authTokenFile}' /etc/systemd/system/n8n.service")
# Test task runner service
machine.wait_for_unit("n8n-task-runner.service")
machine.succeed("systemctl is-active n8n-task-runner.service")
machine_configured.wait_for_unit("n8n-task-runner.service")
machine_configured.succeed("systemctl is-active n8n-task-runner.service")
# Test that both runner types are enabled
machine.succeed("grep -qF 'javascript python' /etc/systemd/system/n8n-task-runner.service")
machine_configured.succeed("grep -qF 'javascript python' /etc/systemd/system/n8n-task-runner.service")
# Test common environment variables are passed to launcher
machine.succeed("grep -qF 'N8N_RUNNERS_MAX_CONCURRENCY=10' /etc/systemd/system/n8n-task-runner.service")
machine.succeed("grep -qF 'N8N_RUNNERS_TASK_BROKER_URI=http://127.0.0.1:${toString brokerPort}' /etc/systemd/system/n8n-task-runner.service")
machine_configured.succeed("grep -qF 'N8N_RUNNERS_MAX_CONCURRENCY=10' /etc/systemd/system/n8n-task-runner.service")
machine_configured.succeed("grep -qF 'N8N_RUNNERS_TASK_BROKER_URI=http://127.0.0.1:${toString brokerPort}' /etc/systemd/system/n8n-task-runner.service")
# Test auth token is loaded via credentials
machine.succeed("grep -qF 'LoadCredential=n8n_runners_auth_token_file:${authTokenFile}' /etc/systemd/system/n8n-task-runner.service")
machine_configured.succeed("grep -qF 'LoadCredential=n8n_runners_auth_token_file:${authTokenFile}' /etc/systemd/system/n8n-task-runner.service")
# Test launcher config file
config_path = machine.succeed("grep -oP 'N8N_RUNNERS_CONFIG_PATH=\\K[^[:space:]\"]+' /etc/systemd/system/n8n-task-runner.service").strip()
config = machine.succeed(f"cat {config_path}")
config_path = machine_configured.succeed("grep -oP 'N8N_RUNNERS_CONFIG_PATH=\\K[^[:space:]\"]+' /etc/systemd/system/n8n-task-runner.service").strip()
config = machine_configured.succeed(f"cat {config_path}")
assert "NODE_FUNCTION_ALLOW_BUILTIN" in config, "JavaScript env-override not in config"
assert "N8N_RUNNERS_STDLIB_ALLOW" in config, "Python env-override not in config"
assert "N8N_RUNNERS_MAX_CONCURRENCY" in config, "Common allowed-env not in config"
@@ -10,7 +10,7 @@
services.reaction = {
enable = true;
stopForFirewall = false;
# example.jsonnet/example.yml can be copied and modified from ${pkgs.reaction}/share/examples
# example.jsonnet or example.yml can be copied and modified from ${pkgs.reaction}/share/examples
settingsFiles = [ "${pkgs.reaction}/share/examples/example.jsonnet" ];
runAsRoot = false;
};
@@ -92,6 +92,7 @@
{
# not needed, only for manual interactive debugging
virtualisation.memorySize = 4096;
virtualisation.graphics = false;
environment.systemPackages = with pkgs; [
btop
sysz
+6
View File
@@ -0,0 +1,6 @@
{ lib, runTest }:
lib.recurseIntoAttrs {
basic = runTest ./basic.nix;
firewall = runTest ./firewall.nix;
plugins = runTest ./plugins.nix;
}
@@ -17,6 +17,12 @@
# "${pkgs.reaction}/share/examples/example.yml" # can't specify both because conflicts
];
runAsRoot = true;
settings = {
# In the qemu vm `run0 ls` as root prints nothing, so we can't use it
# see https://reaction.ppom.me/reference.html#systemd
plugins.ipset.systemd = false;
plugins.virtual.systemd = false;
};
};
networking.firewall.enable = true;
};
@@ -68,6 +74,9 @@
# - nix run .#nixosTests.reaction-firewall.driverInteractive -L
# - run_tests()
interactive.sshBackdoor.enable = true; # ssh -o User=root vsock%3
interactive.nodes.machine = _: {
virtualisation.graphics = false;
};
meta.maintainers =
with lib.maintainers;
+125
View File
@@ -0,0 +1,125 @@
{
lib,
pkgs,
...
}:
{
name = "reaction-core-plugins";
nodes.server = args: {
services.reaction = {
enable = true;
stopForFirewall = false;
runAsRoot = false;
settings = import ./settings.nix args;
/*
# NOTE: When runAsRoot is true, disable run0
settings = {
# In the qemu vm `run0 ls` as root prints nothing, so we can't use it
# see https://reaction.ppom.me/reference.html#systemd
plugins.ipset.systemd = false;
plugins.virtual.systemd = false;
};
*/
};
/*
NOTE:
- if reaction is run as non-root, the plugins need these capabilities, remove these if runAsRoot is true
- CAP_DAC_READ_SEARCH is for journalctl for accessing ssh logs
- useful tools: capable (from package bcc), captree, getpcaps (from libpcap)
*/
systemd.services.reaction.serviceConfig = {
CapabilityBoundingSet = [
"CAP_NET_ADMIN"
"CAP_NET_RAW"
"CAP_DAC_READ_SEARCH"
];
AmbientCapabilities = [
"CAP_NET_ADMIN"
"CAP_NET_RAW"
"CAP_DAC_READ_SEARCH"
];
};
services.openssh.enable = true;
users.users.nixos.isNormalUser = true; # neeeded to establish a ssh connection, by default root login is succeeding without any password
};
nodes.client = _: {
environment.systemPackages = [
pkgs.sshpass
pkgs.libressl.nc
];
};
testScript =
{ nodes, ... }: # py
''
start_all()
# Wait for everything to be ready.
server.wait_for_unit("multi-user.target")
server.wait_for_unit("reaction")
server.wait_for_unit("sshd")
client_addr = "${(lib.head nodes.client.networking.interfaces.eth1.ipv4.addresses).address}"
server_addr = "${(lib.head nodes.server.networking.interfaces.eth1.ipv4.addresses).address}"
# Verify there is not ban and the port is reachable from the client.
server.succeed(f"reaction show | grep -q {client_addr} || test $? -eq 1")
client.succeed(f"nc -w3 -z {server_addr} 22")
# Cause authentication failure log entries.
for _ in range(2):
client.fail(f"""
sshpass -p 'wrongpassword' \
ssh -o StrictHostKeyChecking=no \
-o User=nixos \
-o ServerAliveInterval=1 \
-o ServerAliveCountMax=2 \
{server_addr}
""")
# Verify there is a ban and the port is unreachable from the client.
server.sleep(2)
output = server.succeed("reaction show")
print(output)
assert client_addr in output, f"client did not get banned, {client_addr}"
client.fail(f"nc -w3 -z {server_addr} 22")
# Check that unbanning works
output = server.succeed("reaction flush")
print(output)
client.succeed(f"nc -w3 -z {server_addr} 22")
'';
# Debug interactively with:
# - nix run .#nixosTests.reaction.driverInteractive -L
# - run_tests()
# ssh -o User=root vsock%3 (can also do vsock/3, but % works with scp etc.)
# ssh -o User=root vsock%4
interactive.sshBackdoor.enable = true;
interactive.nodes.server =
{ config, ... }:
{
# not needed, only for manual interactive debugging
virtualisation.memorySize = 4096;
virtualisation.graphics = false;
environment.systemPackages = with pkgs; [
btop
sysz
sshpass
libressl.nc
];
};
meta.maintainers =
with lib.maintainers;
[
ppom
]
++ lib.teams.ngi.members;
}
+74
View File
@@ -0,0 +1,74 @@
{ config, ... }:
let
banFor = name: duration: {
ban = {
type = "ipset";
options = {
set = "reaction-${name}";
action = "add";
};
};
unban = {
after = duration;
type = "ipset";
options = {
set = "reaction-${name}";
action = "del";
};
};
};
journalctl = "${config.systemd.package}/bin/journalctl";
in
{
patterns = {
ip = {
type = "ip";
ipv6mask = 64;
ignore = [
"127.0.0.1"
"::1"
];
ignorecidr = [
"10.1.1.0/24"
"2a01:e0a:b3a:1dd0::/64"
];
};
};
streams = {
ssh = {
cmd = [
journalctl
"-fn0"
"-o"
"cat"
"-u"
"sshd.service"
];
filters = {
failedlogin = {
regex = [
"authentication failure;.*rhost=<ip>(?: |$)"
"Failed password for .* from <ip> port"
"Invalid user .* from <ip> "
"Connection (?:reset|closed) by invalid user .* <ip> port"
];
retry = 2;
retryperiod = "6h";
actions = banFor "ssh" "48h";
};
connectionreset = {
regex = [
"Connection (?:reset|closed) by(?: authenticating user .*)? <ip> port"
"Received disconnect from <ip> port .*[preauth]"
"Timeout before authentication for connection from <ip> to"
];
retry = 2;
retryperiod = "6h";
actions = banFor "sshreset" "48h";
};
};
};
};
}
+3 -3
View File
@@ -177,7 +177,7 @@ let
# the function you would have passed to python.withPackages
extraPythonPackages ? (_: [ ]),
# the function you would have passed to python.withPackages
withPython3 ? true,
withPython3 ? false,
extraPython3Packages ? (_: [ ]),
# the function you would have passed to lua.withPackages
extraLuaPackages ? (_: [ ]),
@@ -243,9 +243,9 @@ let
*/
generateProviderRc =
{
withPython3 ? true,
withPython3 ? false,
withNodeJs ? false,
withRuby ? true,
withRuby ? false,
# Perl is problematic https://github.com/NixOS/nixpkgs/issues/132368
withPerl ? false,
+2 -2
View File
@@ -37,14 +37,14 @@ let
# should contain all args but the binary. Can be either a string or list
wrapperArgs ? [ ],
withPython2 ? false,
withPython3 ? true,
withPython3 ? false,
# the function you would have passed to python3.withPackages
extraPython3Packages ? (_: [ ]),
waylandSupport ? lib.meta.availableOn stdenv.hostPlatform wayland,
withNodeJs ? false,
withPerl ? false,
withRuby ? true,
withRuby ? false,
# wether to create symlinks in $out/bin/vi(m) -> $out/bin/nvim
vimAlias ? false,
+3 -3
View File
@@ -9,14 +9,14 @@
rustPlatform.buildRustPackage rec {
pname = "cargo-public-api";
version = "0.50.2";
version = "0.51.0";
src = fetchCrate {
inherit pname version;
hash = "sha256-Lg8X0t5u4Mq/eWc0yfuLyn4HlE+j6qSsLE+MFBjBpbk=";
hash = "sha256-fnkoIXv6QYJPYtsLZldOEjOxke6YVDEds3jF5SGZGKE=";
};
cargoHash = "sha256-OjuCABObMRkFrTbtV4wpSHzV9Yqmwr/VotmsUW9qUDk=";
cargoHash = "sha256-F4s3h+WF/S6sQ9ux28sqNe9+C1I5H9735b+cVuRFjk8=";
nativeBuildInputs = [ pkg-config ];
+3 -3
View File
@@ -14,15 +14,15 @@
stdenv.mkDerivation (finalAttrs: {
pname = "foomatic-db";
version = "0-unstable-2026-01-13";
version = "0-unstable-2026-02-09";
src = fetchFromGitHub {
# there is also a daily snapshot at the `downloadPage`,
# but it gets deleted quickly and would provoke 404 errors
owner = "OpenPrinting";
repo = "foomatic-db";
rev = "abdfdb89a56edb0d1b7e0de2e01ce30cd0dbed22";
hash = "sha256-D0ULsTIVv7rJWdgK9EqH7visZoJONc8zGsV0r1uVNKE=";
rev = "57e546cb7774c7b03e7090ced65fb1ffd552f33d";
hash = "sha256-mQEOV+NJId5h/hYOL+2JrEHjqM77qRExDNeqZ0IyA08=";
};
buildInputs = [
+2 -2
View File
@@ -110,8 +110,8 @@ stdenv.mkDerivation (finalAttrs: {
cp -R FreeFileSync/Build/* $out
mv $out/{Bin,bin}
mkdir -p $out/share/pixmaps
unzip -j $out/Resources/Icons.zip '*Sync.png' -d $out/share/pixmaps
mkdir -p $out/share/icons/hicolor/128x128/apps
unzip -j $out/Resources/Icons.zip '*Sync.png' -d $out/share/icons/hicolor/128x128/apps
runHook postInstall
'';
+2 -2
View File
@@ -70,13 +70,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "freerdp";
version = "3.22.0";
version = "3.23.0";
src = fetchFromGitHub {
owner = "FreeRDP";
repo = "FreeRDP";
rev = finalAttrs.version;
hash = "sha256-cJFY0v2zvbaKVINOKVZGvLozwgD7kf2ffVU9EGYBMGQ=";
hash = "sha256-WGuRnNwcvxwIudSzPoJB4BmaTLHKU7bsZkgWmzJPLSQ=";
};
postPatch = ''
@@ -20,14 +20,14 @@ let
in
stdenv.mkDerivation (finalAttrs: {
pname = "incus-ui-canonical";
version = "0.19.7";
version = "0.19.8";
src = fetchFromGitHub {
owner = "zabbly";
repo = "incus-ui-canonical";
# only use tags prefixed by incus- they are the tested fork versions
tag = "incus-${finalAttrs.version}";
hash = "sha256-YMUGEHhfwDzasSZOqnlhb7zw5qG+LRlKhIHCuAztu2M=";
hash = "sha256-Dql04inmmWi7X6dQdjJmw0hkIBxlNlnwlTrK3/EN3yA=";
};
offlineCache = fetchYarnDeps {
+3 -3
View File
@@ -8,16 +8,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "jnv";
version = "0.6.1";
version = "0.6.2";
src = fetchFromGitHub {
owner = "ynqa";
repo = "jnv";
tag = "v${finalAttrs.version}";
hash = "sha256-VjT0S+eEaO8FOPb1grIpheeP9v1dCpV7FRHn+nJXOEM=";
hash = "sha256-sW3wy5m3fnTDIxRC/E/EWEvuJ92o+l4QCmwdqL2tZ98=";
};
cargoHash = "sha256-dR9cb3TBxrRGP3BFYro/nGe5XVEfJuTZbQLo+FUfFNs=";
cargoHash = "sha256-jKeAgeW54lAgcv6Xpz9Rwt10tdac4S4B5EAmwanaW9c=";
nativeInstallCheckInputs = [ versionCheckHook ];
doInstallCheck = true;
+3 -3
View File
@@ -9,16 +9,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "kaput-cli";
version = "2.5.0";
version = "2.6.0";
src = fetchFromGitHub {
owner = "davidchalifoux";
repo = "kaput-cli";
tag = "v${finalAttrs.version}";
hash = "sha256-sy8k9L9rmiRFzvhLc+hYl9OqmmP8INLxMNRjAx7/V8g=";
hash = "sha256-N+vdK9DpooPEtXVUNZtmbdjVSpN5ddYggb4FsrvyCwU=";
};
cargoHash = "sha256-yb56rrPlTuc7O4fF9NPNB2djCfq3fLu2hD4gUjRHvqM=";
cargoHash = "sha256-bz7K3eWv9i50k5nXBb9k8IZ+xPIz4PSomp6K2LDSH78=";
env = {
OPENSSL_NO_VENDOR = 1;
+3 -3
View File
@@ -17,13 +17,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "lxcfs";
version = "6.0.5";
version = "6.0.6";
src = fetchFromGitHub {
owner = "lxc";
repo = "lxcfs";
tag = "v${finalAttrs.version}";
hash = "sha256-mRTM06QyWcB4XOi0w2qvyDABGuu1SPJX0gjlBktDOac=";
hash = "sha256-lEXXbYDxnOi4Xa/fO1Uy/aVLjVfzYeZm6qzR4XBMBsY=";
};
patches = [
@@ -85,7 +85,7 @@ stdenv.mkDerivation (finalAttrs: {
description = "FUSE filesystem for LXC";
mainProgram = "lxcfs";
homepage = "https://linuxcontainers.org/lxcfs";
changelog = "https://linuxcontainers.org/lxcfs/news/";
changelog = "https://github.com/lxc/lxcfs/releases/tag/v${finalAttrs.version}";
license = lib.licenses.asl20;
platforms = lib.platforms.linux;
teams = [ lib.teams.lxc ];
+3 -3
View File
@@ -14,13 +14,13 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "moonlight";
version = "2026.2.1";
version = "2026.2.2";
src = fetchFromGitHub {
owner = "moonlight-mod";
repo = "moonlight";
tag = "v${finalAttrs.version}";
hash = "sha256-BpTN9AdQEDD2XnEUsUxgkoq+EPGhtnYgJhLKF4GVZoc=";
hash = "sha256-wZEpoUlDEbObXD5d2uA5vNBRrFOw4A6VLAc/MVNC4EE=";
};
nativeBuildInputs = [
@@ -32,7 +32,7 @@ stdenv.mkDerivation (finalAttrs: {
pnpmDeps = fetchPnpmDeps {
inherit (finalAttrs) pname version src;
fetcherVersion = 3;
hash = "sha256-b3d8VcfQjCkcJThebXJ2yvKZfU8u4QnpZgNyqP6XIu0=";
hash = "sha256-1jGEzTPPlwAFDKPbH92HvYg4rzFrUJLqhZRMNS+H6GI=";
};
env = {
+3 -3
View File
@@ -25,20 +25,20 @@ let
in
stdenv.mkDerivation (finalAttrs: {
pname = "n8n";
version = "2.8.3";
version = "2.9.4";
src = fetchFromGitHub {
owner = "n8n-io";
repo = "n8n";
tag = "n8n@${finalAttrs.version}";
hash = "sha256-xbJZD+L/8ZK7GPqFKO6H/Cg40Pk2cqN3MWC+mNFVxbI=";
hash = "sha256-XXQPZHtY66gOQ+nYH+Q1IjbR+SRZ9g06sgBy2x8gGh4=";
};
pnpmDeps = fetchPnpmDeps {
inherit (finalAttrs) pname version src;
pnpm = pnpm_10;
fetcherVersion = 3;
hash = "sha256-gX4pYiztKIRFbJNZhtQviWpp80teOzX1JaYKylGe4TY=";
hash = "sha256-TU7HIShYj20QtdcthP0nQdubYl0bdy+XM3CoX5Rvhzk=";
};
nativeBuildInputs = [
-1
View File
@@ -23,7 +23,6 @@ let
maintainers = with lib.maintainers; [
conradmearns
zaninime
qbit
kashw2
w-lfchen
];
+27 -40
View File
@@ -1,47 +1,46 @@
{
autoPatchelfHook,
copyDesktopItems,
clangStdenv,
fetchFromGitHub,
fpc,
lazarus-qt6,
lib,
libGLU,
makeDesktopItem,
libx11,
makeWrapper,
nix-update-script,
qt6Packages,
stdenv,
SDL2,
vulkan-loader,
zlib,
}:
stdenv.mkDerivation (finalAttrs: {
clangStdenv.mkDerivation (finalAttrs: {
pname = "pascube";
version = "1.5.1";
version = "1.7.0";
src = fetchFromGitHub {
owner = "benjamimgois";
repo = "pascube";
tag = "v${finalAttrs.version}";
hash = "sha256-djkrMgX3RTTXSLISYpBfdyCIh3/WWODxd473M53iFKE=";
tag = finalAttrs.version;
hash = "sha256-qKjOA5/l2trQC238WheeOzqbpltjkwksqzMtcfw7ci0=";
};
nativeBuildInputs = [
autoPatchelfHook
copyDesktopItems
fpc
lazarus-qt6
makeWrapper
qt6Packages.wrapQtAppsHook
];
buildInputs = [
qt6Packages.libqtpas
qt6Packages.qtbase
];
runtimeDependencies = [
libGLU
SDL2
];
buildPhase = ''
runHook preBuild
clang -c -O3 -D linux -fverbose-asm -fno-builtin \
pasvulkan/src/lzma_c/LzmaDec.c -o pasvulkan/src/lzma_c/lzmadec_linux_x86_64.o
HOME=$(mktemp -d) lazbuild \
--lazarusdir=${lazarus-qt6}/share/lazarus \
--widgetset=qt6 \
@@ -52,45 +51,33 @@ stdenv.mkDerivation (finalAttrs: {
installPhase = ''
runHook preInstall
install -Dm755 pascube $out/bin/pascube
wrapProgram $out/bin/pascube --prefix LD_LIBRARY_PATH : ${
lib.makeLibraryPath [
libx11
SDL2
vulkan-loader
zlib
]
}
mkdir -p $out/share/pascube
cp -a assets $out/share/pascube
install -Dm644 data/pascube.desktop $out/share/applications/pascube.desktop
for sz in 128x128 256x256 512x512; do
install -Dm644 "data/icons/''${sz}/pascube.png" \
"$out/share/icons/hicolor/''${sz}/apps/pascube.png"
done
install -Dm644 "data/skybox.png" "$out/share/pascube/skybox.png"
runHook postInstall
'';
desktopItems = [
(makeDesktopItem {
name = "pascube";
desktopName = "pasCube";
comment = finalAttrs.meta.description;
exec = finalAttrs.meta.mainProgram;
icon = "pascube";
terminal = false;
categories = [
"Graphics"
"Education"
"Qt"
];
})
];
preFixup = ''
qtWrapperArgs+=(
--set QT_QPA_PLATFORM xcb
)
'';
passthru.updateScript = nix-update-script { };
meta = {
description = "Simple OpenGL spinning cube written in Pascal";
homepage = "https://github.com/benjamimgois/pascube";
changelog = "https://github.com/benjamimgois/pascube/releases/tag/v${finalAttrs.version}";
changelog = "https://github.com/benjamimgois/pascube/releases/tag/${finalAttrs.version}";
license = lib.licenses.gpl2Plus;
maintainers = with lib.maintainers; [ RoGreat ];
mainProgram = "pascube";
platforms = lib.platforms.linux;
platforms = [ "x86_64-linux" ];
};
})
+2 -2
View File
@@ -11,11 +11,11 @@
stdenv.mkDerivation (finalAttrs: {
pname = "passt";
version = "2026_01_20.386b5f5";
version = "2025_09_19.623dbf6";
src = fetchurl {
url = "https://passt.top/passt/snapshot/passt-${finalAttrs.version}.tar.gz";
hash = "sha256-s3izbMbReYj9jv3J5DJJWvyWeHw+4jGu5VvH5QxO320=";
hash = "sha256-3krWW/QKijgZsmHuelMjpcaL8OyRqmPKC/wUvag0ZHI=";
};
separateDebugInfo = true;
@@ -0,0 +1,24 @@
From dc51d7d432eeb408551ae84c6b08d172efbf4649 Mon Sep 17 00:00:00 2001
From: ppom <reaction@ppom.me>
Date: Tue, 17 Feb 2026 12:00:00 +0100
Subject: [PATCH] Add support for macOS
---
src/concepts/plugin.rs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/concepts/plugin.rs b/src/concepts/plugin.rs
index c5bc330..8c3c142 100644
--- a/src/concepts/plugin.rs
+++ b/src/concepts/plugin.rs
@@ -1,5 +1,7 @@
use std::{collections::BTreeMap, io::Error, path, process::Stdio};
+#[cfg(target_os = "macos")]
+use std::os::darwin::fs::MetadataExt;
#[cfg(target_os = "freebsd")]
use std::os::freebsd::fs::MetadataExt;
#[cfg(target_os = "illumos")]
--
GitLab
+20 -9
View File
@@ -1,26 +1,34 @@
{
lib,
stdenv,
nixosTests,
callPackage,
rustPlatform,
fetchFromGitLab,
versionCheckHook,
installShellFiles,
nix-update-script,
nixosTests,
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "reaction";
version = "2.2.1";
version = "2.3.0";
src = fetchFromGitLab {
domain = "framagit.org";
owner = "ppom";
repo = "reaction";
tag = "v${finalAttrs.version}";
hash = "sha256-81i0bkrf86adQWxeZgIoZp/zQQbRJwPqQqZci0ANRFw=";
hash = "sha256-OvNJsR9W5MlicqUpr1aOLJ7pI7H7guq1vAlC/hh1Q2o=";
};
cargoHash = "sha256-Bf9XmlY0IMPY4Convftd0Hv8mQbYoiE8WrkkAeaS6Z8=";
patches = [
# remove patch in next tagged version
./add-support-for-macos.patch
];
cargoHash = "sha256-BOFZlVBKf6fjW1L1J8u7Vf+fzNJHlEtQI6YafDjlZ4U=";
nativeBuildInputs = [ installShellFiles ];
@@ -40,13 +48,13 @@ rustPlatform.buildRustPackage (finalAttrs: {
# flaky and fails in hydra
"--skip=concepts::config::tests::merge_config_distinct_concurrency"
];
cargoTestFlags = [
# Skip integration tests for the same reason
"--lib"
];
postInstall = ''
installBin $releaseDir/ip46tables $releaseDir/nft46
installManPage $releaseDir/reaction*.1
installShellCompletion --cmd reaction \
--bash $releaseDir/reaction.bash \
@@ -60,17 +68,20 @@ rustPlatform.buildRustPackage (finalAttrs: {
versionCheckProgramArg = "--version";
doInstallCheck = true;
passthru.updateScript = nix-update-script { };
passthru.tests = { inherit (nixosTests) reaction reaction-firewall; };
passthru = {
inherit (callPackage ./plugins { }) mkReactionPlugin plugins;
updateScript = nix-update-script { };
tests = nixosTests.reaction;
};
meta = {
changelog = "https://framagit.org/ppom/reaction/-/releases/v${finalAttrs.version}";
description = "Scan logs and take action: an alternative to fail2ban";
homepage = "https://framagit.org/ppom/reaction";
changelog = "https://framagit.org/ppom/reaction/-/releases/v${finalAttrs.version}";
license = lib.licenses.agpl3Plus;
mainProgram = "reaction";
maintainers = with lib.maintainers; [ ppom ];
teams = [ lib.teams.ngi ];
platforms = lib.platforms.unix;
teams = [ lib.teams.ngi ];
};
})
@@ -0,0 +1,37 @@
{
lib,
rustPlatform,
callPackage,
reaction,
}:
{
# NOTE: plugins are binaries, so no special integration with the derivation is required
# mkReactionPlugin is meant for only official plugins living in the reaction source tree
mkReactionPlugin =
name: extra:
rustPlatform.buildRustPackage (
{
pname = name;
inherit (reaction) version src cargoHash;
buildAndTestSubdir = "plugins/${name}";
meta = {
changelog = "https://framagit.org/ppom/reaction/-/releases/v${reaction.version}";
description = "Official reaction plugin ${name}";
homepage = "https://framagit.org/ppom/reaction";
license = lib.licenses.agpl3Plus;
mainProgram = name;
maintainers = with lib.maintainers; [ ppom ];
platforms = lib.platforms.unix;
teams = [ lib.teams.ngi ];
};
}
// extra
);
# capture all plugins except default.nix (this file)
plugins = lib.removeAttrs (lib.packagesFromDirectoryRecursive {
inherit callPackage;
directory = ./.;
}) [ "default" ];
}
@@ -0,0 +1,14 @@
{
ipset,
pkg-config,
rustPlatform,
reaction,
...
}:
reaction.mkReactionPlugin "reaction-plugin-ipset" {
buildInputs = [ ipset ];
nativeBuildInputs = [
rustPlatform.bindgenHook
pkg-config
];
}
@@ -0,0 +1,5 @@
{
reaction,
...
}:
reaction.mkReactionPlugin "reaction-plugin-virtual" { }
+3 -3
View File
@@ -7,18 +7,18 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "sizelint";
version = "0.1.4";
version = "0.1.5";
src = fetchFromGitHub {
owner = "a-kenji";
repo = "sizelint";
tag = "v${finalAttrs.version}";
hash = "sha256-1k1+7fVWhflEKyhOlb7kMn2xqeAM6Y5N9uHtOJvVn4A=";
hash = "sha256-m8Pd7Bnz++5k6J4stbKVd8Y596Y+52xbF0zFJVhdfzI=";
};
nativeCheckInputs = [ git ];
cargoHash = "sha256-Z+pmlp/0LlKfc4QLosePw7TdLFYe6AnAVOJSw2DzlfI=";
cargoHash = "sha256-7cDZrRNTGPdzbvVNt3/HTp7PgoH2txX26RCxdpeo4dM=";
meta = {
description = "Lint your file tree based on file sizes";
+3 -3
View File
@@ -22,13 +22,13 @@
stdenv.mkDerivation {
pname = "slade";
version = "3.2.11-unstable-2026-02-18";
version = "3.2.12-unstable-2026-02-21";
src = fetchFromGitHub {
owner = "sirjuddington";
repo = "SLADE";
rev = "3615810ce2aee36909fb0a1a1e8a605edc2caf81";
hash = "sha256-/70LynJvcrjM4ztudaPp2pv6hPy+TQXwafwLj0n7T8E=";
rev = "030cab09eb2108c65b47c088d1ce97d27e671b9a";
hash = "sha256-dU08yoHikQsGO9yEhFoRvWE1C38ZQ1W/f7DmJyrAijQ=";
};
nativeBuildInputs = [
+1 -1
View File
@@ -48,7 +48,7 @@ buildGoModule rec {
description = "Step plugin to manage keys and certificates on cloud KMSs and HSMs";
homepage = "https://smallstep.com/cli/";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ qbit ];
maintainers = [ ];
mainProgram = "step-kms-plugin";
};
}
+5 -2
View File
@@ -3,15 +3,16 @@
fetchurl,
stdenv,
undmg,
nix-update-script,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "syncthing-macos";
version = "1.30.0-1";
version = "2.0.14-1";
src = fetchurl {
url = "https://github.com/syncthing/syncthing-macos/releases/download/v${finalAttrs.version}/Syncthing-${finalAttrs.version}.dmg";
hash = "sha256-9kerr89PZ90fQwxPfqrSlujuLYY9THv6Ne/cUErt3YU=";
hash = "sha256-5BjYwS2xcANqEXWadbppUwIGNd1UTQjzhWIAyATwWEU=";
};
nativeBuildInputs = [ undmg ];
@@ -27,6 +28,8 @@ stdenv.mkDerivation (finalAttrs: {
runHook postInstall
'';
updateScript = nix-update-script { extraArgs = [ "--use-github-releases" ]; };
meta = {
description = "Official frugal and native macOS Syncthing application bundle";
homepage = "https://github.com/syncthing/syncthing-macos";
-1
View File
@@ -219,7 +219,6 @@ buildNpmPackage (finalAttrs: {
license = lib.licenses.mit;
maintainers = with lib.maintainers; [
gerg-l
qbit
spikespaz
];
# `castlabs-electron` doesn't have a distribution for `aarch64-linux`.
+4 -1
View File
@@ -9,6 +9,9 @@
pkg-config,
}:
let
zlib' = zlib.override { static = false; };
in
stdenv.mkDerivation {
pname = "undmg";
version = "1.1.0-unstable-2024-08-02";
@@ -23,7 +26,7 @@ stdenv.mkDerivation {
nativeBuildInputs = [ pkg-config ];
buildInputs = [
zlib
zlib'
bzip2
lzfse
xz
+3 -3
View File
@@ -15,12 +15,12 @@
let
executableName = "vikunja-desktop";
version = "2.0.0";
version = "2.1.0";
src = fetchFromGitHub {
owner = "go-vikunja";
repo = "vikunja";
rev = "v${version}";
hash = "sha256-EfAhJq2LPuCF8Pwyg0TYqSjNCaG15iZ2paDLfA6JI5w=";
hash = "sha256-R9PNhH5s3W9c1qHYmV9H5CkBvUtUFU+yzF+eEU2ybdo=";
};
in
stdenv.mkDerivation (finalAttrs: {
@@ -40,7 +40,7 @@ stdenv.mkDerivation (finalAttrs: {
pnpmInstallFlags
;
fetcherVersion = 1;
hash = "sha256-9KPQaRLep4n+2b9mk8KQoK22zdlMFrCb1VT6SEHxanQ=";
hash = "sha256-yiVlEr1gi2g3m+hkYfDv6qd/wRlwwknM6lAaIeR58Ok=";
};
env = {
+8 -5
View File
@@ -14,12 +14,12 @@
}:
let
version = "2.0.0";
version = "2.1.0";
src = fetchFromGitHub {
owner = "go-vikunja";
repo = "vikunja";
rev = "v${version}";
hash = "sha256-EfAhJq2LPuCF8Pwyg0TYqSjNCaG15iZ2paDLfA6JI5w=";
hash = "sha256-R9PNhH5s3W9c1qHYmV9H5CkBvUtUFU+yzF+eEU2ybdo=";
};
frontend = stdenv.mkDerivation (finalAttrs: {
@@ -37,7 +37,7 @@ let
;
pnpm = pnpm_10;
fetcherVersion = 1;
hash = "sha256-ME9sGKGRY3vaOTFwbFyzsDT20HnEnrfq3Z5nrL19k0A=";
hash = "sha256-oY8DXJFFwLBjUno3EithLhmnA8hTksq4xgMSSOGtwuo=";
};
nativeBuildInputs = [
@@ -142,11 +142,14 @@ buildGoModule {
};
meta = {
changelog = "https://kolaente.dev/vikunja/api/src/tag/v${version}/CHANGELOG.md";
changelog = "https://github.com/go-vikunja/vikunja/blob/v${version}/CHANGELOG.md";
description = "Todo-app to organize your life";
homepage = "https://vikunja.io/";
license = lib.licenses.agpl3Plus;
maintainers = with lib.maintainers; [ leona ];
maintainers = with lib.maintainers; [
leona
adamcstephens
];
mainProgram = "vikunja";
platforms = lib.platforms.linux;
};
+2 -2
View File
@@ -17,13 +17,13 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "xdp-tools";
version = "1.6.1";
version = "1.6.2";
src = fetchFromGitHub {
owner = "xdp-project";
repo = "xdp-tools";
rev = "v${finalAttrs.version}";
hash = "sha256-KIUuAaWmU5BsmLsp8T3S2hSF4p7BJ506luS82RpmOKs=";
hash = "sha256-CtXJAYR4T/4NyJlgvdc1E9JBIVWY7lN5gtyTUfmAkp8=";
};
outputs = [
+3 -3
View File
@@ -8,7 +8,7 @@
python3Packages.buildPythonApplication (finalAttrs: {
pname = "zensical";
version = "0.0.23";
version = "0.0.24";
pyproject = true;
# We fetch from PyPi, because GitHub repo does not contain all sources.
@@ -16,12 +16,12 @@ python3Packages.buildPythonApplication (finalAttrs: {
# We could combine sources, but then nix-update won't work.
src = fetchPypi {
inherit (finalAttrs) pname version;
hash = "sha256-XE/DqvB135nYz0G58lZuTViBgNmolJMBTTYH3+UKxLw=";
hash = "sha256-tdmeIlMpv0+YyAIr3woO6ViML62ntN8be4lvzGKzfsM=";
};
cargoDeps = rustPlatform.fetchCargoVendor {
inherit (finalAttrs) pname version src;
hash = "sha256-cS8gxMPRpMMHwrjqXjyxBl4dbwll01Y+G4eOBZ3/vdM=";
hash = "sha256-oBg9wq/hJPvAIpl6IEJKVAWnUIVO6L+3q+L5z9UtvKg=";
};
nativeBuildInputs = with rustPlatform; [
@@ -6,13 +6,13 @@
fetchMixDeps,
}:
let
version = "0.1.0-rc.4";
version = "0.1.0-rc.5";
src = fetchFromGitHub {
owner = "elixir-lang";
repo = "expert";
tag = "v${version}";
hash = "sha256-DghNlNbGUTMX859Y9HYRowCXvAxZKJffodTzy94Mb5Q=";
hash = "sha256-7e8zi3AFHESXyxTA0/YRmzR4L4tl19L0LHKaEM1l0P4=";
};
engineDeps = fetchMixDeps {
@@ -62,7 +62,7 @@ mixRelease rec {
meta = {
homepage = "https://github.com/elixir-lang/expert";
changelog = "https://github.com/elixir-lang/expert/releases/tag/v${version}";
changelog = "https://github.com/elixir-lang/expert/blob/v${version}/CHANGELOG.md";
description = "Official Elixir Language Server Protocol implementation";
longDescription = ''
Expert is the official language server implementation for the Elixir programming language.
@@ -3,8 +3,12 @@
lib,
stdenv,
fetchFromGitLab,
apple-sdk_26,
bison,
darwinMinVersionHook,
flex,
glslang,
libpng,
libxml2,
llvmPackages,
meson,
@@ -15,8 +19,30 @@
libxext,
libx11,
libxcb,
libxshmfence,
spirv-llvm-translator,
spirv-tools,
zlib,
eglPlatforms ? [
"macos"
"x11"
],
galliumDrivers ? [
"llvmpipe" # software renderer
"softpipe" # older software renderer
],
vulkanDrivers ? [
"kosmickrisp" # Vulkan on Metal
],
vulkanLayers ? [
"anti-lag"
"intel-nullhw"
"overlay"
"screenshot"
"vram-report-limit"
],
}:
let
common = import ./common.nix { inherit lib fetchFromGitLab; };
in
@@ -28,6 +54,11 @@ stdenv.mkDerivation {
meta
;
patches = [
# Required to build KosmicKrisp
./opencl.patch
];
outputs = [
"out"
"dev"
@@ -36,6 +67,9 @@ stdenv.mkDerivation {
nativeBuildInputs = [
bison
flex
# Use bin output from glslang to not propagate the dev output at
# the build time with the host glslang.
(lib.getBin glslang)
meson
ninja
pkg-config
@@ -46,12 +80,21 @@ stdenv.mkDerivation {
];
buildInputs = [
apple-sdk_26 # KosmicKrisp requires Metal 4 to build, but …
(darwinMinVersionHook "15.0") # … it supports back to Metal 3.2, which requires macOS 15.
libpng
libxml2 # should be propagated from libllvm
llvmPackages.libclang
llvmPackages.libclc
llvmPackages.libllvm
python3Packages.python # for shebang
spirv-llvm-translator
spirv-tools
libx11
libxext
libxfixes
libxcb
libxshmfence
zlib
];
@@ -60,10 +103,30 @@ stdenv.mkDerivation {
mesonFlags = [
"--sysconfdir=/etc"
"--datadir=${placeholder "out"}/share"
# What to build
(lib.mesonOption "platforms" (lib.concatStringsSep "," eglPlatforms))
(lib.mesonOption "gallium-drivers" (lib.concatStringsSep "," galliumDrivers))
(lib.mesonOption "vulkan-drivers" (lib.concatStringsSep "," vulkanDrivers))
(lib.mesonOption "vulkan-layers" (lib.concatStringsSep "," vulkanLayers))
# Disable glvnd on Darwin
(lib.mesonEnable "glvnd" false)
(lib.mesonEnable "gbm" false)
(lib.mesonBool "libgbm-external" false)
# Needed for KosmicKrisp
(lib.mesonOption "clang-libdir" "${lib.getLib llvmPackages.libclang}/lib")
(lib.mesonEnable "llvm" true)
(lib.mesonEnable "shared-llvm" true)
(lib.mesonEnable "spirv-tools" true)
# Needed for Apple GLX support
(lib.mesonOption "glx" "dri")
];
mesonBuildType = "release";
passthru = {
# needed to pass evaluation of bad platforms
driverLink = throw "driverLink not supported on darwin";
+2 -2
View File
@@ -13,13 +13,13 @@
stdenv.mkDerivation rec {
pname = "ngtcp2";
version = "1.20.0";
version = "1.21.0";
src = fetchFromGitHub {
owner = "ngtcp2";
repo = "ngtcp2";
rev = "v${version}";
hash = "sha256-8enkRWmPLZXBtlD9v8N7zuZB+Fv+igl30W7q2UqI2ZE=";
hash = "sha256-8dfktmiiwJ0CVB5BCNBLmTYuUG9Y9Ik2esJNmynJvCU=";
};
outputs = [
@@ -2593,17 +2593,17 @@ final: prev: {
}:
buildLuarocksPackage {
pname = "luaexpat";
version = "1.4.1-1";
version = "1.5.2-1";
knownRockspec =
(fetchurl {
url = "mirror://luarocks/luaexpat-1.4.1-1.rockspec";
sha256 = "1abwd385x7wnza7qqz5s4aj6m2l1c23pjmbgnpq73q0s17pn1h0c";
url = "mirror://luarocks/luaexpat-1.5.2-1.rockspec";
sha256 = "0wdbph2c92zmvvyp3q669rbjy1xjm7jy1i13lin8b636vswykw6p";
}).outPath;
src = fetchFromGitHub {
owner = "lunarmodules";
repo = "luaexpat";
tag = "1.4.1";
hash = "sha256-SnI+a7555R/EFFdnrvJohP6uzwQiMNQPqgp0jxAI178=";
tag = "1.5.2";
hash = "sha256-PudxKlN4WKUUK/h6ekVNSa/C453CnLh3TxCncXIOiw8=";
};
disabled = luaOlder "5.1";
@@ -52,17 +52,15 @@ let
];
in
buildDunePackage {
version = "6.0.0-unstable-2025-08-11";
buildDunePackage (finalAttrs: {
version = "7.0.0";
pname = "ocsigenserver";
minimalOCamlVersion = "4.08";
src = fetchFromGitHub {
owner = "ocsigen";
repo = "ocsigenserver";
rev = "0d3c74d71fbdf738d1e45a98814b7ebdd1efe6c1";
hash = "sha256-KEHTw4cCPRJSE4SAnUFWzeoiEz8y9nUQFpaFiNxAsiU=";
tag = finalAttrs.version;
hash = "sha256-J2XBelpRWJGeIF9RdC9+icJI1hc6Oe0k1w25QHZz0zs=";
};
nativeBuildInputs = [
@@ -110,8 +108,7 @@ buildDunePackage {
A full featured Web server. It implements most features of the HTTP protocol, and has a very powerful extension mechanism that make very easy to plug your own OCaml modules for generating pages.
'';
license = lib.licenses.lgpl21Only;
inherit (ocaml.meta) platforms;
maintainers = [ lib.maintainers.gal_bolle ];
};
}
})
@@ -5,6 +5,7 @@
ocaml,
fetchFromGitHub,
menhir,
bitwuzla-cxx,
bos,
cmdliner,
dolmen_model,
@@ -47,6 +48,7 @@ buildDunePackage (finalAttrs: {
];
propagatedBuildInputs = [
bitwuzla-cxx
bos
cmdliner
dolmen_model
@@ -163,11 +163,14 @@ buildPythonPackage {
(lib.cmakeFeature "CMAKE_HIP_ARCHITECTURES" (builtins.concatStringsSep ";" rocmGpuTargets))
];
CUDA_HOME = lib.optionalString cudaSupport "${cuda-native-redist}";
NVCC_PREPEND_FLAGS = lib.optionals cudaSupport [
"-I${cuda-native-redist}/include"
"-L${cuda-native-redist}/lib"
];
env = lib.optionalAttrs cudaSupport {
CUDA_HOME = cuda-native-redist;
NVCC_PREPEND_FLAGS = toString [
"-I${cuda-native-redist}/include"
"-L${cuda-native-redist}/lib"
];
};
preBuild = ''
make -j $NIX_BUILD_CORES
@@ -16,14 +16,14 @@
buildPythonPackage rec {
pname = "forecast-solar";
version = "4.2.0";
version = "5.0.0";
pyproject = true;
src = fetchFromGitHub {
owner = "home-assistant-libs";
repo = "forecast_solar";
tag = "v${version}";
hash = "sha256-ZBkuhONvn1/QpD+ml3HJinMIdg1HFpVj5KZAlUt/qR4=";
hash = "sha256-gFa1jq4Dq6fWqL/3eY+OGcJU+T+R6TZs8CX1ynnW+pU=";
};
build-system = [ poetry-core ];
@@ -58,6 +58,7 @@ buildPythonPackage (finalAttrs: {
pythonRelaxDeps = [
"av"
"datasets"
"diffusers"
"draccus"
"gymnasium"
"huggingface-hub"
@@ -104,6 +105,17 @@ buildPythonPackage (finalAttrs: {
];
disabledTests = [
# TypeError: only 0-dimensional arrays can be converted to Python scalars
"test_add_frame"
"test_add_frame_state_numpy"
"test_data_consistency_across_episodes"
"test_delta_timestamps_query_returns_correct_values"
"test_episode_boundary_integrity"
"test_from_lerobot_dataset"
"test_statistics_metadata_validation"
"test_task_indexing_and_validation"
"test_to_lerobot_dataset"
# RuntimeError: OpenCVCamera(/build/source/tests/artifacts/cameras/image_480x270.png) read failed
"test_async_read"
"test_fourcc_with_camer"
@@ -1,32 +1,34 @@
{
lib,
buildPythonPackage,
fetchPypi,
fetchFromGitHub,
setuptools,
twisted,
unittestCheckHook,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "python-mpd2";
version = "3.1.1";
version = "3.1.2";
pyproject = true;
src = fetchPypi {
inherit pname version;
hash = "sha256-S67DWEzEPtmUjVVZB5+vwmebBrKt4nPpCbNYJlSys/U=";
src = fetchFromGitHub {
owner = "Mic92";
repo = "python-mpd2";
tag = "v${finalAttrs.version}";
hash = "sha256-3isX3e4Fu1orxuRsC3u8RxoFDQcE4XxQhf8PIHdo/e4=";
};
nativeBuildInputs = [ setuptools ];
build-system = [ setuptools ];
optional-dependencies = {
twisted = [ twisted ];
};
nativeCheckInputs = [ unittestCheckHook ] ++ optional-dependencies.twisted;
nativeCheckInputs = [ unittestCheckHook ] ++ finalAttrs.passthru.optional-dependencies.twisted;
meta = {
changelog = "https://github.com/Mic92/python-mpd2/blob/v${version}/doc/changes.rst";
changelog = "https://github.com/Mic92/python-mpd2/blob/${finalAttrs.src.tag}/doc/changes.rst";
description = "Python client module for the Music Player Daemon";
homepage = "https://github.com/Mic92/python-mpd2";
license = lib.licenses.lgpl3Plus;
@@ -35,4 +37,4 @@ buildPythonPackage rec {
hexa
];
};
}
})
@@ -79,6 +79,8 @@ buildPythonPackage (finalAttrs: {
];
};
pythonImportsCheck = [ "pymilvus" ];
nativeCheckInputs = [
grpcio-testing
pytest-asyncio
@@ -88,13 +90,13 @@ buildPythonPackage (finalAttrs: {
]
++ finalAttrs.passthru.optional-dependencies.bulk_writer;
pythonImportsCheck = [ "pymilvus" ];
disabledTests = [
# tries to read .git
"test_get_commit"
# requires network access
"test_deadline_exceeded_shows_connecting_state"
# mock issue in sandbox
"test_milvus_client_creates_unbound_alias"
];
@@ -102,6 +104,7 @@ buildPythonPackage (finalAttrs: {
disabledTestPaths = [
# requires running milvus server
"examples/"
# tries to write to nix store
"tests/test_bulk_writer_stage.py"
];
@@ -109,7 +112,7 @@ buildPythonPackage (finalAttrs: {
meta = {
description = "Python SDK for Milvus";
homepage = "https://github.com/milvus-io/pymilvus";
changelog = "https://github.com/milvus-io/pymilvus/releases/tag/v${finalAttrs.version}";
changelog = "https://github.com/milvus-io/pymilvus/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ happysalada ];
};
@@ -3,18 +3,24 @@
callPackage,
buildPythonPackage,
fetchFromGitHub,
setuptools,
# build-system
cython,
spacy,
setuptools,
# dependencies
numpy,
transformers,
torch,
srsly,
spacy,
spacy-alignments,
srsly,
torch,
transformers,
# tests
pytestCheckHook,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "spacy-transformers";
version = "1.3.9";
pyproject = true;
@@ -22,22 +28,33 @@ buildPythonPackage rec {
src = fetchFromGitHub {
owner = "explosion";
repo = "spacy-transformers";
tag = "release-v${version}";
tag = "release-v${finalAttrs.version}";
hash = "sha256-06M/e8/+hMVQdZfqyI3qGaZY7iznMwMtblEkFR6Sro0=";
};
# ImportError: cannot import name 'BatchEncoding' from 'transformers.tokenization_utils' (unknown location)
postPatch = ''
substituteInPlace \
spacy_transformers/data_classes.py \
spacy_transformers/layers/transformer_model.py \
spacy_transformers/util.py \
--replace-fail \
"from transformers.tokenization_utils import BatchEncoding" \
"from transformers import BatchEncoding"
'';
build-system = [
setuptools
cython
setuptools
];
dependencies = [
spacy
numpy
transformers
torch
srsly
spacy
spacy-alignments
srsly
torch
transformers
];
nativeCheckInputs = [ pytestCheckHook ];
@@ -54,8 +71,8 @@ buildPythonPackage rec {
meta = {
description = "spaCy pipelines for pretrained BERT, XLNet and GPT-2";
homepage = "https://github.com/explosion/spacy-transformers";
changelog = "https://github.com/explosion/spacy-transformers/releases/tag/${src.tag}";
changelog = "https://github.com/explosion/spacy-transformers/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ nickcao ];
};
}
})
@@ -12,7 +12,7 @@
buildPythonPackage rec {
pname = "systemrdl-compiler";
version = "1.32.1";
version = "1.32.2";
pyproject = true;
@@ -20,7 +20,7 @@ buildPythonPackage rec {
owner = "SystemRDL";
repo = "systemrdl-compiler";
tag = "v${version}";
hash = "sha256-BTONBzNE9GfBeallS6P4E1ukPs2EzFa31/SpxEjXmKw=";
hash = "sha256-1Dx6WxSzGaZxwRzXR/bjfZSU7TsvTYNVN0NaK3qQ7eo=";
};
build-system = [
@@ -75,12 +75,12 @@
}:
let
version = "0.24.0";
version = "0.25.0";
src = fetchFromGitHub {
owner = "wandb";
repo = "wandb";
tag = "v${version}";
hash = "sha256-dICa/sIFEHI59gJxrvWyI9Uc3rbwXi+Xh60O/hElZh0=";
hash = "sha256-ouJHMPcWiHn2p0mFatmC28xUmjzxsoDW9WBX6FzjyDc=";
};
gpu-stats = rustPlatform.buildRustPackage {
@@ -90,7 +90,7 @@ let
sourceRoot = "${src.name}/gpu_stats";
cargoHash = "sha256-iZinowkbBc3nuE0uRS2zLN2y97eCMD1mp/MKVKdnXaE=";
cargoHash = "sha256-yzvXJYkQTNOScOI3yfVBH6IGZzcFduuXqW3pI5hEZGw=";
checkFlags = [
# fails in sandbox
@@ -30,13 +30,13 @@
"lts": true
},
"6.18": {
"version": "6.18.14",
"hash": "sha256:1f3wv9vdg43cy1lnqd60zqgki6px67mdhfkfnpk1npqq5akk86cd",
"lts": true
"version": "6.18.13",
"hash": "sha256:0zv8qml075jpk2i58cxp61hm3yb74mpkbkjg15n87riqzmakqb7d",
"lts": false
},
"6.19": {
"version": "6.19.4",
"hash": "sha256:1b68i7z91fbs1zayzzzf71g9ilfk0wi2fr8nralha60xq723p6r7",
"version": "6.19.3",
"hash": "sha256:1glf369wfr66lmv9wmijin6idlfgijfsh0gx2qly7gpwmml4jiqf",
"lts": false
}
}
+2 -2
View File
@@ -50,11 +50,11 @@ assert !(withJemalloc && withTcmalloc);
stdenv.mkDerivation (finalAttrs: {
pname = "percona-server";
version = "8.4.6-6";
version = "8.4.7-7";
src = fetchurl {
url = "https://downloads.percona.com/downloads/Percona-Server-${lib.versions.majorMinor finalAttrs.version}/Percona-Server-${finalAttrs.version}/source/tarball/percona-server-${finalAttrs.version}.tar.gz";
hash = "sha256-q01k+/TzvT7h52bqn9icc6VMlrUUjMDNKz0UdTyAWjU=";
hash = "sha256-5UBegcT25a1QUt4QQ6LlKWB7UGBnfQG6PK/Hxp9GYaY=";
};
nativeBuildInputs = [
@@ -12,16 +12,16 @@ buildPgrxExtension (finalAttrs: {
cargo-pgrx = cargo-pgrx_0_16_0;
pname = "vectorchord";
version = "1.0.0";
version = "1.1.0";
src = fetchFromGitHub {
owner = "tensorchord";
repo = "vectorchord";
tag = finalAttrs.version;
hash = "sha256-+BOuiinbKPZZaDl9aYsIoZPgvLZ4FA6Rb4/W+lAz4so=";
hash = "sha256-8Gk5/wIGu5/t8EKeG9Wna7yUWKiuCOC9yjJFo2euF/I=";
};
cargoHash = "sha256-kwe2x7OTjpdPonZsvnR1C/89D5W/R5JswYF79YcSFEA=";
cargoHash = "sha256-o7NZEH3NCf/T81kL7jDa4HHGWsyTkLXXhq4KQR2/PGM=";
# Include upgrade scripts in the final package
# https://github.com/tensorchord/VectorChord/blob/0.5.0/crates/make/src/main.rs#L366
+2
View File
@@ -3826,6 +3826,8 @@ with pkgs;
dprint-plugins = recurseIntoAttrs (callPackage ../by-name/dp/dprint/plugins { });
reaction-plugins = reaction.passthru.plugins;
elm2nix = haskell.lib.compose.justStaticExecutables haskellPackages.elm2nix;
elmPackages = recurseIntoAttrs (callPackage ../development/compilers/elm { });