1
0
Fork 0
mirror of https://github.com/NixOS/nixpkgs.git synced 2025-07-05 15:22:36 +03:00

Merge master into staging-next

This commit is contained in:
nixpkgs-ci[bot] 2025-03-14 12:05:44 +00:00 committed by GitHub
commit d77c26326c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
69 changed files with 1957 additions and 1666 deletions

View file

@ -2451,6 +2451,12 @@
githubId = 206242; githubId = 206242;
name = "Andreas Wiese"; name = "Andreas Wiese";
}; };
awwpotato = {
email = "awwpotato@voidq.com";
github = "awwpotato";
githubId = 153149335;
name = "awwpotato";
};
axertheaxe = { axertheaxe = {
email = "axertheaxe@proton.me"; email = "axertheaxe@proton.me";
github = "AxerTheAxe"; github = "AxerTheAxe";

View file

@ -790,12 +790,12 @@ in
++ concatLists ( ++ concatLists (
flip mapAttrsToList (filterPresent cfg.provision.systems.oauth2) ( flip mapAttrsToList (filterPresent cfg.provision.systems.oauth2) (
oauth2: oauth2Cfg: oauth2: oauth2Cfg:
(optionals (cfg.provision.extraJsonFile == null) ( (optional (cfg.provision.extraJsonFile == null) (
assertGroupsKnown "services.kanidm.provision.systems.oauth2.${oauth2}.scopeMaps" ( assertGroupsKnown "services.kanidm.provision.systems.oauth2.${oauth2}.scopeMaps" (
attrNames oauth2Cfg.scopeMaps attrNames oauth2Cfg.scopeMaps
) )
)) ))
++ (optionals (cfg.provision.extraJsonFile == null) ( ++ (optional (cfg.provision.extraJsonFile == null) (
assertGroupsKnown "services.kanidm.provision.systems.oauth2.${oauth2}.supplementaryScopeMaps" ( assertGroupsKnown "services.kanidm.provision.systems.oauth2.${oauth2}.supplementaryScopeMaps" (
attrNames oauth2Cfg.supplementaryScopeMaps attrNames oauth2Cfg.supplementaryScopeMaps
) )

View file

@ -1,58 +1,55 @@
import ./make-test-python.nix ( {
{ ... }: name = "acme-dns";
{
name = "acme-dns";
nodes.machine = nodes.machine =
{ pkgs, ... }: { pkgs, ... }:
{ {
services.acme-dns = { services.acme-dns = {
enable = true; enable = true;
settings = { settings = {
general = rec { general = rec {
domain = "acme-dns.home.arpa"; domain = "acme-dns.home.arpa";
nsname = domain; nsname = domain;
nsadmin = "admin.home.arpa"; nsadmin = "admin.home.arpa";
records = [ records = [
"${domain}. A 127.0.0.1" "${domain}. A 127.0.0.1"
"${domain}. AAAA ::1" "${domain}. AAAA ::1"
"${domain}. NS ${domain}." "${domain}. NS ${domain}."
]; ];
};
logconfig.loglevel = "debug";
}; };
logconfig.loglevel = "debug";
}; };
environment.systemPackages = with pkgs; [
curl
bind
];
}; };
environment.systemPackages = with pkgs; [
curl
bind
];
};
testScript = '' testScript = ''
import json import json
machine.wait_for_unit("acme-dns.service") machine.wait_for_unit("acme-dns.service")
machine.wait_for_open_port(53) # dns machine.wait_for_open_port(53) # dns
machine.wait_for_open_port(8080) # http api machine.wait_for_open_port(8080) # http api
result = machine.succeed("curl --fail -X POST http://localhost:8080/register") result = machine.succeed("curl --fail -X POST http://localhost:8080/register")
print(result) print(result)
registration = json.loads(result) registration = json.loads(result)
machine.succeed(f'dig -t TXT @localhost {registration["fulldomain"]} | grep "SOA" | grep "admin.home.arpa"') machine.succeed(f'dig -t TXT @localhost {registration["fulldomain"]} | grep "SOA" | grep "admin.home.arpa"')
# acme-dns exspects a TXT value string length of exactly 43 chars # acme-dns exspects a TXT value string length of exactly 43 chars
txt = "___dummy_validation_token_for_txt_record___" txt = "___dummy_validation_token_for_txt_record___"
machine.succeed( machine.succeed(
"curl --fail -X POST http://localhost:8080/update " "curl --fail -X POST http://localhost:8080/update "
+ f' -H "X-Api-User: {registration["username"]}"' + f' -H "X-Api-User: {registration["username"]}"'
+ f' -H "X-Api-Key: {registration["password"]}"' + f' -H "X-Api-Key: {registration["password"]}"'
+ f' -d \'{{"subdomain":"{registration["subdomain"]}", "txt":"{txt}"}}\''' + f' -d \'{{"subdomain":"{registration["subdomain"]}", "txt":"{txt}"}}\'''
) )
assert txt in machine.succeed(f'dig -t TXT +short @localhost {registration["fulldomain"]}') assert txt in machine.succeed(f'dig -t TXT +short @localhost {registration["fulldomain"]}')
''; '';
} }
)

View file

@ -1,18 +1,16 @@
import ./make-test-python.nix ( { lib, ... }:
{ lib, ... }: {
{ name = "actual";
name = "actual"; meta.maintainers = [ lib.maintainers.oddlama ];
meta.maintainers = [ lib.maintainers.oddlama ];
nodes.machine = nodes.machine =
{ ... }: { ... }:
{ {
services.actual.enable = true; services.actual.enable = true;
}; };
testScript = '' testScript = ''
machine.wait_for_open_port(3000) machine.wait_for_open_port(3000)
machine.succeed("curl -fvvv -Ls http://localhost:3000/ | grep 'Actual'") machine.succeed("curl -fvvv -Ls http://localhost:3000/ | grep 'Actual'")
''; '';
} }
)

View file

@ -1,49 +1,47 @@
import ./make-test-python.nix ( { pkgs, ... }:
{ pkgs, ... }:
let let
hello-world = pkgs.writeText "hello-world" '' hello-world = pkgs.writeText "hello-world" ''
{-# OPTIONS --guardedness #-} {-# OPTIONS --guardedness #-}
open import IO open import IO
open import Level open import Level
main = run {0} (putStrLn "Hello World!") main = run {0} (putStrLn "Hello World!")
''; '';
in in
{ {
name = "agda"; name = "agda";
meta = with pkgs.lib.maintainers; { meta = with pkgs.lib.maintainers; {
maintainers = [ maintainers = [
alexarice alexarice
turion turion
];
};
nodes.machine =
{ pkgs, ... }:
{
environment.systemPackages = [
(pkgs.agda.withPackages {
pkgs = p: [ p.standard-library ];
})
]; ];
virtualisation.memorySize = 2000; # Agda uses a lot of memory
}; };
nodes.machine = testScript = ''
{ pkgs, ... }: # Minimal script that typechecks
{ machine.succeed("touch TestEmpty.agda")
environment.systemPackages = [ machine.succeed("agda TestEmpty.agda")
(pkgs.agda.withPackages {
pkgs = p: [ p.standard-library ];
})
];
virtualisation.memorySize = 2000; # Agda uses a lot of memory
};
testScript = '' # Hello world
# Minimal script that typechecks machine.succeed(
machine.succeed("touch TestEmpty.agda") "cp ${hello-world} HelloWorld.agda"
machine.succeed("agda TestEmpty.agda") )
machine.succeed("agda -l standard-library -i . -c HelloWorld.agda")
# Hello world # Check execution
machine.succeed( assert "Hello World!" in machine.succeed(
"cp ${hello-world} HelloWorld.agda" "./HelloWorld"
) ), "HelloWorld does not run properly"
machine.succeed("agda -l standard-library -i . -c HelloWorld.agda") '';
# Check execution }
assert "Hello World!" in machine.succeed(
"./HelloWorld"
), "HelloWorld does not run properly"
'';
}
)

View file

@ -1,32 +1,30 @@
import ./make-test-python.nix ( { pkgs, ... }:
{ pkgs, ... }: {
{ name = "airsonic";
name = "airsonic"; meta = with pkgs.lib.maintainers; {
meta = with pkgs.lib.maintainers; { maintainers = [ sumnerevans ];
maintainers = [ sumnerevans ]; };
nodes.machine =
{ pkgs, ... }:
{
services.airsonic = {
enable = true;
maxMemory = 800;
};
}; };
nodes.machine = testScript = ''
{ pkgs, ... }: def airsonic_is_up(_) -> bool:
{ status, _ = machine.execute("curl --fail http://localhost:4040/login")
services.airsonic = { return status == 0
enable = true;
maxMemory = 800;
};
};
testScript = ''
def airsonic_is_up(_) -> bool:
status, _ = machine.execute("curl --fail http://localhost:4040/login")
return status == 0
machine.start() machine.start()
machine.wait_for_unit("airsonic.service") machine.wait_for_unit("airsonic.service")
machine.wait_for_open_port(4040) machine.wait_for_open_port(4040)
with machine.nested("Waiting for UI to work"): with machine.nested("Waiting for UI to work"):
retry(airsonic_is_up) retry(airsonic_is_up)
''; '';
} }
)

View file

@ -1,18 +1,10 @@
# This test does a basic functionality check for alice-lg # This test does a basic functionality check for alice-lg
{ {
system ? builtins.currentSystem, pkgs,
pkgs ? import ../.. { ...
inherit system;
config = { };
},
}: }:
let {
inherit (import ../lib/testing-python.nix { inherit system pkgs; }) makeTest;
inherit (pkgs.lib) optionalString;
in
makeTest {
name = "alice-lg"; name = "alice-lg";
nodes = { nodes = {
host1 = { host1 = {

View file

@ -1,48 +1,46 @@
import ./make-test-python.nix ( { pkgs, ... }:
{ pkgs, ... }: {
rec { name = "all-terminfo";
name = "all-terminfo"; meta = with pkgs.lib.maintainers; {
meta = with pkgs.lib.maintainers; { maintainers = [ jkarlson ];
maintainers = [ jkarlson ]; };
nodes.machine =
{
pkgs,
config,
lib,
...
}:
let
infoFilter =
name: drv:
let
o = builtins.tryEval drv;
in
o.success
&& lib.isDerivation o.value
&& o.value ? outputs
&& builtins.elem "terminfo" o.value.outputs
&& !o.value.meta.broken;
terminfos = lib.filterAttrs infoFilter pkgs;
excludedTerminfos = lib.filterAttrs (
_: drv: !(builtins.elem drv.terminfo config.environment.systemPackages)
) terminfos;
includedOuts = lib.filterAttrs (
_: drv: builtins.elem drv.out config.environment.systemPackages
) terminfos;
in
{
environment = {
enableAllTerminfo = true;
etc."terminfo-missing".text = builtins.concatStringsSep "\n" (builtins.attrNames excludedTerminfos);
etc."terminfo-extra-outs".text = builtins.concatStringsSep "\n" (builtins.attrNames includedOuts);
};
}; };
nodes.machine = testScript = ''
{ machine.fail("grep . /etc/terminfo-missing >&2")
pkgs, machine.fail("grep . /etc/terminfo-extra-outs >&2")
config, '';
lib, }
...
}:
let
infoFilter =
name: drv:
let
o = builtins.tryEval drv;
in
o.success
&& lib.isDerivation o.value
&& o.value ? outputs
&& builtins.elem "terminfo" o.value.outputs
&& !o.value.meta.broken;
terminfos = lib.filterAttrs infoFilter pkgs;
excludedTerminfos = lib.filterAttrs (
_: drv: !(builtins.elem drv.terminfo config.environment.systemPackages)
) terminfos;
includedOuts = lib.filterAttrs (
_: drv: builtins.elem drv.out config.environment.systemPackages
) terminfos;
in
{
environment = {
enableAllTerminfo = true;
etc."terminfo-missing".text = builtins.concatStringsSep "\n" (builtins.attrNames excludedTerminfos);
etc."terminfo-extra-outs".text = builtins.concatStringsSep "\n" (builtins.attrNames includedOuts);
};
};
testScript = ''
machine.fail("grep . /etc/terminfo-missing >&2")
machine.fail("grep . /etc/terminfo-extra-outs >&2")
'';
}
)

View file

@ -147,48 +147,54 @@ in {
_3proxy = runTest ./3proxy.nix; _3proxy = runTest ./3proxy.nix;
aaaaxy = runTest ./aaaaxy.nix; aaaaxy = runTest ./aaaaxy.nix;
acme = import ./acme/default.nix { inherit runTest; }; acme = import ./acme/default.nix { inherit runTest; };
acme-dns = handleTest ./acme-dns.nix {}; acme-dns = runTest ./acme-dns.nix;
actual = handleTest ./actual.nix {}; actual = runTest ./actual.nix;
adguardhome = runTest ./adguardhome.nix; adguardhome = runTest ./adguardhome.nix;
aesmd = runTestOn ["x86_64-linux"] ./aesmd.nix; aesmd = runTestOn ["x86_64-linux"] ./aesmd.nix;
agate = runTest ./web-servers/agate.nix; agate = runTest ./web-servers/agate.nix;
agda = handleTest ./agda.nix {}; agda = runTest ./agda.nix;
age-plugin-tpm-decrypt = runTest ./age-plugin-tpm-decrypt.nix; age-plugin-tpm-decrypt = runTest ./age-plugin-tpm-decrypt.nix;
agorakit = runTest ./web-apps/agorakit.nix; agorakit = runTest ./web-apps/agorakit.nix;
airsonic = handleTest ./airsonic.nix {}; airsonic = runTest ./airsonic.nix;
akkoma = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./akkoma.nix {}; akkoma = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./akkoma.nix {};
akkoma-confined = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./akkoma.nix { confined = true; }; akkoma-confined = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./akkoma.nix { confined = true; };
alice-lg = handleTest ./alice-lg.nix {}; alice-lg = runTest ./alice-lg.nix;
alloy = handleTest ./alloy.nix {}; alloy = runTest ./alloy.nix;
allTerminfo = handleTest ./all-terminfo.nix {}; allTerminfo = runTest ./all-terminfo.nix;
alps = handleTest ./alps.nix {}; alps = runTest ./alps.nix;
amazon-cloudwatch-agent = handleTest ./amazon-cloudwatch-agent.nix {}; amazon-cloudwatch-agent = runTest ./amazon-cloudwatch-agent.nix;
amazon-init-shell = handleTest ./amazon-init-shell.nix {}; amazon-init-shell = runTest ./amazon-init-shell.nix;
amazon-ssm-agent = handleTest ./amazon-ssm-agent.nix {}; amazon-ssm-agent = runTest ./amazon-ssm-agent.nix;
amd-sev = runTest ./amd-sev.nix; amd-sev = runTest ./amd-sev.nix;
angie-api = handleTest ./angie-api.nix {}; angie-api = runTest ./angie-api.nix;
anki-sync-server = handleTest ./anki-sync-server.nix {}; anki-sync-server = runTest ./anki-sync-server.nix;
anuko-time-tracker = handleTest ./anuko-time-tracker.nix {}; anuko-time-tracker = runTest ./anuko-time-tracker.nix;
apcupsd = handleTest ./apcupsd.nix {}; apcupsd = runTest ./apcupsd.nix;
apfs = runTest ./apfs.nix; apfs = runTest ./apfs.nix;
appliance-repart-image = runTest ./appliance-repart-image.nix; appliance-repart-image = runTest ./appliance-repart-image.nix;
appliance-repart-image-verity-store = runTest ./appliance-repart-image-verity-store.nix; appliance-repart-image-verity-store = runTest ./appliance-repart-image-verity-store.nix;
apparmor = handleTest ./apparmor {}; apparmor = runTest ./apparmor;
archi = handleTest ./archi.nix {}; archi = runTest ./archi.nix;
aria2 = handleTest ./aria2.nix {}; aria2 = runTest ./aria2.nix;
armagetronad = handleTest ./armagetronad.nix {}; armagetronad = runTest ./armagetronad.nix;
artalk = runTest ./artalk.nix; artalk = runTest ./artalk.nix;
atd = handleTest ./atd.nix {}; atd = runTest ./atd.nix;
atop = handleTest ./atop.nix {}; atop = handleTest ./atop.nix {};
atticd = runTest ./atticd.nix; atticd = runTest ./atticd.nix;
atuin = runTest ./atuin.nix; atuin = runTest ./atuin.nix;
audiobookshelf = handleTest ./audiobookshelf.nix {}; audiobookshelf = runTest ./audiobookshelf.nix;
auth-mysql = handleTest ./auth-mysql.nix {}; auth-mysql = runTest ./auth-mysql.nix;
authelia = handleTest ./authelia.nix {}; authelia = runTest ./authelia.nix;
auto-cpufreq = handleTest ./auto-cpufreq.nix {}; auto-cpufreq = runTest ./auto-cpufreq.nix;
autobrr = handleTest ./autobrr.nix {}; autobrr = runTest ./autobrr.nix;
avahi = handleTest ./avahi.nix {}; avahi = runTest {
avahi-with-resolved = handleTest ./avahi.nix { networkd = true; }; imports = [ ./avahi.nix ];
_module.args.networkd = false;
};
avahi-with-resolved = runTest {
imports = [ ./avahi.nix ];
_module.args.networkd = true;
};
ayatana-indicators = runTest ./ayatana-indicators.nix; ayatana-indicators = runTest ./ayatana-indicators.nix;
babeld = runTest ./babeld.nix; babeld = runTest ./babeld.nix;
bazarr = handleTest ./bazarr.nix {}; bazarr = handleTest ./bazarr.nix {};

View file

@ -1,37 +1,35 @@
import ./make-test-python.nix ( { lib, ... }:
{ lib, pkgs, ... }:
let let
nodes = { nodes = {
machine = { machine = {
services.alloy = { services.alloy = {
enable = true; enable = true;
};
environment.etc."alloy/config.alloy".text = "";
}; };
environment.etc."alloy/config.alloy".text = "";
}; };
in };
{ in
name = "alloy"; {
name = "alloy";
meta = with lib.maintainers; { meta = with lib.maintainers; {
maintainers = [ maintainers = [
flokli flokli
hbjydev hbjydev
]; ];
}; };
inherit nodes; inherit nodes;
testScript = '' testScript = ''
start_all() start_all()
machine.wait_for_unit("alloy.service") machine.wait_for_unit("alloy.service")
machine.wait_for_open_port(12345) machine.wait_for_open_port(12345)
machine.succeed( machine.succeed(
"curl -sSfN http://127.0.0.1:12345/-/healthy" "curl -sSfN http://127.0.0.1:12345/-/healthy"
) )
machine.shutdown() machine.shutdown()
''; '';
} }
)

View file

@ -2,118 +2,116 @@ let
certs = import ./common/acme/server/snakeoil-certs.nix; certs = import ./common/acme/server/snakeoil-certs.nix;
domain = certs.domain; domain = certs.domain;
in in
import ./make-test-python.nix ( { pkgs, ... }:
{ pkgs, ... }: {
{ name = "alps";
name = "alps"; meta = with pkgs.lib.maintainers; {
meta = with pkgs.lib.maintainers; { maintainers = [ hmenke ];
maintainers = [ hmenke ]; };
nodes = {
server = {
imports = [ ./common/user-account.nix ];
security.pki.certificateFiles = [
certs.ca.cert
];
networking.extraHosts = ''
127.0.0.1 ${domain}
'';
networking.firewall.allowedTCPPorts = [
25
465
993
];
services.postfix = {
enable = true;
enableSubmission = true;
enableSubmissions = true;
tlsTrustedAuthorities = "${certs.ca.cert}";
sslCert = "${certs.${domain}.cert}";
sslKey = "${certs.${domain}.key}";
};
services.dovecot2 = {
enable = true;
enableImap = true;
sslCACert = "${certs.ca.cert}";
sslServerCert = "${certs.${domain}.cert}";
sslServerKey = "${certs.${domain}.key}";
};
}; };
nodes = { client =
server = { { nodes, config, ... }:
imports = [ ./common/user-account.nix ]; {
security.pki.certificateFiles = [ security.pki.certificateFiles = [
certs.ca.cert certs.ca.cert
]; ];
networking.extraHosts = '' networking.extraHosts = ''
127.0.0.1 ${domain} ${nodes.server.config.networking.primaryIPAddress} ${domain}
''; '';
networking.firewall.allowedTCPPorts = [ services.alps = {
25
465
993
];
services.postfix = {
enable = true; enable = true;
enableSubmission = true; theme = "alps";
enableSubmissions = true; imaps = {
tlsTrustedAuthorities = "${certs.ca.cert}"; host = domain;
sslCert = "${certs.${domain}.cert}"; port = 993;
sslKey = "${certs.${domain}.key}"; };
}; smtps = {
services.dovecot2 = { host = domain;
enable = true; port = 465;
enableImap = true;
sslCACert = "${certs.ca.cert}";
sslServerCert = "${certs.${domain}.cert}";
sslServerKey = "${certs.${domain}.key}";
};
};
client =
{ nodes, config, ... }:
{
security.pki.certificateFiles = [
certs.ca.cert
];
networking.extraHosts = ''
${nodes.server.config.networking.primaryIPAddress} ${domain}
'';
services.alps = {
enable = true;
theme = "alps";
imaps = {
host = domain;
port = 993;
};
smtps = {
host = domain;
port = 465;
};
}; };
environment.systemPackages = [
(pkgs.writers.writePython3Bin "test-alps-login" { } ''
from urllib.request import build_opener, HTTPCookieProcessor, Request
from urllib.parse import urlencode, urljoin
from http.cookiejar import CookieJar
baseurl = "http://localhost:${toString config.services.alps.port}"
username = "alice"
password = "${nodes.server.config.users.users.alice.password}"
cookiejar = CookieJar()
cookieprocessor = HTTPCookieProcessor(cookiejar)
opener = build_opener(cookieprocessor)
data = urlencode({"username": username, "password": password}).encode()
req = Request(urljoin(baseurl, "login"), data=data, method="POST")
with opener.open(req) as ret:
# Check that the alps_session cookie is set
print(cookiejar)
assert any(cookie.name == "alps_session" for cookie in cookiejar)
req = Request(baseurl)
with opener.open(req) as ret:
# Check that the alps_session cookie is still there...
print(cookiejar)
assert any(cookie.name == "alps_session" for cookie in cookiejar)
# ...and that we have not been redirected back to the login page
print(ret.url)
assert ret.url == urljoin(baseurl, "mailbox/INBOX")
req = Request(urljoin(baseurl, "logout"))
with opener.open(req) as ret:
# Check that the alps_session cookie is now gone
print(cookiejar)
assert all(cookie.name != "alps_session" for cookie in cookiejar)
'')
];
}; };
}; environment.systemPackages = [
(pkgs.writers.writePython3Bin "test-alps-login" { } ''
from urllib.request import build_opener, HTTPCookieProcessor, Request
from urllib.parse import urlencode, urljoin
from http.cookiejar import CookieJar
testScript = baseurl = "http://localhost:${toString config.services.alps.port}"
{ nodes, ... }: username = "alice"
'' password = "${nodes.server.config.users.users.alice.password}"
server.start() cookiejar = CookieJar()
server.wait_for_unit("postfix.service") cookieprocessor = HTTPCookieProcessor(cookiejar)
server.wait_for_unit("dovecot2.service") opener = build_opener(cookieprocessor)
server.wait_for_open_port(465)
server.wait_for_open_port(993)
client.start() data = urlencode({"username": username, "password": password}).encode()
client.wait_for_unit("alps.service") req = Request(urljoin(baseurl, "login"), data=data, method="POST")
client.wait_for_open_port(${toString nodes.client.config.services.alps.port}) with opener.open(req) as ret:
client.succeed("test-alps-login") # Check that the alps_session cookie is set
''; print(cookiejar)
} assert any(cookie.name == "alps_session" for cookie in cookiejar)
)
req = Request(baseurl)
with opener.open(req) as ret:
# Check that the alps_session cookie is still there...
print(cookiejar)
assert any(cookie.name == "alps_session" for cookie in cookiejar)
# ...and that we have not been redirected back to the login page
print(ret.url)
assert ret.url == urljoin(baseurl, "mailbox/INBOX")
req = Request(urljoin(baseurl, "logout"))
with opener.open(req) as ret:
# Check that the alps_session cookie is now gone
print(cookiejar)
assert all(cookie.name != "alps_session" for cookie in cookiejar)
'')
];
};
};
testScript =
{ nodes, ... }:
''
server.start()
server.wait_for_unit("postfix.service")
server.wait_for_unit("dovecot2.service")
server.wait_for_open_port(465)
server.wait_for_open_port(993)
client.start()
client.wait_for_unit("alps.service")
client.wait_for_open_port(${toString nodes.client.config.services.alps.port})
client.succeed("test-alps-login")
'';
}

View file

@ -1,92 +1,90 @@
import ./make-test-python.nix ( { pkgs, ... }:
{ lib, pkgs, ... }: let
let # See https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html.
# See https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html. iniFormat = pkgs.formats.ini { };
iniFormat = pkgs.formats.ini { };
region = "ap-northeast-1"; region = "ap-northeast-1";
sharedConfigurationDefaultProfile = "default"; sharedConfigurationDefaultProfile = "default";
sharedConfigurationFile = iniFormat.generate "config" { sharedConfigurationFile = iniFormat.generate "config" {
"${sharedConfigurationDefaultProfile}" = { "${sharedConfigurationDefaultProfile}" = {
region = region; region = region;
};
}; };
sharedCredentialsFile = iniFormat.generate "credentials" { };
"${sharedConfigurationDefaultProfile}" = { sharedCredentialsFile = iniFormat.generate "credentials" {
aws_access_key_id = "placeholder"; "${sharedConfigurationDefaultProfile}" = {
aws_secret_access_key = "placeholder"; aws_access_key_id = "placeholder";
aws_session_token = "placeholder"; aws_secret_access_key = "placeholder";
}; aws_session_token = "placeholder";
}; };
sharedConfigurationDirectory = pkgs.runCommand ".aws" { } '' };
mkdir $out sharedConfigurationDirectory = pkgs.runCommand ".aws" { } ''
mkdir $out
cp ${sharedConfigurationFile} $out/config cp ${sharedConfigurationFile} $out/config
cp ${sharedCredentialsFile} $out/credentials cp ${sharedCredentialsFile} $out/credentials
''; '';
in in
{ {
name = "amazon-cloudwatch-agent"; name = "amazon-cloudwatch-agent";
nodes.machine = nodes.machine =
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
services.amazon-cloudwatch-agent = { services.amazon-cloudwatch-agent = {
enable = true; enable = true;
commonConfiguration = { commonConfiguration = {
credentials = { credentials = {
shared_credential_profile = sharedConfigurationDefaultProfile; shared_credential_profile = sharedConfigurationDefaultProfile;
shared_credential_file = "${sharedConfigurationDirectory}/credentials"; shared_credential_file = "${sharedConfigurationDirectory}/credentials";
};
}; };
configuration = {
agent = {
# Required despite documentation saying the agent ignores it in "onPremise" mode.
region = region;
# Show debug logs and write to a file for interactive debugging.
debug = true;
logfile = "/var/log/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log";
};
logs = {
logs_collected = {
files = {
collect_list = [
{
file_path = "/var/log/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log";
log_group_name = "/var/log/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log";
log_stream_name = "{local_hostname}";
}
];
};
};
};
traces = {
local_mode = true;
traces_collected = {
xray = { };
};
};
};
mode = "onPremise";
}; };
configuration = {
agent = {
# Required despite documentation saying the agent ignores it in "onPremise" mode.
region = region;
# Keep the runtime directory for interactive debugging. # Show debug logs and write to a file for interactive debugging.
systemd.services.amazon-cloudwatch-agent.serviceConfig.RuntimeDirectoryPreserve = true; debug = true;
logfile = "/var/log/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log";
};
logs = {
logs_collected = {
files = {
collect_list = [
{
file_path = "/var/log/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log";
log_group_name = "/var/log/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log";
log_stream_name = "{local_hostname}";
}
];
};
};
};
traces = {
local_mode = true;
traces_collected = {
xray = { };
};
};
};
mode = "onPremise";
}; };
testScript = '' # Keep the runtime directory for interactive debugging.
start_all() systemd.services.amazon-cloudwatch-agent.serviceConfig.RuntimeDirectoryPreserve = true;
};
machine.wait_for_unit("amazon-cloudwatch-agent.service") testScript = ''
start_all()
machine.wait_for_file("/run/amazon-cloudwatch-agent/amazon-cloudwatch-agent.pid") machine.wait_for_unit("amazon-cloudwatch-agent.service")
machine.wait_for_file("/run/amazon-cloudwatch-agent/amazon-cloudwatch-agent.toml")
# "config-translator" omits this file if no trace configurations are specified. machine.wait_for_file("/run/amazon-cloudwatch-agent/amazon-cloudwatch-agent.pid")
# machine.wait_for_file("/run/amazon-cloudwatch-agent/amazon-cloudwatch-agent.toml")
# See https://github.com/aws/amazon-cloudwatch-agent/issues/1320. # "config-translator" omits this file if no trace configurations are specified.
machine.wait_for_file("/run/amazon-cloudwatch-agent/amazon-cloudwatch-agent.yaml") #
machine.wait_for_file("/run/amazon-cloudwatch-agent/env-config.json") # See https://github.com/aws/amazon-cloudwatch-agent/issues/1320.
''; machine.wait_for_file("/run/amazon-cloudwatch-agent/amazon-cloudwatch-agent.yaml")
} machine.wait_for_file("/run/amazon-cloudwatch-agent/env-config.json")
) '';
}

View file

@ -6,41 +6,35 @@
# configuration expression. # configuration expression.
{ {
system ? builtins.currentSystem, lib,
config ? { }, ...
pkgs ? import ../.. { inherit system config; },
}: }:
with import ../lib/testing-python.nix { inherit system pkgs; }; {
with pkgs.lib;
makeTest {
name = "amazon-init"; name = "amazon-init";
meta = with maintainers; { meta = with lib.maintainers; {
maintainers = [ urbas ]; maintainers = [ urbas ];
}; };
nodes.machine = nodes.machine = {
{ lib, pkgs, ... }: imports = [
{ ../modules/profiles/headless.nix
imports = [ ../modules/virtualisation/amazon-init.nix
../modules/profiles/headless.nix ];
../modules/virtualisation/amazon-init.nix services.openssh.enable = true;
]; system.switch.enable = true;
services.openssh.enable = true; networking.hostName = "";
system.switch.enable = true; environment.etc."ec2-metadata/user-data" = {
networking.hostName = ""; text = ''
environment.etc."ec2-metadata/user-data" = { #!/usr/bin/bash
text = ''
#!/usr/bin/bash
echo successful > /tmp/evidence echo successful > /tmp/evidence
# Emulate running nixos-rebuild switch, just without any building. # Emulate running nixos-rebuild switch, just without any building.
# https://github.com/nixos/nixpkgs/blob/4c62505847d88f16df11eff3c81bf9a453a4979e/nixos/modules/virtualisation/amazon-init.nix#L55 # https://github.com/nixos/nixpkgs/blob/4c62505847d88f16df11eff3c81bf9a453a4979e/nixos/modules/virtualisation/amazon-init.nix#L55
/run/current-system/bin/switch-to-configuration test /run/current-system/bin/switch-to-configuration test
''; '';
};
}; };
};
testScript = '' testScript = ''
# To wait until amazon-init terminates its run # To wait until amazon-init terminates its run
unnamed.wait_for_unit("amazon-init.service") unnamed.wait_for_unit("amazon-init.service")

View file

@ -1,22 +1,18 @@
import ./make-test-python.nix ( { lib, ... }:
{ lib, pkgs, ... }: {
{ name = "amazon-ssm-agent";
name = "amazon-ssm-agent"; meta.maintainers = [ lib.maintainers.anthonyroussel ];
meta.maintainers = [ lib.maintainers.anthonyroussel ];
nodes.machine = nodes.machine = {
{ config, pkgs, ... }: services.amazon-ssm-agent.enable = true;
{ };
services.amazon-ssm-agent.enable = true;
};
testScript = '' testScript = ''
start_all() start_all()
machine.wait_for_file("/etc/amazon/ssm/seelog.xml") machine.wait_for_file("/etc/amazon/ssm/seelog.xml")
machine.wait_for_file("/etc/amazon/ssm/amazon-ssm-agent.json") machine.wait_for_file("/etc/amazon/ssm/amazon-ssm-agent.json")
machine.wait_for_unit("amazon-ssm-agent.service") machine.wait_for_unit("amazon-ssm-agent.service")
''; '';
} }
)

View file

@ -1,170 +1,168 @@
import ./make-test-python.nix ( { lib, pkgs, ... }:
{ lib, pkgs, ... }: let
let hosts = ''
hosts = '' 192.168.2.101 example.com
192.168.2.101 example.com 192.168.2.101 api.example.com
192.168.2.101 api.example.com 192.168.2.101 backend.example.com
192.168.2.101 backend.example.com '';
'';
in in
{ {
name = "angie-api"; name = "angie-api";
meta.maintainers = with pkgs.lib.maintainers; [ izorkin ]; meta.maintainers = with pkgs.lib.maintainers; [ izorkin ];
nodes = { nodes = {
server = server =
{ pkgs, ... }: { pkgs, ... }:
{ {
networking = { networking = {
interfaces.eth1 = { interfaces.eth1 = {
ipv4.addresses = [ ipv4.addresses = [
{ {
address = "192.168.2.101"; address = "192.168.2.101";
prefixLength = 24; prefixLength = 24;
} }
]; ];
};
extraHosts = hosts;
firewall.allowedTCPPorts = [ 80 ];
};
services.nginx = {
enable = true;
package = pkgs.angie;
upstreams = {
"backend-http" = {
servers = {
"backend.example.com:8080" = {
fail_timeout = "0";
};
};
extraConfig = ''
zone upstream 256k;
'';
};
"backend-socket" = {
servers = {
"unix:/run/example.sock" = {
fail_timeout = "0";
};
};
extraConfig = ''
zone upstream 256k;
'';
}; };
extraHosts = hosts;
firewall.allowedTCPPorts = [ 80 ];
}; };
services.nginx = { virtualHosts."api.example.com" = {
enable = true; locations."/console/" = {
package = pkgs.angie; extraConfig = ''
api /status/;
upstreams = { allow 192.168.2.201;
"backend-http" = { deny all;
servers = { '';
"backend.example.com:8080" = {
fail_timeout = "0";
};
};
extraConfig = ''
zone upstream 256k;
'';
};
"backend-socket" = {
servers = {
"unix:/run/example.sock" = {
fail_timeout = "0";
};
};
extraConfig = ''
zone upstream 256k;
'';
};
}; };
};
virtualHosts."api.example.com" = { virtualHosts."example.com" = {
locations."/console/" = { locations."/test/" = {
extraConfig = '' root = lib.mkForce (
api /status/; pkgs.runCommandLocal "testdir" { } ''
mkdir -p "$out/test"
cat > "$out/test/index.html" <<EOF
<html><body>Hello World!</body></html>
EOF
''
);
extraConfig = ''
status_zone test_zone;
allow 192.168.2.201; allow 192.168.2.201;
deny all; deny all;
''; '';
};
}; };
locations."/test/locked/" = {
extraConfig = ''
status_zone test_zone;
virtualHosts."example.com" = { deny all;
locations."/test/" = { '';
root = lib.mkForce ( };
pkgs.runCommandLocal "testdir" { } '' locations."/test/error/" = {
mkdir -p "$out/test" extraConfig = ''
cat > "$out/test/index.html" <<EOF status_zone test_zone;
<html><body>Hello World!</body></html>
EOF
''
);
extraConfig = ''
status_zone test_zone;
allow 192.168.2.201; allow all;
deny all; '';
''; };
}; locations."/upstream-http/" = {
locations."/test/locked/" = { proxyPass = "http://backend-http";
extraConfig = '' };
status_zone test_zone; locations."/upstream-socket/" = {
proxyPass = "http://backend-socket";
deny all;
'';
};
locations."/test/error/" = {
extraConfig = ''
status_zone test_zone;
allow all;
'';
};
locations."/upstream-http/" = {
proxyPass = "http://backend-http";
};
locations."/upstream-socket/" = {
proxyPass = "http://backend-socket";
};
}; };
}; };
}; };
};
client = client =
{ pkgs, ... }: { pkgs, ... }:
{ {
environment.systemPackages = [ pkgs.jq ]; environment.systemPackages = [ pkgs.jq ];
networking = { networking = {
interfaces.eth1 = { interfaces.eth1 = {
ipv4.addresses = [ ipv4.addresses = [
{ {
address = "192.168.2.201"; address = "192.168.2.201";
prefixLength = 24; prefixLength = 24;
} }
]; ];
};
extraHosts = hosts;
}; };
extraHosts = hosts;
}; };
}; };
};
testScript = '' testScript = ''
start_all() start_all()
server.wait_for_unit("nginx") server.wait_for_unit("nginx")
server.wait_for_open_port(80) server.wait_for_open_port(80)
# Check Angie version # Check Angie version
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.angie.version' | grep '${pkgs.angie.version}'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.angie.version' | grep '${pkgs.angie.version}'")
# Check access # Check access
client.succeed("curl --verbose --head http://api.example.com/console/ | grep 'HTTP/1.1 200'") client.succeed("curl --verbose --head http://api.example.com/console/ | grep 'HTTP/1.1 200'")
server.succeed("curl --verbose --head http://api.example.com/console/ | grep 'HTTP/1.1 403 Forbidden'") server.succeed("curl --verbose --head http://api.example.com/console/ | grep 'HTTP/1.1 403 Forbidden'")
# Check responses and requests # Check responses and requests
client.succeed("curl --verbose http://example.com/test/") client.succeed("curl --verbose http://example.com/test/")
client.succeed("curl --verbose http://example.com/test/locked/") client.succeed("curl --verbose http://example.com/test/locked/")
client.succeed("curl --verbose http://example.com/test/locked/") client.succeed("curl --verbose http://example.com/test/locked/")
client.succeed("curl --verbose http://example.com/test/error/") client.succeed("curl --verbose http://example.com/test/error/")
client.succeed("curl --verbose http://example.com/test/error/") client.succeed("curl --verbose http://example.com/test/error/")
client.succeed("curl --verbose http://example.com/test/error/") client.succeed("curl --verbose http://example.com/test/error/")
server.succeed("curl --verbose http://example.com/test/") server.succeed("curl --verbose http://example.com/test/")
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.location_zones.test_zone.responses.\"200\"' | grep '1'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.location_zones.test_zone.responses.\"200\"' | grep '1'")
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.location_zones.test_zone.responses.\"403\"' | grep '3'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.location_zones.test_zone.responses.\"403\"' | grep '3'")
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.location_zones.test_zone.responses.\"404\"' | grep '3'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.location_zones.test_zone.responses.\"404\"' | grep '3'")
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.location_zones.test_zone.requests.total' | grep '7'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.location_zones.test_zone.requests.total' | grep '7'")
# Check upstreams # Check upstreams
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-http\".peers.\"192.168.2.101:8080\".state' | grep 'up'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-http\".peers.\"192.168.2.101:8080\".state' | grep 'up'")
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-http\".peers.\"192.168.2.101:8080\".health.fails' | grep '0'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-http\".peers.\"192.168.2.101:8080\".health.fails' | grep '0'")
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-socket\".peers.\"unix:/run/example.sock\".state' | grep 'up'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-socket\".peers.\"unix:/run/example.sock\".state' | grep 'up'")
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-socket\".peers.\"unix:/run/example.sock\".health.fails' | grep '0'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-socket\".peers.\"unix:/run/example.sock\".health.fails' | grep '0'")
client.succeed("curl --verbose http://example.com/upstream-http/") client.succeed("curl --verbose http://example.com/upstream-http/")
client.succeed("curl --verbose http://example.com/upstream-socket/") client.succeed("curl --verbose http://example.com/upstream-socket/")
client.succeed("curl --verbose http://example.com/upstream-socket/") client.succeed("curl --verbose http://example.com/upstream-socket/")
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-http\".peers.\"192.168.2.101:8080\".health.fails' | grep '1'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-http\".peers.\"192.168.2.101:8080\".health.fails' | grep '1'")
client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-socket\".peers.\"unix:/run/example.sock\".health.fails' | grep '2'") client.succeed("curl --verbose http://api.example.com/console/ | jq -e '.http.upstreams.\"backend-socket\".peers.\"unix:/run/example.sock\".health.fails' | grep '2'")
server.shutdown() server.shutdown()
client.shutdown() client.shutdown()
''; '';
} }
)

View file

@ -1,75 +1,71 @@
import ./make-test-python.nix ( { pkgs, ... }:
{ pkgs, ... }: let
let ankiSyncTest = pkgs.writeScript "anki-sync-test.py" ''
ankiSyncTest = pkgs.writeScript "anki-sync-test.py" '' #!${pkgs.python3}/bin/python
#!${pkgs.python3}/bin/python
import sys import sys
# get site paths from anki itself # get site paths from anki itself
from runpy import run_path from runpy import run_path
run_path("${pkgs.anki}/bin/.anki-wrapped") run_path("${pkgs.anki}/bin/.anki-wrapped")
import anki import anki
col = anki.collection.Collection('test_collection') col = anki.collection.Collection('test_collection')
endpoint = 'http://localhost:27701' endpoint = 'http://localhost:27701'
# Sanity check: verify bad login fails # Sanity check: verify bad login fails
try: try:
col.sync_login('baduser', 'badpass', endpoint) col.sync_login('baduser', 'badpass', endpoint)
print("bad user login worked?!") print("bad user login worked?!")
sys.exit(1) sys.exit(1)
except anki.errors.SyncError: except anki.errors.SyncError:
pass pass
# test logging in to users # test logging in to users
col.sync_login('user', 'password', endpoint) col.sync_login('user', 'password', endpoint)
col.sync_login('passfileuser', 'passfilepassword', endpoint) col.sync_login('passfileuser', 'passfilepassword', endpoint)
# Test actual sync. login apparently doesn't remember the endpoint... # Test actual sync. login apparently doesn't remember the endpoint...
login = col.sync_login('user', 'password', endpoint) login = col.sync_login('user', 'password', endpoint)
login.endpoint = endpoint login.endpoint = endpoint
sync = col.sync_collection(login, False) sync = col.sync_collection(login, False)
assert sync.required == sync.NO_CHANGES assert sync.required == sync.NO_CHANGES
# TODO: create an archive with server content including a test card # TODO: create an archive with server content including a test card
# and check we got it? # and check we got it?
''; '';
testPasswordFile = pkgs.writeText "anki-password" "passfilepassword"; testPasswordFile = pkgs.writeText "anki-password" "passfilepassword";
in in
{ {
name = "anki-sync-server"; name = "anki-sync-server";
meta = with pkgs.lib.maintainers; { meta = with pkgs.lib.maintainers; {
maintainers = [ martinetd ]; maintainers = [ martinetd ];
};
nodes.machine = {
services.anki-sync-server = {
enable = true;
users = [
{
username = "user";
password = "password";
}
{
username = "passfileuser";
passwordFile = testPasswordFile;
}
];
}; };
};
nodes.machine = testScript = ''
{ pkgs, ... }: start_all()
{
services.anki-sync-server = {
enable = true;
users = [
{
username = "user";
password = "password";
}
{
username = "passfileuser";
passwordFile = testPasswordFile;
}
];
};
};
testScript = '' with subtest("Server starts successfully"):
start_all() # service won't start without users
machine.wait_for_unit("anki-sync-server.service")
machine.wait_for_open_port(27701)
with subtest("Server starts successfully"): with subtest("Can sync"):
# service won't start without users machine.succeed("${ankiSyncTest}")
machine.wait_for_unit("anki-sync-server.service") '';
machine.wait_for_open_port(27701) }
with subtest("Can sync"):
machine.succeed("${ankiSyncTest}")
'';
}
)

View file

@ -1,20 +1,18 @@
import ./make-test-python.nix ( { pkgs, ... }:
{ pkgs, ... }: {
{ name = "anuko-time-tracker";
name = "anuko-time-tracker"; meta = {
meta = { maintainers = with pkgs.lib.maintainers; [ michaelshmitty ];
maintainers = with pkgs.lib.maintainers; [ michaelshmitty ]; };
nodes = {
machine = {
services.anuko-time-tracker.enable = true;
}; };
nodes = { };
machine = { testScript = ''
services.anuko-time-tracker.enable = true; start_all()
}; machine.wait_for_unit("phpfpm-anuko-time-tracker")
}; machine.wait_for_open_port(80);
testScript = '' machine.wait_until_succeeds("curl -s --fail -L http://localhost/time.php | grep 'Anuko Time Tracker'")
start_all() '';
machine.wait_for_unit("phpfpm-anuko-time-tracker") }
machine.wait_for_open_port(80);
machine.wait_until_succeeds("curl -s --fail -L http://localhost/time.php | grep 'Anuko Time Tracker'")
'';
}
)

View file

@ -2,45 +2,43 @@ let
# arbitrary address # arbitrary address
ipAddr = "192.168.42.42"; ipAddr = "192.168.42.42";
in in
import ./make-test-python.nix ( { lib, ... }:
{ lib, pkgs, ... }: {
{ name = "apcupsd";
name = "apcupsd"; meta.maintainers = with lib.maintainers; [ bjornfor ];
meta.maintainers = with lib.maintainers; [ bjornfor ];
nodes = { nodes = {
machine = { machine = {
services.apcupsd = { services.apcupsd = {
enable = true; enable = true;
configText = '' configText = ''
UPSTYPE usb UPSTYPE usb
BATTERYLEVEL 42 BATTERYLEVEL 42
# Configure NISIP so that the only way apcaccess can work is to read # Configure NISIP so that the only way apcaccess can work is to read
# this config. # this config.
NISIP ${ipAddr} NISIP ${ipAddr}
''; '';
}; };
networking.interfaces.eth1 = { networking.interfaces.eth1 = {
ipv4.addresses = [ ipv4.addresses = [
{ {
address = ipAddr; address = ipAddr;
prefixLength = 24; prefixLength = 24;
} }
]; ];
};
}; };
}; };
};
# Check that the service starts, that the CLI (apcaccess) works and that it # Check that the service starts, that the CLI (apcaccess) works and that it
# uses the config (ipAddr) defined in the service config. # uses the config (ipAddr) defined in the service config.
testScript = '' testScript = ''
start_all() start_all()
machine.wait_for_unit("apcupsd.service") machine.wait_for_unit("apcupsd.service")
machine.wait_for_open_port(3551, "${ipAddr}") machine.wait_for_open_port(3551, "${ipAddr}")
res = machine.succeed("apcaccess") res = machine.succeed("apcaccess")
expect_line="MBATTCHG : 42 Percent" expect_line="MBATTCHG : 42 Percent"
assert "MBATTCHG : 42 Percent" in res, f"expected apcaccess output to contain '{expect_line}' but got '{res}'" assert "MBATTCHG : 42 Percent" in res, f"expected apcaccess output to contain '{expect_line}' but got '{res}'"
machine.shutdown() machine.shutdown()
''; '';
} }
)

View file

@ -1,130 +1,126 @@
import ../make-test-python.nix ( { pkgs, lib, ... }:
{ pkgs, lib, ... }: let
let helloProfileContents = ''
helloProfileContents = '' abi <abi/4.0>,
abi <abi/4.0>, include <tunables/global>
include <tunables/global> profile hello ${lib.getExe pkgs.hello} {
profile hello ${lib.getExe pkgs.hello} { include <abstractions/base>
include <abstractions/base> }
} '';
''; in
in {
{ name = "apparmor";
name = "apparmor"; meta.maintainers = with lib.maintainers; [
meta.maintainers = with lib.maintainers; [ julm
julm grimmauld
grimmauld ];
];
nodes.machine = nodes.machine =
{ {
lib, lib,
pkgs, ...
config, }:
... {
}: security.apparmor = {
{ enable = lib.mkDefault true;
security.apparmor = {
enable = lib.mkDefault true;
policies.hello = { policies.hello = {
# test profile enforce and content definition # test profile enforce and content definition
state = "enforce"; state = "enforce";
profile = helloProfileContents; profile = helloProfileContents;
}; };
policies.sl = { policies.sl = {
# test profile complain and path definition # test profile complain and path definition
state = "complain"; state = "complain";
path = ./sl_profile; path = ./sl_profile;
}; };
policies.hexdump = { policies.hexdump = {
# test profile complain and path definition # test profile complain and path definition
state = "enforce"; state = "enforce";
profile = '' profile = ''
abi <abi/4.0>, abi <abi/4.0>,
include <tunables/global> include <tunables/global>
profile hexdump /nix/store/*/bin/hexdump { profile hexdump /nix/store/*/bin/hexdump {
include <abstractions/base> include <abstractions/base>
deny /tmp/** r, deny /tmp/** r,
} }
'';
};
includes."abstractions/base" = ''
/nix/store/*/bin/** mr,
/nix/store/*/lib/** mr,
/nix/store/** r,
''; '';
}; };
includes."abstractions/base" = ''
/nix/store/*/bin/** mr,
/nix/store/*/lib/** mr,
/nix/store/** r,
'';
}; };
};
testScript = testScript =
let let
inherit (lib) getExe getExe'; inherit (lib) getExe getExe';
in in
'' ''
machine.wait_for_unit("multi-user.target") machine.wait_for_unit("multi-user.target")
with subtest("AppArmor profiles are loaded"): with subtest("AppArmor profiles are loaded"):
machine.succeed("systemctl status apparmor.service") machine.succeed("systemctl status apparmor.service")
# AppArmor securityfs # AppArmor securityfs
with subtest("AppArmor securityfs is mounted"): with subtest("AppArmor securityfs is mounted"):
machine.succeed("mountpoint -q /sys/kernel/security") machine.succeed("mountpoint -q /sys/kernel/security")
machine.succeed("cat /sys/kernel/security/apparmor/profiles") machine.succeed("cat /sys/kernel/security/apparmor/profiles")
# Test apparmorRulesFromClosure by: # Test apparmorRulesFromClosure by:
# 1. Prepending a string of the relevant packages' name and version on each line. # 1. Prepending a string of the relevant packages' name and version on each line.
# 2. Sorting according to those strings. # 2. Sorting according to those strings.
# 3. Removing those prepended strings. # 3. Removing those prepended strings.
# 4. Using `diff` against the expected output. # 4. Using `diff` against the expected output.
with subtest("apparmorRulesFromClosure"): with subtest("apparmorRulesFromClosure"):
machine.succeed( machine.succeed(
"${getExe' pkgs.diffutils "diff"} -u ${ "${getExe' pkgs.diffutils "diff"} -u ${
pkgs.writeText "expected.rules" (import ./makeExpectedPolicies.nix { inherit pkgs; }) pkgs.writeText "expected.rules" (import ./makeExpectedPolicies.nix { inherit pkgs; })
} ${ } ${
pkgs.runCommand "actual.rules" { preferLocalBuild = true; } '' pkgs.runCommand "actual.rules" { preferLocalBuild = true; } ''
${getExe pkgs.gnused} -e 's:^[^ ]* ${builtins.storeDir}/[^,/-]*-\([^/,]*\):\1 \0:' ${ ${getExe pkgs.gnused} -e 's:^[^ ]* ${builtins.storeDir}/[^,/-]*-\([^/,]*\):\1 \0:' ${
pkgs.apparmorRulesFromClosure { pkgs.apparmorRulesFromClosure {
name = "ping"; name = "ping";
additionalRules = [ "x $path/foo/**" ]; additionalRules = [ "x $path/foo/**" ];
} [ pkgs.libcap ] } [ pkgs.libcap ]
} | } |
${getExe' pkgs.coreutils "sort"} -n -k1 | ${getExe' pkgs.coreutils "sort"} -n -k1 |
${getExe pkgs.gnused} -e 's:^[^ ]* ::' >$out ${getExe pkgs.gnused} -e 's:^[^ ]* ::' >$out
'' ''
}" }"
) )
# Test apparmor profile states by using `diff` against `aa-status` # Test apparmor profile states by using `diff` against `aa-status`
with subtest("apparmorProfileStates"): with subtest("apparmorProfileStates"):
machine.succeed("${getExe' pkgs.diffutils "diff"} -u \ machine.succeed("${getExe' pkgs.diffutils "diff"} -u \
<(${getExe' pkgs.apparmor-bin-utils "aa-status"} --json | ${getExe pkgs.jq} --sort-keys . ) \ <(${getExe' pkgs.apparmor-bin-utils "aa-status"} --json | ${getExe pkgs.jq} --sort-keys . ) \
<(${getExe pkgs.jq} --sort-keys . ${ <(${getExe pkgs.jq} --sort-keys . ${
pkgs.writers.writeJSON "expectedStates.json" { pkgs.writers.writeJSON "expectedStates.json" {
version = "2"; version = "2";
processes = { }; processes = { };
profiles = { profiles = {
hexdump = "enforce"; hexdump = "enforce";
hello = "enforce"; hello = "enforce";
sl = "complain"; sl = "complain";
}; };
} }
})") })")
# Test apparmor profile files in /etc/apparmor.d/<name> to be either a correct symlink (sl) or have the right file contents (hello) # Test apparmor profile files in /etc/apparmor.d/<name> to be either a correct symlink (sl) or have the right file contents (hello)
with subtest("apparmorProfileTargets"): with subtest("apparmorProfileTargets"):
machine.succeed("${getExe' pkgs.diffutils "diff"} -u <(${getExe pkgs.file} /etc/static/apparmor.d/sl) ${pkgs.writeText "expected.link" '' machine.succeed("${getExe' pkgs.diffutils "diff"} -u <(${getExe pkgs.file} /etc/static/apparmor.d/sl) ${pkgs.writeText "expected.link" ''
/etc/static/apparmor.d/sl: symbolic link to ${./sl_profile} /etc/static/apparmor.d/sl: symbolic link to ${./sl_profile}
''}") ''}")
machine.succeed("${getExe' pkgs.diffutils "diff"} -u /etc/static/apparmor.d/hello ${pkgs.writeText "expected.content" helloProfileContents}") machine.succeed("${getExe' pkgs.diffutils "diff"} -u /etc/static/apparmor.d/hello ${pkgs.writeText "expected.content" helloProfileContents}")
with subtest("apparmorProfileEnforce"): with subtest("apparmorProfileEnforce"):
machine.succeed("${getExe pkgs.hello} 1> /tmp/test-file") machine.succeed("${getExe pkgs.hello} 1> /tmp/test-file")
machine.fail("${lib.getExe' pkgs.util-linux "hexdump"} /tmp/test-file") # no access to /tmp/test-file granted by apparmor machine.fail("${lib.getExe' pkgs.util-linux "hexdump"} /tmp/test-file") # no access to /tmp/test-file granted by apparmor
''; '';
} }
)

View file

@ -1,38 +1,36 @@
import ./make-test-python.nix ( { lib, ... }:
{ lib, ... }: {
{ name = "archi";
name = "archi"; meta.maintainers = with lib.maintainers; [ paumr ];
meta.maintainers = with lib.maintainers; [ paumr ];
nodes.machine = nodes.machine =
{ pkgs, ... }: { pkgs, ... }:
{ {
imports = [ imports = [
./common/x11.nix ./common/x11.nix
]; ];
environment.systemPackages = with pkgs; [ archi ]; environment.systemPackages = with pkgs; [ archi ];
}; };
enableOCR = true; enableOCR = true;
testScript = '' testScript = ''
machine.wait_for_x() machine.wait_for_x()
with subtest("createEmptyModel via CLI"): with subtest("createEmptyModel via CLI"):
machine.succeed("Archi -application com.archimatetool.commandline.app -consoleLog -nosplash --createEmptyModel --saveModel smoke.archimate") machine.succeed("Archi -application com.archimatetool.commandline.app -consoleLog -nosplash --createEmptyModel --saveModel smoke.archimate")
machine.copy_from_vm("smoke.archimate", "") machine.copy_from_vm("smoke.archimate", "")
with subtest("UI smoketest"): with subtest("UI smoketest"):
machine.succeed("DISPLAY=:0 Archi --createEmptyModel >&2 &") machine.succeed("DISPLAY=:0 Archi --createEmptyModel >&2 &")
machine.wait_for_window("Archi") machine.wait_for_window("Archi")
# wait till main UI is open # wait till main UI is open
# since OCR seems to be buggy wait_for_text was replaced by sleep, issue: #302965 # since OCR seems to be buggy wait_for_text was replaced by sleep, issue: #302965
# machine.wait_for_text("Welcome to Archi") # machine.wait_for_text("Welcome to Archi")
machine.sleep(20) machine.sleep(20)
machine.screenshot("welcome-screen") machine.screenshot("welcome-screen")
''; '';
} }
)

View file

@ -1,54 +1,52 @@
import ./make-test-python.nix ( { pkgs, ... }:
{ pkgs, ... }: let
let rpcSecret = "supersecret";
rpcSecret = "supersecret"; rpc-listen-port = 6800;
rpc-listen-port = 6800; curlBody = {
curlBody = { jsonrpc = 2.0;
jsonrpc = 2.0; id = 1;
id = 1; method = "aria2.getVersion";
method = "aria2.getVersion"; params = [ "token:${rpcSecret}" ];
params = [ "token:${rpcSecret}" ]; };
}; in
in {
rec { name = "aria2";
name = "aria2";
nodes.machine = { nodes.machine = {
environment.etc."aria2Rpc".text = rpcSecret; environment.etc."aria2Rpc".text = rpcSecret;
services.aria2 = { services.aria2 = {
enable = true; enable = true;
rpcSecretFile = "/etc/aria2Rpc"; rpcSecretFile = "/etc/aria2Rpc";
settings = { settings = {
inherit rpc-listen-port; inherit rpc-listen-port;
allow-overwrite = false; allow-overwrite = false;
check-integrity = true; check-integrity = true;
console-log-level = "warn"; console-log-level = "warn";
listen-port = [ listen-port = [
{ {
from = 20000; from = 20000;
to = 20010; to = 20010;
} }
{ {
from = 22222; from = 22222;
to = 22222; to = 22222;
} }
]; ];
max-concurrent-downloads = 50; max-concurrent-downloads = 50;
seed-ratio = 1.2; seed-ratio = 1.2;
summary-interval = 0; summary-interval = 0;
};
}; };
}; };
};
testScript = '' testScript = ''
machine.start() machine.start()
machine.wait_for_unit("aria2.service") machine.wait_for_unit("aria2.service")
curl_cmd = 'curl --fail-with-body -X POST -H "Content-Type: application/json" \ curl_cmd = 'curl --fail-with-body -X POST -H "Content-Type: application/json" \
-d \'${builtins.toJSON curlBody}\' http://localhost:${toString rpc-listen-port}/jsonrpc' -d \'${builtins.toJSON curlBody}\' http://localhost:${toString rpc-listen-port}/jsonrpc'
print(machine.wait_until_succeeds(curl_cmd, timeout=10)) print(machine.wait_until_succeeds(curl_cmd, timeout=10))
machine.shutdown() machine.shutdown()
''; '';
meta.maintainers = [ pkgs.lib.maintainers.timhae ]; meta.maintainers = [ pkgs.lib.maintainers.timhae ];
} }
)

View file

@ -1,11 +1,8 @@
{ {
system ? builtins.currentSystem, lib,
config ? { }, pkgs,
pkgs ? import ../.. { inherit system config; }, ...
}: }:
with import ../lib/testing-python.nix { inherit system pkgs; };
let let
user = "alice"; user = "alice";
@ -27,9 +24,9 @@ let
}; };
in in
makeTest { {
name = "armagetronad"; name = "armagetronad";
meta = with pkgs.lib.maintainers; { meta = with lib.maintainers; {
maintainers = [ numinit ]; maintainers = [ numinit ];
}; };

View file

@ -1,36 +1,34 @@
import ./make-test-python.nix ( { pkgs, ... }:
{ pkgs, ... }:
{ {
name = "atd"; name = "atd";
meta = with pkgs.lib.maintainers; { meta = with pkgs.lib.maintainers; {
maintainers = [ bjornfor ]; maintainers = [ bjornfor ];
};
nodes.machine =
{ ... }:
{
services.atd.enable = true;
users.users.alice = {
isNormalUser = true;
};
}; };
nodes.machine = # "at" has a resolution of 1 minute
{ ... }: testScript = ''
{ start_all()
services.atd.enable = true;
users.users.alice = {
isNormalUser = true;
};
};
# "at" has a resolution of 1 minute machine.wait_for_unit("atd.service") # wait for atd to start
testScript = '' machine.fail("test -f ~root/at-1")
start_all() machine.fail("test -f ~alice/at-1")
machine.wait_for_unit("atd.service") # wait for atd to start machine.succeed("echo 'touch ~root/at-1' | at now+1min")
machine.fail("test -f ~root/at-1") machine.succeed("su - alice -c \"echo 'touch at-1' | at now+1min\"")
machine.fail("test -f ~alice/at-1")
machine.succeed("echo 'touch ~root/at-1' | at now+1min") machine.succeed("sleep 1.5m")
machine.succeed("su - alice -c \"echo 'touch at-1' | at now+1min\"")
machine.succeed("sleep 1.5m") machine.succeed("test -f ~root/at-1")
machine.succeed("test -f ~alice/at-1")
machine.succeed("test -f ~root/at-1") '';
machine.succeed("test -f ~alice/at-1") }
'';
}
)

View file

@ -1,22 +1,20 @@
import ./make-test-python.nix ( { lib, ... }:
{ lib, ... }: {
{ name = "audiobookshelf";
name = "audiobookshelf"; meta.maintainers = with lib.maintainers; [ wietsedv ];
meta.maintainers = with lib.maintainers; [ wietsedv ];
nodes.machine = nodes.machine =
{ pkgs, ... }: { pkgs, ... }:
{ {
services.audiobookshelf = { services.audiobookshelf = {
enable = true; enable = true;
port = 1234; port = 1234;
};
}; };
};
testScript = '' testScript = ''
machine.wait_for_unit("audiobookshelf.service") machine.wait_for_unit("audiobookshelf.service")
machine.wait_for_open_port(1234) machine.wait_for_open_port(1234)
machine.succeed("curl --fail http://localhost:1234/") machine.succeed("curl --fail http://localhost:1234/")
''; '';
} }
)

View file

@ -1,180 +1,178 @@
import ./make-test-python.nix ( { pkgs, lib, ... }:
{ pkgs, lib, ... }:
let let
dbUser = "nixos_auth"; dbUser = "nixos_auth";
dbPassword = "topsecret123"; dbPassword = "topsecret123";
dbName = "auth"; dbName = "auth";
mysqlUsername = "mysqltest"; mysqlUsername = "mysqltest";
mysqlPassword = "topsecretmysqluserpassword123"; mysqlPassword = "topsecretmysqluserpassword123";
mysqlGroup = "mysqlusers"; mysqlGroup = "mysqlusers";
localUsername = "localtest"; localUsername = "localtest";
localPassword = "topsecretlocaluserpassword123"; localPassword = "topsecretlocaluserpassword123";
mysqlInit = pkgs.writeText "mysqlInit" '' mysqlInit = pkgs.writeText "mysqlInit" ''
CREATE USER '${dbUser}'@'localhost' IDENTIFIED BY '${dbPassword}'; CREATE USER '${dbUser}'@'localhost' IDENTIFIED BY '${dbPassword}';
CREATE DATABASE ${dbName}; CREATE DATABASE ${dbName};
GRANT ALL PRIVILEGES ON ${dbName}.* TO '${dbUser}'@'localhost'; GRANT ALL PRIVILEGES ON ${dbName}.* TO '${dbUser}'@'localhost';
FLUSH PRIVILEGES; FLUSH PRIVILEGES;
USE ${dbName}; USE ${dbName};
CREATE TABLE `groups` ( CREATE TABLE `groups` (
rowid int(11) NOT NULL auto_increment, rowid int(11) NOT NULL auto_increment,
gid int(11) NOT NULL, gid int(11) NOT NULL,
name char(255) NOT NULL, name char(255) NOT NULL,
PRIMARY KEY (rowid) PRIMARY KEY (rowid)
); );
CREATE TABLE `users` ( CREATE TABLE `users` (
name varchar(255) NOT NULL, name varchar(255) NOT NULL,
uid int(11) NOT NULL auto_increment, uid int(11) NOT NULL auto_increment,
gid int(11) NOT NULL, gid int(11) NOT NULL,
password varchar(255) NOT NULL, password varchar(255) NOT NULL,
PRIMARY KEY (uid), PRIMARY KEY (uid),
UNIQUE (name) UNIQUE (name)
) AUTO_INCREMENT=5000; ) AUTO_INCREMENT=5000;
INSERT INTO `users` (name, uid, gid, password) VALUES INSERT INTO `users` (name, uid, gid, password) VALUES
('${mysqlUsername}', 5000, 5000, SHA2('${mysqlPassword}', 256)); ('${mysqlUsername}', 5000, 5000, SHA2('${mysqlPassword}', 256));
INSERT INTO `groups` (name, gid) VALUES ('${mysqlGroup}', 5000); INSERT INTO `groups` (name, gid) VALUES ('${mysqlGroup}', 5000);
''; '';
in in
{ {
name = "auth-mysql"; name = "auth-mysql";
meta.maintainers = with lib.maintainers; [ netali ]; meta.maintainers = with lib.maintainers; [ netali ];
nodes.machine = nodes.machine =
{ ... }: { ... }:
{ {
services.mysql = { services.mysql = {
enable = true; enable = true;
package = pkgs.mariadb; package = pkgs.mariadb;
settings.mysqld.bind-address = "127.0.0.1"; settings.mysqld.bind-address = "127.0.0.1";
initialScript = mysqlInit; initialScript = mysqlInit;
};
users.users.${localUsername} = {
isNormalUser = true;
password = localPassword;
};
security.pam.services.login.makeHomeDir = true;
users.mysql = {
enable = true;
host = "127.0.0.1";
user = dbUser;
database = dbName;
passwordFile = "${builtins.toFile "dbPassword" dbPassword}";
pam = {
table = "users";
userColumn = "name";
passwordColumn = "password";
passwordCrypt = "sha256";
disconnectEveryOperation = true;
};
nss = {
getpwnam = ''
SELECT name, 'x', uid, gid, name, CONCAT('/home/', name), "/run/current-system/sw/bin/bash" \
FROM users \
WHERE name='%1$s' \
LIMIT 1
'';
getpwuid = ''
SELECT name, 'x', uid, gid, name, CONCAT('/home/', name), "/run/current-system/sw/bin/bash" \
FROM users \
WHERE uid=%1$u \
LIMIT 1
'';
getspnam = ''
SELECT name, password, 1, 0, 99999, 7, 0, -1, 0 \
FROM users \
WHERE name='%1$s' \
LIMIT 1
'';
getpwent = ''
SELECT name, 'x', uid, gid, name, CONCAT('/home/', name), "/run/current-system/sw/bin/bash" \
FROM users
'';
getspent = ''
SELECT name, password, 1, 0, 99999, 7, 0, -1, 0 \
FROM users
'';
getgrnam = ''
SELECT name, 'x', gid FROM groups WHERE name='%1$s' LIMIT 1
'';
getgrgid = ''
SELECT name, 'x', gid FROM groups WHERE gid='%1$u' LIMIT 1
'';
getgrent = ''
SELECT name, 'x', gid FROM groups
'';
memsbygid = ''
SELECT name FROM users WHERE gid=%1$u
'';
gidsbymem = ''
SELECT gid FROM users WHERE name='%1$s'
'';
};
};
}; };
testScript = '' users.users.${localUsername} = {
def switch_to_tty(tty_number): isNormalUser = true;
machine.fail(f"pgrep -f 'agetty.*tty{tty_number}'") password = localPassword;
machine.send_key(f"alt-f{tty_number}") };
machine.wait_until_succeeds(f"[ $(fgconsole) = {tty_number} ]")
machine.wait_for_unit(f"getty@tty{tty_number}.service") security.pam.services.login.makeHomeDir = true;
machine.wait_until_succeeds(f"pgrep -f 'agetty.*tty{tty_number}'")
users.mysql = {
enable = true;
host = "127.0.0.1";
user = dbUser;
database = dbName;
passwordFile = "${builtins.toFile "dbPassword" dbPassword}";
pam = {
table = "users";
userColumn = "name";
passwordColumn = "password";
passwordCrypt = "sha256";
disconnectEveryOperation = true;
};
nss = {
getpwnam = ''
SELECT name, 'x', uid, gid, name, CONCAT('/home/', name), "/run/current-system/sw/bin/bash" \
FROM users \
WHERE name='%1$s' \
LIMIT 1
'';
getpwuid = ''
SELECT name, 'x', uid, gid, name, CONCAT('/home/', name), "/run/current-system/sw/bin/bash" \
FROM users \
WHERE uid=%1$u \
LIMIT 1
'';
getspnam = ''
SELECT name, password, 1, 0, 99999, 7, 0, -1, 0 \
FROM users \
WHERE name='%1$s' \
LIMIT 1
'';
getpwent = ''
SELECT name, 'x', uid, gid, name, CONCAT('/home/', name), "/run/current-system/sw/bin/bash" \
FROM users
'';
getspent = ''
SELECT name, password, 1, 0, 99999, 7, 0, -1, 0 \
FROM users
'';
getgrnam = ''
SELECT name, 'x', gid FROM groups WHERE name='%1$s' LIMIT 1
'';
getgrgid = ''
SELECT name, 'x', gid FROM groups WHERE gid='%1$u' LIMIT 1
'';
getgrent = ''
SELECT name, 'x', gid FROM groups
'';
memsbygid = ''
SELECT name FROM users WHERE gid=%1$u
'';
gidsbymem = ''
SELECT gid FROM users WHERE name='%1$s'
'';
};
};
};
testScript = ''
def switch_to_tty(tty_number):
machine.fail(f"pgrep -f 'agetty.*tty{tty_number}'")
machine.send_key(f"alt-f{tty_number}")
machine.wait_until_succeeds(f"[ $(fgconsole) = {tty_number} ]")
machine.wait_for_unit(f"getty@tty{tty_number}.service")
machine.wait_until_succeeds(f"pgrep -f 'agetty.*tty{tty_number}'")
def try_login(tty_number, username, password): def try_login(tty_number, username, password):
machine.wait_until_tty_matches(tty_number, "login: ") machine.wait_until_tty_matches(tty_number, "login: ")
machine.send_chars(f"{username}\n") machine.send_chars(f"{username}\n")
machine.wait_until_tty_matches(tty_number, f"login: {username}") machine.wait_until_tty_matches(tty_number, f"login: {username}")
machine.wait_until_succeeds("pgrep login") machine.wait_until_succeeds("pgrep login")
machine.wait_until_tty_matches(tty_number, "Password: ") machine.wait_until_tty_matches(tty_number, "Password: ")
machine.send_chars(f"{password}\n") machine.send_chars(f"{password}\n")
machine.wait_for_unit("multi-user.target") machine.wait_for_unit("multi-user.target")
machine.wait_for_unit("mysql.service") machine.wait_for_unit("mysql.service")
machine.wait_until_succeeds("cat /etc/security/pam_mysql.conf | grep users.db_passwd") machine.wait_until_succeeds("cat /etc/security/pam_mysql.conf | grep users.db_passwd")
machine.wait_until_succeeds("pgrep -f 'agetty.*tty1'") machine.wait_until_succeeds("pgrep -f 'agetty.*tty1'")
with subtest("Local login"): with subtest("Local login"):
switch_to_tty("2") switch_to_tty("2")
try_login("2", "${localUsername}", "${localPassword}") try_login("2", "${localUsername}", "${localPassword}")
machine.wait_until_succeeds("pgrep -u ${localUsername} bash") machine.wait_until_succeeds("pgrep -u ${localUsername} bash")
machine.send_chars("id > local_id.txt\n") machine.send_chars("id > local_id.txt\n")
machine.wait_for_file("/home/${localUsername}/local_id.txt") machine.wait_for_file("/home/${localUsername}/local_id.txt")
machine.succeed("cat /home/${localUsername}/local_id.txt | grep 'uid=1000(${localUsername}) gid=100(users) groups=100(users)'") machine.succeed("cat /home/${localUsername}/local_id.txt | grep 'uid=1000(${localUsername}) gid=100(users) groups=100(users)'")
with subtest("Local incorrect login"): with subtest("Local incorrect login"):
switch_to_tty("3") switch_to_tty("3")
try_login("3", "${localUsername}", "wrongpassword") try_login("3", "${localUsername}", "wrongpassword")
machine.wait_until_tty_matches("3", "Login incorrect") machine.wait_until_tty_matches("3", "Login incorrect")
machine.wait_until_tty_matches("3", "login:") machine.wait_until_tty_matches("3", "login:")
with subtest("MySQL login"): with subtest("MySQL login"):
switch_to_tty("4") switch_to_tty("4")
try_login("4", "${mysqlUsername}", "${mysqlPassword}") try_login("4", "${mysqlUsername}", "${mysqlPassword}")
machine.wait_until_succeeds("pgrep -u ${mysqlUsername} bash") machine.wait_until_succeeds("pgrep -u ${mysqlUsername} bash")
machine.send_chars("id > mysql_id.txt\n") machine.send_chars("id > mysql_id.txt\n")
machine.wait_for_file("/home/${mysqlUsername}/mysql_id.txt") machine.wait_for_file("/home/${mysqlUsername}/mysql_id.txt")
machine.succeed("cat /home/${mysqlUsername}/mysql_id.txt | grep 'uid=5000(${mysqlUsername}) gid=5000(${mysqlGroup}) groups=5000(${mysqlGroup})'") machine.succeed("cat /home/${mysqlUsername}/mysql_id.txt | grep 'uid=5000(${mysqlUsername}) gid=5000(${mysqlGroup}) groups=5000(${mysqlGroup})'")
with subtest("MySQL incorrect login"): with subtest("MySQL incorrect login"):
switch_to_tty("5") switch_to_tty("5")
try_login("5", "${mysqlUsername}", "wrongpassword") try_login("5", "${mysqlUsername}", "wrongpassword")
machine.wait_until_tty_matches("5", "Login incorrect") machine.wait_until_tty_matches("5", "Login incorrect")
machine.wait_until_tty_matches("5", "login:") machine.wait_until_tty_matches("5", "login:")
''; '';
} }
)

View file

@ -1,187 +1,183 @@
# Test Authelia as an auth server for Traefik as a reverse proxy of a local web service # Test Authelia as an auth server for Traefik as a reverse proxy of a local web service
import ./make-test-python.nix ( { lib, ... }:
{ lib, ... }: {
{ name = "authelia";
name = "authelia"; meta.maintainers = with lib.maintainers; [ jk ];
meta.maintainers = with lib.maintainers; [ jk ];
nodes = { nodes = {
authelia = authelia =
{ {
config, pkgs,
pkgs, ...
lib, }:
... {
}: services.authelia.instances.testing = {
{ enable = true;
services.authelia.instances.testing = { secrets.storageEncryptionKeyFile = "/etc/authelia/storageEncryptionKeyFile";
enable = true; secrets.jwtSecretFile = "/etc/authelia/jwtSecretFile";
secrets.storageEncryptionKeyFile = "/etc/authelia/storageEncryptionKeyFile"; settings = {
secrets.jwtSecretFile = "/etc/authelia/jwtSecretFile"; authentication_backend.file.path = "/etc/authelia/users_database.yml";
settings = { access_control.default_policy = "one_factor";
authentication_backend.file.path = "/etc/authelia/users_database.yml"; session.domain = "example.com";
access_control.default_policy = "one_factor"; storage.local.path = "/tmp/db.sqlite3";
session.domain = "example.com"; notifier.filesystem.filename = "/tmp/notifications.txt";
storage.local.path = "/tmp/db.sqlite3";
notifier.filesystem.filename = "/tmp/notifications.txt";
};
}; };
# These should not be set from nix but through other means to not leak the secret!
# This is purely for testing purposes!
environment.etc."authelia/storageEncryptionKeyFile" = {
mode = "0400";
user = "authelia-testing";
text = "you_must_generate_a_random_string_of_more_than_twenty_chars_and_configure_this";
};
environment.etc."authelia/jwtSecretFile" = {
mode = "0400";
user = "authelia-testing";
text = "a_very_important_secret";
};
environment.etc."authelia/users_database.yml" = {
mode = "0400";
user = "authelia-testing";
text = ''
users:
bob:
disabled: false
displayname: bob
# password of password
password: $argon2id$v=19$m=65536,t=3,p=4$2ohUAfh9yetl+utr4tLcCQ$AsXx0VlwjvNnCsa70u4HKZvFkC8Gwajr2pHGKcND/xs
email: bob@jim.com
groups:
- admin
- dev
'';
};
services.traefik = {
enable = true;
dynamicConfigOptions = {
tls.certificates =
let
certDir = pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } ''
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -subj '/CN=example.com/CN=auth.example.com/CN=static.example.com' -days 36500
mkdir -p $out
cp key.pem cert.pem $out
'';
in
[
{
certFile = "${certDir}/cert.pem";
keyFile = "${certDir}/key.pem";
}
];
http.middlewares.authelia.forwardAuth = {
address = "http://localhost:9091/api/verify?rd=https%3A%2F%2Fauth.example.com%2F";
trustForwardHeader = true;
authResponseHeaders = [
"Remote-User"
"Remote-Groups"
"Remote-Email"
"Remote-Name"
];
};
http.middlewares.authelia-basic.forwardAuth = {
address = "http://localhost:9091/api/verify?auth=basic";
trustForwardHeader = true;
authResponseHeaders = [
"Remote-User"
"Remote-Groups"
"Remote-Email"
"Remote-Name"
];
};
http.routers.simplehttp = {
rule = "Host(`static.example.com`)";
tls = true;
entryPoints = "web";
service = "simplehttp";
};
http.routers.simplehttp-basic-auth = {
rule = "Host(`static-basic-auth.example.com`)";
tls = true;
entryPoints = "web";
service = "simplehttp";
middlewares = [ "authelia-basic@file" ];
};
http.services.simplehttp = {
loadBalancer.servers = [
{
url = "http://localhost:8000";
}
];
};
http.routers.authelia = {
rule = "Host(`auth.example.com`)";
tls = true;
entryPoints = "web";
service = "authelia@file";
};
http.services.authelia = {
loadBalancer.servers = [
{
url = "http://localhost:9091";
}
];
};
};
staticConfigOptions = {
global = {
checkNewVersion = false;
sendAnonymousUsage = false;
};
entryPoints.web.address = ":443";
};
};
systemd.services.simplehttp =
let
fakeWebPageDir = pkgs.writeTextDir "index.html" "hello";
in
{
script = "${pkgs.python3}/bin/python -m http.server --directory ${fakeWebPageDir} 8000";
serviceConfig.Type = "simple";
wantedBy = [ "multi-user.target" ];
};
}; };
};
testScript = '' # These should not be set from nix but through other means to not leak the secret!
start_all() # This is purely for testing purposes!
environment.etc."authelia/storageEncryptionKeyFile" = {
mode = "0400";
user = "authelia-testing";
text = "you_must_generate_a_random_string_of_more_than_twenty_chars_and_configure_this";
};
environment.etc."authelia/jwtSecretFile" = {
mode = "0400";
user = "authelia-testing";
text = "a_very_important_secret";
};
environment.etc."authelia/users_database.yml" = {
mode = "0400";
user = "authelia-testing";
text = ''
users:
bob:
disabled: false
displayname: bob
# password of password
password: $argon2id$v=19$m=65536,t=3,p=4$2ohUAfh9yetl+utr4tLcCQ$AsXx0VlwjvNnCsa70u4HKZvFkC8Gwajr2pHGKcND/xs
email: bob@jim.com
groups:
- admin
- dev
'';
};
authelia.wait_for_unit("simplehttp.service") services.traefik = {
authelia.wait_for_unit("traefik.service") enable = true;
authelia.wait_for_unit("authelia-testing.service")
authelia.wait_for_open_port(443)
authelia.wait_for_unit("multi-user.target")
with subtest("Check for authelia"): dynamicConfigOptions = {
# expect the login page tls.certificates =
assert "Login - Authelia", "could not reach authelia" in \ let
authelia.succeed("curl --insecure -sSf -H Host:auth.example.com https://authelia:443/") certDir = pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } ''
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -subj '/CN=example.com/CN=auth.example.com/CN=static.example.com' -days 36500
mkdir -p $out
cp key.pem cert.pem $out
'';
in
[
{
certFile = "${certDir}/cert.pem";
keyFile = "${certDir}/key.pem";
}
];
http.middlewares.authelia.forwardAuth = {
address = "http://localhost:9091/api/verify?rd=https%3A%2F%2Fauth.example.com%2F";
trustForwardHeader = true;
authResponseHeaders = [
"Remote-User"
"Remote-Groups"
"Remote-Email"
"Remote-Name"
];
};
http.middlewares.authelia-basic.forwardAuth = {
address = "http://localhost:9091/api/verify?auth=basic";
trustForwardHeader = true;
authResponseHeaders = [
"Remote-User"
"Remote-Groups"
"Remote-Email"
"Remote-Name"
];
};
with subtest("Check contacting basic http server via traefik with https works"): http.routers.simplehttp = {
assert "hello", "could not reach raw static site" in \ rule = "Host(`static.example.com`)";
authelia.succeed("curl --insecure -sSf -H Host:static.example.com https://authelia:443/") tls = true;
entryPoints = "web";
service = "simplehttp";
};
http.routers.simplehttp-basic-auth = {
rule = "Host(`static-basic-auth.example.com`)";
tls = true;
entryPoints = "web";
service = "simplehttp";
middlewares = [ "authelia-basic@file" ];
};
with subtest("Test traefik and authelia"): http.services.simplehttp = {
with subtest("No details fail"): loadBalancer.servers = [
authelia.fail("curl --insecure -sSf -H Host:static-basic-auth.example.com https://authelia:443/") {
with subtest("Incorrect details fail"): url = "http://localhost:8000";
authelia.fail("curl --insecure -sSf -u 'bob:wordpass' -H Host:static-basic-auth.example.com https://authelia:443/") }
authelia.fail("curl --insecure -sSf -u 'alice:password' -H Host:static-basic-auth.example.com https://authelia:443/") ];
with subtest("Correct details pass"): };
assert "hello", "could not reach authed static site with valid credentials" in \
authelia.succeed("curl --insecure -sSf -u 'bob:password' -H Host:static-basic-auth.example.com https://authelia:443/") http.routers.authelia = {
''; rule = "Host(`auth.example.com`)";
} tls = true;
) entryPoints = "web";
service = "authelia@file";
};
http.services.authelia = {
loadBalancer.servers = [
{
url = "http://localhost:9091";
}
];
};
};
staticConfigOptions = {
global = {
checkNewVersion = false;
sendAnonymousUsage = false;
};
entryPoints.web.address = ":443";
};
};
systemd.services.simplehttp =
let
fakeWebPageDir = pkgs.writeTextDir "index.html" "hello";
in
{
script = "${pkgs.python3}/bin/python -m http.server --directory ${fakeWebPageDir} 8000";
serviceConfig.Type = "simple";
wantedBy = [ "multi-user.target" ];
};
};
};
testScript = ''
start_all()
authelia.wait_for_unit("simplehttp.service")
authelia.wait_for_unit("traefik.service")
authelia.wait_for_unit("authelia-testing.service")
authelia.wait_for_open_port(443)
authelia.wait_for_unit("multi-user.target")
with subtest("Check for authelia"):
# expect the login page
assert "Login - Authelia", "could not reach authelia" in \
authelia.succeed("curl --insecure -sSf -H Host:auth.example.com https://authelia:443/")
with subtest("Check contacting basic http server via traefik with https works"):
assert "hello", "could not reach raw static site" in \
authelia.succeed("curl --insecure -sSf -H Host:static.example.com https://authelia:443/")
with subtest("Test traefik and authelia"):
with subtest("No details fail"):
authelia.fail("curl --insecure -sSf -H Host:static-basic-auth.example.com https://authelia:443/")
with subtest("Incorrect details fail"):
authelia.fail("curl --insecure -sSf -u 'bob:wordpass' -H Host:static-basic-auth.example.com https://authelia:443/")
authelia.fail("curl --insecure -sSf -u 'alice:password' -H Host:static-basic-auth.example.com https://authelia:443/")
with subtest("Correct details pass"):
assert "hello", "could not reach authed static site with valid credentials" in \
authelia.succeed("curl --insecure -sSf -u 'bob:password' -H Host:static-basic-auth.example.com https://authelia:443/")
'';
}

View file

@ -1,33 +1,27 @@
import ./make-test-python.nix ( {
{ pkgs, ... }: name = "auto-cpufreq-server";
{ nodes = {
name = "auto-cpufreq-server"; machine = {
# service will still start but since vm inside qemu cpufreq adjustments
nodes = { # cannot be made. This will resource in the following error but the service
machine = # remains up:
{ pkgs, ... }: # ERROR:
{ # Couldn't find any of the necessary scaling governors.
# service will still start but since vm inside qemu cpufreq adjustments services.auto-cpufreq = {
# cannot be made. This will resource in the following error but the service enable = true;
# remains up: settings = {
# ERROR: charger = {
# Couldn't find any of the necessary scaling governors. turbo = "auto";
services.auto-cpufreq = {
enable = true;
settings = {
charger = {
turbo = "auto";
};
};
}; };
}; };
};
}; };
};
testScript = '' testScript = ''
machine.start() machine.start()
machine.wait_for_unit("auto-cpufreq.service") machine.wait_for_unit("auto-cpufreq.service")
machine.succeed("auto-cpufreq --force reset") machine.succeed("auto-cpufreq --force reset")
''; '';
} }
)

View file

@ -1,25 +1,23 @@
import ./make-test-python.nix ( { lib, ... }:
{ lib, ... }:
{ {
name = "autobrr"; name = "autobrr";
meta.maintainers = with lib.maintainers; [ av-gal ]; meta.maintainers = with lib.maintainers; [ av-gal ];
nodes.machine = nodes.machine =
{ pkgs, ... }: { pkgs, ... }:
{ {
services.autobrr = { services.autobrr = {
enable = true; enable = true;
# We create this secret in the Nix store (making it readable by everyone). # We create this secret in the Nix store (making it readable by everyone).
# DO NOT DO THIS OUTSIDE OF TESTS!! # DO NOT DO THIS OUTSIDE OF TESTS!!
secretFile = pkgs.writeText "session_secret" "not-secret"; secretFile = pkgs.writeText "session_secret" "not-secret";
};
}; };
};
testScript = '' testScript = ''
machine.wait_for_unit("autobrr.service") machine.wait_for_unit("autobrr.service")
machine.wait_for_open_port(7474) machine.wait_for_open_port(7474)
machine.succeed("curl --fail http://localhost:7474/") machine.succeed("curl --fail http://localhost:7474/")
''; '';
} }
)

View file

@ -1,17 +1,14 @@
{ {
system ? builtins.currentSystem, pkgs,
config ? { },
pkgs ? import ../.. { inherit system config; },
# bool: whether to use networkd in the tests # bool: whether to use networkd in the tests
networkd ? false, networkd ? false,
}@args: ...
}:
# Test whether `avahi-daemon' and `libnss-mdns' work as expected. # Test whether `avahi-daemon' and `libnss-mdns' work as expected.
import ./make-test-python.nix { {
name = "avahi"; name = "avahi";
meta = with pkgs.lib.maintainers; { meta.maintainers = [ ];
maintainers = [ ];
};
nodes = nodes =
let let
@ -29,7 +26,7 @@ import ./make-test-python.nix {
extraServiceFiles.ssh = "${pkgs.avahi}/etc/avahi/services/ssh.service"; extraServiceFiles.ssh = "${pkgs.avahi}/etc/avahi/services/ssh.service";
}; };
} }
// pkgs.lib.optionalAttrs (networkd) { // pkgs.lib.optionalAttrs networkd {
networking = { networking = {
useNetworkd = true; useNetworkd = true;
useDHCP = false; useDHCP = false;
@ -84,4 +81,4 @@ import ./make-test-python.nix {
one.log(one.execute("systemd-analyze security avahi-daemon.service | grep -v ")[1]) one.log(one.execute("systemd-analyze security avahi-daemon.service | grep -v ")[1])
''; '';
} args }

View file

@ -0,0 +1,21 @@
{
runCommand,
emacs,
git,
}:
runCommand "test-emacs-withPackages-wrapper"
{
nativeBuildInputs = [
(emacs.pkgs.withPackages (
epkgs: with epkgs; [
magit
]
))
git # needed by magit
];
}
''
emacs --batch --eval="(require 'magit)"
touch $out
''

View file

@ -128,6 +128,9 @@
QuartzCore, QuartzCore,
UniformTypeIdentifiers, UniformTypeIdentifiers,
WebKit, WebKit,
# test
callPackage,
}: }:
assert (withGTK3 && !withNS && variant != "macport") -> withX || withPgtk; assert (withGTK3 && !withNS && variant != "macport") -> withX || withPgtk;
@ -524,7 +527,12 @@ mkDerivation (finalAttrs: {
inherit withTreeSitter; inherit withTreeSitter;
inherit withXwidgets; inherit withXwidgets;
pkgs = recurseIntoAttrs (emacsPackagesFor finalAttrs.finalPackage); pkgs = recurseIntoAttrs (emacsPackagesFor finalAttrs.finalPackage);
tests = { inherit (nixosTests) emacs-daemon; }; tests = {
inherit (nixosTests) emacs-daemon;
withPackages = callPackage ./build-support/wrapper-test.nix {
emacs = finalAttrs.finalPackage;
};
};
}; };
meta = meta // { meta = meta // {

View file

@ -22,7 +22,7 @@ let
fetchSubmodules = true; fetchSubmodules = true;
}; };
patches = (oldAttrs.patches or [ ]) ++ [ patches = [
(fetchpatch { (fetchpatch {
url = "https://webrtc.googlesource.com/src/+/e7d10047096880feb5e9846375f2da54aef91202%5E%21/?format=TEXT"; url = "https://webrtc.googlesource.com/src/+/e7d10047096880feb5e9846375f2da54aef91202%5E%21/?format=TEXT";
decode = "base64 -d"; decode = "base64 -d";

View file

@ -50,6 +50,8 @@ stdenv.mkDerivation rec {
"-DNIFTI_INCLUDE_DIR=${nifticlib}/include/nifti" "-DNIFTI_INCLUDE_DIR=${nifticlib}/include/nifti"
]; ];
env.NIX_CFLAGS_COMPILE = "-D_FillValue=NC_FillValue";
postFixup = '' postFixup = ''
for prog in minccomplete minchistory mincpik; do for prog in minccomplete minchistory mincpik; do
wrapProgram $out/bin/$prog --prefix PERL5LIB : $PERL5LIB wrapProgram $out/bin/$prog --prefix PERL5LIB : $PERL5LIB
@ -62,5 +64,6 @@ stdenv.mkDerivation rec {
maintainers = with maintainers; [ bcdarwin ]; maintainers = with maintainers; [ bcdarwin ];
platforms = platforms.unix; platforms = platforms.unix;
license = licenses.free; license = licenses.free;
broken = stdenv.hostPlatform.isDarwin;
}; };
} }

View file

@ -4,8 +4,7 @@
buildGoModule, buildGoModule,
fetchFromGitHub, fetchFromGitHub,
installShellFiles, installShellFiles,
testers, versionCheckHook,
copywrite,
}: }:
let let
@ -19,7 +18,7 @@ buildGoModule rec {
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "hashicorp"; owner = "hashicorp";
repo = "copywrite"; repo = "copywrite";
rev = "v${version}"; tag = "v${version}";
hash = "sha256-DmlPioaw/wMk8GoBYNG24P4J1C6h0bjVjjOuMYW6Tgo="; hash = "sha256-DmlPioaw/wMk8GoBYNG24P4J1C6h0bjVjjOuMYW6Tgo=";
}; };
@ -42,11 +41,8 @@ buildGoModule rec {
installShellCompletion copywrite.{bash,zsh,fish} installShellCompletion copywrite.{bash,zsh,fish}
''; '';
passthru.tests.version = testers.testVersion { nativeInstallCheckInputs = [ versionCheckHook ];
package = copywrite; doInstallCheck = true;
command = "copywrite --version";
version = "${version}-${shortCommitHash}";
};
meta = { meta = {
description = "Automate copyright headers and license files at scale"; description = "Automate copyright headers and license files at scale";

View file

@ -0,0 +1,45 @@
{
lib,
stdenv,
fetchFromGitHub,
autoreconfHook,
guile,
pkg-config,
texinfo,
curl,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "guile-curl";
version = "0.9";
src = fetchFromGitHub {
owner = "spk121";
repo = "guile-curl";
tag = "v${finalAttrs.version}";
hash = "sha256-nVA0cl4Oog3G+Ww0n0QMxJ66iqTn4VxrV+sqd6ACWl4=";
};
strictDeps = true;
nativeBuildInputs = [
autoreconfHook
guile
pkg-config
texinfo
];
buildInputs = [
guile
curl
];
meta = {
description = "Bindings to cURL for GNU Guile";
homepage = "https://github.com/spk121/guile-curl";
changelog = "https://github.com/spk121/guile-curl/releases/tag/v${finalAttrs.version}/CHANGELOG.md";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [ ethancedwards8 ];
platforms = guile.meta.platforms;
};
})

View file

@ -0,0 +1,82 @@
{
lib,
fetchFromGitHub,
fetchpatch2,
stdenv,
autoreconfHook,
pkg-config,
ncurses,
darwin,
libcap,
libnl,
sensorsSupport ? stdenv.hostPlatform.isLinux,
lm_sensors,
systemdSupport ? lib.meta.availableOn stdenv.hostPlatform systemd,
systemd,
}:
assert systemdSupport -> stdenv.hostPlatform.isLinux;
stdenv.mkDerivation rec {
pname = "htop-vim";
version = "unstable-2023-02-16";
src = fetchFromGitHub {
owner = "KoffeinFlummi";
repo = pname;
rev = "b2b58f8f152343b70c33b79ba51a298024278621";
hash = "sha256-ZfdBAlnjoy8g6xwrR/i2+dGldMOfLlX6DRlNqB8pkGM=";
};
patches = [
# See https://github.com/htop-dev/htop/pull/1412
# Remove when updating to 3.4.0
(fetchpatch2 {
name = "htop-resolve-configuration-path.patch";
url = "https://github.com/htop-dev/htop/commit/0dac8e7d38ec3aeae901a987717b5177986197e4.patch";
hash = "sha256-Er1d/yV1fioYfEmXNlLO5ayAyXkyy+IaGSx1KWXvlv0=";
})
];
nativeBuildInputs = [ autoreconfHook ] ++ lib.optional stdenv.hostPlatform.isLinux pkg-config;
buildInputs =
[ ncurses ]
++ lib.optionals stdenv.hostPlatform.isDarwin [ darwin.IOKit ]
++ lib.optionals stdenv.hostPlatform.isLinux [
libcap
libnl
]
++ lib.optional sensorsSupport lm_sensors
++ lib.optional systemdSupport systemd;
configureFlags =
[
"--enable-unicode"
"--sysconfdir=/etc"
]
++ lib.optionals stdenv.hostPlatform.isLinux [
"--enable-affinity"
"--enable-capabilities"
"--enable-delayacct"
]
++ lib.optional sensorsSupport "--enable-sensors";
postFixup =
let
optionalPatch = pred: so: lib.optionalString pred "patchelf --add-needed ${so} $out/bin/htop";
in
lib.optionalString (!stdenv.hostPlatform.isStatic) ''
${optionalPatch sensorsSupport "${lib.getLib lm_sensors}/lib/libsensors.so"}
${optionalPatch systemdSupport "${systemd}/lib/libsystemd.so"}
'';
meta = with lib; {
description = "Interactive process viewer, with vim-style keybindings";
homepage = "https://github.com/KoffeinFlummi/htop-vim";
license = licenses.gpl2Only;
platforms = platforms.all;
maintainers = with maintainers; [ thiagokokada ];
mainProgram = "htop";
};
}

View file

@ -23,14 +23,14 @@
stdenv.mkDerivation (finalAttrs: { stdenv.mkDerivation (finalAttrs: {
pname = "itgmania"; pname = "itgmania";
version = "0.9.0"; version = "1.0.0";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "itgmania"; owner = "itgmania";
repo = "itgmania"; repo = "itgmania";
rev = "v${finalAttrs.version}"; rev = "v${finalAttrs.version}";
fetchSubmodules = true; fetchSubmodules = true;
hash = "sha256-SAEYkAPNUjGNfNnHfwyOj65i2SpEX0ct/fREob5/6fI="; hash = "sha256-GzpsyyjR7NhgCQ9D7q8G4YU7HhV1C1es1C1355gHnV8=";
}; };
nativeBuildInputs = [ nativeBuildInputs = [

View file

@ -17,20 +17,20 @@ let
in in
python3.pkgs.buildPythonApplication rec { python3.pkgs.buildPythonApplication rec {
pname = "matrix-synapse"; pname = "matrix-synapse";
version = "1.125.0"; version = "1.126.0";
format = "pyproject"; format = "pyproject";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "element-hq"; owner = "element-hq";
repo = "synapse"; repo = "synapse";
rev = "v${version}"; rev = "v${version}";
hash = "sha256-eo4JxNhVdAUeUmh0yUDE7+6csNbgdrYvf7UU/AMce7U="; hash = "sha256-fEJ4gxftC9oPhmcvbMdwxbZsHVfed9NS8Sjb7BTmTQo=";
}; };
cargoDeps = rustPlatform.fetchCargoVendor { cargoDeps = rustPlatform.fetchCargoVendor {
inherit src; inherit src;
name = "${pname}-${version}"; name = "${pname}-${version}";
hash = "sha256-eAlybi5yDlnhdvVet5Xab4s1emyJrlQuEf3YzusU2M4="; hash = "sha256-P0JNGaRUd3fiwfPLnXQGeTDTURLgqO6g4KRIs86omYg=";
}; };
postPatch = '' postPatch = ''

View file

@ -1,49 +1,46 @@
{ {
lib, lib,
stdenv, stdenv,
c-ares,
cmake,
cryptopp,
curl,
fetchFromGitHub, fetchFromGitHub,
fetchpatch, fetchpatch,
# nativeBuildInputs
cmake,
libsForQt5,
libtool,
pkg-config,
unzip,
# buildInputs
c-ares,
cryptopp,
curl,
ffmpeg, ffmpeg,
hicolor-icon-theme, hicolor-icon-theme,
icu, icu,
libmediainfo, libmediainfo,
libsodium, libsodium,
libtool,
libuv, libuv,
libxcb, libxcb,
libzen, libzen,
mkDerivation,
openssl, openssl,
pkg-config,
qtbase,
qtdeclarative,
qtgraphicaleffects,
qttools,
qtquickcontrols,
qtquickcontrols2,
qtsvg,
qtx11extras,
readline, readline,
sqlite, sqlite,
unzip,
wget, wget,
xorg, xorg,
zlib, zlib,
qt5,
nix-update-script,
}: }:
mkDerivation rec { stdenv.mkDerivation (finalAttrs: {
pname = "megasync"; pname = "megasync";
version = "5.7.1.0"; version = "5.8.0.2";
src = fetchFromGitHub rec { src = fetchFromGitHub rec {
owner = "meganz"; owner = "meganz";
repo = "MEGAsync"; repo = "MEGAsync";
rev = "v${version}_Linux"; tag = "v${finalAttrs.version}_Linux";
hash = "sha256-lbAI17CyHrppMnxQDV5g0IE+I7Y0DwU+h5MSFZclD2A="; hash = "sha256-/q7LD1/06+0MepDz3fVrlvGKh+rvNk6d1hm7Ng54Nmk=";
fetchSubmodules = false; # DesignTokensImporter cannot be fetched, see #1010 in github:meganz/megasync fetchSubmodules = false; # DesignTokensImporter cannot be fetched, see #1010 in github:meganz/megasync
leaveDotGit = true; leaveDotGit = true;
postFetch = '' postFetch = ''
@ -52,46 +49,13 @@ mkDerivation rec {
git remote add origin $url git remote add origin $url
git fetch origin git fetch origin
git clean -fdx git clean -fdx
git checkout ${rev} git checkout ${tag}
git submodule update --init src/MEGASync/mega git submodule update --init src/MEGASync/mega
rm -rf .git rm -rf .git
''; # Why so complicated, I just want a single submodule ''; # Why so complicated, I just want a single submodule
}; };
nativeBuildInputs = [
cmake
libtool
pkg-config
qttools
unzip
];
buildInputs = [
c-ares
cryptopp
curl
ffmpeg
hicolor-icon-theme
icu
libmediainfo
libsodium
libuv
libxcb
libzen
openssl
qtbase
qtdeclarative
qtgraphicaleffects
qtquickcontrols
qtquickcontrols2
qtsvg
qtx11extras
readline
sqlite
wget
zlib
];
patches = [ patches = [
(fetchpatch { (fetchpatch {
url = "https://aur.archlinux.org/cgit/aur.git/plain/020-megasync-sdk-fix-cmake-dependencies-detection.patch?h=megasync&id=ff59780039697591e7e3a966db058b23bee0451c"; url = "https://aur.archlinux.org/cgit/aur.git/plain/020-megasync-sdk-fix-cmake-dependencies-detection.patch?h=megasync&id=ff59780039697591e7e3a966db058b23bee0451c";
@ -108,12 +72,49 @@ mkDerivation rec {
]; ];
postPatch = '' postPatch = ''
substituteInPlace cmake/modules/desktopapp_options.cmake --replace-fail "ENABLE_ISOLATED_GFX ON" "ENABLE_ISOLATED_GFX OFF" substituteInPlace cmake/modules/desktopapp_options.cmake \
--replace-fail "ENABLE_ISOLATED_GFX ON" "ENABLE_ISOLATED_GFX OFF"
for file in $(find src/ -type f \( -iname configure -o -iname \*.sh \) ); do for file in $(find src/ -type f \( -iname configure -o -iname \*.sh \) ); do
substituteInPlace "$file" --replace "/bin/bash" "${stdenv.shell}" substituteInPlace "$file" --replace-warn "/bin/bash" "${stdenv.shell}"
done done
''; '';
nativeBuildInputs = [
cmake
libsForQt5.qttools
libsForQt5.wrapQtAppsHook
libtool
pkg-config
unzip
];
buildInputs = [
c-ares
cryptopp
curl
ffmpeg
hicolor-icon-theme
icu
libmediainfo
libsForQt5.qtbase
libsForQt5.qtdeclarative
libsForQt5.qtgraphicaleffects
libsForQt5.qtquickcontrols
libsForQt5.qtquickcontrols2
libsForQt5.qtsvg
libsForQt5.qtx11extras
libsodium
libuv
libxcb
libzen
openssl
readline
sqlite
wget
zlib
];
dontUseQmakeConfigure = true; dontUseQmakeConfigure = true;
enableParallelBuilding = true; enableParallelBuilding = true;
@ -127,14 +128,25 @@ mkDerivation rec {
qtWrapperArgs+=(--prefix PATH : ${lib.makeBinPath [ xorg.xrdb ]}) qtWrapperArgs+=(--prefix PATH : ${lib.makeBinPath [ xorg.xrdb ]})
''; '';
meta = with lib; { passthru = {
updateScript = nix-update-script {
extraArgs = [
"--version-regex=^v(.*)_Linux$"
];
};
};
meta = {
description = "Easy automated syncing between your computers and your MEGA Cloud Drive"; description = "Easy automated syncing between your computers and your MEGA Cloud Drive";
homepage = "https://mega.nz/"; homepage = "https://mega.nz/";
license = licenses.unfree; downloadPage = "https://github.com/meganz/MEGAsync";
changelog = "https://github.com/meganz/MEGAsync/releases/tag/v${finalAttrs.version}_Linux";
license = lib.licenses.unfree;
platforms = [ platforms = [
"i686-linux" "i686-linux"
"x86_64-linux" "x86_64-linux"
]; ];
maintainers = [ ]; maintainers = [ ];
mainProgram = "megasync";
}; };
} })

View file

@ -41,6 +41,11 @@ stdenv.mkDerivation rec {
url = "https://github.com/morganstanley/modern-cpp-kafka/commit/236f8f91f5c3ad6e1055a6f55cd3aebd218e1226.patch"; url = "https://github.com/morganstanley/modern-cpp-kafka/commit/236f8f91f5c3ad6e1055a6f55cd3aebd218e1226.patch";
hash = "sha256-cy568TQUu08sadq79hDz9jMvDqiDjfr+1cLMxFWGm1Q="; hash = "sha256-cy568TQUu08sadq79hDz9jMvDqiDjfr+1cLMxFWGm1Q=";
}) })
(fetchpatch {
name = "macos-find-dylib.patch";
url = "https://github.com/morganstanley/modern-cpp-kafka/commit/dc2753cd95b607a7202b40bad3aad472558bf350.patch";
hash = "sha256-Te3GwAVRDyb6GFWlvkq1mIcNeXCtMyLr+/w1LilUYbE=";
})
]; ];
postPatch = '' postPatch = ''
@ -53,13 +58,18 @@ stdenv.mkDerivation rec {
buildInputs = [ boost ]; buildInputs = [ boost ];
propagatedBuildInputs = [ rdkafka ]; propagatedBuildInputs = [ rdkafka ];
cmakeFlags = [ cmakeFlags =
"-DLIBRDKAFKA_INCLUDE_DIR=${rdkafka.out}/include" let
"-DGTEST_LIBRARY_DIR=${gtest.out}/lib" inherit (lib) cmakeFeature getLib getInclude;
"-DGTEST_INCLUDE_DIR=${gtest.dev}/include" in
"-DRAPIDJSON_INCLUDE_DIRS=${rapidjson.out}/include" [
"-DCMAKE_CXX_FLAGS=-Wno-uninitialized" (cmakeFeature "LIBRDKAFKA_LIBRARY_DIR" "${getLib rdkafka}/lib")
]; (cmakeFeature "LIBRDKAFKA_INCLUDE_DIR" "${getInclude rdkafka}/include")
(cmakeFeature "GTEST_LIBRARY_DIR" "${getLib gtest}/lib")
(cmakeFeature "GTEST_INCLUDE_DIR" "${getInclude gtest}/include")
(cmakeFeature "RAPIDJSON_INCLUDE_DIRS" "${getInclude rapidjson}/include")
(cmakeFeature "CMAKE_CXX_FLAGS" "-Wno-uninitialized")
];
checkInputs = [ checkInputs = [
gtest gtest

View file

@ -20,11 +20,11 @@ let
in in
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "netcdf" + lib.optionalString mpiSupport "-mpi"; pname = "netcdf" + lib.optionalString mpiSupport "-mpi";
version = "4.9.2"; version = "4.9.3";
src = fetchurl { src = fetchurl {
url = "https://downloads.unidata.ucar.edu/netcdf-c/${version}/netcdf-c-${version}.tar.gz"; url = "https://downloads.unidata.ucar.edu/netcdf-c/${version}/netcdf-c-${version}.tar.gz";
hash = "sha256-zxG6u725lj8J9VB54LAZ9tA3H1L44SZKW6jp/asabEg="; hash = "sha256-pHQUmETmFEVmZz+s8Jf+olPchDw3vAp9PeBH3Irdpd0=";
}; };
postPatch = '' postPatch = ''

View file

@ -0,0 +1,49 @@
From b819b3616b96352d23cdf0840df9e6674437948c Mon Sep 17 00:00:00 2001
From: Orion Poplawski <orion@nwra.com>
Date: Mon, 17 Feb 2025 15:17:28 -0700
Subject: [PATCH] Use HAVE_NC_SET_LOG_LEVEL to determine usage of
nc_set_log_level (fixes #161)
---
cxx4/test_filter.cpp | 2 ++
examples/pres_temp_4D_plugin_wr.cpp | 4 ++++
2 files changed, 6 insertions(+)
diff --git a/cxx4/test_filter.cpp b/cxx4/test_filter.cpp
index 879ba71..f442c64 100644
--- a/cxx4/test_filter.cpp
+++ b/cxx4/test_filter.cpp
@@ -30,7 +30,9 @@ int main()
try
{
NcFile test("pres_temp_plugin_4D.nc", NcFile::replace);
+#ifdef HAVE_NC_SET_LOG_LEVEL
nc_set_log_level(5);
+#endif
// Define the dimensions. NetCDF will hand back an ncDim object for
// each.
NcDim latDim = test.addDim(LAT_NAME, NLAT);
diff --git a/examples/pres_temp_4D_plugin_wr.cpp b/examples/pres_temp_4D_plugin_wr.cpp
index 832d2a6..584e8be 100644
--- a/examples/pres_temp_4D_plugin_wr.cpp
+++ b/examples/pres_temp_4D_plugin_wr.cpp
@@ -71,7 +71,9 @@ string LON_UNITS = "degrees_east";
int main()
{
+#ifdef HAVE_NC_SET_LOG_LEVEL
nc_set_log_level(5);
+#endif
// We will write latitude and longitude fields.
float lats[NLAT],lons[NLON];
@@ -103,7 +105,9 @@ int main()
// Create the file.
NcFile test(FILE_NAME, NcFile::replace);
+#ifdef HAVE_NC_SET_LOG_LEVEL
nc_set_log_level(5);
+#endif
// Define the dimensions. NetCDF will hand back an ncDim object for
// each.
NcDim lvlDim = test.addDim(LVL_NAME, NLVL);

View file

@ -22,6 +22,7 @@ stdenv.mkDerivation rec {
patches = [ patches = [
# This fix is included upstream, remove with next upgrade # This fix is included upstream, remove with next upgrade
./cmake-h5free.patch ./cmake-h5free.patch
./netcdf.patch
]; ];
preConfigure = '' preConfigure = ''

View file

@ -3,6 +3,7 @@
stdenv, stdenv,
fetchFromGitHub, fetchFromGitHub,
fetchFromGitLab, fetchFromGitLab,
fetchpatch,
cargo, cargo,
desktop-file-utils, desktop-file-utils,
meson, meson,
@ -31,6 +32,13 @@ let
tag = version; tag = version;
hash = "sha256-vhpQT67+849WV1SFthQdUeFnYe/okudTQJoL3y+wXwI="; hash = "sha256-vhpQT67+849WV1SFthQdUeFnYe/okudTQJoL3y+wXwI=";
}; };
patches = [
(fetchpatch {
url = "https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/f4f495ee212c46611303dec9cd18996830d7f721.patch";
hash = "sha256-dxVlXFGyNvWKZBrZniFatPPnK+38pFGig7LGAsc6Ydc=";
})
];
}); });
in in
stdenv.mkDerivation (finalAttrs: { stdenv.mkDerivation (finalAttrs: {

View file

@ -1,8 +1,33 @@
From 7435b2e12c2004cb0c497ff313288902f2a6f39a Mon Sep 17 00:00:00 2001
From: toonn <toonn@toonn.io>
Date: Fri, 19 Jul 2024 21:53:58 +0200
Subject: [PATCH] Don't build demos
---
Makefile | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/Makefile b/Makefile diff --git a/Makefile b/Makefile
index 8327b4e..c269291 100644 index 8327b4e..7901cc5 100644
--- a/Makefile --- a/Makefile
+++ b/Makefile +++ b/Makefile
@@ -99,9 +99,6 @@ install: libquirc.a libquirc.$(LIB_SUFFIX) quirc-demo quirc-scanner @@ -45,7 +45,7 @@ DEMO_UTIL_OBJ = \
OPENCV_CFLAGS := $(shell pkg-config --cflags opencv4 2>&1)
OPENCV_LIBS = $(shell pkg-config --libs opencv4)
-QUIRC_CXXFLAGS = $(QUIRC_CFLAGS) $(OPENCV_CFLAGS) --std=c++17
+QUIRC_CXXFLAGS = $(QUIRC_CFLAGS) --std=c++17
.PHONY: all v4l sdl opencv install uninstall clean
@@ -93,15 +93,12 @@ libquirc.$(VERSIONED_LIB_SUFFIX): $(LIB_OBJ)
.cxx.o:
$(CXX) $(QUIRC_CXXFLAGS) -o $@ -c $<
-install: libquirc.a libquirc.$(LIB_SUFFIX) quirc-demo quirc-scanner
+install: libquirc.a libquirc.$(LIB_SUFFIX)
install -o root -g root -m 0644 lib/quirc.h $(DESTDIR)$(PREFIX)/include
install -o root -g root -m 0644 libquirc.a $(DESTDIR)$(PREFIX)/lib
install -o root -g root -m 0755 libquirc.$(VERSIONED_LIB_SUFFIX) \ install -o root -g root -m 0755 libquirc.$(VERSIONED_LIB_SUFFIX) \
$(DESTDIR)$(PREFIX)/lib $(DESTDIR)$(PREFIX)/lib
cp -d libquirc.$(LIB_SUFFIX) $(DESTDIR)$(PREFIX)/lib cp -d libquirc.$(LIB_SUFFIX) $(DESTDIR)$(PREFIX)/lib
@ -12,3 +37,6 @@ index 8327b4e..c269291 100644
uninstall: uninstall:
rm -f $(DESTDIR)$(PREFIX)/include/quirc.h rm -f $(DESTDIR)$(PREFIX)/include/quirc.h
--
2.42.2

View file

@ -4,11 +4,10 @@
fetchFromGitHub, fetchFromGitHub,
zlib, zlib,
zstd, zstd,
pkg-config,
python3,
openssl, openssl,
which,
curl, curl,
cmake,
ninja,
}: }:
stdenv.mkDerivation (finalAttrs: { stdenv.mkDerivation (finalAttrs: {
@ -22,10 +21,14 @@ stdenv.mkDerivation (finalAttrs: {
sha256 = "sha256-OCCsxgEO8UvCcC0XwzqpqmaT8dV0Klrspp+2o1FbH2Y="; sha256 = "sha256-OCCsxgEO8UvCcC0XwzqpqmaT8dV0Klrspp+2o1FbH2Y=";
}; };
outputs = [
"out"
"dev"
];
nativeBuildInputs = [ nativeBuildInputs = [
pkg-config cmake
python3 ninja
which
]; ];
buildInputs = [ buildInputs = [
@ -35,12 +38,30 @@ stdenv.mkDerivation (finalAttrs: {
curl curl
]; ];
env.NIX_CFLAGS_COMPILE = "-Wno-error=strict-overflow"; # examples and tests don't build on darwin statically
cmakeFlags = [
(lib.cmakeBool "RDKAFKA_BUILD_STATIC" stdenv.hostPlatform.isStatic)
(lib.cmakeBool "RDKAFKA_BUILD_TESTS" (
!stdenv.hostPlatform.isDarwin && !stdenv.hostPlatform.isStatic
))
(lib.cmakeBool "RDKAFKA_BUILD_EXAMPLES" (
!stdenv.hostPlatform.isDarwin && !stdenv.hostPlatform.isStatic
))
(lib.cmakeFeature "CMAKE_C_FLAGS" "-Wno-error=strict-overflow")
];
postPatch = '' postPatch = ''
patchShebangs . patchShebangs .
''; '';
postFixup = lib.optionalString stdenv.hostPlatform.isStatic ''
# rdkafka changes the library names for static libraries but users in pkgsStatic aren't likely to be aware of this
# make sure the libraries are findable with both names
for pc in rdkafka{,++}; do
ln -s $dev/lib/pkgconfig/$pc{-static,}.pc
done
'';
enableParallelBuilding = true; enableParallelBuilding = true;
meta = with lib; { meta = with lib; {

View file

@ -151,8 +151,8 @@
}, },
{ {
"pname": "Gommon", "pname": "Gommon",
"version": "2.7.1", "version": "2.7.1.1",
"hash": "sha256-tD1gdk4umsl7r5jFd2Wyx3zeRE9BX1FQfZMYoCcpmwY=" "hash": "sha256-2AnVtyEbg5A+K/LDjgOpKw/CNRDkAhjVa38L5LYYyrw="
}, },
{ {
"pname": "HarfBuzzSharp", "pname": "HarfBuzzSharp",
@ -829,11 +829,6 @@
"version": "0.1.0", "version": "0.1.0",
"hash": "sha256-+K7ObC9ucilwWY+Tlf9KcrAVoTFS65V6Di7JDWDSZTg=" "hash": "sha256-+K7ObC9ucilwWY+Tlf9KcrAVoTFS65V6Di7JDWDSZTg="
}, },
{
"pname": "SharpMetal",
"version": "1.0.0-preview21",
"hash": "sha256-ixS88SuK94KfBONdTgXSPSI4tftqekjQ3aJ502rG3Vo="
},
{ {
"pname": "SharpZipLib", "pname": "SharpZipLib",
"version": "1.4.2", "version": "1.4.2",

View file

@ -30,13 +30,13 @@
buildDotnetModule rec { buildDotnetModule rec {
pname = "ryubing"; pname = "ryubing";
version = "1.2.82"; version = "1.2.86";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "Ryubing"; owner = "Ryubing";
repo = "Ryujinx"; repo = "Ryujinx";
rev = version; rev = version;
hash = "sha256-pLzmfrdjpn2DTg2AJF1yyTJJPxHScQTX+yq9MbuzMHk="; hash = "sha256-fRdSmdejTK4BUAw5nj3hGCu5u2yZ+tZDN0PoCRzEZIw=";
}; };
nativeBuildInputs = lib.optional stdenv.isDarwin [ nativeBuildInputs = lib.optional stdenv.isDarwin [

View file

@ -0,0 +1,31 @@
diff --git a/SDL2Config.cmake.in b/SDL2Config.cmake.in
index 80c1b99..54f50e6 100644
--- a/SDL2Config.cmake.in
+++ b/SDL2Config.cmake.in
@@ -45,7 +45,8 @@ endif()
set(SDL2_PREFIX "@PACKAGE_CMAKE_INSTALL_PREFIX@")
set(SDL2_EXEC_PREFIX "@PACKAGE_CMAKE_INSTALL_PREFIX@")
set(SDL2_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_FULL_INCLUDEDIR@/SDL2")
-set(SDL2_INCLUDE_DIRS "@PACKAGE_CMAKE_INSTALL_FULL_INCLUDEDIR@;@PACKAGE_CMAKE_INSTALL_FULL_INCLUDEDIR@/SDL2")
+set(SDL2_INCLUDE_DIRS "@PACKAGE_CMAKE_INSTALL_FULL_INCLUDEDIR@;@PACKAGE_CMAKE_INSTALL_FULL_INCLUDEDIR@/SDL2" $ENV{SDL2_PATH})
+separate_arguments(SDL2_INCLUDE_DIRS)
set(SDL2_BINDIR "@PACKAGE_CMAKE_INSTALL_FULL_BINDIR@")
set(SDL2_LIBDIR "@PACKAGE_CMAKE_INSTALL_FULL_LIBDIR@")
set(SDL2_LIBRARIES SDL2::SDL2)
diff --git a/sdl2-config.in b/sdl2-config.in
index d21b1b2..bb0d624 100644
--- a/sdl2-config.in
+++ b/sdl2-config.in
@@ -50,7 +50,11 @@ while test $# -gt 0; do
echo @PROJECT_VERSION@
;;
--cflags)
- echo -I${includedir}/SDL2 @SDL_CFLAGS@
+ SDL_CFLAGS=""
+ for i in @includedir@/SDL2 $SDL2_PATH; do
+ SDL_CFLAGS="$SDL_CFLAGS -I$i"
+ done
+ echo $SDL_CFLAGS @SDL_CFLAGS@
;;
@ENABLE_SHARED_TRUE@ --libs)
@ENABLE_SHARED_TRUE@ echo -L${libdir} @SDL_RLD_FLAGS@ @SDL_LIBS@

View file

@ -44,21 +44,21 @@ stdenv.mkDerivation (finalAttrs: {
outputBin = "dev"; outputBin = "dev";
# SDL3 is dlopened at runtime, leave it in runpath
dontPatchELF = true;
cmakeFlags = [ cmakeFlags = [
(lib.cmakeBool "SDL2COMPAT_TESTS" finalAttrs.finalPackage.doCheck) (lib.cmakeBool "SDL2COMPAT_TESTS" finalAttrs.finalPackage.doCheck)
(lib.cmakeFeature "CMAKE_INSTALL_RPATH" (lib.makeLibraryPath [ sdl3 ]))
]; ];
# skip timing-based tests as those are flaky
env.SDL_TESTS_QUICK = 1;
doCheck = testSupport && stdenv.buildPlatform.canExecute stdenv.hostPlatform; doCheck = testSupport && stdenv.buildPlatform.canExecute stdenv.hostPlatform;
postFixup = patches = [ ./find-headers.patch ];
if stdenv.hostPlatform.isDarwin then setupHook = ./setup-hook.sh;
''
install_name_tool -add_rpath ${lib.makeLibraryPath [ sdl3 ]} $out/lib/libSDL2.dylib
''
else
''
patchelf --add-rpath ${lib.makeLibraryPath [ sdl3 ]} $out/lib/libSDL2.so
'';
passthru = { passthru = {
tests = tests =
@ -92,7 +92,7 @@ stdenv.mkDerivation (finalAttrs: {
changelog = "https://github.com/libsdl-org/sdl2-compat/releases/tag/${finalAttrs.src.tag}"; changelog = "https://github.com/libsdl-org/sdl2-compat/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.zlib; license = lib.licenses.zlib;
maintainers = with lib.maintainers; [ nadiaholmquist ]; maintainers = with lib.maintainers; [ nadiaholmquist ];
platforms = lib.platforms.unix; platforms = lib.platforms.all;
pkgConfigModules = [ "sdl2_compat" ]; pkgConfigModules = [ "sdl2_compat" ];
}; };
}) })

View file

@ -0,0 +1,7 @@
addSDL2Path () {
if [ -e "$1/include/SDL2" ]; then
export SDL2_PATH="${SDL2_PATH-}${SDL2_PATH:+ }$1/include/SDL2"
fi
}
addEnvHooks "$hostOffset" addSDL2Path

View file

@ -7,12 +7,12 @@
stdenv.mkDerivation (finalAttrs: { stdenv.mkDerivation (finalAttrs: {
pname = "sfeed"; pname = "sfeed";
version = "2.1"; version = "2.2";
src = fetchgit { src = fetchgit {
url = "git://git.codemadness.org/sfeed"; url = "git://git.codemadness.org/sfeed";
tag = finalAttrs.version; tag = finalAttrs.version;
hash = "sha256-KVZsVCTkwyOVr37vIXbiPjQLnb9lbuIlNxpZNvHxbEo="; hash = "sha256-ULCYZYRTdrsUaL0XJd5Dxa9Cd0Hc6PVNMnnLTGs4pIo=";
}; };
buildInputs = [ ncurses ]; buildInputs = [ ncurses ];

View file

@ -10,12 +10,12 @@
buildGoModule rec { buildGoModule rec {
pname = "shopware-cli"; pname = "shopware-cli";
version = "0.5.7"; version = "0.5.9";
src = fetchFromGitHub { src = fetchFromGitHub {
repo = "shopware-cli"; repo = "shopware-cli";
owner = "FriendsOfShopware"; owner = "FriendsOfShopware";
tag = version; tag = version;
hash = "sha256-2Ld1ANokNGvA4nen5dKdZvMHzU1VvWr/28Ech3vvqfk="; hash = "sha256-js1GSaL2Xns61LBQftYe6qxRG23cqIEi1wPdmd9qCpA=";
}; };
nativeBuildInputs = [ nativeBuildInputs = [
@ -27,7 +27,7 @@ buildGoModule rec {
dart-sass dart-sass
]; ];
vendorHash = "sha256-Q2M0ia2OF5rDiqqpTaNm2NzcM7Ul8pHcKn2r00/k4jM="; vendorHash = "sha256-Slb5OShcDDjStH3PZ/9YnzpL7rtEPZg3Tf6q/Efq5zI=";
postInstall = '' postInstall = ''
installShellCompletion --cmd shopware-cli \ installShellCompletion --cmd shopware-cli \

View file

@ -0,0 +1,67 @@
{
lib,
buildNpmPackage,
fetchFromGitHub,
electron,
copyDesktopItems,
makeDesktopItem,
nix-update-script,
}:
buildNpmPackage rec {
pname = "slacky";
version = "0.0.5";
src = fetchFromGitHub {
owner = "andirsun";
repo = "Slacky";
tag = "v${version}";
hash = "sha256-nDxmzZqi7xEe4hnY6iXJg+613lSKElWxvF3w8bRDW90=";
};
npmDepsHash = "sha256-9+4cxeQw2Elug+xIgzNvpaSMgDVlBFz/+TW1jJwDm40=";
npmPackFlags = [ "--ignore-scripts" ];
nativeBuildInputs = [
electron
copyDesktopItems
];
env.ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
postInstall = ''
mkdir -p $out/share/icons
ln -s $out/lib/node_modules/slacky/build/icons/icon.png $out/share/icons/slacky.png
makeWrapper ${electron}/bin/electron $out/bin/slacky \
--add-flags $out/lib/node_modules/slacky/
'';
desktopItems = lib.singleton (makeDesktopItem {
name = "slacky";
exec = "slacky %u";
icon = "slacky";
desktopName = "Slacky";
comment = "An unofficial Slack desktop client for arm64 Linux";
startupWMClass = "com.andersonlaverde.slacky";
type = "Application";
categories = [
"Network"
"InstantMessaging"
];
mimeTypes = [
"x-scheme-handler/slack"
];
});
passthru.updateScript = nix-update-script { };
meta = {
description = "Unofficial Slack desktop client for arm64 Linux";
homepage = "https://github.com/andirsun/Slacky";
changelog = "https://github.com/andirsun/Slacky/releases/tag/v${version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ awwpotato ];
platforms = [ "aarch64-linux" ];
mainProgram = "slacky";
};
}

View file

@ -5,6 +5,7 @@
, systemd, pam , systemd, pam
, curl , curl
, enableTNC ? false, trousers, sqlite, libxml2 , enableTNC ? false, trousers, sqlite, libxml2
, enableTPM2 ? false, tpm2-tss
, enableNetworkManager ? false, networkmanager , enableNetworkManager ? false, networkmanager
, darwin , darwin
, nixosTests , nixosTests
@ -31,6 +32,7 @@ stdenv.mkDerivation rec {
buildInputs = buildInputs =
[ curl gmp python3 ldns unbound openssl pcsclite ] [ curl gmp python3 ldns unbound openssl pcsclite ]
++ lib.optionals enableTNC [ trousers sqlite libxml2 ] ++ lib.optionals enableTNC [ trousers sqlite libxml2 ]
++ lib.optional enableTPM2 tpm2-tss
++ lib.optionals stdenv.hostPlatform.isLinux [ systemd.dev pam iptables ] ++ lib.optionals stdenv.hostPlatform.isLinux [ systemd.dev pam iptables ]
++ lib.optionals stdenv.hostPlatform.isDarwin (with darwin.apple_sdk.frameworks; [ SystemConfiguration ]) ++ lib.optionals stdenv.hostPlatform.isDarwin (with darwin.apple_sdk.frameworks; [ SystemConfiguration ])
++ lib.optionals enableNetworkManager [ networkmanager glib ]; ++ lib.optionals enableNetworkManager [ networkmanager glib ];
@ -80,6 +82,8 @@ stdenv.mkDerivation rec {
"--with-tss=trousers" "--with-tss=trousers"
"--enable-aikgen" "--enable-aikgen"
"--enable-sqlite" ] "--enable-sqlite" ]
++ lib.optionals enableTPM2 [
"--enable-tpm" "--enable-tss-tss2" ]
++ lib.optionals enableNetworkManager [ ++ lib.optionals enableNetworkManager [
"--enable-nm" "--enable-nm"
"--with-nm-ca-dir=/etc/ssl/certs" ] "--with-nm-ca-dir=/etc/ssl/certs" ]

View file

@ -18,7 +18,7 @@ buildPecl {
postPhpize = '' postPhpize = ''
substituteInPlace configure \ substituteInPlace configure \
--replace 'SEARCH_PATH="/usr/local /usr"' 'SEARCH_PATH=${rdkafka}' --replace-fail 'SEARCH_PATH="/usr/local /usr"' 'SEARCH_PATH=${lib.getInclude rdkafka}'
''; '';
meta = with lib; { meta = with lib; {

View file

@ -1,6 +1,5 @@
{ {
lib, lib,
stdenv,
buildPythonPackage, buildPythonPackage,
fetchFromGitHub, fetchFromGitHub,
@ -22,14 +21,14 @@
buildPythonPackage rec { buildPythonPackage rec {
pname = "databricks-sdk"; pname = "databricks-sdk";
version = "0.45.0"; version = "0.46.0";
pyproject = true; pyproject = true;
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "databricks"; owner = "databricks";
repo = "databricks-sdk-py"; repo = "databricks-sdk-py";
tag = "v${version}"; tag = "v${version}";
hash = "sha256-SoE8MgwOhm82ymjaZQZCzw7hd5DMWxSvgaAwIGlm9cQ="; hash = "sha256-bvtIeysj3FW4Kj2WZeKSGwkqKoWIxKIzJFiduNlaBWE=";
}; };
build-system = [ build-system = [
@ -54,28 +53,23 @@ buildPythonPackage rec {
requests-mock requests-mock
]; ];
disabledTests = disabledTests = [
[ # Require internet access
# Require internet access # ValueError: default auth: cannot configure default credentials, please check...
# ValueError: default auth: cannot configure default credentials, please check... "test_azure_cli_does_not_specify_tenant_id_with_msi"
"test_azure_cli_does_not_specify_tenant_id_with_msi" "test_azure_cli_fallback"
"test_azure_cli_fallback" "test_azure_cli_user_no_management_access"
"test_azure_cli_user_no_management_access" "test_azure_cli_user_with_management_access"
"test_azure_cli_user_with_management_access" "test_azure_cli_with_warning_on_stderr"
"test_azure_cli_with_warning_on_stderr" "test_azure_cli_workspace_header_present"
"test_azure_cli_workspace_header_present" "test_config_azure_cli_host"
"test_config_azure_cli_host" "test_config_azure_cli_host_and_resource_id"
"test_config_azure_cli_host_and_resource_id" "test_config_azure_cli_host_and_resource_i_d_configuration_precedence"
"test_config_azure_cli_host_and_resource_i_d_configuration_precedence" "test_load_azure_tenant_id_404"
"test_load_azure_tenant_id_404" "test_load_azure_tenant_id_happy_path"
"test_load_azure_tenant_id_happy_path" "test_load_azure_tenant_id_no_location_header"
"test_load_azure_tenant_id_no_location_header" "test_load_azure_tenant_id_unparsable_location_header"
"test_load_azure_tenant_id_unparsable_location_header" ];
]
++ lib.optionals (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64) [
# requests.exceptions.ChunkedEncodingError: ("Connection broken: ConnectionResetError(54, 'Connection reset by peer')", ConnectionResetError(54, 'Connection reset by peer'))
"test_github_oidc_flow_works_with_azure"
];
__darwinAllowLocalNetworking = true; __darwinAllowLocalNetworking = true;

View file

@ -18,7 +18,7 @@ in
buildPythonPackage rec { buildPythonPackage rec {
pname = "dnf4"; pname = "dnf4";
version = "4.22.0"; version = "4.23.0";
format = "other"; format = "other";
outputs = [ outputs = [
@ -30,8 +30,8 @@ buildPythonPackage rec {
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "rpm-software-management"; owner = "rpm-software-management";
repo = "dnf"; repo = "dnf";
rev = version; tag = version;
hash = "sha256-I79cwK+xPmHS3z8/rKar5G5EbK6IYq0Ypq9KrShJ3sg="; hash = "sha256-qlOnFtEURhyxfsprhRaYUj141vZJp8qMjLpP1wGxikw=";
}; };
patches = [ ./fix-python-install-dir.patch ]; patches = [ ./fix-python-install-dir.patch ];

View file

@ -16,8 +16,8 @@ let
in in
buildNodejs { buildNodejs {
inherit enableNpm; inherit enableNpm;
version = "23.9.0"; version = "23.10.0";
sha256 = "c6b420bedbb049a6538c33af28abaf89011ccc879f0f0f81791675263c238f97"; sha256 = "b39e5fbd3debb8318ddea6af3e89b07dafb891421fb7ca99fbe19c99adabe5fd";
patches = patches =
[ [
./configure-emulator.patch ./configure-emulator.patch

View file

@ -7,14 +7,14 @@
}: }:
mkKdeDerivation rec { mkKdeDerivation rec {
pname = "kdevelop-pg-qt"; pname = "kdevelop-pg-qt";
version = "2.3.0"; version = "2.4.0";
# Breaks with split -dev # Breaks with split -dev
outputs = [ "out" ]; outputs = [ "out" ];
src = fetchurl { src = fetchurl {
url = "mirror://kde/stable/kdevelop-pg-qt/${version}/src/kdevelop-pg-qt-${version}.tar.xz"; url = "mirror://kde/stable/kdevelop-pg-qt/${version}/src/kdevelop-pg-qt-${version}.tar.xz";
hash = "sha256-PT7zyzlelnDmDDmepthlzHluAOUsNV7tlD++yn2nEg0="; hash = "sha256-rL62HIL116ot3PoY477l4lWRBpcL1tFG1GyV+NAnu4Y=";
}; };
extraNativeBuildInputs = [ extraNativeBuildInputs = [

View file

@ -12,16 +12,16 @@ let
variants = { variants = {
# ./update-zen.py zen # ./update-zen.py zen
zen = { zen = {
version = "6.13.5"; # zen version = "6.13.7"; # zen
suffix = "zen1"; # zen suffix = "zen1"; # zen
sha256 = "1m9lmshvc6mbiplfhrkk03vixkr2mdk09v2j5wsw1gfls9avrf2q"; # zen sha256 = "1gziphpd8lqgz21d22n0pbnbms1qb2f5ri7y2jdfigrp45sh8kz3"; # zen
isLqx = false; isLqx = false;
}; };
# ./update-zen.py lqx # ./update-zen.py lqx
lqx = { lqx = {
version = "6.13.5"; # lqx version = "6.13.7"; # lqx
suffix = "lqx1"; # lqx suffix = "lqx1"; # lqx
sha256 = "1qk6h4g91mn0l4c78jwsbhgprajd4yqm8gzzgh89rpm151kggs82"; # lqx sha256 = "0zijfh3ibdqw9vii0pzj9ld4sj0dcx7i30hpq9cw8ij1q7mp82jc"; # lqx
isLqx = true; isLqx = true;
}; };
}; };

View file

@ -8,11 +8,11 @@
}: }:
yarn2nix-moretea.mkYarnPackage { yarn2nix-moretea.mkYarnPackage {
version = "1.1.39"; version = "1.1.42";
src = fetchzip { src = fetchzip {
url = "https://registry.npmjs.org/meshcentral/-/meshcentral-1.1.39.tgz"; url = "https://registry.npmjs.org/meshcentral/-/meshcentral-1.1.42.tgz";
sha256 = "08pd52hp3kj6h0w8x5x7k7bnhq37lx6m9am3bkq80kykrfxzdima"; sha256 = "0mz03jljw37815fvdpc679b5jpzdpmzfrljclzhzw086sdrzypc3";
}; };
patches = [ patches = [
@ -24,7 +24,7 @@ yarn2nix-moretea.mkYarnPackage {
offlineCache = fetchYarnDeps { offlineCache = fetchYarnDeps {
yarnLock = ./yarn.lock; yarnLock = ./yarn.lock;
hash = "sha256-dlbg/mmJRL1aaoG2p3z/Cij0Gtdau6UcWAbtpKWYVVQ="; hash = "sha256-Q4rG6lfSZZQO7GnXRvnof/Pfmqkh4cZ34yhNgoFwAZY=";
}; };
# Tarball has CRLF line endings. This makes patching difficult, so let's convert them. # Tarball has CRLF line endings. This makes patching difficult, so let's convert them.

View file

@ -1,6 +1,6 @@
{ {
"name": "meshcentral", "name": "meshcentral",
"version": "1.1.39", "version": "1.1.42",
"keywords": [ "keywords": [
"Remote Device Management", "Remote Device Management",
"Remote Device Monitoring", "Remote Device Monitoring",

View file

@ -477,33 +477,33 @@
integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==
"@babel/core@^7.16.5": "@babel/core@^7.16.5":
version "7.26.9" version "7.26.10"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.9.tgz#71838542a4b1e49dfed353d7acbc6eb89f4a76f2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.10.tgz#5c876f83c8c4dcb233ee4b670c0606f2ac3000f9"
integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==
dependencies: dependencies:
"@ampproject/remapping" "^2.2.0" "@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.26.2" "@babel/code-frame" "^7.26.2"
"@babel/generator" "^7.26.9" "@babel/generator" "^7.26.10"
"@babel/helper-compilation-targets" "^7.26.5" "@babel/helper-compilation-targets" "^7.26.5"
"@babel/helper-module-transforms" "^7.26.0" "@babel/helper-module-transforms" "^7.26.0"
"@babel/helpers" "^7.26.9" "@babel/helpers" "^7.26.10"
"@babel/parser" "^7.26.9" "@babel/parser" "^7.26.10"
"@babel/template" "^7.26.9" "@babel/template" "^7.26.9"
"@babel/traverse" "^7.26.9" "@babel/traverse" "^7.26.10"
"@babel/types" "^7.26.9" "@babel/types" "^7.26.10"
convert-source-map "^2.0.0" convert-source-map "^2.0.0"
debug "^4.1.0" debug "^4.1.0"
gensync "^1.0.0-beta.2" gensync "^1.0.0-beta.2"
json5 "^2.2.3" json5 "^2.2.3"
semver "^6.3.1" semver "^6.3.1"
"@babel/generator@^7.26.9", "@babel/generator@^7.4.0": "@babel/generator@^7.26.10", "@babel/generator@^7.4.0":
version "7.26.9" version "7.26.10"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.9.tgz#75a9482ad3d0cc7188a537aa4910bc59db67cbca" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.10.tgz#a60d9de49caca16744e6340c3658dfef6138c3f7"
integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== integrity sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==
dependencies: dependencies:
"@babel/parser" "^7.26.9" "@babel/parser" "^7.26.10"
"@babel/types" "^7.26.9" "@babel/types" "^7.26.10"
"@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/trace-mapping" "^0.3.25"
jsesc "^3.0.2" jsesc "^3.0.2"
@ -563,13 +563,13 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72"
integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==
"@babel/helpers@^7.26.9": "@babel/helpers@^7.26.10":
version "7.26.9" version "7.26.10"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.9.tgz#28f3fb45252fc88ef2dc547c8a911c255fc9fef6" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.10.tgz#6baea3cd62ec2d0c1068778d63cb1314f6637384"
integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== integrity sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==
dependencies: dependencies:
"@babel/template" "^7.26.9" "@babel/template" "^7.26.9"
"@babel/types" "^7.26.9" "@babel/types" "^7.26.10"
"@babel/node@^7.16.5": "@babel/node@^7.16.5":
version "7.26.0" version "7.26.0"
@ -583,12 +583,12 @@
regenerator-runtime "^0.14.0" regenerator-runtime "^0.14.0"
v8flags "^3.1.1" v8flags "^3.1.1"
"@babel/parser@^7.26.9", "@babel/parser@^7.4.3": "@babel/parser@^7.26.10", "@babel/parser@^7.26.9", "@babel/parser@^7.4.3":
version "7.26.9" version "7.26.10"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.10.tgz#e9bdb82f14b97df6569b0b038edd436839c57749"
integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== integrity sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==
dependencies: dependencies:
"@babel/types" "^7.26.9" "@babel/types" "^7.26.10"
"@babel/plugin-syntax-jsx@^7.25.9": "@babel/plugin-syntax-jsx@^7.25.9":
version "7.25.9" version "7.25.9"
@ -628,23 +628,23 @@
"@babel/parser" "^7.26.9" "@babel/parser" "^7.26.9"
"@babel/types" "^7.26.9" "@babel/types" "^7.26.9"
"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.9", "@babel/traverse@^7.4.3": "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10", "@babel/traverse@^7.4.3":
version "7.26.9" version "7.26.10"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.9.tgz#4398f2394ba66d05d988b2ad13c219a2c857461a" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.10.tgz#43cca33d76005dbaa93024fae536cc1946a4c380"
integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== integrity sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==
dependencies: dependencies:
"@babel/code-frame" "^7.26.2" "@babel/code-frame" "^7.26.2"
"@babel/generator" "^7.26.9" "@babel/generator" "^7.26.10"
"@babel/parser" "^7.26.9" "@babel/parser" "^7.26.10"
"@babel/template" "^7.26.9" "@babel/template" "^7.26.9"
"@babel/types" "^7.26.9" "@babel/types" "^7.26.10"
debug "^4.3.1" debug "^4.3.1"
globals "^11.1.0" globals "^11.1.0"
"@babel/types@^7.25.9", "@babel/types@^7.26.9", "@babel/types@^7.4.0": "@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.26.9", "@babel/types@^7.4.0":
version "7.26.9" version "7.26.10"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.10.tgz#396382f6335bd4feb65741eacfc808218f859259"
integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== integrity sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==
dependencies: dependencies:
"@babel/helper-string-parser" "^7.25.9" "@babel/helper-string-parser" "^7.25.9"
"@babel/helper-validator-identifier" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9"
@ -851,9 +851,9 @@
integrity sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA== integrity sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==
"@google-cloud/promisify@^4.0.0": "@google-cloud/promisify@^4.0.0":
version "4.0.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-4.0.0.tgz#a906e533ebdd0f754dca2509933334ce58b8c8b1" resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-4.1.0.tgz#df8b060f0121c6462233f5420738dcda09c6df4a"
integrity sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g== integrity sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==
"@google-cloud/storage@^7.7.0": "@google-cloud/storage@^7.7.0":
version "7.15.2" version "7.15.2"
@ -877,9 +877,9 @@
uuid "^8.0.0" uuid "^8.0.0"
"@grpc/grpc-js@^1.10.9": "@grpc/grpc-js@^1.10.9":
version "1.12.6" version "1.13.0"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.6.tgz#a3586ffdfb6a1f5cd5b4866dec9074c4a1e65472" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.0.tgz#69c229eacb77f3468afa9d375c23dc9b694d1af9"
integrity sha512-JXUj6PI0oqqzTGvKtzOkxtpsyPRNsrmhh41TtIz/zEB6J+AUiZZ0dxWzcMwO9Ns5rmSPuMdghlTbUuqIM48d3Q== integrity sha512-pMuxInZjUnUkgMT2QLZclRqwk2ykJbIU05aZgPgJYXEpN9+2I7z7aNwcjWZSycRPl232FfhPszyBFJyOxTHNog==
dependencies: dependencies:
"@grpc/proto-loader" "^0.7.13" "@grpc/proto-loader" "^0.7.13"
"@js-sdsl/ordered-map" "^4.4.2" "@js-sdsl/ordered-map" "^4.4.2"
@ -1635,9 +1635,9 @@
integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
"@types/node@*", "@types/node@>=13.7.0", "@types/node@^22.0.1", "@types/node@^22.5.4": "@types/node@*", "@types/node@>=13.7.0", "@types/node@^22.0.1", "@types/node@^22.5.4":
version "22.13.5" version "22.13.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.5.tgz#23add1d71acddab2c6a4d31db89c0f98d330b511" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4"
integrity sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg== integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==
dependencies: dependencies:
undici-types "~6.20.0" undici-types "~6.20.0"
@ -1707,9 +1707,9 @@
"@types/webidl-conversions" "*" "@types/webidl-conversions" "*"
"@types/ws@^8.5.3": "@types/ws@^8.5.3":
version "8.5.14" version "8.18.0"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.14.tgz#93d44b268c9127d96026cf44353725dd9b6c3c21" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.0.tgz#8a2ec491d6f0685ceaab9a9b7ff44146236993b5"
integrity sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw== integrity sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
@ -2362,9 +2362,9 @@ axios@^0.27.2:
form-data "^4.0.0" form-data "^4.0.0"
axios@^1.2.2, axios@^1.7.4: axios@^1.2.2, axios@^1.7.4:
version "1.8.1" version "1.8.3"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.1.tgz#7c118d2146e9ebac512b7d1128771cdd738d11e3" resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.3.tgz#9ebccd71c98651d547162a018a1a95a4b4ed4de8"
integrity sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g== integrity sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==
dependencies: dependencies:
follow-redirects "^1.15.6" follow-redirects "^1.15.6"
form-data "^4.0.0" form-data "^4.0.0"
@ -2722,13 +2722,13 @@ call-bind@^1.0.7, call-bind@^1.0.8:
get-intrinsic "^1.2.4" get-intrinsic "^1.2.4"
set-function-length "^1.2.2" set-function-length "^1.2.2"
call-bound@^1.0.2, call-bound@^1.0.3: call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4:
version "1.0.3" version "1.0.4"
resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
dependencies: dependencies:
call-bind-apply-helpers "^1.0.1" call-bind-apply-helpers "^1.0.2"
get-intrinsic "^1.2.6" get-intrinsic "^1.3.0"
camel-case@^3.0.0: camel-case@^3.0.0:
version "3.0.0" version "3.0.0"
@ -2744,9 +2744,9 @@ camelcase@^5.0.0:
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
caniuse-lite@^1.0.30001688: caniuse-lite@^1.0.30001688:
version "1.0.30001701" version "1.0.30001703"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz#ad9c90301f7153cf6b3314d16cc30757285bf9e7" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz#977cb4920598c158f491ecf4f4f2cfed9e354718"
integrity sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw== integrity sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==
caseless@~0.12.0: caseless@~0.12.0:
version "0.12.0" version "0.12.0"
@ -3055,9 +3055,9 @@ core-js@^2.4.0:
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.30.2: core-js@^3.30.2:
version "3.40.0" version "3.41.0"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.40.0.tgz#2773f6b06877d8eda102fc42f828176437062476" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.41.0.tgz#57714dafb8c751a6095d028a7428f1fb5834a776"
integrity sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ== integrity sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==
core-util-is@1.0.2: core-util-is@1.0.2:
version "1.0.2" version "1.0.2"
@ -3459,9 +3459,9 @@ ee-first@1.1.1:
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
electron-to-chromium@^1.5.73: electron-to-chromium@^1.5.73:
version "1.5.109" version "1.5.114"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.109.tgz#905a573d2b4cbb31412a2de6267fb22cf45e097e" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.114.tgz#f2bb4fda80a7db4ea273565e75b0ebbe19af0ac3"
integrity sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ== integrity sha512-DFptFef3iktoKlFQK/afbo274/XNWD00Am0xa7M8FZUepHlHT8PEuiNBoRfFHbH1okqN58AlhbJ4QTkcnXorjA==
emoji-regex@^7.0.1: emoji-regex@^7.0.1:
version "7.0.3" version "7.0.3"
@ -3982,7 +3982,7 @@ follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.14.9, fo
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
for-each@^0.3.3: for-each@^0.3.3, for-each@^0.3.5:
version "0.3.5" version "0.3.5"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47"
integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==
@ -4184,7 +4184,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7: get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
@ -5568,9 +5568,9 @@ lru-memoizer@^2.2.0:
lru-cache "6.0.0" lru-cache "6.0.0"
lru.min@^1.0.0: lru.min@^1.0.0:
version "1.1.1" version "1.1.2"
resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.1.tgz#146e01e3a183fa7ba51049175de04667d5701f0e" resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.2.tgz#01ce1d72cc50c7faf8bd1f809ebf05d4331021eb"
integrity sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q== integrity sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==
ltx@^3.1.1: ltx@^3.1.1:
version "3.1.2" version "3.1.2"
@ -5970,9 +5970,9 @@ nan@^2.13.2, nan@^2.19.0, nan@^2.20.0:
integrity sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ== integrity sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==
nanoid@^3.3.8: nanoid@^3.3.8:
version "3.3.8" version "3.3.9"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.9.tgz#e0097d8e026b3343ff053e9ccd407360a03f503a"
integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== integrity sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==
napi-build-utils@^2.0.0: napi-build-utils@^2.0.0:
version "2.0.0" version "2.0.0"
@ -6186,9 +6186,9 @@ number-is-nan@^1.0.0:
integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
nwsapi@^2.2.4: nwsapi@^2.2.4:
version "2.2.16" version "2.2.18"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.16.tgz#177760bba02c351df1d2644e220c31dfec8cdb43" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.18.tgz#3c4d7927e1ef4d042d319438ecfda6cd81b7ee41"
integrity sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ== integrity sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==
nyc@^14.1.1: nyc@^14.1.1:
version "14.1.1" version "14.1.1"
@ -6232,9 +6232,9 @@ oauth-sign@~0.9.0:
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
oauth@0.10.x: oauth@0.10.x:
version "0.10.0" version "0.10.2"
resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.10.0.tgz#3551c4c9b95c53ea437e1e21e46b649482339c58" resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.10.2.tgz#fd7139b0ce1a1037bd11fa4e236afc588132418c"
integrity sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q== integrity sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==
oauth@0.9.x: oauth@0.9.x:
version "0.9.15" version "0.9.15"
@ -6645,14 +6645,14 @@ pg-int8@1.0.1:
integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
pg-pool@^3.7.0: pg-pool@^3.7.0:
version "3.7.1" version "3.8.0"
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.1.tgz#d1aaf618618d8f878acf185e86084928b8cd5b3c" resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.8.0.tgz#e6bce7fc4506a8d6106551363fc5283e5445b776"
integrity sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw== integrity sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw==
pg-protocol@^1.7.0: pg-protocol@^1.7.0:
version "1.7.1" version "1.8.0"
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.1.tgz#aad61a6f927b51e89dcf721408b76c0e536d43dc" resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.8.0.tgz#c707101dd07813868035a44571488e4b98639d48"
integrity sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ== integrity sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==
pg-types@^2.1.0: pg-types@^2.1.0:
version "2.2.0" version "2.2.0"
@ -8759,14 +8759,15 @@ which-module@^2.0.0:
integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.2: which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.2:
version "1.1.18" version "1.1.19"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956"
integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==
dependencies: dependencies:
available-typed-arrays "^1.0.7" available-typed-arrays "^1.0.7"
call-bind "^1.0.8" call-bind "^1.0.8"
call-bound "^1.0.3" call-bound "^1.0.4"
for-each "^0.3.3" for-each "^0.3.5"
get-proto "^1.0.1"
gopd "^1.2.0" gopd "^1.2.0"
has-tostringtag "^1.0.2" has-tostringtag "^1.0.2"

View file

@ -1,25 +0,0 @@
{
lib,
htop,
fetchFromGitHub,
}:
htop.overrideAttrs (oldAttrs: rec {
pname = "htop-vim";
version = "unstable-2023-02-16";
src = fetchFromGitHub {
owner = "KoffeinFlummi";
repo = pname;
rev = "b2b58f8f152343b70c33b79ba51a298024278621";
hash = "sha256-ZfdBAlnjoy8g6xwrR/i2+dGldMOfLlX6DRlNqB8pkGM=";
};
meta = with lib; {
inherit (oldAttrs.meta) platforms license;
description = "Interactive process viewer for Linux, with vim-style keybindings";
homepage = "https://github.com/KoffeinFlummi/htop-vim";
maintainers = with maintainers; [ thiagokokada ];
mainProgram = "htop";
};
})

View file

@ -2443,8 +2443,6 @@ with pkgs;
materialx = with python3Packages; toPythonApplication materialx; materialx = with python3Packages; toPythonApplication materialx;
megasync = libsForQt5.callPackage ../applications/misc/megasync { };
# while building documentation meson may want to run binaries for host # while building documentation meson may want to run binaries for host
# which needs an emulator # which needs an emulator
# example of an error which this fixes # example of an error which this fixes
@ -5031,6 +5029,7 @@ with pkgs;
stutter = haskell.lib.compose.justStaticExecutables haskellPackages.stutter; stutter = haskell.lib.compose.justStaticExecutables haskellPackages.stutter;
strongswanTNC = strongswan.override { enableTNC = true; }; strongswanTNC = strongswan.override { enableTNC = true; };
strongswanTPM = strongswan.override { enableTPM2 = true; };
strongswanNM = strongswan.override { enableNetworkManager = true; }; strongswanNM = strongswan.override { enableNetworkManager = true; };
stylish-haskell = haskell.lib.compose.justStaticExecutables haskellPackages.stylish-haskell; stylish-haskell = haskell.lib.compose.justStaticExecutables haskellPackages.stylish-haskell;
@ -11935,8 +11934,6 @@ with pkgs;
inherit (darwin) IOKit; inherit (darwin) IOKit;
}; };
htop-vim = callPackage ../tools/system/htop/htop-vim.nix { };
humility = callPackage ../development/tools/rust/humility { humility = callPackage ../development/tools/rust/humility {
inherit (darwin.apple_sdk.frameworks) AppKit; inherit (darwin.apple_sdk.frameworks) AppKit;
}; };

View file

@ -6660,6 +6660,7 @@ self: super: with self; {
inherit python numpy; inherit python numpy;
enablePython = true; enablePython = true;
enableRtk = false; enableRtk = false;
stdenv = if stdenv.cc.isGNU then pkgs.stdenvAdapters.useLibsFrom stdenv pkgs.gcc12Stdenv else stdenv;
}); });