Merge staging-next into staging

This commit is contained in:
github-actions[bot] 2024-08-30 12:05:38 +00:00 committed by GitHub
commit 758138647a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
65 changed files with 1107 additions and 252 deletions

View File

@ -9258,6 +9258,12 @@
github = "jankaifer";
githubId = 12820484;
};
janlikar = {
name = "Jan Likar";
email = "jan.likar@protonmail.com";
github = "janlikar";
githubId = 4228250;
};
jansol = {
email = "jan.solanti@paivola.fi";
github = "jansol";

View File

@ -315,6 +315,7 @@ with lib.maintainers;
leona
osnyx
ma27
laalsaas
];
scope = "Team for Flying Circus employees who collectively maintain packages.";
shortName = "Flying Circus employees";

View File

@ -100,6 +100,9 @@ modified using `usermod`. Unix groups can be managed using `groupadd`,
::: {.note}
This is experimental.
Please consider using [Userborn](#sec-userborn) over systemd-sysusers as it's
more feature complete.
:::
Instead of using a custom perl script to create users and groups, you can use
@ -112,3 +115,43 @@ systemd-sysusers:
```
The primary benefit of this is to remove a dependency on perl.
## Manage users and groups with `userborn` {#sec-userborn}
::: {.note}
This is experimental.
:::
Like systemd-sysusers, Userborn adoesn't depend on Perl but offers some more
advantages over systemd-sysusers:
1. It can create "normal" users (with a GID >= 1000).
2. It can update some information about users. Most notably it can update their
passwords.
3. It will warn when users use an insecure or unsupported password hashing
scheme.
Userborn is the recommended way to manage users if you don't want to rely on
the Perl script. It aims to eventually replace the Perl script by default.
You can enable Userborn via:
```nix
services.userborn.enable = true;
```
You can configure Userborn to store the password files
(`/etc/{group,passwd,shadow}`) outside of `/etc` and symlink them from this
location to `/etc`:
```nix
services.userborn.passwordFilesLocation = "/persistent/etc";
```
This is useful when you store `/etc` on a `tmpfs` or if `/etc` is immutable
(e.g. when using `system.etc.overlay.mutable = false;`). In the latter case the
original files are by default stored in `/var/lib/nixos`.
Userborn implements immutable users by re-mounting the password files
read-only. This means that unlike when using the Perl script, trying to add a
new user (e.g. via `useradd`) will fail right away.

View File

@ -41,6 +41,13 @@
- [Quickwit](https://quickwit.io), sub-second search & analytics engine on cloud storage. Available as [services.quickwit](options.html#opt-services.quickwit).
- [Userborn](https://github.com/nikstur/userborn), a service for declarative
user management. This can be used instead of the `update-users-groups.pl`
Perl script and instead of systemd-sysusers. To achieve a system without
Perl, this is the now recommended tool over systemd-sysusers because it can
alos create normal users and change passwords. Available as
[services.userborn](#opt-services.userborn.enable)
- [Flood](https://flood.js.org/), a beautiful WebUI for various torrent clients. Available as [services.flood](options.html#opt-services.flood).
- [Firefly-iii Data Importer](https://github.com/firefly-iii/data-importer), a data importer for Firefly-III. Available as [services.firefly-iii-data-importer](options.html#opt-services.firefly-iii-data-importer)

View File

@ -1348,6 +1348,7 @@
./services/system/systembus-notify.nix
./services/system/systemd-lock-handler.nix
./services/system/uptimed.nix
./services/system/userborn.nix
./services/system/zram-generator.nix
./services/torrent/deluge.nix
./services/torrent/flexget.nix

View File

@ -12,7 +12,7 @@
# Remove perl from activation
boot.initrd.systemd.enable = lib.mkDefault true;
system.etc.overlay.enable = lib.mkDefault true;
systemd.sysusers.enable = lib.mkDefault true;
services.userborn.enable = lib.mkDefault true;
# Random perl remnants
system.disableInstallerTools = lib.mkDefault true;

View File

@ -0,0 +1,183 @@
{
utils,
config,
lib,
pkgs,
...
}:
let
cfg = config.services.userborn;
userCfg = config.users;
userbornConfig = {
groups = lib.mapAttrsToList (username: opts: {
inherit (opts) name gid members;
}) config.users.groups;
users = lib.mapAttrsToList (username: opts: {
inherit (opts)
name
uid
group
description
home
password
hashedPassword
hashedPasswordFile
initialPassword
initialHashedPassword
;
isNormal = opts.isNormalUser;
shell = utils.toShellPath opts.shell;
}) config.users.users;
};
userbornConfigJson = pkgs.writeText "userborn.json" (builtins.toJSON userbornConfig);
immutableEtc = config.system.etc.overlay.enable && !config.system.etc.overlay.mutable;
# The filenames created by userborn.
passwordFiles = [
"group"
"passwd"
"shadow"
];
in
{
options.services.userborn = {
enable = lib.mkEnableOption "userborn";
package = lib.mkPackageOption pkgs "userborn" { };
passwordFilesLocation = lib.mkOption {
type = lib.types.str;
default = if immutableEtc then "/var/lib/nixos" else "/etc";
defaultText = lib.literalExpression ''if immutableEtc then "/var/lib/nixos" else "/etc"'';
description = ''
The location of the original password files.
If this is not `/etc`, the files are symlinked from this location to `/etc`.
The primary motivation for this is an immutable `/etc`, where we cannot
write the files directly to `/etc`.
However this an also serve other use cases, e.g. when `/etc` is on a `tmpfs`.
'';
};
};
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = !(config.systemd.sysusers.enable && cfg.enable);
message = "You cannot use systemd-sysusers and Userborn at the same time";
}
{
assertion = config.system.activationScripts.users == "";
message = "system.activationScripts.users has to be empty to use userborn";
}
{
assertion = immutableEtc -> (cfg.passwordFilesLocation != "/etc");
message = "When `system.etc.overlay.mutable = false`, `services.userborn.passwordFilesLocation` cannot be set to `/etc`";
}
];
system.activationScripts.users = lib.mkForce "";
system.activationScripts.hashes = lib.mkForce "";
systemd = {
# Create home directories, do not create /var/empty even if that's a user's
# home.
tmpfiles.settings.home-directories = lib.mapAttrs' (
username: opts:
lib.nameValuePair opts.home {
d = {
mode = opts.homeMode;
user = username;
inherit (opts) group;
};
}
) (lib.filterAttrs (_username: opts: opts.home != "/var/empty") userCfg.users);
services.userborn = {
wantedBy = [ "sysinit.target" ];
requiredBy = [ "sysinit-reactivation.target" ];
after = [
"systemd-remount-fs.service"
"systemd-tmpfiles-setup-dev-early.service"
];
before = [
"systemd-tmpfiles-setup-dev.service"
"sysinit.target"
"shutdown.target"
"sysinit-reactivation.target"
];
conflicts = [ "shutdown.target" ];
restartTriggers = [
userbornConfigJson
cfg.passwordFilesLocation
];
# This way we don't have to re-declare all the dependencies to other
# services again.
aliases = [ "systemd-sysusers.service" ];
unitConfig = {
Description = "Manage Users and Groups";
DefaultDependencies = false;
};
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
TimeoutSec = "90s";
ExecStart = "${lib.getExe cfg.package} ${userbornConfigJson} ${cfg.passwordFilesLocation}";
ExecStartPre = lib.mkMerge [
(lib.mkIf (!config.system.etc.overlay.mutable) [
"${pkgs.coreutils}/bin/mkdir -p ${cfg.passwordFilesLocation}"
])
# Make the source files writable before executing userborn.
(lib.mkIf (!userCfg.mutableUsers) (
lib.map (file: "-${pkgs.util-linux}/bin/umount ${cfg.passwordFilesLocation}/${file}") passwordFiles
))
];
# Make the source files read-only after userborn has finished.
ExecStartPost = lib.mkIf (!userCfg.mutableUsers) (
lib.map (
file:
"${pkgs.util-linux}/bin/mount --bind -o ro ${cfg.passwordFilesLocation}/${file} ${cfg.passwordFilesLocation}/${file}"
) passwordFiles
);
};
};
};
# Statically create the symlinks to passwordFilesLocation when they're not
# inside /etc because we will not be able to do it at runtime in case of an
# immutable /etc!
environment.etc = lib.mkIf (cfg.passwordFilesLocation != "/etc") (
lib.listToAttrs (
lib.map (
file:
lib.nameValuePair file {
source = "${cfg.passwordFilesLocation}/${file}";
mode = "direct-symlink";
}
) passwordFiles
)
);
};
meta.maintainers = with lib.maintainers; [ nikstur ];
}

View File

@ -19,8 +19,8 @@
message = "`system.etc.overlay.enable` requires `boot.initrd.systemd.enable`";
}
{
assertion = (!config.system.etc.overlay.mutable) -> config.systemd.sysusers.enable;
message = "`system.etc.overlay.mutable = false` requires `systemd.sysusers.enable`";
assertion = (!config.system.etc.overlay.mutable) -> (config.systemd.sysusers.enable || config.services.userborn.enable);
message = "`!system.etc.overlay.mutable` requires `systemd.sysusers.enable` or `services.userborn.enable`";
}
{
assertion = lib.versionAtLeast config.boot.kernelPackages.kernel.version "6.6";

View File

@ -11,7 +11,6 @@ let
'';
in
{
###### interface
@ -35,13 +34,9 @@ in
config = lib.mkIf cfg.enable {
assertions = [{
assertion = pkgs.stdenv.hostPlatform.isx86;
message = "Azure not currently supported on ${pkgs.stdenv.hostPlatform.system}";
}
{
assertion = config.networking.networkmanager.enable == false;
message = "Windows Azure Linux Agent is not compatible with NetworkManager";
}];
assertion = config.networking.networkmanager.enable == false;
message = "Windows Azure Linux Agent is not compatible with NetworkManager";
}];
boot.initrd.kernelModules = [ "ata_piix" ];
networking.firewall.allowedUDPPorts = [ 68 ];

View File

@ -1,67 +1,85 @@
{ lib, pkgs, ... }:
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.virtualisation.azure;
mlxDrivers = [ "mlx4_en" "mlx4_core" "mlx5_core" ];
in
{
imports = [ ../profiles/headless.nix ];
require = [ ./azure-agent.nix ];
virtualisation.azure.agent.enable = true;
boot.kernelParams = [ "console=ttyS0" "earlyprintk=ttyS0" "rootdelay=300" "panic=1" "boot.panic_on_fail" ];
boot.initrd.kernelModules = [ "hv_vmbus" "hv_netvsc" "hv_utils" "hv_storvsc" ];
# Generate a GRUB menu.
boot.loader.grub.device = "/dev/sda";
boot.loader.timeout = 0;
boot.growPartition = true;
# Don't put old configurations in the GRUB menu. The user has no
# way to select them anyway.
boot.loader.grub.configurationLimit = 0;
fileSystems."/" = {
device = "/dev/disk/by-label/nixos";
fsType = "ext4";
autoResize = true;
options.virtualisation.azure = {
acceleratedNetworking = mkOption {
default = false;
description = "Whether the machine's network interface has enabled accelerated networking.";
};
};
# Allow root logins only using the SSH key that the user specified
# at instance creation time, ping client connections to avoid timeouts
services.openssh.enable = true;
services.openssh.settings.PermitRootLogin = "prohibit-password";
services.openssh.settings.ClientAliveInterval = 180;
imports = [
../profiles/headless.nix
./azure-agent.nix
];
# Force getting the hostname from Azure
networking.hostName = mkDefault "";
config = {
virtualisation.azure.agent.enable = true;
# Always include cryptsetup so that NixOps can use it.
# sg_scan is needed to finalize disk removal on older kernels
environment.systemPackages = [ pkgs.cryptsetup pkgs.sg3_utils ];
boot.kernelParams = [ "console=ttyS0" "earlyprintk=ttyS0" "rootdelay=300" "panic=1" "boot.panic_on_fail" ];
boot.initrd.kernelModules = [ "hv_vmbus" "hv_netvsc" "hv_utils" "hv_storvsc" ];
boot.initrd.availableKernelModules = lib.optionals cfg.acceleratedNetworking mlxDrivers;
networking.usePredictableInterfaceNames = false;
# Accelerated networking
systemd.network.networks."99-azure-unmanaged-devices.network" = lib.mkIf cfg.acceleratedNetworking {
matchConfig.Driver = mlxDrivers;
linkConfig.Unmanaged = "yes";
};
networking.networkmanager.unmanaged = lib.mkIf cfg.acceleratedNetworking
(builtins.map (drv: "driver:${drv}") mlxDrivers);
services.udev.extraRules = ''
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:0", ATTR{removable}=="0", SYMLINK+="disk/by-lun/0",
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:1", ATTR{removable}=="0", SYMLINK+="disk/by-lun/1",
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:2", ATTR{removable}=="0", SYMLINK+="disk/by-lun/2"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:3", ATTR{removable}=="0", SYMLINK+="disk/by-lun/3"
# Generate a GRUB menu.
boot.loader.grub.device = "/dev/sda";
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:4", ATTR{removable}=="0", SYMLINK+="disk/by-lun/4"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:5", ATTR{removable}=="0", SYMLINK+="disk/by-lun/5"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:6", ATTR{removable}=="0", SYMLINK+="disk/by-lun/6"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:7", ATTR{removable}=="0", SYMLINK+="disk/by-lun/7"
boot.growPartition = true;
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:8", ATTR{removable}=="0", SYMLINK+="disk/by-lun/8"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:9", ATTR{removable}=="0", SYMLINK+="disk/by-lun/9"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:10", ATTR{removable}=="0", SYMLINK+="disk/by-lun/10"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:11", ATTR{removable}=="0", SYMLINK+="disk/by-lun/11"
fileSystems."/" = {
device = "/dev/disk/by-label/nixos";
fsType = "ext4";
autoResize = true;
};
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:12", ATTR{removable}=="0", SYMLINK+="disk/by-lun/12"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:13", ATTR{removable}=="0", SYMLINK+="disk/by-lun/13"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:14", ATTR{removable}=="0", SYMLINK+="disk/by-lun/14"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:15", ATTR{removable}=="0", SYMLINK+="disk/by-lun/15"
# Allow root logins only using the SSH key that the user specified
# at instance creation time, ping client connections to avoid timeouts
services.openssh.enable = true;
services.openssh.settings.PermitRootLogin = "prohibit-password";
services.openssh.settings.ClientAliveInterval = 180;
'';
# Force getting the hostname from Azure
networking.hostName = mkDefault "";
# Always include cryptsetup so that NixOps can use it.
# sg_scan is needed to finalize disk removal on older kernels
environment.systemPackages = [ pkgs.cryptsetup pkgs.sg3_utils ];
networking.usePredictableInterfaceNames = false;
services.udev.extraRules = ''
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:0", ATTR{removable}=="0", SYMLINK+="disk/by-lun/0",
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:1", ATTR{removable}=="0", SYMLINK+="disk/by-lun/1",
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:2", ATTR{removable}=="0", SYMLINK+="disk/by-lun/2"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:3", ATTR{removable}=="0", SYMLINK+="disk/by-lun/3"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:4", ATTR{removable}=="0", SYMLINK+="disk/by-lun/4"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:5", ATTR{removable}=="0", SYMLINK+="disk/by-lun/5"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:6", ATTR{removable}=="0", SYMLINK+="disk/by-lun/6"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:7", ATTR{removable}=="0", SYMLINK+="disk/by-lun/7"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:8", ATTR{removable}=="0", SYMLINK+="disk/by-lun/8"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:9", ATTR{removable}=="0", SYMLINK+="disk/by-lun/9"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:10", ATTR{removable}=="0", SYMLINK+="disk/by-lun/10"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:11", ATTR{removable}=="0", SYMLINK+="disk/by-lun/11"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:12", ATTR{removable}=="0", SYMLINK+="disk/by-lun/12"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:13", ATTR{removable}=="0", SYMLINK+="disk/by-lun/13"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:14", ATTR{removable}=="0", SYMLINK+="disk/by-lun/14"
ENV{DEVTYPE}=="disk", KERNEL!="sda" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", KERNELS=="?:0:0:15", ATTR{removable}=="0", SYMLINK+="disk/by-lun/15"
'';
};
}

View File

@ -7,8 +7,8 @@ in
{
imports = [ ./azure-common.nix ];
options = {
virtualisation.azureImage.diskSize = mkOption {
options.virtualisation.azureImage = {
diskSize = mkOption {
type = with types; either (enum [ "auto" ]) int;
default = "auto";
example = 2048;
@ -16,14 +16,34 @@ in
Size of disk image. Unit is MB.
'';
};
virtualisation.azureImage.contents = mkOption {
bootSize = mkOption {
type = types.int;
default = 256;
description = ''
ESP partition size. Unit is MB.
Only effective when vmGeneration is `v2`.
'';
};
contents = mkOption {
type = with types; listOf attrs;
default = [ ];
description = ''
Extra contents to add to the image.
'';
};
vmGeneration = mkOption {
type = with types; enum [ "v1" "v2" ];
default = "v1";
description = ''
VM Generation to use.
For v2, secure boot needs to be turned off during creation.
'';
};
};
config = {
system.build.azureImage = import ../../lib/make-disk-image.nix {
name = "azure-image";
@ -33,9 +53,12 @@ in
'';
configFile = ./azure-config-user.nix;
format = "raw";
bootSize = "${toString cfg.bootSize}M";
partitionTableType = if cfg.vmGeneration == "v2" then "efi" else "legacy";
inherit (cfg) diskSize contents;
inherit config lib pkgs;
};
};
}

View File

@ -1060,6 +1060,11 @@ in {
uptime-kuma = handleTest ./uptime-kuma.nix {};
urn-timer = handleTest ./urn-timer.nix {};
usbguard = handleTest ./usbguard.nix {};
userborn = runTest ./userborn.nix;
userborn-mutable-users = runTest ./userborn-mutable-users.nix;
userborn-immutable-users = runTest ./userborn-immutable-users.nix;
userborn-mutable-etc = runTest ./userborn-mutable-etc.nix;
userborn-immutable-etc = runTest ./userborn-immutable-etc.nix;
user-activation-scripts = handleTest ./user-activation-scripts.nix {};
user-expiry = runTest ./user-expiry.nix;
user-home-mode = handleTest ./user-home-mode.nix {};

View File

@ -0,0 +1,70 @@
{ lib, ... }:
let
normaloHashedPassword = "$y$j9T$IEWqhKtWg.r.8fVkSEF56.$iKNxdMC6hOAQRp6eBtYvBk4c7BGpONXeZMqc8I/LM46";
common = {
services.userborn.enable = true;
boot.initrd.systemd.enable = true;
system.etc.overlay = {
enable = true;
mutable = false;
};
};
in
{
name = "userborn-immutable-etc";
meta.maintainers = with lib.maintainers; [ nikstur ];
nodes.machine =
{ config, ... }:
{
imports = [ common ];
users = {
users = {
normalo = {
isNormalUser = true;
hashedPassword = normaloHashedPassword;
};
};
};
specialisation.new-generation = {
inheritParentConfig = false;
configuration = {
nixpkgs = {
inherit (config.nixpkgs) hostPlatform;
};
imports = [ common ];
users.users = {
new-normalo = {
isNormalUser = true;
};
};
};
};
};
testScript = ''
machine.wait_for_unit("userborn.service")
with subtest("normalo user is created"):
assert "${normaloHashedPassword}" in machine.succeed("getent shadow normalo"), "normalo user password is not correct"
machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
with subtest("normalo user is disabled"):
print(machine.succeed("getent shadow normalo"))
assert "!*" in machine.succeed("getent shadow normalo"), "normalo user is not disabled"
with subtest("new-normalo user is created after switching to new generation"):
print(machine.succeed("getent passwd new-normalo"))
'';
}

View File

@ -0,0 +1,75 @@
{ lib, ... }:
let
normaloHashedPassword = "$y$j9T$IEWqhKtWg.r.8fVkSEF56.$iKNxdMC6hOAQRp6eBtYvBk4c7BGpONXeZMqc8I/LM46";
common = {
services.userborn.enable = true;
users.mutableUsers = false;
};
in
{
name = "userborn-immutable-users";
meta.maintainers = with lib.maintainers; [ nikstur ];
nodes.machine =
{ config, ... }:
{
imports = [ common ];
users = {
users = {
normalo = {
isNormalUser = true;
hashedPassword = normaloHashedPassword;
};
};
};
specialisation.new-generation = {
inheritParentConfig = false;
configuration = {
nixpkgs = {
inherit (config.nixpkgs) hostPlatform;
};
imports = [ common ];
users.users = {
new-normalo = {
isNormalUser = true;
};
};
};
};
};
testScript = ''
machine.wait_for_unit("userborn.service")
with subtest("normalo user is created"):
assert "${normaloHashedPassword}" in machine.succeed("getent shadow normalo"), "normalo user password is not correct"
with subtest("Fail to add new user manually"):
machine.fail("useradd manual-normalo")
with subtest("Fail to add delete user manually"):
machine.fail("userdel normalo")
machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
with subtest("normalo user is disabled"):
print(machine.succeed("getent shadow normalo"))
assert "!*" in machine.succeed("getent shadow normalo"), "normalo user is not disabled"
with subtest("new-normalo user is created after switching to new generation"):
print(machine.succeed("getent passwd new-normalo"))
with subtest("Still fail to add new user manually"):
machine.fail("useradd again-normalo")
'';
}

View File

@ -0,0 +1,70 @@
{ lib, ... }:
let
normaloHashedPassword = "$y$j9T$IEWqhKtWg.r.8fVkSEF56.$iKNxdMC6hOAQRp6eBtYvBk4c7BGpONXeZMqc8I/LM46";
common = {
services.userborn.enable = true;
boot.initrd.systemd.enable = true;
system.etc.overlay = {
enable = true;
mutable = true;
};
};
in
{
name = "userborn-mutable-etc";
meta.maintainers = with lib.maintainers; [ nikstur ];
nodes.machine =
{ config, ... }:
{
imports = [ common ];
users = {
users = {
normalo = {
isNormalUser = true;
hashedPassword = normaloHashedPassword;
};
};
};
specialisation.new-generation = {
inheritParentConfig = false;
configuration = {
nixpkgs = {
inherit (config.nixpkgs) hostPlatform;
};
imports = [ common ];
users.users = {
new-normalo = {
isNormalUser = true;
};
};
};
};
};
testScript = ''
machine.wait_for_unit("userborn.service")
with subtest("normalo user is created"):
assert "${normaloHashedPassword}" in machine.succeed("getent shadow normalo"), "normalo user password is not correct"
machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
with subtest("normalo user is disabled"):
print(machine.succeed("getent shadow normalo"))
assert "!*" in machine.succeed("getent shadow normalo"), "normalo user is not disabled"
with subtest("new-normalo user is created after switching to new generation"):
print(machine.succeed("getent passwd new-normalo"))
'';
}

View File

@ -0,0 +1,76 @@
{ lib, ... }:
let
normaloHashedPassword = "$y$j9T$IEWqhKtWg.r.8fVkSEF56.$iKNxdMC6hOAQRp6eBtYvBk4c7BGpONXeZMqc8I/LM46";
common = {
services.userborn.enable = true;
users.mutableUsers = true;
};
in
{
name = "userborn-mutable-users";
meta.maintainers = with lib.maintainers; [ nikstur ];
nodes.machine =
{ config, ... }:
{
imports = [ common ];
users = {
mutableUsers = true;
users = {
normalo = {
isNormalUser = true;
hashedPassword = normaloHashedPassword;
};
};
};
specialisation.new-generation = {
inheritParentConfig = false;
configuration = {
nixpkgs = {
inherit (config.nixpkgs) hostPlatform;
};
imports = [ common ];
users.users = {
new-normalo = {
isNormalUser = true;
};
};
};
};
};
testScript = ''
machine.wait_for_unit("userborn.service")
with subtest("normalo user is created"):
assert 1000 == int(machine.succeed("id --user normalo")), "normalo user doesn't have UID 1000"
assert "${normaloHashedPassword}" in machine.succeed("getent shadow normalo"), "normalo user password is not correct"
with subtest("Add new user manually"):
machine.succeed("useradd manual-normalo")
assert 1001 == int(machine.succeed("id --user manual-normalo")), "manual-normalo user doesn't have UID 1001"
with subtest("Delete manual--normalo user manually"):
machine.succeed("userdel manual-normalo")
machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
with subtest("normalo user is disabled"):
print(machine.succeed("getent shadow normalo"))
assert "!*" in machine.succeed("getent shadow normalo"), "normalo user is not disabled"
with subtest("new-normalo user is created after switching to new generation"):
print(machine.succeed("getent passwd new-normalo"))
assert 1001 == int(machine.succeed("id --user new-normalo")), "new-normalo user doesn't have UID 1001"
'';
}

127
nixos/tests/userborn.nix Normal file
View File

@ -0,0 +1,127 @@
{ lib, ... }:
let
# All passwords are "test"
rootHashedPasswordFile = "$y$j9T$6ueoTO5y7vvFsGvpQJEEa.$vubxgBiMnkTCtRtPD3hNiZHa7Nm1WsJeE9QomYqSRXB";
updatedRootHashedPassword = "$y$j9T$pBCO9N1FRF1rSl6V15n9n/$1JmRLEYPO7TRCx43cvLO19u59WA/oqTEhmSR4wrhzr.";
normaloPassword = "test";
updatedNormaloHashedPassword = "$y$j9T$IEWqhKtWg.r.8fVkSEF56.$iKNxdMC6hOAQRp6eBtYvBk4c7BGpONXeZMqc8I/LM46";
sysuserInitialHashedPassword = "$y$j9T$Kb6jGrk41hudTZpNjazf11$iw7fZXrewC6JxRaGPz7/gPXDZ.Z1VWsupvy81Hi1XiD";
updatedSysuserInitialHashedPassword = "$y$j9T$kUBVhgOdSjymSfwfRVja70$eqCwWzVsz0fI0Uc6JsdD2CYMCpfJcErqnIqva2JCi1D";
newNormaloHashedPassword = "$y$j9T$UFBMWbGjjVola0YE9YCcV/$jRSi5S6lzkcifbuqjMcyXLTwgOGm9BTQk/G/jYaxroC";
in
{
name = "userborn";
meta.maintainers = with lib.maintainers; [ nikstur ];
nodes.machine = {
services.userborn.enable = true;
# Read this password file at runtime from outside the Nix store.
environment.etc."rootpw.secret".text = rootHashedPasswordFile;
users = {
users = {
root = {
# Override the empty root password set by the test instrumentation.
hashedPasswordFile = lib.mkForce "/etc/rootpw.secret";
};
normalo = {
isNormalUser = true;
password = normaloPassword;
};
sysuser = {
isSystemUser = true;
group = "sysusers";
initialHashedPassword = sysuserInitialHashedPassword;
};
};
groups = {
sysusers = { };
};
};
specialisation.new-generation.configuration = {
users = {
users = {
root = {
# Forcing this to null simulates removing the config value in a new
# generation.
hashedPasswordFile = lib.mkOverride 9 null;
hashedPassword = updatedRootHashedPassword;
};
normalo = {
hashedPassword = updatedNormaloHashedPassword;
};
sysuser = {
initialHashedPassword = lib.mkForce updatedSysuserInitialHashedPassword;
};
new-normalo = {
isNormalUser = true;
hashedPassword = newNormaloHashedPassword;
};
};
groups = {
new-group = { };
};
};
};
};
testScript = ''
machine.wait_for_unit("userborn.service")
with subtest("Correct mode on the password files"):
assert machine.succeed("stat -c '%a' /etc/passwd") == "644\n"
assert machine.succeed("stat -c '%a' /etc/group") == "644\n"
assert machine.succeed("stat -c '%a' /etc/shadow") == "0\n"
with subtest("root user has correct password"):
print(machine.succeed("getent passwd root"))
assert "${rootHashedPasswordFile}" in machine.succeed("getent shadow root"), "root user password is not correct"
with subtest("normalo user is created"):
print(machine.succeed("getent passwd normalo"))
assert 1000 <= int(machine.succeed("id --user normalo")), "normalo user doesn't have a normal UID"
assert machine.succeed("stat -c '%U' /home/normalo") == "normalo\n"
with subtest("system user is created with correct password"):
print(machine.succeed("getent passwd sysuser"))
assert 1000 > int(machine.succeed("id --user sysuser")), "sysuser user doesn't have a system UID"
assert "${sysuserInitialHashedPassword}" in machine.succeed("getent shadow sysuser"), "system user password is not correct"
with subtest("sysusers group is created"):
print(machine.succeed("getent group sysusers"))
machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
with subtest("root user password is updated"):
print(machine.succeed("getent passwd root"))
assert "${updatedRootHashedPassword}" in machine.succeed("getent shadow root"), "root user password is not updated"
with subtest("normalo user password is updated"):
print(machine.succeed("getent passwd normalo"))
assert "${updatedNormaloHashedPassword}" in machine.succeed("getent shadow normalo"), "normalo user password is not updated"
with subtest("system user password is NOT updated"):
print(machine.succeed("getent passwd sysuser"))
assert "${sysuserInitialHashedPassword}" in machine.succeed("getent shadow sysuser"), "sysuser user password is not updated"
with subtest("new-normalo user is created after switching to new generation"):
print(machine.succeed("getent passwd new-normalo"))
assert 1000 <= int(machine.succeed("id --user new-normalo")), "new-normalo user doesn't have a normal UID"
assert machine.succeed("stat -c '%U' /home/new-normalo") == "new-normalo\n"
assert "${newNormaloHashedPassword}" in machine.succeed("getent shadow new-normalo"), "new-normalo user password is not correct"
with subtest("new-group group is created after switching to new generation"):
print(machine.succeed("getent group new-group"))
'';
}

View File

@ -6,19 +6,19 @@
buildGoModule rec {
pname = "optimism";
version = "1.9.0";
version = "1.9.1";
src = fetchFromGitHub {
owner = "ethereum-optimism";
repo = "optimism";
rev = "op-node/v${version}";
hash = "sha256-TIxA+Dyxdwm3Q8U6xh7x7hBPNXmH+vVDK2lAaRFKSN0=";
hash = "sha256-PlwpN8P1t0NNIU+Ys50dIXmfUQFIY9e1tLABiVK0JQo=";
fetchSubmodules = true;
};
subPackages = [ "op-node/cmd" "op-proposer/cmd" "op-batcher/cmd" ];
vendorHash = "sha256-xoflPeUeFlbMBUSas+dmBOCFOOvrBHEvYWEk7QkNW14=";
vendorHash = "sha256-n1uJ/dkEjjsTdmL7TeHU4PKnBhiRrqCNtcGxK70Q0c4=";
buildInputs = [
libpcap

View File

@ -166,7 +166,7 @@ stdenv.mkDerivation rec {
EOF
moveToOutput "bin" "$bin"
cp ./build/shared-release/libmupdf.so* $out/lib
cp ./build/shared-release/libmupdf${stdenv.hostPlatform.extensions.sharedLibrary}* $out/lib
'' + (lib.optionalString (stdenv.isDarwin) ''
for exe in $bin/bin/*; do
install_name_tool -change build/shared-release/libmupdf.dylib $out/lib/libmupdf.dylib "$exe"

View File

@ -5,16 +5,16 @@
buildGoModule rec {
pname = "kubefirst";
version = "2.4.17";
version = "2.5.0";
src = fetchFromGitHub {
owner = "kubefirst";
repo = "kubefirst";
rev = "refs/tags/v${version}";
hash = "sha256-wYPrQkoz1rivfnhku3Njj8e/rJc2GuT1HOPyNSada+o=";
hash = "sha256-1VadsiZZii6gI8vdTNfwmbBPuHcgPh4kWZ2jf/EkFKU=";
};
vendorHash = "sha256-ymqBSNzgK79IYSZ+WR+0yi01008jIPaRJ7vnnxMDycY=";
vendorHash = "sha256-tOCVDp9oClfeBsyZ6gv6HoGPjZByoxxAceV/wxQeBSA=";
ldflags = [
"-s"

View File

@ -66,5 +66,6 @@ rustPlatform.buildRustPackage rec {
maintainers = with lib.maintainers; [ dotlambda nicknovitski ];
license = lib.licenses.mit;
platforms = lib.platforms.unix;
mainProgram = "newsboat";
};
}

View File

@ -57,10 +57,17 @@ stdenvNoCC.mkDerivation {
chmod +x $out/bin/limactl
wrapProgram $out/bin/limactl \
--prefix PATH : ${lib.makeBinPath [ qemu ]}
installShellCompletion --cmd limactl \
--bash <($out/bin/limactl completion bash) \
--fish <($out/bin/limactl completion fish) \
--zsh <($out/bin/limactl completion zsh)
# the shell completion only works with a patched $out/bin/limactl and so
# needs to run after the autoPatchelfHook is executed in postFixup.
doShellCompletion() {
installShellCompletion --cmd limactl \
--bash <($out/bin/limactl completion bash) \
--fish <($out/bin/limactl completion fish) \
--zsh <($out/bin/limactl completion zsh)
}
postFixupHooks+=(doShellCompletion)
runHook postInstall
'';

View File

@ -7,6 +7,8 @@
, prefetch-npm-deps
, diffutils
, installShellFiles
, nodejsInstallManuals
, nodejsInstallExecutables
}:
{
@ -39,9 +41,10 @@
propagatedBuildInputs = [
installShellFiles
makeWrapper
nodejsInstallManuals
nodejsInstallExecutables
];
substitutions = {
hostNode = "${nodejs}/bin/node";
jq = "${jq}/bin/jq";
};
} ./npm-install-hook.sh;

View File

@ -14,31 +14,9 @@ npmInstallHook() {
cp "${npmWorkspace-.}/$file" "$dest"
done < <(@jq@ --raw-output '.[0].files | map(.path | select(. | startswith("node_modules/") | not)) | join("\n")' <<< "$(npm_config_cache="$HOME/.npm" npm pack --json --dry-run --loglevel=warn --no-foreground-scripts ${npmWorkspace+--workspace=$npmWorkspace} $npmPackFlags "${npmPackFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}")")
# Based on code from Python's buildPythonPackage wrap.sh script, for
# supporting both the case when makeWrapperArgs is an array and a
# IFS-separated string.
#
# TODO: remove the string branch when __structuredAttrs are used.
if [[ "${makeWrapperArgs+defined}" == "defined" && "$(declare -p makeWrapperArgs)" =~ ^'declare -a makeWrapperArgs=' ]]; then
local -a user_args=("${makeWrapperArgs[@]}")
else
local -a user_args="(${makeWrapperArgs:-})"
fi
while IFS=" " read -ra bin; do
mkdir -p "$out/bin"
makeWrapper @hostNode@ "$out/bin/${bin[0]}" --add-flags "$packageOut/${bin[1]}" "${user_args[@]}"
done < <(@jq@ --raw-output '(.bin | type) as $typ | if $typ == "string" then
.name + " " + .bin
elif $typ == "object" then .bin | to_entries | map(.key + " " + .value) | join("\n")
elif $typ == "null" then empty
else "invalid type " + $typ | halt_error end' "${npmWorkspace-.}/package.json")
nodejsInstallExecutables "${npmWorkspace-.}/package.json"
while IFS= read -r man; do
installManPage "$packageOut/$man"
done < <(@jq@ --raw-output '(.man | type) as $typ | if $typ == "string" then .man
elif $typ == "list" then .man | join("\n")
elif $typ == "null" then empty
else "invalid type " + $typ | halt_error end' "${npmWorkspace-.}/package.json")
nodejsInstallManuals "${npmWorkspace-.}/package.json"
local -r nodeModulesPath="$packageOut/node_modules"

View File

@ -42,7 +42,6 @@ buildDunePackage' rec {
cmdliner
containers-data
digestif
domainslib
eio_main
lwd
nottui

View File

@ -96,6 +96,9 @@ python3Packages.buildPythonApplication rec {
"test_uv_env"
"test_pyenv"
"test_pypirc"
# Relies on FHS
# Could not read ELF interpreter from any of the following paths: /bin/sh, /usr/bin/env, /bin/dash, /bin/ls
"test_new_selected_python"
]
++ lib.optionals stdenv.isDarwin [
# https://github.com/NixOS/nixpkgs/issues/209358

View File

@ -25,15 +25,15 @@
}:
let
version = "1.35.3";
patterns_version = "1.35.3";
version = "1.35.4";
patterns_version = "1.35.4";
patterns_src = fetchFromGitHub {
name = "ImHex-Patterns-source-${patterns_version}";
owner = "WerWolv";
repo = "ImHex-Patterns";
rev = "ImHex-v${patterns_version}";
hash = "sha256-h86qoFMSP9ehsXJXOccUK9Mfqe+DVObfSRT4TCtK0rY=";
hash = "sha256-7ch2KXkbkdRAvo3HyErWcth3kG4bzYvp9I5GZSsb/BQ=";
};
in
@ -47,7 +47,7 @@ stdenv.mkDerivation rec {
owner = "WerWolv";
repo = "ImHex";
rev = "refs/tags/v${version}";
hash = "sha256-8vhOOHfg4D9B9yYgnGZBpcjAjuL4M4oHHax9ad5PJtA=";
hash = "sha256-6QpmFkSMQpGlEzo7BHZn20c+q8CTDUB4yO87wMU5JT4=";
};
nativeBuildInputs = [

View File

@ -32,6 +32,7 @@
, udev
, wayland
, wayland-protocols
, wayland-scanner
, wrapGAppsHook3
, xorgserver
, xwayland
@ -68,6 +69,7 @@ stdenv.mkDerivation rec {
wrapGAppsHook3
xorgserver # for cvt command
gobject-introspection
wayland-scanner
];
buildInputs = [

View File

@ -3,7 +3,6 @@
, fetchFromGitHub
, nix
, nix-prefetch-git
, nixpkgs-fmt
, nixpkgs-review
}:
@ -24,7 +23,7 @@ python3.pkgs.buildPythonApplication rec {
];
makeWrapperArgs = [
"--prefix" "PATH" ":" (lib.makeBinPath [ nix nix-prefetch-git nixpkgs-fmt nixpkgs-review ])
"--prefix" "PATH" ":" (lib.makeBinPath [ nix nix-prefetch-git nixpkgs-review ])
];
checkPhase = ''
@ -36,7 +35,7 @@ python3.pkgs.buildPythonApplication rec {
inherit (src.meta) homepage;
changelog = "https://github.com/Mic92/nix-update/releases/tag/${version}";
license = licenses.mit;
maintainers = with maintainers; [ figsoda mic92 zowoq ];
maintainers = with maintainers; [ figsoda mic92 ];
mainProgram = "nix-update";
platforms = platforms.all;
};

View File

@ -0,0 +1,27 @@
# shellcheck shell=bash
nodejsInstallExecutables() {
local -r packageJson="${1-./package.json}"
local -r packageOut="$out/lib/node_modules/$(@jq@ --raw-output '.name' package.json)"
# Based on code from Python's buildPythonPackage wrap.sh script, for
# supporting both the case when makeWrapperArgs is an array and a
# IFS-separated string.
#
# TODO: remove the string branch when __structuredAttrs are used.
if [[ "${makeWrapperArgs+defined}" == "defined" && "$(declare -p makeWrapperArgs)" =~ ^'declare -a makeWrapperArgs=' ]]; then
local -a user_args=("${makeWrapperArgs[@]}")
else
local -a user_args="(${makeWrapperArgs:-})"
fi
while IFS=" " read -ra bin; do
mkdir -p "$out/bin"
makeWrapper @hostNode@ "$out/bin/${bin[0]}" --add-flags "$packageOut/${bin[1]}" "${user_args[@]}"
done < <(@jq@ --raw-output '(.bin | type) as $typ | if $typ == "string" then
.name + " " + .bin
elif $typ == "object" then .bin | to_entries | map(.key + " " + .value) | join("\n")
elif $typ == "null" then empty
else "invalid type " + $typ | halt_error end' "$packageJson")
}

View File

@ -0,0 +1,19 @@
{
makeSetupHook,
installShellFiles,
makeWrapper,
nodejs,
jq,
}:
makeSetupHook {
name = "nodejs-install-executables";
propagatedBuildInputs = [
installShellFiles
makeWrapper
];
substitutions = {
hostNode = "${nodejs}/bin/node";
jq = "${jq}/bin/jq";
};
} ./hook.sh

View File

@ -0,0 +1,14 @@
# shellcheck shell=bash
nodejsInstallManuals() {
local -r packageJson="${1-./package.json}"
local -r packageOut="$out/lib/node_modules/$(@jq@ --raw-output '.name' package.json)"
while IFS= read -r man; do
installManPage "$packageOut/$man"
done < <(@jq@ --raw-output '(.man | type) as $typ | if $typ == "string" then .man
elif $typ == "list" then .man | join("\n")
elif $typ == "null" then empty
else "invalid type " + $typ | halt_error end' "$packageJson")
}

View File

@ -0,0 +1,13 @@
{
makeSetupHook,
installShellFiles,
jq,
}:
makeSetupHook {
name = "nodejs-install-manuals";
propagatedBuildInputs = [ installShellFiles ];
substitutions = {
jq = "${jq}/bin/jq";
};
} ./hook.sh

View File

@ -12,13 +12,13 @@
stdenv.mkDerivation rec {
pname = "qbittorrent-enhanced";
version = "4.6.5.10";
version = "4.6.6.10";
src = fetchFromGitHub {
owner = "c0re100";
repo = "qBittorrent-Enhanced-Edition";
rev = "release-${version}";
hash = "sha256-Yy0DUTz1lWkseh9x1xnHJCI89BKqi/D7zUn/S+qC+kM=";
hash = "sha256-mmM/1eU8FTWAciq2rh7fRa96fOkovMk4ScoehnqHdIQ=";
};
nativeBuildInputs = [

View File

@ -25,7 +25,7 @@ let
# See upstream issue for rocksdb 9.X support
# https://github.com/stalwartlabs/mail-server/issues/407
rocksdb = rocksdb_8_11;
version = "0.9.2";
version = "0.9.3";
in
rustPlatform.buildRustPackage {
pname = "stalwart-mail";
@ -35,11 +35,11 @@ rustPlatform.buildRustPackage {
owner = "stalwartlabs";
repo = "mail-server";
rev = "refs/tags/v${version}";
hash = "sha256-8O+0yOdaHnc2vDLCPK7PIuR6IBeOmH9RNDo0uaw7EeU=";
hash = "sha256-XjHm9jBpBQcf1qaZJLDSSrPK9Nqi3olG0pMXHdNUjbg=";
fetchSubmodules = true;
};
cargoHash = "sha256-ofF9eTXLVyFfrTnAj6rMYV3dMY613tjhKgoLs303CEA=";
cargoHash = "sha256-sFYvEKZVTS5v37CpIl/KjoOY0iWCHLgIJFUdht5SjJY=";
patches = [
# Remove "PermissionsStartOnly" from systemd service files,
@ -61,14 +61,19 @@ rustPlatform.buildRustPackage {
bzip2
openssl
sqlite
foundationdb
zstd
] ++ lib.optionals stdenv.isLinux [
foundationdb
] ++ lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.CoreFoundation
darwin.apple_sdk.frameworks.Security
darwin.apple_sdk.frameworks.SystemConfiguration
];
# skip defaults on darwin because foundationdb is not available
buildNoDefaultFeatures = stdenv.isDarwin;
buildFeatures = lib.optional (stdenv.isDarwin) [ "sqlite" "postgres" "mysql" "rocks" "elastic" "s3" "redis" ];
env = {
OPENSSL_NO_VENDOR = true;
ZSTD_SYS_USE_PKG_CONFIG = true;

View File

@ -25,8 +25,8 @@ rustPlatform.buildRustPackage rec {
hash = "sha256-KtR+qU2Xys4NkEARZBbO8mTPa7EI9JplWvXdtuLt2vE=";
};
patches = [
./time.patch # TODO: remove when https://github.com/surrealdb/surrealdb/pull/4565 merged
cargoPatches = [
./time.patch # TODO: remove when https://github.com/surrealdb/surrealdb/pull/4565 merged
];
cargoHash = "sha256-5qIIPdE6HYov5EIR4do+pMeZ1Lo3at39aKOP9scfMy8=";

View File

@ -0,0 +1,43 @@
{
lib,
rustPlatform,
fetchFromGitHub,
makeBinaryWrapper,
mkpasswd,
}:
rustPlatform.buildRustPackage rec {
pname = "userborn";
version = "0.1.0";
src = fetchFromGitHub {
owner = "nikstur";
repo = "userborn";
rev = version;
hash = "sha256-aptFDrL9RPPTu4wp2ee3LVaEruRdCWtLGIKdOgsR+/s=";
};
sourceRoot = "${src.name}/rust/userborn";
cargoHash = "sha256-m39AC26E0Pxu1E/ap2kSwr5uznJNgExf5QUrZ+zTNX0=";
nativeBuildInputs = [ makeBinaryWrapper ];
buildInputs = [ mkpasswd ];
nativeCheckInputs = [ mkpasswd ];
postInstall = ''
wrapProgram $out/bin/userborn --prefix PATH : ${lib.makeBinPath [ mkpasswd ]}
'';
stripAllList = [ "bin" ];
meta = with lib; {
homepage = "https://github.com/nikstur/userborn";
description = "Declaratively bear (manage) Linux users and groups";
license = licenses.mit;
maintainers = with lib.maintainers; [ nikstur ];
mainProgram = "userborn";
};
}

View File

@ -43,21 +43,6 @@ dependencies = [
"memchr",
]
[[package]]
name = "alloc-no-stdlib"
version = "2.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
[[package]]
name = "alloc-stdlib"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
dependencies = [
"alloc-no-stdlib",
]
[[package]]
name = "android-tzdata"
version = "0.1.1"
@ -211,7 +196,6 @@ version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fec134f64e2bc57411226dfc4e52dec859ddfc7e711fc5e07b612584f000e4aa"
dependencies = [
"brotli",
"bzip2",
"flate2",
"futures-core",
@ -461,27 +445,6 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "510a90332002c1af3317ef6b712f0dab697f30bbe809b86965eac2923c0bca8e"
[[package]]
name = "brotli"
version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
"brotli-decompressor",
]
[[package]]
name = "brotli-decompressor"
version = "4.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
]
[[package]]
name = "bstr"
version = "1.10.0"
@ -4529,7 +4492,7 @@ checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
[[package]]
name = "uv"
version = "0.3.5"
version = "0.4.0"
dependencies = [
"anstream",
"anyhow",
@ -4780,7 +4743,6 @@ dependencies = [
"uv-auth",
"uv-cache",
"uv-normalize",
"uv-workspace",
]
[[package]]
@ -5080,7 +5042,7 @@ dependencies = [
"uv-state",
"uv-warnings",
"which",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
"winsafe 0.0.22",
]
@ -5284,7 +5246,7 @@ dependencies = [
[[package]]
name = "uv-version"
version = "0.3.5"
version = "0.4.0"
[[package]]
name = "uv-virtualenv"

View File

@ -16,14 +16,14 @@
python3Packages.buildPythonApplication rec {
pname = "uv";
version = "0.3.5";
version = "0.4.0";
pyproject = true;
src = fetchFromGitHub {
owner = "astral-sh";
repo = "uv";
rev = "refs/tags/${version}";
hash = "sha256-D/BCxA7GOEu26xDkMmchXAMFB1pDewYSiOrNj2oSTyE=";
hash = "sha256-JEGcX4dT/cVLb07n2Y0nai17jW0tXpV18qaYVnoEpew=";
};
cargoDeps = rustPlatform.importCargoLock {

View File

@ -4,6 +4,8 @@
fetchFromGitHub,
fontconfig,
lib,
libGL,
libuuid,
libX11,
libXext,
libXrandr,
@ -19,6 +21,7 @@
shaderc,
stdenv,
testers,
vulkan-loader,
wayland,
wlx-overlay-s,
}:
@ -76,7 +79,11 @@ rustPlatform.buildRustPackage rec {
postInstall = ''
patchelf $out/bin/wlx-overlay-s \
--add-needed ${lib.getLib wayland}/lib/libwayland-client.so.0 \
--add-needed ${lib.getLib libxkbcommon}/lib/libxkbcommon.so.0
--add-needed ${lib.getLib libxkbcommon}/lib/libxkbcommon.so.0 \
--add-needed ${lib.getLib libGL}/lib/libEGL.so.1 \
--add-needed ${lib.getLib libGL}/lib/libGL.so.1 \
--add-needed ${lib.getLib vulkan-loader}/lib/libvulkan.so.1 \
--add-needed ${lib.getLib libuuid}/lib/libuuid.so.1
'';
passthru = {

View File

@ -2,11 +2,11 @@
buildGraalvmNativeImage rec {
pname = "yamlscript";
version = "0.1.72";
version = "0.1.73";
src = fetchurl {
url = "https://github.com/yaml/yamlscript/releases/download/${version}/yamlscript.cli-${version}-standalone.jar";
hash = "sha256-Qp2/Bifh+KXUjpcW/Lct6nGBv50TUEOGTjVPkXGbD54=";
hash = "sha256-FXw476RXIFnjnK8cz/Kxni4dZ58LJvevcxiotDO7+bQ=";
};
executable = "ys";

View File

@ -0,0 +1,24 @@
{ lib, buildDunePackage, fetchurl, alcotest}:
buildDunePackage rec {
pname = "backoff";
version = "0.1.0";
src = fetchurl {
url = "https://github.com/ocaml-multicore/backoff/releases/download/${version}/backoff-${version}.tbz";
hash = "sha256-EaSseCKekNE03gaNiqh5Y11r8TF9XulR9AZboPWMIwA=";
};
doCheck = true;
checkInputs = [ alcotest ];
meta = {
description = "Exponential backoff mechanism for OCaml";
homepage = "https://github.com/ocaml-multicore/backoff";
license = lib.licenses.isc;
maintainers = [ lib.maintainers.vbgl ];
};
minimalOCamlVersion = "4.13";
}

View File

@ -29,5 +29,6 @@ buildDunePackage rec {
description = "Nested-parallel programming";
license = lib.licenses.isc;
maintainers = [ lib.maintainers.vbgl ];
broken = true; # Not compatible with saturn > 0.4.0
};
}

View File

@ -0,0 +1,22 @@
{ lib, buildDunePackage, fetchurl
, domain-local-await, mtime, multicore-magic, yojson
}:
buildDunePackage rec {
pname = "multicore-bench";
version = "0.1.4";
src = fetchurl {
url = "https://github.com/ocaml-multicore/multicore-bench/releases/download/${version}/multicore-bench-${version}.tbz";
hash = "sha256-iCx5QvhYo/e53cW23Sza2as4aez4HeESVvLPF1DW85A=";
};
propagatedBuildInputs = [ domain-local-await mtime multicore-magic yojson ];
meta = {
description = "Framework for writing multicore benchmark executables to run on current-bench";
homepage = "https://github.com/ocaml-multicore/multicore-bench";
license = lib.licenses.isc;
maintainers = [ lib.maintainers.vbgl ];
};
}

View File

@ -0,0 +1,24 @@
{ lib, buildDunePackage, fetchurl
, alcotest, domain_shims
}:
buildDunePackage rec {
pname = "multicore-magic";
version = "2.3.0";
src = fetchurl {
url = "https://github.com/ocaml-multicore/multicore-magic/releases/download/${version}/multicore-magic-${version}.tbz";
hash = "sha256-r50UqLOd2DoTz0CEXHpJMHX0fty+mGiAKTdtykgnzu4=";
};
doCheck = true;
checkInputs = [ alcotest domain_shims ];
meta = {
description = "Low-level multicore utilities for OCaml";
license = lib.licenses.isc;
homepage = "https://github.com/ocaml-multicore/multicore-magic";
maintainers = [ lib.maintainers.vbgl ];
};
}

View File

@ -1,6 +1,8 @@
{ lib, buildDunePackage, ocaml
, saturn_lockfree
, domain_shims
, dscheck
, multicore-bench
, qcheck, qcheck-alcotest, qcheck-stm
}:
@ -12,7 +14,14 @@ buildDunePackage rec {
propagatedBuildInputs = [ saturn_lockfree ];
doCheck = lib.versionAtLeast ocaml.version "5.0";
checkInputs = [ dscheck qcheck qcheck-alcotest qcheck-stm ];
checkInputs = [
domain_shims
dscheck
multicore-bench
qcheck
qcheck-alcotest
qcheck-stm
];
meta = saturn_lockfree.meta // {
description = "Parallelism-safe data structures for multicore OCaml";

View File

@ -1,19 +1,19 @@
{ lib, fetchurl, buildDunePackage
, domain_shims
, backoff, multicore-magic
}:
buildDunePackage rec {
pname = "saturn_lockfree";
version = "0.4.0";
version = "0.5.0";
minimalOCamlVersion = "4.12";
minimalOCamlVersion = "4.13";
src = fetchurl {
url = "https://github.com/ocaml-multicore/saturn/releases/download/${version}/saturn-${version}.tbz";
hash = "sha256-fHvslaJwVbQaqDVA/MHGqHybetYbxRGlMrhgXqM3iPs=";
hash = "sha256-ZmmxwIe5PiPYTTdvOHbOjRbv2b/bb9y0IekByfREPjk=";
};
propagatedBuildInputs = [ domain_shims ];
propagatedBuildInputs = [ backoff multicore-magic ];
meta = {
description = "Lock-free data structures for multicore OCaml";

View File

@ -1,10 +1,8 @@
{
lib,
buildPythonPackage,
fetchPypi,
gettext,
flake8,
isocodes,
fetchFromGitHub,
setuptools,
pytestCheckHook,
charset-normalizer,
}:
@ -12,35 +10,27 @@
buildPythonPackage rec {
pname = "aeidon";
version = "1.15";
pyproject = true;
src = fetchPypi {
pname = "aeidon";
inherit version;
sha256 = "sha256-qGpGraRZFVaW1Jys24qvfPo5WDg7Q/fhvm44JH8ulVw=";
src = fetchFromGitHub {
owner = "otsaloma";
repo = "gaupol";
rev = "refs/tags/${version}";
hash = "sha256-lhNyeieeiBBm3rNDEU0BuWKeM6XYlOtv1voW8tR8cUM=";
};
nativeBuildInputs = [
gettext
flake8
];
dependencies = [ isocodes ];
installPhase = ''
runHook preInstall
python setup.py --without-gaupol install --prefix=$out
runHook postInstall
postPatch = ''
mv setup.py setup_gaupol.py
substituteInPlace setup-aeidon.py \
--replace "from setup import" "from setup_gaupol import"
mv setup-aeidon.py setup.py
'';
nativeCheckInputs = [
pytestCheckHook
charset-normalizer
];
build-system = [ setuptools ];
# Aeidon is looking in the wrong subdirectory for data
preCheck = ''
cp -r data aeidon/
'';
dependencies = [ charset-normalizer ];
nativeCheckInputs = [ pytestCheckHook ];
pytestFlagsArray = [ "aeidon/test" ];
@ -52,9 +42,10 @@ buildPythonPackage rec {
pythonImportsCheck = [ "aeidon" ];
meta = with lib; {
changelog = "https://github.com/otsaloma/gaupol/releases/tag/${version}";
description = "Reading, writing and manipulationg text-based subtitle files";
homepage = "https://github.com/otsaloma/gaupol";
license = licenses.gpl3Only;
license = licenses.gpl3Plus;
maintainers = with maintainers; [ erictapen ];
};

View File

@ -14,7 +14,7 @@
buildPythonPackage rec {
pname = "craft-platforms";
version = "0.1.1";
version = "0.2.0";
pyproject = true;
disabled = pythonOlder "3.10";
@ -23,7 +23,7 @@ buildPythonPackage rec {
owner = "canonical";
repo = "craft-platforms";
rev = "refs/tags/${version}";
hash = "sha256-KzskmSw7NsH1CAYjPf2281Ob71Jd6AhWxtp5tR3IqyU=";
hash = "sha256-chCPuncy+//Y5iohTh0d8qRNaEno6Sqze2Zoas3uwPQ=";
};
postPatch = ''

View File

@ -11,7 +11,7 @@
buildPythonPackage rec {
pname = "gvm-tools";
version = "24.7.0";
version = "24.8.0";
pyproject = true;
disabled = pythonOlder "3.9";
@ -20,7 +20,7 @@ buildPythonPackage rec {
owner = "greenbone";
repo = "gvm-tools";
rev = "refs/tags/v${version}";
hash = "sha256-m4wEAx2WyVIMi+xucqUCPr2PLxLo00haObjf+0swUdA=";
hash = "sha256-MwLwJyxKu4O0cEabBjcdhqtqW3uwgbyVlezZysUDYa4=";
};
__darwinAllowLocalNetworking = true;

View File

@ -12,7 +12,7 @@
buildPythonPackage rec {
pname = "lib4sbom";
version = "0.7.3";
version = "0.7.4";
pyproject = true;
disabled = pythonOlder "3.7";
@ -21,7 +21,7 @@ buildPythonPackage rec {
owner = "anthonyharrison";
repo = "lib4sbom";
rev = "refs/tags/v${version}";
hash = "sha256-RuIvhlLnWf/ayU6tjpHYKvBFqU8ojPwJK/pDIdLrD2s=";
hash = "sha256-Uqv6E9qMJRsfYICVAiZEQGlG/0w8aECuh8wMa85FnlE=";
};
build-system = [ setuptools ];

View File

@ -11,7 +11,7 @@
buildPythonPackage rec {
pname = "model-bakery";
version = "1.19.4";
version = "1.19.5";
pyproject = true;
disabled = pythonOlder "3.8";
@ -20,7 +20,7 @@ buildPythonPackage rec {
owner = "model-bakers";
repo = "model_bakery";
rev = "refs/tags/${version}";
hash = "sha256-Jok5fQ8z9/v6n482yYA06ugC+4SSMuV7fmt1cdv3/dg=";
hash = "sha256-hOXE3mddGmRRgO9qAlj3bnmco8QTg2rD0sgui3J9pp8=";
};
build-system = [ hatchling ];

View File

@ -15,7 +15,7 @@
buildPythonPackage rec {
pname = "python-gvm";
version = "24.7.0";
version = "24.8.0";
pyproject = true;
disabled = pythonOlder "3.9";
@ -24,7 +24,7 @@ buildPythonPackage rec {
owner = "greenbone";
repo = "python-gvm";
rev = "refs/tags/v${version}";
hash = "sha256-WsZxISvPw4uvRKv5CYpcLunAxvoCvVWTSp+m2QTEe0g=";
hash = "sha256-JyImC75Le6S2kQXSU/Ze4TNaitJSJ8LD9j/ny+xjoGA=";
};
build-system = [ poetry-core ];

View File

@ -15,24 +15,24 @@
buildPythonPackage rec {
pname = "stravalib";
version = "1.6";
version = "2.0";
pyproject = true;
disabled = pythonOlder "3.9";
disabled = pythonOlder "3.10";
src = fetchFromGitHub {
owner = "stravalib";
repo = "stravalib";
rev = "refs/tags/v${version}";
hash = "sha256-U+QlSrijvT77/m+yjhFxbcVTQe51J+PR4Kc8N+qG+wI=";
hash = "sha256-uF29fK+ZSSO688zKYYiSEygBUJZ6NBcvdgGgz3I1I6Q=";
};
nativeBuildInputs = [
build-system = [
setuptools
setuptools-scm
];
propagatedBuildInputs = [
dependencies = [
arrow
pint
pydantic
@ -52,6 +52,5 @@ buildPythonPackage rec {
changelog = "https://github.com/stravalib/stravalib/releases/tag/v${version}";
license = licenses.asl20;
maintainers = with maintainers; [ sikmir ];
broken = lib.versionAtLeast pydantic.version "2";
};
}

View File

@ -39,6 +39,6 @@ rustPlatform.buildRustPackage rec {
homepage = "https://github.com/janlikar/cargo-clone";
changelog = "https://github.com/janlikar/cargo-clone/blob/v${version}/CHANGELOG.md";
license = with licenses; [ asl20 mit ];
maintainers = with maintainers; [ figsoda matthiasbeyer ];
maintainers = with maintainers; [ figsoda matthiasbeyer janlikar ];
};
}

View File

@ -34,6 +34,7 @@ stdenv.mkDerivation (finalAttrs: {
boost
gtest
wayland
wayland-scanner # needed by cmake
];
passthru = {

View File

@ -7,4 +7,6 @@ mkKdeDerivation {
pname = "konsole";
extraBuildInputs = [qt5compat qtmultimedia];
meta.mainProgram = "konsole";
}

View File

@ -1,5 +1,17 @@
{ lib, stdenv, fetchFromGitHub, btrfs-progs }:
{ lib, stdenv, fetchFromGitHub, fetchurl, btrfs-progs }:
let
# https://github.com/kilobyte/compsize/issues/52
btrfs-progs' = btrfs-progs.overrideAttrs (old: rec {
pname = "btrfs-progs";
version = "6.10";
src = fetchurl {
url = "mirror://kernel/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v${version}.tar.xz";
hash = "sha256-M4KoTj/P4f/eoHphqz9OhmZdOPo18fNFSNXfhnQj4N8=";
};
});
in
stdenv.mkDerivation rec {
pname = "compsize";
version = "1.5";
@ -11,7 +23,7 @@ stdenv.mkDerivation rec {
sha256 = "sha256-OX41ChtHX36lVRL7O2gH21Dfw6GPPEClD+yafR/PFm8=";
};
buildInputs = [ btrfs-progs ];
buildInputs = [ btrfs-progs' ];
installFlags = [
"PREFIX=${placeholder "out"}"

View File

@ -5,16 +5,16 @@ let
variants = {
# ./update-zen.py zen
zen = {
version = "6.10.5"; #zen
version = "6.10.7"; #zen
suffix = "zen1"; #zen
sha256 = "08ibz7560xsmlnrm8j13hxf8hjjcxfmnjdrwffqc81g9g6rvpqra"; #zen
sha256 = "1km3b7nad429hw7d8ff14zj1cg0fhh65ycrrwk4iaxj6rvafzsz1"; #zen
isLqx = false;
};
# ./update-zen.py lqx
lqx = {
version = "6.10.5"; #lqx
version = "6.10.6"; #lqx
suffix = "lqx1"; #lqx
sha256 = "09rscj20j94qkmvk0hlpjm6v1n1ndnkv2vl035gsp5lwggws2jqm"; #lqx
sha256 = "0b1pqsssnxc69yhx2wai5xnj6cb9713z33m8xal25jjgx9z4v8kv"; #lqx
isLqx = true;
};
};

View File

@ -1,6 +1,6 @@
{ stdenv, fetchurl, fetchpatch, lib, pkg-config, util-linux, libcap, libtirpc, libevent
, sqlite, libkrb5, kmod, libuuid, keyutils, lvm2, systemd, coreutils, tcp_wrappers
, python3, buildPackages, nixosTests, rpcsvc-proto, openldap
, python3, buildPackages, nixosTests, rpcsvc-proto, openldap, libxml2
, enablePython ? true, enableLdap ? true
}:
@ -10,11 +10,11 @@ in
stdenv.mkDerivation rec {
pname = "nfs-utils";
version = "2.6.4";
version = "2.7.1";
src = fetchurl {
url = "mirror://kernel/linux/utils/nfs-utils/${version}/${pname}-${version}.tar.xz";
hash = "sha256-AbOw+5x9C7q/URTHNlQgMHSMeI7C/Zc0dEIB6bChEZ0=";
hash = "sha256-iFyUioSli8pBSPRZWI+ac2nbtA3MRm8E5FXGsQ/Qqkg=";
};
# libnfsidmap is built together with nfs-utils from the same source,
@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
buildInputs = [
libtirpc libcap libevent sqlite lvm2
libuuid keyutils libkrb5 tcp_wrappers
libuuid keyutils libkrb5 tcp_wrappers libxml2
] ++ lib.optional enablePython python3
++ lib.optional enableLdap openldap;

View File

@ -31,45 +31,26 @@
, withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, systemd
, zlib
, rsync
, fetchpatch
, withCockpit ? true
, withAsan ? false
}:
stdenv.mkDerivation rec {
pname = "389-ds-base";
version = "2.4.5";
version = "2.4.6";
src = fetchFromGitHub {
owner = "389ds";
repo = pname;
rev = "${pname}-${version}";
hash = "sha256-12JCd2R00L0T5EPUNO/Aw2HRID+z2krNQ09RSX9Qkj8=";
hash = "sha256-+FTCzEyQY71TCkj8HMnSkrnQtxjHxOmtYhfZEAYOLis=";
};
patches = [
(fetchpatch {
name = "fix-32bit.patch";
url = "https://github.com/389ds/389-ds-base/commit/1fe029c495cc9f069c989cfbb09d449a078c56e2.patch";
hash = "sha256-b0HSaDjuEUKERIXKg8np+lZDdZNmrCTAXybJzF+0hq0=";
})
(fetchpatch {
name = "CVE-2024-2199.patch";
url = "https://git.rockylinux.org/staging/rpms/389-ds-base/-/raw/dae373bd6b4e7d6f35a096e6f27be1c3bf1e48ac/SOURCES/0004-CVE-2024-2199.patch";
hash = "sha256-grANphTafCoa9NQy+FowwPhGQnvuCbfGnSpQ1Wp69Vg=";
})
(fetchpatch {
name = "CVE-2024-3657.patch";
url = "https://git.rockylinux.org/staging/rpms/389-ds-base/-/raw/dae373bd6b4e7d6f35a096e6f27be1c3bf1e48ac/SOURCES/0005-CVE-2024-3657.patch";
hash = "sha256-CuiCXQp3PMiYERzFk7oH3T91yQ1dP/gtLNWF0eqGAQ4=";
})
];
cargoDeps = rustPlatform.fetchCargoTarball {
inherit src;
sourceRoot = "${src.name}/src";
name = "${pname}-${version}";
hash = "sha256-fE3bJROwti9Ru0jhCiWhXcuQdxXTqzN9yOd2nlhKABI=";
hash = "sha256-2Ng268tfbMRU3Uyo5ljSS/HxPnw1abvGjcczo25HyVk=";
};
nativeBuildInputs = [

View File

@ -7,8 +7,8 @@ let
hash = "sha256-cGnsxfpvt7FyhxFcA2/gWWe7CyanVGZVKtCDES3XLdI=";
};
matomo_5 = {
version = "5.0.2";
hash = "sha256-rLAShJLtzd3HB1Je+P+i8GKWdeklyC2sTnmPR07Md+8=";
version = "5.1.1";
hash = "sha256-xi6R9O/pOxBgga6+wwqziwDKK7Q1Ispldvxg+0mpdeQ=";
};
matomo-beta = {
version = "5.0.0";

View File

@ -8,6 +8,7 @@
, libxkbcommon
, wayland
, wayland-scanner
}:
stdenv.mkDerivation rec {
@ -22,7 +23,7 @@ stdenv.mkDerivation rec {
};
strictDeps = true;
nativeBuildInputs = [ meson ninja pkg-config wayland ];
nativeBuildInputs = [ meson ninja pkg-config wayland-scanner ];
buildInputs = [ libxkbcommon wayland ];
meta = with lib; {

View File

@ -1467,7 +1467,7 @@ mapAliases ({
tabula = throw "tabula has been removed from nixpkgs, as it was broken"; # Added 2024-07-15
tangogps = foxtrotgps; # Added 2020-01-26
taskwarrior = lib.warn "taskwarrior was replaced by taskwarrior3, which requires manual transition from taskwarrior 2.6, read upstram's docs: https://taskwarrior.org/docs/upgrade-3/" taskwarrior2;
taskwarrior = lib.warn "taskwarrior was replaced by taskwarrior3, which requires manual transition from taskwarrior 2.6, read upstream's docs: https://taskwarrior.org/docs/upgrade-3/" taskwarrior2;
taplo-cli = taplo; # Added 2022-07-30
taplo-lsp = taplo; # Added 2022-07-30
taro = taproot-assets; # Added 2023-07-04

View File

@ -64,6 +64,8 @@ let
b0 = callPackage ../development/ocaml-modules/b0 { };
backoff = callPackage ../development/ocaml-modules/backoff { };
bap = janeStreet_0_15.bap;
base64 = callPackage ../development/ocaml-modules/base64 { };
@ -1199,6 +1201,10 @@ let
mtime = callPackage ../development/ocaml-modules/mtime { };
multicore-bench = callPackage ../development/ocaml-modules/multicore-bench { };
multicore-magic = callPackage ../development/ocaml-modules/multicore-magic { };
multipart-form-data = callPackage ../development/ocaml-modules/multipart-form-data { };
mustache = callPackage ../development/ocaml-modules/mustache { };