Merge master into staging-nixos
This commit is contained in:
@@ -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}
|
||||
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
@@ -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}";
|
||||
|
||||
@@ -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 ];
|
||||
};
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 ];
|
||||
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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
|
||||
'';
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ];
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -23,7 +23,6 @@ let
|
||||
maintainers = with lib.maintainers; [
|
||||
conradmearns
|
||||
zaninime
|
||||
qbit
|
||||
kashw2
|
||||
w-lfchen
|
||||
];
|
||||
|
||||
@@ -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" ];
|
||||
};
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" { }
|
||||
@@ -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";
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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`.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 { });
|
||||
|
||||
Reference in New Issue
Block a user