diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index 2c16c711ac20..82e89606b82d 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -10850,12 +10850,6 @@ githubId = 2332070; name = "Serge Baltic"; }; - hyphon81 = { - email = "zero812n@gmail.com"; - github = "hyphon81"; - githubId = 12491746; - name = "Masato Yonekawa"; - }; hyshka = { name = "Bryan Hyshka"; email = "bryan@hyshka.com"; @@ -10905,10 +10899,11 @@ keys = [ { fingerprint = "DF90 9D58 BEE4 E73A 1B8C 5AF3 35D3 9F9A 9A1B C8DA"; } ]; }; iamanaws = { - email = "nixpkgs.yjzaw@slmail.me"; - github = "Iamanaws"; + email = "iamanaws@httpd.dev"; + github = "iamanaws"; githubId = 78835633; name = "Angel J"; + keys = [ { fingerprint = "CF10 DCBB 9318 BE1D 6040 4222 272C 61AB 190D ED28"; } ]; }; iammrinal0 = { email = "nixpkgs@mrinalpurohit.in"; @@ -26129,6 +26124,7 @@ }; thegu5 = { name = "Gus"; + matrix = "@gus:gu5.org"; github = "thegu5"; githubId = 58223632; }; diff --git a/nixos/doc/manual/redirects.json b/nixos/doc/manual/redirects.json index e96bdf6d245f..5dd832354fef 100644 --- a/nixos/doc/manual/redirects.json +++ b/nixos/doc/manual/redirects.json @@ -62,6 +62,12 @@ "module-boot-plymouth-tpm2-totp-quick-start-enable": [ "index.html#module-boot-plymouth-tpm2-totp-quick-start-enable" ], + "module-services-tandoor-recipes-migrating-media-option-1": [ + "index.html#module-services-tandoor-recipes-migrating-media-option-1" + ], + "module-services-tandoor-recipes-migrating-media-option-2": [ + "index.html#module-services-tandoor-recipes-migrating-media-option-2" + ], "sec-override-nixos-test": [ "index.html#sec-override-nixos-test" ], @@ -1122,6 +1128,12 @@ "module-services-samba-configuring-file-share": [ "index.html#module-services-samba-configuring-file-share" ], + "module-services-tandoor-recipes": [ + "index.html#module-services-tandoor-recipes" + ], + "module-services-tandoor-recipes-migrating-media": [ + "index.html#module-services-tandoor-recipes-migrating-media" + ], "module-services-litestream": [ "index.html#module-services-litestream" ], diff --git a/nixos/doc/manual/release-notes/rl-2605.section.md b/nixos/doc/manual/release-notes/rl-2605.section.md index 1530959a82f8..caf131313bf5 100644 --- a/nixos/doc/manual/release-notes/rl-2605.section.md +++ b/nixos/doc/manual/release-notes/rl-2605.section.md @@ -42,6 +42,8 @@ - `services.crabfit` was removed because its upstream packages are unmaintained and insecure. +- `services.tandoor-recipes` now uses a sub-directory for media files by default starting with `26.05`. Existing setups should move media files out of the data directory and adjust `services.tandoor-recipes.extraConfig.MEDIA_ROOT` accordingly. See [Migrating media files for pre 26.05 installations](#module-services-tandoor-recipes-migrating-media). + - `services.kubernetes.addons.dns.coredns` has been renamed to `services.kubernetes.addons.dns.corednsImage` and now expects a package instead of attrs. Now, by default, nixpkgs.coredns in conjunction with dockerTools.buildImage is used, instead of pulling the upstream container image from Docker Hub. If you want the old behavior, you can set: diff --git a/nixos/modules/services/misc/tandoor-recipes.md b/nixos/modules/services/misc/tandoor-recipes.md new file mode 100644 index 000000000000..762ab56c5c6d --- /dev/null +++ b/nixos/modules/services/misc/tandoor-recipes.md @@ -0,0 +1,19 @@ +# Tandoor Recipes {#module-services-tandoor-recipes} + +## Dealing with `MEDIA_ROOT` for installations prior 26.05 {#module-services-tandoor-recipes-migrating-media} + +See https://github.com/NixOS/nixpkgs/issues/338339 for some background. + +### Option 1: Migrate media to new `MEDIA_ROOT` {#module-services-tandoor-recipes-migrating-media-option-1} + +1. Stop the currently running service: `systemctl stop tandoor-recipes.service` +2. Create a media folder. NixOS `26.05` creates the media path at `/var/lib/tandoor-recipes/media` by default, but you may choose any other path as well. `mkdir -p /var/lib/tandoor-recipes/media` +3. Move existing media to the new path: `mv /var/lib/tandoor-recipes/{files,recipes} /var/lib/tandoor-recipes/media` +4. Set `services.tandoor-recipes.extraConfig.MEDIA_ROOT = "/var/lib/tandoor-recipes/media";` in your NixOS configuration (not needed if `system.stateVersion >= 26.05`). +5. Rebuild and switch! + +These changes can be reverted by moving the files back into the state directory. + +### Option 2: Keep existing directory (may be insecure) {#module-services-tandoor-recipes-migrating-media-option-2} + +To keep the existing directory, set `services.tandoor-recipes.extraConfig.MEDIA_ROOT = "/var/lib/tandoor-recipes";`. diff --git a/nixos/modules/services/misc/tandoor-recipes.nix b/nixos/modules/services/misc/tandoor-recipes.nix index 549b3ad5fa3d..8f8267e294bc 100644 --- a/nixos/modules/services/misc/tandoor-recipes.nix +++ b/nixos/modules/services/misc/tandoor-recipes.nix @@ -7,13 +7,15 @@ let cfg = config.services.tandoor-recipes; pkg = cfg.package; + stateDir = "/var/lib/tandoor-recipes"; + useNewMediaRoot = lib.versionAtLeast config.system.stateVersion "26.05"; # SECRET_KEY through an env file env = { GUNICORN_CMD_ARGS = "--bind=${cfg.address}:${toString cfg.port}"; DEBUG = "0"; DEBUG_TOOLBAR = "0"; - MEDIA_ROOT = "/var/lib/tandoor-recipes"; + MEDIA_ROOT = "${stateDir}${lib.optionalString useNewMediaRoot "/media"}"; } // lib.optionalAttrs (config.time.timeZone != null) { TZ = config.time.timeZone; @@ -26,12 +28,15 @@ let # UID is a read-only shell variable eval "$(${config.systemd.package}/bin/systemctl show -pUID,GID,MainPID tandoor-recipes.service | tr '[:upper:]' '[:lower:]')" exec ${pkgs.util-linux}/bin/nsenter \ - -t $mainpid -m -S $uid -G $gid --wdns=${env.MEDIA_ROOT} \ + -t $mainpid -m -S $uid -G $gid --wdns=${stateDir} \ ${pkg}/bin/tandoor-recipes "$@" ''; in { - meta.maintainers = with lib.maintainers; [ jvanbruegge ]; + meta = { + maintainers = with lib.maintainers; [ jvanbruegge ]; + doc = ./tandoor-recipes.md; + }; options.services.tandoor-recipes = { enable = lib.mkOption { @@ -101,6 +106,10 @@ in }; config = lib.mkIf cfg.enable { + warnings = lib.mkIf (!useNewMediaRoot && !(cfg.extraConfig ? MEDIA_ROOT)) [ + "`services.tandoor-recipes.extraConfig.MEDIA_ROOT` is unset. This is considered insecure for `system.stateVersion` < 26.05. See https://nixos.org/manual/nixos/unstable/#module-services-tandoor-recipes-migrating-media for migration instructions." + ]; + users.users = lib.mkIf (cfg.user == "tandoor_recipes") { tandoor_recipes = { inherit (cfg) group; @@ -126,8 +135,11 @@ in User = cfg.user; Group = cfg.group; - StateDirectory = "tandoor-recipes"; - WorkingDirectory = env.MEDIA_ROOT; + StateDirectory = [ + "tandoor-recipes" + ] + ++ lib.optional (env.MEDIA_ROOT == "/var/lib/tandoor-recipes/media") "tandoor-recipes/media"; + WorkingDirectory = stateDir; RuntimeDirectory = "tandoor-recipes"; BindReadOnlyPaths = [ diff --git a/nixos/modules/services/monitoring/prometheus/exporters.nix b/nixos/modules/services/monitoring/prometheus/exporters.nix index c387bf06c8f6..6898c8107be6 100644 --- a/nixos/modules/services/monitoring/prometheus/exporters.nix +++ b/nixos/modules/services/monitoring/prometheus/exporters.nix @@ -571,16 +571,6 @@ in services.prometheus.exporters.postfix.group = mkDefault config.services.postfix.setgidGroup; }) ] - ++ [ - (mkIf config.services.prometheus.exporters.deluge.enable { - system.activationScripts = { - deluge-exported.text = '' - mkdir -p /etc/deluge-exporter - echo "DELUGE_PASSWORD=$(cat ${config.services.prometheus.exporters.deluge.delugePasswordFile})" > /etc/deluge-exporter/password - ''; - }; - }) - ] ++ (mapAttrsToList ( name: conf: mkExporterConf { diff --git a/nixos/modules/services/monitoring/prometheus/exporters/deluge.nix b/nixos/modules/services/monitoring/prometheus/exporters/deluge.nix index 5297bcd089f5..939d2bcf3b7b 100644 --- a/nixos/modules/services/monitoring/prometheus/exporters/deluge.nix +++ b/nixos/modules/services/monitoring/prometheus/exporters/deluge.nix @@ -68,10 +68,20 @@ in }; }; serviceOpts = { + script = '' + passwordfile="$CREDENTIALS_DIRECTORY/password-file" + if [ -e "$passwordfile" ]; then + export DELUGE_PASSWORD="$(cat "$passwordfile")" + fi + + exec ${pkgs.prometheus-deluge-exporter}/bin/deluge-exporter + ''; + serviceConfig = { - ExecStart = '' - ${pkgs.prometheus-deluge-exporter}/bin/deluge-exporter - ''; + LoadCredential = lib.mkIf (config.services.prometheus.exporters.deluge.delugePasswordFile != null) [ + "password-file:${config.services.prometheus.exporters.deluge.delugePasswordFile}" + ]; + Environment = [ "LISTEN_PORT=${toString cfg.port}" "LISTEN_ADDRESS=${toString cfg.listenAddress}" @@ -86,9 +96,6 @@ in ++ lib.optionals cfg.exportPerTorrentMetrics [ "PER_TORRENT_METRICS=1" ]; - EnvironmentFile = lib.optionalString ( - cfg.delugePasswordFile != null - ) "/etc/deluge-exporter/password"; }; }; } diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 0cc6942f10db..bbb72047c109 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -1294,7 +1294,10 @@ in privatebin = runTest ./privatebin.nix; privoxy = runTest ./privoxy.nix; prometheus = import ./prometheus { inherit runTest; }; - prometheus-exporters = handleTest ./prometheus-exporters.nix { }; + prometheus-exporters = import ./prometheus-exporters.nix { + inherit runTest; + inherit (pkgs) lib; + }; prosody = runTest ./xmpp/prosody.nix; prosody-mysql = handleTest ./xmpp/prosody-mysql.nix { }; prowlarr = runTest ./prowlarr.nix; @@ -1552,6 +1555,7 @@ in szurubooru = handleTest ./szurubooru.nix { }; taler = handleTest ./taler { }; tandoor-recipes = runTest ./tandoor-recipes.nix; + tandoor-recipes-media = runTest ./tandoor-recipes-media.nix; tandoor-recipes-script-name = runTest ./tandoor-recipes-script-name.nix; tang = runTest ./tang.nix; taskchampion-sync-server = runTest ./taskchampion-sync-server.nix; diff --git a/nixos/tests/prometheus-exporters.nix b/nixos/tests/prometheus-exporters.nix index 8f23817e508d..7d917e3bbc32 100644 --- a/nixos/tests/prometheus-exporters.nix +++ b/nixos/tests/prometheus-exporters.nix @@ -1,23 +1,9 @@ { - system ? builtins.currentSystem, - config ? { }, - pkgs ? import ../.. { inherit system config; }, + runTest, + lib, }: let - inherit (import ../lib/testing-python.nix { inherit system pkgs; }) makeTest; - inherit (pkgs.lib) - concatStringsSep - maintainers - mapAttrs - mkMerge - removeSuffix - replaceStrings - singleton - splitString - makeBinPath - ; - /* * The attrset `exporterTests` contains one attribute * for each exporter test. Each of these attributes @@ -69,319 +55,346 @@ let */ exporterTests = { - apcupsd = { - exporterConfig = { - enable = true; - }; - metricProvider = { - services.apcupsd.enable = true; - }; - exporterTest = '' - wait_for_unit("apcupsd.service") - wait_for_open_port(3551) - wait_for_unit("prometheus-apcupsd-exporter.service") - wait_for_open_port(9162) - succeed("curl -sSf http://localhost:9162/metrics | grep 'apcupsd_info'") - ''; - }; - - artifactory = { - exporterConfig = { - enable = true; - artiUsername = "artifactory-username"; - artiPassword = "artifactory-password"; - }; - exporterTest = '' - wait_for_unit("prometheus-artifactory-exporter.service") - wait_for_open_port(9531) - succeed( - "curl -sSf http://localhost:9531/metrics | grep 'artifactory_up'" - ) - ''; - }; - - bind = { - exporterConfig = { - enable = true; - }; - metricProvider = { - services.bind.enable = true; - services.bind.extraConfig = '' - statistics-channels { - inet 127.0.0.1 port 8053 allow { localhost; }; - }; + apcupsd = + { ... }: + { + exporterConfig = { + enable = true; + }; + metricProvider = { + services.apcupsd.enable = true; + }; + exporterTest = '' + wait_for_unit("apcupsd.service") + wait_for_open_port(3551) + wait_for_unit("prometheus-apcupsd-exporter.service") + wait_for_open_port(9162) + succeed("curl -sSf http://localhost:9162/metrics | grep 'apcupsd_info'") ''; }; - exporterTest = '' - wait_for_unit("prometheus-bind-exporter.service") - wait_for_open_port(9119) - succeed( - "curl -sSf http://localhost:9119/metrics | grep 'bind_query_recursions_total 0'" - ) - ''; - }; - bird = { - exporterConfig = { - enable = true; - }; - metricProvider = { - services.bird.enable = true; - services.bird.config = '' - router id 127.0.0.1; - - protocol kernel MyObviousTestString { - ipv4 { - import all; - export none; - }; - } - - protocol device { - } + artifactory = + { ... }: + { + exporterConfig = { + enable = true; + artiUsername = "artifactory-username"; + artiPassword = "artifactory-password"; + }; + exporterTest = '' + wait_for_unit("prometheus-artifactory-exporter.service") + wait_for_open_port(9531) + succeed( + "curl -sSf http://localhost:9531/metrics | grep 'artifactory_up'" + ) ''; }; - exporterTest = '' - wait_for_unit("prometheus-bird-exporter.service") - wait_for_open_port(9324) - wait_until_succeeds( - "curl -sSf http://localhost:9324/metrics | grep 'MyObviousTestString'" - ) - ''; - }; - bitcoin = { - exporterConfig = { - enable = true; - rpcUser = "bitcoinrpc"; - rpcPasswordFile = pkgs.writeText "password" "hunter2"; - }; - metricProvider = { - services.bitcoind.default.enable = true; - services.bitcoind.default.rpc.users.bitcoinrpc.passwordHMAC = - "e8fe33f797e698ac258c16c8d7aadfbe$872bdb8f4d787367c26bcfd75e6c23c4f19d44a69f5d1ad329e5adf3f82710f7"; - }; - exporterTest = '' - wait_for_unit("prometheus-bitcoin-exporter.service") - wait_for_unit("bitcoind-default.service") - wait_for_open_port(9332) - succeed("curl -sSf http://localhost:9332/metrics | grep '^bitcoin_blocks '") - ''; - }; - - blackbox = { - exporterConfig = { - enable = true; - configFile = pkgs.writeText "config.yml" ( - builtins.toJSON { - modules.icmp_v6 = { - prober = "icmp"; - icmp.preferred_ip_protocol = "ip6"; + bind = + { ... }: + { + exporterConfig = { + enable = true; + }; + metricProvider = { + services.bind.enable = true; + services.bind.extraConfig = '' + statistics-channels { + inet 127.0.0.1 port 8053 allow { localhost; }; }; - } - ); - }; - exporterTest = '' - wait_for_unit("prometheus-blackbox-exporter.service") - wait_for_open_port(9115) - succeed( - "curl -sSf 'http://localhost:9115/probe?target=localhost&module=icmp_v6' | grep 'probe_success 1'" - ) - ''; - }; - - borgmatic = { - exporterConfig = { - enable = true; - user = "root"; - }; - metricProvider = { - services.borgmatic.enable = true; - services.borgmatic.settings.source_directories = [ "/home" ]; - services.borgmatic.settings.repositories = [ - { - label = "local"; - path = "/var/backup"; - } - ]; - services.borgmatic.settings.keep_daily = 10; - }; - exporterTest = '' - succeed("borgmatic rcreate -e none") - succeed("borgmatic") - wait_for_unit("prometheus-borgmatic-exporter.service") - wait_for_open_port(9996) - succeed("curl -sSf localhost:9996/metrics | grep 'borg_total_backups{repository=\"/var/backup\"} 1'") - ''; - }; - - collectd = { - exporterConfig = { - enable = true; - extraFlags = [ "--web.collectd-push-path /collectd" ]; - }; - exporterTest = - let - postData = replaceStrings [ "\n" ] [ "" ] '' - [{ - "values":[23], - "dstypes":["gauge"], - "type":"gauge", - "interval":1000, - "host":"testhost", - "plugin":"testplugin", - "time":DATE - }] ''; - in - '' - wait_for_unit("prometheus-collectd-exporter.service") - wait_for_open_port(9103) + }; + exporterTest = '' + wait_for_unit("prometheus-bind-exporter.service") + wait_for_open_port(9119) succeed( - 'echo \'${postData}\'> /tmp/data.json' - ) - succeed('sed -i -e "s DATE $(date +%s) " /tmp/data.json') - succeed( - "curl -sSfH 'Content-Type: application/json' -X POST --data @/tmp/data.json localhost:9103/collectd" - ) - succeed( - "curl -sSf localhost:9103/metrics | grep 'collectd_testplugin_gauge{instance=\"testhost\"} 23'" + "curl -sSf http://localhost:9119/metrics | grep 'bind_query_recursions_total 0'" ) ''; - }; - - deluge = { - exporterConfig = { - enable = true; - port = 1234; - listenAddress = "127.0.0.1"; - - delugeUser = "user"; - delugePort = 2345; - delugePasswordFile = pkgs.writeText "password" "weak_password"; }; - metricProvider = { - services.deluge.enable = true; - services.deluge.declarative = true; - services.deluge.config.daemon_port = 2345; - services.deluge.authFile = pkgs.writeText "authFile" '' - localclient:abcdef:10 - user:weak_password:10 + + bird = + { ... }: + { + exporterConfig = { + enable = true; + }; + metricProvider = { + services.bird.enable = true; + services.bird.config = '' + router id 127.0.0.1; + + protocol kernel MyObviousTestString { + ipv4 { + import all; + export none; + }; + } + + protocol device { + } + ''; + }; + exporterTest = '' + wait_for_unit("prometheus-bird-exporter.service") + wait_for_open_port(9324) + wait_until_succeeds( + "curl -sSf http://localhost:9324/metrics | grep 'MyObviousTestString'" + ) ''; }; - exporterTest = '' - wait_for_unit("deluged.service") - wait_for_open_port(2345) - wait_for_unit("prometheus-deluge-exporter.service") - wait_for_open_port(1234) - succeed("curl -sSf http://localhost:1234 | grep 'deluge_torrents'") - ''; - }; - dnsmasq = { - exporterConfig = { - enable = true; - leasesPath = "/var/lib/dnsmasq/dnsmasq.leases"; + bitcoin = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + rpcUser = "bitcoinrpc"; + rpcPasswordFile = pkgs.writeText "password" "hunter2"; + }; + metricProvider = { + services.bitcoind.default.enable = true; + services.bitcoind.default.rpc.users.bitcoinrpc.passwordHMAC = + "e8fe33f797e698ac258c16c8d7aadfbe$872bdb8f4d787367c26bcfd75e6c23c4f19d44a69f5d1ad329e5adf3f82710f7"; + }; + exporterTest = '' + wait_for_unit("prometheus-bitcoin-exporter.service") + wait_for_unit("bitcoind-default.service") + wait_for_open_port(9332) + succeed("curl -sSf http://localhost:9332/metrics | grep '^bitcoin_blocks '") + ''; }; - metricProvider = { - services.dnsmasq.enable = true; - }; - exporterTest = '' - wait_for_unit("dnsmasq.service") - wait_for_open_port(53) - wait_for_file("/var/lib/dnsmasq/dnsmasq.leases") - wait_for_unit("prometheus-dnsmasq-exporter.service") - wait_for_open_port(9153) - succeed("curl -sSf http://localhost:9153/metrics | grep 'dnsmasq_leases 0'") - ''; - }; - dnssec = { - exporterConfig = { - enable = true; - configuration = { - records = [ + blackbox = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + configFile = pkgs.writeText "config.yml" ( + builtins.toJSON { + modules.icmp_v6 = { + prober = "icmp"; + icmp.preferred_ip_protocol = "ip6"; + }; + } + ); + }; + exporterTest = '' + wait_for_unit("prometheus-blackbox-exporter.service") + wait_for_open_port(9115) + succeed( + "curl -sSf 'http://localhost:9115/probe?target=localhost&module=icmp_v6' | grep 'probe_success 1'" + ) + ''; + }; + + borgmatic = + { ... }: + { + exporterConfig = { + enable = true; + user = "root"; + }; + metricProvider = { + services.borgmatic.enable = true; + services.borgmatic.settings.source_directories = [ "/home" ]; + services.borgmatic.settings.repositories = [ { - zone = "example.com"; - record = "@"; - type = "SOA"; + label = "local"; + path = "/var/backup"; } ]; + services.borgmatic.settings.keep_daily = 10; }; - resolvers = [ "127.0.0.1:53" ]; + exporterTest = '' + succeed("borgmatic rcreate -e none") + succeed("borgmatic") + wait_for_unit("prometheus-borgmatic-exporter.service") + wait_for_open_port(9996) + succeed("curl -sSf localhost:9996/metrics | grep 'borg_total_backups{repository=\"/var/backup\"} 1'") + ''; }; - metricProvider = { - services.knot = { + + collectd = + { lib, ... }: + { + exporterConfig = { enable = true; - settingsFile = pkgs.writeText "knot.conf" '' - server: - listen: 127.0.0.1@53 - template: - - id: default - storage: ${ - pkgs.buildEnv { - name = "zones"; - paths = [ - (pkgs.writeTextDir "example.com.zone" '' - @ SOA ns1.example.com. noc.example.com. 2024032401 86400 7200 3600000 172800 - @ NS ns1 - ns1 A 192.168.0.1 - '') - ]; - } - } - zonefile-load: difference - zonefile-sync: -1 - zone: - - domain: example.com - file: example.com.zone - dnssec-signing: on + extraFlags = [ "--web.collectd-push-path /collectd" ]; + }; + exporterTest = + let + postData = lib.replaceStrings [ "\n" ] [ "" ] '' + [{ + "values":[23], + "dstypes":["gauge"], + "type":"gauge", + "interval":1000, + "host":"testhost", + "plugin":"testplugin", + "time":DATE + }] + ''; + in + '' + wait_for_unit("prometheus-collectd-exporter.service") + wait_for_open_port(9103) + succeed( + 'echo \'${postData}\'> /tmp/data.json' + ) + succeed('sed -i -e "s DATE $(date +%s) " /tmp/data.json') + succeed( + "curl -sSfH 'Content-Type: application/json' -X POST --data @/tmp/data.json localhost:9103/collectd" + ) + succeed( + "curl -sSf localhost:9103/metrics | grep 'collectd_testplugin_gauge{instance=\"testhost\"} 23'" + ) + ''; + }; + + deluge = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + port = 1234; + listenAddress = "127.0.0.1"; + + delugeUser = "user"; + delugePort = 2345; + delugePasswordFile = pkgs.writeText "password" "weak_password"; + }; + metricProvider = { + services.deluge.enable = true; + services.deluge.declarative = true; + services.deluge.config.daemon_port = 2345; + services.deluge.authFile = pkgs.writeText "authFile" '' + localclient:abcdef:10 + user:weak_password:10 ''; }; + exporterTest = '' + wait_for_unit("deluged.service") + wait_for_open_port(2345) + wait_for_unit("prometheus-deluge-exporter.service") + wait_for_open_port(1234) + succeed("curl -sSf http://localhost:1234 | grep 'deluge_torrents'") + ''; + }; + + dnsmasq = + { ... }: + { + exporterConfig = { + enable = true; + leasesPath = "/var/lib/dnsmasq/dnsmasq.leases"; + }; + metricProvider = { + services.dnsmasq.enable = true; + }; + exporterTest = '' + wait_for_unit("dnsmasq.service") + wait_for_open_port(53) + wait_for_file("/var/lib/dnsmasq/dnsmasq.leases") + wait_for_unit("prometheus-dnsmasq-exporter.service") + wait_for_open_port(9153) + succeed("curl -sSf http://localhost:9153/metrics | grep 'dnsmasq_leases 0'") + ''; + }; + + dnssec = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + configuration = { + records = [ + { + zone = "example.com"; + record = "@"; + type = "SOA"; + } + ]; + }; + resolvers = [ "127.0.0.1:53" ]; + }; + metricProvider = { + services.knot = { + enable = true; + settingsFile = pkgs.writeText "knot.conf" '' + server: + listen: 127.0.0.1@53 + template: + - id: default + storage: ${ + pkgs.buildEnv { + name = "zones"; + paths = [ + (pkgs.writeTextDir "example.com.zone" '' + @ SOA ns1.example.com. noc.example.com. 2024032401 86400 7200 3600000 172800 + @ NS ns1 + ns1 A 192.168.0.1 + '') + ]; + } + } + zonefile-load: difference + zonefile-sync: -1 + zone: + - domain: example.com + file: example.com.zone + dnssec-signing: on + ''; + }; + }; + exporterTest = '' + wait_for_unit("knot.service") + wait_for_open_port(53) + wait_for_unit("prometheus-dnssec-exporter.service") + wait_for_open_port(9204) + succeed("curl -sSf http://localhost:9204/metrics | grep 'example.com'") + ''; }; - exporterTest = '' - wait_for_unit("knot.service") - wait_for_open_port(53) - wait_for_unit("prometheus-dnssec-exporter.service") - wait_for_open_port(9204) - succeed("curl -sSf http://localhost:9204/metrics | grep 'example.com'") - ''; - }; # Access to WHOIS server is required to properly test this exporter, so # just perform basic sanity check that the exporter is running and returns # a failure. - domain = { - exporterConfig = { - enable = true; + domain = + { ... }: + { + exporterConfig = { + enable = true; + }; + exporterTest = '' + wait_for_unit("prometheus-domain-exporter.service") + wait_for_open_port(9222) + succeed("curl -sSf 'http://localhost:9222/probe?target=nixos.org'") + ''; }; - exporterTest = '' - wait_for_unit("prometheus-domain-exporter.service") - wait_for_open_port(9222) - succeed("curl -sSf 'http://localhost:9222/probe?target=nixos.org'") - ''; - }; - dovecot = { - exporterConfig = { - enable = true; - scopes = [ "global" ]; - socketPath = "/var/run/dovecot2/old-stats"; - user = "root"; # <- don't use user root in production + dovecot = + { ... }: + { + exporterConfig = { + enable = true; + scopes = [ "global" ]; + socketPath = "/var/run/dovecot2/old-stats"; + user = "root"; # <- don't use user root in production + }; + metricProvider = { + services.dovecot2.enable = true; + }; + exporterTest = '' + wait_for_unit("prometheus-dovecot-exporter.service") + wait_for_open_port(9166) + succeed( + "curl -sSf http://localhost:9166/metrics | grep 'dovecot_up{scope=\"global\"} 1'" + ) + ''; }; - metricProvider = { - services.dovecot2.enable = true; - }; - exporterTest = '' - wait_for_unit("prometheus-dovecot-exporter.service") - wait_for_open_port(9166) - succeed( - "curl -sSf http://localhost:9166/metrics | grep 'dovecot_up{scope=\"global\"} 1'" - ) - ''; - }; exportarr-sonarr = + { pkgs, ... }: let apikey = "eccff6a992bc2e4b88e46d064b26bb4e"; in @@ -407,952 +420,1011 @@ let ''; }; - ebpf = { - exporterConfig = { - enable = true; - names = [ "timers" ]; - }; - exporterTest = '' - wait_for_unit("prometheus-ebpf-exporter.service") - wait_for_open_port(9435) - succeed( - "curl -sSf http://localhost:9435/metrics | grep 'ebpf_exporter_enabled_configs{name=\"timers\"} 1'" - ) - ''; - }; - - fastly = { - exporterConfig = { - enable = true; - environmentFile = pkgs.writeText "fastly-exporter-env" "FASTLY_API_TOKEN=abc123"; - }; - - exporterTest = '' - wait_for_unit("prometheus-fastly-exporter.service") - wait_for_open_port(9118) - ''; - }; - - fritzbox = { - # TODO add proper test case - exporterConfig = { - enable = true; - }; - exporterTest = '' - wait_for_unit("prometheus-fritzbox-exporter.service") - wait_for_open_port(9133) - succeed( - "curl -sSf http://localhost:9133/metrics | grep 'fritzbox_exporter_collect_errors 0'" - ) - ''; - }; - - graphite = { - exporterConfig = { - enable = true; - port = 9108; - graphitePort = 9109; - mappingSettings.mappings = [ - { - match = "test.*.*"; - name = "testing"; - labels = { - protocol = "$1"; - author = "$2"; - }; - } - ]; - }; - exporterTest = '' - wait_for_unit("prometheus-graphite-exporter.service") - wait_for_open_port(9108) - wait_for_open_port(9109) - succeed("echo test.tcp.foo-bar 1234 $(date +%s) | nc -w1 localhost 9109") - succeed("curl -sSf http://localhost:9108/metrics | grep 'testing{author=\"foo-bar\",protocol=\"tcp\"} 1234'") - ''; - }; - - idrac = { - exporterConfig = { - enable = true; - port = 9348; - configuration = { - hosts = { - default = { - username = "username"; - password = "password"; - }; - }; - }; - }; - exporterTest = '' - wait_for_unit("prometheus-idrac-exporter.service") - wait_for_open_port(9348) - wait_until_succeeds("curl localhost:9348") - ''; - }; - - influxdb = { - exporterConfig = { - enable = true; - sampleExpiry = "3s"; - }; - exporterTest = '' - wait_for_unit("prometheus-influxdb-exporter.service") - wait_for_open_port(9122) - succeed( - "curl -XPOST http://localhost:9122/write --data-binary 'influxdb_exporter,distro=nixos,added_in=21.09 value=1'" - ) - succeed( - "curl -sSf http://localhost:9122/metrics | grep 'nixos'" - ) - execute("sleep 5") - fail( - "curl -sSf http://localhost:9122/metrics | grep 'nixos'" - ) - ''; - }; - - ipmi = { - exporterConfig = { - enable = true; - }; - exporterTest = '' - wait_for_unit("prometheus-ipmi-exporter.service") - wait_for_open_port(9290) - succeed( - "curl -sSf http://localhost:9290/metrics | grep 'ipmi_scrape_duration_seconds'" - ) - ''; - }; - - jitsi = { - exporterConfig = { - enable = true; - }; - metricProvider = { - systemd.services.prometheus-jitsi-exporter.after = [ "jitsi-videobridge2.service" ]; - services.jitsi-videobridge = { + ebpf = + { ... }: + { + exporterConfig = { enable = true; - colibriRestApi = true; + names = [ "timers" ]; }; + exporterTest = '' + wait_for_unit("prometheus-ebpf-exporter.service") + wait_for_open_port(9435) + succeed( + "curl -sSf http://localhost:9435/metrics | grep 'ebpf_exporter_enabled_configs{name=\"timers\"} 1'" + ) + ''; }; - exporterTest = '' - wait_for_unit("jitsi-videobridge2.service") - wait_for_open_port(8080) - wait_for_unit("prometheus-jitsi-exporter.service") - wait_for_open_port(9700) - wait_until_succeeds( - 'journalctl -eu prometheus-jitsi-exporter.service -o cat | grep "key=participants"' - ) - succeed("curl -sSf 'localhost:9700/metrics' | grep 'jitsi_participants 0'") - ''; - }; - json = { - exporterConfig = { - enable = true; - configFile = pkgs.writeText "json-exporter-conf.json" ( - builtins.toJSON { - modules = { + fastly = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + environmentFile = pkgs.writeText "fastly-exporter-env" "FASTLY_API_TOKEN=abc123"; + }; + + exporterTest = '' + wait_for_unit("prometheus-fastly-exporter.service") + wait_for_open_port(9118) + ''; + }; + + fritzbox = + { ... }: + { + # TODO add proper test case + exporterConfig = { + enable = true; + }; + exporterTest = '' + wait_for_unit("prometheus-fritzbox-exporter.service") + wait_for_open_port(9133) + succeed( + "curl -sSf http://localhost:9133/metrics | grep 'fritzbox_exporter_collect_errors 0'" + ) + ''; + }; + + graphite = + { ... }: + { + exporterConfig = { + enable = true; + port = 9108; + graphitePort = 9109; + mappingSettings.mappings = [ + { + match = "test.*.*"; + name = "testing"; + labels = { + protocol = "$1"; + author = "$2"; + }; + } + ]; + }; + exporterTest = '' + wait_for_unit("prometheus-graphite-exporter.service") + wait_for_open_port(9108) + wait_for_open_port(9109) + succeed("echo test.tcp.foo-bar 1234 $(date +%s) | nc -w1 localhost 9109") + succeed("curl -sSf http://localhost:9108/metrics | grep 'testing{author=\"foo-bar\",protocol=\"tcp\"} 1234'") + ''; + }; + + idrac = + { ... }: + { + exporterConfig = { + enable = true; + port = 9348; + configuration = { + hosts = { default = { - metrics = [ - { - name = "json_test_metric"; - path = "{ .test }"; - } - ]; + username = "username"; + password = "password"; }; }; - } - ); - }; - metricProvider = { - systemd.services.prometheus-json-exporter.after = [ "nginx.service" ]; - services.nginx = { - enable = true; - virtualHosts.localhost.locations."/".extraConfig = '' - return 200 "{\"test\":1}"; - ''; - }; - }; - exporterTest = '' - wait_for_unit("nginx.service") - wait_for_open_port(80) - wait_for_unit("prometheus-json-exporter.service") - wait_for_open_port(7979) - succeed( - "curl -sSf 'localhost:7979/probe?target=http://localhost' | grep 'json_test_metric 1'" - ) - ''; - }; - - kafka = { - exporterConfig = { - enable = true; - environmentFile = pkgs.writeTextFile { - name = "/tmp/prometheus-kafka-exporter.env"; - text = '' - KAFKA_BROKERS="localhost:9092" - ''; - }; - }; - metricProvider = { - services.apache-kafka = { - enable = true; - - clusterId = "pHG8aWuXSfWAibHFDCnsCQ"; - - formatLogDirs = true; - - settings = { - "node.id" = 1; - "process.roles" = [ - "broker" - "controller" - ]; - "listeners" = [ - "PLAINTEXT://:9092" - "CONTROLLER://:9093" - ]; - "listener.security.protocol.map" = [ - "PLAINTEXT:PLAINTEXT" - "CONTROLLER:PLAINTEXT" - ]; - "controller.quorum.voters" = [ - "1@localhost:9093" - ]; - "controller.listener.names" = [ "CONTROLLER" ]; - "log.dirs" = [ "/var/lib/apache-kafka" ]; }; }; - - systemd.services.apache-kafka.serviceConfig.StateDirectory = "apache-kafka"; - }; - exporterTest = '' - wait_for_unit("apache-kafka") - wait_for_open_port(9092) - wait_for_open_port(9093) - wait_for_unit("prometheus-kafka-exporter.service") - wait_for_open_port(8080) - wait_until_succeeds( - "journalctl -o cat -u prometheus-kafka-exporter.service | grep '\"version\":\"${pkgs.kminion.version}\"'" - ) - succeed( - "curl -sSf http://localhost:8080/metrics | grep 'kminion_exporter_up'" - ) - ''; - }; - - knot = { - exporterConfig = { - enable = true; - }; - metricProvider = { - services.knot = { - enable = true; - extraArgs = [ "-v" ]; - settingsFile = pkgs.writeText "knot.conf" '' - server: - listen: 127.0.0.1@53 - - template: - - id: default - global-module: mod-stats - dnssec-signing: off - zonefile-sync: -1 - zonefile-load: difference - storage: ${ - pkgs.buildEnv { - name = "foo"; - paths = [ - (pkgs.writeTextDir "test.zone" '' - @ SOA ns.example.com. noc.example.com. 2019031301 86400 7200 3600000 172800 - @ NS ns1 - @ NS ns2 - ns1 A 192.168.0.1 - '') - ]; - } - } - - mod-stats: - - id: custom - edns-presence: on - query-type: on - - zone: - - domain: test - file: test.zone - module: mod-stats/custom - ''; - }; - }; - exporterTest = '' - wait_for_unit("knot.service") - wait_for_unit("prometheus-knot-exporter.service") - wait_for_open_port(9433) - succeed("curl -sSf 'localhost:9433' | grep '2\.019031301'") - ''; - }; - - keylight = { - # A hardware device is required to properly test this exporter, so just - # perform a couple of basic sanity checks that the exporter is running - # and requires a target, but cannot reach a specified target. - exporterConfig = { - enable = true; - }; - exporterTest = '' - wait_for_unit("prometheus-keylight-exporter.service") - wait_for_open_port(9288) - succeed( - "curl -sS --write-out '%{http_code}' -o /dev/null http://localhost:9288/metrics | grep '400'" - ) - succeed( - "curl -sS --write-out '%{http_code}' -o /dev/null http://localhost:9288/metrics?target=nosuchdevice | grep '500'" - ) - ''; - }; - - lnd = { - exporterConfig = { - enable = true; - lndTlsPath = "/var/lib/lnd/tls.cert"; - lndMacaroonDir = "/var/lib/lnd"; - extraFlags = [ "--lnd.network=regtest" ]; - }; - metricProvider = { - systemd.services.prometheus-lnd-exporter.serviceConfig.RestartSec = 15; - systemd.services.prometheus-lnd-exporter.after = [ "lnd.service" ]; - services.bitcoind.regtest = { - enable = true; - extraConfig = '' - rpcauth=bitcoinrpc:e8fe33f797e698ac258c16c8d7aadfbe$872bdb8f4d787367c26bcfd75e6c23c4f19d44a69f5d1ad329e5adf3f82710f7 - zmqpubrawblock=tcp://127.0.0.1:28332 - zmqpubrawtx=tcp://127.0.0.1:28333 - # https://github.com/lightningnetwork/lnd/issues/9163 - deprecatedrpc=warnings - ''; - extraCmdlineOptions = [ "-regtest" ]; - }; - systemd.services.lnd = { - serviceConfig.ExecStart = '' - ${pkgs.lnd}/bin/lnd \ - --datadir=/var/lib/lnd \ - --tlscertpath=/var/lib/lnd/tls.cert \ - --tlskeypath=/var/lib/lnd/tls.key \ - --logdir=/var/log/lnd \ - --bitcoin.active \ - --bitcoin.regtest \ - --bitcoin.node=bitcoind \ - --bitcoind.rpcuser=bitcoinrpc \ - --bitcoind.rpcpass=hunter2 \ - --bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332 \ - --bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333 \ - --readonlymacaroonpath=/var/lib/lnd/readonly.macaroon - ''; - serviceConfig.StateDirectory = "lnd"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - }; - # initialize wallet, creates macaroon needed by exporter - systemd.services.lnd.postStart = '' - ${pkgs.curl}/bin/curl \ - --retry 20 \ - --retry-delay 1 \ - --retry-connrefused \ - --cacert /var/lib/lnd/tls.cert \ - -X GET \ - https://localhost:8080/v1/genseed | ${pkgs.jq}/bin/jq -c '.cipher_seed_mnemonic' > /tmp/seed - ${pkgs.curl}/bin/curl \ - --retry 20 \ - --retry-delay 1 \ - --retry-connrefused \ - --cacert /var/lib/lnd/tls.cert \ - -X POST \ - -d "{\"wallet_password\": \"asdfasdfasdf\", \"cipher_seed_mnemonic\": $(cat /tmp/seed | tr -d '\n')}" \ - https://localhost:8080/v1/initwallet + exporterTest = '' + wait_for_unit("prometheus-idrac-exporter.service") + wait_for_open_port(9348) + wait_until_succeeds("curl localhost:9348") ''; }; - exporterTest = '' - wait_for_unit("lnd.service") - wait_for_open_port(10009) - wait_for_unit("prometheus-lnd-exporter.service") - wait_for_open_port(9092) - succeed("curl -sSf localhost:9092/metrics | grep '^lnd_peer_count'") - ''; - }; - mail = { - exporterConfig = { - enable = true; - configuration = { - monitoringInterval = "2s"; - mailCheckTimeout = "10s"; - servers = [ - { - name = "testserver"; - server = "localhost"; - port = 25; - from = "mail-exporter@localhost"; - to = "mail-exporter@localhost"; - detectionDir = "/var/spool/mail/mail-exporter/new"; - } - ]; - }; - }; - metricProvider = { - services.postfix.enable = true; - systemd.services.prometheus-mail-exporter = { - after = [ "postfix.service" ]; - requires = [ "postfix.service" ]; - serviceConfig = { - ExecStartPre = [ - "${pkgs.writeShellScript "create-maildir" '' - mkdir -p -m 0700 mail-exporter/new - ''}" - ]; - ProtectHome = true; - ReadOnlyPaths = "/"; - ReadWritePaths = "/var/spool/mail"; - WorkingDirectory = "/var/spool/mail"; - }; - }; - users.users.mailexporter = { - isSystemUser = true; - group = "mailexporter"; - }; - users.groups.mailexporter = { }; - }; - exporterTest = '' - wait_for_unit("postfix.service") - wait_for_unit("prometheus-mail-exporter.service") - wait_for_open_port(9225) - wait_until_succeeds( - "curl -sSf http://localhost:9225/metrics | grep 'mail_deliver_success{configname=\"testserver\"} 1'" - ) - ''; - }; - - mikrotik = { - exporterConfig = { - enable = true; - extraFlags = [ "-timeout=1s" ]; - configuration = { - devices = [ - { - name = "router"; - address = "192.168.42.48"; - user = "prometheus"; - password = "shh"; - } - ]; - features = { - bgp = true; - dhcp = true; - dhcpl = true; - dhcpv6 = true; - health = true; - routes = true; - poe = true; - pools = true; - optics = true; - w60g = true; - wlansta = true; - wlanif = true; - monitor = true; - ipsec = true; - }; - }; - }; - exporterTest = '' - wait_for_unit("prometheus-mikrotik-exporter.service") - wait_for_open_port(9436) - succeed( - "curl -sSf http://localhost:9436/metrics | grep 'mikrotik_scrape_collector_success{device=\"router\"} 0'" - ) - ''; - }; - - modemmanager = { - exporterConfig = { - enable = true; - refreshRate = "10s"; - }; - metricProvider = { - # ModemManager is installed when NetworkManager is enabled. Ensure it is - # started and is wanted by NM and the exporter to start everything up - # in the right order. - networking.networkmanager.enable = true; - systemd.services.ModemManager = { + influxdb = + { ... }: + { + exporterConfig = { enable = true; - wantedBy = [ - "NetworkManager.service" - "prometheus-modemmanager-exporter.service" - ]; + sampleExpiry = "3s"; }; - }; - exporterTest = '' - wait_for_unit("ModemManager.service") - wait_for_unit("prometheus-modemmanager-exporter.service") - wait_for_open_port(9539) - succeed( - "curl -sSf http://localhost:9539/metrics | grep 'modemmanager_info'" - ) - ''; - }; - - mqtt = { - exporterConfig = { - enable = true; - environmentFile = pkgs.writeText "mqtt-exporter-envfile" '' - MQTT_PASSWORD=testpassword + exporterTest = '' + wait_for_unit("prometheus-influxdb-exporter.service") + wait_for_open_port(9122) + succeed( + "curl -XPOST http://localhost:9122/write --data-binary 'influxdb_exporter,distro=nixos,added_in=21.09 value=1'" + ) + succeed( + "curl -sSf http://localhost:9122/metrics | grep 'nixos'" + ) + execute("sleep 5") + fail( + "curl -sSf http://localhost:9122/metrics | grep 'nixos'" + ) ''; }; - metricProvider = { - services.mosquitto = { - enable = true; - listeners = [ - { - users.exporter = { - acl = [ "read #" ]; - passwordFile = pkgs.writeText "mosquitto-password" "testpassword"; - }; - } - ]; - }; - systemd.services.prometheus-mqtt-exporter = { - wants = [ "mosquitto.service" ]; - after = [ "mosquitto.service" ]; - }; - }; - exporterTest = '' - wait_for_unit("mosquitto.service") - wait_for_unit("prometheus-mqtt-exporter.service") - wait_for_open_port(9000) - succeed( - "curl -sSf http://localhost:9000/metrics | grep '^python_info'" - ) - ''; - }; - mysqld = { - exporterConfig = { - enable = true; - runAsLocalSuperUser = true; - configFile = pkgs.writeText "test-prometheus-exporter-mysqld-config.my-cnf" '' - [client] - user = exporter - password = snakeoilpassword + ipmi = + { ... }: + { + exporterConfig = { + enable = true; + }; + exporterTest = '' + wait_for_unit("prometheus-ipmi-exporter.service") + wait_for_open_port(9290) + succeed( + "curl -sSf http://localhost:9290/metrics | grep 'ipmi_scrape_duration_seconds'" + ) ''; }; - metricProvider = { - services.mysql = { - enable = true; - package = pkgs.mariadb; - initialScript = pkgs.writeText "mysql-init-script.sql" '' - CREATE USER 'exporter'@'localhost' - IDENTIFIED BY 'snakeoilpassword' - WITH MAX_USER_CONNECTIONS 3; - GRANT PROCESS, REPLICATION CLIENT, SLAVE MONITOR, SELECT ON *.* TO 'exporter'@'localhost'; - ''; - }; - }; - exporterTest = '' - wait_for_unit("prometheus-mysqld-exporter.service") - wait_for_open_port(9104) - wait_for_unit("mysql.service") - succeed("curl -sSf http://localhost:9104/metrics | grep 'mysql_up 1'") - systemctl("stop mysql.service") - succeed("curl -sSf http://localhost:9104/metrics | grep 'mysql_up 0'") - systemctl("start mysql.service") - wait_for_unit("mysql.service") - succeed("curl -sSf http://localhost:9104/metrics | grep 'mysql_up 1'") - ''; - }; - nextcloud = { - exporterConfig = { - enable = true; - passwordFile = "/var/nextcloud-pwfile"; - url = "http://localhost"; - }; - metricProvider = { - systemd.services.nc-pwfile = - let - passfile = (pkgs.writeText "pwfile" "snakeoilpw"); - in - { - requiredBy = [ "prometheus-nextcloud-exporter.service" ]; - before = [ "prometheus-nextcloud-exporter.service" ]; - serviceConfig.ExecStart = '' - ${pkgs.coreutils}/bin/install -o nextcloud-exporter -m 0400 ${passfile} /var/nextcloud-pwfile - ''; - }; - services.nginx = { + jitsi = + { ... }: + { + exporterConfig = { enable = true; - virtualHosts."localhost" = { - basicAuth.nextcloud-exporter = "snakeoilpw"; - locations."/" = { - root = "${pkgs.prometheus-nextcloud-exporter.src}/serverinfo/testdata"; - tryFiles = "/negative-space.json =404"; - }; + }; + metricProvider = { + systemd.services.prometheus-jitsi-exporter.after = [ "jitsi-videobridge2.service" ]; + services.jitsi-videobridge = { + enable = true; + colibriRestApi = true; }; }; + exporterTest = '' + wait_for_unit("jitsi-videobridge2.service") + wait_for_open_port(8080) + wait_for_unit("prometheus-jitsi-exporter.service") + wait_for_open_port(9700) + wait_until_succeeds( + 'journalctl -eu prometheus-jitsi-exporter.service -o cat | grep "key=participants"' + ) + succeed("curl -sSf 'localhost:9700/metrics' | grep 'jitsi_participants 0'") + ''; }; - exporterTest = '' - wait_for_unit("nginx.service") - wait_for_unit("prometheus-nextcloud-exporter.service") - wait_for_open_port(9205) - succeed("curl -sSf http://localhost:9205/metrics | grep 'nextcloud_up 1'") - ''; - }; - nginx = { - exporterConfig = { - enable = true; - constLabels = [ "foo=bar" ]; - }; - metricProvider = { - services.nginx = { + json = + { pkgs, ... }: + { + exporterConfig = { enable = true; - statusPage = true; - virtualHosts."test".extraConfig = "return 204;"; - }; - }; - exporterTest = '' - wait_for_unit("nginx.service") - wait_for_unit("prometheus-nginx-exporter.service") - wait_for_open_port(9113) - succeed("curl -sSf http://localhost:9113/metrics | grep 'nginx_up{foo=\"bar\"} 1'") - ''; - }; - - nginxlog = { - exporterConfig = { - enable = true; - group = "nginx"; - settings = { - namespaces = [ - { - name = "filelogger"; - source = { - files = [ "/var/log/nginx/filelogger.access.log" ]; - }; - } - { - name = "syslogger"; - source = { - syslog = { - listen_address = "udp://127.0.0.1:10000"; - format = "rfc3164"; - tags = [ "nginx" ]; + configFile = pkgs.writeText "json-exporter-conf.json" ( + builtins.toJSON { + modules = { + default = { + metrics = [ + { + name = "json_test_metric"; + path = "{ .test }"; + } + ]; }; }; } - ]; + ); }; - }; - metricProvider = { - services.nginx = { - enable = true; - httpConfig = '' - server { - listen 80; - server_name filelogger.local; - access_log /var/log/nginx/filelogger.access.log; - } - server { - listen 81; - server_name syslogger.local; - access_log syslog:server=127.0.0.1:10000,tag=nginx,severity=info; - } - ''; + metricProvider = { + systemd.services.prometheus-json-exporter.after = [ "nginx.service" ]; + services.nginx = { + enable = true; + virtualHosts.localhost.locations."/".extraConfig = '' + return 200 "{\"test\":1}"; + ''; + }; }; - }; - exporterTest = '' - wait_for_unit("nginx.service") - wait_for_unit("prometheus-nginxlog-exporter.service") - wait_for_open_port(9117) - wait_for_open_port(80) - wait_for_open_port(81) - succeed("curl http://localhost") - execute("sleep 1") - succeed( - "curl -sSf http://localhost:9117/metrics | grep 'filelogger_http_response_count_total' | grep 1" - ) - succeed("curl http://localhost:81") - execute("sleep 1") - succeed( - "curl -sSf http://localhost:9117/metrics | grep 'syslogger_http_response_count_total' | grep 1" - ) - ''; - }; - - node = { - exporterConfig = { - enable = true; - }; - exporterTest = '' - wait_for_unit("prometheus-node-exporter.service") - wait_for_open_port(9100) - succeed( - "curl -sSf http://localhost:9100/metrics | grep 'node_exporter_build_info{.\\+} 1'" - ) - ''; - }; - - node-cert = { - nodeName = "node_cert"; - exporterConfig = { - enable = true; - paths = [ "/run/certs" ]; - }; - exporterTest = '' - wait_for_unit("prometheus-node-cert-exporter.service") - wait_for_open_port(9141) - wait_until_succeeds( - "curl -sSf http://localhost:9141/metrics | grep 'ssl_certificate_expiry_seconds{.\\+path=\"/run/certs/node-cert\\.cert\".\\+}'" - ) - ''; - - metricProvider = { - system.activationScripts.cert.text = '' - mkdir -p /run/certs - cd /run/certs - - cat >ca.template < /tmp/seed + ${pkgs.curl}/bin/curl \ + --retry 20 \ + --retry-delay 1 \ + --retry-connrefused \ + --cacert /var/lib/lnd/tls.cert \ + -X POST \ + -d "{\"wallet_password\": \"asdfasdfasdf\", \"cipher_seed_mnemonic\": $(cat /tmp/seed | tr -d '\n')}" \ + https://localhost:8080/v1/initwallet + ''; + }; + exporterTest = '' + wait_for_unit("lnd.service") + wait_for_open_port(10009) + wait_for_unit("prometheus-lnd-exporter.service") + wait_for_open_port(9092) + succeed("curl -sSf localhost:9092/metrics | grep '^lnd_peer_count'") + ''; + }; + + mail = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + configuration = { + monitoringInterval = "2s"; + mailCheckTimeout = "10s"; + servers = [ + { + name = "testserver"; + server = "localhost"; + port = 25; + from = "mail-exporter@localhost"; + to = "mail-exporter@localhost"; + detectionDir = "/var/spool/mail/mail-exporter/new"; + } + ]; + }; + }; + metricProvider = { + services.postfix.enable = true; + systemd.services.prometheus-mail-exporter = { + after = [ "postfix.service" ]; + requires = [ "postfix.service" ]; + serviceConfig = { + ExecStartPre = [ + "${pkgs.writeShellScript "create-maildir" '' + mkdir -p -m 0700 mail-exporter/new + ''}" ]; + ProtectHome = true; + ReadOnlyPaths = "/"; + ReadWritePaths = "/var/spool/mail"; + WorkingDirectory = "/var/spool/mail"; + }; + }; + users.users.mailexporter = { + isSystemUser = true; + group = "mailexporter"; + }; + users.groups.mailexporter = { }; + }; + exporterTest = '' + wait_for_unit("postfix.service") + wait_for_unit("prometheus-mail-exporter.service") + wait_for_open_port(9225) + wait_until_succeeds( + "curl -sSf http://localhost:9225/metrics | grep 'mail_deliver_success{configname=\"testserver\"} 1'" + ) + ''; + }; + + mikrotik = + { ... }: + { + exporterConfig = { + enable = true; + extraFlags = [ "-timeout=1s" ]; + configuration = { + devices = [ + { + name = "router"; + address = "192.168.42.48"; + user = "prometheus"; + password = "shh"; + } + ]; + features = { + bgp = true; + dhcp = true; + dhcpl = true; + dhcpv6 = true; + health = true; + routes = true; + poe = true; + pools = true; + optics = true; + w60g = true; + wlansta = true; + wlanif = true; + monitor = true; + ipsec = true; }; }; }; + exporterTest = '' + wait_for_unit("prometheus-mikrotik-exporter.service") + wait_for_open_port(9436) + succeed( + "curl -sSf http://localhost:9436/metrics | grep 'mikrotik_scrape_collector_success{device=\"router\"} 0'" + ) + ''; }; - exporterTest = '' - wait_for_unit("postgresql.target") - wait_for_unit("pgbouncer.service") - wait_for_unit("prometheus-pgbouncer-exporter.service") - wait_for_open_port(9127) - succeed("curl -sSf http://localhost:9127/metrics | grep 'pgbouncer_up 1'") - succeed( - "curl -sSf http://localhost:9127/metrics | grep 'pgbouncer_config_max_client_connections 99'" - ) - ''; - }; - php-fpm = { - nodeName = "php_fpm"; - exporterConfig = { - enable = true; - environmentFile = pkgs.writeTextFile { - name = "/tmp/prometheus-php-fpm-exporter.env"; - text = '' - PHP_FPM_SCRAPE_URI="tcp://127.0.0.1:9000/status" + modemmanager = + { ... }: + { + exporterConfig = { + enable = true; + refreshRate = "10s"; + }; + metricProvider = { + # ModemManager is installed when NetworkManager is enabled. Ensure it is + # started and is wanted by NM and the exporter to start everything up + # in the right order. + networking.networkmanager.enable = true; + systemd.services.ModemManager = { + enable = true; + wantedBy = [ + "NetworkManager.service" + "prometheus-modemmanager-exporter.service" + ]; + }; + }; + exporterTest = '' + wait_for_unit("ModemManager.service") + wait_for_unit("prometheus-modemmanager-exporter.service") + wait_for_open_port(9539) + succeed( + "curl -sSf http://localhost:9539/metrics | grep 'modemmanager_info'" + ) + ''; + }; + + mqtt = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + environmentFile = pkgs.writeText "mqtt-exporter-envfile" '' + MQTT_PASSWORD=testpassword + ''; + }; + metricProvider = { + services.mosquitto = { + enable = true; + listeners = [ + { + users.exporter = { + acl = [ "read #" ]; + passwordFile = pkgs.writeText "mosquitto-password" "testpassword"; + }; + } + ]; + }; + systemd.services.prometheus-mqtt-exporter = { + wants = [ "mosquitto.service" ]; + after = [ "mosquitto.service" ]; + }; + }; + exporterTest = '' + wait_for_unit("mosquitto.service") + wait_for_unit("prometheus-mqtt-exporter.service") + wait_for_open_port(9000) + succeed( + "curl -sSf http://localhost:9000/metrics | grep '^python_info'" + ) + ''; + }; + + mysqld = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + runAsLocalSuperUser = true; + configFile = pkgs.writeText "test-prometheus-exporter-mysqld-config.my-cnf" '' + [client] + user = exporter + password = snakeoilpassword + ''; + }; + metricProvider = { + services.mysql = { + enable = true; + package = pkgs.mariadb; + initialScript = pkgs.writeText "mysql-init-script.sql" '' + CREATE USER 'exporter'@'localhost' + IDENTIFIED BY 'snakeoilpassword' + WITH MAX_USER_CONNECTIONS 3; + GRANT PROCESS, REPLICATION CLIENT, SLAVE MONITOR, SELECT ON *.* TO 'exporter'@'localhost'; + ''; + }; + }; + exporterTest = '' + wait_for_unit("prometheus-mysqld-exporter.service") + wait_for_open_port(9104) + wait_for_unit("mysql.service") + succeed("curl -sSf http://localhost:9104/metrics | grep 'mysql_up 1'") + systemctl("stop mysql.service") + succeed("curl -sSf http://localhost:9104/metrics | grep 'mysql_up 0'") + systemctl("start mysql.service") + wait_for_unit("mysql.service") + succeed("curl -sSf http://localhost:9104/metrics | grep 'mysql_up 1'") + ''; + }; + + nextcloud = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + passwordFile = "/var/nextcloud-pwfile"; + url = "http://localhost"; + }; + metricProvider = { + systemd.services.nc-pwfile = + let + passfile = (pkgs.writeText "pwfile" "snakeoilpw"); + in + { + requiredBy = [ "prometheus-nextcloud-exporter.service" ]; + before = [ "prometheus-nextcloud-exporter.service" ]; + serviceConfig.ExecStart = '' + ${pkgs.coreutils}/bin/install -o nextcloud-exporter -m 0400 ${passfile} /var/nextcloud-pwfile + ''; + }; + services.nginx = { + enable = true; + virtualHosts."localhost" = { + basicAuth.nextcloud-exporter = "snakeoilpw"; + locations."/" = { + root = "${pkgs.prometheus-nextcloud-exporter.src}/serverinfo/testdata"; + tryFiles = "/negative-space.json =404"; + }; + }; + }; + }; + exporterTest = '' + wait_for_unit("nginx.service") + wait_for_unit("prometheus-nextcloud-exporter.service") + wait_for_open_port(9205) + succeed("curl -sSf http://localhost:9205/metrics | grep 'nextcloud_up 1'") + ''; + }; + + nginx = + { ... }: + { + exporterConfig = { + enable = true; + constLabels = [ "foo=bar" ]; + }; + metricProvider = { + services.nginx = { + enable = true; + statusPage = true; + virtualHosts."test".extraConfig = "return 204;"; + }; + }; + exporterTest = '' + wait_for_unit("nginx.service") + wait_for_unit("prometheus-nginx-exporter.service") + wait_for_open_port(9113) + succeed("curl -sSf http://localhost:9113/metrics | grep 'nginx_up{foo=\"bar\"} 1'") + ''; + }; + + nginxlog = + { ... }: + { + exporterConfig = { + enable = true; + group = "nginx"; + settings = { + namespaces = [ + { + name = "filelogger"; + source = { + files = [ "/var/log/nginx/filelogger.access.log" ]; + }; + } + { + name = "syslogger"; + source = { + syslog = { + listen_address = "udp://127.0.0.1:10000"; + format = "rfc3164"; + tags = [ "nginx" ]; + }; + }; + } + ]; + }; + }; + metricProvider = { + services.nginx = { + enable = true; + httpConfig = '' + server { + listen 80; + server_name filelogger.local; + access_log /var/log/nginx/filelogger.access.log; + } + server { + listen 81; + server_name syslogger.local; + access_log syslog:server=127.0.0.1:10000,tag=nginx,severity=info; + } + ''; + }; + }; + exporterTest = '' + wait_for_unit("nginx.service") + wait_for_unit("prometheus-nginxlog-exporter.service") + wait_for_open_port(9117) + wait_for_open_port(80) + wait_for_open_port(81) + succeed("curl http://localhost") + execute("sleep 1") + succeed( + "curl -sSf http://localhost:9117/metrics | grep 'filelogger_http_response_count_total' | grep 1" + ) + succeed("curl http://localhost:81") + execute("sleep 1") + succeed( + "curl -sSf http://localhost:9117/metrics | grep 'syslogger_http_response_count_total' | grep 1" + ) + ''; + }; + + node = + { ... }: + { + exporterConfig = { + enable = true; + }; + exporterTest = '' + wait_for_unit("prometheus-node-exporter.service") + wait_for_open_port(9100) + succeed( + "curl -sSf http://localhost:9100/metrics | grep 'node_exporter_build_info{.\\+} 1'" + ) + ''; + }; + + node-cert = + { pkgs, ... }: + { + nodeName = "node_cert"; + exporterConfig = { + enable = true; + paths = [ "/run/certs" ]; + }; + exporterTest = '' + wait_for_unit("prometheus-node-cert-exporter.service") + wait_for_open_port(9141) + wait_until_succeeds( + "curl -sSf http://localhost:9141/metrics | grep 'ssl_certificate_expiry_seconds{.\\+path=\"/run/certs/node-cert\\.cert\".\\+}'" + ) + ''; + + metricProvider = { + system.activationScripts.cert.text = '' + mkdir -p /run/certs + cd /run/certs + + cat >ca.template <[^ /]*) (?P.*)" ]; } ]; - dns = { }; - ping = { - interval = "2s"; - timeout = "3s"; - history-size = 42; - payload-size = 56; - }; - log = { - level = "warn"; - }; }; + exporterTest = '' + wait_for_unit("prometheus-process-exporter.service") + wait_for_open_port(9256) + wait_until_succeeds( + "curl -sSf localhost:9256/metrics | grep -q '{}'".format( + 'namedprocess_namegroup_cpu_seconds_total{groupname="process-exporter ' + ) + ) + ''; }; - exporterTest = '' - wait_for_unit("prometheus-ping-exporter.service") - wait_for_open_port(9427) - succeed("curl -sSf http://localhost:9427/metrics | grep 'ping_up{.*} 1'") - ''; - }; - - postfix = { - exporterConfig = { - enable = true; - }; - metricProvider = { - services.postfix.enable = true; - }; - exporterTest = '' - wait_for_unit("prometheus-postfix-exporter.service") - wait_for_file("/var/lib/postfix/queue/public/showq") - wait_for_open_port(9154) - wait_until_succeeds( - "curl -sSf http://localhost:9154/metrics | grep 'postfix_up{path=\"unix:///var/lib/postfix/queue/public/showq\"} 1'" - ) - succeed( - "curl -sSf http://localhost:9154/metrics | grep 'postfix_smtpd_connects_total 0'" - ) - succeed("curl -sSf http://localhost:9154/metrics | grep 'postfix_up{.*} 1'") - ''; - }; - - postgres = { - exporterConfig = { - enable = true; - runAsLocalSuperUser = true; - }; - metricProvider = { - services.postgresql.enable = true; - }; - exporterTest = '' - wait_for_unit("prometheus-postgres-exporter.service") - wait_for_open_port(9187) - wait_for_unit("postgresql.target") - succeed( - "curl -sSf http://localhost:9187/metrics | grep 'pg_exporter_last_scrape_error 0'" - ) - succeed("curl -sSf http://localhost:9187/metrics | grep 'pg_up 1'") - systemctl("stop postgresql") - succeed( - "curl -sSf http://localhost:9187/metrics | grep -v 'pg_exporter_last_scrape_error 0'" - ) - succeed("curl -sSf http://localhost:9187/metrics | grep 'pg_up 0'") - systemctl("start postgresql") - wait_for_unit("postgresql.target") - succeed( - "curl -sSf http://localhost:9187/metrics | grep 'pg_exporter_last_scrape_error 0'" - ) - succeed("curl -sSf http://localhost:9187/metrics | grep 'pg_up 1'") - ''; - }; - - process = { - exporterConfig = { - enable = true; - settings.process_names = [ - # Remove nix store path from process name - { - name = "{{.Matches.Wrapped}} {{ .Matches.Args }}"; - cmdline = [ "^/nix/store[^ ]*/(?P[^ /]*) (?P.*)" ]; - } - ]; - }; - exporterTest = '' - wait_for_unit("prometheus-process-exporter.service") - wait_for_open_port(9256) - wait_until_succeeds( - "curl -sSf localhost:9256/metrics | grep -q '{}'".format( - 'namedprocess_namegroup_cpu_seconds_total{groupname="process-exporter ' - ) - ) - ''; - }; - pve = + { pkgs, ... }: let pveExporterEnvFile = pkgs.writeTextFile { name = "pve.env"; @@ -1375,36 +1447,41 @@ let ''; }; - py-air-control = { - nodeName = "py_air_control"; - exporterConfig = { - enable = true; - deviceHostname = "127.0.0.1"; + py-air-control = + { ... }: + { + nodeName = "py_air_control"; + exporterConfig = { + enable = true; + deviceHostname = "127.0.0.1"; + }; + exporterTest = '' + wait_for_unit("prometheus-py-air-control-exporter.service") + wait_for_open_port(9896) + succeed( + "curl -sSf http://localhost:9896/metrics | grep 'py_air_control_sampling_error_total'" + ) + ''; }; - exporterTest = '' - wait_for_unit("prometheus-py-air-control-exporter.service") - wait_for_open_port(9896) - succeed( - "curl -sSf http://localhost:9896/metrics | grep 'py_air_control_sampling_error_total'" - ) - ''; - }; - redis = { - exporterConfig = { - enable = true; + redis = + { ... }: + { + exporterConfig = { + enable = true; + }; + metricProvider.services.redis.servers."".enable = true; + exporterTest = '' + wait_for_unit("redis.service") + wait_for_unit("prometheus-redis-exporter.service") + wait_for_open_port(6379) + wait_for_open_port(9121) + wait_until_succeeds("curl -sSf localhost:9121/metrics | grep 'redis_up 1'") + ''; }; - metricProvider.services.redis.servers."".enable = true; - exporterTest = '' - wait_for_unit("redis.service") - wait_for_unit("prometheus-redis-exporter.service") - wait_for_open_port(6379) - wait_for_open_port(9121) - wait_until_succeeds("curl -sSf localhost:9121/metrics | grep 'redis_up 1'") - ''; - }; restic = + { pkgs, ... }: let repository = "rest:http://127.0.0.1:8000"; passwordFile = pkgs.writeText "restic-test-password" "test-password"; @@ -1437,501 +1514,540 @@ let ''; }; - rspamd = { - exporterConfig = { - enable = true; - }; - metricProvider = { - services.rspamd.enable = true; - }; - exporterTest = '' - wait_for_unit("rspamd.service") - wait_for_unit("prometheus-rspamd-exporter.service") - wait_for_open_port(11334) - wait_for_open_port(7980) - wait_until_succeeds( - "curl -sSf 'localhost:7980/probe?target=http://localhost:11334/stat' | grep 'rspamd_scanned{host=\"rspamd\"} 0'" - ) - ''; - }; - - rtl_433 = { - exporterConfig = { - enable = true; - }; - metricProvider = { - # Mock rtl_433 binary to return a dummy metric stream. - nixpkgs.overlays = [ - (self: super: { - rtl_433 = self.runCommand "rtl_433" { } '' - mkdir -p "$out/bin" - cat < "$out/bin/rtl_433" - #!/bin/sh - while true; do - printf '{"time" : "2020-04-26 13:37:42", "model" : "zopieux", "id" : 55, "channel" : 3, "temperature_C" : 18.000}\n' - sleep 4 - done - EOF - chmod +x "$out/bin/rtl_433" - ''; - }) - ]; - }; - exporterTest = '' - wait_for_unit("prometheus-rtl_433-exporter.service") - wait_for_open_port(9550) - wait_until_succeeds( - "curl -sSf localhost:9550/metrics | grep '{}'".format( - 'rtl_433_temperature_celsius{channel="3",id="55",location="",model="zopieux"} 18' - ) - ) - ''; - }; - - sabnzbd = { - exporterConfig = { - enable = true; - servers = [ - { - baseUrl = "http://localhost:8080"; - apiKeyFile = "/var/sabnzbd-apikey"; - } - ]; - }; - - metricProvider = { - services.sabnzbd.enable = true; - - # extract the generated api key before starting - systemd.services.sabnzbd-apikey = { - requires = [ "sabnzbd.service" ]; - after = [ "sabnzbd.service" ]; - requiredBy = [ "prometheus-sabnzbd-exporter.service" ]; - before = [ "prometheus-sabnzbd-exporter.service" ]; - script = '' - grep -Po '^api_key = \K.+' /var/lib/sabnzbd/sabnzbd.ini > /var/sabnzbd-apikey - ''; - }; - }; - - exporterTest = '' - wait_for_unit("sabnzbd.service") - wait_for_unit("prometheus-sabnzbd-exporter.service") - wait_for_open_port(8080) - wait_for_open_port(9387) - wait_until_succeeds( - "curl -sSf 'localhost:9387/metrics' | grep 'sabnzbd_queue_size{sabnzbd_instance=\"http://localhost:8080\"} 0.0'" - ) - ''; - }; - - scaphandre = { - exporterConfig = { - enable = true; - }; - metricProvider = { - boot.kernelModules = [ "intel_rapl_common" ]; - }; - exporterTest = '' - wait_for_unit("prometheus-scaphandre-exporter.service") - wait_for_open_port(8080) - wait_until_succeeds( - "curl -sSf 'localhost:8080/metrics'" - ) - ''; - }; - - shelly = { - exporterConfig = { - enable = true; - metrics-file = "${pkgs.writeText "test.json" ''{}''}"; - }; - exporterTest = '' - wait_for_unit("prometheus-shelly-exporter.service") - wait_for_open_port(9784) - wait_until_succeeds( - "curl -sSf 'localhost:9784/metrics'" - ) - ''; - }; - - script = { - exporterConfig = { - enable = true; - settings.scripts = [ - { - name = "success"; - command = [ "sleep" ]; - args = [ "1" ]; - } - ]; - }; - exporterTest = '' - wait_for_unit("prometheus-script-exporter.service") - wait_for_open_port(9172) - wait_until_succeeds( - "curl -sSf 'localhost:9172/probe?script=success' | grep -q '{}'".format( - 'script_success{script="success"} 1' - ) - ) - ''; - }; - - smartctl = { - exporterConfig = { - enable = true; - devices = [ - "/dev/vda" - ]; - }; - exporterTest = '' - wait_until_succeeds( - 'journalctl -eu prometheus-smartctl-exporter.service -o cat | grep "Unable to detect device type"' - ) - ''; - }; - - smokeping = { - exporterConfig = { - enable = true; - hosts = [ "127.0.0.1" ]; - }; - exporterTest = '' - wait_for_unit("prometheus-smokeping-exporter.service") - wait_for_open_port(9374) - wait_until_succeeds( - "curl -sSf localhost:9374/metrics | grep '{}' | grep -v ' 0$'".format( - 'smokeping_requests_total{host="127.0.0.1",ip="127.0.0.1",source="",tos="0"} ' - ) - ) - wait_until_succeeds( - "curl -sSf localhost:9374/metrics | grep '{}'".format( - 'smokeping_response_ttl{host="127.0.0.1",ip="127.0.0.1",source="",tos="0"}' - ) - ) - ''; - }; - - storagebox = { - exporterConfig = { - enable = true; - tokenFile = "/tmp/faketoken"; - }; - exporterTest = '' - succeed( - 'echo faketoken > /tmp/faketoken' - ) - wait_for_unit("prometheus-storagebox-exporter.service") - wait_for_open_port(9509) - succeed("curl -sSf localhost:9509/metrics | grep 'process_open_fds'") - ''; - }; - - snmp = { - exporterConfig = { - enable = true; - configuration = { - auths.public_v2 = { - community = "public"; - version = 2; - }; - }; - }; - exporterTest = '' - wait_for_unit("prometheus-snmp-exporter.service") - wait_for_open_port(9116) - succeed("curl -sSf localhost:9116/metrics | grep 'snmp_request_errors_total 0'") - ''; - }; - - sql = { - exporterConfig = { - configuration.jobs.points = { - interval = "1m"; - connections = [ - "postgres://prometheus-sql-exporter@/data?host=/run/postgresql&sslmode=disable" - ]; - queries = { - points = { - labels = [ "name" ]; - help = "Amount of points accumulated per person"; - values = [ "amount" ]; - query = "SELECT SUM(amount) as amount, name FROM points GROUP BY name"; - }; - }; - }; - enable = true; - user = "prometheus-sql-exporter"; - }; - metricProvider = { - services.postgresql = { + rspamd = + { ... }: + { + exporterConfig = { enable = true; - initialScript = builtins.toFile "init.sql" '' - CREATE DATABASE data; - \c data; - CREATE TABLE points (amount INT, name TEXT); - INSERT INTO points(amount, name) VALUES (1, 'jack'); - INSERT INTO points(amount, name) VALUES (2, 'jill'); - INSERT INTO points(amount, name) VALUES (3, 'jack'); - - CREATE USER "prometheus-sql-exporter"; - GRANT ALL PRIVILEGES ON DATABASE data TO "prometheus-sql-exporter"; - GRANT SELECT ON points TO "prometheus-sql-exporter"; - ''; }; - systemd.services.prometheus-sql-exporter.after = [ "postgresql.target" ]; - }; - exporterTest = '' - wait_for_unit("prometheus-sql-exporter.service") - wait_for_open_port(9237) - succeed("curl http://localhost:9237/metrics | grep -c 'sql_points{' | grep 2") - ''; - }; - - statsd = { - exporterConfig = { - enable = true; - }; - exporterTest = '' - wait_for_unit("prometheus-statsd-exporter.service") - wait_for_open_port(9102) - succeed("curl http://localhost:9102/metrics | grep 'statsd_exporter_build_info{'") - wait_until_succeeds( - "echo 'test.udp:1|c' > /dev/udp/localhost/9125 && \ - curl http://localhost:9102/metrics | grep 'test_udp 1'", - timeout=10 - ) - wait_until_succeeds( - "echo 'test.tcp:1|c' > /dev/tcp/localhost/9125 && \ - curl http://localhost:9102/metrics | grep 'test_tcp 1'", - timeout=10 - ) - ''; - }; - - surfboard = { - exporterConfig = { - enable = true; - modemAddress = "localhost"; - }; - metricProvider = { - systemd.services.prometheus-surfboard-exporter.after = [ "nginx.service" ]; - services.nginx = { - enable = true; - virtualHosts.localhost.locations."/cgi-bin/status".extraConfig = '' - return 204; - ''; + metricProvider = { + services.rspamd.enable = true; }; - }; - exporterTest = '' - wait_for_unit("nginx.service") - wait_for_open_port(80) - wait_for_unit("prometheus-surfboard-exporter.service") - wait_for_open_port(9239) - succeed("curl -sSf localhost:9239/metrics | grep 'surfboard_up 1'") - ''; - }; - - systemd = { - exporterConfig = { - enable = true; - - extraFlags = [ - "--systemd.collector.enable-restart-count" - ]; - }; - metricProvider = { }; - exporterTest = '' - wait_for_unit("prometheus-systemd-exporter.service") - wait_for_open_port(9558) - wait_until_succeeds( - "curl -sSf localhost:9558/metrics | grep '{}'".format( - 'systemd_unit_state{name="basic.target",state="active",type="target"} 1' - ) - ) - succeed( - "curl -sSf localhost:9558/metrics | grep '{}'".format( - 'systemd_service_restart_total{name="prometheus-systemd-exporter.service"} 0' - ) - ) - ''; - }; - - tailscale = { - exporterConfig = { - package = pkgs.prometheus-tailscale-exporter.overrideAttrs { - patches = [ - # This patch prevents the exporter from exiting immediately upon - # startup when no credentials are provided, which is useful for - # testing the NixOS module. - (pkgs.writeText "allow-running-without-credentials" '' - diff --git a/cmd/tailscale-exporter/root.go b/cmd/tailscale-exporter/root.go - index 2ff11cb..2fb576f 100644 - --- a/cmd/tailscale-exporter/root.go - +++ b/cmd/tailscale-exporter/root.go - @@ -137,14 +137,6 @@ func runExporter(cmd *cobra.Command, args []string) error { - ''\t// Create HTTP client that automatically handles token refresh - ''\thttpClient := oauthConfig.Client(context.Background()) - - -''\t// Test OAuth token generation - -''\ttoken, err := oauthConfig.Token(context.Background()) - -''\tif err != nil { - -''\t''\treturn fmt.Errorf("failed to obtain OAuth token: %w", err) - -''\t} - -''\tlogger.Info("OAuth token obtained", "token_type", token.TokenType) - -''\tlogger.Info("Successfully obtained OAuth token", "expires", token.Expiry) - - - ''\t// Default labels for all metrics - ''\tdefaultLabels := prometheus.Labels{"tailnet": tailnet} - ''\treg := prometheus.WrapRegistererWith( - '') - ]; - }; - enable = true; - environmentFile = pkgs.writeText "tailscale-exporter-env" '' - TAILSCALE_OAUTH_CLIENT_ID=12345678 - TAILSCALE_OAUTH_CLIENT_SECRET=12345678 - TAILSCALE_TAILNET=example.com + exporterTest = '' + wait_for_unit("rspamd.service") + wait_for_unit("prometheus-rspamd-exporter.service") + wait_for_open_port(11334) + wait_for_open_port(7980) + wait_until_succeeds( + "curl -sSf 'localhost:7980/probe?target=http://localhost:11334/stat' | grep 'rspamd_scanned{host=\"rspamd\"} 0'" + ) ''; }; - exporterTest = '' - wait_for_unit("prometheus-tailscale-exporter.service") - wait_for_open_port(9250) - succeed("curl -sSf localhost:9250/metrics | grep 'tailscale_up{tailnet=\"example.com\"} 1'") - ''; - }; - - unpoller = { - nodeName = "unpoller"; - exporterConfig.enable = true; - exporterConfig.controllers = [ { } ]; - exporterTest = '' - wait_until_succeeds( - 'journalctl -eu prometheus-unpoller-exporter.service -o cat | grep "Connection Error"' - ) - ''; - }; - - unbound = { - exporterConfig = { - enable = true; - unbound.host = "unix:///run/unbound/unbound.ctl"; - }; - metricProvider = { - services.unbound = { + rtl_433 = + { ... }: + { + pkgsReadOnly = false; + exporterConfig = { enable = true; - localControlSocketPath = "/run/unbound/unbound.ctl"; }; - systemd.services.prometheus-unbound-exporter.serviceConfig = { - SupplementaryGroups = [ "unbound" ]; + metricProvider = { + # Mock rtl_433 binary to return a dummy metric stream. + nixpkgs.overlays = [ + (self: super: { + rtl_433 = self.runCommand "rtl_433" { } '' + mkdir -p "$out/bin" + cat < "$out/bin/rtl_433" + #!/bin/sh + while true; do + printf '{"time" : "2020-04-26 13:37:42", "model" : "zopieux", "id" : 55, "channel" : 3, "temperature_C" : 18.000}\n' + sleep 4 + done + EOF + chmod +x "$out/bin/rtl_433" + ''; + }) + ]; }; - }; - exporterTest = '' - wait_for_unit("unbound.service") - wait_for_unit("prometheus-unbound-exporter.service") - wait_for_open_port(9167) - wait_until_succeeds("curl -sSf localhost:9167/metrics | grep 'unbound_up 1'") - ''; - }; - - v2ray = { - exporterConfig = { - enable = true; + exporterTest = '' + wait_for_unit("prometheus-rtl_433-exporter.service") + wait_for_open_port(9550) + wait_until_succeeds( + "curl -sSf localhost:9550/metrics | grep '{}'".format( + 'rtl_433_temperature_celsius{channel="3",id="55",location="",model="zopieux"} 18' + ) + ) + ''; }; - metricProvider = { - systemd.services.prometheus-nginx-exporter.after = [ "v2ray.service" ]; - services.v2ray = { + sabnzbd = + { ... }: + { + exporterConfig = { enable = true; - config = { - stats = { }; - api = { - tag = "api"; - services = [ "StatsService" ]; + servers = [ + { + baseUrl = "http://localhost:8080"; + apiKeyFile = "/var/sabnzbd-apikey"; + } + ]; + }; + + metricProvider = { + services.sabnzbd.enable = true; + + # extract the generated api key before starting + systemd.services.sabnzbd-apikey = { + requires = [ "sabnzbd.service" ]; + after = [ "sabnzbd.service" ]; + requiredBy = [ "prometheus-sabnzbd-exporter.service" ]; + before = [ "prometheus-sabnzbd-exporter.service" ]; + script = '' + grep -Po '^api_key = \K.+' /var/lib/sabnzbd/sabnzbd.ini > /var/sabnzbd-apikey + ''; + }; + }; + + exporterTest = '' + wait_for_unit("sabnzbd.service") + wait_for_unit("prometheus-sabnzbd-exporter.service") + wait_for_open_port(8080) + wait_for_open_port(9387) + wait_until_succeeds( + "curl -sSf 'localhost:9387/metrics' | grep 'sabnzbd_queue_size{sabnzbd_instance=\"http://localhost:8080\"} 0.0'" + ) + ''; + }; + + scaphandre = + { ... }: + { + exporterConfig = { + enable = true; + }; + metricProvider = { + boot.kernelModules = [ "intel_rapl_common" ]; + }; + exporterTest = '' + wait_for_unit("prometheus-scaphandre-exporter.service") + wait_for_open_port(8080) + wait_until_succeeds( + "curl -sSf 'localhost:8080/metrics'" + ) + ''; + }; + + shelly = + { pkgs, ... }: + { + exporterConfig = { + enable = true; + metrics-file = "${pkgs.writeText "test.json" ''{}''}"; + }; + exporterTest = '' + wait_for_unit("prometheus-shelly-exporter.service") + wait_for_open_port(9784) + wait_until_succeeds( + "curl -sSf 'localhost:9784/metrics'" + ) + ''; + }; + + script = + { ... }: + { + exporterConfig = { + enable = true; + settings.scripts = [ + { + name = "success"; + command = [ "sleep" ]; + args = [ "1" ]; + } + ]; + }; + exporterTest = '' + wait_for_unit("prometheus-script-exporter.service") + wait_for_open_port(9172) + wait_until_succeeds( + "curl -sSf 'localhost:9172/probe?script=success' | grep -q '{}'".format( + 'script_success{script="success"} 1' + ) + ) + ''; + }; + + smartctl = + { ... }: + { + exporterConfig = { + enable = true; + devices = [ + "/dev/vda" + ]; + }; + exporterTest = '' + wait_until_succeeds( + 'journalctl -eu prometheus-smartctl-exporter.service -o cat | grep "Unable to detect device type"' + ) + ''; + }; + + smokeping = + { ... }: + { + exporterConfig = { + enable = true; + hosts = [ "127.0.0.1" ]; + }; + exporterTest = '' + wait_for_unit("prometheus-smokeping-exporter.service") + wait_for_open_port(9374) + wait_until_succeeds( + "curl -sSf localhost:9374/metrics | grep '{}' | grep -v ' 0$'".format( + 'smokeping_requests_total{host="127.0.0.1",ip="127.0.0.1",source="",tos="0"} ' + ) + ) + wait_until_succeeds( + "curl -sSf localhost:9374/metrics | grep '{}'".format( + 'smokeping_response_ttl{host="127.0.0.1",ip="127.0.0.1",source="",tos="0"}' + ) + ) + ''; + }; + + storagebox = + { ... }: + { + exporterConfig = { + enable = true; + tokenFile = "/tmp/faketoken"; + }; + exporterTest = '' + succeed( + 'echo faketoken > /tmp/faketoken' + ) + wait_for_unit("prometheus-storagebox-exporter.service") + wait_for_open_port(9509) + succeed("curl -sSf localhost:9509/metrics | grep 'process_open_fds'") + ''; + }; + + snmp = + { ... }: + { + exporterConfig = { + enable = true; + configuration = { + auths.public_v2 = { + community = "public"; + version = 2; }; - inbounds = [ - { - port = 1080; - listen = "127.0.0.1"; - protocol = "http"; - } - { - listen = "127.0.0.1"; - port = 54321; - protocol = "dokodemo-door"; + }; + }; + exporterTest = '' + wait_for_unit("prometheus-snmp-exporter.service") + wait_for_open_port(9116) + succeed("curl -sSf localhost:9116/metrics | grep 'snmp_request_errors_total 0'") + ''; + }; + + sql = + { ... }: + { + exporterConfig = { + configuration.jobs.points = { + interval = "1m"; + connections = [ + "postgres://prometheus-sql-exporter@/data?host=/run/postgresql&sslmode=disable" + ]; + queries = { + points = { + labels = [ "name" ]; + help = "Amount of points accumulated per person"; + values = [ "amount" ]; + query = "SELECT SUM(amount) as amount, name FROM points GROUP BY name"; + }; + }; + }; + enable = true; + user = "prometheus-sql-exporter"; + }; + metricProvider = { + services.postgresql = { + enable = true; + initialScript = builtins.toFile "init.sql" '' + CREATE DATABASE data; + \c data; + CREATE TABLE points (amount INT, name TEXT); + INSERT INTO points(amount, name) VALUES (1, 'jack'); + INSERT INTO points(amount, name) VALUES (2, 'jill'); + INSERT INTO points(amount, name) VALUES (3, 'jack'); + + CREATE USER "prometheus-sql-exporter"; + GRANT ALL PRIVILEGES ON DATABASE data TO "prometheus-sql-exporter"; + GRANT SELECT ON points TO "prometheus-sql-exporter"; + ''; + }; + systemd.services.prometheus-sql-exporter.after = [ "postgresql.target" ]; + }; + exporterTest = '' + wait_for_unit("prometheus-sql-exporter.service") + wait_for_open_port(9237) + succeed("curl http://localhost:9237/metrics | grep -c 'sql_points{' | grep 2") + ''; + }; + + statsd = + { ... }: + { + exporterConfig = { + enable = true; + }; + exporterTest = '' + wait_for_unit("prometheus-statsd-exporter.service") + wait_for_open_port(9102) + succeed("curl http://localhost:9102/metrics | grep 'statsd_exporter_build_info{'") + wait_until_succeeds( + "echo 'test.udp:1|c' > /dev/udp/localhost/9125 && \ + curl http://localhost:9102/metrics | grep 'test_udp 1'", + timeout=10 + ) + wait_until_succeeds( + "echo 'test.tcp:1|c' > /dev/tcp/localhost/9125 && \ + curl http://localhost:9102/metrics | grep 'test_tcp 1'", + timeout=10 + ) + ''; + }; + + surfboard = + { ... }: + { + exporterConfig = { + enable = true; + modemAddress = "localhost"; + }; + metricProvider = { + systemd.services.prometheus-surfboard-exporter.after = [ "nginx.service" ]; + services.nginx = { + enable = true; + virtualHosts.localhost.locations."/cgi-bin/status".extraConfig = '' + return 204; + ''; + }; + }; + exporterTest = '' + wait_for_unit("nginx.service") + wait_for_open_port(80) + wait_for_unit("prometheus-surfboard-exporter.service") + wait_for_open_port(9239) + succeed("curl -sSf localhost:9239/metrics | grep 'surfboard_up 1'") + ''; + }; + + systemd = + { ... }: + { + exporterConfig = { + enable = true; + + extraFlags = [ + "--systemd.collector.enable-restart-count" + ]; + }; + metricProvider = { }; + exporterTest = '' + wait_for_unit("prometheus-systemd-exporter.service") + wait_for_open_port(9558) + wait_until_succeeds( + "curl -sSf localhost:9558/metrics | grep '{}'".format( + 'systemd_unit_state{name="basic.target",state="active",type="target"} 1' + ) + ) + succeed( + "curl -sSf localhost:9558/metrics | grep '{}'".format( + 'systemd_service_restart_total{name="prometheus-systemd-exporter.service"} 0' + ) + ) + ''; + }; + + tailscale = + { pkgs, ... }: + { + exporterConfig = { + package = pkgs.prometheus-tailscale-exporter.overrideAttrs { + patches = [ + # This patch prevents the exporter from exiting immediately upon + # startup when no credentials are provided, which is useful for + # testing the NixOS module. + (pkgs.writeText "allow-running-without-credentials" '' + diff --git a/cmd/tailscale-exporter/root.go b/cmd/tailscale-exporter/root.go + index 2ff11cb..2fb576f 100644 + --- a/cmd/tailscale-exporter/root.go + +++ b/cmd/tailscale-exporter/root.go + @@ -137,14 +137,6 @@ func runExporter(cmd *cobra.Command, args []string) error { + ''\t// Create HTTP client that automatically handles token refresh + ''\thttpClient := oauthConfig.Client(context.Background()) + + -''\t// Test OAuth token generation + -''\ttoken, err := oauthConfig.Token(context.Background()) + -''\tif err != nil { + -''\t''\treturn fmt.Errorf("failed to obtain OAuth token: %w", err) + -''\t} + -''\tlogger.Info("OAuth token obtained", "token_type", token.TokenType) + -''\tlogger.Info("Successfully obtained OAuth token", "expires", token.Expiry) + - + ''\t// Default labels for all metrics + ''\tdefaultLabels := prometheus.Labels{"tailnet": tailnet} + ''\treg := prometheus.WrapRegistererWith( + '') + ]; + }; + enable = true; + environmentFile = pkgs.writeText "tailscale-exporter-env" '' + TAILSCALE_OAUTH_CLIENT_ID=12345678 + TAILSCALE_OAUTH_CLIENT_SECRET=12345678 + TAILSCALE_TAILNET=example.com + ''; + }; + + exporterTest = '' + wait_for_unit("prometheus-tailscale-exporter.service") + wait_for_open_port(9250) + succeed("curl -sSf localhost:9250/metrics | grep 'tailscale_up{tailnet=\"example.com\"} 1'") + ''; + }; + + unpoller = + { ... }: + { + nodeName = "unpoller"; + exporterConfig.enable = true; + exporterConfig.controllers = [ { } ]; + exporterTest = '' + wait_until_succeeds( + 'journalctl -eu prometheus-unpoller-exporter.service -o cat | grep "Connection Error"' + ) + ''; + }; + + unbound = + { ... }: + { + exporterConfig = { + enable = true; + unbound.host = "unix:///run/unbound/unbound.ctl"; + }; + metricProvider = { + services.unbound = { + enable = true; + localControlSocketPath = "/run/unbound/unbound.ctl"; + }; + systemd.services.prometheus-unbound-exporter.serviceConfig = { + SupplementaryGroups = [ "unbound" ]; + }; + }; + exporterTest = '' + wait_for_unit("unbound.service") + wait_for_unit("prometheus-unbound-exporter.service") + wait_for_open_port(9167) + wait_until_succeeds("curl -sSf localhost:9167/metrics | grep 'unbound_up 1'") + ''; + }; + + v2ray = + { ... }: + { + exporterConfig = { + enable = true; + }; + + metricProvider = { + systemd.services.prometheus-nginx-exporter.after = [ "v2ray.service" ]; + services.v2ray = { + enable = true; + config = { + stats = { }; + api = { + tag = "api"; + services = [ "StatsService" ]; + }; + inbounds = [ + { + port = 1080; + listen = "127.0.0.1"; + protocol = "http"; + } + { + listen = "127.0.0.1"; + port = 54321; + protocol = "dokodemo-door"; + settings = { + address = "127.0.0.1"; + }; + tag = "api"; + } + ]; + outbounds = [ + { + protocol = "freedom"; + } + { + protocol = "freedom"; + settings = { }; + tag = "api"; + } + ]; + routing = { + strategy = "rules"; settings = { - address = "127.0.0.1"; + rules = [ + { + inboundTag = [ "api" ]; + outboundTag = "api"; + type = "field"; + } + ]; }; - tag = "api"; - } - ]; - outbounds = [ - { - protocol = "freedom"; - } - { - protocol = "freedom"; - settings = { }; - tag = "api"; - } - ]; - routing = { - strategy = "rules"; - settings = { - rules = [ - { - inboundTag = [ "api" ]; - outboundTag = "api"; - type = "field"; - } - ]; }; }; }; }; + exporterTest = '' + wait_for_unit("prometheus-v2ray-exporter.service") + wait_for_open_port(9299) + succeed("curl -sSf localhost:9299/scrape | grep 'v2ray_up 1'") + ''; }; - exporterTest = '' - wait_for_unit("prometheus-v2ray-exporter.service") - wait_for_open_port(9299) - succeed("curl -sSf localhost:9299/scrape | grep 'v2ray_up 1'") - ''; - }; - varnish = { - exporterConfig = { - enable = true; - instance = "/run/varnish/varnish"; - group = "varnish"; - }; - metricProvider = { - systemd.services.prometheus-varnish-exporter.after = [ - "varnish.service" - ]; - services.varnish = { + varnish = + { ... }: + { + exporterConfig = { enable = true; - stateDir = "/run/varnish/varnish"; - config = '' - vcl 4.0; - backend default { - .host = "127.0.0.1"; - .port = "80"; - } - ''; + instance = "/run/varnish/varnish"; + group = "varnish"; }; + metricProvider = { + systemd.services.prometheus-varnish-exporter.after = [ + "varnish.service" + ]; + services.varnish = { + enable = true; + config = '' + vcl 4.0; + backend default { + .host = "127.0.0.1"; + .port = "80"; + } + ''; + }; + }; + exporterTest = '' + wait_for_unit("prometheus-varnish-exporter.service") + wait_for_open_port(6081) + wait_for_open_port(9131) + succeed("curl -sSf http://localhost:9131/metrics | grep 'varnish_up 1'") + ''; }; - exporterTest = '' - wait_for_unit("prometheus-varnish-exporter.service") - wait_for_open_port(6081) - wait_for_open_port(9131) - succeed("curl -sSf http://localhost:9131/metrics | grep 'varnish_up 1'") - ''; - }; wireguard = + { pkgs, lib, ... }: let snakeoil = import ./wireguard/snakeoil-keys.nix; - publicKeyWithoutNewlines = replaceStrings [ "\n" ] [ "" ] snakeoil.peer1.publicKey; + publicKeyWithoutNewlines = lib.replaceStrings [ "\n" ] [ "" ] snakeoil.peer1.publicKey; in { exporterConfig.enable = true; @@ -1945,7 +2061,7 @@ let inherit (snakeoil.peer0) privateKey; - peers = singleton { + peers = lib.singleton { allowedIPs = [ "10.23.42.2/32" "fc00::2/128" @@ -1965,34 +2081,38 @@ let ''; }; - zfs = { - exporterConfig = { - enable = true; + zfs = + { ... }: + { + exporterConfig = { + enable = true; + }; + metricProvider = { + boot.supportedFilesystems = [ "zfs" ]; + networking.hostId = "7327ded7"; + }; + exporterTest = '' + wait_for_unit("prometheus-zfs-exporter.service") + wait_for_unit("zfs.target") + wait_for_open_port(9134) + wait_until_succeeds("curl -f localhost:9134/metrics | grep 'zfs_scrape_collector_success{.*} 1'") + ''; }; - metricProvider = { - boot.supportedFilesystems = [ "zfs" ]; - networking.hostId = "7327ded7"; - }; - exporterTest = '' - wait_for_unit("prometheus-zfs-exporter.service") - wait_for_unit("zfs.target") - wait_for_open_port(9134) - wait_until_succeeds("curl -f localhost:9134/metrics | grep 'zfs_scrape_collector_success{.*} 1'") - ''; - }; }; in -mapAttrs ( - exporter: testConfig: - (makeTest ( +lib.mapAttrs ( + exporter: testConfigFun: + (runTest ( + { pkgs, lib, ... }: let + testConfig = testConfigFun { inherit pkgs lib; }; nodeName = testConfig.nodeName or exporter; - in { name = "prometheus-${exporter}-exporter"; + node.pkgsReadOnly = testConfig.pkgsReadOnly or true; - nodes.${nodeName} = mkMerge [ + nodes.${nodeName} = lib.mkMerge [ { services.prometheus.exporters.${exporter} = testConfig.exporterConfig; } @@ -2001,7 +2121,7 @@ mapAttrs ( testScript = '' ${nodeName}.start() - ${concatStringsSep "\n" ( + ${lib.concatStringsSep "\n" ( map ( line: if @@ -2015,7 +2135,7 @@ mapAttrs ( line else "${nodeName}.${line}" - ) (splitString "\n" (removeSuffix "\n" testConfig.exporterTest)) + ) (lib.splitString "\n" (lib.removeSuffix "\n" testConfig.exporterTest)) )} ${nodeName}.shutdown() ''; diff --git a/nixos/tests/tandoor-recipes-media.nix b/nixos/tests/tandoor-recipes-media.nix new file mode 100644 index 000000000000..9384c9765efa --- /dev/null +++ b/nixos/tests/tandoor-recipes-media.nix @@ -0,0 +1,91 @@ +{ ... }: +{ + name = "tandoor-recipes-media"; + + nodes.machine = { + services.tandoor-recipes = { + enable = true; + # This setting is not recommended, but it's an easy way serve the media + # folder in this test. + extraConfig = { + GUNICORN_MEDIA = true; + }; + }; + + specialisation.oldVersion.configuration = { + system.stateVersion = "25.11"; + services.tandoor-recipes = { + enable = true; + extraConfig = { + GUNICORN_MEDIA = true; + # Explicitly set insecure value (skips warning) + MEDIA_ROOT = "/var/lib/tandoor-recipes"; + }; + }; + }; + + specialisation.oldVersionOverrideMedia.configuration = { + system.stateVersion = "25.11"; + services.tandoor-recipes = { + enable = true; + extraConfig = { + GUNICORN_MEDIA = true; + MEDIA_ROOT = "/var/lib/tandoor-recipes/media"; + }; + }; + }; + }; + + testScript = + { nodes, ... }: + let + specBase = "${nodes.machine.system.build.toplevel}/specialisation"; + oldVersion = "${specBase}/oldVersion"; + oldVersionOverrideMedia = "${specBase}/oldVersionOverrideMedia"; + in + # python + '' + def wait_for_tandoor(): + machine.wait_for_unit("tandoor-recipes.service") + machine.wait_for_open_port(8080) + + + def stop_and_rm(): + machine.systemctl("stop tandoor-recipes") + machine.succeed("rm -r /var/lib/tandoor-recipes") + + + db_path = "http://localhost:8080/media/db.sqlite3" + + + # The media folder shouldn't contain the database. Subsequently it + # should **not** get served, resulting in a 404. Previously the + # database was located in the media folder. Therefore serving the media + # folder would expose the database. See #338339. + wait_for_tandoor() + machine.succeed(f"curl --head {db_path} | grep \"HTTP/1.1 404 Not Found\"") + + + # Switch to NixOS 24.11 to check if the setup still functions the same + # as before. + stop_and_rm() + machine.succeed("${oldVersion}/bin/switch-to-configuration test") + + # With the old setup the media folder should contain the database. + # Subsequently it should get served, resulting in a 200. + wait_for_tandoor() + machine.succeed(f"curl --head {db_path} | grep \"HTTP/1.1 200 OK\"") + + + # Switch to NixOS 24.11 with the MEDIA_ROOT already set to + # /var/lib/tandoor-recipes/media. + stop_and_rm() + machine.succeed("${oldVersionOverrideMedia}/bin/switch-to-configuration test") + + # With MEDIA_ROOT being set to /var/lib/tandoor-recipes/media the media + # folder shouldn't contain the database. Subsequently it should **not** + # get served, resulting in a 404. + wait_for_tandoor() + machine.succeed(f"curl --head {db_path} | grep \"HTTP/1.1 404 Not Found\"") + ''; +} diff --git a/pkgs/applications/editors/vscode/generic.nix b/pkgs/applications/editors/vscode/generic.nix index 3d2c931a4591..1c22a86b7dac 100644 --- a/pkgs/applications/editors/vscode/generic.nix +++ b/pkgs/applications/editors/vscode/generic.nix @@ -57,6 +57,7 @@ ripgrep, hasVsceSign ? false, patchVSCodePath ? true, + imagemagick, }: stdenv.mkDerivation ( @@ -249,6 +250,7 @@ stdenv.mkDerivation ( nativeBuildInputs = [ unzip + imagemagick ] ++ lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook @@ -289,7 +291,13 @@ stdenv.mkDerivation ( # These are named vscode.png, vscode-insiders.png, etc to match the name in upstream *.deb packages. + '' mkdir -p "$out/share/pixmaps" - cp "$out/lib/${libraryName}/resources/app/resources/linux/code.png" "$out/share/pixmaps/${iconName}.png" + icon_file="$out/lib/${libraryName}/resources/app/resources/linux/code.png" + cp "$icon_file" "$out/share/pixmaps/${iconName}.png" + + # Dynamically determine size of icon and place in appropriate directory + size=$(identify -format "%wx%h" "$icon_file") + mkdir -p "$out/share/icons/hicolor/$size/apps" + cp "$icon_file" "$out/share/icons/hicolor/$size/apps/${iconName}.png" '' ) # Override the previously determined VSCODE_PATH with the one we know to be correct diff --git a/pkgs/by-name/ag/agneyastra/package.nix b/pkgs/by-name/ag/agneyastra/package.nix new file mode 100644 index 000000000000..02214d465efb --- /dev/null +++ b/pkgs/by-name/ag/agneyastra/package.nix @@ -0,0 +1,34 @@ +{ + lib, + buildGoModule, + fetchFromGitHub, +}: + +buildGoModule { + pname = "agneyastra"; + version = "0-unstable-2025-11-06"; + + src = fetchFromGitHub { + owner = "JA3G3R"; + repo = "agneyastra"; + # https://github.com/JA3G3R/agneyastra/issues/1 + rev = "16a90ecc7189e12261a24b88e6d6ac24b7f3b216"; + hash = "sha256-I3BzHS7D8ZVRLzx8TlUmebw96wTVwSkAAKsDqJ2Ekj8="; + }; + + vendorHash = "sha256-urAw78X6mY2O+rLdQvA6eubFk7XmzEzPQPKc/QudVTQ="; + + ldflags = [ + "-s" + "-w" + ]; + + meta = { + description = "Firebase Misconfiguration Detection Toolkit"; + homepage = "https://github.com/JA3G3R/agneyastra"; + # https://github.com/JA3G3R/agneyastra/issues/2 + license = lib.licenses.unfree; + maintainers = with lib.maintainers; [ fab ]; + mainProgram = "agneyastra"; + }; +} diff --git a/pkgs/by-name/ca/cargo-expand/package.nix b/pkgs/by-name/ca/cargo-expand/package.nix index 11a3cea1ab35..e4dd50fbe586 100644 --- a/pkgs/by-name/ca/cargo-expand/package.nix +++ b/pkgs/by-name/ca/cargo-expand/package.nix @@ -8,16 +8,16 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "cargo-expand"; - version = "1.0.118"; + version = "1.0.119"; src = fetchFromGitHub { owner = "dtolnay"; repo = "cargo-expand"; tag = finalAttrs.version; - hash = "sha256-+n4eiwcToXtWMPmvE41kOcZHzgugjekxQkodDagDjhI="; + hash = "sha256-N48BUPnVnMJSiM3EzpSiDNLGZNWFW05toHRhokNO5gI="; }; - cargoHash = "sha256-Di7Nnp8qYqpTkKmmUYoKxSkntepG80vVF2AkaN5yW+U="; + cargoHash = "sha256-a8swmPQ+JuE/tqRYbV+kekZV8TloxszYq9k8VOGRBrM="; nativeInstallCheckInputs = [ versionCheckHook ]; doInstallCheck = true; diff --git a/pkgs/by-name/ca/cargo-leptos/package.nix b/pkgs/by-name/ca/cargo-leptos/package.nix index fc39e5873694..04d00cb690ae 100644 --- a/pkgs/by-name/ca/cargo-leptos/package.nix +++ b/pkgs/by-name/ca/cargo-leptos/package.nix @@ -8,16 +8,16 @@ }: rustPlatform.buildRustPackage rec { pname = "cargo-leptos"; - version = "0.3.1"; + version = "0.3.2"; src = fetchFromGitHub { owner = "leptos-rs"; repo = "cargo-leptos"; rev = "v${version}"; - hash = "sha256-vQZpw0hnBQRXmt4KsThcVwLtRwSpbjaGfojCIgfOn7E="; + hash = "sha256-aH7b9Dbz4vbh9X4RuhFdmu2U1sgGgbLUZxmwhVxW248="; }; - cargoHash = "sha256-WlzkTZHWDkE2rhH+fi8+aa/mkjBEVwQK8cTxd2JUuZ8="; + cargoHash = "sha256-P+mavyLehmujVKBRLmK80T/o7Lu8rl8E0LzV23c6fJA="; nativeBuildInputs = [ pkg-config ]; diff --git a/pkgs/by-name/ca/catppuccin-kvantum/package.nix b/pkgs/by-name/ca/catppuccin-kvantum/package.nix index 4d4c53c99833..926aaa46dbeb 100644 --- a/pkgs/by-name/ca/catppuccin-kvantum/package.nix +++ b/pkgs/by-name/ca/catppuccin-kvantum/package.nix @@ -33,13 +33,13 @@ lib.checkListOfEnum "${pname}: theme accent" stdenvNoCC.mkDerivation { inherit pname; - version = "0-unstable-2025-11-15"; + version = "0-unstable-2025-12-27"; src = fetchFromGitHub { owner = "catppuccin"; repo = "Kvantum"; - rev = "1156e5437435282b47ac6856acd9d0feef1ed929"; - hash = "sha256-V5Upqkil9Q2MeEPtEAemirbJxnEyYcM3Z8jiyz//ccw="; + rev = "71105d224fef95dd023691303477ce3eea487457"; + hash = "sha256-gcvCVZjVbj5fRZWaM+mZTwH/g158MH36JmMuMgCBuqQ="; }; installPhase = '' diff --git a/pkgs/by-name/ci/circt/circt-llvm.nix b/pkgs/by-name/ci/circt/circt-llvm.nix index 6c9ec00564dd..110d88f2af58 100644 --- a/pkgs/by-name/ci/circt/circt-llvm.nix +++ b/pkgs/by-name/ci/circt/circt-llvm.nix @@ -6,6 +6,7 @@ circt, llvm, python3, + zstd, }: stdenv.mkDerivation { pname = circt.pname + "-llvm"; @@ -19,21 +20,27 @@ stdenv.mkDerivation { python3 ]; + buildInputs = lib.optionals stdenv.hostPlatform.isDarwin [ + # This is needed for darwin builds + zstd + ]; + preConfigure = '' cd llvm/llvm ''; cmakeFlags = [ - "-DBUILD_SHARED_LIBS=ON" - "-DLLVM_ENABLE_BINDINGS=OFF" - "-DLLVM_ENABLE_OCAMLDOC=OFF" - "-DLLVM_BUILD_EXAMPLES=OFF" - "-DLLVM_OPTIMIZED_TABLEGEN=ON" - "-DLLVM_ENABLE_PROJECTS=mlir" - "-DLLVM_TARGETS_TO_BUILD=Native" - - # This option is needed to install llvm-config - "-DLLVM_INSTALL_UTILS=ON" + # Based on utils/build-llvm.sh + (lib.cmakeBool "BUILD_SHARED_LIBS" true) + (lib.cmakeBool "LLVM_BUILD_EXAMPLES" false) + (lib.cmakeBool "LLVM_ENABLE_ASSERTIONS" true) + (lib.cmakeBool "LLVM_ENABLE_BINDINGS" false) + (lib.cmakeBool "LLVM_ENABLE_OCAMLDOC" false) + (lib.cmakeFeature "LLVM_ENABLE_PROJECTS" "mlir") + (lib.cmakeBool "LLVM_INSTALL_UTILS" true) + (lib.cmakeBool "LLVM_INSTALL_GTEST" true) + (lib.cmakeBool "LLVM_OPTIMIZED_TABLEGEN" true) + (lib.cmakeFeature "LLVM_TARGETS_TO_BUILD" "host") ]; outputs = [ diff --git a/pkgs/by-name/ci/circt/package.nix b/pkgs/by-name/ci/circt/package.nix index e58724c1231f..07bb945880d5 100644 --- a/pkgs/by-name/ci/circt/package.nix +++ b/pkgs/by-name/ci/circt/package.nix @@ -9,8 +9,16 @@ ninja, lit, z3, + sv-lang, + fmt, + boost, + mimalloc, gitUpdater, callPackage, + versionCheckHook, + + # sv-lang (slang) build is broken on darwin + enableSlangFrontend ? stdenv.hostPlatform.isLinux, }: let @@ -19,12 +27,12 @@ let in stdenv.mkDerivation rec { pname = "circt"; - version = "1.131.0"; + version = "1.138.0"; src = fetchFromGitHub { owner = "llvm"; repo = "circt"; rev = "firtool-${version}"; - hash = "sha256-im+w6vYsLdJ/i88mG/anFjPYgE1HfvJIemLEse0pzco="; + hash = "sha256-yx6sk6FO7MHNuRFBMhOXTSjtDQ0B6XyhGHb4uHSXx/8="; fetchSubmodules = true; }; @@ -36,16 +44,28 @@ stdenv.mkDerivation rec { git pythonEnv z3 + versionCheckHook + ]; + buildInputs = [ + circt-llvm + ] + ++ lib.optionals enableSlangFrontend [ + boost + fmt + mimalloc + sv-lang ]; - buildInputs = [ circt-llvm ]; cmakeFlags = [ - "-DBUILD_SHARED_LIBS=ON" - "-DMLIR_DIR=${circt-llvm.dev}/lib/cmake/mlir" - + # Based on .github/workflows/buildAndTest.yml:211 + (lib.cmakeBool "BUILD_SHARED_LIBS" (!stdenv.hostPlatform.isStatic)) + (lib.cmakeBool "LLVM_ENABLE_ASSERTIONS" false) + (lib.cmakeFeature "MLIR_DIR" "${circt-llvm.dev}/lib/cmake/mlir") + (lib.cmakeFeature "LLVM_DIR" "${circt-llvm.dev}/lib/cmake/llvm") # LLVM_EXTERNAL_LIT is executed by python3, the wrapped bash script will not work - "-DLLVM_EXTERNAL_LIT=${lit}/bin/.lit-wrapped" - "-DCIRCT_LLHD_SIM_ENABLED=OFF" + (lib.cmakeFeature "LLVM_EXTERNAL_LIT" "${lit}/bin/.lit-wrapped") + (lib.cmakeBool "CIRCT_SLANG_FRONTEND_ENABLED" enableSlangFrontend) + (lib.cmakeBool "CIRCT_SLANG_BUILD_FROM_SOURCE" false) ]; # cannot use lib.optionalString as it creates an empty string, disabling all tests @@ -76,6 +96,7 @@ stdenv.mkDerivation rec { "CIRCT :: circt-reduce/.*\\.mlir" "CIRCT :: circt-test/basic.mlir" "CIRCT :: firld/.*\\.mlir" + "CIRCT :: Tools/domaintool/clock-spec-json.mlir" ] ++ [ # Temporarily disable for bump: https://github.com/llvm/circt/issues/8000 @@ -88,6 +109,11 @@ stdenv.mkDerivation rec { postPatch = '' patchShebangs tools/circt-test + + substituteInPlace \ + lib/Tools/circt-verilog-lsp-server/VerilogServerImpl/CMakeLists.txt \ + lib/Conversion/ImportVerilog/CMakeLists.txt \ + --replace-fail "slang_slang" "slang::slang" ''; preConfigure = '' @@ -103,7 +129,11 @@ stdenv.mkDerivation rec { ''; doCheck = true; - checkTarget = "check-circt check-circt-integration"; + checkTarget = "check-circt check-circt-unit"; + + doInstallCheck = true; + versionCheckProgram = "${placeholder "out"}/bin/firtool"; + versionCheckProgramArg = "--version"; outputs = [ "out" diff --git a/pkgs/by-name/dd/ddns-go/package.nix b/pkgs/by-name/dd/ddns-go/package.nix index 8ebbd62fbbdc..503ddceaa275 100644 --- a/pkgs/by-name/dd/ddns-go/package.nix +++ b/pkgs/by-name/dd/ddns-go/package.nix @@ -6,16 +6,16 @@ buildGoModule rec { pname = "ddns-go"; - version = "6.14.0"; + version = "6.14.1"; src = fetchFromGitHub { owner = "jeessy2"; repo = "ddns-go"; rev = "v${version}"; - hash = "sha256-jx9Mvb40lDWxZp47fbHs0M+f8VQCBnzHb0bQiLRby1M="; + hash = "sha256-c+V+EgJvElL/Ga0z6420E50c59cmjn/IlkfyeATLDFs="; }; - vendorHash = "sha256-CtbbyI7sL1Ej4WDWkEZoRFngiwWpzSwvAKAWQwiMD1E="; + vendorHash = "sha256-vpdT1apjuMvM6MmQfx1XBQtQznK7oxUjIdkgOXjUF6g="; ldflags = [ "-X main.version=${version}" diff --git a/pkgs/by-name/de/dependabot-cli/package.nix b/pkgs/by-name/de/dependabot-cli/package.nix index 682aa82999d8..6991ffd251f2 100644 --- a/pkgs/by-name/de/dependabot-cli/package.nix +++ b/pkgs/by-name/de/dependabot-cli/package.nix @@ -12,20 +12,20 @@ }: let pname = "dependabot-cli"; - version = "1.79.0"; + version = "1.80.0"; # `tag` is what `dependabot` uses to find the relevant docker images. tag = "nixpkgs-dependabot-cli-${version}"; # Get these hashes from # nix run nixpkgs#nix-prefetch-docker -- --image-name ghcr.io/github/dependabot-update-job-proxy/dependabot-update-job-proxy --image-tag latest --final-image-name dependabot-update-job-proxy --final-image-tag ${tag} - updateJobProxy.imageDigest = "sha256:e3361d9ba33ffcb1c72b2ac9feba766f0e941b0bf2b692029948f60262708ffa"; - updateJobProxy.hash = "sha256-1TPyyD2a4IN9UoAEZJCHFiOhsP/vIowuy0WfgSmRHpI="; + updateJobProxy.imageDigest = "sha256:3a7868b09318bef45224e475c3a018deba34f65f451f3ddd5b852b440c65fb83"; + updateJobProxy.hash = "sha256-PVFo/PT7l3iR5FTt+jDrGVupc6zPoDpiw9Pxqp3yprU="; # Get these hashes from # nix run nixpkgs#nix-prefetch-docker -- --image-name ghcr.io/dependabot/dependabot-updater-github-actions --image-tag latest --final-image-name dependabot-updater-github-actions --final-image-tag ${tag} - updaterGitHubActions.imageDigest = "sha256:01cad8bab547d5041cf11cb2f0287f091695d5971d3f7fb93b97817727093a2c"; - updaterGitHubActions.hash = "sha256-whFMv7MeyKeFmCDaoG6CxxENcHDC4HNmuNuA3AQTJJI="; + updaterGitHubActions.imageDigest = "sha256:a791d0ef463a059dc371ef62c6d1ac341a7e1197ed871a0a6451371a8710cd0e"; + updaterGitHubActions.hash = "sha256-uNqif7HesnXeiGOrc4sC2fgSAHNFJwVwrA3iIv8fVYc="; in buildGoModule { inherit pname version; @@ -34,7 +34,7 @@ buildGoModule { owner = "dependabot"; repo = "cli"; rev = "v${version}"; - hash = "sha256-JHuqgurzEO5XA7OHP32X9DcFpZbjbn/h5fZJXCUmOdE="; + hash = "sha256-5SD4VIa11r2P9YbURby6Sgi58lv03UB9X5UDOZxjVLQ="; }; vendorHash = "sha256-dD48OKpuGAJAro7qV4tqpf/uENV2X1VQ2kUvAuJLXc0="; diff --git a/pkgs/by-name/di/diylc/package.nix b/pkgs/by-name/di/diylc/package.nix index 09d87a00cc9a..46960527adc4 100644 --- a/pkgs/by-name/di/diylc/package.nix +++ b/pkgs/by-name/di/diylc/package.nix @@ -11,11 +11,11 @@ stdenv.mkDerivation (finalAttrs: { pname = "diylc"; - version = "5.6.0"; + version = "5.7.0"; src = fetchurl { url = "https://github.com/bancika/diy-layout-creator/releases/download/v${finalAttrs.version}/diylc-${finalAttrs.version}-universal.zip"; - hash = "sha256-y47md9kaiqpmx+ZNTm5PCHiNMMR9zjsvjc2xpVD6FAk="; + hash = "sha256-0402HeOQrLJSor4bERyAkIO65kUYMLq2wo1ZgKLcMn4="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/ed/edl/package.nix b/pkgs/by-name/ed/edl/package.nix index 125d72eed9d2..0f3dbe007739 100644 --- a/pkgs/by-name/ed/edl/package.nix +++ b/pkgs/by-name/ed/edl/package.nix @@ -8,15 +8,15 @@ python3Packages.buildPythonPackage { pname = "edl"; - version = "3.52.1-unstable-2025-09-10"; + version = "3.52.1-unstable-2025-12-17"; format = "setuptools"; src = fetchFromGitHub { owner = "bkerler"; repo = "edl"; - rev = "334028cd887a2960867750c403dbcad9cbe8c46b"; + rev = "dffc6833ad51fb7e561c7c2bd26057edd18d9f7a"; fetchSubmodules = true; - hash = "sha256-OYrncVbCJkeONeztfj7cB3QW1Q0tlF1b/LeuMqKiblk="; + hash = "sha256-wdcA+pw7kUA7kSWIv6Wi+vmFFWGuC5LLds1oeEeGpOE="; }; propagatedBuildInputs = with python3Packages; [ diff --git a/pkgs/by-name/fc/fcft/package.nix b/pkgs/by-name/fc/fcft/package.nix index 4f23760a704c..40c7f3bbb8d1 100644 --- a/pkgs/by-name/fc/fcft/package.nix +++ b/pkgs/by-name/fc/fcft/package.nix @@ -33,14 +33,14 @@ in stdenv.mkDerivation rec { pname = "fcft"; - version = "3.3.2"; + version = "3.3.3"; src = fetchFromGitea { domain = "codeberg.org"; owner = "dnkl"; repo = "fcft"; rev = version; - hash = "sha256-a+lELkEjMtqeBYGj6yl+OoQ+I6neyJt6a1T83B2KWOk="; + hash = "sha256-MkGlph9WpqH4daov5ZZPO2ua2mUbrsuo8Xk6GoKhoxg="; }; depsBuildBuild = [ pkg-config ]; diff --git a/pkgs/by-name/gi/github-backup/package.nix b/pkgs/by-name/gi/github-backup/package.nix index e06a70ba329a..6190c2d57b4c 100644 --- a/pkgs/by-name/gi/github-backup/package.nix +++ b/pkgs/by-name/gi/github-backup/package.nix @@ -10,14 +10,14 @@ python3Packages.buildPythonApplication rec { pname = "github-backup"; - version = "0.58.0"; + version = "0.60.0"; pyproject = true; src = fetchFromGitHub { owner = "josegonzalez"; repo = "python-github-backup"; tag = version; - hash = "sha256-i1o8GX3xxWft04sLspq9Oy2a46ldJeFqs5OgEjTti4E="; + hash = "sha256-dK6qkso5GOV/eZRGcwOCKn8faMuTr7czTvISLioKgVs="; }; build-system = with python3Packages; [ diff --git a/pkgs/by-name/he/hexdino/package.nix b/pkgs/by-name/he/hexdino/package.nix index 8d059421609a..2a64f5d7d79b 100644 --- a/pkgs/by-name/he/hexdino/package.nix +++ b/pkgs/by-name/he/hexdino/package.nix @@ -6,16 +6,16 @@ rustPlatform.buildRustPackage rec { pname = "hexdino"; - version = "0.1.3"; + version = "0.1.4"; src = fetchFromGitHub { owner = "Luz"; repo = "hexdino"; rev = version; - hash = "sha256-glbyftCJiP0/5trW7DOcVCU2q4ZH3zFK96eyGuYR8eY="; + hash = "sha256-M1lUm8rJj9c+9MgU7AJvk/ZVuTC1QYPsHRQxCQTc3WI="; }; - cargoHash = "sha256-NfVtNoTDGx3MGOe+bUOCgjSs8ZTfxMSCTp09sXOfUPs="; + cargoHash = "sha256-IZhQ80iDO6l1FLAbq2l7QLpjoenkri3wBdQ6Mnz+BOI="; meta = { description = "Hex editor with vim like keybindings written in Rust"; diff --git a/pkgs/by-name/ho/homebank/package.nix b/pkgs/by-name/ho/homebank/package.nix index 8943f9d801d1..74c6dcb55ea6 100644 --- a/pkgs/by-name/ho/homebank/package.nix +++ b/pkgs/by-name/ho/homebank/package.nix @@ -13,10 +13,10 @@ stdenv.mkDerivation rec { pname = "homebank"; - version = "5.9.6"; + version = "5.9.7"; src = fetchurl { url = "https://www.gethomebank.org/public/sources/homebank-${version}.tar.gz"; - hash = "sha256-8DIL/gTysY/e1DcuuJ5qY6vXUBY4uUWNoSzUaCQ+t3o="; + hash = "sha256-K4/fUSQpow7XpFfPWvR2dWwM/dyfznYA2rlcfwO+JuQ="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/hu/hugo/package.nix b/pkgs/by-name/hu/hugo/package.nix index a9bbe0138ef8..79717445184d 100644 --- a/pkgs/by-name/hu/hugo/package.nix +++ b/pkgs/by-name/hu/hugo/package.nix @@ -11,16 +11,16 @@ buildGoModule (finalAttrs: { pname = "hugo"; - version = "0.152.2"; + version = "0.153.3"; src = fetchFromGitHub { owner = "gohugoio"; repo = "hugo"; tag = "v${finalAttrs.version}"; - hash = "sha256-nSWeCRhbaEgr54VDstBKnouUeWR1JjLXEqtYUcEMdyQ="; + hash = "sha256-EJYBIElh1akj8/cYzd/5hUNJtmFK/BxgWTg5jo2/xS4="; }; - vendorHash = "sha256-3cIz3SWV/3vYhCgFEGAa+mOaUCzsJurkI2rPtVANE38="; + vendorHash = "sha256-cTrqnZdRCLthZCpXqbfIS1quySyB2lWxbxP/4k2nASQ="; checkFlags = let diff --git a/pkgs/by-name/ja/jabref/deps.json b/pkgs/by-name/ja/jabref/deps.json index 60d15e9c54e4..3cbe63ff7857 100644 --- a/pkgs/by-name/ja/jabref/deps.json +++ b/pkgs/by-name/ja/jabref/deps.json @@ -709,13 +709,13 @@ "jar": "sha256-bNkZkTI917L7KMqT16wSr1qGovUyeeKzWCezAxP9C58=", "pom": "sha256-rECp8tDB7mMfw7CO+OLwvRS6IgEcp2/xvPZftWnq3zU=" }, - "org/gradle/kotlin#gradle-kotlin-dsl-plugins/6.2.0": { - "jar": "sha256-i/+sU1wrfiY/wwPwhdbgg9LZpE0nXWCmJbalFpmEDUs=", - "module": "sha256-BC5gnbaQwxZ7aeWaIjNMWrASYYMeOMwILjch0KxdYcI=", - "pom": "sha256-w/TTKxfHro5uyElSHN78u8uHwdBW4ISlrnzziO1rkqs=" + "org/gradle/kotlin#gradle-kotlin-dsl-plugins/6.4.1": { + "jar": "sha256-JolZk48cG8O1VeIihdIEVdoPOrCAaEuSfBvK5VTZFNM=", + "module": "sha256-QfjCNSMXc2dWDubRXMC9a8GqRP6x2BjXihzt2+IMC40=", + "pom": "sha256-G9F/hR9bve0OCz16YZzBdxKrmEXqpFu8ypBxX86jEF8=" }, - "org/gradle/kotlin/kotlin-dsl#org.gradle.kotlin.kotlin-dsl.gradle.plugin/6.2.0": { - "pom": "sha256-tIUcmutueaoXqVKIMVxU+is1F8TNu8LaC38bcQwdLXE=" + "org/gradle/kotlin/kotlin-dsl#org.gradle.kotlin.kotlin-dsl.gradle.plugin/6.4.1": { + "pom": "sha256-9FhdUWKX7VtEyA0nq82/XKA0aCx1B4E+8UAHLhDYts4=" }, "org/gradle/toolchains#foojay-resolver/1.0.0": { "jar": "sha256-eLhqR9/fdpfJvRXaeJg/2A2nJH1uAvwQa98H4DiLYKg=", @@ -819,146 +819,146 @@ "jar": "sha256-rOKhDcji1f00kl7KwD5JiLLA+FFlDJS4zvSbob0RFHg=", "pom": "sha256-llrrK+3/NpgZvd4b96CzuJuCR91pyIuGN112Fju4w5c=" }, - "org/jetbrains/kotlin#abi-tools-api/2.2.0": { - "jar": "sha256-hxeDiGZkLjvdR+yeAmC70wdujH6GvgXirahoMesq+Qo=", - "pom": "sha256-UwmmvuGytgrDtfXTXMS2zDiKFzOA17jeqgIJ6wgUnpA=" + "org/jetbrains/kotlin#abi-tools-api/2.2.20": { + "jar": "sha256-8chm6sXcCI8/0IEQCENAm/TxYSu7mY+6ofaFMlyuDVU=", + "pom": "sha256-HOL7NczYP8vJCuXFmN/bsilS0IVHgElEpbIfLEbKwL0=" }, - "org/jetbrains/kotlin#fus-statistics-gradle-plugin/2.2.0": { - "module": "sha256-5d0u34ivdW30d1ra13xS0AkDUav1EZLPGdP+YsZnyrg=", - "pom": "sha256-Qejc6FcbX7TuAzURlYL+IoBQqP8ZPiRg1SmMX5Dj1nU=" + "org/jetbrains/kotlin#fus-statistics-gradle-plugin/2.2.20": { + "module": "sha256-n+aVWzf+KQtlFiXPnGgea6IKjxLEZYzOUCblk1BaMSk=", + "pom": "sha256-P6gmRiy9hG0YAgLyLFGTQYy5zan2lcmUEjWpsbXBQdk=" }, - "org/jetbrains/kotlin#fus-statistics-gradle-plugin/2.2.0/gradle813": { - "jar": "sha256-0M+f8jrTjCEO7QzCWlExWjhOYf3BWlP+uGwAvuaRqug=" + "org/jetbrains/kotlin#fus-statistics-gradle-plugin/2.2.20/gradle813": { + "jar": "sha256-OmlZW2x1+/ktMgFodFxpj/cRS4YHhBBQ1ISYgjAG6HE=" }, - "org/jetbrains/kotlin#kotlin-assignment-compiler-plugin-embeddable/2.2.0": { - "jar": "sha256-caw8dQsO5FH6zdSYInQLKIi5f8rzMWruOxfTpMTvUro=", - "pom": "sha256-Ge0cc5y8KCJVINrxd/QcDFq3ROAE1GjPMZRZI5t8MD8=" + "org/jetbrains/kotlin#kotlin-assignment-compiler-plugin-embeddable/2.2.20": { + "jar": "sha256-07TapcbMI1Zfj7k2NI84xCGgRhFjdF02rt9E096UJQo=", + "pom": "sha256-L/XBHfd+t6JZdmzdqed47WW6SFxYxhO7ppAoauzi3H0=" }, - "org/jetbrains/kotlin#kotlin-assignment/2.2.0": { - "module": "sha256-SBPTUS68DvnmX+RkM9IZ5dSSKw2TPc2FKySPpT+FNtA=", - "pom": "sha256-At2wWVzbi4VkYars5gKXiASNycM52OYtZcotqU4CaZA=" + "org/jetbrains/kotlin#kotlin-assignment/2.2.20": { + "module": "sha256-xbfmG95gHQM75qCyXhkxfc9u434wVC/XRsRr/3gBj1o=", + "pom": "sha256-fh3mglHYFXQXuKIXn2YlW8m5zzFTPdkDukFVZlwwXGs=" }, - "org/jetbrains/kotlin#kotlin-assignment/2.2.0/gradle813": { - "jar": "sha256-d3zNZXeiOZfkssjiezjCQ6oCzQrsmYB8nLOdWnsJ4sQ=" + "org/jetbrains/kotlin#kotlin-assignment/2.2.20/gradle813": { + "jar": "sha256-MYCcvl5312WyQRFT6huuR2cQQGoXfjmhC/ZKYSOgRfI=" }, "org/jetbrains/kotlin#kotlin-bom/2.0.21": { "pom": "sha256-1Ufg3iVCLZY+IsepRPO13pQ8akmClbUtv/49KJXNm+g=" }, - "org/jetbrains/kotlin#kotlin-build-statistics/2.2.0": { - "jar": "sha256-klfy37x4iCf2AnUPrijX6UWTLq2QQVP3f09sTE2Y5RE=", - "pom": "sha256-8Uct+ZZDqe4VJrFEka0vaNz8Zunr9WywFuSFzaj69sI=" + "org/jetbrains/kotlin#kotlin-build-statistics/2.2.20": { + "jar": "sha256-+2VKT1vFY2h1kXMSnfSRB60J3FtBcrAXda+z+nJXndU=", + "pom": "sha256-tdU2T1fSH/FBgiBei2lf1oZNnYqleApu3EIJWEBHwRU=" }, - "org/jetbrains/kotlin#kotlin-build-tools-api/2.2.0": { - "jar": "sha256-HezZmyKUN3QfNqAIxnip2PrjBxbodyFRMI9W9owQ844=", - "pom": "sha256-I6QFgttMPijHq6X8fpZHvI1e/d+dAFWp5CyaCJbVzjM=" + "org/jetbrains/kotlin#kotlin-build-tools-api/2.2.20": { + "jar": "sha256-/ZlHs6F2Iahvq9lTr4fzS9K7f4sm2uksHte+dHL0TDs=", + "pom": "sha256-AtR9SHfsMktJbZMTMkXNTTSLZSMDzyfvpj44ry+zzyo=" }, - "org/jetbrains/kotlin#kotlin-build-tools-impl/2.2.0": { - "jar": "sha256-SofzwCcvFyhdYOmGQ+whn1Ppta1aI/O8TFQ6hkT4bxc=", - "pom": "sha256-6DgEIFq2l7pyL0YiprG1GS70ejDL35ApdwFJQ3hQTv8=" + "org/jetbrains/kotlin#kotlin-build-tools-impl/2.2.20": { + "jar": "sha256-ZHiafwBWWSfy8/LRCfIwV009kwjtXW6Gv8qEPaZIfPc=", + "pom": "sha256-4vQ157rwHeL/kNCoc3r4+b+X/BUuWVuGp2C6ZOjmnfY=" }, - "org/jetbrains/kotlin#kotlin-compiler-embeddable/2.2.0": { - "jar": "sha256-svdD6luhL2ng815djUYGnXTI4oYQh1SKfg4Up4S8TPE=", - "pom": "sha256-FqFd0ZfPJBNJT3iMuWFE2aFGJnw9b38cFbejweBSNGo=" + "org/jetbrains/kotlin#kotlin-compiler-embeddable/2.2.20": { + "jar": "sha256-HGw/gQv+akGry8NLOi72OfHj9K7tOpU6Swl07qT0GIk=", + "pom": "sha256-Bf8CX3+wky+xH6HhzK71KPdgJ9lWaA+INdQ4VCdi4go=" }, - "org/jetbrains/kotlin#kotlin-compiler-runner/2.2.0": { - "jar": "sha256-kHBq6Gcd77oBQI3RxUG6MJEskHDN8d3aGMUero1nkwQ=", - "pom": "sha256-iQfZfcaLv0CgrmZ5RZAvDtwWYdvPdDuuDf2nw7mp1Mg=" + "org/jetbrains/kotlin#kotlin-compiler-runner/2.2.20": { + "jar": "sha256-+vloNPogBNeL2ORCD1go3j1CckJ9ZHR5gCTqbpz4XN0=", + "pom": "sha256-kbsVJI9OqUS2Mw8xA/HrVF0TvditSuxDe3R6WG57F6k=" }, - "org/jetbrains/kotlin#kotlin-daemon-client/2.2.0": { - "jar": "sha256-ISk9oBbkuhKhKKwm/ZIKdOi4f1dM+bxDxgo9LnZFp64=", - "pom": "sha256-HESKBvDKmGiVi+CHesnof8TgG8uTaHp8rBLTxNCd7uY=" + "org/jetbrains/kotlin#kotlin-daemon-client/2.2.20": { + "jar": "sha256-cO983NwwEHe5s7ohqp6cVadq+z/73+9KtWKmd9GN+kw=", + "pom": "sha256-ihNtDxPrmDpr40/x4WPJznmFXkuiF09Fy0KqpnVT91Q=" }, - "org/jetbrains/kotlin#kotlin-daemon-embeddable/2.2.0": { - "jar": "sha256-omzI4thhkZfMTRFb6ndm6aqODx54duoETuG58wVlRgE=", - "pom": "sha256-vSrk4skWBWVKilUn2nV/KyJ2WA0fXq6+q9M0OvjVxGc=" + "org/jetbrains/kotlin#kotlin-daemon-embeddable/2.2.20": { + "jar": "sha256-fFyM0vi+rdMoMjm7nKIZoMr6GvAmgrQHsYHhF5cY8vc=", + "pom": "sha256-9Yhmv7yYZ8bWR1ec/3DUKHeZctvd2N5MJXh5y0N0FIk=" }, - "org/jetbrains/kotlin#kotlin-gradle-plugin-annotations/2.2.0": { - "jar": "sha256-nRsH2uVVnD/JwtzhW9hcNtwedt/zd/ExJIm9ZmDBZUQ=", - "pom": "sha256-uvxt1O1fRcLhvCgXfCxkDie/t8WQEZ6GW7nkCZOLrEA=" + "org/jetbrains/kotlin#kotlin-gradle-plugin-annotations/2.2.20": { + "jar": "sha256-T8MqG+ZFynQE4hskRSCI+T6OmT6v/Sbza9Ndv3XGB1I=", + "pom": "sha256-sbbgEXktfKkv7K+/+sSlCPdvA5yfeuijI9GJKIgl9P4=" }, - "org/jetbrains/kotlin#kotlin-gradle-plugin-api/2.2.0": { - "jar": "sha256-u6au4h0YX3LfiW80jw6nsRdcEc1mNzeZid+JnLSMl+E=", - "module": "sha256-AmOgtdQFEGmmFjJYOK5CGmxNAG3JsVWnpCkmYIiAC6c=", - "pom": "sha256-iG8sRJ+dvmQc0kPxk3FNegQlNrMCrEHHLVYOWmZmDIg=" + "org/jetbrains/kotlin#kotlin-gradle-plugin-api/2.2.20": { + "jar": "sha256-dgfuXHoMpT+lku58VA7oCJYqe62P7p7Xj+Z0hBRj2V0=", + "module": "sha256-T8vx/H5Uzr/pC5peD7RpYv7Vwi03I52iNfXi37xtUog=", + "pom": "sha256-C5E9oNIYhCAmOpBLtApkD9s1pTWnLwWC/llkHjoMSi4=" }, - "org/jetbrains/kotlin#kotlin-gradle-plugin-api/2.2.0/gradle813": { - "jar": "sha256-u6au4h0YX3LfiW80jw6nsRdcEc1mNzeZid+JnLSMl+E=" + "org/jetbrains/kotlin#kotlin-gradle-plugin-api/2.2.20/gradle813": { + "jar": "sha256-dgfuXHoMpT+lku58VA7oCJYqe62P7p7Xj+Z0hBRj2V0=" }, - "org/jetbrains/kotlin#kotlin-gradle-plugin-idea-proto/2.2.0": { - "jar": "sha256-QY4hdjJ20qlGFr6ZCCanRdWdTF2WY48LviERDSxWSTs=", - "pom": "sha256-w5AgQre9S2t3oY8+4f6ol9N7vroloD0Uqe7//hWCXn0=" + "org/jetbrains/kotlin#kotlin-gradle-plugin-idea-proto/2.2.20": { + "jar": "sha256-dtFu5ZzeHmpwVWtdQEhu+fEcFkOodJPBnE3zMWU4N9k=", + "pom": "sha256-xRuhScfyk1nSWk7RIS4otpNOGkdW9VLAAHvxFE0onB0=" }, - "org/jetbrains/kotlin#kotlin-gradle-plugin-idea/2.2.0": { + "org/jetbrains/kotlin#kotlin-gradle-plugin-idea/2.2.20": { "jar": "sha256-7JacXwsJn4I4RiMiOPm9ZPPTdB5i6pBQrS5DL6150KA=", - "module": "sha256-r+m2AUJwBIVJuyAySjGdYkoFoLnmtBfmm2kHldfPDUs=", - "pom": "sha256-/ewxpJDZDsNuf5qj12xVDgqVq9Otg3lTvUn6E9pwFQ0=" + "module": "sha256-/IW7KUlsw/X5DHjHonejkw7xFg8IQ/iu1ke3TGejtJQ=", + "pom": "sha256-NkQjJURfF7rCH1OGu0k4+D53K4NOWGBT1BRbGnXZ4oU=" }, - "org/jetbrains/kotlin#kotlin-gradle-plugin-model/2.2.0": { - "jar": "sha256-Z6FKxCSqGWo0ax3Jn0QqbVc0WCrXt+epzN8oqc0rIJs=", - "module": "sha256-LC4w2DDqdpq6iX9PlvGeHoLY1qI/UzaJugn0GTMASYY=", - "pom": "sha256-bBzMOzcGY8KHIUn12briW/fpLqcVFepzxSlwlzbKMYk=" + "org/jetbrains/kotlin#kotlin-gradle-plugin-model/2.2.20": { + "jar": "sha256-U6MhUoJjIGAYUgSaC291OMqLtX/QnYeszRGLxo1D+OQ=", + "module": "sha256-EZdKVPSOCCXpdxML9u9qyZp/216yr53iZa9iTHY2g+U=", + "pom": "sha256-3uDjB7pub1GQPH5DPehSZ10eMOfyLPJGWxglVSZR7fs=" }, - "org/jetbrains/kotlin#kotlin-gradle-plugin/2.2.0": { - "module": "sha256-Y3w/yuVyOnQnAmwO2z3GeW3T/nmQ3CKG1PdJbt9dKYU=", - "pom": "sha256-E2FqOVx9n8Xc7iclKn9ocX2MaZTNEldL0dsxelGG1yE=" + "org/jetbrains/kotlin#kotlin-gradle-plugin/2.2.20": { + "module": "sha256-3CS/pH4EQigykOIfBpoFYUHR8IjWy57Kouqs4bR7a4w=", + "pom": "sha256-ucP9Lr1UhNYMX+DbeqEIeDA+7d/JP5Qvc1wHupmBh8w=" }, - "org/jetbrains/kotlin#kotlin-gradle-plugin/2.2.0/gradle813": { - "jar": "sha256-g1xNwYoHMl9XkwUMfy52XSNcWWdJVo5HtZe0Sdhnlo0=" + "org/jetbrains/kotlin#kotlin-gradle-plugin/2.2.20/gradle813": { + "jar": "sha256-XTJbXCxdS8i/RBRdJOtNS+sGDRPRHr5IiYk27VzRVk4=" }, - "org/jetbrains/kotlin#kotlin-gradle-plugins-bom/2.2.0": { - "module": "sha256-ur08SXopcd/GjlAlT/lwZak6Ixg+jto8OY+E9gzsErI=", - "pom": "sha256-2cRaL1cw6E6bhPpCxkoYdNy6ZmjyEsT+KXvqJdwAeHg=" + "org/jetbrains/kotlin#kotlin-gradle-plugins-bom/2.2.20": { + "module": "sha256-P7tFda43xKd2rrhtj/k8aqEbDPLadXScUyDiWFCwIp4=", + "pom": "sha256-PG1GnpFfuzCWrEy4wvRsedAnw8WQ5lihBoihVx61eNg=" }, - "org/jetbrains/kotlin#kotlin-klib-commonizer-api/2.2.0": { - "jar": "sha256-8FcCw6bq725+hCNTvmT1jTMHGX4Vp/F5gE08VQcZ7mk=", - "pom": "sha256-6R0DUNf9G+4pyP9OP9bxcZBS7P6V98wXZtnVwnD3iQk=" + "org/jetbrains/kotlin#kotlin-klib-commonizer-api/2.2.20": { + "jar": "sha256-OYK+RbEpMOIYGbWJ2zcHyOhM4le/Ks5/xi/I3zaPWz4=", + "pom": "sha256-CzAJtJQmv6F3qtlLSBCbjKVMck6i5sUGgmo6lc9ZEOE=" }, "org/jetbrains/kotlin#kotlin-metadata-jvm/2.2.20": { "jar": "sha256-hSTqyQ9+jg8TZog/LGyCDJO/ph3z12hXyNPoA89nMV0=", "pom": "sha256-e2qAtqLSZ2oEIvaWg4EyMVQlUfYbMgxochz7nh9ZCdA=" }, - "org/jetbrains/kotlin#kotlin-native-utils/2.2.0": { - "jar": "sha256-pOlvczba6EnznPK2NKU20CoqvfARS3M5Wty4yIGFDp4=", - "pom": "sha256-DafPXrsb0m4u/IkRhLzqM8tPKxwpNYEnr1MGHNataZY=" + "org/jetbrains/kotlin#kotlin-native-utils/2.2.20": { + "jar": "sha256-UBd3SirqQf+HEhNxFs1NgAP+mroSAMEG5lcw/rW7dEI=", + "pom": "sha256-U+++4FpxIhiQYPXuXspodjnOr+KfXlmW3phiopxnJyU=" }, "org/jetbrains/kotlin#kotlin-reflect/1.6.10": { "jar": "sha256-MnesECrheq0QpVq+x1/1aWyNEJeQOWQ0tJbnUIeFQgM=", "pom": "sha256-V5BVJCdKAK4CiqzMJyg/a8WSWpNKBGwcxdBsjuTW1ak=" }, - "org/jetbrains/kotlin#kotlin-reflect/2.2.0": { - "jar": "sha256-Iw2RwuQQ48/KOk3HPSVUVfYv9SqsCRozOXpuML3pG/c=", - "pom": "sha256-3u2DHvy2Y+TPPVEh5a55byAeN7gT0sfWB7Xx+Khv5S4=" + "org/jetbrains/kotlin#kotlin-reflect/2.2.20": { + "jar": "sha256-ggkIOkp8TkdtmEKweDCPqWqW8Hpr2Z8F81hu4TKJqyY=", + "pom": "sha256-TidHQGbbg/uixZB0KJunEr6MhRV83guQUCmkRcJ19bo=" }, - "org/jetbrains/kotlin#kotlin-sam-with-receiver-compiler-plugin-embeddable/2.2.0": { - "jar": "sha256-nLzhQvhBilqrEZuD7Css9EMrWEgXAh2agVONB+o1RjE=", - "pom": "sha256-C0K3d+h9Gx9pJ1VCnsAivFYv2Mbm1T9HgbFajVzSNqo=" + "org/jetbrains/kotlin#kotlin-sam-with-receiver-compiler-plugin-embeddable/2.2.20": { + "jar": "sha256-WRNzsEtDtom0HgvIYqlslEx+DDHSMIH0aooe48a6Edc=", + "pom": "sha256-iSompWD3bch9NVEw9Akk2ZtL1gB212R0Ff6YkYjSLA4=" }, - "org/jetbrains/kotlin#kotlin-sam-with-receiver/2.2.0": { - "module": "sha256-3uEJzwqU5jg9Kg7ur6nJJod92jgW1mhHQAqKFRdONzU=", - "pom": "sha256-iqdjHKBnUr+DOPHNP4Uwf5oovoZu9xsyOUMM4XWukVo=" + "org/jetbrains/kotlin#kotlin-sam-with-receiver/2.2.20": { + "module": "sha256-c7Eee8xPZZeWcN8Vx1aADHOiHaH9EJL56sWfON+cVjE=", + "pom": "sha256-LhNnvGXeGLQPpn2H9+JGXj4dYUviuLCdOQZRZ8JwK+M=" }, - "org/jetbrains/kotlin#kotlin-sam-with-receiver/2.2.0/gradle813": { - "jar": "sha256-enrIy8I3Z8g9uGk9v10g6RN7Qz2zBFbbAvK2CkmoSyc=" + "org/jetbrains/kotlin#kotlin-sam-with-receiver/2.2.20/gradle813": { + "jar": "sha256-YZ6b4NCK9+W0TRIkJQ0jXiLvimiKzISPO4kC+mZAQws=" }, - "org/jetbrains/kotlin#kotlin-script-runtime/2.2.0": { - "jar": "sha256-Ttl/0eDJux0JSO1eY8yRRWMTpZUYKVuSssFRSu9VYVA=", - "pom": "sha256-5QdIv0Z09lRgPnsbuDBjTsmevZwzDeukytzuwHZ8u1Y=" + "org/jetbrains/kotlin#kotlin-script-runtime/2.2.20": { + "jar": "sha256-XIvV3Xrh6i7rJ3j9vqoZpWIYSXX2yrigu2d55BkHMa4=", + "pom": "sha256-IpOhQenagKfpjYXtKkkuldsMAWW86rC3Klzp4tkrCAc=" }, - "org/jetbrains/kotlin#kotlin-scripting-common/2.2.0": { - "jar": "sha256-fJrISZ+pGyAep4NlN8Yl3VKoJUnlfms/F1zAx56atgQ=", - "pom": "sha256-1M1vjH2tiOZ9iVzT23qNTH3I6N3Y6WeOH1619gHZsO0=" + "org/jetbrains/kotlin#kotlin-scripting-common/2.2.20": { + "jar": "sha256-+5n/fwzZUtpo1UjT89ZErlB4sLlvybrwZewUZqKTuAU=", + "pom": "sha256-iTjGIFKXW7uW3OotqaeNS2sk2vLwnTWMGnqEHxaMtzo=" }, - "org/jetbrains/kotlin#kotlin-scripting-compiler-embeddable/2.2.0": { - "jar": "sha256-ksfW7HxfBdisAcN+dHrGd9iS6ZusDeXlFmg7jzZAdys=", - "pom": "sha256-VjapUSxI/NqPgm+ypKwXPCnW6zV0ZHE9VNJaTUbsbBM=" + "org/jetbrains/kotlin#kotlin-scripting-compiler-embeddable/2.2.20": { + "jar": "sha256-2GJhDAAzQuUIjKIcRAQix9ijcA4ZnWA/ehAnjESIR2E=", + "pom": "sha256-PW9vFZH6P3r14jFlxowu4BclFYZFQ09eMBdF5kfHVhE=" }, - "org/jetbrains/kotlin#kotlin-scripting-compiler-impl-embeddable/2.2.0": { - "jar": "sha256-HSbL3a7rb/1FgIU5bs6gsID8Io/gBtz4MD2ldxHzN0U=", - "pom": "sha256-oeMpM4wq8LRweB0ECGnpsZdS+KTesi9D9qiR68dPH4I=" + "org/jetbrains/kotlin#kotlin-scripting-compiler-impl-embeddable/2.2.20": { + "jar": "sha256-e3kSNZL//r81xhag/xBDMscc3mN6ZX4JrbXfbD+cA84=", + "pom": "sha256-+l+wJ+4qSbPb/zh3VBtC+3CuzMN7oC4dOthipcZyVLc=" }, - "org/jetbrains/kotlin#kotlin-scripting-jvm/2.2.0": { - "jar": "sha256-YKjHQtYfRPIxH73IqGt2fRcboJ2XvnLWukUNN/fj/b8=", - "pom": "sha256-dii0nV53BennadESYAZtmmlXPW2Av4Iw0FRvWo54yJ4=" + "org/jetbrains/kotlin#kotlin-scripting-jvm/2.2.20": { + "jar": "sha256-qR+5BJY0oyum09LpGgy5mD4KpOccDC4bKDg4qOBhYx8=", + "pom": "sha256-0df8RWSBne6v6OvdcfbyGBf/xVjr0U9HpW6NyTaW3Rk=" }, "org/jetbrains/kotlin#kotlin-stdlib-jdk7/1.8.21": { "jar": "sha256-M9FI2w4R3r0NkGd9KCQrztkH+cd3MAAP1ZeGcIkDnYY=", @@ -976,26 +976,26 @@ "jar": "sha256-FcjArLMRSDwGjRaXUBllR0tw39gKx5WA7KOgPPUeSh0=", "pom": "sha256-MQ1tXGVBPjEQuUAr2AdfyuP0vlGdH9kHMTahj+cnvFc=" }, - "org/jetbrains/kotlin#kotlin-stdlib/2.2.0": { - "jar": "sha256-ZdEthaO4ZcFg25FHhRcSpksQ2t1osi7qIqlb+KhnDco=", - "module": "sha256-pbmP3NnbAX1ULhlyJdzuGNZYpW3h2yzEHhMZbWsXaaQ=", - "pom": "sha256-jDyCEAfBNBFVhzm589U4LrgVUds4lc/7iVYeVsD03BY=" + "org/jetbrains/kotlin#kotlin-stdlib/2.2.20": { + "jar": "sha256-iDbM/9NYX63amQEkSyDUKQHS881YEFjYQ04v+rzzo+c=", + "module": "sha256-yRj1IU0CGnLjdn8nVul9EDpSbgTxQj2jZj79+1hH25U=", + "pom": "sha256-SosIbmQxvPYjY39Ssv8ZLhrbkTg4dC5cDupwqN7kKcQ=" }, - "org/jetbrains/kotlin#kotlin-tooling-core/2.2.0": { + "org/jetbrains/kotlin#kotlin-tooling-core/2.2.20": { "jar": "sha256-dAFOxPPveM59p+Pmlk8sUmoxIdXFj++MopeeXzRFgvQ=", - "pom": "sha256-Fiq+zmN9Egvzs1mfJIETV3zey68Q1bInq3cFLmYykpM=" + "pom": "sha256-jvep2QYs59w/xlVxXdAoqZRLeElhPgEYR8XWs7mSgXE=" }, - "org/jetbrains/kotlin#kotlin-util-io/2.2.0": { - "jar": "sha256-h//zwBlwqqkBGr3lZbtSoXmqbckDjFh4koHtK2jVji0=", - "pom": "sha256-NcfaTe0E3/GCIeDzgPo/NhIOvq2hOYOmEQtGWWaKbr0=" + "org/jetbrains/kotlin#kotlin-util-io/2.2.20": { + "jar": "sha256-1DGva+puLcmInE/iawc84VfxEchgj+laGL/gi4F8/3Q=", + "pom": "sha256-xqXQGEjNBAz8j3uuYjLXktcFwpOi2nJmrmJszbNdagM=" }, - "org/jetbrains/kotlin#kotlin-util-klib-metadata/2.2.0": { - "jar": "sha256-nOOw3gU8uf8HoPcXyhQvKQp05NGdkzLbImq+D+thyB4=", - "pom": "sha256-XVJ2wbYor7xCBZ80CoTe/Uv7XroYJm3zdDYH5XftX4c=" + "org/jetbrains/kotlin#kotlin-util-klib-metadata/2.2.20": { + "jar": "sha256-vuSQHKU6WiHA22RZAdKwcK/2gkAkF91XiODjWTZFcTs=", + "pom": "sha256-vtAGUSIGX65328DEb/xBRqaFy7GLijApq9XaO/qhECc=" }, - "org/jetbrains/kotlin#kotlin-util-klib/2.2.0": { - "jar": "sha256-FPB+vZrfvk6F+06/MSJSULL8P1Qo7OQ31O1j7D+prE0=", - "pom": "sha256-NU7YchvXXwfcCyQbiFg+7oLCTZIdN+lrctmNpi1ISEo=" + "org/jetbrains/kotlin#kotlin-util-klib/2.2.20": { + "jar": "sha256-7XyAlrK75HetF8MXjeuoyDr1MourNr/iEJEL1bQZI0w=", + "pom": "sha256-2mwiR3qvQt2hbYWa2unj7Yq8khzLp/9RYTTMi9NZqpI=" }, "org/jetbrains/kotlinx#kotlinx-coroutines-bom/1.8.0": { "pom": "sha256-Ejnp2+E5fNWXE0KVayURvDrOe2QYQuQ3KgiNz6i5rVU=" diff --git a/pkgs/by-name/ki/kilocode-cli/package.nix b/pkgs/by-name/ki/kilocode-cli/package.nix new file mode 100644 index 000000000000..2d600ce64577 --- /dev/null +++ b/pkgs/by-name/ki/kilocode-cli/package.nix @@ -0,0 +1,93 @@ +{ + lib, + stdenvNoCC, + fetchFromGitHub, + fetchPnpmDeps, + nodejs, + writableTmpDirAsHomeHook, + pnpmConfigHook, + pnpm, + unzip, + patchelf, + ripgrep, + versionCheckHook, + nix-update-script, +}: +stdenvNoCC.mkDerivation (finalAttrs: { + pname = "kilocode-cli"; + version = "0.18.0"; + + src = fetchFromGitHub { + owner = "Kilo-Org"; + repo = "kilocode"; + tag = "cli-v${finalAttrs.version}"; + hash = "sha256-zEhv/tcKMR9D+aTVxaw3LBjbEBpuy4o0cpV/vowOFSY="; + }; + + pnpmDeps = fetchPnpmDeps { + inherit (finalAttrs) pname version src; + fetcherVersion = 2; + hash = "sha256-fTCuTAEYNyqitBvOafQyi3BDqI/O7u7yEhSPH7FVDUg="; + }; + + buildInputs = [ + nodejs + ]; + + nativeBuildInputs = [ + writableTmpDirAsHomeHook + pnpmConfigHook + pnpm + nodejs + unzip + patchelf + ]; + + strictDeps = true; + + env.npm_config_manage_package_manager_versions = "false"; + + buildPhase = '' + runHook preBuild + + node --run cli:bundle + touch ./cli/dist/.env + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin/ $out/lib/node_modules/@kilocode/ + mv ./cli/dist $out/lib/node_modules/@kilocode/cli + ln -s $out/lib/node_modules/@kilocode/cli/index.js $out/bin/kilocode + chmod +x $out/bin/kilocode + + pushd $out/lib/node_modules/@kilocode/cli + rm node_modules/@vscode/ripgrep/bin/rg + ln -s ${ripgrep}/bin/rg node_modules/@vscode/ripgrep/bin/rg + popd + + runHook postInstall + ''; + + nativeInstallCheckInputs = [ versionCheckHook ]; + doInstallCheck = true; + versionCheckProgramArg = "--version"; + + passthru = { + updateScript = nix-update-script { extraArgs = [ "--version-regex=^cli-v(.+)$" ]; }; + }; + + meta = { + description = "Terminal User Interface for Kilo Code"; + homepage = "https://kilocode.ai/cli"; + downloadPage = "https://www.npmjs.com/package/@kilocode/cli"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ + xiaoxiangmoe + ]; + mainProgram = "kilocode"; + }; +}) diff --git a/pkgs/by-name/li/libucl/package.nix b/pkgs/by-name/li/libucl/package.nix index 689c1cfcbf88..61ce6565153a 100644 --- a/pkgs/by-name/li/libucl/package.nix +++ b/pkgs/by-name/li/libucl/package.nix @@ -27,13 +27,13 @@ let in stdenv.mkDerivation rec { pname = "libucl"; - version = "0.9.2"; + version = "0.9.3"; src = fetchFromGitHub { owner = "vstakhov"; repo = "libucl"; rev = version; - sha256 = "sha256-esNEVBa660rl3Oo2SLaLrFThFkjbqtZ1r0tjMq3h6cM="; + sha256 = "sha256-dub829xZ10sJ5qwegYUiGoyAVLiwg44GKSzz+BMLJis="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/ma/matcha-rss-digest/package.nix b/pkgs/by-name/ma/matcha-rss-digest/package.nix index a55fe972bb94..3096b8a66567 100644 --- a/pkgs/by-name/ma/matcha-rss-digest/package.nix +++ b/pkgs/by-name/ma/matcha-rss-digest/package.nix @@ -6,13 +6,13 @@ buildGoModule rec { pname = "matcha-rss-digest"; - version = "0.8.0"; + version = "0.9.0"; src = fetchFromGitHub { owner = "piqoni"; repo = "matcha"; rev = "v${version}"; - hash = "sha256-AhXr9T2pvCuTTSU8vHhHELyNiU5EC4KR0fpOGrY02Zo="; + hash = "sha256-ezwZmJVJjbrrWJAsZ3+CUZ7K4WpA1HLKL9V+kTZTfj8="; }; vendorHash = "sha256-CURFy92K4aNF9xC8ik6RDadRAvlw8p3Xc+gWE2un6cc="; diff --git a/pkgs/by-name/nc/ncps/package.nix b/pkgs/by-name/nc/ncps/package.nix index 01138fed0746..fc0a5886c30c 100644 --- a/pkgs/by-name/nc/ncps/package.nix +++ b/pkgs/by-name/nc/ncps/package.nix @@ -1,35 +1,122 @@ { buildGoModule, + curl, dbmate, fetchFromGitHub, + go, lib, + minio, + minio-client, + python3, }: let finalAttrs = { pname = "ncps"; - version = "0.4.0"; + version = "0.5.0"; src = fetchFromGitHub { owner = "kalbasit"; repo = "ncps"; tag = "v${finalAttrs.version}"; - hash = "sha256-A2HLbob9MHHCUNIC1OBwyFeE6KuEIdXW75hPSZMgicI="; + hash = "sha256-3ncDDJ0vqmM6Aer/qnEgGZ/eglFmY0oAnMsLJseMQg8="; }; ldflags = [ "-X github.com/kalbasit/ncps/cmd.Version=v${finalAttrs.version}" ]; - vendorHash = "sha256-Plc1L23qOYj1evVIG+O3OxVAKVeEIA+Z6sP4Z/T1SxU="; + # XXX: ncps is built with Go 1.25.5 that is available in release-25.11 but + # master is currently still using 1.25.4 (update waiting in the + # staging/staging-next branches.) This is a workaround for this issue and + # will automatically becomes no-op once Go is updated. + preBuild = lib.optionalString (go.version == "1.25.4") '' + sed -e 's:go 1.25.5:go 1.25.4:g' -i go.mod + ''; + + vendorHash = "sha256-3YPKlz7+x7nYCqKmOroaiUyZGKIQMGFxcNyPnrA9Tio="; doCheck = true; checkFlags = [ "-race" ]; nativeBuildInputs = [ + curl # used for checking MinIO health check dbmate # used for testing + minio # S3-compatible storage for integration tests + minio-client # mc CLI for MinIO setup + python3 # used for generating the ports ]; + # Start MinIO before running tests to enable S3 integration tests + preCheck = '' + echo "🚀 Starting MinIO for S3 integration tests..." + + # Create temporary directories for MinIO data and config + export MINIO_DATA_DIR=$(mktemp -d) + export HOME=$(mktemp -d) + + # Configure MinIO credentials (must be set before starting MinIO) + export MINIO_ROOT_USER=admin + export MINIO_ROOT_PASSWORD=password + export MINIO_REGION=us-east-1 + + # Generate random free ports using python + # We bind to port 0, get the assigned port, and close the socket immediately. + # In a Nix sandbox, the race condition risk (port being stolen between check and use) is negligible. + export MINIO_PORT=$(python3 -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()') + export CONSOLE_PORT=$(python3 -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()') + + # Export S3 test environment variables + export NCPS_TEST_S3_BUCKET="test-bucket" + export NCPS_TEST_S3_ENDPOINT="http://127.0.0.1:$MINIO_PORT" + export NCPS_TEST_S3_REGION="us-east-1" + export NCPS_TEST_S3_ACCESS_KEY_ID="test-access-key" + export NCPS_TEST_S3_SECRET_ACCESS_KEY="test-secret-key" + + # Start MinIO server in background + minio server "$MINIO_DATA_DIR" \ + --address "127.0.0.1:$MINIO_PORT" \ + --console-address "127.0.0.1:$CONSOLE_PORT" & + export MINIO_PID=$! + + # Wait for MinIO to be ready + echo "⏳ Waiting for MinIO to be ready..." + for i in {1..30}; do + if curl -sf "$NCPS_TEST_S3_ENDPOINT/minio/health/live"; then + echo "✅ MinIO is ready" + break + fi + if [ $i -eq 30 ]; then + echo "❌ MinIO failed to start" + kill $MINIO_PID 2>/dev/null || true + exit 1 + fi + sleep 1 + done + + # Setup admin alias + mc alias set local "$NCPS_TEST_S3_ENDPOINT" "$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD" + + # Create test bucket + mc mb "local/$NCPS_TEST_S3_BUCKET" || true + + # Create service account for tests + mc admin user svcacct add \ + --access-key "$NCPS_TEST_S3_ACCESS_KEY_ID" \ + --secret-key "$NCPS_TEST_S3_SECRET_ACCESS_KEY" \ + local admin || true + + echo "✅ MinIO configured for S3 integration tests" + ''; + + # Stop MinIO after tests complete + postCheck = '' + echo "🛑 Stopping MinIO..." + kill $MINIO_PID 2>/dev/null || true + rm -rf "$MINIO_DATA_DIR" + echo "✅ MinIO stopped and cleaned up" + ''; + postInstall = '' mkdir -p $out/share/ncps cp -r db $out/share/ncps/db diff --git a/pkgs/by-name/nf/nfs-ganesha/package.nix b/pkgs/by-name/nf/nfs-ganesha/package.nix index d2ffb3ee693d..490842c5ecac 100644 --- a/pkgs/by-name/nf/nfs-ganesha/package.nix +++ b/pkgs/by-name/nf/nfs-ganesha/package.nix @@ -25,7 +25,7 @@ stdenv.mkDerivation rec { pname = "nfs-ganesha"; - version = "9.2"; + version = "9.4"; outputs = [ "out" @@ -37,7 +37,7 @@ stdenv.mkDerivation rec { owner = "nfs-ganesha"; repo = "nfs-ganesha"; tag = "V${version}"; - hash = "sha256-2EAkr+zu7Jc2j/8BrJ/+Skv/D3rTSbh4A5JTRhWafEk="; + hash = "sha256-Adax64aaioYfPg7SMtylS2wpYV52l8KgXBA8eJefGkY="; }; patches = lib.optional useDbus ./allow-bypassing-dbus-pkg-config-test.patch; diff --git a/pkgs/by-name/on/onefetch/package.nix b/pkgs/by-name/on/onefetch/package.nix index 4a9bb6ffd4ff..e4fc8fc57f1a 100644 --- a/pkgs/by-name/on/onefetch/package.nix +++ b/pkgs/by-name/on/onefetch/package.nix @@ -16,16 +16,16 @@ let in rustPlatform.buildRustPackage rec { pname = "onefetch"; - version = "2.25.0"; + version = "2.26.1"; src = fetchFromGitHub { owner = "o2sh"; repo = "onefetch"; rev = version; - hash = "sha256-ZaaSuHWkhJx0q1CBAiRhwoLeeyyoAj6/vP3AJwybjAo="; + hash = "sha256-JT7iQRKOK/2Zh/IDMv1FM1szITeBaaMy+WuXHjpPkfY="; }; - cargoHash = "sha256-56Net4nNRndePhdsQPbmqiPHpOUGMmnQt6BuplQpvSU="; + cargoHash = "sha256-VBbiOA/+SPcIvmhNQ71gUBOIWEWV1A86rljBfdAfhZM="; cargoPatches = [ # enable pkg-config feature of zstd diff --git a/pkgs/by-name/op/openscad-unstable/package.nix b/pkgs/by-name/op/openscad-unstable/package.nix index aaa656e9f1d4..b4e57ca17e3f 100644 --- a/pkgs/by-name/op/openscad-unstable/package.nix +++ b/pkgs/by-name/op/openscad-unstable/package.nix @@ -156,7 +156,8 @@ clangStdenv.mkDerivation rec { postInstall = lib.optionalString stdenv.hostPlatform.isDarwin '' mkdir $out/Applications mv $out/bin/*.app $out/Applications - rmdir $out/bin + rm $out/bin/* || true + ln -s $out/Applications/OpenSCAD.app/Contents/MacOS/OpenSCAD $out/bin/openscad-unstable ''; nativeCheckInputs = [ diff --git a/pkgs/by-name/pr/prometheus-borgmatic-exporter/package.nix b/pkgs/by-name/pr/prometheus-borgmatic-exporter/package.nix index 06207ca651b2..0bcbcfb4916c 100644 --- a/pkgs/by-name/pr/prometheus-borgmatic-exporter/package.nix +++ b/pkgs/by-name/pr/prometheus-borgmatic-exporter/package.nix @@ -7,14 +7,14 @@ python3Packages.buildPythonApplication rec { pname = "prometheus-borgmatic-exporter"; - version = "0.3.0"; + version = "0.4.0"; pyproject = true; src = fetchFromGitHub { owner = "maxim-mityutko"; repo = "borgmatic-exporter"; tag = "v${version}"; - hash = "sha256-QbpHSpcXJdmi6oiPTFT6XwNLtaXSAGavHeEoz3IV73I="; + hash = "sha256-fhsGpQolZxX5VAAEV3hiLF7bo4pbVt9GWyertf2oeO0="; }; pythonRelaxDeps = [ "prometheus-client" ]; diff --git a/pkgs/by-name/ps/pspg/package.nix b/pkgs/by-name/ps/pspg/package.nix index f4919a65f757..0c54e1bb80f0 100644 --- a/pkgs/by-name/ps/pspg/package.nix +++ b/pkgs/by-name/ps/pspg/package.nix @@ -12,13 +12,13 @@ stdenv.mkDerivation rec { pname = "pspg"; - version = "5.8.13"; + version = "5.8.14"; src = fetchFromGitHub { owner = "okbob"; repo = "pspg"; rev = version; - sha256 = "sha256-swsVxhvfLfK8QQfsL68f/bL3OThOZiqM/ceD7kjOghU="; + sha256 = "sha256-DZsMZZO5NMutlzLT+wwtPNdnzAnka32ZMqgMvEuw9ag="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/py/pywhisker/package.nix b/pkgs/by-name/py/pywhisker/package.nix new file mode 100644 index 000000000000..afcee1978bfb --- /dev/null +++ b/pkgs/by-name/py/pywhisker/package.nix @@ -0,0 +1,44 @@ +{ + lib, + fetchFromGitHub, + python3, +}: + +python3.pkgs.buildPythonApplication { + pname = "pywhisker"; + version = "0.1.0-unstable-2025-09-16"; + pyproject = true; + + src = fetchFromGitHub { + owner = "ShutdownRepo"; + repo = "pywhisker"; + rev = "dc35dba57bb4ad594f052d6598a855d192a37a3f"; + hash = "sha256-dXr/Vb7h+ZiO5VeOEx3tfXUq8sldrRofK5ENJDZcAb0="; + }; + + build-system = with python3.pkgs; [ setuptools ]; + + dependencies = with python3.pkgs; [ + cryptography + dsinternals + impacket + ldap3 + ldapdomaindump + pyasn1 + rich + six + ]; + + pythonImportsCheck = [ "pywhisker" ]; + + # Project has no tests + doCheck = false; + + meta = { + description = "Tool for Shadow Credentials attacks"; + homepage = "https://github.com/ShutdownRepo/pywhisker"; + license = lib.licenses.gpl3Only; + maintainers = with lib.maintainers; [ fab ]; + mainProgram = "pywhisker"; + }; +} diff --git a/pkgs/by-name/rc/rcu/package.nix b/pkgs/by-name/rc/rcu/package.nix index 4ec0d3ddc11d..6f58990b4e10 100644 --- a/pkgs/by-name/rc/rcu/package.nix +++ b/pkgs/by-name/rc/rcu/package.nix @@ -24,7 +24,7 @@ let in python3Packages.buildPythonApplication rec { pname = "rcu"; - version = "4.0.31"; + version = "4.0.32"; format = "other"; @@ -32,7 +32,7 @@ python3Packages.buildPythonApplication rec { let src-tarball = requireFile { name = "rcu-${version}-source.tar.gz"; - hash = "sha256-gOf6CaLqoGqJuTcyARdLnKiovPDFRtsABJgEEF7fx+A="; + hash = "sha256-0sJyCRDV76HUy78RBO27AgkXGroL217GNwHp8HMSKx8="; url = "https://www.davisr.me/projects/rcu/"; }; in diff --git a/pkgs/by-name/re/reqable/package.nix b/pkgs/by-name/re/reqable/package.nix index 4c201ef4673b..80d88007cb64 100644 --- a/pkgs/by-name/re/reqable/package.nix +++ b/pkgs/by-name/re/reqable/package.nix @@ -28,11 +28,11 @@ stdenv.mkDerivation (finalAttrs: { pname = "reqable"; - version = "2.33.12"; + version = "3.0.30"; src = fetchurl { url = "https://github.com/reqable/reqable-app/releases/download/${finalAttrs.version}/reqable-app-linux-x86_64.deb"; - hash = "sha256-LCHeJUzTRjl/lh3PWygZV0Rd3AxJEGlTkVrI/5l+Go4="; + hash = "sha256-tqeTcM0+RClOgWY72NJAFJAe62zbqAtdsIe//nZ3Kjs="; }; nativeBuildInputs = [ @@ -75,7 +75,8 @@ stdenv.mkDerivation (finalAttrs: { preFixup = '' mkdir $out/bin makeWrapper $out/share/reqable/reqable $out/bin/reqable \ - --prefix LD_LIBRARY_PATH : $out/share/reqable/lib + --prefix LD_LIBRARY_PATH : $out/share/reqable/lib \ + --set GIO_MODULE_DIR "${glib.out}/lib/gio/modules" ''; passthru.updateScript = nix-update-script { }; @@ -83,10 +84,12 @@ stdenv.mkDerivation (finalAttrs: { meta = { description = "Generation API debugging and testing one-stop solution"; homepage = "https://reqable.com"; + downloadPage = "https://github.com/reqable/reqable-app/releases"; + changelog = "https://github.com/reqable/reqable-app/releases/tag/${finalAttrs.version}"; mainProgram = "reqable"; license = lib.licenses.unfree; sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; - maintainers = [ ]; + maintainers = with lib.maintainers; [ chillcicada ]; platforms = [ "x86_64-linux" ]; }; }) diff --git a/pkgs/by-name/rn/rnr/package.nix b/pkgs/by-name/rn/rnr/package.nix index 9da124082bfa..c8cea76924de 100644 --- a/pkgs/by-name/rn/rnr/package.nix +++ b/pkgs/by-name/rn/rnr/package.nix @@ -6,16 +6,16 @@ rustPlatform.buildRustPackage rec { pname = "rnr"; - version = "0.5.0"; + version = "0.5.1"; src = fetchFromGitHub { owner = "ismaelgv"; repo = "rnr"; rev = "v${version}"; - sha256 = "sha256-uuM8zh0wFSsySedXmdm8WGGR4HmUc5TCZ6socdztrZI="; + sha256 = "sha256-vuYFh7k7dNCOnB5jqP8MIBIWFOVxRmv0+qvCXkJchtA="; }; - cargoHash = "sha256-lXo3BECHpiNMRMgd4XZy+b8QHbE0TZ5/P4cz+SgwqsY="; + cargoHash = "sha256-2YvpO8K5Y8Ul2k0sJXWMgrHnGY8e1sEcIZNWIEpKfqs="; meta = { description = "Command-line tool to batch rename files and directories"; diff --git a/pkgs/by-name/st/starlark/package.nix b/pkgs/by-name/st/starlark/package.nix index fdf506934a3e..7186bd2b4f85 100644 --- a/pkgs/by-name/st/starlark/package.nix +++ b/pkgs/by-name/st/starlark/package.nix @@ -6,13 +6,13 @@ }: buildGoModule { pname = "starlark"; - version = "0-unstable-2025-11-09"; + version = "0-unstable-2025-12-22"; src = fetchFromGitHub { owner = "google"; repo = "starlark-go"; - rev = "be02852a5e1f2f07f08e887a191e725154c029b8"; - hash = "sha256-Njq60qM+2AigXZB3AAWV5mpN2uxDXJSsjJTPlMvYw5k="; + rev = "15019ee33dea8b618e081116e29a613c9aa050ea"; + hash = "sha256-BIWOmJwtTxjXTc48Mamm6uqPTNd7DMeURfQ2rYX4Ecs="; }; vendorHash = "sha256-8drlCBy+KROyqXzm/c+HBe/bMVOyvwRoLHxOApJhMfo="; diff --git a/pkgs/by-name/su/super-productivity/package.nix b/pkgs/by-name/su/super-productivity/package.nix index c0415c7fa169..36849cc31709 100644 --- a/pkgs/by-name/su/super-productivity/package.nix +++ b/pkgs/by-name/su/super-productivity/package.nix @@ -16,13 +16,13 @@ let in buildNpmPackage rec { pname = "super-productivity"; - version = "16.6.1"; + version = "16.7.3"; src = fetchFromGitHub { owner = "johannesjo"; repo = "super-productivity"; tag = "v${version}"; - hash = "sha256-8FTgwyZOc/klAis+h5GG0lb1Rk/tvZpMeLuqWhAL4gI="; + hash = "sha256-nr1umVoOQ9uzswgU16hpcTpaM6W8C3CZMG/O44WFtnw="; postFetch = '' find $out -name package-lock.json -exec ${lib.getExe npm-lockfile-fix} -r {} \; @@ -65,7 +65,7 @@ buildNpmPackage rec { dontInstall = true; outputHashMode = "recursive"; - hash = "sha256-BM1l3V1vDIbm0GGc5pc66Nsx3fqhqZLE9xI+LuI5KWA="; + hash = "sha256-t22mdvx1rJFzXKFscnweggFCqTKheTAzElA4ksUQQ5k="; } ); diff --git a/pkgs/by-name/ta/talosctl/package.nix b/pkgs/by-name/ta/talosctl/package.nix index 66166e727b2b..1f37100c9fbe 100644 --- a/pkgs/by-name/ta/talosctl/package.nix +++ b/pkgs/by-name/ta/talosctl/package.nix @@ -9,16 +9,16 @@ buildGoModule rec { pname = "talosctl"; - version = "1.11.6"; + version = "1.12.0"; src = fetchFromGitHub { owner = "siderolabs"; repo = "talos"; tag = "v${version}"; - hash = "sha256-RPmveQ52PqpD/OG/7SsJbKlZjggRU8uBqJyNmOszWtg="; + hash = "sha256-u8/T01PWBGH3bJCNoC+FIzp8aH05ci4Kr3eHHWPDRkI="; }; - vendorHash = "sha256-tGlGlTMIsBLQGvIYU/zEE0devM0j31ER8L8hacXvTz4="; + vendorHash = "sha256-LLtbdKq028EEs8lMt3uiwMo2KMJ6nJKf6xFyLJlg+oM="; ldflags = [ "-s" diff --git a/pkgs/by-name/ta/tana/package.nix b/pkgs/by-name/ta/tana/package.nix index e83ec371dd6f..71a6a3651898 100644 --- a/pkgs/by-name/ta/tana/package.nix +++ b/pkgs/by-name/ta/tana/package.nix @@ -62,7 +62,7 @@ let stdenv.cc.cc stdenv.cc.libc ]; - version = "1.0.51"; + version = "1.498.21"; in stdenv.mkDerivation { pname = "tana"; @@ -70,7 +70,7 @@ stdenv.mkDerivation { src = fetchurl { url = "https://github.com/tanainc/tana-desktop-releases/releases/download/v${version}/tana_${version}_amd64.deb"; - hash = "sha256-ApRfy+aD4lp53HtShDTQGKuAsQnKdwFMDd19Np9/b9g="; + hash = "sha256-6rX6UxOdSk29SYLwyVX6zkLuIxeKVfQfap1Q2zGpN7g="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/ta/tandoor-recipes/package.nix b/pkgs/by-name/ta/tandoor-recipes/package.nix index c3a27f4816df..c04940c22f52 100644 --- a/pkgs/by-name/ta/tandoor-recipes/package.nix +++ b/pkgs/by-name/ta/tandoor-recipes/package.nix @@ -166,7 +166,7 @@ python.pkgs.buildPythonPackage { updateScript = ./update.sh; tests = { - inherit (nixosTests) tandoor-recipes tandoor-recipes-script-name; + inherit (nixosTests) tandoor-recipes tandoor-recipes-script-name tandoor-recipes-media; }; }; diff --git a/pkgs/by-name/un/untrunc-anthwlock/package.nix b/pkgs/by-name/un/untrunc-anthwlock/package.nix index bd9dd27c9868..f18f9df61fe6 100644 --- a/pkgs/by-name/un/untrunc-anthwlock/package.nix +++ b/pkgs/by-name/un/untrunc-anthwlock/package.nix @@ -2,8 +2,9 @@ lib, stdenv, fetchFromGitHub, - ffmpeg, + ffmpeg_6, libui, + pkg-config, unstableGitUpdater, wrapGAppsHook3, }: @@ -19,13 +20,27 @@ stdenv.mkDerivation { hash = "sha256-4GIPj8so7POEwxKZzFBoJTu76XKbGHYmXC/ILeo0dVE="; }; - nativeBuildInputs = [ wrapGAppsHook3 ]; + nativeBuildInputs = [ + pkg-config + wrapGAppsHook3 + ]; buildInputs = [ - ffmpeg + # Uses ffmpeg internals; keep ffmpeg_6 until upstream supports newer API. + # Upstream fix: https://github.com/anthwlock/untrunc/pull/249 + ffmpeg_6 libui ]; + strictDeps = true; + + postPatch = '' + substituteInPlace Makefile \ + --replace "-isystem/usr/include/ffmpeg" "\$(shell pkg-config --cflags libavformat libavcodec libavutil libui)" \ + --replace "-lavformat -lavcodec -lavutil" "\$(shell pkg-config --libs libavformat libavcodec libavutil)" \ + --replace "-lui -lpthread" "\$(shell pkg-config --libs libui) -lpthread" + ''; + buildPhase = '' runHook preBuild make IS_RELEASE=1 untrunc @@ -50,6 +65,7 @@ stdenv.mkDerivation { description = "Restore a truncated mp4/mov (improved version of ponchio/untrunc)"; homepage = "https://github.com/anthwlock/untrunc"; license = lib.licenses.gpl2Only; + mainProgram = "untrunc"; platforms = lib.platforms.all; maintainers = [ lib.maintainers.romildo ]; }; diff --git a/pkgs/by-name/va/vacuum-go/package.nix b/pkgs/by-name/va/vacuum-go/package.nix index 123a31716b9a..471ce807f6d0 100644 --- a/pkgs/by-name/va/vacuum-go/package.nix +++ b/pkgs/by-name/va/vacuum-go/package.nix @@ -7,17 +7,17 @@ buildGoModule (finalAttrs: { pname = "vacuum-go"; - version = "0.21.2"; + version = "0.21.7"; src = fetchFromGitHub { owner = "daveshanley"; repo = "vacuum"; # using refs/tags because simple version gives: 'the given path has multiple possibilities' error tag = "v${finalAttrs.version}"; - hash = "sha256-8hrKAfDeV5PUagjwKSEAYazuL/PZMXu7kqdsttGuUy0="; + hash = "sha256-eTwoK/AysxoTId6IM76b/euyYEE/9cwXcbDcm4wLjM0="; }; - vendorHash = "sha256-dc1c21JUld9PqOKh4QzEppU/sp7FCPV14P0EYmPYR1k="; + vendorHash = "sha256-aTQEt1vBdzwOE99CHmCkodvGReR30Jq7iWkMtwK3620="; env.CGO_ENABLED = 0; ldflags = [ diff --git a/pkgs/by-name/wa/wasm-language-tools/package.nix b/pkgs/by-name/wa/wasm-language-tools/package.nix index ae82952bdc4c..e1adcb080635 100644 --- a/pkgs/by-name/wa/wasm-language-tools/package.nix +++ b/pkgs/by-name/wa/wasm-language-tools/package.nix @@ -8,16 +8,16 @@ rustPlatform.buildRustPackage rec { pname = "wasm-language-tools"; - version = "0.7.1"; + version = "0.8.0"; src = fetchFromGitHub { owner = "g-plane"; repo = "wasm-language-tools"; tag = "v${version}"; - hash = "sha256-ySY1AIgr5HwSrfebfDkKZvl/1LQpU64nCF6TEi//JuM="; + hash = "sha256-4PnagT1pufsEy1ROvhYYtkuSsU+irGpYV9iffwIQPmk="; }; - cargoHash = "sha256-veBxrnTRSI6kRy0bREBWCLEkbkPUWM7jGwlcFhG6FjU="; + cargoHash = "sha256-h+HEOzS93XFuDm5luODAzzGtxxaxTTdxTWIKm41Sw6s="; nativeInstallCheckInputs = [ versionCheckHook ]; versionCheckProgram = "${placeholder "out"}/bin/wat_server"; diff --git a/pkgs/by-name/wi/wivrn/package.nix b/pkgs/by-name/wi/wivrn/package.nix index 67d860ad43f5..495e1c82c4ec 100644 --- a/pkgs/by-name/wi/wivrn/package.nix +++ b/pkgs/by-name/wi/wivrn/package.nix @@ -53,13 +53,13 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "wivrn"; - version = "25.11.1"; + version = "25.12"; src = fetchFromGitHub { owner = "wivrn"; repo = "wivrn"; rev = "v${finalAttrs.version}"; - hash = "sha256-pEKMeRdI9UhdZ+NksRBcF7yPC7Ys2haE+B4PPGQ4beE="; + hash = "sha256-gadfW3/PXi9SEztaHbi4U29Vj7ik/ia8BVDTy8P5aJE="; }; monado = applyPatches { @@ -67,8 +67,8 @@ stdenv.mkDerivation (finalAttrs: { domain = "gitlab.freedesktop.org"; owner = "monado"; repo = "monado"; - rev = "06e62fc7d9c5cbcbc43405bb86dfde3bf01ce043"; - hash = "sha256-0ALB9eLY4NAUqNOYZMwpvYnLxVpHsQDJc1er8Txdezs="; + rev = "20e0dacbdd2de863923790326beec76e848b056a"; + hash = "sha256-wiXdMgp3bKW17KqLnSn6HHhz7xbQtjp4c3aU7qp+2BE="; }; postPatch = '' diff --git a/pkgs/by-name/xi/xivlauncher/package.nix b/pkgs/by-name/xi/xivlauncher/package.nix index d8fe8dc10d29..4219e059aab8 100644 --- a/pkgs/by-name/xi/xivlauncher/package.nix +++ b/pkgs/by-name/xi/xivlauncher/package.nix @@ -17,7 +17,7 @@ }: let - rev = "1.3.0"; + rev = "1.3.1"; in buildDotnetModule rec { pname = "XIVLauncher"; @@ -27,7 +27,7 @@ buildDotnetModule rec { owner = "goatcorp"; repo = "XIVLauncher.Core"; inherit rev; - hash = "sha256-tPziHwHK4B+LJ8xNWEBmpFStkczZF3G5jhjxYYG59m0="; + hash = "sha256-a5lxQFNJjC4LVlokLeEEiPAXPTK9KkgboqjlEc+Viw0="; fetchSubmodules = true; }; diff --git a/pkgs/development/python-modules/bthome-ble/default.nix b/pkgs/development/python-modules/bthome-ble/default.nix index 13e587c04bf7..4462812d9d28 100644 --- a/pkgs/development/python-modules/bthome-ble/default.nix +++ b/pkgs/development/python-modules/bthome-ble/default.nix @@ -14,14 +14,14 @@ buildPythonPackage rec { pname = "bthome-ble"; - version = "3.17.0"; + version = "3.19.0"; pyproject = true; src = fetchFromGitHub { owner = "Bluetooth-Devices"; repo = "bthome-ble"; tag = "v${version}"; - hash = "sha256-So4EGO46FOrUZ+RNFimanUDBP5tgZBjXc5eb9KAvYjQ="; + hash = "sha256-x82SiZT1NEKlHiAcwcbj/IVcXszXbbOF4ngXVg6bDZ4="; }; build-system = [ poetry-core ]; diff --git a/pkgs/development/python-modules/cupy/default.nix b/pkgs/development/python-modules/cupy/default.nix index ea7b4743f04c..0eb635c06a15 100644 --- a/pkgs/development/python-modules/cupy/default.nix +++ b/pkgs/development/python-modules/cupy/default.nix @@ -131,6 +131,6 @@ buildPythonPackage rec { "aarch64-linux" "x86_64-linux" ]; - maintainers = with lib.maintainers; [ hyphon81 ]; + maintainers = [ ]; }; } diff --git a/pkgs/development/python-modules/dm-haiku/default.nix b/pkgs/development/python-modules/dm-haiku/default.nix index 51745dfdc89a..831516ec78cc 100644 --- a/pkgs/development/python-modules/dm-haiku/default.nix +++ b/pkgs/development/python-modules/dm-haiku/default.nix @@ -36,14 +36,14 @@ let dm-haiku = buildPythonPackage rec { pname = "dm-haiku"; - version = "0.0.15"; + version = "0.0.16"; pyproject = true; src = fetchFromGitHub { owner = "deepmind"; repo = "dm-haiku"; tag = "v${version}"; - hash = "sha256-phJ0f+effHQzuAVtPBR0bY3C0p//LBY7k1ci4mXBGfU="; + hash = "sha256-XugzzHapnqXD8w17k6HaNeqWcxRe49r7OIb8v5LI2NM="; }; patches = [ diff --git a/pkgs/development/python-modules/fastrlock/default.nix b/pkgs/development/python-modules/fastrlock/default.nix index f6a46cbf2918..c65ca6f27686 100644 --- a/pkgs/development/python-modules/fastrlock/default.nix +++ b/pkgs/development/python-modules/fastrlock/default.nix @@ -34,6 +34,6 @@ buildPythonPackage rec { description = "RLock implementation for CPython"; homepage = "https://github.com/scoder/fastrlock"; license = lib.licenses.mit; - maintainers = with lib.maintainers; [ hyphon81 ]; + maintainers = [ ]; }; } diff --git a/pkgs/development/python-modules/filelock/default.nix b/pkgs/development/python-modules/filelock/default.nix index 926bc2ad5cfd..347ef9ca5304 100644 --- a/pkgs/development/python-modules/filelock/default.nix +++ b/pkgs/development/python-modules/filelock/default.nix @@ -44,6 +44,6 @@ buildPythonPackage rec { description = "Platform independent file lock for Python"; homepage = "https://github.com/benediktschmitt/py-filelock"; license = lib.licenses.unlicense; - maintainers = with lib.maintainers; [ hyphon81 ]; + maintainers = [ ]; }; } diff --git a/pkgs/development/python-modules/iamdata/default.nix b/pkgs/development/python-modules/iamdata/default.nix index 82a4c2c7ef5f..570c096e224c 100644 --- a/pkgs/development/python-modules/iamdata/default.nix +++ b/pkgs/development/python-modules/iamdata/default.nix @@ -8,14 +8,14 @@ buildPythonPackage rec { pname = "iamdata"; - version = "0.1.202512271"; + version = "0.1.202512281"; pyproject = true; src = fetchFromGitHub { owner = "cloud-copilot"; repo = "iam-data-python"; tag = "v${version}"; - hash = "sha256-kOSs5HyJcTip0Tc9VHiRrJQcQ+hEJYSdAqEi5aSfmRA="; + hash = "sha256-gv3E+bIZiWqSBB5zXjSz5RicZY9aGY+EVtMbcUNpDNU="; }; __darwinAllowLocalNetworking = true; diff --git a/pkgs/development/python-modules/plugwise/default.nix b/pkgs/development/python-modules/plugwise/default.nix index ddb48afc17b1..383c89717d9e 100644 --- a/pkgs/development/python-modules/plugwise/default.nix +++ b/pkgs/development/python-modules/plugwise/default.nix @@ -18,7 +18,7 @@ buildPythonPackage rec { pname = "plugwise"; - version = "1.11.0"; + version = "1.11.2"; pyproject = true; disabled = pythonOlder "3.12"; @@ -27,7 +27,7 @@ buildPythonPackage rec { owner = "plugwise"; repo = "python-plugwise"; tag = "v${version}"; - hash = "sha256-fgUIyI9akQbVhcff413gIPzviGNZlQJztFTnW5+n9wU="; + hash = "sha256-4d9AK2sT0KVKU0oDfskOiSq7g2BuZksPL0wVJN0LbzY="; }; postPatch = '' diff --git a/pkgs/development/python-modules/publicsuffixlist/default.nix b/pkgs/development/python-modules/publicsuffixlist/default.nix index 11be7e4b3c11..3ca1f494841e 100644 --- a/pkgs/development/python-modules/publicsuffixlist/default.nix +++ b/pkgs/development/python-modules/publicsuffixlist/default.nix @@ -11,12 +11,12 @@ buildPythonPackage rec { pname = "publicsuffixlist"; - version = "1.0.2.20251222"; + version = "1.0.2.20251223"; pyproject = true; src = fetchPypi { inherit pname version; - hash = "sha256-AH9okvxG0VBeh6tM1BStIKyWhd1OjfiNmVlX8s8sykU="; + hash = "sha256-ENje3AleagrKul/SGRvjUG04nBuucap675+HW2oXigo="; }; postPatch = '' diff --git a/pkgs/development/python-modules/pyglossary/default.nix b/pkgs/development/python-modules/pyglossary/default.nix index 62dfd68664b7..876507482fc7 100644 --- a/pkgs/development/python-modules/pyglossary/default.nix +++ b/pkgs/development/python-modules/pyglossary/default.nix @@ -28,25 +28,16 @@ buildPythonPackage rec { pname = "pyglossary"; - version = "5.1.1"; + version = "5.2.1"; pyproject = true; src = fetchFromGitHub { owner = "ilius"; repo = "pyglossary"; tag = version; - hash = "sha256-OrySbbStVSz+WF8D+ODK++lKfYJOm9KCfOxDP3snuKY="; + hash = "sha256-kxCJ5Sv/v7LOIgNrhpv2Q3ooWx/eciWOVV5YhjOWf70="; }; - patches = [ - # Fixes a few install issues, can be removed in the next release. See: - # https://github.com/ilius/pyglossary/pull/684 - (fetchpatch { - url = "https://github.com/ilius/pyglossary/commit/f86c91ed987579cd8a1c7f7f278452901ce725ac.patch"; - hash = "sha256-ewYeNwD3/aSsNbMazgW/3tBpYAPBZdnVu9LCh7tQZjg="; - }) - ]; - build-system = [ setuptools ] @@ -78,10 +69,6 @@ buildPythonPackage rec { nativeCheckInputs = [ versionCheckHook ]; - env = { - # The default --help creates permission errors that may be confusing when - # observed in the build log. - }; pythonImportsCheck = [ "pyglossary" diff --git a/pkgs/development/python-modules/pysptk/default.nix b/pkgs/development/python-modules/pysptk/default.nix index 977997473aab..ed981002f75a 100644 --- a/pkgs/development/python-modules/pysptk/default.nix +++ b/pkgs/development/python-modules/pysptk/default.nix @@ -44,6 +44,6 @@ buildPythonPackage rec { description = "Wrapper for Speech Signal Processing Toolkit (SPTK)"; homepage = "https://pysptk.readthedocs.io/"; license = lib.licenses.mit; - maintainers = with lib.maintainers; [ hyphon81 ]; + maintainers = [ ]; }; } diff --git a/pkgs/development/python-modules/robotframework/default.nix b/pkgs/development/python-modules/robotframework/default.nix index 7f30ea89797a..35b648938bad 100644 --- a/pkgs/development/python-modules/robotframework/default.nix +++ b/pkgs/development/python-modules/robotframework/default.nix @@ -10,7 +10,7 @@ buildPythonPackage rec { pname = "robotframework"; - version = "7.3.2"; + version = "7.4.1"; pyproject = true; disabled = pythonOlder "3.8"; @@ -19,7 +19,7 @@ buildPythonPackage rec { owner = "robotframework"; repo = "robotframework"; tag = "v${version}"; - hash = "sha256-JxZI0i9Aj/TX4BkIi+jeBdTy0ckv5Fdy5tHRI9vQ8Ss="; + hash = "sha256-AnYIdRRwYUsgaOZw+vcpDB69DOg13kU1jA3ObRDLyWk="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/simsimd/default.nix b/pkgs/development/python-modules/simsimd/default.nix index 42f6944e0a4f..80a72332edfb 100644 --- a/pkgs/development/python-modules/simsimd/default.nix +++ b/pkgs/development/python-modules/simsimd/default.nix @@ -11,14 +11,14 @@ buildPythonPackage rec { pname = "simsimd"; - version = "6.5.10"; + version = "6.5.12"; pyproject = true; src = fetchFromGitHub { owner = "ashvardanian"; repo = "SimSIMD"; tag = "v${version}"; - hash = "sha256-tiKU8vxcTYA/9J0uUb9Q4NGCDNeBkF/g4PL69rZezCs="; + hash = "sha256-4mgWm4FcTGf9DNc39GOjK9jnyev7hIeODjpnuIz6f1k="; }; build-system = [ diff --git a/pkgs/development/python-modules/sphinx-reredirects/default.nix b/pkgs/development/python-modules/sphinx-reredirects/default.nix index d98feefa695f..ec4fa084f65a 100644 --- a/pkgs/development/python-modules/sphinx-reredirects/default.nix +++ b/pkgs/development/python-modules/sphinx-reredirects/default.nix @@ -8,13 +8,13 @@ buildPythonPackage rec { pname = "sphinx-reredirects"; - version = "1.0.0"; + version = "1.1.0"; pyproject = true; src = fetchPypi { pname = "sphinx_reredirects"; inherit version; - hash = "sha256-fJutqfEzBIn89Mcpei1toqScpId9P0LROIrh3hAZv1w="; + hash = "sha256-+5sZUzWrFLQ/gnMofQx+62N7psVsZlgcEbRyAvZxiyk="; }; build-system = [ diff --git a/pkgs/development/python-modules/tencentcloud-sdk-python/default.nix b/pkgs/development/python-modules/tencentcloud-sdk-python/default.nix index f99d237b7616..91faac1e6c6d 100644 --- a/pkgs/development/python-modules/tencentcloud-sdk-python/default.nix +++ b/pkgs/development/python-modules/tencentcloud-sdk-python/default.nix @@ -9,14 +9,14 @@ buildPythonPackage rec { pname = "tencentcloud-sdk-python"; - version = "3.1.19"; + version = "3.1.20"; pyproject = true; src = fetchFromGitHub { owner = "TencentCloud"; repo = "tencentcloud-sdk-python"; tag = version; - hash = "sha256-l7XgDcHo1PfsjdpTg71wur1Cy8m9Fuqqv86GeHxmnQ4="; + hash = "sha256-ihuxIw3FUmZDyvIMkjhAgMIkZP+PFji33b21l9LaaI0="; }; build-system = [ setuptools ]; diff --git a/pkgs/servers/home-assistant/custom-lovelace-modules/advanced-camera-card/package.nix b/pkgs/servers/home-assistant/custom-lovelace-modules/advanced-camera-card/package.nix index e4b56561ebbb..7158f8298362 100644 --- a/pkgs/servers/home-assistant/custom-lovelace-modules/advanced-camera-card/package.nix +++ b/pkgs/servers/home-assistant/custom-lovelace-modules/advanced-camera-card/package.nix @@ -6,11 +6,11 @@ stdenv.mkDerivation rec { pname = "advanced-camera-card"; - version = "7.25.4"; + version = "7.26.0"; src = fetchzip { url = "https://github.com/dermotduffy/advanced-camera-card/releases/download/v${version}/advanced-camera-card.zip"; - hash = "sha256-IpuZfHUrIxyDTcQcKv6+xApiXO3eNgwgJ5rZvpCMs3s="; + hash = "sha256-2f+peUfhvreJPZfZt9dOvf0pItWCgzcNfH0iRLsRwGE="; }; # TODO: build from source once yarn berry support lands in nixpkgs