Merge master into staging-next
This commit is contained in:
commit
bdf5483015
@ -120,14 +120,6 @@ buildDunePackage rec {
|
||||
}
|
||||
```
|
||||
|
||||
Note about `minimalOCamlVersion`. A deprecated version of this argument was
|
||||
spelled `minimumOCamlVersion`; setting the old attribute wrongly modifies the
|
||||
derivation hash and is therefore inappropriate. As a technical dept, currently
|
||||
packaged libraries may still use the old spelling: maintainers are invited to
|
||||
fix this when updating packages. Massive renaming is strongly discouraged as it
|
||||
would be challenging to review, difficult to test, and will cause unnecessary
|
||||
rebuild.
|
||||
|
||||
The build will automatically fail if two distinct versions of the same library
|
||||
are added to `buildInputs` (which usually happens transitively because of
|
||||
`propagatedBuildInputs`). Set `dontDetectOcamlConflicts` to true to disable this
|
||||
|
@ -8413,6 +8413,12 @@
|
||||
githubId = 7403236;
|
||||
name = "Markus J. Ankenbrand";
|
||||
};
|
||||
iivusly = {
|
||||
email = "iivusly@icloud.com";
|
||||
github = "iivusly";
|
||||
githubId = 52052910;
|
||||
name = "iivusly";
|
||||
};
|
||||
ikervagyok = {
|
||||
email = "ikervagyok@gmail.com";
|
||||
github = "ikervagyok";
|
||||
@ -10588,13 +10594,6 @@
|
||||
name = "Kat Inskip";
|
||||
keys = [ { fingerprint = "9CC6 44B5 69CD A59B C874 C4C9 E8DD E3ED 1C90 F3A0"; } ];
|
||||
};
|
||||
kiwi = {
|
||||
email = "envy1988@gmail.com";
|
||||
github = "Kiwi";
|
||||
githubId = 35715;
|
||||
name = "Robert Djubek";
|
||||
keys = [ { fingerprint = "8992 44FC D291 5CA2 0A97 802C 156C 88A5 B0A0 4B2A"; } ];
|
||||
};
|
||||
kjeremy = {
|
||||
email = "kjeremy@gmail.com";
|
||||
name = "Jeremy Kolb";
|
||||
@ -17708,13 +17707,6 @@
|
||||
githubId = 226872;
|
||||
name = "Samuel Ainsworth";
|
||||
};
|
||||
samueldr = {
|
||||
email = "samuel@dionne-riel.com";
|
||||
matrix = "@samueldr:matrix.org";
|
||||
github = "samueldr";
|
||||
githubId = 132835;
|
||||
name = "Samuel Dionne-Riel";
|
||||
};
|
||||
samuelefacenda = {
|
||||
name = "Samuele Facenda";
|
||||
email = "samuele.facenda@gmail.com";
|
||||
@ -20045,12 +20037,6 @@
|
||||
githubId = 1391883;
|
||||
name = "Tom Hall";
|
||||
};
|
||||
thubrecht = {
|
||||
email = "tom@hubrecht.ovh";
|
||||
github = "Tom-Hubrecht";
|
||||
githubId = 26650391;
|
||||
name = "Tom Hubrecht";
|
||||
};
|
||||
Thunderbottom = {
|
||||
email = "chinmaydpai@gmail.com";
|
||||
github = "Thunderbottom";
|
||||
|
@ -677,12 +677,6 @@ with lib.maintainers;
|
||||
shortName = "Mercury Employees";
|
||||
};
|
||||
|
||||
mobile = {
|
||||
members = [ samueldr ];
|
||||
scope = "Maintain Mobile NixOS.";
|
||||
shortName = "Mobile";
|
||||
};
|
||||
|
||||
nix = {
|
||||
members = [
|
||||
eelco
|
||||
|
@ -62,7 +62,7 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
<!-- Please keep entries alphabetically sorted. -->
|
||||
|
||||
- [Anki Sync Server](https://docs.ankiweb.net/sync-server.html), the official sync server built into recent versions of Anki. Available as [services.anki-sync-server](#opt-services.anki-sync-server.enable).
|
||||
The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been marked deprecated and will be dropped after 24.05 due to lack of maintenance of the anki-sync-server software.
|
||||
The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been marked deprecated and will be dropped after 24.05 due to lack of maintenance of the ankisyncd software.
|
||||
|
||||
- [ALVR](https://github.com/alvr-org/alvr), a VR desktop streamer. Available as [programs.alvr](#opt-programs.alvr.enable).
|
||||
|
||||
|
@ -25,6 +25,16 @@
|
||||
|
||||
- `androidenv.androidPkgs_9_0` has been removed, and replaced with `androidenv.androidPkgs` for a more complete Android SDK including support for Android 9 and later.
|
||||
|
||||
- `wstunnel` has had a major version upgrade that entailed rewriting the program in Rust.
|
||||
The module was updated to accommodate for breaking changes.
|
||||
Breaking changes to the module API were minimised as much as possible,
|
||||
but some were nonetheless inevitable due to changes in the upstream CLI.
|
||||
Certain options were moved from separate CLI arguments into the forward specifications,
|
||||
and those options were also removed from the module's API,
|
||||
please consult the wstunnel man page for more detail.
|
||||
Also be aware that if you have set additional options in `services.wstunnel.{clients,servers}.<name>.extraArgs`,
|
||||
that those might have been removed or modified upstream.
|
||||
|
||||
- `nginx` package no longer includes `gd` and `geoip` dependencies. For enabling it, override `nginx` package with the optionals `withImageFilter` and `withGeoIP`.
|
||||
|
||||
- `openssh` and `openssh_hpn` are now compiled without Kerberos 5 / GSSAPI support in an effort to reduce the attack surface of the components for the majority of users. Users needing this support can
|
||||
|
@ -1,16 +1,32 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.snapper;
|
||||
|
||||
mkValue = v:
|
||||
if isList v then "\"${concatMapStringsSep " " (escape [ "\\" " " ]) v}\""
|
||||
else if v == true then "yes"
|
||||
else if v == false then "no"
|
||||
else if isString v then "\"${v}\""
|
||||
else builtins.toJSON v;
|
||||
mkValue =
|
||||
v:
|
||||
if isList v then
|
||||
"\"${
|
||||
concatMapStringsSep " " (escape [
|
||||
"\\"
|
||||
" "
|
||||
]) v
|
||||
}\""
|
||||
else if v == true then
|
||||
"yes"
|
||||
else if v == false then
|
||||
"no"
|
||||
else if isString v then
|
||||
"\"${v}\""
|
||||
else
|
||||
builtins.toJSON v;
|
||||
|
||||
mkKeyValue = k: v: "${k}=${mkValue v}";
|
||||
|
||||
@ -43,7 +59,7 @@ let
|
||||
|
||||
ALLOW_GROUPS = mkOption {
|
||||
type = types.listOf safeStr;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = ''
|
||||
List of groups allowed to operate with the config.
|
||||
|
||||
@ -53,7 +69,7 @@ let
|
||||
|
||||
ALLOW_USERS = mkOption {
|
||||
type = types.listOf safeStr;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "alice" ];
|
||||
description = ''
|
||||
List of users allowed to operate with the config. "root" is always
|
||||
@ -78,6 +94,54 @@ let
|
||||
Defines whether hourly snapshots should be created.
|
||||
'';
|
||||
};
|
||||
|
||||
TIMELINE_LIMIT_HOURLY = mkOption {
|
||||
type = types.str;
|
||||
default = "10";
|
||||
description = ''
|
||||
Limits for timeline cleanup.
|
||||
'';
|
||||
};
|
||||
|
||||
TIMELINE_LIMIT_DAILY = mkOption {
|
||||
type = types.str;
|
||||
default = "10";
|
||||
description = ''
|
||||
Limits for timeline cleanup.
|
||||
'';
|
||||
};
|
||||
|
||||
TIMELINE_LIMIT_WEEKLY = mkOption {
|
||||
type = types.str;
|
||||
default = "0";
|
||||
description = ''
|
||||
Limits for timeline cleanup.
|
||||
'';
|
||||
};
|
||||
|
||||
TIMELINE_LIMIT_MONTHLY = mkOption {
|
||||
type = types.str;
|
||||
default = "10";
|
||||
description = ''
|
||||
Limits for timeline cleanup.
|
||||
'';
|
||||
};
|
||||
|
||||
TIMELINE_LIMIT_QUARTERLY = mkOption {
|
||||
type = types.str;
|
||||
default = "0";
|
||||
description = ''
|
||||
Limits for timeline cleanup.
|
||||
'';
|
||||
};
|
||||
|
||||
TIMELINE_LIMIT_YEARLY = mkOption {
|
||||
type = types.str;
|
||||
default = "10";
|
||||
description = ''
|
||||
Limits for timeline cleanup.
|
||||
'';
|
||||
};
|
||||
};
|
||||
in
|
||||
|
||||
@ -152,112 +216,129 @@ in
|
||||
is valid here, even if NixOS doesn't document it.
|
||||
'';
|
||||
|
||||
type = types.attrsOf (types.submodule {
|
||||
freeformType = types.attrsOf (types.oneOf [ (types.listOf safeStr) types.bool safeStr types.number ]);
|
||||
type = types.attrsOf (
|
||||
types.submodule {
|
||||
freeformType = types.attrsOf (
|
||||
types.oneOf [
|
||||
(types.listOf safeStr)
|
||||
types.bool
|
||||
safeStr
|
||||
types.number
|
||||
]
|
||||
);
|
||||
|
||||
options = configOptions;
|
||||
});
|
||||
options = configOptions;
|
||||
}
|
||||
);
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf (cfg.configs != {}) (let
|
||||
documentation = [ "man:snapper(8)" "man:snapper-configs(5)" ];
|
||||
in {
|
||||
config = mkIf (cfg.configs != { }) (
|
||||
let
|
||||
documentation = [
|
||||
"man:snapper(8)"
|
||||
"man:snapper-configs(5)"
|
||||
];
|
||||
in
|
||||
{
|
||||
environment = {
|
||||
|
||||
environment = {
|
||||
systemPackages = [ pkgs.snapper ];
|
||||
|
||||
systemPackages = [ pkgs.snapper ];
|
||||
# Note: snapper/config-templates/default is only needed for create-config
|
||||
# which is not the NixOS way to configure.
|
||||
etc =
|
||||
{
|
||||
|
||||
# Note: snapper/config-templates/default is only needed for create-config
|
||||
# which is not the NixOS way to configure.
|
||||
etc = {
|
||||
|
||||
"sysconfig/snapper".text = ''
|
||||
SNAPPER_CONFIGS="${lib.concatStringsSep " " (builtins.attrNames cfg.configs)}"
|
||||
'';
|
||||
|
||||
}
|
||||
// (mapAttrs' (name: subvolume: nameValuePair "snapper/configs/${name}" ({
|
||||
text = lib.generators.toKeyValue { inherit mkKeyValue; } (filterAttrs (k: v: v != defaultOf k) subvolume);
|
||||
})) cfg.configs)
|
||||
// (lib.optionalAttrs (cfg.filters != null) {
|
||||
"snapper/filters/default.txt".text = cfg.filters;
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
services.dbus.packages = [ pkgs.snapper ];
|
||||
|
||||
systemd.services.snapperd = {
|
||||
description = "DBus interface for snapper";
|
||||
inherit documentation;
|
||||
serviceConfig = {
|
||||
Type = "dbus";
|
||||
BusName = "org.opensuse.Snapper";
|
||||
ExecStart = "${pkgs.snapper}/bin/snapperd";
|
||||
CapabilityBoundingSet = "CAP_DAC_OVERRIDE CAP_FOWNER CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_SYS_ADMIN CAP_SYS_MODULE CAP_IPC_LOCK CAP_SYS_NICE";
|
||||
LockPersonality = true;
|
||||
NoNewPrivileges = false;
|
||||
PrivateNetwork = true;
|
||||
ProtectHostname = true;
|
||||
RestrictAddressFamilies = "AF_UNIX";
|
||||
RestrictRealtime = true;
|
||||
"sysconfig/snapper".text = ''
|
||||
SNAPPER_CONFIGS="${lib.concatStringsSep " " (builtins.attrNames cfg.configs)}"
|
||||
'';
|
||||
}
|
||||
// (mapAttrs' (
|
||||
name: subvolume:
|
||||
nameValuePair "snapper/configs/${name}" ({
|
||||
text = lib.generators.toKeyValue { inherit mkKeyValue; } (
|
||||
filterAttrs (k: v: v != defaultOf k) subvolume
|
||||
);
|
||||
})
|
||||
) cfg.configs)
|
||||
// (lib.optionalAttrs (cfg.filters != null) { "snapper/filters/default.txt".text = cfg.filters; });
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.snapper-timeline = {
|
||||
description = "Timeline of Snapper Snapshots";
|
||||
inherit documentation;
|
||||
requires = [ "local-fs.target" ];
|
||||
serviceConfig.ExecStart = "${pkgs.snapper}/lib/snapper/systemd-helper --timeline";
|
||||
};
|
||||
services.dbus.packages = [ pkgs.snapper ];
|
||||
|
||||
systemd.timers.snapper-timeline = {
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
Persistent = cfg.persistentTimer;
|
||||
OnCalendar = cfg.snapshotInterval;
|
||||
systemd.services.snapperd = {
|
||||
description = "DBus interface for snapper";
|
||||
inherit documentation;
|
||||
serviceConfig = {
|
||||
Type = "dbus";
|
||||
BusName = "org.opensuse.Snapper";
|
||||
ExecStart = "${pkgs.snapper}/bin/snapperd";
|
||||
CapabilityBoundingSet = "CAP_DAC_OVERRIDE CAP_FOWNER CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_SYS_ADMIN CAP_SYS_MODULE CAP_IPC_LOCK CAP_SYS_NICE";
|
||||
LockPersonality = true;
|
||||
NoNewPrivileges = false;
|
||||
PrivateNetwork = true;
|
||||
ProtectHostname = true;
|
||||
RestrictAddressFamilies = "AF_UNIX";
|
||||
RestrictRealtime = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.snapper-cleanup = {
|
||||
description = "Cleanup of Snapper Snapshots";
|
||||
inherit documentation;
|
||||
serviceConfig.ExecStart = "${pkgs.snapper}/lib/snapper/systemd-helper --cleanup";
|
||||
};
|
||||
systemd.services.snapper-timeline = {
|
||||
description = "Timeline of Snapper Snapshots";
|
||||
inherit documentation;
|
||||
requires = [ "local-fs.target" ];
|
||||
serviceConfig.ExecStart = "${pkgs.snapper}/lib/snapper/systemd-helper --timeline";
|
||||
};
|
||||
|
||||
systemd.timers.snapper-cleanup = {
|
||||
description = "Cleanup of Snapper Snapshots";
|
||||
inherit documentation;
|
||||
wantedBy = [ "timers.target" ];
|
||||
requires = [ "local-fs.target" ];
|
||||
timerConfig.OnBootSec = "10m";
|
||||
timerConfig.OnUnitActiveSec = cfg.cleanupInterval;
|
||||
};
|
||||
systemd.timers.snapper-timeline = {
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
Persistent = cfg.persistentTimer;
|
||||
OnCalendar = cfg.snapshotInterval;
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.snapper-boot = lib.mkIf cfg.snapshotRootOnBoot {
|
||||
description = "Take snapper snapshot of root on boot";
|
||||
inherit documentation;
|
||||
serviceConfig.ExecStart = "${pkgs.snapper}/bin/snapper --config root create --cleanup-algorithm number --description boot";
|
||||
serviceConfig.Type = "oneshot";
|
||||
requires = [ "local-fs.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
unitConfig.ConditionPathExists = "/etc/snapper/configs/root";
|
||||
};
|
||||
systemd.services.snapper-cleanup = {
|
||||
description = "Cleanup of Snapper Snapshots";
|
||||
inherit documentation;
|
||||
serviceConfig.ExecStart = "${pkgs.snapper}/lib/snapper/systemd-helper --cleanup";
|
||||
};
|
||||
|
||||
assertions =
|
||||
concatMap
|
||||
(name:
|
||||
let
|
||||
sub = cfg.configs.${name};
|
||||
in
|
||||
[ { assertion = !(sub ? extraConfig);
|
||||
message = ''
|
||||
The option definition `services.snapper.configs.${name}.extraConfig' no longer has any effect; please remove it.
|
||||
The contents of this option should be migrated to attributes on `services.snapper.configs.${name}'.
|
||||
'';
|
||||
}
|
||||
] ++
|
||||
systemd.timers.snapper-cleanup = {
|
||||
description = "Cleanup of Snapper Snapshots";
|
||||
inherit documentation;
|
||||
wantedBy = [ "timers.target" ];
|
||||
requires = [ "local-fs.target" ];
|
||||
timerConfig.OnBootSec = "10m";
|
||||
timerConfig.OnUnitActiveSec = cfg.cleanupInterval;
|
||||
};
|
||||
|
||||
systemd.services.snapper-boot = lib.mkIf cfg.snapshotRootOnBoot {
|
||||
description = "Take snapper snapshot of root on boot";
|
||||
inherit documentation;
|
||||
serviceConfig.ExecStart = "${pkgs.snapper}/bin/snapper --config root create --cleanup-algorithm number --description boot";
|
||||
serviceConfig.Type = "oneshot";
|
||||
requires = [ "local-fs.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
unitConfig.ConditionPathExists = "/etc/snapper/configs/root";
|
||||
};
|
||||
|
||||
assertions = concatMap (
|
||||
name:
|
||||
let
|
||||
sub = cfg.configs.${name};
|
||||
in
|
||||
[
|
||||
{
|
||||
assertion = !(sub ? extraConfig);
|
||||
message = ''
|
||||
The option definition `services.snapper.configs.${name}.extraConfig' no longer has any effect; please remove it.
|
||||
The contents of this option should be migrated to attributes on `services.snapper.configs.${name}'.
|
||||
'';
|
||||
}
|
||||
]
|
||||
++
|
||||
map
|
||||
(attr: {
|
||||
assertion = !(hasAttr attr sub);
|
||||
@ -265,8 +346,11 @@ in
|
||||
The option definition `services.snapper.configs.${name}.${attr}' has been renamed to `services.snapper.configs.${name}.${toUpper attr}'.
|
||||
'';
|
||||
})
|
||||
[ "fstype" "subvolume" ]
|
||||
)
|
||||
(attrNames cfg.configs);
|
||||
});
|
||||
[
|
||||
"fstype"
|
||||
"subvolume"
|
||||
]
|
||||
) (attrNames cfg.configs);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ in {
|
||||
"-templates ${cfg.templateDir}"
|
||||
];
|
||||
in {
|
||||
ExecStart = "${pkgs.grafana_reporter}/bin/grafana-reporter ${args}";
|
||||
ExecStart = "${pkgs.grafana-reporter}/bin/grafana-reporter ${args}";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -37,7 +37,6 @@ in
|
||||
{
|
||||
meta.maintainers = with maintainers; [
|
||||
misuzu
|
||||
thubrecht
|
||||
];
|
||||
meta.doc = ./netbird.md;
|
||||
|
||||
|
@ -16,7 +16,7 @@ in
|
||||
|
||||
{
|
||||
meta = {
|
||||
maintainers = with lib.maintainers; [thubrecht patrickdag];
|
||||
maintainers = with lib.maintainers; [patrickdag];
|
||||
doc = ./server.md;
|
||||
};
|
||||
|
||||
|
@ -1,83 +1,94 @@
|
||||
{ config, lib, options, pkgs, utils, ... }:
|
||||
with lib;
|
||||
{ config
|
||||
, lib
|
||||
, pkgs
|
||||
, ...
|
||||
}:
|
||||
|
||||
let
|
||||
cfg = config.services.wstunnel;
|
||||
attrsToArgs = attrs: utils.escapeSystemdExecArgs (
|
||||
mapAttrsToList
|
||||
(name: value: if value == true then "--${name}" else "--${name}=${value}")
|
||||
attrs
|
||||
);
|
||||
|
||||
hostPortToString = { host, port }: "${host}:${builtins.toString port}";
|
||||
hostPortToString = { host, port }: "${host}:${toString port}";
|
||||
|
||||
hostPortSubmodule = {
|
||||
options = {
|
||||
host = mkOption {
|
||||
host = lib.mkOption {
|
||||
description = "The hostname.";
|
||||
type = types.str;
|
||||
type = lib.types.str;
|
||||
};
|
||||
port = mkOption {
|
||||
port = lib.mkOption {
|
||||
description = "The port.";
|
||||
type = types.port;
|
||||
type = lib.types.port;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
commonOptions = {
|
||||
enable = mkOption {
|
||||
description = "Whether to enable this `wstunnel` instance.";
|
||||
type = types.bool;
|
||||
enable = lib.mkEnableOption "this `wstunnel` instance." // {
|
||||
default = true;
|
||||
};
|
||||
|
||||
package = mkPackageOption pkgs "wstunnel" {};
|
||||
package = lib.mkPackageOption pkgs "wstunnel" { };
|
||||
|
||||
autoStart = mkOption {
|
||||
description = "Whether this tunnel server should be started automatically.";
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
autoStart =
|
||||
lib.mkEnableOption "starting this wstunnel instance automatically." // {
|
||||
default = true;
|
||||
};
|
||||
|
||||
extraArgs = mkOption {
|
||||
description = "Extra command line arguments to pass to `wstunnel`. Attributes of the form `argName = true;` will be translated to `--argName`, and `argName = \"value\"` to `--argName=value`.";
|
||||
type = with types; attrsOf (either str bool);
|
||||
default = {};
|
||||
extraArgs = lib.mkOption {
|
||||
description = ''
|
||||
Extra command line arguments to pass to `wstunnel`.
|
||||
Attributes of the form `argName = true;` will be translated to `--argName`,
|
||||
and `argName = \"value\"` to `--argName value`.
|
||||
'';
|
||||
type = with lib.types; attrsOf (either str bool);
|
||||
default = { };
|
||||
example = {
|
||||
"someNewOption" = true;
|
||||
"someNewOptionWithValue" = "someValue";
|
||||
};
|
||||
};
|
||||
|
||||
loggingLevel = mkOption {
|
||||
loggingLevel = lib.mkOption {
|
||||
description = ''
|
||||
Passed to --log-lvl
|
||||
|
||||
Control the log verbosity. i.e: TRACE, DEBUG, INFO, WARN, ERROR, OFF
|
||||
For more details, checkout [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#example-syntax)
|
||||
'';
|
||||
type = types.nullOr types.str;
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
example = "INFO";
|
||||
default = null;
|
||||
};
|
||||
|
||||
environmentFile = mkOption {
|
||||
description = "Environment file to be passed to the systemd service. Useful for passing secrets to the service to prevent them from being world-readable in the Nix store. Note however that the secrets are passed to `wstunnel` through the command line, which makes them locally readable for all users of the system at runtime.";
|
||||
type = types.nullOr types.path;
|
||||
environmentFile = lib.mkOption {
|
||||
description = ''
|
||||
Environment file to be passed to the systemd service.
|
||||
Useful for passing secrets to the service to prevent them from being
|
||||
world-readable in the Nix store.
|
||||
Note however that the secrets are passed to `wstunnel` through
|
||||
the command line, which makes them locally readable for all users of
|
||||
the system at runtime.
|
||||
'';
|
||||
type = lib.types.nullOr lib.types.path;
|
||||
default = null;
|
||||
example = "/var/lib/secrets/wstunnelSecrets";
|
||||
};
|
||||
};
|
||||
|
||||
serverSubmodule = { config, ...}: {
|
||||
serverSubmodule = { config, ... }: {
|
||||
options = commonOptions // {
|
||||
listen = mkOption {
|
||||
description = "Address and port to listen on. Setting the port to a value below 1024 will also give the process the required `CAP_NET_BIND_SERVICE` capability.";
|
||||
type = types.submodule hostPortSubmodule;
|
||||
listen = lib.mkOption {
|
||||
description = ''
|
||||
Address and port to listen on.
|
||||
Setting the port to a value below 1024 will also give the process
|
||||
the required `CAP_NET_BIND_SERVICE` capability.
|
||||
'';
|
||||
type = lib.types.submodule hostPortSubmodule;
|
||||
default = {
|
||||
host = "0.0.0.0";
|
||||
port = if config.enableHTTPS then 443 else 80;
|
||||
};
|
||||
defaultText = literalExpression ''
|
||||
defaultText = lib.literalExpression ''
|
||||
{
|
||||
host = "0.0.0.0";
|
||||
port = if enableHTTPS then 443 else 80;
|
||||
@ -85,39 +96,50 @@ let
|
||||
'';
|
||||
};
|
||||
|
||||
restrictTo = mkOption {
|
||||
description = "Accepted traffic will be forwarded only to this service. Set to `null` to allow forwarding to arbitrary addresses.";
|
||||
type = types.listOf (types.submodule hostPortSubmodule);
|
||||
default = [];
|
||||
restrictTo = lib.mkOption {
|
||||
description = ''
|
||||
Accepted traffic will be forwarded only to this service.
|
||||
'';
|
||||
type = lib.types.listOf (lib.types.submodule hostPortSubmodule);
|
||||
default = [ ];
|
||||
example = [{
|
||||
host = "127.0.0.1";
|
||||
port = 51820;
|
||||
}];
|
||||
};
|
||||
|
||||
enableHTTPS = mkOption {
|
||||
enableHTTPS = lib.mkOption {
|
||||
description = "Use HTTPS for the tunnel server.";
|
||||
type = types.bool;
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
};
|
||||
|
||||
tlsCertificate = mkOption {
|
||||
description = "TLS certificate to use instead of the hardcoded one in case of HTTPS connections. Use together with `tlsKey`.";
|
||||
type = types.nullOr types.path;
|
||||
tlsCertificate = lib.mkOption {
|
||||
description = ''
|
||||
TLS certificate to use instead of the hardcoded one in case of HTTPS connections.
|
||||
Use together with `tlsKey`.
|
||||
'';
|
||||
type = lib.types.nullOr lib.types.path;
|
||||
default = null;
|
||||
example = "/var/lib/secrets/cert.pem";
|
||||
};
|
||||
|
||||
tlsKey = mkOption {
|
||||
description = "TLS key to use instead of the hardcoded on in case of HTTPS connections. Use together with `tlsCertificate`.";
|
||||
type = types.nullOr types.path;
|
||||
tlsKey = lib.mkOption {
|
||||
description = ''
|
||||
TLS key to use instead of the hardcoded on in case of HTTPS connections.
|
||||
Use together with `tlsCertificate`.
|
||||
'';
|
||||
type = lib.types.nullOr lib.types.path;
|
||||
default = null;
|
||||
example = "/var/lib/secrets/key.pem";
|
||||
};
|
||||
|
||||
useACMEHost = mkOption {
|
||||
description = "Use a certificate generated by the NixOS ACME module for the given host. Note that this will not generate a new certificate - you will need to do so with `security.acme.certs`.";
|
||||
type = types.nullOr types.str;
|
||||
useACMEHost = lib.mkOption {
|
||||
description = ''
|
||||
Use a certificate generated by the NixOS ACME module for the given host.
|
||||
Note that this will not generate a new certificate - you will need to do so with `security.acme.certs`.
|
||||
'';
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
example = "example.com";
|
||||
};
|
||||
@ -126,95 +148,113 @@ let
|
||||
|
||||
clientSubmodule = { config, ... }: {
|
||||
options = commonOptions // {
|
||||
connectTo = mkOption {
|
||||
connectTo = lib.mkOption {
|
||||
description = "Server address and port to connect to.";
|
||||
type = types.str;
|
||||
type = lib.types.str;
|
||||
example = "https://wstunnel.server.com:8443";
|
||||
};
|
||||
|
||||
localToRemote = mkOption {
|
||||
localToRemote = lib.mkOption {
|
||||
description = ''Listen on local and forwards traffic from remote.'';
|
||||
type = types.listOf (types.str);
|
||||
default = [];
|
||||
type = lib.types.listOf (lib.types.str);
|
||||
default = [ ];
|
||||
example = [
|
||||
"tcp://1212:google.com:443"
|
||||
"unix:///tmp/wstunnel.sock:g.com:443"
|
||||
];
|
||||
};
|
||||
|
||||
remoteToLocal = mkOption {
|
||||
remoteToLocal = lib.mkOption {
|
||||
description = "Listen on remote and forwards traffic from local. Only tcp is supported";
|
||||
type = types.listOf (types.str);
|
||||
default = [];
|
||||
type = lib.types.listOf lib.types.str;
|
||||
default = [ ];
|
||||
example = [
|
||||
"tcp://1212:google.com:443"
|
||||
"unix://wstunnel.sock:g.com:443"
|
||||
];
|
||||
};
|
||||
|
||||
addNetBind = mkEnableOption "Whether add CAP_NET_BIND_SERVICE to the tunnel service, this should be enabled if you want to bind port < 1024";
|
||||
addNetBind = lib.mkEnableOption "Whether add CAP_NET_BIND_SERVICE to the tunnel service, this should be enabled if you want to bind port < 1024";
|
||||
|
||||
httpProxy = mkOption {
|
||||
httpProxy = lib.mkOption {
|
||||
description = ''
|
||||
Proxy to use to connect to the wstunnel server (`USER:PASS@HOST:PORT`).
|
||||
|
||||
::: {.warning}
|
||||
Passwords specified here will be world-readable in the Nix store! To pass a password to the service, point the `environmentFile` option to a file containing `PROXY_PASSWORD=<your-password-here>` and set this option to `<user>:$PROXY_PASSWORD@<host>:<port>`. Note however that this will also locally leak the passwords at runtime via e.g. /proc/<pid>/cmdline.
|
||||
|
||||
Passwords specified here will be world-readable in the Nix store!
|
||||
To pass a password to the service, point the `environmentFile` option
|
||||
to a file containing `PROXY_PASSWORD=<your-password-here>` and set
|
||||
this option to `<user>:$PROXY_PASSWORD@<host>:<port>`.
|
||||
Note however that this will also locally leak the passwords at
|
||||
runtime via e.g. /proc/<pid>/cmdline.
|
||||
:::
|
||||
'';
|
||||
type = types.nullOr types.str;
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
};
|
||||
|
||||
soMark = mkOption {
|
||||
description = "Mark network packets with the SO_MARK sockoption with the specified value. Setting this option will also enable the required `CAP_NET_ADMIN` capability for the systemd service.";
|
||||
type = types.nullOr types.int;
|
||||
soMark = lib.mkOption {
|
||||
description = ''
|
||||
Mark network packets with the SO_MARK sockoption with the specified value.
|
||||
Setting this option will also enable the required `CAP_NET_ADMIN` capability
|
||||
for the systemd service.
|
||||
'';
|
||||
type = lib.types.nullOr lib.types.ints.unsigned;
|
||||
default = null;
|
||||
};
|
||||
|
||||
upgradePathPrefix = mkOption {
|
||||
description = "Use a specific HTTP path prefix that will show up in the upgrade request to the `wstunnel` server. Useful when running `wstunnel` behind a reverse proxy.";
|
||||
type = types.nullOr types.str;
|
||||
upgradePathPrefix = lib.mkOption {
|
||||
description = ''
|
||||
Use a specific HTTP path prefix that will show up in the upgrade
|
||||
request to the `wstunnel` server.
|
||||
Useful when running `wstunnel` behind a reverse proxy.
|
||||
'';
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
example = "wstunnel";
|
||||
};
|
||||
|
||||
tlsSNI = mkOption {
|
||||
tlsSNI = lib.mkOption {
|
||||
description = "Use this as the SNI while connecting via TLS. Useful for circumventing hostname-based firewalls.";
|
||||
type = types.nullOr types.str;
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
};
|
||||
|
||||
tlsVerifyCertificate = mkOption {
|
||||
tlsVerifyCertificate = lib.mkOption {
|
||||
description = "Whether to verify the TLS certificate of the server. It might be useful to set this to `false` when working with the `tlsSNI` option.";
|
||||
type = types.bool;
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
};
|
||||
|
||||
# The original argument name `websocketPingFrequency` is a misnomer, as the frequency is the inverse of the interval.
|
||||
websocketPingInterval = mkOption {
|
||||
websocketPingInterval = lib.mkOption {
|
||||
description = "Frequency at which the client will send websocket ping to the server.";
|
||||
type = types.nullOr types.ints.unsigned;
|
||||
type = lib.types.nullOr lib.types.ints.unsigned;
|
||||
default = null;
|
||||
};
|
||||
|
||||
upgradeCredentials = mkOption {
|
||||
upgradeCredentials = lib.mkOption {
|
||||
description = ''
|
||||
Use these credentials to authenticate during the HTTP upgrade request (Basic authorization type, `USER:[PASS]`).
|
||||
Use these credentials to authenticate during the HTTP upgrade request
|
||||
(Basic authorization type, `USER:[PASS]`).
|
||||
|
||||
::: {.warning}
|
||||
Passwords specified here will be world-readable in the Nix store! To pass a password to the service, point the `environmentFile` option to a file containing `HTTP_PASSWORD=<your-password-here>` and set this option to `<user>:$HTTP_PASSWORD`. Note however that this will also locally leak the passwords at runtime via e.g. /proc/<pid>/cmdline.
|
||||
Passwords specified here will be world-readable in the Nix store!
|
||||
To pass a password to the service, point the `environmentFile` option
|
||||
to a file containing `HTTP_PASSWORD=<your-password-here>` and set this
|
||||
option to `<user>:$HTTP_PASSWORD`.
|
||||
Note however that this will also locally leak the passwords at runtime
|
||||
via e.g. /proc/<pid>/cmdline.
|
||||
:::
|
||||
'';
|
||||
type = types.nullOr types.str;
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
};
|
||||
|
||||
customHeaders = mkOption {
|
||||
customHeaders = lib.mkOption {
|
||||
description = "Custom HTTP headers to send during the upgrade request.";
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
type = lib.types.attrsOf lib.types.str;
|
||||
default = { };
|
||||
example = {
|
||||
"X-Some-Header" = "some-value";
|
||||
};
|
||||
@ -224,49 +264,63 @@ let
|
||||
|
||||
generateServerUnit = name: serverCfg: {
|
||||
name = "wstunnel-server-${name}";
|
||||
value = {
|
||||
description = "wstunnel server - ${name}";
|
||||
requires = [ "network.target" "network-online.target" ];
|
||||
after = [ "network.target" "network-online.target" ];
|
||||
wantedBy = optional serverCfg.autoStart "multi-user.target";
|
||||
value =
|
||||
let
|
||||
certConfig = config.security.acme.certs.${serverCfg.useACMEHost};
|
||||
in
|
||||
{
|
||||
description = "wstunnel server - ${name}";
|
||||
requires = [ "network.target" "network-online.target" ];
|
||||
after = [ "network.target" "network-online.target" ];
|
||||
wantedBy = lib.optional serverCfg.autoStart "multi-user.target";
|
||||
|
||||
serviceConfig = let
|
||||
certConfig = config.security.acme.certs."${serverCfg.useACMEHost}";
|
||||
in {
|
||||
Type = "simple";
|
||||
ExecStart = with serverCfg; let
|
||||
resolvedTlsCertificate = if useACMEHost != null
|
||||
then "${certConfig.directory}/fullchain.pem"
|
||||
else tlsCertificate;
|
||||
resolvedTlsKey = if useACMEHost != null
|
||||
then "${certConfig.directory}/key.pem"
|
||||
else tlsKey;
|
||||
in ''
|
||||
${package}/bin/wstunnel \
|
||||
environment.RUST_LOG = serverCfg.loggingLevel;
|
||||
|
||||
serviceConfig = {
|
||||
Type = "exec";
|
||||
EnvironmentFile =
|
||||
lib.optional (serverCfg.environmentFile != null) serverCfg.environmentFile;
|
||||
DynamicUser = true;
|
||||
SupplementaryGroups =
|
||||
lib.optional (serverCfg.useACMEHost != null) certConfig.group;
|
||||
PrivateTmp = true;
|
||||
AmbientCapabilities =
|
||||
lib.optionals (serverCfg.listen.port < 1024) [ "CAP_NET_BIND_SERVICE" ];
|
||||
NoNewPrivileges = true;
|
||||
RestrictNamespaces = "uts ipc pid user cgroup";
|
||||
ProtectSystem = "strict";
|
||||
ProtectHome = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectControlGroups = true;
|
||||
PrivateDevices = true;
|
||||
RestrictSUIDSGID = true;
|
||||
|
||||
Restart = "on-failure";
|
||||
RestartSec = 2;
|
||||
RestartSteps = 20;
|
||||
RestartMaxDelaySec = "5min";
|
||||
};
|
||||
|
||||
script = with serverCfg; ''
|
||||
${lib.getExe package} \
|
||||
server \
|
||||
${concatStringsSep " " (builtins.map (hostPair: "--restrict-to ${utils.escapeSystemdExecArg (hostPortToString hostPair)}") restrictTo)} \
|
||||
${optionalString (resolvedTlsCertificate != null) "--tls-certificate ${utils.escapeSystemdExecArg resolvedTlsCertificate}"} \
|
||||
${optionalString (resolvedTlsKey != null) "--tls-private-key ${utils.escapeSystemdExecArg resolvedTlsKey}"} \
|
||||
${optionalString (loggingLevel != null) "--log-lvl ${loggingLevel}"} \
|
||||
${attrsToArgs extraArgs} \
|
||||
${utils.escapeSystemdExecArg "${if enableHTTPS then "wss" else "ws"}://${hostPortToString listen}"}
|
||||
${lib.cli.toGNUCommandLineShell { } (
|
||||
lib.recursiveUpdate
|
||||
{
|
||||
restrict-to = map hostPortToString restrictTo;
|
||||
tls-certificate = if useACMEHost != null
|
||||
then "${certConfig.directory}/fullchain.pem"
|
||||
else "${tlsCertificate}";
|
||||
tls-private-key = if useACMEHost != null
|
||||
then "${certConfig.directory}/key.pem"
|
||||
else "${tlsKey}";
|
||||
}
|
||||
extraArgs
|
||||
)} \
|
||||
${lib.escapeShellArg "${if enableHTTPS then "wss" else "ws"}://${hostPortToString listen}"}
|
||||
'';
|
||||
EnvironmentFile = optional (serverCfg.environmentFile != null) serverCfg.environmentFile;
|
||||
DynamicUser = true;
|
||||
SupplementaryGroups = optional (serverCfg.useACMEHost != null) certConfig.group;
|
||||
PrivateTmp = true;
|
||||
AmbientCapabilities = optionals (serverCfg.listen.port < 1024) [ "CAP_NET_BIND_SERVICE" ];
|
||||
NoNewPrivileges = true;
|
||||
RestrictNamespaces = "uts ipc pid user cgroup";
|
||||
ProtectSystem = "strict";
|
||||
ProtectHome = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectControlGroups = true;
|
||||
PrivateDevices = true;
|
||||
RestrictSUIDSGID = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
generateClientUnit = name: clientCfg: {
|
||||
@ -275,30 +329,19 @@ let
|
||||
description = "wstunnel client - ${name}";
|
||||
requires = [ "network.target" "network-online.target" ];
|
||||
after = [ "network.target" "network-online.target" ];
|
||||
wantedBy = optional clientCfg.autoStart "multi-user.target";
|
||||
wantedBy = lib.optional clientCfg.autoStart "multi-user.target";
|
||||
|
||||
environment.RUST_LOG = clientCfg.loggingLevel;
|
||||
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
ExecStart = with clientCfg; ''
|
||||
${package}/bin/wstunnel client \
|
||||
${concatStringsSep " " (builtins.map (x: "--local-to-remote ${x}") localToRemote)} \
|
||||
${concatStringsSep " " (builtins.map (x: "--remote-to-local ${x}") remoteToLocal)} \
|
||||
${concatStringsSep " " (mapAttrsToList (n: v: "--http-headers \"${n}: ${v}\"") customHeaders)} \
|
||||
${optionalString (httpProxy != null) "--http-proxy ${httpProxy}"} \
|
||||
${optionalString (soMark != null) "--socket-so-mark=${toString soMark}"} \
|
||||
${optionalString (upgradePathPrefix != null) "--http-upgrade-path-prefix ${upgradePathPrefix}"} \
|
||||
${optionalString (tlsSNI != null) "--tls-sni-override ${tlsSNI}"} \
|
||||
${optionalString tlsVerifyCertificate "--tls-verify-certificate"} \
|
||||
${optionalString (websocketPingInterval != null) "--websocket-ping-frequency-sec ${toString websocketPingInterval}"} \
|
||||
${optionalString (upgradeCredentials != null) "--http-upgrade-credentials ${upgradeCredentials}"} \
|
||||
${optionalString (loggingLevel != null) "--log-lvl ${loggingLevel}"} \
|
||||
${attrsToArgs extraArgs} \
|
||||
${utils.escapeSystemdExecArg connectTo}
|
||||
'';
|
||||
EnvironmentFile = optional (clientCfg.environmentFile != null) clientCfg.environmentFile;
|
||||
Type = "exec";
|
||||
EnvironmentFile =
|
||||
lib.optional (clientCfg.environmentFile != null) clientCfg.environmentFile;
|
||||
DynamicUser = true;
|
||||
PrivateTmp = true;
|
||||
AmbientCapabilities = (optionals (clientCfg.soMark != null) [ "CAP_NET_ADMIN" ]) ++ (optionals (clientCfg.addNetBind) [ "CAP_NET_BIND_SERVICE" ]);
|
||||
AmbientCapabilities =
|
||||
(lib.optionals clientCfg.addNetBind [ "CAP_NET_BIND_SERVICE" ]) ++
|
||||
(lib.optionals (clientCfg.soMark != null) [ "CAP_NET_ADMIN" ]);
|
||||
NoNewPrivileges = true;
|
||||
RestrictNamespaces = "uts ipc pid user cgroup";
|
||||
ProtectSystem = "strict";
|
||||
@ -308,17 +351,45 @@ let
|
||||
ProtectControlGroups = true;
|
||||
PrivateDevices = true;
|
||||
RestrictSUIDSGID = true;
|
||||
|
||||
Restart = "on-failure";
|
||||
RestartSec = 2;
|
||||
RestartSteps = 20;
|
||||
RestartMaxDelaySec = "5min";
|
||||
};
|
||||
|
||||
script = with clientCfg; ''
|
||||
${lib.getExe package} \
|
||||
client \
|
||||
${lib.cli.toGNUCommandLineShell { } (
|
||||
lib.recursiveUpdate
|
||||
{
|
||||
local-to-remote = localToRemote;
|
||||
remote-to-local = remoteToLocal;
|
||||
http-headers = lib.mapAttrsToList (n: v: "${n}:${v}") customHeaders;
|
||||
http-proxy = httpProxy;
|
||||
socket-so-mark = soMark;
|
||||
http-upgrade-path-prefix = upgradePathPrefix;
|
||||
tls-sni-override = tlsSNI;
|
||||
tls-verify-certificate = tlsVerifyCertificate;
|
||||
websocket-ping-frequency-sec = websocketPingInterval;
|
||||
http-upgrade-credentials = upgradeCredentials;
|
||||
}
|
||||
extraArgs
|
||||
)} \
|
||||
${lib.escapeShellArg connectTo}
|
||||
'';
|
||||
};
|
||||
};
|
||||
in {
|
||||
in
|
||||
{
|
||||
options.services.wstunnel = {
|
||||
enable = mkEnableOption "wstunnel";
|
||||
enable = lib.mkEnableOption "wstunnel";
|
||||
|
||||
servers = mkOption {
|
||||
servers = lib.mkOption {
|
||||
description = "`wstunnel` servers to set up.";
|
||||
type = types.attrsOf (types.submodule serverSubmodule);
|
||||
default = {};
|
||||
type = lib.types.attrsOf (lib.types.submodule serverSubmodule);
|
||||
default = { };
|
||||
example = {
|
||||
"wg-tunnel" = {
|
||||
listen = {
|
||||
@ -336,13 +407,13 @@ in {
|
||||
};
|
||||
};
|
||||
|
||||
clients = mkOption {
|
||||
clients = lib.mkOption {
|
||||
description = "`wstunnel` clients to set up.";
|
||||
type = types.attrsOf (types.submodule clientSubmodule);
|
||||
default = {};
|
||||
type = lib.types.attrsOf (lib.types.submodule clientSubmodule);
|
||||
default = { };
|
||||
example = {
|
||||
"wg-tunnel" = {
|
||||
connectTo = "https://wstunnel.server.com:8443";
|
||||
connectTo = "wss://wstunnel.server.com:8443";
|
||||
localToRemote = [
|
||||
"tcp://1212:google.com:443"
|
||||
"tcp://2:n.lan:4?proxy_protocol"
|
||||
@ -356,28 +427,42 @@ in {
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.services = (mapAttrs' generateServerUnit (filterAttrs (n: v: v.enable) cfg.servers)) // (mapAttrs' generateClientUnit (filterAttrs (n: v: v.enable) cfg.clients));
|
||||
config = lib.mkIf cfg.enable {
|
||||
systemd.services =
|
||||
(lib.mapAttrs' generateServerUnit (lib.filterAttrs (n: v: v.enable) cfg.servers)) //
|
||||
(lib.mapAttrs' generateClientUnit (lib.filterAttrs (n: v: v.enable) cfg.clients));
|
||||
|
||||
assertions = (mapAttrsToList (name: serverCfg: {
|
||||
assertion = !(serverCfg.useACMEHost != null && (serverCfg.tlsCertificate != null || serverCfg.tlsKey != null));
|
||||
message = ''
|
||||
Options services.wstunnel.servers."${name}".useACMEHost and services.wstunnel.servers."${name}".{tlsCertificate, tlsKey} are mutually exclusive.
|
||||
'';
|
||||
}) cfg.servers) ++
|
||||
(mapAttrsToList (name: serverCfg: {
|
||||
assertion = !((serverCfg.tlsCertificate != null || serverCfg.tlsKey != null) && !(serverCfg.tlsCertificate != null && serverCfg.tlsKey != null));
|
||||
message = ''
|
||||
services.wstunnel.servers."${name}".tlsCertificate and services.wstunnel.servers."${name}".tlsKey need to be set together.
|
||||
'';
|
||||
}) cfg.servers) ++
|
||||
(mapAttrsToList (name: clientCfg: {
|
||||
assertion = !(clientCfg.localToRemote == [] && clientCfg.remoteToLocal == []);
|
||||
message = ''
|
||||
Either one of services.wstunnel.clients."${name}".localToRemote or services.wstunnel.clients."${name}".remoteToLocal must be set.
|
||||
'';
|
||||
}) cfg.clients);
|
||||
assertions =
|
||||
(lib.mapAttrsToList
|
||||
(name: serverCfg: {
|
||||
assertion =
|
||||
!(serverCfg.useACMEHost != null && serverCfg.tlsCertificate != null);
|
||||
message = ''
|
||||
Options services.wstunnel.servers."${name}".useACMEHost and services.wstunnel.servers."${name}".{tlsCertificate, tlsKey} are mutually exclusive.
|
||||
'';
|
||||
})
|
||||
cfg.servers) ++
|
||||
|
||||
(lib.mapAttrsToList
|
||||
(name: serverCfg: {
|
||||
assertion =
|
||||
(serverCfg.tlsCertificate == null && serverCfg.tlsKey == null) ||
|
||||
(serverCfg.tlsCertificate != null && serverCfg.tlsKey != null);
|
||||
message = ''
|
||||
services.wstunnel.servers."${name}".tlsCertificate and services.wstunnel.servers."${name}".tlsKey need to be set together.
|
||||
'';
|
||||
})
|
||||
cfg.servers) ++
|
||||
|
||||
(lib.mapAttrsToList
|
||||
(name: clientCfg: {
|
||||
assertion = !(clientCfg.localToRemote == [ ] && clientCfg.remoteToLocal == [ ]);
|
||||
message = ''
|
||||
Either one of services.wstunnel.clients."${name}".localToRemote or services.wstunnel.clients."${name}".remoteToLocal must be set.
|
||||
'';
|
||||
})
|
||||
cfg.clients);
|
||||
};
|
||||
|
||||
meta.maintainers = with maintainers; [ alyaeanyx neverbehave ];
|
||||
meta.maintainers = with lib.maintainers; [ alyaeanyx rvdp neverbehave ];
|
||||
}
|
||||
|
@ -9,10 +9,10 @@ in
|
||||
config = {
|
||||
system.build.OCIImage = import ../../lib/make-disk-image.nix {
|
||||
inherit config lib pkgs;
|
||||
inherit (cfg) diskSize;
|
||||
name = "oci-image";
|
||||
configFile = ./oci-config-user.nix;
|
||||
format = "qcow2";
|
||||
diskSize = 8192;
|
||||
partitionTableType = if cfg.efi then "efi" else "legacy";
|
||||
};
|
||||
|
||||
|
@ -9,6 +9,12 @@
|
||||
Whether the OCI instance is using EFI.
|
||||
'';
|
||||
};
|
||||
diskSize = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 8192;
|
||||
description = "Size of the disk image created in MB.";
|
||||
example = "diskSize = 12 * 1024; # 12GiB";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -1045,6 +1045,7 @@ in {
|
||||
wordpress = handleTest ./wordpress.nix {};
|
||||
wrappers = handleTest ./wrappers.nix {};
|
||||
writefreely = handleTest ./web-apps/writefreely.nix {};
|
||||
wstunnel = runTest ./wstunnel.nix;
|
||||
xandikos = handleTest ./xandikos.nix {};
|
||||
xautolock = handleTest ./xautolock.nix {};
|
||||
xfce = handleTest ./xfce.nix {};
|
||||
|
@ -4,7 +4,7 @@ import ./make-test-python.nix (
|
||||
{
|
||||
name = "crabfit";
|
||||
|
||||
meta.maintainers = with lib.maintainers; [ thubrecht ];
|
||||
meta.maintainers = with lib.maintainers; [ ];
|
||||
|
||||
nodes = {
|
||||
machine =
|
||||
|
@ -41,14 +41,14 @@ let
|
||||
in {
|
||||
matomo = matomoTest pkgs.matomo // {
|
||||
name = "matomo";
|
||||
meta.maintainers = with maintainers; [ florianjacob kiwi mmilata twey boozedog ];
|
||||
meta.maintainers = with maintainers; [ florianjacob mmilata twey boozedog ];
|
||||
};
|
||||
matomo-beta = matomoTest pkgs.matomo-beta // {
|
||||
name = "matomo-beta";
|
||||
meta.maintainers = with maintainers; [ florianjacob kiwi mmilata twey boozedog ];
|
||||
meta.maintainers = with maintainers; [ florianjacob mmilata twey boozedog ];
|
||||
};
|
||||
matomo_5 = matomoTest pkgs.matomo_5 // {
|
||||
name = "matomo-5";
|
||||
meta.maintainers = with maintainers; [ florianjacob kiwi mmilata twey boozedog ] ++ lib.teams.flyingcircus.members;
|
||||
meta.maintainers = with maintainers; [ florianjacob mmilata twey boozedog ] ++ lib.teams.flyingcircus.members;
|
||||
};
|
||||
}
|
||||
|
96
nixos/tests/wstunnel.nix
Normal file
96
nixos/tests/wstunnel.nix
Normal file
@ -0,0 +1,96 @@
|
||||
let
|
||||
certs = import ./common/acme/server/snakeoil-certs.nix;
|
||||
domain = certs.domain;
|
||||
in
|
||||
|
||||
{
|
||||
name = "wstunnel";
|
||||
|
||||
nodes = {
|
||||
server = {
|
||||
virtualisation.vlans = [ 1 ];
|
||||
|
||||
security.pki.certificateFiles = [ certs.ca.cert ];
|
||||
|
||||
networking = {
|
||||
useNetworkd = true;
|
||||
useDHCP = false;
|
||||
firewall.enable = false;
|
||||
};
|
||||
|
||||
systemd.network.networks."01-eth1" = {
|
||||
name = "eth1";
|
||||
networkConfig.Address = "10.0.0.1/24";
|
||||
};
|
||||
|
||||
services.wstunnel = {
|
||||
enable = true;
|
||||
servers.my-server = {
|
||||
listen = {
|
||||
host = "10.0.0.1";
|
||||
port = 443;
|
||||
};
|
||||
tlsCertificate = certs.${domain}.cert;
|
||||
tlsKey = certs.${domain}.key;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
client = {
|
||||
virtualisation.vlans = [ 1 ];
|
||||
|
||||
security.pki.certificateFiles = [ certs.ca.cert ];
|
||||
|
||||
networking = {
|
||||
useNetworkd = true;
|
||||
useDHCP = false;
|
||||
firewall.enable = false;
|
||||
extraHosts = ''
|
||||
10.0.0.1 ${domain}
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.network.networks."01-eth1" = {
|
||||
name = "eth1";
|
||||
networkConfig.Address = "10.0.0.2/24";
|
||||
};
|
||||
|
||||
services.wstunnel = {
|
||||
enable = true;
|
||||
clients.my-client = {
|
||||
autoStart = false;
|
||||
connectTo = "wss://${domain}:443";
|
||||
localToRemote = [
|
||||
"tcp://8080:localhost:2080"
|
||||
];
|
||||
remoteToLocal = [
|
||||
"tcp://2081:localhost:8081"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = /* python */ ''
|
||||
start_all()
|
||||
server.wait_for_unit("wstunnel-server-my-server.service")
|
||||
client.wait_for_open_port(443, "10.0.0.1")
|
||||
|
||||
client.systemctl("start wstunnel-client-my-client.service")
|
||||
client.wait_for_unit("wstunnel-client-my-client.service")
|
||||
|
||||
with subtest("connection from client to server"):
|
||||
server.succeed("nc -l 2080 >/tmp/msg &")
|
||||
client.sleep(1)
|
||||
client.succeed('nc -w1 localhost 8080 <<<"Hello from client"')
|
||||
server.succeed('grep "Hello from client" /tmp/msg')
|
||||
|
||||
with subtest("connection from server to client"):
|
||||
client.succeed("nc -l 8081 >/tmp/msg &")
|
||||
server.sleep(1)
|
||||
server.succeed('nc -w1 localhost 2081 <<<"Hello from server"')
|
||||
client.succeed('grep "Hello from server" /tmp/msg')
|
||||
|
||||
client.systemctl("stop wstunnel-client-my-client.service")
|
||||
'';
|
||||
}
|
@ -8,12 +8,12 @@
|
||||
, samplerateSupport ? jackSupport, libsamplerate ? null
|
||||
, ossSupport ? false, alsa-oss ? null
|
||||
, pulseaudioSupport ? config.pulseaudio or false, libpulseaudio ? null
|
||||
, sndioSupport ? false, sndio ? null
|
||||
, mprisSupport ? stdenv.isLinux, systemd ? null
|
||||
|
||||
# TODO: add these
|
||||
#, artsSupport
|
||||
#, roarSupport
|
||||
#, sndioSupport
|
||||
#, sunSupport
|
||||
#, waveoutSupport
|
||||
|
||||
@ -59,11 +59,11 @@ let
|
||||
(mkFlag samplerateSupport "CONFIG_SAMPLERATE=y" libsamplerate)
|
||||
(mkFlag ossSupport "CONFIG_OSS=y" alsa-oss)
|
||||
(mkFlag pulseaudioSupport "CONFIG_PULSE=y" libpulseaudio)
|
||||
(mkFlag sndioSupport "CONFIG_SNDIO=y" sndio)
|
||||
(mkFlag mprisSupport "CONFIG_MPRIS=y" systemd)
|
||||
|
||||
#(mkFlag artsSupport "CONFIG_ARTS=y")
|
||||
#(mkFlag roarSupport "CONFIG_ROAR=y")
|
||||
#(mkFlag sndioSupport "CONFIG_SNDIO=y")
|
||||
#(mkFlag sunSupport "CONFIG_SUN=y")
|
||||
#(mkFlag waveoutSupport "CONFIG_WAVEOUT=y")
|
||||
|
||||
@ -92,13 +92,13 @@ in
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "cmus";
|
||||
version = "2.10.0-unstable-2023-11-05";
|
||||
version = "2.11.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "cmus";
|
||||
repo = "cmus";
|
||||
rev = "23afab39902d3d97c47697196b07581305337529";
|
||||
sha256 = "sha256-pxDIYbeJMoaAuErCghWJpDSh1WbYbhgJ7+ca5WLCrOs=";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-kUJC+ORLkYD57mPL/1p5VCm9yiNzVdOZhxp7sVP6oMw=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkg-config ];
|
||||
|
@ -1,4 +1,5 @@
|
||||
{ fetchFromGitHub
|
||||
{ stdenvNoCC
|
||||
, fetchFromGitHub
|
||||
, lib
|
||||
, cmake
|
||||
, mkDerivation
|
||||
@ -26,12 +27,18 @@ mkDerivation rec {
|
||||
|
||||
installFlags = [ "DESTDIR=$(out)" ];
|
||||
|
||||
postInstall = lib.optionalString stdenvNoCC.isDarwin ''
|
||||
mkdir -p $out/Applications
|
||||
mv $out/bin/spotify-qt.app $out/Applications
|
||||
ln $out/Applications/spotify-qt.app/Contents/MacOS/spotify-qt $out/bin/spotify-qt
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Lightweight unofficial Spotify client using Qt";
|
||||
mainProgram = "spotify-qt";
|
||||
homepage = "https://github.com/kraxarn/spotify-qt";
|
||||
license = licenses.gpl3Only;
|
||||
maintainers = with maintainers; [ ];
|
||||
maintainers = with maintainers; [ iivusly ];
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
}
|
||||
|
@ -60,6 +60,9 @@
|
||||
, zsh
|
||||
, # codeium-nvim dependencies
|
||||
codeium
|
||||
, # codesnap-nvim dependencies
|
||||
clang
|
||||
, libuv
|
||||
, # command-t dependencies
|
||||
getconf
|
||||
, ruby
|
||||
@ -400,6 +403,50 @@
|
||||
'';
|
||||
};
|
||||
|
||||
codesnap-nvim =
|
||||
let
|
||||
version = "1.3.1";
|
||||
src = fetchFromGitHub {
|
||||
owner = "mistricky";
|
||||
repo = "codesnap.nvim";
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-nS/bAWsBQ1L4M9437Yp6FdmHoogzalKlLIAXnRZyMp0=";
|
||||
};
|
||||
codesnap-lib = rustPlatform.buildRustPackage {
|
||||
pname = "codesnap-lib";
|
||||
inherit version src;
|
||||
|
||||
sourceRoot = "${src.name}/generator";
|
||||
|
||||
cargoHash = "sha256-FTQl5WIGEf+RQKYJ4BbIE3cCeN+NYUp7VXIrpxB05tU=";
|
||||
|
||||
nativeBuildInputs = [
|
||||
pkg-config
|
||||
rustPlatform.bindgenHook
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
libuv.dev
|
||||
] ++ lib.optionals stdenv.isDarwin [
|
||||
darwin.apple_sdk.frameworks.AppKit
|
||||
];
|
||||
};
|
||||
in
|
||||
buildVimPlugin {
|
||||
pname = "codesnap.nvim";
|
||||
inherit version src;
|
||||
|
||||
# https://github.com/mistricky/codesnap.nvim/blob/main/scripts/build_generator.sh
|
||||
postInstall = let
|
||||
extension = if stdenv.isDarwin then "dylib" else "so";
|
||||
in ''
|
||||
cp ${codesnap-lib}/lib/libgenerator.${extension} lua/generator.so
|
||||
'';
|
||||
|
||||
doInstallCheck = true;
|
||||
nvimRequireCheck = "codesnap";
|
||||
};
|
||||
|
||||
command-t = super.command-t.overrideAttrs {
|
||||
nativeBuildInputs = [ getconf ruby ];
|
||||
buildPhase = ''
|
||||
@ -1485,6 +1532,11 @@
|
||||
'';
|
||||
};
|
||||
|
||||
todo-comments-nvim = super.todo-comments-nvim.overrideAttrs {
|
||||
dependencies = [ self.plenary-nvim ];
|
||||
nvimRequireCheck = "todo-comments";
|
||||
};
|
||||
|
||||
tup =
|
||||
let
|
||||
# Based on the comment at the top of https://github.com/gittup/tup/blob/master/contrib/syntax/tup.vim
|
||||
|
@ -191,6 +191,7 @@ https://github.com/neoclide/coc.nvim/,release,
|
||||
https://github.com/manicmaniac/coconut.vim/,HEAD,
|
||||
https://github.com/Exafunction/codeium.nvim/,HEAD,
|
||||
https://github.com/Exafunction/codeium.vim/,HEAD,
|
||||
https://github.com/mistricky/codesnap.nvim/,HEAD,
|
||||
https://github.com/gorbit99/codewindow.nvim/,HEAD,
|
||||
https://github.com/metakirby5/codi.vim/,,
|
||||
https://github.com/tjdevries/colorbuddy.nvim/,,
|
||||
|
@ -19,13 +19,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "xed-editor";
|
||||
version = "3.6.2";
|
||||
version = "3.6.3";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "linuxmint";
|
||||
repo = "xed";
|
||||
rev = version;
|
||||
sha256 = "sha256-+yY+vzDMeS4AMMAklzADD4/LAQgav3clM2CCK6xh47Q=";
|
||||
sha256 = "sha256-xsNqzicI11dM/DjY00pXaPpQdHA0ltP23g34fMWUoUA=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
|
@ -38,6 +38,6 @@ mkDerivation rec {
|
||||
# https://invent.kde.org/plasma-mobile/alligator/-/commit/db30f159c4700244532b17a260deb95551045b7a
|
||||
# * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
license = with licenses; [ gpl2Only gpl3Only ];
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -66,6 +66,6 @@ mkDerivation rec {
|
||||
homepage = "https://invent.kde.org/plasma-mobile/audiotube";
|
||||
# https://invent.kde.org/plasma-mobile/audiotube/-/tree/c503d0607a3386112beaa9cf990ab85fe33ef115/LICENSES
|
||||
license = with licenses; [ bsd2 cc0 gpl2Only gpl3Only ];
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -41,6 +41,6 @@ mkDerivation rec {
|
||||
description = "Calendar for Plasma Mobile";
|
||||
homepage = "https://invent.kde.org/plasma-mobile/calindori";
|
||||
license = licenses.gpl3Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -46,6 +46,6 @@ mkDerivation rec {
|
||||
mainProgram = "kalk";
|
||||
homepage = "https://invent.kde.org/plasma-mobile/kalk";
|
||||
license = licenses.gpl3Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -63,6 +63,6 @@ mkDerivation rec {
|
||||
homepage = "https://apps.kde.org/kasts/";
|
||||
# https://invent.kde.org/plasma-mobile/kasts/-/tree/master/LICENSES
|
||||
license = with licenses; [ bsd2 cc-by-sa-40 cc0 gpl2Only gpl2Plus gpl3Only gpl3Plus lgpl3Plus ];
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -41,6 +41,6 @@ mkDerivation rec {
|
||||
description = "Clock app for plasma mobile";
|
||||
homepage = "https://invent.kde.org/plasma-mobile/kclock";
|
||||
license = licenses.gpl2Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ mkDerivation rec {
|
||||
mainProgram = "keysmith";
|
||||
license = licenses.gpl3;
|
||||
homepage = "https://github.com/KDE/keysmith";
|
||||
maintainers = with maintainers; [ samueldr shamilton ];
|
||||
maintainers = with maintainers; [ shamilton ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
||||
|
@ -77,6 +77,6 @@ mkDerivation rec {
|
||||
homepage = "https://apps.kde.org/koko/";
|
||||
# LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
license = [ licenses.lgpl3Only licenses.lgpl21Only ];
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ mkDerivation {
|
||||
pname = "kpublictransport";
|
||||
meta = with lib; {
|
||||
license = [ licenses.cc0 ];
|
||||
maintainers = [ maintainers.samueldr ];
|
||||
maintainers = [ ];
|
||||
};
|
||||
nativeBuildInputs = [ extra-cmake-modules ];
|
||||
|
||||
|
@ -38,6 +38,6 @@ mkDerivation rec {
|
||||
mainProgram = "krecorder";
|
||||
homepage = "https://invent.kde.org/plasma-mobile/krecorder";
|
||||
license = licenses.gpl3Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -43,6 +43,6 @@ mkDerivation rec {
|
||||
homepage = "https://apps.kde.org/ktrip/";
|
||||
# GPL-2.0-or-later
|
||||
license = licenses.gpl2Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -44,6 +44,6 @@ mkDerivation rec {
|
||||
mainProgram = "kweather";
|
||||
homepage = "https://invent.kde.org/plasma-mobile/kweather";
|
||||
license = with licenses; [ gpl2Plus cc-by-40 ];
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -37,31 +37,28 @@ stdenv.mkDerivation (finalAttrs: rec {
|
||||
|
||||
makeFlags = [
|
||||
"PERLPATH=${perl}/bin/perl"
|
||||
# We *need* to pass DESTDIR, as the Makefile ignores PREFIX.
|
||||
"DESTDIR=$(out)"
|
||||
# Relative paths.
|
||||
"BINDIR=/bin"
|
||||
"PERLDIR=/share/perl5"
|
||||
"MODSDIR=/lib" # At runtime, AMC will test for that dir before
|
||||
# defaulting to the "portable" strategy we use, so this test
|
||||
# *must* fail. *But* this variable cannot be set to anything but
|
||||
# "/lib" , because that name is hardcoded in the main executable
|
||||
# and this variable controls both both the path AMC will check at
|
||||
# runtime, AND the path where the actual modules will be stored at
|
||||
# build-time. This has been reported upstream as
|
||||
# https://project.auto-multiple-choice.net/issues/872
|
||||
"TEXDIR=/tex/latex/" # what texlive.combine expects
|
||||
"TEXDOCDIR=/share/doc/texmf/" # TODO where to put this?
|
||||
"MAN1DIR=/share/man/man1"
|
||||
"DESKTOPDIR=/share/applications"
|
||||
"METAINFODIR=/share/metainfo"
|
||||
"ICONSDIR=/share/auto-multiple-choice/icons"
|
||||
"APPICONDIR=/share/icons/hicolor"
|
||||
"LOCALEDIR=/share/locale"
|
||||
"MODELSDIR=/share/auto-multiple-choice/models"
|
||||
"DOCDIR=/share/doc/auto-multiple-choice"
|
||||
"SHARED_MIMEINFO_DIR=/share/mime/packages"
|
||||
"LANG_GTKSOURCEVIEW_DIR=/share/gtksourceview-4/language-specs"
|
||||
# We *need* to set DESTDIR as empty and use absolute paths below,
|
||||
# because the Makefile ignores PREFIX and MODSDIR is required to
|
||||
# be an absolute path to not trigger "portable distribution" check
|
||||
# in auto-multiple-choice.in.
|
||||
"DESTDIR="
|
||||
# Set variables from Makefile.conf to absolute paths
|
||||
"BINDIR=${placeholder "out"}/bin"
|
||||
"PERLDIR=${placeholder "out"}/share/perl5"
|
||||
"MODSDIR=${placeholder "out"}/lib"
|
||||
"TEXDIR=${placeholder "out"}/tex/latex/" # what texlive.combine expects
|
||||
"TEXDOCDIR=${placeholder "out"}/share/doc/texmf/" # TODO where to put this?
|
||||
"MAN1DIR=${placeholder "out"}/share/man/man1"
|
||||
"DESKTOPDIR=${placeholder "out"}/share/applications"
|
||||
"METAINFODIR=${placeholder "out"}/share/metainfo"
|
||||
"ICONSDIR=${placeholder "out"}/share/auto-multiple-choice/icons"
|
||||
"CSSDIR=${placeholder "out"}/share/auto-multiple-choice/gtk"
|
||||
"APPICONDIR=${placeholder "out"}/share/icons/hicolor"
|
||||
"LOCALEDIR=${placeholder "out"}/share/locale"
|
||||
"MODELSDIR=${placeholder "out"}/share/auto-multiple-choice/models"
|
||||
"DOCDIR=${placeholder "out"}/share/doc/auto-multiple-choice"
|
||||
"SHARED_MIMEINFO_DIR=${placeholder "out"}/share/mime/packages"
|
||||
"LANG_GTKSOURCEVIEW_DIR=${placeholder "out"}/share/gtksourceview-4/language-specs"
|
||||
# Pretend to be redhat so `install` doesn't try to chown/chgrp.
|
||||
"SYSTEM_TYPE=rpm"
|
||||
"GCC=${stdenv.cc.targetPrefix}cc"
|
||||
@ -93,6 +90,7 @@ stdenv.mkDerivation (finalAttrs: rec {
|
||||
XMLWriter
|
||||
]}:"$out/share/perl5 \
|
||||
--prefix XDG_DATA_DIRS : "$out/share:$XDG_ICON_DIRS:$GSETTINGS_SCHEMAS_PATH" \
|
||||
--prefix PATH : "$out/bin" \
|
||||
--set TEXINPUTS ":.:$out/tex/latex"
|
||||
'';
|
||||
|
||||
|
@ -72,7 +72,7 @@ mkDerivation rec {
|
||||
description = "2D CAD package based on Qt";
|
||||
homepage = "https://librecad.org";
|
||||
license = licenses.gpl2Only;
|
||||
maintainers = with maintainers; [ kiwi viric ];
|
||||
maintainers = with maintainers; [ viric ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
||||
|
@ -73,6 +73,6 @@ mkDerivation rec {
|
||||
mainProgram = "maliit-server";
|
||||
homepage = "http://maliit.github.io/";
|
||||
license = licenses.lgpl21Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -69,6 +69,6 @@ mkDerivation rec {
|
||||
mainProgram = "maliit-keyboard";
|
||||
homepage = "http://maliit.github.io/";
|
||||
license = with licenses; [ lgpl3Only bsd3 cc-by-30 ];
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -48,6 +48,6 @@ buildPythonPackage {
|
||||
description = "NixOps Digitalocean plugin";
|
||||
homepage = "https://github.com/nix-community/nixops-digitalocean";
|
||||
license = licenses.lgpl3Only;
|
||||
maintainers = with maintainers; [ kiwi ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -60,7 +60,6 @@ let
|
||||
license = licenses.gpl3Plus;
|
||||
maintainers = with maintainers; [
|
||||
arianvp
|
||||
kiwi
|
||||
toonn
|
||||
];
|
||||
platforms = platforms.darwin ++ [
|
||||
|
@ -77,7 +77,7 @@ in
|
||||
description = "ZNC clientaway module";
|
||||
homepage = "https://github.com/kylef/znc-contrib";
|
||||
license = licenses.gpl2;
|
||||
maintainers = with maintainers; [ kiwi ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
};
|
||||
|
||||
@ -117,7 +117,7 @@ in
|
||||
description = "ZNC ignore module";
|
||||
homepage = "https://github.com/kylef/znc-contrib";
|
||||
license = licenses.gpl2;
|
||||
maintainers = with maintainers; [ kiwi ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
};
|
||||
|
||||
@ -137,7 +137,7 @@ in
|
||||
description = "Palaver ZNC module";
|
||||
homepage = "https://github.com/cocodelabs/znc-palaver";
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ kiwi szlend ];
|
||||
maintainers = with maintainers; [ szlend ];
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -70,7 +70,6 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
|
||||
meta = with lib; {
|
||||
maintainers = with maintainers; [
|
||||
kiwi
|
||||
arthsmn
|
||||
];
|
||||
description = "Desktop Publishing (DTP) and Layout program";
|
||||
|
@ -82,6 +82,6 @@ mkDerivation rec {
|
||||
mainProgram = "plasmaphonedialer";
|
||||
homepage = "https://invent.kde.org/plasma-mobile/plasma-dialer";
|
||||
license = licenses.gpl3Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -37,6 +37,6 @@ mkDerivation rec {
|
||||
homepage = "https://invent.kde.org/plasma-mobile/plasma-phonebook";
|
||||
# https://invent.kde.org/plasma-mobile/plasma-phonebook/-/commit/3ac27760417e51c051c5dd44155c3f42dd000e4f
|
||||
license = licenses.gpl3Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -53,6 +53,6 @@ mkDerivation rec {
|
||||
homepage = "https://invent.kde.org/plasma-mobile/plasma-settings";
|
||||
# https://invent.kde.org/plasma-mobile/plasma-settings/-/commit/a59007f383308503e59498b3036e1483bca26e35
|
||||
license = licenses.gpl2Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -52,6 +52,6 @@ mkDerivation {
|
||||
mainProgram = "spacebar";
|
||||
homepage = "https://invent.kde.org/plasma-mobile/spacebar";
|
||||
license = licenses.gpl2Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -7,13 +7,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "eigenmath";
|
||||
version = "3.26-unstable-2024-06-09";
|
||||
version = "3.27-unstable-2024-06-20";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "georgeweigt";
|
||||
repo = pname;
|
||||
rev = "285fc0133f0e7bb5e1e220b75246ce542ae50269";
|
||||
hash = "sha256-ddED3PaHSSupe/QqMYj88GCmh9IrRvpAd4/WEpRTN00=";
|
||||
rev = "c3e3da104dbef888c3e52659134d5e9bdc12764d";
|
||||
hash = "sha256-fqCphnRQw79v7ZTCZU9ucm/R7BKY7yCZYDSnxD7uRS8=";
|
||||
};
|
||||
|
||||
checkPhase = let emulator = stdenv.hostPlatform.emulator buildPackages; in ''
|
||||
|
@ -54,9 +54,7 @@ mkDerivation rec {
|
||||
description = "All in one MLV processing app that is pretty great";
|
||||
homepage = "https://mlv.app";
|
||||
license = licenses.gpl3;
|
||||
maintainers = with maintainers; [
|
||||
kiwi
|
||||
];
|
||||
maintainers = with maintainers; [ ];
|
||||
platforms = platforms.linux;
|
||||
mainProgram = "mlvapp";
|
||||
};
|
||||
|
@ -10,15 +10,15 @@
|
||||
, stdenvNoCC
|
||||
, runtimeShell
|
||||
, bintools ? null, libc ? null, coreutils ? null, gnugrep ? null
|
||||
, netbsd ? null
|
||||
, netbsd ? null, netbsdCross ? null
|
||||
, sharedLibraryLoader ?
|
||||
if libc == null then
|
||||
null
|
||||
else if stdenvNoCC.targetPlatform.isNetBSD then
|
||||
if !(targetPackages ? netbsd) then
|
||||
if !(targetPackages ? netbsdCross) then
|
||||
netbsd.ld_elf_so
|
||||
else if libc != targetPackages.netbsd.headers then
|
||||
targetPackages.netbsd.ld_elf_so
|
||||
else if libc != targetPackages.netbsdCross.headers then
|
||||
targetPackages.netbsdCross.ld_elf_so
|
||||
else
|
||||
null
|
||||
else
|
||||
|
@ -7,8 +7,7 @@ let Dune =
|
||||
{ "1" = dune_1; "2" = dune_2; "3" = dune_3; }."${dune-version}"
|
||||
; in
|
||||
|
||||
if (args ? minimumOCamlVersion && lib.versionOlder ocaml.version args.minimumOCamlVersion) ||
|
||||
(args ? minimalOCamlVersion && lib.versionOlder ocaml.version args.minimalOCamlVersion)
|
||||
if args ? minimalOCamlVersion && lib.versionOlder ocaml.version args.minimalOCamlVersion
|
||||
then throw "${pname}-${version} is not available for OCaml ${ocaml.version}"
|
||||
else
|
||||
|
||||
|
@ -198,13 +198,16 @@ in ''
|
||||
)
|
||||
|
||||
set +e
|
||||
EXTRA_BUILD=$(sed -n "s/^cargo:rustc-flags=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u)
|
||||
EXTRA_FEATURES=$(sed -n "s/^cargo:rustc-cfg=\(.*\)/--cfg \1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_ARGS=$(sed -n "s/^cargo:rustc-link-arg=\(.*\)/-C link-arg=\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_ARGS_BINS=$(sed -n "s/^cargo:rustc-link-arg-bins=\(.*\)/-C link-arg=\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_ARGS_LIB=$(sed -n "s/^cargo:rustc-link-arg-lib=\(.*\)/-C link-arg=\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_LIBS=$(sed -n "s/^cargo:rustc-link-lib=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_SEARCH=$(sed -n "s/^cargo:rustc-link-search=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u)
|
||||
# We want to support the new prefix invocation syntax which uses two colons
|
||||
# See https://doc.rust-lang.org/cargo/reference/build-scripts.html#outputs-of-the-build-script
|
||||
|
||||
EXTRA_BUILD=$(sed -n "s/^cargo::\{0,1\}rustc-flags=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u)
|
||||
EXTRA_FEATURES=$(sed -n "s/^cargo::\{0,1\}rustc-cfg=\(.*\)/--cfg \1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_ARGS=$(sed -n "s/^cargo::\{0,1\}rustc-link-arg=\(.*\)/-C link-arg=\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_ARGS_BINS=$(sed -n "s/^cargo::\{0,1\}rustc-link-arg-bins=\(.*\)/-C link-arg=\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_ARGS_LIB=$(sed -n "s/^cargo::\{0,1\}rustc-link-arg-lib=\(.*\)/-C link-arg=\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_LIBS=$(sed -n "s/^cargo::\{0,1\}rustc-link-lib=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||
EXTRA_LINK_SEARCH=$(sed -n "s/^cargo::\{0,1\}rustc-link-search=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u)
|
||||
|
||||
# We want to read part of every line that has cargo:rustc-env= prefix and
|
||||
# export it as environment variables. This turns out tricky if the lines
|
||||
@ -217,14 +220,15 @@ in ''
|
||||
#
|
||||
_OLDIFS="$IFS"
|
||||
IFS=$'\n'
|
||||
for env in $(sed -n "s/^cargo:rustc-env=\(.*\)/\1/p" target/build/${crateName}.opt); do
|
||||
for env in $(sed -n "s/^cargo::\{0,1\}rustc-env=\(.*\)/\1/p" target/build/${crateName}.opt); do
|
||||
export "$env"
|
||||
done
|
||||
IFS="$_OLDIFS"
|
||||
|
||||
CRATENAME=$(echo ${crateName} | sed -e "s/\(.*\)-sys$/\U\1/" -e "s/-/_/g")
|
||||
grep -P "^cargo:(?!(rustc-|warning=|rerun-if-changed=|rerun-if-env-changed))" target/build/${crateName}.opt \
|
||||
| awk -F= "/^cargo:/ { sub(/^cargo:/, \"\", \$1); gsub(/-/, \"_\", \$1); print \"export \" toupper(\"DEP_$(echo $CRATENAME)_\" \$1) \"=\" \"\\\"\"\$2\"\\\"\" }" > target/env
|
||||
grep -P "^cargo:(?!:?(rustc-|warning=|rerun-if-changed=|rerun-if-env-changed))" target/build/${crateName}.opt \
|
||||
| awk -F= "/^cargo::metadata=/ { gsub(/-/, \"_\", \$2); print \"export \" toupper(\"DEP_$(echo $CRATENAME)_\" \$2) \"=\" \"\\\"\"\$3\"\\\"\"; next }
|
||||
/^cargo:/ { sub(/^cargo::?/, \"\", \$1); gsub(/-/, \"_\", \$1); print \"export \" toupper(\"DEP_$(echo $CRATENAME)_\" \$1) \"=\" \"\\\"\"\$2\"\\\"\"; next }" > target/env
|
||||
set -e
|
||||
fi
|
||||
runHook postConfigure
|
||||
|
@ -421,6 +421,53 @@ let
|
||||
buildDependencies = [ depCrate ];
|
||||
dependencies = [ depCrate ];
|
||||
};
|
||||
# Support new invocation prefix for build scripts `cargo::`
|
||||
# https://doc.rust-lang.org/cargo/reference/build-scripts.html#outputs-of-the-build-script
|
||||
buildScriptInvocationPrefix = let
|
||||
depCrate = buildRustCrate: mkCrate buildRustCrate {
|
||||
crateName = "bar";
|
||||
src = mkFile "build.rs" ''
|
||||
fn main() {
|
||||
// Old invocation prefix
|
||||
// We likely won't see be mixing these syntaxes in the same build script in the wild.
|
||||
println!("cargo:key_old=value_old");
|
||||
|
||||
// New invocation prefix
|
||||
println!("cargo::metadata=key=value");
|
||||
println!("cargo::metadata=key_complex=complex(value)");
|
||||
}
|
||||
'';
|
||||
};
|
||||
in {
|
||||
crateName = "foo";
|
||||
src = symlinkJoin {
|
||||
name = "build-script-and-main-invocation-prefix";
|
||||
paths = [
|
||||
(mkFile "src/main.rs" ''
|
||||
const BUILDFOO: &'static str = env!("BUILDFOO");
|
||||
|
||||
#[test]
|
||||
fn build_foo_check() { assert!(BUILDFOO == "yes(check)"); }
|
||||
|
||||
fn main() { }
|
||||
'')
|
||||
(mkFile "build.rs" ''
|
||||
use std::env;
|
||||
fn main() {
|
||||
assert!(env::var_os("DEP_BAR_KEY_OLD").expect("metadata key 'key_old' not set in dependency") == "value_old");
|
||||
assert!(env::var_os("DEP_BAR_KEY").expect("metadata key 'key' not set in dependency") == "value");
|
||||
assert!(env::var_os("DEP_BAR_KEY_COMPLEX").expect("metadata key 'key_complex' not set in dependency") == "complex(value)");
|
||||
|
||||
println!("cargo::rustc-env=BUILDFOO=yes(check)");
|
||||
}
|
||||
'')
|
||||
];
|
||||
};
|
||||
buildDependencies = [ (depCrate buildPackages.buildRustCrate) ];
|
||||
dependencies = [ (depCrate buildRustCrate) ];
|
||||
buildTests = true;
|
||||
expectedTestOutputs = [ "test build_foo_check ... ok" ];
|
||||
};
|
||||
# Regression test for https://github.com/NixOS/nixpkgs/issues/74071
|
||||
# Whenevever a build.rs file is generating files those should not be overlayed onto the actual source dir
|
||||
buildRsOutDirOverlay = {
|
||||
|
@ -192,7 +192,7 @@ in buildNpmPackage rec {
|
||||
inherit description;
|
||||
homepage = "https://bitwarden.com";
|
||||
license = lib.licenses.gpl3;
|
||||
maintainers = with lib.maintainers; [ amarshall kiwi ];
|
||||
maintainers = with lib.maintainers; [ amarshall ];
|
||||
platforms = [ "x86_64-linux" ];
|
||||
mainProgram = "bitwarden";
|
||||
};
|
||||
|
@ -68,7 +68,7 @@ rustPlatform.buildRustPackage {
|
||||
description = "Enter your availability to find a time that works for everyone";
|
||||
homepage = "https://github.com/GRA0007/crab.fit";
|
||||
license = lib.licenses.gpl3;
|
||||
maintainers = with lib.maintainers; [ thubrecht ];
|
||||
maintainers = with lib.maintainers; [ ];
|
||||
mainProgram = "crabfit-api";
|
||||
};
|
||||
}
|
||||
|
@ -113,6 +113,6 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
description = "Enter your availability to find a time that works for everyone";
|
||||
homepage = "https://github.com/GRA0007/crab.fit";
|
||||
license = lib.licenses.gpl3;
|
||||
maintainers = with lib.maintainers; [ thubrecht ];
|
||||
maintainers = with lib.maintainers; [ ];
|
||||
};
|
||||
})
|
||||
|
@ -1,33 +1,41 @@
|
||||
{ lib, buildGoPackage, fetchFromGitHub, tetex, makeWrapper }:
|
||||
|
||||
with lib;
|
||||
|
||||
buildGoPackage rec {
|
||||
{ lib
|
||||
, buildGoModule
|
||||
, fetchFromGitHub
|
||||
, tetex
|
||||
, makeWrapper
|
||||
}:
|
||||
buildGoModule rec {
|
||||
pname = "reporter";
|
||||
version = "2.3.1";
|
||||
rev = "v${version}";
|
||||
|
||||
goPackagePath = "github.com/IzakMarais/reporter";
|
||||
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
|
||||
src = fetchFromGitHub {
|
||||
inherit rev;
|
||||
rev = "v${version}";
|
||||
owner = "IzakMarais";
|
||||
repo = "reporter";
|
||||
sha256 = "sha256-lsraJwx56I2Gn8CePWUlQu1qdMp78P4xwPzLxetYUcw=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
|
||||
vendorHash = null;
|
||||
|
||||
postPatch = ''
|
||||
go mod init github.com/IzakMarais/reporter
|
||||
'';
|
||||
|
||||
postInstall = ''
|
||||
wrapProgram $out/bin/grafana-reporter \
|
||||
--prefix PATH : ${makeBinPath [ tetex ]}
|
||||
--prefix PATH : ${lib.makeBinPath [ tetex ]}
|
||||
'';
|
||||
|
||||
# Testing library used had a breaking API change and upstream didn't adapt.
|
||||
doCheck = false;
|
||||
|
||||
meta = {
|
||||
description = "PDF report generator from a Grafana dashboard";
|
||||
mainProgram = "grafana-reporter";
|
||||
homepage = "https://github.com/IzakMarais/reporter";
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ disassembler ];
|
||||
license = lib.licenses.mit;
|
||||
maintainers = [ lib.maintainers.disassembler ];
|
||||
};
|
||||
}
|
@ -21,8 +21,10 @@ rustPlatform.buildRustPackage rec {
|
||||
hash = "sha256-HqnxemAPjjKl/l4dVjEUIIvgW3ibNtQWnA10QYcd8Os=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ protobuf ] ++ lib.optionals stdenv.isDarwin [ xcodebuild ];
|
||||
buildInputs = [ rustPlatform.bindgenHook ];
|
||||
nativeBuildInputs = [
|
||||
protobuf
|
||||
rustPlatform.bindgenHook
|
||||
] ++ lib.optionals stdenv.isDarwin [ xcodebuild ];
|
||||
|
||||
env.BORING_BSSL_PATH = "${boringssl-wrapper}";
|
||||
|
||||
|
@ -30,6 +30,6 @@ buildNpmPackage rec {
|
||||
description = "NetBird Management Service Web UI Panel";
|
||||
homepage = "https://github.com/netbirdio/dashboard";
|
||||
license = licenses.bsd3;
|
||||
maintainers = with maintainers; [ thubrecht ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -1,7 +1,9 @@
|
||||
{
|
||||
lib,
|
||||
stdenv,
|
||||
buildGoModule,
|
||||
fetchFromGitHub,
|
||||
installShellFiles,
|
||||
}:
|
||||
|
||||
buildGoModule rec {
|
||||
@ -22,6 +24,15 @@ buildGoModule rec {
|
||||
"-w"
|
||||
];
|
||||
|
||||
nativeBuildInputs = [ installShellFiles ];
|
||||
|
||||
postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
|
||||
installShellCompletion --cmd ${meta.mainProgram} \
|
||||
--bash <($out/bin/${meta.mainProgram} completion bash) \
|
||||
--fish <($out/bin/${meta.mainProgram} completion fish) \
|
||||
--zsh <($out/bin/${meta.mainProgram} completion zsh)
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Security scanner that detects misconfigurations and vulnerabilities in build pipelines of repositories";
|
||||
homepage = "https://github.com/boostsecurityio/poutine";
|
||||
|
@ -15,14 +15,14 @@
|
||||
}:
|
||||
|
||||
let
|
||||
version = "46.2";
|
||||
version = "46.3";
|
||||
|
||||
src = fetchFromGitLab {
|
||||
domain = "gitlab.gnome.org";
|
||||
owner = "chergert";
|
||||
repo = "ptyxis";
|
||||
rev = version;
|
||||
hash = "sha256-/n/S2ws6qsVwTXX96MPa+/ISozDDu8A1wkD1g3dmAtQ=";
|
||||
hash = "sha256-DKZgnistOv6eFWtqYPtMc1tQJWovCWIqrqGgs9uWu5k=";
|
||||
};
|
||||
|
||||
vte-gtk4-patched = vte-gtk4.overrideAttrs (prev: {
|
||||
|
@ -13,16 +13,16 @@
|
||||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "typstyle";
|
||||
version = "0.11.26";
|
||||
version = "0.11.27";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "Enter-tainer";
|
||||
repo = "typstyle";
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-zuMsYSiGHJkvI1y+vH77FHzCZFPkYqVoeve2kXwKVDI=";
|
||||
hash = "sha256-7c2WbAEDdCmh92MXBks0AjYEEKfVFVIgU+U2x5K2jLQ=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-PVve8zJvMQuMw4k2fEnjA2viv+f3dNgQ6xmPjbx7EgY=";
|
||||
cargoHash = "sha256-EkMa5mudKaiGtMN2jhQ0PWZlpkpnYZUPXLAJng9+Kes=";
|
||||
|
||||
nativeBuildInputs = [
|
||||
pkg-config
|
||||
|
@ -1,5 +1,5 @@
|
||||
{ lib
|
||||
, stdenvNoLibc
|
||||
, stdenv
|
||||
, buildPackages
|
||||
, fetchurl
|
||||
, gitUpdater
|
||||
@ -9,7 +9,6 @@
|
||||
}:
|
||||
|
||||
let
|
||||
stdenv = stdenvNoLibc;
|
||||
isCross = (stdenv.buildPlatform != stdenv.hostPlatform);
|
||||
configParser = ''
|
||||
function parseconfig {
|
||||
|
@ -1,32 +1,44 @@
|
||||
{ fetchFromGitHub
|
||||
{ lib
|
||||
, fetchFromGitHub
|
||||
, rustPlatform
|
||||
, lib
|
||||
, testers
|
||||
, wstunnel
|
||||
, nixosTests
|
||||
}:
|
||||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
let
|
||||
version = "9.7.0";
|
||||
in
|
||||
|
||||
rustPlatform.buildRustPackage {
|
||||
pname = "wstunnel";
|
||||
version = "9.6.2";
|
||||
inherit version;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "erebe";
|
||||
repo = "wstunnel";
|
||||
repo = "wstunnel";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-0r+8C8Gf3/s3opzplzc22d9VVp39FtBq1bYkxlmtqjg=";
|
||||
hash = "sha256-8bLccR6ZmldmrvjlZKFHEa4PoLzyUcLkyQbwSrJjoyY=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-hHVxa7Ihmuuf26ZSzGmrHA2RczhzXtse3h1M4cNCvhw=";
|
||||
cargoHash = "sha256-IAq7Fyr6Ne1Bq18WfqBoppel9FOWSs8PkiXKMwcJ26c=";
|
||||
|
||||
checkFlags = [
|
||||
# make use of network connection
|
||||
# Tries to launch a test container
|
||||
"--skip=tcp::tests::test_proxy_connection"
|
||||
];
|
||||
|
||||
passthru.tests = {
|
||||
version = testers.testVersion { package = wstunnel; };
|
||||
nixosTest = nixosTests.wstunnel;
|
||||
};
|
||||
|
||||
meta = {
|
||||
description = "Tunneling program over websocket protocol";
|
||||
description = "Tunnel all your traffic over Websocket or HTTP2 - Bypass firewalls/DPI";
|
||||
homepage = "https://github.com/erebe/wstunnel";
|
||||
changelog = "https://github.com/erebe/wstunnel/releases/tag/v${version}";
|
||||
license = lib.licenses.bsd3;
|
||||
maintainers = with lib.maintainers; [ rvdp neverbehave ];
|
||||
mainProgram = "wstunnel";
|
||||
homepage = "https://github.com/erebe/wstunnel";
|
||||
license = with lib.licenses; [ bsd3 ];
|
||||
maintainers = with lib.maintainers; [ neverbehave ];
|
||||
platforms = lib.platforms.linux;
|
||||
};
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
|
||||
homepage = "http://dotcolon.net/font/vegur/";
|
||||
description = "Humanist sans serif font";
|
||||
platforms = platforms.all;
|
||||
maintainers = with maintainers; [ minijackson samueldr ];
|
||||
maintainers = with maintainers; [ minijackson ];
|
||||
license = licenses.cc0;
|
||||
};
|
||||
})
|
||||
|
@ -27,13 +27,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "xreader";
|
||||
version = "4.2.0";
|
||||
version = "4.2.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "linuxmint";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "sha256-MWSAyXQcE8cDdzJISFV7UHheHX+7zF1Ula+LGicvUPM=";
|
||||
sha256 = "sha256-+q0fZA72m5T5ZB6bYWPWdQGxLpwjNp5Vak2TzaGwGWQ=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
@ -306,15 +306,6 @@ package-maintainers:
|
||||
- elm-export-persistent
|
||||
# - pipes-mongodb
|
||||
- streaming-wai
|
||||
kiwi:
|
||||
- config-schema
|
||||
- config-value
|
||||
- glirc
|
||||
- irc-core
|
||||
- matterhorn
|
||||
- mattermost-api
|
||||
- mattermost-api-qc
|
||||
- Unique
|
||||
libjared:
|
||||
- sensei
|
||||
malo:
|
||||
|
@ -21834,7 +21834,6 @@ self: {
|
||||
];
|
||||
description = "It provides the functionality like unix \"uniq\" utility";
|
||||
license = lib.licenses.bsd3;
|
||||
maintainers = [ lib.maintainers.kiwi ];
|
||||
}) {};
|
||||
|
||||
"Unixutils" = callPackage
|
||||
@ -73682,7 +73681,6 @@ self: {
|
||||
testHaskellDepends = [ base config-value text ];
|
||||
description = "Schema definitions for the config-value package";
|
||||
license = lib.licenses.isc;
|
||||
maintainers = [ lib.maintainers.kiwi ];
|
||||
}) {};
|
||||
|
||||
"config-select" = callPackage
|
||||
@ -73716,7 +73714,6 @@ self: {
|
||||
testHaskellDepends = [ base text ];
|
||||
description = "Simple, layout-based value language similar to YAML or JSON";
|
||||
license = lib.licenses.mit;
|
||||
maintainers = [ lib.maintainers.kiwi ];
|
||||
}) {};
|
||||
|
||||
"config-value-getopt" = callPackage
|
||||
@ -125275,7 +125272,6 @@ self: {
|
||||
license = lib.licenses.isc;
|
||||
hydraPlatforms = lib.platforms.none;
|
||||
mainProgram = "glirc";
|
||||
maintainers = [ lib.maintainers.kiwi ];
|
||||
}) {};
|
||||
|
||||
"gll" = callPackage
|
||||
@ -175544,7 +175540,6 @@ self: {
|
||||
description = "IRC core library for glirc";
|
||||
license = lib.licenses.isc;
|
||||
hydraPlatforms = lib.platforms.none;
|
||||
maintainers = [ lib.maintainers.kiwi ];
|
||||
broken = true;
|
||||
}) {};
|
||||
|
||||
@ -201019,7 +201014,6 @@ self: {
|
||||
description = "Terminal client for the Mattermost chat system";
|
||||
license = lib.licenses.bsd3;
|
||||
mainProgram = "matterhorn";
|
||||
maintainers = [ lib.maintainers.kiwi ];
|
||||
}) {};
|
||||
|
||||
"mattermost-api" = callPackage
|
||||
@ -201048,7 +201042,6 @@ self: {
|
||||
];
|
||||
description = "Client API for Mattermost chat system";
|
||||
license = lib.licenses.bsd3;
|
||||
maintainers = [ lib.maintainers.kiwi ];
|
||||
}) {};
|
||||
|
||||
"mattermost-api-qc" = callPackage
|
||||
@ -201064,7 +201057,6 @@ self: {
|
||||
];
|
||||
description = "QuickCheck instances for the Mattermost client API library";
|
||||
license = lib.licenses.isc;
|
||||
maintainers = [ lib.maintainers.kiwi ];
|
||||
}) {};
|
||||
|
||||
"maude" = callPackage
|
||||
|
@ -38,7 +38,7 @@ mkDerivation rec {
|
||||
homepage = "https://invent.kde.org/libraries/kirigami-addons";
|
||||
# https://invent.kde.org/libraries/kirigami-addons/-/blob/b197d98fdd079b6fc651949bd198363872d1be23/src/treeview/treeviewplugin.cpp#L1-5
|
||||
license = licenses.lgpl2Plus;
|
||||
maintainers = with maintainers; [ samueldr matthiasbeyer ];
|
||||
maintainers = with maintainers; [ matthiasbeyer ];
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@ mkDerivation rec {
|
||||
|
||||
meta = with lib; {
|
||||
license = [ licenses.cc0 ];
|
||||
maintainers = [ maintainers.samueldr ];
|
||||
maintainers = [ ];
|
||||
description = ''
|
||||
Library to facilitate retrieval of weather information including forecasts and alerts
|
||||
'';
|
||||
|
@ -14,6 +14,7 @@
|
||||
, gtk4
|
||||
, gnome
|
||||
, gsettings-desktop-schemas
|
||||
, desktop-file-utils
|
||||
, xvfb-run
|
||||
, AppKit
|
||||
, Foundation
|
||||
@ -47,6 +48,7 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
sassc
|
||||
vala
|
||||
gobject-introspection
|
||||
desktop-file-utils # for validate-desktop-file
|
||||
];
|
||||
|
||||
mesonFlags = [
|
||||
@ -104,6 +106,11 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
postFixup = ''
|
||||
# Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back.
|
||||
moveToOutput "share/doc" "$devdoc"
|
||||
|
||||
# Put all resources related to demo app into devdoc output.
|
||||
for d in applications icons metainfo; do
|
||||
moveToOutput "share/$d" "$devdoc"
|
||||
done
|
||||
'';
|
||||
|
||||
passthru = {
|
||||
|
@ -11,14 +11,14 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "libdisplay-info";
|
||||
version = "0.1.1";
|
||||
version = "0.2.0";
|
||||
|
||||
src = fetchFromGitLab {
|
||||
domain = "gitlab.freedesktop.org";
|
||||
owner = "emersion";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "sha256-7t1CoLus3rPba9paapM7+H3qpdsw7FlzJsSHFwM/2Lk=";
|
||||
sha256 = "sha256-6xmWBrPHghjok43eIDGeshpUEQTuwWLXNHg7CnBUt3Q=";
|
||||
};
|
||||
|
||||
depsBuildBuild = [ pkg-config ];
|
||||
|
@ -52,7 +52,7 @@ mkDerivation rec {
|
||||
description = "Library for accessing the ofono daemon, and declarative plugin for it";
|
||||
homepage = "https://git.sailfishos.org/mer-core/libqofono/";
|
||||
license = licenses.lgpl21Plus;
|
||||
maintainers = with maintainers; [ samueldr ];
|
||||
maintainers = with maintainers; [ ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
||||
|
@ -2597,14 +2597,14 @@ buildLuarocksPackage {
|
||||
nlua = callPackage({ buildLuarocksPackage, fetchurl, fetchzip, luaOlder }:
|
||||
buildLuarocksPackage {
|
||||
pname = "nlua";
|
||||
version = "0.1.0-1";
|
||||
version = "0.2.0-1";
|
||||
knownRockspec = (fetchurl {
|
||||
url = "mirror://luarocks/nlua-0.1.0-1.rockspec";
|
||||
sha256 = "14ynhy85m2prawym1ap1kplkbicafbczpggzgdnji00frwqa1zvv";
|
||||
url = "mirror://luarocks/nlua-0.2.0-1.rockspec";
|
||||
sha256 = "15d8gmlf0kr31p1nlj9skliq8yfk3k24w0df6jxlxqnmb8nkxk04";
|
||||
}).outPath;
|
||||
src = fetchzip {
|
||||
url = "https://github.com/mfussenegger/nlua/archive/v0.1.0.zip";
|
||||
sha256 = "1x3pbv5ngbk0sjgwfpjsv3x49wzq4x29d9rm0hgyyb2g2mwag3jc";
|
||||
url = "https://github.com/mfussenegger/nlua/archive/v0.2.0.zip";
|
||||
sha256 = "09fxryslz9qwyzsvy0sc67irjikcg8cngl5d6g56prqixr3bsxpy";
|
||||
};
|
||||
|
||||
disabled = luaOlder "5.1";
|
||||
|
@ -1,6 +1,6 @@
|
||||
{ stdenv, texinfo, flex, bison, fetchFromGitHub, stdenvNoLibc, buildPackages }:
|
||||
{ stdenv, texinfo, flex, bison, fetchFromGitHub, crossLibcStdenv, buildPackages }:
|
||||
|
||||
stdenvNoLibc.mkDerivation {
|
||||
crossLibcStdenv.mkDerivation {
|
||||
name = "newlib";
|
||||
src = fetchFromGitHub {
|
||||
owner = "openrisc";
|
||||
|
@ -1,6 +1,6 @@
|
||||
{ stdenv, texinfo, flex, bison, fetchFromGitHub, stdenvNoLibc, buildPackages }:
|
||||
{ stdenv, texinfo, flex, bison, fetchFromGitHub, crossLibcStdenv, buildPackages }:
|
||||
|
||||
stdenvNoLibc.mkDerivation {
|
||||
crossLibcStdenv.mkDerivation {
|
||||
name = "newlib";
|
||||
src = fetchFromGitHub {
|
||||
owner = "itszor";
|
||||
|
@ -6,7 +6,7 @@ buildDunePackage rec {
|
||||
|
||||
useDune2 = true;
|
||||
|
||||
minimumOCamlVersion = "4.03";
|
||||
minimalOCamlVersion = "4.03";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/pqwy/cpuid/releases/download/v${version}/cpuid-v${version}.tbz";
|
||||
|
@ -5,7 +5,7 @@ buildDunePackage rec {
|
||||
version = "0.5";
|
||||
useDune2 = true;
|
||||
|
||||
minimumOCamlVersion = "4.07";
|
||||
minimalOCamlVersion = "4.07";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "ocamlpro";
|
||||
|
@ -12,7 +12,7 @@ buildDunePackage rec {
|
||||
sha256 = "1vi58zdxchpw6ai0bz9h2ggcmg8kv57yk6qbx82lh47s5wb3mz5y";
|
||||
};
|
||||
|
||||
minimumOCamlVersion = "4.07";
|
||||
minimalOCamlVersion = "4.07";
|
||||
useDune2 = true;
|
||||
|
||||
buildInputs = [ stdlib-shims ];
|
||||
|
@ -13,7 +13,7 @@ buildDunePackage rec {
|
||||
sha256 = "1zaw03as14hyvfpyj6bjrfbcxp2ljdbqcqqgm53kms244mig425f";
|
||||
};
|
||||
|
||||
minimumOCamlVersion = "4.02";
|
||||
minimalOCamlVersion = "4.02";
|
||||
|
||||
env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${lib.getDev libcxx}/include/c++/v1";
|
||||
|
||||
|
@ -12,7 +12,7 @@ buildDunePackage rec {
|
||||
sha256 = "sha256-Xuw4pEPqAbQjSHrpMCNE7Th0mpbNMSxdEdwvH4hu2SM=";
|
||||
};
|
||||
|
||||
minimumOCamlVersion = "4.03";
|
||||
minimalOCamlVersion = "4.03";
|
||||
useDune2 = true;
|
||||
|
||||
meta = with lib; {
|
||||
|
@ -6,7 +6,7 @@ buildDunePackage rec {
|
||||
|
||||
useDune2 = true;
|
||||
|
||||
minimumOCamlVersion = "4.03";
|
||||
minimalOCamlVersion = "4.03";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "c-cube";
|
||||
|
@ -10,7 +10,7 @@ buildDunePackage rec {
|
||||
|
||||
useDune2 = true;
|
||||
|
||||
minimumOCamlVersion = "4.08";
|
||||
minimalOCamlVersion = "4.08";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/mmottl/lacaml/releases/download/${version}/lacaml-${version}.tbz";
|
||||
|
@ -6,7 +6,7 @@ buildDunePackage rec {
|
||||
|
||||
useDune2 = true;
|
||||
|
||||
minimumOCamlVersion = "4.02";
|
||||
minimalOCamlVersion = "4.02";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/mirage/${pname}/releases/download/v${version}/${pname}-v${version}.tbz";
|
||||
|
@ -7,7 +7,7 @@ buildDunePackage rec {
|
||||
|
||||
inherit (opam-core) src version;
|
||||
|
||||
minimumOCamlVersion = "4.02.3";
|
||||
minimalOCamlVersion = "4.02.3";
|
||||
|
||||
# get rid of check for curl at configure time
|
||||
# opam-format does not call curl at run time
|
||||
|
@ -3,7 +3,7 @@
|
||||
buildDunePackage rec {
|
||||
pname = "opam-repository";
|
||||
|
||||
minimumOCamlVersion = "4.02";
|
||||
minimalOCamlVersion = "4.02";
|
||||
|
||||
useDune2 = true;
|
||||
|
||||
|
@ -6,7 +6,7 @@ buildDunePackage rec {
|
||||
|
||||
useDune2 = true;
|
||||
|
||||
minimumOCamlVersion = "4.02";
|
||||
minimalOCamlVersion = "4.02";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/magnusjonsson/opti/releases/download/${version}/opti-${version}.tbz";
|
||||
|
@ -6,7 +6,7 @@ buildDunePackage rec {
|
||||
|
||||
useDune2 = true;
|
||||
|
||||
minimumOCamlVersion = "4.08";
|
||||
minimalOCamlVersion = "4.08";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "mmottl";
|
||||
|
@ -10,7 +10,7 @@ buildDunePackage rec {
|
||||
pname = "ppx_yojson_conv";
|
||||
version = "0.15.1";
|
||||
duneVersion = "3";
|
||||
minimumOCamlVersion = "4.08.0";
|
||||
minimalOCamlVersion = "4.08.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "janestreet";
|
||||
|
@ -6,7 +6,7 @@ buildDunePackage rec {
|
||||
|
||||
useDune2 = true;
|
||||
|
||||
minimumOCamlVersion = "4.02";
|
||||
minimalOCamlVersion = "4.02";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/flowtype/ocaml-${pname}/releases/download/v${version}/${pname}-v${version}.tbz";
|
||||
|
@ -25,6 +25,6 @@ buildPythonPackage rec {
|
||||
description = "Type stubs for Django";
|
||||
homepage = "https://github.com/sbdchd/django-types";
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ thubrecht ];
|
||||
maintainers = with maintainers; [ ];
|
||||
};
|
||||
}
|
||||
|
@ -33,7 +33,7 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "dvclive";
|
||||
version = "3.46.0";
|
||||
version = "3.46.1";
|
||||
pyproject = true;
|
||||
|
||||
disabled = pythonOlder "3.9";
|
||||
@ -42,7 +42,7 @@ buildPythonPackage rec {
|
||||
owner = "iterative";
|
||||
repo = "dvclive";
|
||||
rev = "refs/tags/${version}";
|
||||
hash = "sha256-yIViKlkCdoG2vSZdScL38fZd9musLRKzBd9wSR6lJdk=";
|
||||
hash = "sha256-ifr8gsGSOIBPC07JcFcV97yV4Io5J2uiMf2ucmySiWc=";
|
||||
};
|
||||
|
||||
build-system = [ setuptools-scm ];
|
||||
|
@ -32,6 +32,6 @@ buildPythonPackage rec {
|
||||
Tools for manipulating and evaluating the hOCR format for representing multi-lingual OCR results by embedding them into HTML";
|
||||
homepage = "https://github.com/tmbdev/hocr-tools";
|
||||
license = licenses.asl20;
|
||||
maintainers = [ maintainers.kiwi ];
|
||||
maintainers = [ ];
|
||||
};
|
||||
}
|
||||
|
@ -1,34 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
buildPythonPackage,
|
||||
fetchFromGitHub,
|
||||
setuptools,
|
||||
wheel,
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "loadcredential";
|
||||
version = "1.1";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "Tom-Hubrecht";
|
||||
repo = "loadcredential";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-GXpMqGLDmDnTGa9cBYe0CP3Evm5sQ3AK9u6k3mLAW34=";
|
||||
};
|
||||
|
||||
build-system = [
|
||||
setuptools
|
||||
wheel
|
||||
];
|
||||
|
||||
pythonImportsCheck = [ "loadcredential" ];
|
||||
|
||||
meta = {
|
||||
description = "Simple python package to read credentials passed through systemd's LoadCredential, with a fallback on env variables ";
|
||||
homepage = "https://github.com/Tom-Hubrecht/loadcredential";
|
||||
license = lib.licenses.mit;
|
||||
maintainers = with lib.maintainers; [ thubrecht ];
|
||||
};
|
||||
}
|
@ -11,7 +11,7 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "losant-rest";
|
||||
version = "1.19.7";
|
||||
version = "1.19.8";
|
||||
pyproject = true;
|
||||
|
||||
disabled = pythonOlder "3.7";
|
||||
@ -20,7 +20,7 @@ buildPythonPackage rec {
|
||||
owner = "Losant";
|
||||
repo = "losant-rest-python";
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-gn8YTnCAmAcmQxpgtitk2eRy3spveuU0peeHu/iSnCE=";
|
||||
hash = "sha256-CErC2Pwdw8CzV423uToysGaz92cBNyO3tLLuLozc0MU=";
|
||||
};
|
||||
|
||||
build-system = [ setuptools ];
|
||||
|
@ -100,7 +100,6 @@ buildPythonPackage rec {
|
||||
mit
|
||||
];
|
||||
maintainers = with maintainers; [
|
||||
kiwi
|
||||
dotlambda
|
||||
];
|
||||
changelog = "https://github.com/ocrmypdf/OCRmyPDF/blob/${src.rev}/docs/release_notes.rst";
|
||||
|
@ -87,10 +87,7 @@ buildPythonPackage rec {
|
||||
homepage = "https://github.com/pikepdf/pikepdf";
|
||||
description = "Read and write PDFs with Python, powered by qpdf";
|
||||
license = licenses.mpl20;
|
||||
maintainers = with maintainers; [
|
||||
kiwi
|
||||
dotlambda
|
||||
];
|
||||
maintainers = with maintainers; [ dotlambda ];
|
||||
changelog = "https://github.com/pikepdf/pikepdf/blob/${src.rev}/docs/releasenotes/version${lib.versions.major version}.rst";
|
||||
};
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "pynws";
|
||||
version = "1.8.1";
|
||||
version = "1.8.2";
|
||||
pyproject = true;
|
||||
|
||||
disabled = pythonOlder "3.8";
|
||||
@ -26,7 +26,7 @@ buildPythonPackage rec {
|
||||
owner = "MatthewFlamm";
|
||||
repo = "pynws";
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-gC5IOW5sejXigBKfxLst8MwU/IkqSQrMZhmd4eza++s=";
|
||||
hash = "sha256-3QKdZ7hg7HfQ56xHbkhXCtlBq4JCwfXdZiTctI3OVl0=";
|
||||
};
|
||||
|
||||
build-system = [
|
||||
|
@ -12,6 +12,7 @@
|
||||
pythonOlder,
|
||||
requests,
|
||||
requests-pkcs12,
|
||||
requests-toolbelt,
|
||||
responses,
|
||||
restfly,
|
||||
semver,
|
||||
@ -21,7 +22,7 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "pytenable";
|
||||
version = "1.4.22";
|
||||
version = "1.5.0";
|
||||
pyproject = true;
|
||||
|
||||
disabled = pythonOlder "3.7";
|
||||
@ -30,7 +31,7 @@ buildPythonPackage rec {
|
||||
owner = "tenable";
|
||||
repo = "pyTenable";
|
||||
rev = "refs/tags/${version}";
|
||||
hash = "sha256-acMafLlO0yGEnW+0XeBWUpDWvOPFAB4RK/XyAb2JbPw=";
|
||||
hash = "sha256-uLZ1TQx5awHOOF+IR3aWTwwYTd71O/V+EHaDrb1LAXU=";
|
||||
};
|
||||
|
||||
build-system = [ setuptools ];
|
||||
@ -41,6 +42,7 @@ buildPythonPackage rec {
|
||||
python-box
|
||||
python-dateutil
|
||||
requests
|
||||
requests-toolbelt
|
||||
restfly
|
||||
semver
|
||||
typing-extensions
|
||||
|
@ -34,6 +34,6 @@ buildPythonPackage rec {
|
||||
homepage = "https://github.com/saltstack/pytest-helpers-namespace";
|
||||
description = "PyTest Helpers Namespace";
|
||||
license = licenses.asl20;
|
||||
maintainers = [ maintainers.kiwi ];
|
||||
maintainers = [ ];
|
||||
};
|
||||
}
|
||||
|
@ -50,9 +50,6 @@ buildPythonPackage rec {
|
||||
homepage = "https://github.com/koalalorenzo/python-digitalocean";
|
||||
changelog = "https://github.com/koalalorenzo/python-digitalocean/releases/tag/v${version}";
|
||||
license = with licenses; [ lgpl3Only ];
|
||||
maintainers = with maintainers; [
|
||||
kiwi
|
||||
teh
|
||||
];
|
||||
maintainers = with maintainers; [ teh ];
|
||||
};
|
||||
}
|
||||
|
@ -46,6 +46,6 @@ buildPythonPackage {
|
||||
homepage = "https://github.com/python-xmp-toolkit/python-xmp-toolkit";
|
||||
description = "Python XMP Toolkit for working with metadata";
|
||||
license = licenses.bsd3;
|
||||
maintainers = [ maintainers.kiwi ];
|
||||
maintainers = [ ];
|
||||
};
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user