Merge master into haskell-updates

This commit is contained in:
github-actions[bot] 2023-05-26 00:12:42 +00:00 committed by GitHub
commit 15ec108b1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
414 changed files with 15063 additions and 10082 deletions

View File

@ -96,6 +96,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- [atuin](https://github.com/ellie/atuin), a sync server for shell history. Available as [services.atuin](#opt-services.atuin.enable).
- [SFTPGo](https://github.com/drakkan/sftpgo), a fully featured and highly configurable SFTP server with optional HTTP/S, FTP/S and WebDAV support. Available as [services.sftpgo](options.html#opt-services.sftpgo.enable).
- [esphome](https://esphome.io), a dashboard to configure ESP8266/ESP32 devices for use with Home Automation systems. Available as [services.esphome](#opt-services.esphome.enable).
- [networkd-dispatcher](https://gitlab.com/craftyguy/networkd-dispatcher), a dispatcher service for systemd-networkd connection status changes. Available as [services.networkd-dispatcher](#opt-services.networkd-dispatcher.enable).
@ -567,6 +569,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- `boot.initrd.luks.device.<name>` has a new `tryEmptyPassphrase` option, this is useful for OEM's who need to install an encrypted disk with a future settable passphrase
- there is a new `boot/stratisroot.nix` module that enables booting from a volume managed by the Stratis storage management daemon. Use `fileSystems.<name>.stratis.poolUuid` to configure the pool containing the fs.
- Lisp gained a [manual section](https://nixos.org/manual/nixpkgs/stable/#lisp), documenting a new and backwards incompatible interface. The previous interface will be removed in a future release.
- The `bind` module now allows the per-zone `allow-query` setting to be configured (previously it was hard-coded to `any`; it still defaults to `any` to retain compatibility).

View File

@ -2,7 +2,7 @@
## Highlights {#sec-release-23.11-highlights}
- Create the first release note entry in this section!
- FoundationDB now defaults to major version 7.
## New Services {#sec-release-23.11-new-services}

View File

@ -335,7 +335,7 @@ sub findStableDevPath {
my $st = stat($dev) or return $dev;
foreach my $dev2 (glob("/dev/disk/by-uuid/*"), glob("/dev/mapper/*"), glob("/dev/disk/by-label/*")) {
foreach my $dev2 (glob("/dev/stratis/*/*"), glob("/dev/disk/by-uuid/*"), glob("/dev/mapper/*"), glob("/dev/disk/by-label/*")) {
my $st2 = stat($dev2) or next;
return $dev2 if $st->rdev == $st2->rdev;
}
@ -467,6 +467,17 @@ EOF
}
}
# is this a stratis fs?
my $stableDevPath = findStableDevPath $device;
my $stratisPool;
if ($stableDevPath =~ qr#/dev/stratis/(.*)/.*#) {
my $poolName = $1;
my ($header, @lines) = split "\n", qx/stratis pool list/;
my $uuidIndex = index $header, 'UUID';
my ($line) = grep /^$poolName /, @lines;
$stratisPool = substr $line, $uuidIndex - 32, 36;
}
# Don't emit tmpfs entry for /tmp, because it most likely comes from the
# boot.tmp.useTmpfs option in configuration.nix (managed declaratively).
next if ($mountPoint eq "/tmp" && $fsType eq "tmpfs");
@ -474,7 +485,7 @@ EOF
# Emit the filesystem.
$fileSystems .= <<EOF;
fileSystems.\"$mountPoint\" =
{ device = \"${\(findStableDevPath $device)}\";
{ device = \"$stableDevPath\";
fsType = \"$fsType\";
EOF
@ -484,6 +495,12 @@ EOF
EOF
}
if ($stratisPool) {
$fileSystems .= <<EOF;
stratis.poolUuid = "$stratisPool";
EOF
}
$fileSystems .= <<EOF;
};

View File

@ -1230,6 +1230,7 @@
./services/web-apps/powerdns-admin.nix
./services/web-apps/prosody-filer.nix
./services/web-apps/restya-board.nix
./services/web-apps/sftpgo.nix
./services/web-apps/rss-bridge.nix
./services/web-apps/selfoss.nix
./services/web-apps/shiori.nix
@ -1345,6 +1346,7 @@
./system/boot/loader/raspberrypi/raspberrypi.nix
./system/boot/loader/systemd-boot/systemd-boot.nix
./system/boot/luksroot.nix
./system/boot/stratisroot.nix
./system/boot/modprobe.nix
./system/boot/networkd.nix
./system/boot/plymouth.nix

View File

@ -167,9 +167,11 @@ in
<!-- create mount point if not present -->
<mkmountpoint enable="${if cfg.createMountPoints then "1" else "0"}" remove="${if cfg.removeCreatedMountPoints then "true" else "false"}" />
<!-- specify the binaries to be called -->
<fusemount>${pkgs.fuse}/bin/mount.fuse %(VOLUME) %(MNTPT) -o ${concatStringsSep "," (cfg.fuseMountOptions ++ [ "%(OPTIONS)" ])}</fusemount>
<!-- the comma in front of the options is necessary for empty options -->
<fusemount>${pkgs.fuse}/bin/mount.fuse %(VOLUME) %(MNTPT) -o ,${concatStringsSep "," (cfg.fuseMountOptions ++ [ "%(OPTIONS)" ])}'</fusemount>
<fuseumount>${pkgs.fuse}/bin/fusermount -u %(MNTPT)</fuseumount>
<cryptmount>${pkgs.pam_mount}/bin/mount.crypt -o ${concatStringsSep "," (cfg.cryptMountOptions ++ [ "%(OPTIONS)" ])} %(VOLUME) %(MNTPT)</cryptmount>
<!-- the comma in front of the options is necessary for empty options -->
<cryptmount>${pkgs.pam_mount}/bin/mount.crypt -o ,${concatStringsSep "," (cfg.cryptMountOptions ++ [ "%(OPTIONS)" ])} %(VOLUME) %(MNTPT)</cryptmount>
<cryptumount>${pkgs.pam_mount}/bin/umount.crypt %(MNTPT)</cryptumount>
<pmvarrun>${pkgs.pam_mount}/bin/pmvarrun -u %(USER) -o %(OPERATION)</pmvarrun>
${optionalString oflRequired "<ofl>${fake_ofl}/bin/fake_ofl %(SIGNAL) %(MNTPT)</ofl>"}

View File

@ -25,6 +25,8 @@ in
options.services.thelounge = {
enable = mkEnableOption (lib.mdDoc "The Lounge web IRC client");
package = mkPackageOptionMD pkgs "thelounge" { };
public = mkOption {
type = types.bool;
default = false;
@ -93,11 +95,11 @@ in
serviceConfig = {
User = "thelounge";
StateDirectory = baseNameOf dataDir;
ExecStart = "${pkgs.thelounge}/bin/thelounge start";
ExecStart = "${getExe cfg.package} start";
};
};
environment.systemPackages = [ pkgs.thelounge ];
environment.systemPackages = [ cfg.package ];
};
meta = {

View File

@ -154,6 +154,9 @@ in
description = "Mirakurun user";
group = "video";
isSystemUser = true;
# NPM insists on creating ~/.npm
home = "/var/cache/mirakurun";
};
services.mirakurun.serverSettings = {
@ -171,9 +174,10 @@ in
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
ExecStart = "${mirakurun}/bin/mirakurun-start";
ExecStart = "${mirakurun}/bin/mirakurun start";
User = username;
Group = groupname;
CacheDirectory = "mirakurun";
RuntimeDirectory="mirakurun";
StateDirectory="mirakurun";
Nice = -10;

View File

@ -0,0 +1,375 @@
{ options, config, lib, pkgs, utils, ... }:
with lib;
let
cfg = config.services.sftpgo;
defaultUser = "sftpgo";
settingsFormat = pkgs.formats.json {};
configFile = settingsFormat.generate "sftpgo.json" cfg.settings;
hasPrivilegedPorts = any (port: port > 0 && port < 1024) (
catAttrs "port" (cfg.settings.httpd.bindings
++ cfg.settings.ftpd.bindings
++ cfg.settings.sftpd.bindings
++ cfg.settings.webdavd.bindings
)
);
in
{
options.services.sftpgo = {
enable = mkOption {
type = types.bool;
default = false;
description = mdDoc "sftpgo";
};
package = mkOption {
type = types.package;
default = pkgs.sftpgo;
defaultText = literalExpression "pkgs.sftpgo";
description = mdDoc ''
Which SFTPGo package to use.
'';
};
extraArgs = mkOption {
type = with types; listOf str;
default = [];
description = mdDoc ''
Additional command line arguments to pass to the sftpgo daemon.
'';
example = [ "--log-level" "info" ];
};
dataDir = mkOption {
type = types.str;
default = "/var/lib/sftpgo";
description = mdDoc ''
The directory where SFTPGo stores its data files.
'';
};
user = mkOption {
type = types.str;
default = defaultUser;
description = mdDoc ''
User account name under which SFTPGo runs.
'';
};
group = mkOption {
type = types.str;
default = defaultUser;
description = mdDoc ''
Group name under which SFTPGo runs.
'';
};
loadDataFile = mkOption {
default = null;
type = with types; nullOr path;
description = mdDoc ''
Path to a json file containing users and folders to load (or update) on startup.
Check the [documentation](https://github.com/drakkan/sftpgo/blob/main/docs/full-configuration.md)
for the `--loaddata-from` command line argument for more info.
'';
};
settings = mkOption {
default = {};
description = mdDoc ''
The primary sftpgo configuration. See the
[configuration reference](https://github.com/drakkan/sftpgo/blob/main/docs/full-configuration.md)
for possible values.
'';
type = with types; submodule {
freeformType = settingsFormat.type;
options = {
httpd.bindings = mkOption {
default = [];
description = mdDoc ''
Configure listen addresses and ports for httpd.
'';
type = types.listOf (types.submodule {
freeformType = settingsFormat.type;
options = {
address = mkOption {
type = types.str;
default = "127.0.0.1";
description = mdDoc ''
Network listen address. Leave blank to listen on all available network interfaces.
On *NIX you can specify an absolute path to listen on a Unix-domain socket.
'';
};
port = mkOption {
type = types.port;
default = 8080;
description = mdDoc ''
The port for serving HTTP(S) requests.
Setting the port to `0` disables listening on this interface binding.
'';
};
enable_web_admin = mkOption {
type = types.bool;
default = true;
description = mdDoc ''
Enable the built-in web admin for this interface binding.
'';
};
enable_web_client = mkOption {
type = types.bool;
default = true;
description = mdDoc ''
Enable the built-in web client for this interface binding.
'';
};
};
});
};
ftpd.bindings = mkOption {
default = [];
description = mdDoc ''
Configure listen addresses and ports for ftpd.
'';
type = types.listOf (types.submodule {
freeformType = settingsFormat.type;
options = {
address = mkOption {
type = types.str;
default = "127.0.0.1";
description = mdDoc ''
Network listen address. Leave blank to listen on all available network interfaces.
On *NIX you can specify an absolute path to listen on a Unix-domain socket.
'';
};
port = mkOption {
type = types.port;
default = 0;
description = mdDoc ''
The port for serving FTP requests.
Setting the port to `0` disables listening on this interface binding.
'';
};
};
});
};
sftpd.bindings = mkOption {
default = [];
description = mdDoc ''
Configure listen addresses and ports for sftpd.
'';
type = types.listOf (types.submodule {
freeformType = settingsFormat.type;
options = {
address = mkOption {
type = types.str;
default = "127.0.0.1";
description = mdDoc ''
Network listen address. Leave blank to listen on all available network interfaces.
On *NIX you can specify an absolute path to listen on a Unix-domain socket.
'';
};
port = mkOption {
type = types.port;
default = 0;
description = mdDoc ''
The port for serving SFTP requests.
Setting the port to `0` disables listening on this interface binding.
'';
};
};
});
};
webdavd.bindings = mkOption {
default = [];
description = mdDoc ''
Configure listen addresses and ports for webdavd.
'';
type = types.listOf (types.submodule {
freeformType = settingsFormat.type;
options = {
address = mkOption {
type = types.str;
default = "127.0.0.1";
description = mdDoc ''
Network listen address. Leave blank to listen on all available network interfaces.
On *NIX you can specify an absolute path to listen on a Unix-domain socket.
'';
};
port = mkOption {
type = types.port;
default = 0;
description = mdDoc ''
The port for serving WebDAV requests.
Setting the port to `0` disables listening on this interface binding.
'';
};
};
});
};
smtp = mkOption {
default = {};
description = mdDoc ''
SMTP configuration section.
'';
type = types.submodule {
freeformType = settingsFormat.type;
options = {
host = mkOption {
type = types.str;
default = "";
description = mdDoc ''
Location of SMTP email server. Leave empty to disable email sending capabilities.
'';
};
port = mkOption {
type = types.port;
default = 465;
description = mdDoc "Port of the SMTP Server.";
};
encryption = mkOption {
type = types.enum [ 0 1 2 ];
default = 1;
description = mdDoc ''
Encryption scheme:
- `0`: No encryption
- `1`: TLS
- `2`: STARTTLS
'';
};
auth_type = mkOption {
type = types.enum [ 0 1 2 ];
default = 0;
description = mdDoc ''
- `0`: Plain
- `1`: Login
- `2`: CRAM-MD5
'';
};
user = mkOption {
type = types.str;
default = "sftpgo";
description = mdDoc "SMTP username.";
};
from = mkOption {
type = types.str;
default = "SFTPGo <sftpgo@example.com>";
description = mdDoc ''
From address.
'';
};
};
};
};
};
};
};
};
config = mkIf cfg.enable {
services.sftpgo.settings = (mapAttrs (name: mkDefault) {
ftpd.bindings = [{ port = 0; }];
httpd.bindings = [{ port = 0; }];
sftpd.bindings = [{ port = 0; }];
webdavd.bindings = [{ port = 0; }];
httpd.openapi_path = "${cfg.package}/share/sftpgo/openapi";
httpd.templates_path = "${cfg.package}/share/sftpgo/templates";
httpd.static_files_path = "${cfg.package}/share/sftpgo/static";
smtp.templates_path = "${cfg.package}/share/sftpgo/templates";
});
users = optionalAttrs (cfg.user == defaultUser) {
users = {
${defaultUser} = {
description = "SFTPGo system user";
isSystemUser = true;
group = defaultUser;
home = cfg.dataDir;
};
};
groups = {
${defaultUser} = {
members = [ defaultUser ];
};
};
};
systemd.services.sftpgo = {
description = "SFTPGo daemon";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
environment = {
SFTPGO_CONFIG_FILE = mkDefault configFile;
SFTPGO_LOG_FILE_PATH = mkDefault ""; # log to journal
SFTPGO_LOADDATA_FROM = mkIf (cfg.loadDataFile != null) cfg.loadDataFile;
};
serviceConfig = mkMerge [
({
Type = "simple";
User = cfg.user;
Group = cfg.group;
WorkingDirectory = cfg.dataDir;
ReadWritePaths = [ cfg.dataDir ];
LimitNOFILE = 8192; # taken from upstream
KillMode = "mixed";
ExecStart = "${cfg.package}/bin/sftpgo serve ${utils.escapeSystemdExecArgs cfg.extraArgs}";
ExecReload = "${pkgs.util-linux}/bin/kill -s HUP $MAINPID";
# Service hardening
CapabilityBoundingSet = [ (optionalString hasPrivilegedPorts "CAP_NET_BIND_SERVICE") ];
DevicePolicy = "closed";
LockPersonality = true;
NoNewPrivileges = true;
PrivateDevices = true;
PrivateTmp = true;
ProcSubset = "pid";
ProtectClock = true;
ProtectControlGroups = true;
ProtectHome = true;
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectProc = "invisible";
ProtectSystem = "strict";
RemoveIPC = true;
RestrictAddressFamilies = "AF_INET AF_INET6 AF_UNIX";
RestrictNamespaces = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
SystemCallArchitectures = "native";
SystemCallFilter = [ "@system-service" "~@privileged" ];
UMask = "0077";
})
(mkIf hasPrivilegedPorts {
AmbientCapabilities = "CAP_NET_BIND_SERVICE";
})
(mkIf (cfg.dataDir == options.services.sftpgo.dataDir.default) {
StateDirectory = baseNameOf cfg.dataDir;
})
];
};
};
}

View File

@ -0,0 +1,64 @@
{ config, lib, pkgs, utils, ... }:
let
requiredStratisFilesystems = lib.attrsets.filterAttrs (_: x: utils.fsNeededForBoot x && x.stratis.poolUuid != null) config.fileSystems;
in
{
options = {};
config = lib.mkIf (requiredStratisFilesystems != {}) {
assertions = [
{
assertion = config.boot.initrd.systemd.enable;
message = "stratis root fs requires systemd stage 1";
}
];
boot.initrd = {
systemd = {
storePaths = [
"${pkgs.stratisd}/lib/udev/stratis-base32-decode"
"${pkgs.stratisd}/lib/udev/stratis-str-cmp"
"${pkgs.lvm2.bin}/bin/dmsetup"
"${pkgs.stratisd}/libexec/stratisd-min"
"${pkgs.stratisd.initrd}/bin/stratis-rootfs-setup"
];
packages = [pkgs.stratisd.initrd];
extraBin = {
thin_check = "${pkgs."thin-provisioning-tools"}/bin/thin_check";
thin_repair = "${pkgs."thin-provisioning-tools"}/bin/thin_repair";
thin_metadata_size = "${pkgs."thin-provisioning-tools"}/bin/thin_metadata_size";
stratis-min = "${pkgs.stratisd}/bin/stratis-min";
};
services =
lib.attrsets.mapAttrs' (
mountPoint: fileSystem: {
name = "stratis-setup-${fileSystem.stratis.poolUuid}";
value = {
description = "setup for Stratis root filesystem";
unitConfig.DefaultDependencies = "no";
conflicts = [ "shutdown.target" "initrd-switch-root.target" ];
onFailure = [ "emergency.target" ];
unitConfig.OnFailureJobMode = "isolate";
wants = [ "stratisd-min.service" "plymouth-start.service" ];
wantedBy = [ "initrd.target" ];
after = [ "paths.target" "plymouth-start.service" "stratisd-min.service" ];
before = [ "initrd.target" "shutdown.target" "initrd-switch-root.target" ];
environment.STRATIS_ROOTFS_UUID = fileSystem.stratis.poolUuid;
serviceConfig = {
Type = "oneshot";
ExecStart = "${pkgs.stratisd.initrd}/bin/stratis-rootfs-setup";
RemainAfterExit = "yes";
};
};
}
) requiredStratisFilesystems;
};
availableKernelModules = [ "dm-thin-pool" "dm-crypt" ] ++ [ "aes" "aes_generic" "blowfish" "twofish"
"serpent" "cbc" "xts" "lrw" "sha1" "sha256" "sha512"
"af_alg" "algif_skcipher"
];
services.udev.packages = [
pkgs.stratisd.initrd
pkgs.lvm2
];
};
};
}

View File

@ -36,6 +36,15 @@ let
description = lib.mdDoc "Location of the mounted file system.";
};
stratis.poolUuid = lib.mkOption {
type = types.uniq (types.nullOr types.str);
description = lib.mdDoc ''
UUID of the stratis pool that the fs is located in
'';
example = "04c68063-90a5-4235-b9dd-6180098a20d9";
default = null;
};
device = mkOption {
default = null;
example = "/dev/sda";

View File

@ -187,20 +187,20 @@ with lib;
guestAgentSupport = false;
}).overrideAttrs ( super: rec {
version = "7.0.0";
version = "7.2.1";
src = pkgs.fetchurl {
url= "https://download.qemu.org/qemu-${version}.tar.xz";
sha256 = "sha256-9rN1x5UfcoQCeYsLqrsthkeMpT1Eztvvq74cRr9G+Dk=";
sha256 = "sha256-jIVpms+dekOl/immTN1WNwsMLRrQdLr3CYqCTReq1zs=";
};
patches = [
# Proxmox' VMA tool is published as a particular patch upon QEMU
(pkgs.fetchpatch {
url =
let
rev = "1976ca460796f28447b41e3618e5c1e234035dd5";
path = "debian/patches/pve/0026-PVE-Backup-add-vma-backup-format-code.patch";
rev = "abb04bb6272c1202ca9face0827917552b9d06f6";
path = "debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch";
in "https://git.proxmox.com/?p=pve-qemu.git;a=blob_plain;hb=${rev};f=${path}";
hash = "sha256-2Dz+ceTwrcyYYxi76RtyY3v15/2pwGcDhFuoZWlgbjc=";
hash = "sha256-3d0HHdvaExCry6zcULnziYnWIAnn24vECkI4sjj2BMg=";
})
# Proxmox' VMA tool uses O_DIRECT which fails on tmpfs
@ -220,6 +220,7 @@ with lib;
];
buildInputs = super.buildInputs ++ [ pkgs.libuuid ];
nativeBuildInputs = super.nativeBuildInputs ++ [ pkgs.perl ];
});
in

View File

@ -665,6 +665,7 @@ in {
seafile = handleTest ./seafile.nix {};
searx = handleTest ./searx.nix {};
service-runner = handleTest ./service-runner.nix {};
sftpgo = runTest ./sftpgo.nix;
sfxr-qt = handleTest ./sfxr-qt.nix {};
sgtpuzzles = handleTest ./sgtpuzzles.nix {};
shadow = handleTest ./shadow.nix {};

View File

@ -27,6 +27,7 @@
simpleUefiGrub
simpleUefiGrubSpecialisation
simpleUefiSystemdBoot
stratisRoot
# swraid
zfsroot
;

View File

@ -989,4 +989,39 @@ in {
)
'';
};
} // optionalAttrs systemdStage1 {
stratisRoot = makeInstallerTest "stratisRoot" {
createPartitions = ''
machine.succeed(
"sgdisk --zap-all /dev/vda",
"sgdisk --new=1:0:+100M --typecode=0:ef00 /dev/vda", # /boot
"sgdisk --new=2:0:+1G --typecode=0:8200 /dev/vda", # swap
"sgdisk --new=3:0:+5G --typecode=0:8300 /dev/vda", # /
"udevadm settle",
"mkfs.vfat /dev/vda1",
"mkswap /dev/vda2 -L swap",
"swapon -L swap",
"stratis pool create my-pool /dev/vda3",
"stratis filesystem create my-pool nixos",
"udevadm settle",
"mount /dev/stratis/my-pool/nixos /mnt",
"mkdir -p /mnt/boot",
"mount /dev/vda1 /mnt/boot"
)
'';
bootLoader = "systemd-boot";
extraInstallerConfig = { modulesPath, ...}: {
config = {
services.stratis.enable = true;
environment.systemPackages = [
pkgs.stratis-cli
pkgs.thin-provisioning-tools
pkgs.lvm2.bin
pkgs.stratisd.initrd
];
};
};
};
}

View File

@ -3,11 +3,6 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
meta = {
maintainers = with lib.maintainers; [ OPNA2608 ];
# Natively running Mir has problems with capturing the first registered libinput device.
# In our VM runners on ARM and on some hardware configs (my RPi4, distro-independent), this misses the keyboard.
# It can be worked around by dis- and reconnecting the affected hardware, but we can't do this in these tests.
# https://github.com/MirServer/mir/issues/2837
broken = pkgs.stdenv.hostPlatform.isAarch;
};
nodes.machine = { config, ... }: {

384
nixos/tests/sftpgo.nix Normal file
View File

@ -0,0 +1,384 @@
# SFTPGo NixOS test
#
# This NixOS test sets up a basic test scenario for the SFTPGo module
# and covers the following scenarios:
# - uploading a file via sftp
# - downloading the file over sftp
# - assert that the ACLs are respected
# - share a file between alice and bob (using sftp)
# - assert that eve cannot acceess the shared folder between alice and bob.
#
# Additional test coverage for the remaining protocols (i.e. ftp, http and webdav)
# would be a nice to have for the future.
{ pkgs, lib, ... }:
with lib;
let
inherit (import ./ssh-keys.nix pkgs) snakeOilPrivateKey snakeOilPublicKey;
# Returns an attributeset of users who are not system users.
normalUsers = config:
filterAttrs (name: user: user.isNormalUser) config.users.users;
# Returns true if a user is a member of the given group
isMemberOf =
config:
# str
groupName:
# users.users attrset
user:
any (x: x == user.name) config.users.groups.${groupName}.members;
# Generates a valid SFTPGo user configuration for a given user
# Will be converted to JSON and loaded on application startup.
generateUserAttrSet =
config:
# attrset returned by config.users.users.<username>
user: {
# 0: user is disabled, login is not allowed
# 1: user is enabled
status = 1;
username = user.name;
password = ""; # disables password authentication
public_keys = user.openssh.authorizedKeys.keys;
email = "${user.name}@example.com";
# User home directory on the local filesystem
home_dir = "${config.services.sftpgo.dataDir}/users/${user.name}";
# Defines a mapping between virtual SFTPGo paths and filesystem paths outside the user home directory.
#
# Supported for local filesystem only. If one or more of the specified folders are not
# inside the dataprovider they will be automatically created.
# You have to create the folder on the filesystem yourself
virtual_folders =
optional (isMemberOf config sharedFolderName user) {
name = sharedFolderName;
mapped_path = "${config.services.sftpgo.dataDir}/${sharedFolderName}";
virtual_path = "/${sharedFolderName}";
};
# Defines the ACL on the virtual filesystem
permissions =
recursiveUpdate {
"/" = [ "list" ]; # read-only top level directory
"/private" = [ "*" ]; # private subdirectory, not shared with others
} (optionalAttrs (isMemberOf config "shared" user) {
"/shared" = [ "*" ];
});
filters = {
allowed_ip = [];
denied_ip = [];
web_client = [
"password-change-disabled"
"password-reset-disabled"
"api-key-auth-change-disabled"
];
};
upload_bandwidth = 0; # unlimited
download_bandwidth = 0; # unlimited
expiration_date = 0; # means no expiration
max_sessions = 0;
quota_size = 0;
quota_files = 0;
};
# Generates a json file containing a static configuration
# of users and folders to import to SFTPGo.
loadDataJson = config: pkgs.writeText "users-and-folders.json" (builtins.toJSON {
users =
mapAttrsToList (name: user: generateUserAttrSet config user) (normalUsers config);
folders = [
{
name = sharedFolderName;
description = "shared folder";
# 0: local filesystem
# 1: AWS S3 compatible
# 2: Google Cloud Storage
filesystem.provider = 0;
# Mapped path on the local filesystem
mapped_path = "${config.services.sftpgo.dataDir}/${sharedFolderName}";
# All users in the matching group gain access
users = config.users.groups.${sharedFolderName}.members;
}
];
});
# Generated Host Key for connecting to SFTPGo's sftp subsystem.
snakeOilHostKey = pkgs.writeText "sftpgo_ed25519_host_key" ''
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBOtQu6U135yxtrvUqPoozUymkjoNNPVK6rqjS936RLtQAAAJAXOMoSFzjK
EgAAAAtzc2gtZWQyNTUxOQAAACBOtQu6U135yxtrvUqPoozUymkjoNNPVK6rqjS936RLtQ
AAAEAoRLEV1VD80mg314ObySpfrCcUqtWoOSS3EtMPPhx08U61C7pTXfnLG2u9So+ijNTK
aSOg009UrquqNL3fpEu1AAAADHNmdHBnb0BuaXhvcwE=
-----END OPENSSH PRIVATE KEY-----
'';
adminUsername = "admin";
adminPassword = "secretadminpassword";
aliceUsername = "alice";
alicePassword = "secretalicepassword";
bobUsername = "bob";
bobPassword = "secretbobpassword";
eveUsername = "eve";
evePassword = "secretevepassword";
sharedFolderName = "shared";
# A file for testing uploading via SFTP
testFile = pkgs.writeText "test.txt" "hello world";
sharedFile = pkgs.writeText "shared.txt" "shared content";
# Define the for exposing SFTP
sftpPort = 2022;
# Define the for exposing HTTP
httpPort = 8080;
in
{
name = "sftpgo";
meta.maintainers = with maintainers; [ yayayayaka ];
nodes = {
server = { nodes, ... }: {
networking.firewall.allowedTCPPorts = [ sftpPort httpPort ];
# nodes.server.configure postgresql database
services.postgresql = {
enable = true;
ensureDatabases = [ "sftpgo" ];
ensureUsers = [{
name = "sftpgo";
ensurePermissions."DATABASE sftpgo" = "ALL PRIVILEGES";
}];
};
services.sftpgo = {
enable = true;
loadDataFile = (loadDataJson nodes.server);
settings = {
data_provider = {
driver = "postgresql";
name = "sftpgo";
username = "sftpgo";
host = "/run/postgresql";
port = 5432;
# Enables the possibility to create an initial admin user on first startup.
create_default_admin = true;
};
httpd.bindings = [
{
address = ""; # listen on all interfaces
port = httpPort;
enable_https = false;
enable_web_client = true;
enable_web_admin = true;
}
];
# Enable sftpd
sftpd = {
bindings = [{
address = ""; # listen on all interfaces
port = sftpPort;
}];
host_keys = [ snakeOilHostKey ];
password_authentication = false;
keyboard_interactive_authentication = false;
};
};
};
systemd.services.sftpgo = {
after = [ "postgresql.service"];
environment = {
# Update existing users
SFTPGO_LOADDATA_MODE = "0";
SFTPGO_DEFAULT_ADMIN_USERNAME = adminUsername;
# This will end up in cleartext in the systemd service.
# Don't use this approach in production!
SFTPGO_DEFAULT_ADMIN_PASSWORD = adminPassword;
};
};
# Sets up the folder hierarchy on the local filesystem
systemd.tmpfiles.rules =
let
sftpgoUser = nodes.server.services.sftpgo.user;
sftpgoGroup = nodes.server.services.sftpgo.group;
statePath = nodes.server.services.sftpgo.dataDir;
in [
# Create state directory
"d ${statePath} 0750 ${sftpgoUser} ${sftpgoGroup} -"
"d ${statePath}/users 0750 ${sftpgoUser} ${sftpgoGroup} -"
# Created shared folder directories
"d ${statePath}/${sharedFolderName} 2770 ${sftpgoUser} ${sharedFolderName} -"
]
++ mapAttrsToList (name: user:
# Create private user directories
''
d ${statePath}/users/${user.name} 0700 ${sftpgoUser} ${sftpgoGroup} -
d ${statePath}/users/${user.name}/private 0700 ${sftpgoUser} ${sftpgoGroup} -
''
) (normalUsers nodes.server);
users.users =
let
commonAttrs = {
isNormalUser = true;
openssh.authorizedKeys.keys = [ snakeOilPublicKey ];
};
in {
# SFTPGo admin user
admin = commonAttrs // {
password = adminPassword;
};
# Alice and bob share folders with each other
alice = commonAttrs // {
password = alicePassword;
extraGroups = [ sharedFolderName ];
};
bob = commonAttrs // {
password = bobPassword;
extraGroups = [ sharedFolderName ];
};
# Eve has no shared folders
eve = commonAttrs // {
password = evePassword;
};
};
users.groups.${sharedFolderName} = {};
specialisation = {
# A specialisation for asserting that SFTPGo can bind to privileged ports.
privilegedPorts.configuration = { ... }: {
networking.firewall.allowedTCPPorts = [ 22 80 ];
services.sftpgo = {
settings = {
sftpd.bindings = mkForce [{
address = "";
port = 22;
}];
httpd.bindings = mkForce [{
address = "";
port = 80;
}];
};
};
};
};
};
client = { nodes, ... }: {
# Add the SFTPGo host key to the global known_hosts file
programs.ssh.knownHosts =
let
commonAttrs = {
publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE61C7pTXfnLG2u9So+ijNTKaSOg009UrquqNL3fpEu1";
};
in {
"server" = commonAttrs;
"[server]:2022" = commonAttrs;
};
};
};
testScript = { nodes, ... }: let
# A function to generate test cases for wheter
# a specified username is expected to access the shared folder.
accessSharedFoldersSubtest =
{ # The username to run as
username
# Whether the tests are expected to succeed or not
, shouldSucceed ? true
}: ''
with subtest("Test whether ${username} can access shared folders"):
client.${if shouldSucceed then "succeed" else "fail"}("sftp -P ${toString sftpPort} -b ${
pkgs.writeText "${username}-ls-${sharedFolderName}" ''
ls ${sharedFolderName}
''
} ${username}@server")
'';
statePath = nodes.server.services.sftpgo.dataDir;
in ''
start_all()
client.wait_for_unit("default.target")
server.wait_for_unit("sftpgo.service")
with subtest("web client"):
client.wait_until_succeeds("curl -sSf http://server:${toString httpPort}/web/client/login")
# Ensure sftpgo found the static folder
client.wait_until_succeeds("curl -o /dev/null -sSf http://server:${toString httpPort}/static/favicon.ico")
with subtest("Setup SSH keys"):
client.succeed("mkdir -m 700 /root/.ssh")
client.succeed("cat ${snakeOilPrivateKey} > /root/.ssh/id_ecdsa")
client.succeed("chmod 600 /root/.ssh/id_ecdsa")
with subtest("Copy a file over sftp"):
client.wait_until_succeeds("scp -P ${toString sftpPort} ${toString testFile} alice@server:/private/${testFile.name}")
server.succeed("test -s ${statePath}/users/alice/private/${testFile.name}")
# The configured ACL should prevent uploading files to the root directory
client.fail("scp -P ${toString sftpPort} ${toString testFile} alice@server:/")
with subtest("Attempting an interactive SSH sessions must fail"):
client.fail("ssh -p ${toString sftpPort} alice@server")
${accessSharedFoldersSubtest {
username = "alice";
shouldSucceed = true;
}}
${accessSharedFoldersSubtest {
username = "bob";
shouldSucceed = true;
}}
${accessSharedFoldersSubtest {
username = "eve";
shouldSucceed = false;
}}
with subtest("Test sharing files"):
# Alice uploads a file to shared folder
client.succeed("scp -P ${toString sftpPort} ${toString sharedFile} alice@server:/${sharedFolderName}/${sharedFile.name}")
server.succeed("test -s ${statePath}/${sharedFolderName}/${sharedFile.name}")
# Bob downloads the file from shared folder
client.succeed("scp -P ${toString sftpPort} bob@server:/shared/${sharedFile.name} ${sharedFile.name}")
client.succeed("test -s ${sharedFile.name}")
# Eve should not get the file from shared folder
client.fail("scp -P ${toString sftpPort} eve@server:/shared/${sharedFile.name}")
server.succeed("/run/current-system/specialisation/privilegedPorts/bin/switch-to-configuration test")
client.wait_until_succeeds("sftp -P 22 -b ${pkgs.writeText "get-hello-world.txt" ''
get /private/${testFile.name}
''} alice@server")
'';
}

View File

@ -1,10 +1,10 @@
{ python3Packages, lib, flac, lame, opusTools, vorbis-tools, ffmpeg }:
{ python3Packages, fetchPypi, lib, flac, lame, opusTools, vorbis-tools, ffmpeg }:
python3Packages.buildPythonApplication rec {
pname = "flac2all";
version = "5.1";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "OBjlr7cbSx2WOIfZUNwHy5Hpb2Fmh3vmZdc70JiWsiI=";
};

View File

@ -1,5 +1,6 @@
{ lib
, python3
, fetchPypi
}:
python3.pkgs.buildPythonPackage rec {
@ -7,7 +8,7 @@ python3.pkgs.buildPythonPackage rec {
version = "2.0.67";
format = "setuptools";
src = python3.pkgs.fetchPypi {
src = fetchPypi {
inherit pname version;
hash = "sha256-lFxAMjglQZXCySr83PtvStU6hw2ucQu+rSjIHo1yZBk=";
};

View File

@ -1,5 +1,6 @@
{ lib
, python3Packages
, fetchPypi
}:
with python3Packages;

View File

@ -5,13 +5,13 @@
}:
stdenv.mkDerivation rec {
version = "10.11";
version = "10.13";
pname = "monkeys-audio";
src = fetchzip {
url = "https://monkeysaudio.com/files/MAC_${
builtins.concatStringsSep "" (lib.strings.splitString "." version)}_SDK.zip";
sha256 = "sha256-sA1JXRbyHMHBCsWau9GrlxeRiCzxZfCTuLFebZmIoRE=";
sha256 = "sha256-r+Xjp5q7ehrF34j1FndiKZ+y+FTG1ORXS+9p+R2KbOQ=";
stripRoot = false;
};
nativeBuildInputs = [

View File

@ -1,9 +1,9 @@
{ lib, python3Packages, mopidy }:
{ lib, python3Packages, fetchPypi, mopidy }:
python3Packages.buildPythonApplication rec {
pname = "Mopidy-Bandcamp";
version = "1.1.5";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "sha256-wg9zcOKfZQRhpyA1Cu5wvdwKpmrlcr2m9mrqBHgUXAQ=";
};

View File

@ -1,10 +1,10 @@
{ lib, python3Packages, mopidy }:
{ lib, python3Packages, fetchPypi, mopidy }:
python3Packages.buildPythonApplication rec {
pname = "Mopidy-Iris";
version = "3.64.0";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "062x73glhn1x4wgc7zmb9y3cq15d5grgqf5drdpbp6p3cgk4s2vc";
};

View File

@ -1,10 +1,10 @@
{ lib, python3Packages, mopidy }:
{ lib, python3Packages, fetchPypi, mopidy }:
python3Packages.buildPythonApplication rec {
pname = "mopidy-jellyfin";
version = "1.0.4";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit version;
pname = "Mopidy-Jellyfin";
sha256 = "ny0u6HdOlZCsmIzZuQ1rql+bvHU3xkh8IdwhJVHNH9c=";

View File

@ -1,7 +1,7 @@
{ stdenv
, lib
{ lib
, mopidy
, python3Packages
, fetchPypi
, fetchpatch
}:
@ -9,7 +9,7 @@ python3Packages.buildPythonApplication rec {
pname = "Mopidy-Local";
version = "3.2.1";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "18w39mxpv8p17whd6zfw5653d21q138f8xd6ili6ks2g2dbm25i9";
};

View File

@ -1,10 +1,10 @@
{ lib, pythonPackages, mopidy, glibcLocales }:
{ lib, pythonPackages, fetchPypi, mopidy, glibcLocales }:
pythonPackages.buildPythonApplication rec {
pname = "Mopidy-Moped";
version = "0.7.1";
src = pythonPackages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "15461174037d87af93dd59a236d4275c5abf71cea0670ffff24a7d0399a8a2e4";
};

View File

@ -1,10 +1,10 @@
{ lib, pythonPackages, mopidy }:
{ lib, pythonPackages, fetchPypi, mopidy }:
pythonPackages.buildPythonApplication rec {
pname = "Mopidy-Mopify";
version = "1.6.1";
src = pythonPackages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "93ad2b3d38b1450c8f2698bb908b0b077a96b3f64cdd6486519e518132e23a5c";
};

View File

@ -1,10 +1,10 @@
{ lib, python3Packages, mopidy }:
{ lib, python3Packages, fetchPypi, mopidy }:
python3Packages.buildPythonApplication rec {
pname = "Mopidy-MPD";
version = "3.3.0";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "sha256-CeLMRqj9cwBvQrOx7XHVV8MjDjwOosONVlsN2o+vTVM=";
};

View File

@ -1,10 +1,10 @@
{ lib, python3Packages, mopidy }:
{ lib, python3Packages, fetchPypi, mopidy }:
python3Packages.buildPythonApplication rec {
pname = "mopidy-mpris";
version = "3.0.3";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit version;
pname = "Mopidy-MPRIS";
sha256 = "sha256-rHQgNIyludTEL7RDC8dIpyGTMOt1Tazn6i/orKlSP4U=";

View File

@ -1,10 +1,10 @@
{ lib, pythonPackages, mopidy }:
{ lib, pythonPackages, fetchPypi, mopidy }:
pythonPackages.buildPythonApplication rec {
pname = "mopidy-muse";
version = "0.0.27";
src = pythonPackages.fetchPypi {
src = fetchPypi {
inherit version;
pname = "Mopidy-Muse";
sha256 = "0jx9dkgxr07avzz9zskzhqy98zsxkdrf7iid2ax5vygwf8qsx8ks";

View File

@ -1,10 +1,10 @@
{ lib, pythonPackages, mopidy }:
{ lib, fetchPypi, pythonPackages, mopidy }:
pythonPackages.buildPythonApplication rec {
pname = "Mopidy-Notify";
version = "0.2.0";
src = pythonPackages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "sha256-lzZupjlS0kbNvsn18serOoMfu0sRb0nRwpowvOPvt/g=";
};

View File

@ -1,10 +1,10 @@
{ lib, python3Packages, mopidy }:
{ lib, python3Packages, fetchPypi, mopidy }:
python3Packages.buildPythonApplication rec {
pname = "mopidy-podcast";
version = "3.0.0";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit version;
pname = "Mopidy-Podcast";
sha256 = "1z2b523yvdpcf8p7m7kczrvaw045lmxzhq4qj00dflxa2yw61qxr";

View File

@ -1,10 +1,10 @@
{ lib, python3Packages, mopidy }:
{ lib, python3Packages, fetchPypi, mopidy }:
python3Packages.buildPythonApplication rec {
pname = "Mopidy-Scrobbler";
version = "2.0.1";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "11vxgax4xgkggnq4fr1rh2rcvzspkkimck5p3h4phdj3qpnj0680";
};

View File

@ -1,10 +1,10 @@
{ lib, python3Packages, mopidy }:
{ lib, python3Packages, fetchPypi, mopidy }:
python3Packages.buildPythonApplication rec {
pname = "mopidy-somafm";
version = "2.0.2";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit version;
pname = "Mopidy-SomaFM";
sha256 = "DC0emxkoWfjGHih2C8nINBFByf521Xf+3Ks4JRxNPLM=";

View File

@ -1,5 +1,6 @@
{ lib
, python3Packages
, fetchPypi
, mopidy
}:
@ -7,7 +8,7 @@ python3Packages.buildPythonApplication rec {
pname = "Mopidy-Tidal";
version = "0.3.2";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
hash = "sha256-ekqhzKyU2WqTOeRR1ZSZA9yW3UXsLBsC2Bk6FZrQgmc=";
};

View File

@ -1,10 +1,10 @@
{ lib, python3Packages, mopidy }:
{ lib, python3Packages, fetchPypi, mopidy }:
python3Packages.buildPythonApplication rec {
pname = "mopidy-tunein";
version = "1.1.0";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit version;
pname = "Mopidy-TuneIn";
sha256 = "01y1asylscr73yqx071imhrzfzlg07wmqqzkdvpgm6r35marc2li";

View File

@ -1,5 +1,6 @@
{ lib
, python3
, fetchPypi
, mopidy
}:
@ -8,7 +9,7 @@ let
packageOverrides = self: super: {
ytmusicapi = super.ytmusicapi.overridePythonAttrs (old: rec {
version = "0.25.1";
src = self.fetchPypi {
src = fetchPypi {
inherit (old) pname;
inherit version;
hash = "sha256-uc/fgDetSYaCRzff0SzfbRhs3TaKrfE2h6roWkkj8yQ=";
@ -20,7 +21,7 @@ in python.pkgs.buildPythonApplication rec {
pname = "mopidy-ytmusic";
version = "0.3.8";
src = python.pkgs.fetchPypi {
src = fetchPypi {
inherit version;
pname = "mopidy_ytmusic";
sha256 = "6b4d8ff9c477dbdd30d0259a009494ebe104cad3f8b37241ae503e5bce4ec2e8";

View File

@ -5,14 +5,14 @@
mkDerivation rec {
pname = "qpwgraph";
version = "0.4.0";
version = "0.4.2";
src = fetchFromGitLab {
domain = "gitlab.freedesktop.org";
owner = "rncbc";
repo = "qpwgraph";
rev = "v${version}";
sha256 = "sha256-bOg+7bNEhnemhb+Xi3x77ZEjqKFjUXSCFgvcLXrxz/E=";
sha256 = "sha256-MkPPr9gvEeW94fXH8K9GVYdYpuG1LDgKD16l2pNFvkA=";
};
nativeBuildInputs = [ cmake pkg-config ];

View File

@ -1,9 +1,9 @@
{ lib, python3Packages, dbus }:
{ lib, python3Packages, fetchPypi, dbus }:
python3Packages.buildPythonApplication rec {
pname = "spotify-cli-linux";
version = "1.6.0";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "0slyc3jfrj3rwq8rv6p5aqkw487aw7a87kmf1fb6n4vnvcf08v7w";
};

View File

@ -1,23 +1,31 @@
{ buildGoModule
, fetchFromGitHub
, lib
, testers
, faraday
}:
buildGoModule rec {
pname = "faraday";
version = "0.2.5-alpha";
version = "0.2.11-alpha";
src = fetchFromGitHub {
owner = "lightninglabs";
repo = "faraday";
rev = "v${version}";
sha256 = "16mz333a6awii6g46gr597j31jmgws4285s693q0b87fl1ggj2zz";
hash = "sha256-KiGj24sBeClmzW60lRrvXwgXf3My7jhHTY+VhIMMp0k=";
};
vendorSha256 = "1nclmvypxp5436q6qaagp1k5bfmaia7hsykw47va0pijlsvsbmck";
vendorHash = "sha256-ku/4VE1Gj62vuJLh9J6vKlxpyI7S0RsMDozV7U5YDe4=";
subPackages = [ "cmd/frcli" "cmd/faraday" ];
ldflags = [ "-s" "-w" ];
passthru.tests.version = testers.testVersion {
package = faraday;
};
meta = with lib; {
description = "LND Channel Management Tools";
homepage = "https://github.com/lightninglabs/faraday";

File diff suppressed because it is too large Load Diff

View File

@ -9,13 +9,13 @@
}:
rustPlatform.buildRustPackage rec {
pname = "polkadot";
version = "0.9.41";
version = "0.9.42";
src = fetchFromGitHub {
owner = "paritytech";
repo = "polkadot";
rev = "v${version}";
hash = "sha256-wjV/+2n9B617S6MxC48vtpbBBKGCWBEjRj7K6m630Mo=";
hash = "sha256-W7mD/PLrub5u9GIN8qiTWNsTfirx0aBF2Lu+2PMoxOg=";
# the build process of polkadot requires a .git folder in order to determine
# the git commit hash that is being built and add it to the version string.
@ -34,7 +34,7 @@ rustPlatform.buildRustPackage rec {
cargoLock = {
lockFile = ./Cargo.lock;
outputHashes = {
"binary-merkle-tree-4.0.0-dev" = "sha256-ngtW11MGs+fcuCp9J5NH+dYJeK4YM5vWpRk0OuLYHus=";
"binary-merkle-tree-4.0.0-dev" = "sha256-PEPmG+39YqPQOzT8u1SNTCrVwNWErifBCVz+l8TvdyE=";
"sub-tokens-0.1.0" = "sha256-GvhgZhOIX39zF+TbQWtTCgahDec4lQjH+NqamLFLUxM=";
};
};

View File

@ -1,21 +1,22 @@
{ lib, stdenv, fetchurl, jdk, glib, wrapGAppsHook }:
{ lib, stdenv, fetchurl, openjdk, glib, wrapGAppsHook }:
stdenv.mkDerivation rec {
pname = "bluej";
version = "5.0.3";
version = "5.1.0";
src = fetchurl {
# We use the deb here. First instinct might be to go for the "generic" JAR
# download, but that is actually a graphical installer that is much harder
# to unpack than the deb.
url = "https://www.bluej.org/download/files/BlueJ-linux-${builtins.replaceStrings ["."] [""] version}.deb";
sha256 = "sha256-OarqmptxZc7xEEYeoCVqHXkAvfzfSYx5nUp/iWPyoqw=";
sha256 = "sha256-tOb15wU9OjUt0D8l/JkaGYj84L7HV4FUnQQB5cRAxG0=";
};
nativeBuildInputs = [ wrapGAppsHook ];
buildInputs = [ glib ];
sourceRoot = ".";
preUnpack = ''
unpackCmdHooks+=(_tryDebData)
_tryDebData() {
@ -26,39 +27,29 @@ stdenv.mkDerivation rec {
}
'';
dontWrapGApps = true;
installPhase = ''
runHook preInstall
if [ -n "$prefix" ]; then
mkdir -p "$prefix"
fi
mkdir -p $out
cp -r usr/* $out
mkdir -p "$out"
if shopt -q dotglob; then dotglobOpt=$?; else dotglobOpt=$?; fi
shopt -s dotglob
for file in usr/*; do
cp -R "$file" "$out"
done
if (( !dotglobOpt )); then shopt -u dotglob; fi
makeWrapper ${openjdk}/bin/java $out/bin/bluej \
"''${gappsWrapperArgs[@]}" \
--add-flags "-Dawt.useSystemAAFontSettings=on -Xmx512M \
--add-opens javafx.graphics/com.sun.glass.ui=ALL-UNNAMED \
-jar $out/share/bluej/bluej.jar"
runHook postInstall
'';
dontWrapGApps = true;
preFixup = ''
makeWrapper ${jdk}/bin/java $out/bin/bluej \
"''${gappsWrapperArgs[@]}" \
--add-flags "-Djavafx.embed.singleThread=true -Dawt.useSystemAAFontSettings=on -Xmx512M -cp $out/share/bluej/bluej.jar bluej.Boot"
'';
meta = with lib; {
description = "A simple integrated development environment for Java";
homepage = "https://www.bluej.org/";
sourceProvenance = with sourceTypes; [ binaryBytecode ];
license = licenses.gpl2ClasspathPlus;
maintainers = with maintainers; [ chvp ];
platforms = platforms.unix;
platforms = platforms.linux;
};
}

View File

@ -1,24 +1,17 @@
{ lib, stdenv, fetchurl, emacs }:
{ lib, trivialBuild, fetchurl, haskell-mode }:
# this package installs the emacs-mode which
# resides in the hsc3 sources.
let version = "0.15";
in stdenv.mkDerivation {
trivialBuild rec {
pname = "hsc3-mode";
inherit version;
version = "0.15";
src = fetchurl {
url = "mirror://hackage/hsc3-0.15/hsc3-0.15.tar.gz";
url = "mirror://hackage/hsc3-${version}/hsc3-${version}.tar.gz";
sha256 = "2f3b15655419cf8ebe25ab1c6ec22993b2589b4ffca7c3a75ce478ca78a0bde6";
};
buildInputs = [ emacs ];
packageRequires = [ haskell-mode ];
installPhase = ''
mkdir -p "$out/share/emacs/site-lisp"
cp "emacs/hsc3.el" "$out/share/emacs/site-lisp"
'';
sourceRoot = "hsc3-${version}/emacs";
meta = {
homepage = "http://rd.slavepianos.org/?t=hsc3";

View File

@ -1,4 +1,4 @@
{ lib, python3Packages }:
{ lib, python3Packages, fetchPypi }:
with python3Packages;

View File

@ -23,13 +23,13 @@
let
pname = "pulsar";
version = "1.104.0";
version = "1.105.0";
sourcesPath = {
x86_64-linux.tarname = "Linux.${pname}-${version}.tar.gz";
x86_64-linux.hash = "sha256-HEMUQVNPb6qWIXX25N79HwHo7j11MyFiBRsq9otdAL8=";
x86_64-linux.hash = "sha256-j2d83m8B6lt1eRAwOOTEq4o+CNe8I+6rkz9qyux55Qw=";
aarch64-linux.tarname = "ARM.Linux.${pname}-${version}-arm64.tar.gz";
aarch64-linux.hash = "sha256-f+s54XtLLdhTFY9caKTKngJF6zLai0F7ur9v37bwuNE=";
aarch64-linux.hash = "sha256-iZVE1R30Tynyn/cAwNIiGrsCMTkWKFUforOkGXSzMsw=";
}.${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
additionalLibs = lib.makeLibraryPath [
@ -119,7 +119,7 @@ stdenv.mkDerivation rec {
# But asar complains because the node_gyp unpacked dependency uses a prebuilt Python3 itself
rm $opt/resources/app.asar.unpacked/node_modules/tree-sitter-bash/build/node_gyp_bins/python3
ln -s ${python3}/bin/python3 $opt/resources/app.asar.unpacked/node_modules/tree-sitter-bash/build/node_gyp_bins/python3
ln -s ${python3.interpreter} $opt/resources/app.asar.unpacked/node_modules/tree-sitter-bash/build/node_gyp_bins/python3
'' + ''
# Patch the bundled node executables
find $opt -name "*.node" -exec patchelf --set-rpath "${newLibpath}:$opt" {} \;

View File

@ -13,6 +13,17 @@ const constants = {
targetFile: new URL("default.nix", import.meta.url).pathname,
};
async function utf16ToUtf8(blob) {
// Sometime, upstream saves the SHA256SUMS.txt file in UTF-16, which absolutely breaks node's string handling
// So we need to convert this blob to UTF-8
// We need to skip the first 2 bytes, which are the BOM
const arrayBuffer = await blob.slice(2).arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
const utf8String = buffer.toString('utf16le');
return utf8String;
}
async function getLatestVersion() {
const requestResult = await fetch(constants.githubUrl);
if (!requestResult.ok) {
@ -37,6 +48,7 @@ async function getSha256Sum(hashFileContent, targetFile) {
let sha256 = hashFileContent.
split('\n').
map(line => line.replace("\r", "")). // Side-effect of the UTF-16 conversion, if the file was created from Windows
filter((line) => line.endsWith(targetFile))[0].
split(' ')[0];
@ -47,14 +59,21 @@ async function getSha256Sums(newVersion) {
// Upstream provides a file with the hashes of the files, but it's not in the SRI format, and it refers to the compressed tarball
// So let's just use nix-prefetch-url to get the hashes of the decompressed tarball, and `nix hash to-sri` to convert them to SRI format
const hashFileUrl = constants.sha256FileURL(newVersion);
const hashFileContent = await fetch(hashFileUrl).then((response) => response.text());
const hashFileContent = await fetch(hashFileUrl).then((response) => response.blob());
const headerbuffer = await hashFileContent.slice(0, 2).arrayBuffer()
const header = Buffer.from(headerbuffer).toString('hex');
// We must detect if it's UTF-16 or UTF-8. If it's UTF-16, we must convert it to UTF-8, otherwise just use it as-is
const hashFileContentString = header == 'fffe' ?
await utf16ToUtf8(hashFileContent) :
await hashFileContent.text();
let x86_64;
let aarch64;
console.log("Getting new hashes");
let promises = [
getSha256Sum(hashFileContent, constants.x86_64FileName(newVersion)).then((hash) => { x86_64 = hash; }),
getSha256Sum(hashFileContent, constants.aarch64FileName(newVersion)).then((hash) => { aarch64 = hash; }),
getSha256Sum(hashFileContentString, constants.x86_64FileName(newVersion)).then((hash) => { x86_64 = hash; }),
getSha256Sum(hashFileContentString, constants.aarch64FileName(newVersion)).then((hash) => { aarch64 = hash; }),
];
await Promise.all(promises);
return { x86_64, aarch64 };

View File

@ -799,6 +799,7 @@ https://github.com/Quramy/tsuquyomi/,,
https://github.com/folke/twilight.nvim/,,
https://github.com/leafgarland/typescript-vim/,,
https://github.com/jose-elias-alvarez/typescript.nvim/,,
https://github.com/kaarmu/typst.vim/,HEAD,
https://github.com/nvchad/ui/,HEAD,nvchad-ui
https://github.com/SirVer/ultisnips/,,
https://github.com/mbbill/undotree/,,

View File

@ -1132,8 +1132,8 @@ let
mktplcRef = {
name = "prettier-vscode";
publisher = "esbenp";
version = "9.12.0";
sha256 = "sha256-b7EaYYJNZQBqhyKJ04tytmD9DDRcvA68HTo5JHTr9Fo=";
version = "9.13.0";
sha256 = "sha256-Iqz1O6odSzAfojCgGDwDA1YtnWU5Ei7vx9Qt25/1SLw=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/esbenp.prettier-vscode/changelog";

View File

@ -34,14 +34,14 @@ stdenv.mkDerivation (finalAttrs: {
+ lib.optionalString enableQt "-qt"
+ lib.optionalString (!enableQt) "-sdl"
+ lib.optionalString forceWayland "-wayland";
version = "1.15.3";
version = "1.15.4";
src = fetchFromGitHub {
owner = "hrydgard";
repo = "ppsspp";
rev = "v${finalAttrs.version}";
fetchSubmodules = true;
sha256 = "sha256-5IICMP7KEniAnuxdDPECN+8jXA0ZKgPsdIL6Og2xyX4=";
sha256 = "sha256-D94PLJfWalLk2kbS0PEHTMDdWxZW4YXwp3VQDHNZlRU=";
};
postPatch = ''

View File

@ -29,13 +29,13 @@
buildDotnetModule rec {
pname = "ryujinx";
version = "1.1.733"; # Based off of the official github actions builds: https://github.com/Ryujinx/Ryujinx/actions/workflows/release.yml
version = "1.1.819"; # Based off of the official github actions builds: https://github.com/Ryujinx/Ryujinx/actions/workflows/release.yml
src = fetchFromGitHub {
owner = "Ryujinx";
repo = "Ryujinx";
rev = "9f12e50a546b15533778ed0d8290202af91c10a2";
sha256 = "1d1hg2sv0h56a56xnarcfp73df3rbw3iax85g258l6w2kxhkc42a";
rev = "4ca78eded52f21089400cc28351b9353279b8171";
sha256 = "13g5sgql14rr7qmsiavm6kkjkv9sqqq7cmwpy9iiahbfzc9w1wc1";
};
dotnet-sdk = dotnetCorePackages.sdk_7_0;
@ -80,7 +80,7 @@ buildDotnetModule rec {
];
projectFile = "Ryujinx.sln";
testProjectFile = "Ryujinx.Tests/Ryujinx.Tests.csproj";
testProjectFile = "src/Ryujinx.Tests/Ryujinx.Tests.csproj";
doCheck = true;
dotnetFlags = [

View File

@ -20,7 +20,7 @@
(fetchNuGet { pname = "CommandLineParser"; version = "2.9.1"; sha256 = "1sldkj8lakggn4hnyabjj1fppqh50fkdrr1k99d4gswpbk5kv582"; })
(fetchNuGet { pname = "Concentus"; version = "1.1.7"; sha256 = "0y5z444wrbhlmsqpy2sxmajl1fbf74843lvgj3y6vz260dn2q0l0"; })
(fetchNuGet { pname = "DiscordRichPresence"; version = "1.1.3.18"; sha256 = "0p4bhaggjjfd4gl06yiphqgncxgcq2bws4sjkrw0n2ldf3hgrps3"; })
(fetchNuGet { pname = "DynamicData"; version = "7.13.5"; sha256 = "088ry176ba314m4hc1vbcxisflqzs7p7vvn8vqzxy3kj1rimgfmf"; })
(fetchNuGet { pname = "DynamicData"; version = "7.13.8"; sha256 = "10ywbzk58046kgsbd9rybpa9m1v11as45jvf1qvxnl42hyc7q654"; })
(fetchNuGet { pname = "ExCSS"; version = "4.1.4"; sha256 = "1y50xp6rihkydbf5l73mr3qq2rm6rdfjrzdw9h1dw9my230q5lpd"; })
(fetchNuGet { pname = "Fizzler"; version = "1.2.1"; sha256 = "1w5jb1d0figbv68dydbnlcsfmqlc3sv9z1zxp7d79dg2dkarc4qm"; })
(fetchNuGet { pname = "FluentAvaloniaUI"; version = "1.4.5"; sha256 = "1j5ivy83f13dgn09qrfkq44ijvh0m9rbdx8760g47di70c4lda7j"; })
@ -50,10 +50,10 @@
(fetchNuGet { pname = "Microsoft.CSharp"; version = "4.7.0"; sha256 = "0gd67zlw554j098kabg887b5a6pq9kzavpa3jjy5w53ccjzjfy8j"; })
(fetchNuGet { pname = "Microsoft.DotNet.PlatformAbstractions"; version = "3.1.6"; sha256 = "0b9myd7gqbpaw9pkd2bx45jhik9mwj0f1ss57sk2cxmag2lkdws5"; })
(fetchNuGet { pname = "Microsoft.Extensions.DependencyModel"; version = "6.0.0"; sha256 = "08c4fh1n8vsish1vh7h73mva34g0as4ph29s4lvps7kmjb4z64nl"; })
(fetchNuGet { pname = "Microsoft.IdentityModel.Abstractions"; version = "6.29.0"; sha256 = "06sdjg78764ycaq3bd32daacd9pjsvkihdzrw8d1cnmk3c42kvq3"; })
(fetchNuGet { pname = "Microsoft.IdentityModel.JsonWebTokens"; version = "6.29.0"; sha256 = "0iydfzz4vzzpx24q8mgvc3n289s00inc19x6a0w2v378mx4jkfl0"; })
(fetchNuGet { pname = "Microsoft.IdentityModel.Logging"; version = "6.29.0"; sha256 = "04vj5h638ljz2fylr2idgjbfq5lzbw79m5ixcj1ikl4ydl9jhp9p"; })
(fetchNuGet { pname = "Microsoft.IdentityModel.Tokens"; version = "6.29.0"; sha256 = "05crx7w79m3jxlbnfc2c8i63m5z6h28y04qv6sc84312rzi2yw8c"; })
(fetchNuGet { pname = "Microsoft.IdentityModel.Abstractions"; version = "6.30.1"; sha256 = "1jb7za7kc41zx4vafpmyj42vzqb407b34npb9g6f42sk7127hip1"; })
(fetchNuGet { pname = "Microsoft.IdentityModel.JsonWebTokens"; version = "6.30.1"; sha256 = "1c1hs0nrzlrpvdrpj01yr7cdknh19gdxrahndb5fmn8p4k1vljlv"; })
(fetchNuGet { pname = "Microsoft.IdentityModel.Logging"; version = "6.30.1"; sha256 = "02dkmh0qc2sfayvhzp8fgvn58b84yn8z4x3aijvjqahcwv14wfzs"; })
(fetchNuGet { pname = "Microsoft.IdentityModel.Tokens"; version = "6.30.1"; sha256 = "1283v1ynl7wp5llyswj2nd8l3pkj7yhcksy2slanid52iyqzzan1"; })
(fetchNuGet { pname = "Microsoft.IO.RecyclableMemoryStream"; version = "2.3.2"; sha256 = "115bm7dljchr7c02hiv1r3l21r22wpml1j26fyn2amaflaihpq4l"; })
(fetchNuGet { pname = "Microsoft.NET.Test.Sdk"; version = "17.5.0"; sha256 = "00gz2i8kx4mlq1ywj3imvf7wc6qzh0bsnynhw06z0mgyha1a21jy"; })
(fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.0.1"; sha256 = "01al6cfxp68dscl15z7rxfw9zvhm64dncsw09a1vmdkacsa2v6lr"; })
@ -177,7 +177,7 @@
(fetchNuGet { pname = "System.Globalization"; version = "4.3.0"; sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki"; })
(fetchNuGet { pname = "System.Globalization.Calendars"; version = "4.0.1"; sha256 = "0bv0alrm2ck2zk3rz25lfyk9h42f3ywq77mx1syl6vvyncnpg4qh"; })
(fetchNuGet { pname = "System.Globalization.Extensions"; version = "4.0.1"; sha256 = "0hjhdb5ri8z9l93bw04s7ynwrjrhx2n0p34sf33a9hl9phz69fyc"; })
(fetchNuGet { pname = "System.IdentityModel.Tokens.Jwt"; version = "6.29.0"; sha256 = "09bpj7gginq25fiyq3za5i8wm482qbnx6qhm4dxb95jrl3mmb126"; })
(fetchNuGet { pname = "System.IdentityModel.Tokens.Jwt"; version = "6.30.1"; sha256 = "1f4x5sw9wpkk485lchl0nzdzkcy83s9b119c7g187x0qvkcvdpc2"; })
(fetchNuGet { pname = "System.IO"; version = "4.1.0"; sha256 = "1g0yb8p11vfd0kbkyzlfsbsp5z44lwsvyc0h3dpw6vqnbi035ajp"; })
(fetchNuGet { pname = "System.IO"; version = "4.3.0"; sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f"; })
(fetchNuGet { pname = "System.IO.Compression"; version = "4.1.0"; sha256 = "0iym7s3jkl8n0vzm3jd6xqg9zjjjqni05x45dwxyjr2dy88hlgji"; })

View File

@ -1,10 +1,11 @@
{ lib
, python3
, xorg
, argyllcms
, fetchPypi
, wrapGAppsHook
, gtk3
, librsvg
, xorg
, argyllcms
}:
python3.pkgs.buildPythonApplication rec {
@ -12,7 +13,7 @@ python3.pkgs.buildPythonApplication rec {
version = "3.9.10";
format = "setuptools";
src = python3.pkgs.fetchPypi {
src = fetchPypi {
pname = "DisplayCAL";
inherit version;
hash = "sha256-oDHDVb0zuAC49yPfmNe7xuFKaA1BRZGr75XwsLqugHs=";

View File

@ -1,10 +1,10 @@
{ lib, python3Packages }:
{ lib, python3Packages, fetchPypi }:
python3Packages.buildPythonApplication rec {
pname = "dosage";
version = "2.17";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "0vmxgn9wd3j80hp4gr5iq06jrl4gryz5zgfdd2ah30d12sfcfig0";
};

View File

@ -1,6 +1,7 @@
{ lib
, mkDerivationWith
, python3Packages
, fetchPypi
, p7zip
, archiveSupport ? true
}:
@ -9,7 +10,7 @@ mkDerivationWith python3Packages.buildPythonApplication rec {
pname = "kcc";
version = "5.5.1";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit version;
pname = "KindleComicConverter";
sha256 = "5dbee5dc5ee06a07316ae5ebaf21ffa1970094dbae5985ad735e2807ef112644";
@ -25,7 +26,7 @@ mkDerivationWith python3Packages.buildPythonApplication rec {
qtWrapperArgs = lib.optionals archiveSupport [ "--prefix" "PATH" ":" "${ lib.makeBinPath [ p7zip ] }" ];
postFixup = ''
postFixup = ''
wrapProgram $out/bin/kcc "''${qtWrapperArgs[@]}"
'';

View File

@ -1,7 +1,6 @@
{ lib
, stdenv
, fetchFromGitea
, fetchpatch
, giflib
, imlib2
, libXft
@ -13,24 +12,16 @@
stdenv.mkDerivation rec {
pname = "nsxiv";
version = "30";
version = "31";
src = fetchFromGitea {
domain = "codeberg.org";
owner = "nsxiv";
repo = "nsxiv";
rev = "v${version}";
hash = "sha256-swzTdQ6ow1At4bKRORqz6fb0Ej92yU9rlI/OgcinPu4=";
hash = "sha256-X1ZMr5OADs9GIe/kp/kEqKMMHZMymd58m9+f0SPzn7s=";
};
patches = [
# Fix build failure when _SC_PHYS_PAGES is not defined
(fetchpatch {
url = "https://codeberg.org/nsxiv/nsxiv/commit/1a50bff9f300f84e93a6e7035657e6029e7e8183.patch";
hash = "sha256-PpUqGVWaJ06EVu3tBKVzOh8HYvT6wAG3bvY6wUD+dTM=";
})
];
buildInputs = [
giflib
imlib2
@ -71,5 +62,6 @@ stdenv.mkDerivation rec {
license = licenses.gpl2Plus;
maintainers = with maintainers; [ AndersonTorres sikmir ];
platforms = platforms.unix;
changelog = "https://codeberg.org/nsxiv/nsxiv/src/tag/${src.rev}/etc/CHANGELOG.md";
};
}

View File

@ -1,14 +1,15 @@
{ python3Packages
, qtbase
{ lib
, python3Packages
, fetchPypi
, wrapQtAppsHook
, lib
, qtbase
}:
python3Packages.buildPythonApplication rec {
pname = "veusz";
version = "3.6.2";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "whcaxF5LMEJNj8NSYeLpnb5uJboRl+vCQ1WxBrJjldE=";
};

View File

@ -1,6 +1,5 @@
{ lib
, mkDerivation
, cmake
, extra-cmake-modules
, wrapGAppsHook
, gst_all_1
@ -11,6 +10,7 @@
, mpv
, qtmultimedia
, qtquickcontrols2
, yt-dlp
}:
mkDerivation {
@ -36,6 +36,13 @@ mkDerivation {
gstreamer
]);
qtWrapperArgs = [
"--prefix"
"PATH"
":"
(lib.makeBinPath [ yt-dlp ])
];
preFixup = ''
qtWrapperArgs+=("''${gappsWrapperArgs[@]}")
'';

View File

@ -1,5 +1,6 @@
{ lib
, python3
, fetchPypi
}:
with python3.pkgs;

View File

@ -1,5 +1,6 @@
{ lib
, python3
, fetchPypi
}:
let
@ -31,7 +32,7 @@ python.pkgs.buildPythonApplication rec {
pname = "archivebox";
version = "0.6.2";
src = python.pkgs.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "sha256-zHty7lTra6yab9d0q3EqsPG3F+lrnZL6PjQAbL1A2NY=";
};

View File

@ -1,6 +1,6 @@
{ lib
, stdenv
, python3
, fetchPypi
}:
let

View File

@ -1,6 +1,5 @@
{ lib
, fetchFromGitHub
, fetchpatch
, gitUpdater
, python3Packages
, blueprint-compiler
@ -29,23 +28,17 @@
python3Packages.buildPythonApplication rec {
pname = "bottles-unwrapped";
version = "51.5";
version = "51.6";
src = fetchFromGitHub {
owner = "bottlesdevs";
repo = "bottles";
rev = version;
sha256 = "sha256-8VF/CD0Wu2eV6wOpj/M6peKDthFWlcg+1NzzTSIH4S8=";
sha256 = "sha256-9oEC+ksgHz2HP4jVwTbLzjqc8WG1+S8hmVgl2dcuPB0=";
};
patches = [
./vulkan_icd.patch
# Remove next version
(fetchpatch {
url = "https://github.com/bottlesdevs/Bottles/commit/7cb284f9bac0b71bf632bfc70d94f7a53bc51267.patch";
hash = "sha256-mRF+BtQ0qM7Yvx7SONeH2wc04F87fEyNRlBuyQrzN8Y=";
})
];
# https://github.com/bottlesdevs/Bottles/wiki/Packaging

View File

@ -1,5 +1,4 @@
{ lib
, buildFHSEnv
{ buildFHSEnv
, symlinkJoin
, bottles-unwrapped
, gst_all_1

View File

@ -1,28 +0,0 @@
{ lib, python3, fetchFromGitHub }:
with python3.pkgs; buildPythonApplication rec {
pname = "bukut";
version = "0.11";
src = fetchFromGitHub {
owner = "peterjschroeder";
repo = "bukut";
rev = "v${version}";
sha256 = "sha256-Hp9/tSdRNAoll/fYNJuhYC7cgy5AK3PUtYUsS6zsz1Y=";
};
propagatedBuildInputs = [
asciimatics
beautifulsoup4
natsort
pyperclip
pyxdg
];
meta = with lib; {
description = "Text user interface for buku bookmark manager";
homepage = "https://github.com/peterjschroeder/bukut";
license = licenses.gpl3Only;
maintainers = with maintainers; [ taha ];
};
}

View File

@ -1,11 +1,11 @@
{ lib, python3Packages }:
{ lib, python3Packages, fetchPypi }:
python3Packages.buildPythonApplication rec {
pname = "chatblade";
version = "0.2.3";
format = "setuptools";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "sha256-YXZeqIX8cxNDvM4Pn0or6Lqj2ffX9aQb3b/xMIeBHRk=";
};

View File

@ -1,4 +1,4 @@
{ lib, python3Packages }:
{ lib, python3Packages, fetchPypi }:
with python3Packages;

View File

@ -1,10 +1,10 @@
{ lib, python3Packages }:
{ lib, python3Packages, fetchPypi }:
python3Packages.buildPythonApplication rec {
pname = "dotfiles";
version = "0.6.4";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit version pname;
sha256 = "03qis6m9r2qh00sqbgwsm883s4bj1ibwpgk86yh4l235mdw8jywv";
};

View File

@ -3,6 +3,7 @@
, fetchpatch
, nixosTests
, python3
, fetchPypi
, radicale3
}:
@ -44,7 +45,7 @@ in python.pkgs.buildPythonApplication rec {
pname = "etesync-dav";
version = "0.32.1";
src = python.pkgs.fetchPypi {
src = fetchPypi {
inherit pname version;
hash = "sha256-pOLug5MnVdKaw5wedABewomID9LU0hZPCf4kZKKU1yA=";
};

View File

@ -1,8 +1,8 @@
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a37976e..5669366 100644
index b7530e8f..af94a62d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -59,16 +59,12 @@ if(NOT MINGW AND WIN32)
@@ -59,8 +59,7 @@ if(NOT MINGW AND WIN32)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_BINARY_DIR}/Debug)
endif()
@ -11,15 +11,4 @@ index a37976e..5669366 100644
+include_directories(@libirc_includes@)
# YAML
-option(YAML_CPP_BUILD_TOOLS "Disable tests" OFF)
-option(YAML_CPP_BUILD_TESTS "Enable testing" OFF)
-option(YAML_CPP_BUILD_TOOLS "Enable parse tools" OFF)
-option(BUILD_SHARED_LIBS "Build as shared" ON)
-include_directories("3rd/yaml-cpp/include/")
-add_subdirectory(3rd/yaml-cpp)
+find_package(YAML-CPP 0.6.3 QUIET)
+include_directories(YAML_CPP_INCLUDE_DIR)
+
if (HUGGLE_EXT)
if(NOT MINGW AND WIN32)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_BINARY_DIR}/Release/extensions)
find_package(YAML-CPP 0.6.3 QUIET)

View File

@ -14,13 +14,13 @@
stdenv.mkDerivation rec {
pname = "huggle";
version = "3.4.10";
version = "3.4.12";
src = fetchFromGitHub {
owner = "huggle";
repo = "huggle3-qt-lx";
rev = version;
sha256 = "UzoX4kdzYU50W0MUhfpo0HaSfvG3eINNC8u5t/gKuqI=";
sha256 = "scNGmMVZ6z9FTQuZCdwRYk0WP5qKfdb/M9Co8TbiMDE=";
fetchSubmodules = true;
};

View File

@ -1,14 +1,12 @@
{ lib
, fetchpatch
, python3Packages
, python3
, fetchFromGitHub
, wrapQtAppsHook
, cups
}:
with python3Packages;
buildPythonApplication rec {
python3.pkgs.buildPythonApplication rec {
pname = "inkcut";
version = "2.1.5";
@ -48,7 +46,7 @@ buildPythonApplication rec {
nativeBuildInputs = [ wrapQtAppsHook ];
propagatedBuildInputs = [
propagatedBuildInputs = with python3.pkgs; [
enamlx
twisted
lxml

View File

@ -1,10 +1,10 @@
{ lib, python3Packages, python3, xvfb-run }:
{ lib, python3Packages, fetchPypi, xvfb-run }:
python3Packages.buildPythonApplication rec {
pname = "keepmenu";
version = "1.2.2";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "SeVNtONH1bn2hb2pBOVM3Oafrb+jARgfvRe7vUu6Gto=";
};

View File

@ -1,10 +1,10 @@
{ lib, python3, khard, testers }:
{ lib, python3, fetchPypi, khard, testers }:
python3.pkgs.buildPythonApplication rec {
version = "0.18.0";
pname = "khard";
src = python3.pkgs.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "05860fdayqap128l7i6bcmi9kdyi2gx02g2pmh88d56xgysd927y";
};

3574
pkgs/applications/misc/kord/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@
rustPlatform.buildRustPackage rec {
pname = "kord";
version = "0.4.2";
version = "0.5.16";
# kord depends on nightly features
RUSTC_BOOTSTRAP = 1;
@ -16,10 +16,15 @@ rustPlatform.buildRustPackage rec {
owner = "twitchax";
repo = "kord";
rev = "v${version}";
sha256 = "sha256-B/UwnbzXI3ER8IMOVtn0ErVqFrkZXKoL+l7ll1AlzDg=";
sha256 = "sha256-gI88fweOT2t+4cj58/mLygtTnue2Ai1QSC5oZf7Xv/g=";
};
cargoHash = "sha256-xhWSycTe72HW3E9meTo4wjOCHDcNq6fUPT6nqHoW9vE=";
cargoLock = {
lockFile = ./Cargo.lock;
outputHashes = {
"bincode-2.0.0-rc.2" = "sha256-0BfKKGOi5EVIoF0HvIk0QS2fHUMG3tpsMLe2SkXeZlo=";
};
};
nativeBuildInputs = [ pkg-config ];
buildInputs = [ alsa-lib ];

View File

@ -1,16 +1,17 @@
{ lib
, python3
, fetchPypi
}:
let
inherit (python3.pkgs) buildPythonPackage fetchPypi;
inherit (python3.pkgs) buildPythonPackage;
in
buildPythonPackage rec {
pname = "meerk40t-camera";
version = "0.1.9";
format = "setuptools";
src = python3.pkgs.fetchPypi {
src = fetchPypi {
inherit pname version;
hash = "sha256-uGCBHdgWoorVX2XqMCg0YBweb00sQ9ZSbJe8rlGeovs=";
};

View File

@ -6,10 +6,7 @@
, wrapGAppsHook
}:
let
inherit (python3.pkgs) buildPythonApplication buildPythonPackage fetchPypi;
in
buildPythonApplication rec {
python3.pkgs.buildPythonApplication rec {
pname = "MeerK40t";
version = "0.8.1000";
format = "setuptools";

View File

@ -1,9 +1,9 @@
{ lib, python3Packages }:
{ lib, python3Packages, fetchPypi }:
python3Packages.buildPythonApplication rec {
pname = "nhentai";
version = "0.4.16";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "sha256-2lzrQqUx3lPM+OAUO/SwT+fAuG7kWmUnTACNUiP7d1M=";
};

View File

@ -12,7 +12,7 @@
let
inherit (stdenv.hostPlatform) system;
pname = "obsidian";
version = "1.2.8";
version = "1.3.4";
appname = "Obsidian";
meta = with lib; {
description = "A powerful knowledge base that works on top of a local folder of plain text Markdown files";
@ -25,7 +25,7 @@ let
filename = if stdenv.isDarwin then "Obsidian-${version}-universal.dmg" else "obsidian-${version}.tar.gz";
src = fetchurl {
url = "https://github.com/obsidianmd/obsidian-releases/releases/download/v${version}/${filename}";
sha256 = if stdenv.isDarwin then "sha256-c01Oc20henVRTNFAuiRH5xkxFH8k0Cfd4Z+0t8iUPEg=" else "sha256-KG73QaDY5njFzGhjWtjFNucZRcLtRGTrIPgG0sdonQw=";
sha256 = if stdenv.isDarwin then "sha256-LP13smLy/cr0hiLl5cdRxTbDfRFojb+HJBx/MFeJ13Y=" else "sha256-8M9HU20IxTvPaa6x1X41Ldq2usK2TPU71VvprerivZg=";
};
icon = fetchurl {

View File

@ -4,6 +4,7 @@
, lib
, fetchFromGitHub
, python3
, fetchPypi
, substituteAll
, nix-update-script
, nixosTests
@ -31,7 +32,7 @@ let
});
flask-babel = super.flask-babel.overridePythonAttrs (oldAttrs: rec {
version = "2.0.0";
src = super.fetchPypi {
src = fetchPypi {
pname = "Flask-Babel";
inherit version;
sha256 = "sha256-+fr0XNsuGjLqLsFEA1h9QpUQjzUBenghorGsuM/ZJX0=";
@ -44,7 +45,7 @@ let
# downgrade needed for flask-babel 2.0.0
babel = super.babel.overridePythonAttrs (oldAttrs: rec {
version = "2.11.0";
src = super.fetchPypi {
src = fetchPypi {
pname = "Babel";
inherit version;
hash = "sha256-XvSzImsBgN7d7UIpZRyLDho6aig31FoHMnLzE+TPl/Y=";

View File

@ -34,13 +34,13 @@
buildPythonApplication rec {
pname = "orca";
version = "44.0";
version = "44.1";
format = "other";
src = fetchurl {
url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
sha256 = "e8WX7AvBtnQgC2L995XUuulkemNxfXVN9hWHzCUFAs4=";
sha256 = "9e1lUdcviXshJI1DMIWnuBesy7ApaoTD6FHZH7Lu5N4=";
};
patches = [

View File

@ -1,5 +1,5 @@
{ lib, fetchFromGitHub, cacert, openssl, nixosTests
, python310, fetchpatch
, python310, fetchPypi, fetchpatch
}:
let
@ -11,7 +11,7 @@ let
packageOverrides = self: super: {
sqlalchemy = super.sqlalchemy.overridePythonAttrs (oldAttrs: rec {
version = "1.3.24";
src = super.fetchPypi {
src = fetchPypi {
inherit (oldAttrs) pname;
inherit version;
hash = "sha256-67t3fL+TEjWbiXv4G6ANrg9ctp+6KhgmXcwYpvXvdRk=";
@ -24,7 +24,7 @@ let
});
flask_migrate = super.flask_migrate.overridePythonAttrs (oldAttrs: rec {
version = "2.7.0";
src = self.fetchPypi {
src = fetchPypi {
pname = "Flask-Migrate";
inherit version;
hash = "sha256-ri8FZxWIdi3YOiHYsYxR/jVehng+JFlJlf+Nc4Df/jg=";
@ -33,7 +33,7 @@ let
flask-sqlalchemy = super.flask-sqlalchemy.overridePythonAttrs (old: rec {
version = "2.5.1";
format = "setuptools";
src = self.fetchPypi {
src = fetchPypi {
pname = "Flask-SQLAlchemy";
inherit version;
hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912";
@ -123,7 +123,7 @@ let
pname = "Flask-Babel";
version = "2.0.0";
format = "setuptools";
src = self.fetchPypi {
src = fetchPypi {
inherit pname;
inherit version;
hash = "sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d";
@ -155,7 +155,7 @@ let
sphinx-rtd-theme = null;
}).overridePythonAttrs (old: rec {
version = "5.1.0";
src = self.fetchPypi {
src = fetchPypi {
inherit (old) pname;
inherit version;
hash = "sha256-GysFCsG64EnNB/WSCxT6u+UmOPSF2a2h6xFanuv/aDU=";

View File

@ -1,10 +1,10 @@
{ lib, python3Packages }:
{ lib, python3Packages, fetchPypi }:
python3Packages.buildPythonPackage rec {
pname = "pydf";
version = "12";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "7f47a7c3abfceb1ac04fc009ded538df1ae449c31203962a1471a4eb3bf21439";
};

View File

@ -1,4 +1,4 @@
{ lib, pythonPackages }:
{ lib, pythonPackages, fetchPypi }:
with pythonPackages;

View File

@ -1,5 +1,6 @@
{ lib
, python310
, fetchPypi
, fetchFromGitHub
, gdk-pixbuf
, gnome
@ -24,7 +25,7 @@ let
};
sqlalchemy = super.sqlalchemy.overridePythonAttrs (old: rec {
version = "1.4.46";
src = self.fetchPypi {
src = fetchPypi {
pname = "SQLAlchemy";
inherit version;
hash = "sha256-aRO4JH2KKS74MVFipRkx4rQM6RaB8bbxj2lwRSAMSjA=";

View File

@ -1,10 +1,10 @@
{ lib, python3Packages }:
{ lib, python3Packages, fetchPypi }:
python3Packages.buildPythonApplication rec {
pname = "raiseorlaunch";
version = "2.3.3";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "3d694015d020a888b42564d56559213b94981ca2b32b952a49b2de4d029d2e59";
};

View File

@ -1,5 +1,6 @@
{ lib
, python3
, fetchPypi
, alsa-utils
, gobject-introspection
, libappindicator-gtk3

View File

@ -1,11 +1,11 @@
{ lib, python3Packages }:
{ lib, python3Packages, fetchPypi }:
python3Packages.buildPythonApplication rec {
pname = "seashells";
version = "0.1.2";
format = "setuptools";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "sha256-RBs28FC7f82DrxRcmvTP9nljVpm7tjrGuvr05l32hDM=";
};

View File

@ -1,6 +1,6 @@
{ lib
, python3
, fetchFromGitHub
, fetchPypi
}:
with python3.pkgs;

View File

@ -1,6 +1,7 @@
{ stdenv
, lib
, python3
, fetchPypi
, ffmpeg
}:
@ -9,7 +10,7 @@ python3.pkgs.buildPythonApplication rec {
version = "2.3";
format = "setuptools";
src = python3.pkgs.fetchPypi {
src = fetchPypi {
inherit version pname;
hash = "sha256-4Zsb/OBtU/jV0gThEYe8bcrb+6hW+hnzQS19q1H409Q=";
};

View File

@ -1,7 +1,7 @@
{ lib, python3 }:
{ lib, python3, fetchPypi }:
let
inherit (python3.pkgs) buildPythonApplication fetchPypi requests;
inherit (python3.pkgs) buildPythonApplication requests;
in
buildPythonApplication rec {
pname = "tzupdate";

View File

@ -1,5 +1,6 @@
{ lib
, python3Packages
, fetchPypi
, taskwarrior
, glibcLocales
}:

View File

@ -90,11 +90,11 @@ in
stdenv.mkDerivation rec {
pname = "brave";
version = "1.51.114";
version = "1.51.118";
src = fetchurl {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_amd64.deb";
sha256 = "sha256-lykwmfGqH5VuWazEQuvTpD4ett4m+LCFmmxzjkULfmk=";
sha256 = "sha256-/OrnB4M6oefZ2aG2rQst8H4UZ/7vAFzyqWsn9kerb9c=";
};
dontConfigure = true;

View File

@ -92,14 +92,13 @@ in
pname = "hadoop";
platformAttrs = rec {
x86_64-linux = {
version = "3.3.4";
hash = "sha256-akg9GgsSNJDr2N8/cbZOs58zP3i5XwkK61jkM8vCQW0=";
version = "3.3.5";
hash = "sha256-RG4FypL6I6YGF6ixeUbe3kcoGvFQQEFhfLfV9i50JSo=";
};
x86_64-darwin = x86_64-linux;
aarch64-linux = {
version = "3.3.1";
hash = "sha256-v1Om2pk0wsgKBghRD2wgTSHJoKd3jkm1wPKAeDcKlgI=";
meta.knownVulnerabilities = [ "CVE-2021-37404" "CVE-2021-33036" ];
version = "3.3.5";
hash = "sha256-qcKjbE881isauWBxIv+NY0UFbYit704/Re8Kdl6x1LA=";
};
aarch64-darwin = aarch64-linux;
};

View File

@ -1,10 +1,10 @@
{ lib, python3 }:
{ lib, python3, fetchPypi }:
python3.pkgs.buildPythonApplication rec {
pname = "luigi";
version = "3.0.2";
src = python3.pkgs.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "b4b1ccf086586d041d7e91e68515d495c550f30e4d179d63863fea9ccdbb78eb";
};
@ -15,7 +15,7 @@ python3.pkgs.buildPythonApplication rec {
doCheck = false;
# This enables accessing modules stored in cwd
makeWrapperArgs = ["--prefix PYTHONPATH . :"];
makeWrapperArgs = [ "--prefix PYTHONPATH . :" ];
meta = with lib; {
description = "Python package that helps you build complex pipelines of batch jobs";
@ -25,7 +25,7 @@ python3.pkgs.buildPythonApplication rec {
'';
homepage = "https://github.com/spotify/luigi";
changelog = "https://github.com/spotify/luigi/releases/tag/${version}";
license = [ licenses.asl20 ];
license = [ licenses.asl20 ];
maintainers = [ maintainers.bhipple ];
};
}

View File

@ -428,11 +428,11 @@
"vendorHash": null
},
"gitlab": {
"hash": "sha256-QH47lBtwlpW9Trb7EAmE9eNEme6PDyKUJ50QevD5GBs=",
"hash": "sha256-zNwjTIt7ngDkHd3VpHkA4xKDjsxQ7vJaWtLH4pMl3S0=",
"homepage": "https://registry.terraform.io/providers/gitlabhq/gitlab",
"owner": "gitlabhq",
"repo": "terraform-provider-gitlab",
"rev": "v16.0.2",
"rev": "v16.0.3",
"spdx": "MPL-2.0",
"vendorHash": "sha256-KD9X7EOH1btgLtssuz1FFOGtmfNao8HBcKJDty1wtpY="
},
@ -810,11 +810,11 @@
"vendorHash": "sha256-LRIfxQGwG988HE5fftGl6JmBG7tTknvmgpm4Fu1NbWI="
},
"oci": {
"hash": "sha256-TnCRDWmlyBYOY1lpYP0evguM6wFszZdOdmFsztdbRrc=",
"hash": "sha256-RMWKzIsZg9h5COgt1IlpmQQGDpFHwH4ugPZmMULcxgg=",
"homepage": "https://registry.terraform.io/providers/oracle/oci",
"owner": "oracle",
"repo": "terraform-provider-oci",
"rev": "v4.121.0",
"rev": "v4.122.0",
"spdx": "MPL-2.0",
"vendorHash": null
},

View File

@ -5,13 +5,13 @@ buildGoModule rec {
/* Do not use "dev" as a version. If you do, Tilt will consider itself
running in development environment and try to serve assets from the
source tree, which is not there once build completes. */
version = "0.32.3";
version = "0.32.4";
src = fetchFromGitHub {
owner = "tilt-dev";
repo = pname;
rev = "v${version}";
sha256 = "sha256-5QTZUapHhSSI+UZu77IUZdflCIm+oCu4kPQVhLHCsUQ=";
sha256 = "sha256-GZ9FgseJmaWiMSscLSqMutv5yQ/e8qCjoJEPPTH2Ix0=";
};
vendorHash = null;

View File

@ -1,10 +1,10 @@
{ stdenv, lib, python3Packages }:
{ lib, python3Packages, fetchPypi, stdenv }:
python3Packages.buildPythonApplication rec {
pname = "dyndnsc";
version = "0.6.1";
src = python3Packages.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "13078d29eea2f9a4ca01f05676c3309ead5e341dab047e0d51c46f23d4b7fbb4";
};

View File

@ -1,11 +1,13 @@
{ lib
, python3
, fetchPypi
}:
python3.pkgs.buildPythonPackage rec {
pname = "listparser";
version = "0.18";
src = python3.pkgs.fetchPypi {
src = fetchPypi {
inherit pname version;
sha256 = "0hdqs1mmayw1r8yla43hgb4d9y3zqs5483vgf8j9ygczkd2wrq2b";
};

View File

@ -1,5 +1,6 @@
{ lib
, python3
, fetchPypi
, fetchFromGitHub
}:
@ -8,7 +9,7 @@ let
packageOverrides = self: super: {
sqlalchemy = super.sqlalchemy.overridePythonAttrs (old: rec {
version = "1.4.48";
src = self.fetchPypi {
src = fetchPypi {
pname = "SQLAlchemy";
inherit version;
hash = "sha256-tHvChwltmJoIOM6W99jpZpFKJNqHftQadTHUS1XNuN8=";

View File

@ -33,7 +33,7 @@
mkDerivation rec {
pname = "linphone-desktop";
version = "5.0.15";
version = "5.0.16";
src = fetchFromGitLab {
domain = "gitlab.linphone.org";
@ -41,7 +41,7 @@ mkDerivation rec {
group = "BC";
repo = pname;
rev = version;
hash = "sha256-tCtOFHspT0CmBCGvs5b/tNH+W1tuHuje6Zt0UwagOB4=";
hash = "sha256-zS0JyK+HGiHY7tPdl3RK6fJJOUS+fKM1u3npNxDAAYE=";
};
patches = [

Some files were not shown because too many files have changed in this diff Show More