diff --git a/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml
index 3ceaf98ed778..8389a203c028 100644
--- a/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml
+++ b/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml
@@ -1152,6 +1152,14 @@ Superuser created successfully.
coursier, you can create a shell alias.
+
+
+ The services.mosquitto module has been
+ rewritten to support multiple listeners and per-listener
+ configuration. Module configurations from previous releases
+ will no longer work and must be updated.
+
+
diff --git a/nixos/doc/manual/release-notes/rl-2111.section.md b/nixos/doc/manual/release-notes/rl-2111.section.md
index 24972543010b..ca8c9d14e05a 100644
--- a/nixos/doc/manual/release-notes/rl-2111.section.md
+++ b/nixos/doc/manual/release-notes/rl-2111.section.md
@@ -355,6 +355,9 @@ In addition to numerous new and upgraded packages, this release has the followin
- The `coursier` package's binary was renamed from `coursier` to `cs`. Completions which haven't worked for a while should now work with the renamed binary. To keep using `coursier`, you can create a shell alias.
+- The `services.mosquitto` module has been rewritten to support multiple listeners and per-listener configuration.
+ Module configurations from previous releases will no longer work and must be updated.
+
## Other Notable Changes {#sec-release-21.11-notable-changes}
diff --git a/nixos/modules/services/backup/borgbackup.nix b/nixos/modules/services/backup/borgbackup.nix
index 5461dbaf0bd0..220c571b927e 100644
--- a/nixos/modules/services/backup/borgbackup.nix
+++ b/nixos/modules/services/backup/borgbackup.nix
@@ -42,12 +42,16 @@ let
${cfg.postInit}
fi
'' + ''
- borg create $extraArgs \
- --compression ${cfg.compression} \
- --exclude-from ${mkExcludeFile cfg} \
- $extraCreateArgs \
- "::$archiveName$archiveSuffix" \
- ${escapeShellArgs cfg.paths}
+ (
+ set -o pipefail
+ ${optionalString (cfg.dumpCommand != null) ''${escapeShellArg cfg.dumpCommand} | \''}
+ borg create $extraArgs \
+ --compression ${cfg.compression} \
+ --exclude-from ${mkExcludeFile cfg} \
+ $extraCreateArgs \
+ "::$archiveName$archiveSuffix" \
+ ${if cfg.paths == null then "-" else escapeShellArgs cfg.paths}
+ )
'' + optionalString cfg.appendFailedSuffix ''
borg rename $extraArgs \
"::$archiveName$archiveSuffix" "$archiveName"
@@ -182,6 +186,14 @@ let
+ " without at least one public key";
};
+ mkSourceAssertions = name: cfg: {
+ assertion = count isNull [ cfg.dumpCommand cfg.paths ] == 1;
+ message = ''
+ Exactly one of borgbackup.jobs.${name}.paths or borgbackup.jobs.${name}.dumpCommand
+ must be set.
+ '';
+ };
+
mkRemovableDeviceAssertions = name: cfg: {
assertion = !(isLocalPath cfg.repo) -> !cfg.removableDevice;
message = ''
@@ -240,11 +252,25 @@ in {
options = {
paths = mkOption {
- type = with types; coercedTo str lib.singleton (listOf str);
- description = "Path(s) to back up.";
+ type = with types; nullOr (coercedTo str lib.singleton (listOf str));
+ default = null;
+ description = ''
+ Path(s) to back up.
+ Mutually exclusive with .
+ '';
example = "/home/user";
};
+ dumpCommand = mkOption {
+ type = with types; nullOr path;
+ default = null;
+ description = ''
+ Backup the stdout of this program instead of filesystem paths.
+ Mutually exclusive with .
+ '';
+ example = "/path/to/createZFSsend.sh";
+ };
+
repo = mkOption {
type = types.str;
description = "Remote or local repository to back up to.";
@@ -657,6 +683,7 @@ in {
assertions =
mapAttrsToList mkPassAssertion jobs
++ mapAttrsToList mkKeysAssertion repos
+ ++ mapAttrsToList mkSourceAssertions jobs
++ mapAttrsToList mkRemovableDeviceAssertions jobs;
system.activationScripts = mapAttrs' mkActivationScript jobs;
diff --git a/nixos/modules/services/networking/mosquitto.nix b/nixos/modules/services/networking/mosquitto.nix
index b0fbfc194083..5a573cbf4ac9 100644
--- a/nixos/modules/services/networking/mosquitto.nix
+++ b/nixos/modules/services/networking/mosquitto.nix
@@ -5,35 +5,529 @@ with lib;
let
cfg = config.services.mosquitto;
- listenerConf = optionalString cfg.ssl.enable ''
- listener ${toString cfg.ssl.port} ${cfg.ssl.host}
- cafile ${cfg.ssl.cafile}
- certfile ${cfg.ssl.certfile}
- keyfile ${cfg.ssl.keyfile}
- '';
+ # note that mosquitto config parsing is very simplistic as of may 2021.
+ # often times they'll e.g. strtok() a line, check the first two tokens, and ignore the rest.
+ # there's no escaping available either, so we have to prevent any being necessary.
+ str = types.strMatching "[^\r\n]*" // {
+ description = "single-line string";
+ };
+ path = types.addCheck types.path (p: str.check "${p}");
+ configKey = types.strMatching "[^\r\n\t ]+";
+ optionType = with types; oneOf [ str path bool int ] // {
+ description = "string, path, bool, or integer";
+ };
+ optionToString = v:
+ if isBool v then boolToString v
+ else if path.check v then "${v}"
+ else toString v;
- passwordConf = optionalString cfg.checkPasswords ''
- password_file ${cfg.dataDir}/passwd
- '';
+ assertKeysValid = prefix: valid: config:
+ mapAttrsToList
+ (n: _: {
+ assertion = valid ? ${n};
+ message = "Invalid config key ${prefix}.${n}.";
+ })
+ config;
- mosquittoConf = pkgs.writeText "mosquitto.conf" ''
- acl_file ${aclFile}
- persistence true
- allow_anonymous ${boolToString cfg.allowAnonymous}
- listener ${toString cfg.port} ${cfg.host}
- ${passwordConf}
- ${listenerConf}
- ${cfg.extraConf}
- '';
+ formatFreeform = { prefix ? "" }: mapAttrsToList (n: v: "${prefix}${n} ${optionToString v}");
- userAcl = (concatStringsSep "\n\n" (mapAttrsToList (n: c:
- "user ${n}\n" + (concatStringsSep "\n" c.acl)) cfg.users
- ));
+ userOptions = with types; submodule {
+ options = {
+ password = mkOption {
+ type = uniq (nullOr str);
+ default = null;
+ description = ''
+ Specifies the (clear text) password for the MQTT User.
+ '';
+ };
- aclFile = pkgs.writeText "mosquitto.acl" ''
- ${cfg.aclExtraConf}
- ${userAcl}
- '';
+ passwordFile = mkOption {
+ type = uniq (nullOr types.path);
+ example = "/path/to/file";
+ default = null;
+ description = ''
+ Specifies the path to a file containing the
+ clear text password for the MQTT user.
+ '';
+ };
+
+ hashedPassword = mkOption {
+ type = uniq (nullOr str);
+ default = null;
+ description = ''
+ Specifies the hashed password for the MQTT User.
+ To generate hashed password install mosquitto
+ package and use mosquitto_passwd.
+ '';
+ };
+
+ hashedPasswordFile = mkOption {
+ type = uniq (nullOr types.path);
+ example = "/path/to/file";
+ default = null;
+ description = ''
+ Specifies the path to a file containing the
+ hashed password for the MQTT user.
+ To generate hashed password install mosquitto
+ package and use mosquitto_passwd.
+ '';
+ };
+
+ acl = mkOption {
+ type = listOf str;
+ example = [ "read A/B" "readwrite A/#" ];
+ default = [];
+ description = ''
+ Control client access to topics on the broker.
+ '';
+ };
+ };
+ };
+
+ userAsserts = prefix: users:
+ mapAttrsToList
+ (n: _: {
+ assertion = builtins.match "[^:\r\n]+" n != null;
+ message = "Invalid user name ${n} in ${prefix}";
+ })
+ users
+ ++ mapAttrsToList
+ (n: u: {
+ assertion = count (s: s != null) [
+ u.password u.passwordFile u.hashedPassword u.hashedPasswordFile
+ ] <= 1;
+ message = "Cannot set more than one password option for user ${n} in ${prefix}";
+ }) users;
+
+ makePasswordFile = users: path:
+ let
+ makeLines = store: file:
+ mapAttrsToList
+ (n: u: "addLine ${escapeShellArg n} ${escapeShellArg u.${store}}")
+ (filterAttrs (_: u: u.${store} != null) users)
+ ++ mapAttrsToList
+ (n: u: "addFile ${escapeShellArg n} ${escapeShellArg "${u.${file}}"}")
+ (filterAttrs (_: u: u.${file} != null) users);
+ plainLines = makeLines "password" "passwordFile";
+ hashedLines = makeLines "hashedPassword" "hashedPasswordFile";
+ in
+ pkgs.writeScript "make-mosquitto-passwd"
+ (''
+ #! ${pkgs.runtimeShell}
+
+ set -eu
+
+ file=${escapeShellArg path}
+
+ rm -f "$file"
+ touch "$file"
+
+ addLine() {
+ echo "$1:$2" >> "$file"
+ }
+ addFile() {
+ if [ $(wc -l <"$2") -gt 1 ]; then
+ echo "invalid mosquitto password file $2" >&2
+ return 1
+ fi
+ echo "$1:$(cat "$2")" >> "$file"
+ }
+ ''
+ + concatStringsSep "\n"
+ (plainLines
+ ++ optional (plainLines != []) ''
+ ${pkgs.mosquitto}/bin/mosquitto_passwd -U "$file"
+ ''
+ ++ hashedLines));
+
+ makeACLFile = idx: users: supplement:
+ pkgs.writeText "mosquitto-acl-${toString idx}.conf"
+ (concatStringsSep
+ "\n"
+ (flatten [
+ supplement
+ (mapAttrsToList
+ (n: u: [ "user ${n}" ] ++ map (t: "topic ${t}") u.acl)
+ users)
+ ]));
+
+ authPluginOptions = with types; submodule {
+ options = {
+ plugin = mkOption {
+ type = path;
+ description = ''
+ Plugin path to load, should be a .so file.
+ '';
+ };
+
+ denySpecialChars = mkOption {
+ type = bool;
+ description = ''
+ Automatically disallow all clients using #
+ or + in their name/id.
+ '';
+ default = true;
+ };
+
+ options = mkOption {
+ type = attrsOf optionType;
+ description = ''
+ Options for the auth plugin. Each key turns into a auth_opt_*
+ line in the config.
+ '';
+ default = {};
+ };
+ };
+ };
+
+ authAsserts = prefix: auth:
+ mapAttrsToList
+ (n: _: {
+ assertion = configKey.check n;
+ message = "Invalid auth plugin key ${prefix}.${n}";
+ })
+ auth;
+
+ formatAuthPlugin = plugin:
+ [
+ "auth_plugin ${plugin.plugin}"
+ "auth_plugin_deny_special_chars ${optionToString plugin.denySpecialChars}"
+ ]
+ ++ formatFreeform { prefix = "auth_opt_"; } plugin.options;
+
+ freeformListenerKeys = {
+ allow_anonymous = 1;
+ allow_zero_length_clientid = 1;
+ auto_id_prefix = 1;
+ cafile = 1;
+ capath = 1;
+ certfile = 1;
+ ciphers = 1;
+ "ciphers_tls1.3" = 1;
+ crlfile = 1;
+ dhparamfile = 1;
+ http_dir = 1;
+ keyfile = 1;
+ max_connections = 1;
+ max_qos = 1;
+ max_topic_alias = 1;
+ mount_point = 1;
+ protocol = 1;
+ psk_file = 1;
+ psk_hint = 1;
+ require_certificate = 1;
+ socket_domain = 1;
+ tls_engine = 1;
+ tls_engine_kpass_sha1 = 1;
+ tls_keyform = 1;
+ tls_version = 1;
+ use_identity_as_username = 1;
+ use_subject_as_username = 1;
+ use_username_as_clientid = 1;
+ };
+
+ listenerOptions = with types; submodule {
+ options = {
+ port = mkOption {
+ type = port;
+ description = ''
+ Port to listen on. Must be set to 0 to listen on a unix domain socket.
+ '';
+ default = 1883;
+ };
+
+ address = mkOption {
+ type = nullOr str;
+ description = ''
+ Address to listen on. Listen on 0.0.0.0/::
+ when unset.
+ '';
+ default = null;
+ };
+
+ authPlugins = mkOption {
+ type = listOf authPluginOptions;
+ description = ''
+ Authentication plugin to attach to this listener.
+ Refer to the
+ mosquitto.conf documentation for details on authentication plugins.
+ '';
+ default = [];
+ };
+
+ users = mkOption {
+ type = attrsOf userOptions;
+ example = { john = { password = "123456"; acl = [ "topic readwrite john/#" ]; }; };
+ description = ''
+ A set of users and their passwords and ACLs.
+ '';
+ default = {};
+ };
+
+ acl = mkOption {
+ type = listOf str;
+ description = ''
+ Additional ACL items to prepend to the generated ACL file.
+ '';
+ default = [];
+ };
+
+ settings = mkOption {
+ type = submodule {
+ freeformType = attrsOf optionType;
+ };
+ description = ''
+ Additional settings for this listener.
+ '';
+ default = {};
+ };
+ };
+ };
+
+ listenerAsserts = prefix: listener:
+ assertKeysValid prefix freeformListenerKeys listener.settings
+ ++ userAsserts prefix listener.users
+ ++ imap0
+ (i: v: authAsserts "${prefix}.authPlugins.${toString i}" v)
+ listener.authPlugins;
+
+ formatListener = idx: listener:
+ [
+ "listener ${toString listener.port} ${toString listener.address}"
+ "password_file ${cfg.dataDir}/passwd-${toString idx}"
+ "acl_file ${makeACLFile idx listener.users listener.acl}"
+ ]
+ ++ formatFreeform {} listener.settings
+ ++ concatMap formatAuthPlugin listener.authPlugins;
+
+ freeformBridgeKeys = {
+ bridge_alpn = 1;
+ bridge_attempt_unsubscribe = 1;
+ bridge_bind_address = 1;
+ bridge_cafile = 1;
+ bridge_capath = 1;
+ bridge_certfile = 1;
+ bridge_identity = 1;
+ bridge_insecure = 1;
+ bridge_keyfile = 1;
+ bridge_max_packet_size = 1;
+ bridge_outgoing_retain = 1;
+ bridge_protocol_version = 1;
+ bridge_psk = 1;
+ bridge_require_ocsp = 1;
+ bridge_tls_version = 1;
+ cleansession = 1;
+ idle_timeout = 1;
+ keepalive_interval = 1;
+ local_cleansession = 1;
+ local_clientid = 1;
+ local_password = 1;
+ local_username = 1;
+ notification_topic = 1;
+ notifications = 1;
+ notifications_local_only = 1;
+ remote_clientid = 1;
+ remote_password = 1;
+ remote_username = 1;
+ restart_timeout = 1;
+ round_robin = 1;
+ start_type = 1;
+ threshold = 1;
+ try_private = 1;
+ };
+
+ bridgeOptions = with types; submodule {
+ options = {
+ addresses = mkOption {
+ type = listOf (submodule {
+ options = {
+ address = mkOption {
+ type = str;
+ description = ''
+ Address of the remote MQTT broker.
+ '';
+ };
+
+ port = mkOption {
+ type = port;
+ description = ''
+ Port of the remote MQTT broker.
+ '';
+ default = 1883;
+ };
+ };
+ });
+ default = [];
+ description = ''
+ Remote endpoints for the bridge.
+ '';
+ };
+
+ topics = mkOption {
+ type = listOf str;
+ description = ''
+ Topic patterns to be shared between the two brokers.
+ Refer to the
+ mosquitto.conf documentation for details on the format.
+ '';
+ default = [];
+ example = [ "# both 2 local/topic/ remote/topic/" ];
+ };
+
+ settings = mkOption {
+ type = submodule {
+ freeformType = attrsOf optionType;
+ };
+ description = ''
+ Additional settings for this bridge.
+ '';
+ default = {};
+ };
+ };
+ };
+
+ bridgeAsserts = prefix: bridge:
+ assertKeysValid prefix freeformBridgeKeys bridge.settings
+ ++ [ {
+ assertion = length bridge.addresses > 0;
+ message = "Bridge ${prefix} needs remote broker addresses";
+ } ];
+
+ formatBridge = name: bridge:
+ [
+ "connection ${name}"
+ "addresses ${concatMapStringsSep " " (a: "${a.address}:${toString a.port}") bridge.addresses}"
+ ]
+ ++ map (t: "topic ${t}") bridge.topics
+ ++ formatFreeform {} bridge.settings;
+
+ freeformGlobalKeys = {
+ allow_duplicate_messages = 1;
+ autosave_interval = 1;
+ autosave_on_changes = 1;
+ check_retain_source = 1;
+ connection_messages = 1;
+ log_facility = 1;
+ log_timestamp = 1;
+ log_timestamp_format = 1;
+ max_inflight_bytes = 1;
+ max_inflight_messages = 1;
+ max_keepalive = 1;
+ max_packet_size = 1;
+ max_queued_bytes = 1;
+ max_queued_messages = 1;
+ memory_limit = 1;
+ message_size_limit = 1;
+ persistence_file = 1;
+ persistence_location = 1;
+ persistent_client_expiration = 1;
+ pid_file = 1;
+ queue_qos0_messages = 1;
+ retain_available = 1;
+ set_tcp_nodelay = 1;
+ sys_interval = 1;
+ upgrade_outgoing_qos = 1;
+ websockets_headers_size = 1;
+ websockets_log_level = 1;
+ };
+
+ globalOptions = with types; {
+ enable = mkEnableOption "the MQTT Mosquitto broker";
+
+ bridges = mkOption {
+ type = attrsOf bridgeOptions;
+ default = {};
+ description = ''
+ Bridges to build to other MQTT brokers.
+ '';
+ };
+
+ listeners = mkOption {
+ type = listOf listenerOptions;
+ default = {};
+ description = ''
+ Listeners to configure on this broker.
+ '';
+ };
+
+ includeDirs = mkOption {
+ type = listOf path;
+ description = ''
+ Directories to be scanned for further config files to include.
+ Directories will processed in the order given,
+ *.conf files in the directory will be
+ read in case-sensistive alphabetical order.
+ '';
+ default = [];
+ };
+
+ logDest = mkOption {
+ type = listOf (either path (enum [ "stdout" "stderr" "syslog" "topic" "dlt" ]));
+ description = ''
+ Destinations to send log messages to.
+ '';
+ default = [ "stderr" ];
+ };
+
+ logType = mkOption {
+ type = listOf (enum [ "debug" "error" "warning" "notice" "information"
+ "subscribe" "unsubscribe" "websockets" "none" "all" ]);
+ description = ''
+ Types of messages to log.
+ '';
+ default = [];
+ };
+
+ persistence = mkOption {
+ type = bool;
+ description = ''
+ Enable persistent storage of subscriptions and messages.
+ '';
+ default = true;
+ };
+
+ dataDir = mkOption {
+ default = "/var/lib/mosquitto";
+ type = types.path;
+ description = ''
+ The data directory.
+ '';
+ };
+
+ settings = mkOption {
+ type = submodule {
+ freeformType = attrsOf optionType;
+ };
+ description = ''
+ Global configuration options for the mosquitto broker.
+ '';
+ default = {};
+ };
+ };
+
+ globalAsserts = prefix: cfg:
+ flatten [
+ (assertKeysValid prefix freeformGlobalKeys cfg.settings)
+ (imap0 (n: l: listenerAsserts "${prefix}.listener.${toString n}" l) cfg.listeners)
+ (mapAttrsToList (n: b: bridgeAsserts "${prefix}.bridge.${n}" b) cfg.bridges)
+ ];
+
+ formatGlobal = cfg:
+ [
+ "per_listener_settings true"
+ "persistence ${optionToString cfg.persistence}"
+ ]
+ ++ map
+ (d: if path.check d then "log_dest file ${d}" else "log_dest ${d}")
+ cfg.logDest
+ ++ map (t: "log_type ${t}") cfg.logType
+ ++ formatFreeform {} cfg.settings
+ ++ concatLists (imap0 formatListener cfg.listeners)
+ ++ concatLists (mapAttrsToList formatBridge cfg.bridges)
+ ++ map (d: "include_dir ${d}") cfg.includeDirs;
+
+ configFile = pkgs.writeText "mosquitto.conf"
+ (concatStringsSep "\n" (formatGlobal cfg));
in
@@ -41,179 +535,13 @@ in
###### Interface
- options = {
- services.mosquitto = {
- enable = mkEnableOption "the MQTT Mosquitto broker";
-
- host = mkOption {
- default = "127.0.0.1";
- example = "0.0.0.0";
- type = types.str;
- description = ''
- Host to listen on without SSL.
- '';
- };
-
- port = mkOption {
- default = 1883;
- type = types.int;
- description = ''
- Port on which to listen without SSL.
- '';
- };
-
- ssl = {
- enable = mkEnableOption "SSL listener";
-
- cafile = mkOption {
- type = types.nullOr types.path;
- default = null;
- description = "Path to PEM encoded CA certificates.";
- };
-
- certfile = mkOption {
- type = types.nullOr types.path;
- default = null;
- description = "Path to PEM encoded server certificate.";
- };
-
- keyfile = mkOption {
- type = types.nullOr types.path;
- default = null;
- description = "Path to PEM encoded server key.";
- };
-
- host = mkOption {
- default = "0.0.0.0";
- example = "localhost";
- type = types.str;
- description = ''
- Host to listen on with SSL.
- '';
- };
-
- port = mkOption {
- default = 8883;
- type = types.int;
- description = ''
- Port on which to listen with SSL.
- '';
- };
- };
-
- dataDir = mkOption {
- default = "/var/lib/mosquitto";
- type = types.path;
- description = ''
- The data directory.
- '';
- };
-
- users = mkOption {
- type = types.attrsOf (types.submodule {
- options = {
- password = mkOption {
- type = with types; uniq (nullOr str);
- default = null;
- description = ''
- Specifies the (clear text) password for the MQTT User.
- '';
- };
-
- passwordFile = mkOption {
- type = with types; uniq (nullOr str);
- example = "/path/to/file";
- default = null;
- description = ''
- Specifies the path to a file containing the
- clear text password for the MQTT user.
- '';
- };
-
- hashedPassword = mkOption {
- type = with types; uniq (nullOr str);
- default = null;
- description = ''
- Specifies the hashed password for the MQTT User.
- To generate hashed password install mosquitto
- package and use mosquitto_passwd.
- '';
- };
-
- hashedPasswordFile = mkOption {
- type = with types; uniq (nullOr str);
- example = "/path/to/file";
- default = null;
- description = ''
- Specifies the path to a file containing the
- hashed password for the MQTT user.
- To generate hashed password install mosquitto
- package and use mosquitto_passwd.
- '';
- };
-
- acl = mkOption {
- type = types.listOf types.str;
- example = [ "topic read A/B" "topic A/#" ];
- description = ''
- Control client access to topics on the broker.
- '';
- };
- };
- });
- example = { john = { password = "123456"; acl = [ "topic readwrite john/#" ]; }; };
- description = ''
- A set of users and their passwords and ACLs.
- '';
- };
-
- allowAnonymous = mkOption {
- default = false;
- type = types.bool;
- description = ''
- Allow clients to connect without authentication.
- '';
- };
-
- checkPasswords = mkOption {
- default = false;
- example = true;
- type = types.bool;
- description = ''
- Refuse connection when clients provide incorrect passwords.
- '';
- };
-
- extraConf = mkOption {
- default = "";
- type = types.lines;
- description = ''
- Extra config to append to `mosquitto.conf` file.
- '';
- };
-
- aclExtraConf = mkOption {
- default = "";
- type = types.lines;
- description = ''
- Extra config to prepend to the ACL file.
- '';
- };
-
- };
- };
-
+ options.services.mosquitto = globalOptions;
###### Implementation
config = mkIf cfg.enable {
- assertions = mapAttrsToList (name: cfg: {
- assertion = length (filter (s: s != null) (with cfg; [
- password passwordFile hashedPassword hashedPasswordFile
- ])) <= 1;
- message = "Cannot set more than one password option";
- }) cfg.users;
+ assertions = globalAsserts "services.mosquitto" cfg;
systemd.services.mosquitto = {
description = "Mosquitto MQTT Broker Daemon";
@@ -227,7 +555,7 @@ in
RuntimeDirectory = "mosquitto";
WorkingDirectory = cfg.dataDir;
Restart = "on-failure";
- ExecStart = "${pkgs.mosquitto}/bin/mosquitto -c ${mosquittoConf}";
+ ExecStart = "${pkgs.mosquitto}/bin/mosquitto -c ${configFile}";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
# Hardening
@@ -252,12 +580,34 @@ in
ReadWritePaths = [
cfg.dataDir
"/tmp" # mosquitto_passwd creates files in /tmp before moving them
- ];
- ReadOnlyPaths = with cfg.ssl; lib.optionals (enable) [
- certfile
- keyfile
- cafile
- ];
+ ] ++ filter path.check cfg.logDest;
+ ReadOnlyPaths =
+ map (p: "${p}")
+ (cfg.includeDirs
+ ++ filter
+ (v: v != null)
+ (flatten [
+ (map
+ (l: [
+ (l.settings.psk_file or null)
+ (l.settings.http_dir or null)
+ (l.settings.cafile or null)
+ (l.settings.capath or null)
+ (l.settings.certfile or null)
+ (l.settings.crlfile or null)
+ (l.settings.dhparamfile or null)
+ (l.settings.keyfile or null)
+ ])
+ cfg.listeners)
+ (mapAttrsToList
+ (_: b: [
+ (b.settings.bridge_cafile or null)
+ (b.settings.bridge_capath or null)
+ (b.settings.bridge_certfile or null)
+ (b.settings.bridge_keyfile or null)
+ ])
+ cfg.bridges)
+ ]));
RemoveIPC = true;
RestrictAddressFamilies = [
"AF_UNIX" # for sd_notify() call
@@ -275,20 +625,12 @@ in
];
UMask = "0077";
};
- preStart = ''
- rm -f ${cfg.dataDir}/passwd
- touch ${cfg.dataDir}/passwd
- '' + concatStringsSep "\n" (
- mapAttrsToList (n: c:
- if c.hashedPasswordFile != null then
- "echo '${n}:'$(cat '${c.hashedPasswordFile}') >> ${cfg.dataDir}/passwd"
- else if c.passwordFile != null then
- "${pkgs.mosquitto}/bin/mosquitto_passwd -b ${cfg.dataDir}/passwd ${n} $(cat '${c.passwordFile}')"
- else if c.hashedPassword != null then
- "echo '${n}:${c.hashedPassword}' >> ${cfg.dataDir}/passwd"
- else optionalString (c.password != null)
- "${pkgs.mosquitto}/bin/mosquitto_passwd -b ${cfg.dataDir}/passwd ${n} '${c.password}'"
- ) cfg.users);
+ preStart =
+ concatStringsSep
+ "\n"
+ (imap0
+ (idx: listener: makePasswordFile listener.users "${cfg.dataDir}/passwd-${toString idx}")
+ cfg.listeners);
};
users.users.mosquitto = {
@@ -302,4 +644,6 @@ in
users.groups.mosquitto.gid = config.ids.gids.mosquitto;
};
+
+ meta.maintainers = with lib.maintainers; [ pennae ];
}
diff --git a/nixos/tests/borgbackup.nix b/nixos/tests/borgbackup.nix
index fae1d2d07138..cbb28689209b 100644
--- a/nixos/tests/borgbackup.nix
+++ b/nixos/tests/borgbackup.nix
@@ -81,6 +81,24 @@ in {
environment.BORG_RSH = "ssh -oStrictHostKeyChecking=no -i /root/id_ed25519.appendOnly";
};
+ commandSuccess = {
+ dumpCommand = pkgs.writeScript "commandSuccess" ''
+ echo -n test
+ '';
+ repo = remoteRepo;
+ encryption.mode = "none";
+ startAt = [ ];
+ environment.BORG_RSH = "ssh -oStrictHostKeyChecking=no -i /root/id_ed25519";
+ };
+
+ commandFail = {
+ dumpCommand = "${pkgs.coreutils}/bin/false";
+ repo = remoteRepo;
+ encryption.mode = "none";
+ startAt = [ ];
+ environment.BORG_RSH = "ssh -oStrictHostKeyChecking=no -i /root/id_ed25519";
+ };
+
};
};
@@ -171,5 +189,20 @@ in {
client.fail("{} list borg\@server:wrong".format(borg))
# TODO: Make sure that data is not actually deleted
+
+ with subtest("commandSuccess"):
+ server.wait_for_unit("sshd.service")
+ client.wait_for_unit("network.target")
+ client.systemctl("start --wait borgbackup-job-commandSuccess")
+ client.fail("systemctl is-failed borgbackup-job-commandSuccess")
+ id = client.succeed("borg-job-commandSuccess list | tail -n1 | cut -d' ' -f1").strip()
+ client.succeed(f"borg-job-commandSuccess extract ::{id} stdin")
+ assert "test" == client.succeed("cat stdin")
+
+ with subtest("commandFail"):
+ server.wait_for_unit("sshd.service")
+ client.wait_for_unit("network.target")
+ client.systemctl("start --wait borgbackup-job-commandFail")
+ client.succeed("systemctl is-failed borgbackup-job-commandFail")
'';
})
diff --git a/nixos/tests/home-assistant.nix b/nixos/tests/home-assistant.nix
index 699be8fd7dc6..0894736bac9c 100644
--- a/nixos/tests/home-assistant.nix
+++ b/nixos/tests/home-assistant.nix
@@ -12,13 +12,14 @@ in {
environment.systemPackages = with pkgs; [ mosquitto ];
services.mosquitto = {
enable = true;
- checkPasswords = true;
- users = {
- "${mqttUsername}" = {
- acl = [ "topic readwrite #" ];
- password = mqttPassword;
+ listeners = [ {
+ users = {
+ "${mqttUsername}" = {
+ acl = [ "readwrite #" ];
+ password = mqttPassword;
+ };
};
- };
+ } ];
};
services.home-assistant = {
inherit configDir;
diff --git a/nixos/tests/mosquitto.nix b/nixos/tests/mosquitto.nix
index e29bd559ed9b..eb47e97ba04b 100644
--- a/nixos/tests/mosquitto.nix
+++ b/nixos/tests/mosquitto.nix
@@ -2,13 +2,59 @@ import ./make-test-python.nix ({ pkgs, lib, ... }:
let
port = 1888;
- username = "mqtt";
+ tlsPort = 1889;
password = "VERY_secret";
+ hashedPassword = "$7$101$/WJc4Mp+I+uYE9sR$o7z9rD1EYXHPwEP5GqQj6A7k4W1yVbePlb8TqNcuOLV9WNCiDgwHOB0JHC1WCtdkssqTBduBNUnUGd6kmZvDSw==";
topic = "test/foo";
+
+ snakeOil = pkgs.runCommand "snakeoil-certs" {
+ buildInputs = [ pkgs.gnutls.bin ];
+ caTemplate = pkgs.writeText "snakeoil-ca.template" ''
+ cn = server
+ expiration_days = -1
+ cert_signing_key
+ ca
+ '';
+ certTemplate = pkgs.writeText "snakeoil-cert.template" ''
+ cn = server
+ expiration_days = -1
+ tls_www_server
+ encryption_key
+ signing_key
+ '';
+ userCertTemplate = pkgs.writeText "snakeoil-user-cert.template" ''
+ organization = snakeoil
+ cn = client1
+ expiration_days = -1
+ tls_www_client
+ encryption_key
+ signing_key
+ '';
+ } ''
+ mkdir "$out"
+
+ certtool -p --bits 2048 --outfile "$out/ca.key"
+ certtool -s --template "$caTemplate" --load-privkey "$out/ca.key" \
+ --outfile "$out/ca.crt"
+ certtool -p --bits 2048 --outfile "$out/server.key"
+ certtool -c --template "$certTemplate" \
+ --load-ca-privkey "$out/ca.key" \
+ --load-ca-certificate "$out/ca.crt" \
+ --load-privkey "$out/server.key" \
+ --outfile "$out/server.crt"
+
+ certtool -p --bits 2048 --outfile "$out/client1.key"
+ certtool -c --template "$userCertTemplate" \
+ --load-privkey "$out/client1.key" \
+ --load-ca-privkey "$out/ca.key" \
+ --load-ca-certificate "$out/ca.crt" \
+ --outfile "$out/client1.crt"
+ '';
+
in {
name = "mosquitto";
meta = with pkgs.lib; {
- maintainers = with maintainers; [ peterhoeg ];
+ maintainers = with maintainers; [ pennae peterhoeg ];
};
nodes = let
@@ -17,77 +63,131 @@ in {
};
in {
server = { pkgs, ... }: {
- networking.firewall.allowedTCPPorts = [ port ];
+ networking.firewall.allowedTCPPorts = [ port tlsPort ];
services.mosquitto = {
- inherit port;
enable = true;
- host = "0.0.0.0";
- checkPasswords = true;
- users.${username} = {
- inherit password;
- acl = [
- "topic readwrite ${topic}"
- ];
+ settings = {
+ sys_interval = 1;
};
- };
+ listeners = [
+ {
+ inherit port;
+ users = {
+ password_store = {
+ inherit password;
+ };
+ password_file = {
+ passwordFile = pkgs.writeText "mqtt-password" password;
+ };
+ hashed_store = {
+ inherit hashedPassword;
+ };
+ hashed_file = {
+ hashedPasswordFile = pkgs.writeText "mqtt-hashed-password" hashedPassword;
+ };
- # disable private /tmp for this test
- systemd.services.mosquitto.serviceConfig.PrivateTmp = lib.mkForce false;
+ reader = {
+ inherit password;
+ acl = [
+ "read ${topic}"
+ "read $SYS/#" # so we always have something to read
+ ];
+ };
+ writer = {
+ inherit password;
+ acl = [ "write ${topic}" ];
+ };
+ };
+ }
+ {
+ port = tlsPort;
+ users.client1 = {
+ acl = [ "read $SYS/#" ];
+ };
+ settings = {
+ cafile = "${snakeOil}/ca.crt";
+ certfile = "${snakeOil}/server.crt";
+ keyfile = "${snakeOil}/server.key";
+ require_certificate = true;
+ use_identity_as_username = true;
+ };
+ }
+ ];
+ };
};
client1 = client;
client2 = client;
};
- testScript = let
- file = "/tmp/msg";
- in ''
- def mosquitto_cmd(binary):
+ testScript = ''
+ def mosquitto_cmd(binary, user, topic, port):
return (
- "${pkgs.mosquitto}/bin/mosquitto_{} "
+ "mosquitto_{} "
"-V mqttv311 "
"-h server "
- "-p ${toString port} "
- "-u ${username} "
+ "-p {} "
+ "-u {} "
"-P '${password}' "
- "-t ${topic}"
- ).format(binary)
+ "-t '{}'"
+ ).format(binary, port, user, topic)
- def publish(args):
- return "{} {}".format(mosquitto_cmd("pub"), args)
+ def publish(args, user, topic="${topic}", port=${toString port}):
+ return "{} {}".format(mosquitto_cmd("pub", user, topic, port), args)
- def subscribe(args):
- return "({} -C 1 {} | tee ${file} &)".format(mosquitto_cmd("sub"), args)
+ def subscribe(args, user, topic="${topic}", port=${toString port}):
+ return "{} -C 1 {}".format(mosquitto_cmd("sub", user, topic, port), args)
+
+ def parallel(*fns):
+ from threading import Thread
+ threads = [ Thread(target=fn) for fn in fns ]
+ for t in threads: t.start()
+ for t in threads: t.join()
start_all()
server.wait_for_unit("mosquitto.service")
- for machine in server, client1, client2:
- machine.fail("test -f ${file}")
+ def check_passwords():
+ client1.succeed(publish("-m test", "password_store"))
+ client1.succeed(publish("-m test", "password_file"))
+ client1.succeed(publish("-m test", "hashed_store"))
+ client1.succeed(publish("-m test", "hashed_file"))
- # QoS = 0, so only one subscribers should get it
- server.execute(subscribe("-q 0"))
+ check_passwords()
- # we need to give the subscribers some time to connect
- client2.execute("sleep 5")
- client2.succeed(publish("-m FOO -q 0"))
+ def check_acl():
+ client1.succeed(subscribe("", "reader", topic="$SYS/#"))
+ client1.fail(subscribe("-W 5", "writer", topic="$SYS/#"))
- server.wait_until_succeeds("grep -q FOO ${file}")
- server.execute("rm ${file}")
+ parallel(
+ lambda: client1.succeed(subscribe("-i 3688cdd7-aa07-42a4-be22-cb9352917e40", "reader")),
+ lambda: [
+ server.wait_for_console_text("3688cdd7-aa07-42a4-be22-cb9352917e40"),
+ client2.succeed(publish("-m test", "writer"))
+ ])
- # QoS = 1, so both subscribers should get it
- server.execute(subscribe("-q 1"))
- client1.execute(subscribe("-q 1"))
+ parallel(
+ lambda: client1.fail(subscribe("-W 5 -i 24ff16a2-ae33-4a51-9098-1b417153c712", "reader")),
+ lambda: [
+ server.wait_for_console_text("24ff16a2-ae33-4a51-9098-1b417153c712"),
+ client2.succeed(publish("-m test", "reader"))
+ ])
- # we need to give the subscribers some time to connect
- client2.execute("sleep 5")
- client2.succeed(publish("-m BAR -q 1"))
+ check_acl()
- for machine in server, client1:
- machine.wait_until_succeeds("grep -q BAR ${file}")
- machine.execute("rm ${file}")
+ def check_tls():
+ client1.succeed(
+ subscribe(
+ "--cafile ${snakeOil}/ca.crt "
+ "--cert ${snakeOil}/client1.crt "
+ "--key ${snakeOil}/client1.key",
+ topic="$SYS/#",
+ port=${toString tlsPort},
+ user="no_such_user"))
+
+ check_tls()
'';
})
diff --git a/pkgs/applications/networking/browsers/chromium/upstream-info.json b/pkgs/applications/networking/browsers/chromium/upstream-info.json
index e48539aab5bb..aa77bae2d231 100644
--- a/pkgs/applications/networking/browsers/chromium/upstream-info.json
+++ b/pkgs/applications/networking/browsers/chromium/upstream-info.json
@@ -31,15 +31,15 @@
}
},
"dev": {
- "version": "96.0.4664.18",
- "sha256": "0z7hplfl9mlbn07svcavzcb2gqn1hchwhhlpz0qykf6kd441kxpf",
- "sha256bin64": "0y09aginw5qg7apm9wvxny7y8nxhsq7gnxp1jmghfjhv5xq7pdn9",
+ "version": "97.0.4676.0",
+ "sha256": "1cf660h7n1d4ds63747zfc4wmwxm348grcv40zg614cpjm4q68b5",
+ "sha256bin64": "116a4d47s3sx1pq8hhqybdsjxcv8657xaldrlix2z7jh94ip2nwh",
"deps": {
"gn": {
- "version": "2021-09-24",
+ "version": "2021-10-08",
"url": "https://gn.googlesource.com/gn",
- "rev": "0153d369bbccc908f4da4993b1ba82728055926a",
- "sha256": "0y4414h8jqsbz5af6pn91c0vkfp4s281s85g992xfyl785c5zbsi"
+ "rev": "693f9fb87e4febdd4299db9f73d8d2c958e63148",
+ "sha256": "1qfjj2mdpflry4f9fkagvb76zwfibys4nqz9lddy1zh5nnbd9mff"
}
}
},
diff --git a/pkgs/applications/networking/cluster/flink/default.nix b/pkgs/applications/networking/cluster/flink/default.nix
index ccefd6d3de25..55f3e23ad6c3 100644
--- a/pkgs/applications/networking/cluster/flink/default.nix
+++ b/pkgs/applications/networking/cluster/flink/default.nix
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
pname = "flink";
- version = "1.13.2";
+ version = "1.14.0";
src = fetchurl {
url = "mirror://apache/flink/${pname}-${version}/${pname}-${version}-bin-scala_2.11.tgz";
- sha256 = "sha256-GPiHV19Z2Htt75hCXK2nCeQMIBQFEEUxXlBembenFL0=";
+ sha256 = "149b9ae774022acc0109dced893ca2d73430627a612be17ff12de8734464aff8";
};
nativeBuildInputs = [ makeWrapper ];
diff --git a/pkgs/applications/networking/sync/unison/default.nix b/pkgs/applications/networking/sync/unison/default.nix
index b106deb074e3..429042f3ee4b 100644
--- a/pkgs/applications/networking/sync/unison/default.nix
+++ b/pkgs/applications/networking/sync/unison/default.nix
@@ -7,7 +7,6 @@
, makeWrapper
, ncurses
, gnugrep
-, fetchpatch
, copyDesktopItems
, makeDesktopItem
, enableX11 ? true
@@ -15,29 +14,19 @@
stdenv.mkDerivation rec {
pname = "unison";
- version = "2.51.3";
+ version = "2.51.4";
src = fetchFromGitHub {
owner = "bcpierce00";
repo = "unison";
rev = "v${version}";
- sha256 = "sha256-42hmdMwOYSWGiDCmhuqtpCWtvtyD2l+kA/bhHD/Qh5Y=";
+ sha256 = "sha256-jcfq4X+r98bQqbQ3gRqJyryLdt1Y/2CLawqqIiUaQOo=";
};
nativeBuildInputs = [ makeWrapper ]
++ lib.optional enableX11 copyDesktopItems;
buildInputs = [ ocamlPackages.ocaml ncurses ];
- patches = [
- # Patch to fix build with ocaml 4.12. Remove in 2.51.4
- # https://github.com/bcpierce00/unison/pull/481
- (fetchpatch {
- name = "fix-compile-with-ocaml-4.12.patch";
- url = "https://github.com/bcpierce00/unison/commit/14b885316e0a4b41cb80fe3daef7950f88be5c8f.patch?full_index=1";
- sha256 = "0j1rma1cwdsfql19zvzhfj2ys5c4lbhjcp6jrnck04xnckxxiy3d";
- })
- ];
-
preBuild = lib.optionalString enableX11 ''
sed -i "s|\(OCAMLOPT=.*\)$|\1 -I $(echo "${ocamlPackages.lablgtk}"/lib/ocaml/*/site-lib/lablgtk2)|" src/Makefile.OCaml
'' + ''
diff --git a/pkgs/applications/networking/browsers/angelfish/default.nix b/pkgs/applications/plasma-mobile/angelfish.nix
similarity index 58%
rename from pkgs/applications/networking/browsers/angelfish/default.nix
rename to pkgs/applications/plasma-mobile/angelfish.nix
index dedc51469670..99df3f55c1d5 100644
--- a/pkgs/applications/networking/browsers/angelfish/default.nix
+++ b/pkgs/applications/plasma-mobile/angelfish.nix
@@ -16,21 +16,29 @@
, qtquickcontrols2
, qtwebengine
, rustPlatform
+, srcs
+
+# These must be updated in tandem with package updates.
+, cargoShaForVersion ? "21.08"
+, cargoSha256 ? "1pbvw9hdzn3i97mahdy9y6jnjsmwmjs3lxfz7q6r9r10i8swbkak"
}:
+# Guard against incomplete updates.
+# Values are provided as callPackage inputs to enable easier overrides through overlays.
+if cargoShaForVersion != srcs.angelfish.version
+then builtins.throw ''
+ angelfish package update is incomplete.
+ Hash for cargo dependencies is declared for version ${cargoShaForVersion}, but we're building ${srcs.angelfish.version}.
+ Update the cargoSha256 and cargoShaForVersion for angelfish.
+'' else
+
mkDerivation rec {
pname = "angelfish";
- version = "21.08";
-
- src = fetchurl {
- url = "mirror://kde/stable/plasma-mobile/${version}/angelfish-${version}.tar.xz";
- sha256 = "1gzvlha159bw767mj8lisn89592j4j4dazzfws3v4anddjh60xnh";
- };
cargoDeps = rustPlatform.fetchCargoTarball {
- inherit src;
- name = "${pname}-${version}";
- sha256 = "1pbvw9hdzn3i97mahdy9y6jnjsmwmjs3lxfz7q6r9r10i8swbkak";
+ src = srcs.angelfish.src;
+ name = "${pname}-${srcs.angelfish.version}";
+ sha256 = cargoSha256;
};
nativeBuildInputs = [
diff --git a/pkgs/applications/plasma-mobile/audiotube.nix b/pkgs/applications/plasma-mobile/audiotube.nix
new file mode 100644
index 000000000000..1a1dedc7b426
--- /dev/null
+++ b/pkgs/applications/plasma-mobile/audiotube.nix
@@ -0,0 +1,61 @@
+{ lib
+, mkDerivation
+, fetchpatch
+
+, extra-cmake-modules
+
+, kcoreaddons
+, kcrash
+, ki18n
+, kirigami2
+, qtmultimedia
+, qtquickcontrols2
+, python3Packages
+}:
+
+mkDerivation rec {
+ pname = "audiotube";
+
+ patches = [
+ # Fix compatibility with ytmusicapi 0.19.1
+ (fetchpatch {
+ url = "https://invent.kde.org/plasma-mobile/audiotube/-/commit/734caa02805988200f923b88d1590b3f7dac8ac2.patch";
+ sha256 = "0zq4f0w84dv0630bpvmqkfmhxbvibr2fxhzy6d2mnf098028gzyd";
+ })
+ ];
+
+ nativeBuildInputs = [
+ extra-cmake-modules
+ python3Packages.wrapPython
+ python3Packages.pybind11
+ ];
+
+ buildInputs = [
+ kcoreaddons
+ kcrash
+ ki18n
+ kirigami2
+ qtmultimedia
+ qtquickcontrols2
+ python3Packages.youtube-dl
+ python3Packages.ytmusicapi
+ ];
+
+ pythonPath = [
+ python3Packages.youtube-dl
+ python3Packages.ytmusicapi
+ ];
+
+ preFixup = ''
+ buildPythonPath "$pythonPath"
+ qtWrapperArgs+=(--prefix PYTHONPATH : "$program_PYTHONPATH")
+ '';
+
+ meta = with lib; {
+ description = "Client for YouTube Music";
+ 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 ];
+ };
+}
diff --git a/pkgs/applications/plasma-mobile/default.nix b/pkgs/applications/plasma-mobile/default.nix
index 18f550955c57..fd9ae2a2bae8 100644
--- a/pkgs/applications/plasma-mobile/default.nix
+++ b/pkgs/applications/plasma-mobile/default.nix
@@ -62,12 +62,17 @@ let
};
in {
alligator = callPackage ./alligator.nix {};
+ angelfish = callPackage ./angelfish.nix { inherit srcs; };
+ audiotube = callPackage ./audiotube.nix {};
calindori = callPackage ./calindori.nix {};
kalk = callPackage ./kalk.nix {};
+ kasts = callPackage ./kasts.nix {};
kclock = callPackage ./kclock.nix {};
+ keysmith = callPackage ./keysmith.nix {};
koko = callPackage ./koko.nix {};
krecorder = callPackage ./krecorder.nix {};
ktrip = callPackage ./ktrip.nix {};
+ kweather = callPackage ./kweather.nix {};
plasma-dialer = callPackage ./plasma-dialer.nix {};
plasma-phonebook = callPackage ./plasma-phonebook.nix {};
spacebar = callPackage ./spacebar.nix {};
diff --git a/pkgs/applications/plasma-mobile/fetch.sh b/pkgs/applications/plasma-mobile/fetch.sh
index 29a8e6b4c792..14995aeb2b7f 100644
--- a/pkgs/applications/plasma-mobile/fetch.sh
+++ b/pkgs/applications/plasma-mobile/fetch.sh
@@ -1 +1 @@
-WGET_ARGS=( http://download.kde.org/stable/plasma-mobile/21.05 -A '*.tar.xz' )
+WGET_ARGS=( https://download.kde.org/stable/plasma-mobile/21.08/ -A '*.tar.xz' )
diff --git a/pkgs/applications/plasma-mobile/kasts.nix b/pkgs/applications/plasma-mobile/kasts.nix
new file mode 100644
index 000000000000..370cba7e2ea8
--- /dev/null
+++ b/pkgs/applications/plasma-mobile/kasts.nix
@@ -0,0 +1,57 @@
+{ lib
+, mkDerivation
+
+, cmake
+, extra-cmake-modules
+, wrapGAppsHook
+
+, gst_all_1
+, kconfig
+, kcoreaddons
+, ki18n
+, kirigami2
+, qtmultimedia
+, qtquickcontrols2
+, syndication
+}:
+
+let
+ inherit (gst_all_1) gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad;
+in
+mkDerivation rec {
+ pname = "kasts";
+
+ nativeBuildInputs = [
+ cmake
+ extra-cmake-modules
+ wrapGAppsHook
+ ];
+
+ buildInputs = [
+ gst-plugins-bad
+ gst-plugins-base
+ gst-plugins-good
+ gstreamer
+
+ kconfig
+ kcoreaddons
+ ki18n
+ kirigami2
+ qtquickcontrols2
+ qtmultimedia
+ syndication
+ ];
+
+ preFixup = ''
+ qtWrapperArgs+=("''${gappsWrapperArgs[@]}")
+ '';
+ dontWrapGApps = true;
+
+ meta = with lib; {
+ description = "Mobile podcast application";
+ 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 ];
+ };
+}
diff --git a/pkgs/applications/plasma-mobile/keysmith.nix b/pkgs/applications/plasma-mobile/keysmith.nix
new file mode 100644
index 000000000000..eaca7f68e24b
--- /dev/null
+++ b/pkgs/applications/plasma-mobile/keysmith.nix
@@ -0,0 +1,39 @@
+{ lib
+, mkDerivation
+
+, cmake
+, extra-cmake-modules
+
+, kdbusaddons
+, ki18n
+, kirigami2
+, kwindowsystem
+, libsodium
+, qtquickcontrols2
+}:
+
+mkDerivation rec {
+ pname = "keysmith";
+
+ nativeBuildInputs = [
+ cmake
+ extra-cmake-modules
+ ];
+
+ buildInputs = [
+ kdbusaddons
+ ki18n
+ kirigami2
+ kwindowsystem
+ libsodium
+ qtquickcontrols2
+ ];
+
+ meta = with lib; {
+ description = "OTP client for Plasma Mobile and Desktop";
+ license = licenses.gpl3;
+ homepage = "https://github.com/KDE/keysmith";
+ maintainers = with maintainers; [ samueldr shamilton ];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/plasma-mobile/ktrip.nix b/pkgs/applications/plasma-mobile/ktrip.nix
index cc1404d064fd..5377dd106586 100644
--- a/pkgs/applications/plasma-mobile/ktrip.nix
+++ b/pkgs/applications/plasma-mobile/ktrip.nix
@@ -12,6 +12,7 @@
, kirigami2
, kitemmodels
, kpublictransport
+, qqc2-desktop-style
, qtquickcontrols2
}:
@@ -32,6 +33,7 @@ mkDerivation rec {
kirigami2
kitemmodels
kpublictransport
+ qqc2-desktop-style
qtquickcontrols2
];
diff --git a/pkgs/applications/plasma-mobile/kweather.nix b/pkgs/applications/plasma-mobile/kweather.nix
new file mode 100644
index 000000000000..497061624b92
--- /dev/null
+++ b/pkgs/applications/plasma-mobile/kweather.nix
@@ -0,0 +1,44 @@
+{ lib
+, mkDerivation
+
+, cmake
+, extra-cmake-modules
+
+, kconfig
+, ki18n
+, kirigami2
+, knotifications
+, kquickcharts
+, kweathercore
+, plasma-framework
+, qtcharts
+, qtquickcontrols2
+}:
+
+mkDerivation rec {
+ pname = "kweather";
+
+ nativeBuildInputs = [
+ cmake
+ extra-cmake-modules
+ ];
+
+ buildInputs = [
+ kconfig
+ ki18n
+ kirigami2
+ knotifications
+ kquickcharts
+ kweathercore
+ plasma-framework
+ qtcharts
+ qtquickcontrols2
+ ];
+
+ meta = with lib; {
+ description = "Weather application for Plasma Mobile";
+ homepage = "https://invent.kde.org/plasma-mobile/kweather";
+ license = with licenses; [ gpl2Plus cc-by-40 ];
+ maintainers = with maintainers; [ samueldr ];
+ };
+}
diff --git a/pkgs/applications/plasma-mobile/spacebar.nix b/pkgs/applications/plasma-mobile/spacebar.nix
index 1c661041f7ae..8d5665501086 100644
--- a/pkgs/applications/plasma-mobile/spacebar.nix
+++ b/pkgs/applications/plasma-mobile/spacebar.nix
@@ -9,7 +9,9 @@
, kirigami2
, knotifications
, kpeople
+, libphonenumber
, libqofono
+, protobuf
, telepathy
}:
@@ -27,7 +29,9 @@ mkDerivation rec {
kirigami2
knotifications
kpeople
+ libphonenumber
libqofono
+ protobuf # Needed by libphonenumber
telepathy
];
diff --git a/pkgs/applications/plasma-mobile/srcs.nix b/pkgs/applications/plasma-mobile/srcs.nix
index 4df185aa0aec..06b551a94cf4 100644
--- a/pkgs/applications/plasma-mobile/srcs.nix
+++ b/pkgs/applications/plasma-mobile/srcs.nix
@@ -1,118 +1,158 @@
# DO NOT EDIT! This file is generated automatically.
-# Command: ./maintainers/scripts/fetch-kde-qt.sh pkgs/applications/plasma-mobile/
+# Command: ./maintainers/scripts/fetch-kde-qt.sh pkgs/applications/plasma-mobile
{ fetchurl, mirror }:
{
alligator = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/alligator-21.05.tar.xz";
- sha256 = "04zgxfx2zmn1p2ap08i5sfsnrly3smip4ylr07ghkhkiyjzbv9w6";
- name = "alligator-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/alligator-21.08.tar.xz";
+ sha256 = "1dhwfwd1v5wmx3sldpygb79kz87j13wd0arhlkm94z1whsixan0q";
+ name = "alligator-21.08.tar.xz";
};
};
angelfish = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/angelfish-21.05.tar.xz";
- sha256 = "11jd5dwy0xa7kh5z5rc29xy3wfn20hm31908zjax4x83qqjrm075";
- name = "angelfish-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/angelfish-21.08.tar.xz";
+ sha256 = "1gzvlha159bw767mj8lisn89592j4j4dazzfws3v4anddjh60xnh";
+ name = "angelfish-21.08.tar.xz";
+ };
+ };
+ audiotube = {
+ version = "21.08";
+ src = fetchurl {
+ url = "${mirror}/stable/plasma-mobile/21.08/audiotube-21.08.tar.xz";
+ sha256 = "14h4xna9v70lmp7cfpvdnz0f5a4gwgj0q3byccmawm38xsv15v8c";
+ name = "audiotube-21.08.tar.xz";
};
};
calindori = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/calindori-21.05.tar.xz";
- sha256 = "110f9ri9r1nb6q1ybhkfxljl4q5gqxikh9z0xkzjjbxjjqfscqcj";
- name = "calindori-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/calindori-21.08.tar.xz";
+ sha256 = "08s16a8skh02n8ygqwryxpzczj5aqr5k58aijaz2gzx45m7ym31b";
+ name = "calindori-21.08.tar.xz";
};
};
kalk = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/kalk-21.05.tar.xz";
- sha256 = "04n65hx0j9rx6b3jq69zgypi8qjd4ig3rfw7d44c3q7dgh4k451l";
- name = "kalk-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/kalk-21.08.tar.xz";
+ sha256 = "0xzrahpz47yajalsfmpzmavxjwmr4bgljwyz2dhxdg40ryjxdy23";
+ name = "kalk-21.08.tar.xz";
+ };
+ };
+ kasts = {
+ version = "21.08";
+ src = fetchurl {
+ url = "${mirror}/stable/plasma-mobile/21.08/kasts-21.08.tar.xz";
+ sha256 = "10v6icxwv46nihzbdi0n2w71bsg7l166z7jf9rb7vf2mjh1gqavn";
+ name = "kasts-21.08.tar.xz";
};
};
kclock = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/kclock-21.05.tar.xz";
- sha256 = "0pa5hvax0y80l8yrqczh9mcknfm3z0vdq3xc35cxdiz1vc6fwqmd";
- name = "kclock-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/kclock-21.08.tar.xz";
+ sha256 = "1zq0fxlwd7l3b6dgfqsmv1x4wvhmrjz5r0a38hbd7j7pzgyix47d";
+ name = "kclock-21.08.tar.xz";
+ };
+ };
+ keysmith = {
+ version = "21.08";
+ src = fetchurl {
+ url = "${mirror}/stable/plasma-mobile/21.08/keysmith-21.08.tar.xz";
+ sha256 = "0fa8inli7cwmb75af0mr2cflng0r6k3pd6ckih6ph7szqbpg2x90";
+ name = "keysmith-21.08.tar.xz";
};
};
koko = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/koko-21.05.tar.xz";
- sha256 = "00hnzkl8dvf15psrcfh96b8wfb3pbggd2f7xnadzcb87sbaml035";
- name = "koko-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/koko-21.08.tar.xz";
+ sha256 = "1sqlcl871m6dlrnkkhqa3xfwix01d74d7jf94r1a3p32hqljv76p";
+ name = "koko-21.08.tar.xz";
};
};
kongress = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/kongress-21.05.tar.xz";
- sha256 = "0qxgpi04ra9crc6drgbdm9arjbvcx52pprjr1dj8acch07f6i2gs";
- name = "kongress-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/kongress-21.08.tar.xz";
+ sha256 = "099ds4bv4ngx21f28hxcvc17wd2nk786kydwf2h5n3mdd2mgz3ka";
+ name = "kongress-21.08.tar.xz";
};
};
krecorder = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/krecorder-21.05.tar.xz";
- sha256 = "0ydaidxx2616bixihyaagvyym1r5s9rjkgg04vq9k4608d4vnn5c";
- name = "krecorder-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/krecorder-21.08.tar.xz";
+ sha256 = "1381x889h37saf6k875iqhwz5vbixrp7650smxp31r56ycrqq26i";
+ name = "krecorder-21.08.tar.xz";
};
};
ktrip = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/ktrip-21.05.tar.xz";
- sha256 = "0hxgnncyc2ir6i9p6s9fy1r4mhxgm643pxvp8lj3j5y0c5wk2kp9";
- name = "ktrip-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/ktrip-21.08.tar.xz";
+ sha256 = "0ipxi3pqd7mznq3qjf9j9w3wyck85lxnr81ay6b3ricfb08ry68x";
+ name = "ktrip-21.08.tar.xz";
+ };
+ };
+ kweather = {
+ version = "21.08";
+ src = fetchurl {
+ url = "${mirror}/stable/plasma-mobile/21.08/kweather-21.08.tar.xz";
+ sha256 = "0b1zjwsakwsnh6827zjhypvb04c78gwwygr7k1cy2x3finrp5if5";
+ name = "kweather-21.08.tar.xz";
};
};
plasma-dialer = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/plasma-dialer-21.05.tar.xz";
- sha256 = "0kwkjn7ry6snc86qi1j7kcq5qa6rbyk5i7v6gqf7a7wywkk9n045";
- name = "plasma-dialer-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/plasma-dialer-21.08.tar.xz";
+ sha256 = "14vgjg0nihhm446cfrrld1l43r50dlah5xs2ypdnm68618bdc7p1";
+ name = "plasma-dialer-21.08.tar.xz";
};
};
plasma-phonebook = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/plasma-phonebook-21.05.tar.xz";
- sha256 = "0aqqi3gvcsh4zg41zf8y0c626lwrabjchhr8pxj4n9la7y0wdvca";
- name = "plasma-phonebook-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/plasma-phonebook-21.08.tar.xz";
+ sha256 = "09gr5mkwhayx6k6bhm29bmcvdlqqw8jj7gydh5fz40g9z98c84km";
+ name = "plasma-phonebook-21.08.tar.xz";
};
};
plasma-settings = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/plasma-settings-21.05.tar.xz";
- sha256 = "16bhx0i8gvi9ina4jxzx02xyzypyjic9646lahxvzvzmd9hn9ipi";
- name = "plasma-settings-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/plasma-settings-21.08.tar.xz";
+ sha256 = "005v1gyrzl9b0k875p2wipja3l8l4awp8nl2d1jx7c28lqaspz2j";
+ name = "plasma-settings-21.08.tar.xz";
};
};
qmlkonsole = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/qmlkonsole-21.05.tar.xz";
- sha256 = "1ga48n09zlgvf5vvk2m26ak3ih5gjf361xxnyfprimmd7yj23han";
- name = "qmlkonsole-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/qmlkonsole-21.08.tar.xz";
+ sha256 = "1p3ysf6sgiji86400523hm67rvw3znj3a7k6g6s83dxynxdh2faq";
+ name = "qmlkonsole-21.08.tar.xz";
};
};
spacebar = {
- version = "21.05";
+ version = "21.08";
src = fetchurl {
- url = "${mirror}/stable/plasma-mobile/21.05/spacebar-21.05.tar.xz";
- sha256 = "16lvi5yzmvk6gb5m7csk44y2jbkk7psn1lkljmj1938p2475b94c";
- name = "spacebar-21.05.tar.xz";
+ url = "${mirror}/stable/plasma-mobile/21.08/spacebar-21.08.tar.xz";
+ sha256 = "1cg36iys4x7p97ywilnp2lzz1ry5a1m7jz38yh2yiw6m8wvzfqff";
+ name = "spacebar-21.08.tar.xz";
+ };
+ };
+ tokodon = {
+ version = "21.08";
+ src = fetchurl {
+ url = "${mirror}/stable/plasma-mobile/21.08/tokodon-21.08.tar.xz";
+ sha256 = "0j9zfcdss1872hv8xxrmy0jjmcz3y5kdz8gdrd6qmig5scrzjvnf";
+ name = "tokodon-21.08.tar.xz";
};
};
}
diff --git a/pkgs/applications/radio/freedv/default.nix b/pkgs/applications/radio/freedv/default.nix
new file mode 100644
index 000000000000..b369a5475e53
--- /dev/null
+++ b/pkgs/applications/radio/freedv/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, codec2
+, libsamplerate
+, libsndfile
+, lpcnetfreedv
+, portaudio
+, speexdsp
+, hamlib
+, wxGTK31-gtk3
+}:
+
+stdenv.mkDerivation rec {
+ pname = "freedv";
+ version = "1.6.1";
+
+ src = fetchFromGitHub {
+ owner = "drowe67";
+ repo = "freedv-gui";
+ rev = "v${version}";
+ sha256 = "1dzhf944vgla9a5ilcgwivhzgdbfaknqnwbpb071a0rz8rajnv0q";
+ };
+
+ nativeBuildInputs = [ cmake ];
+ buildInputs = [
+ codec2
+ libsamplerate
+ libsndfile
+ lpcnetfreedv
+ portaudio
+ speexdsp
+ hamlib
+ wxGTK31-gtk3
+ ];
+
+ cmakeFlags = [
+ "-DUSE_INTERNAL_CODEC2:BOOL=FALSE"
+ "-DUSE_STATIC_DEPS:BOOL=FALSE"
+ ];
+
+ meta = with lib; {
+ homepage = "https://freedv.org/";
+ description = "Digital voice for HF radio";
+ license = licenses.lgpl21;
+ maintainers = with maintainers; [ mvs ];
+ };
+}
diff --git a/pkgs/applications/radio/sdrangel/default.nix b/pkgs/applications/radio/sdrangel/default.nix
index fd742474ec13..4c22d0e9325e 100644
--- a/pkgs/applications/radio/sdrangel/default.nix
+++ b/pkgs/applications/radio/sdrangel/default.nix
@@ -33,13 +33,13 @@
mkDerivation rec {
pname = "sdrangel";
- version = "6.16.3";
+ version = "6.17.1";
src = fetchFromGitHub {
owner = "f4exb";
repo = "sdrangel";
rev = "v${version}";
- sha256 = "sha256-qgFnl9IliKRI4TptpXyK9JHzpLEUQ7NZLIfc0AROCvA=";
+ sha256 = "sha256-VWHFrgJVyI3CtLXUiG3/4/cRTD8jSdunbrro34yLKvs=";
fetchSubmodules = false;
};
diff --git a/pkgs/applications/version-management/gitoxide/default.nix b/pkgs/applications/version-management/gitoxide/default.nix
index b4bc0db4bac4..570a4c06abf9 100644
--- a/pkgs/applications/version-management/gitoxide/default.nix
+++ b/pkgs/applications/version-management/gitoxide/default.nix
@@ -1,22 +1,31 @@
-{ lib, stdenv, rustPlatform, cmake, fetchFromGitHub, pkg-config, openssl
-, libiconv, Security, SystemConfiguration }:
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, cmake
+, pkg-config
+, stdenv
+, libiconv
+, Security
+, SystemConfiguration
+, openssl
+}:
rustPlatform.buildRustPackage rec {
pname = "gitoxide";
- version = "0.8.4";
+ version = "0.10.0";
src = fetchFromGitHub {
owner = "Byron";
repo = "gitoxide";
rev = "v${version}";
- sha256 = "WH8YiW1X7TkURjncm0OefxrZhnhGHaGLwxRNxe17g/0=";
+ sha256 = "sha256-c29gmmkIOyS+HNq2kv53yq+sdEDmQbSmcvVGcd55/hk=";
};
- cargoSha256 = "eTPJMYl9m81o4PJKfpDs61KmehSvKnY+bgybEodOhAM=";
+ cargoSha256 = "sha256-oc7XpiOZj4bfqdwrEHj/CzNtWzYWFkgMJOySJNgxAGQ=";
nativeBuildInputs = [ cmake pkg-config ];
buildInputs = if stdenv.isDarwin
- then [ libiconv Security SystemConfiguration]
+ then [ libiconv Security SystemConfiguration ]
else [ openssl ];
# Needed to get openssl-sys to use pkg-config.
@@ -25,7 +34,8 @@ rustPlatform.buildRustPackage rec {
meta = with lib; {
description = "A command-line application for interacting with git repositories";
homepage = "https://github.com/Byron/gitoxide";
+ changelog = "https://github.com/Byron/gitoxide/blob/v${version}/CHANGELOG.md";
license = with licenses; [ mit /* or */ asl20 ];
- maintainers = [ maintainers.syberant ];
+ maintainers = with maintainers; [ syberant ];
};
}
diff --git a/pkgs/development/compilers/crystal/default.nix b/pkgs/development/compilers/crystal/default.nix
index 29e826c88d66..18f6da39b254 100644
--- a/pkgs/development/compilers/crystal/default.nix
+++ b/pkgs/development/compilers/crystal/default.nix
@@ -241,8 +241,8 @@ rec {
};
crystal_1_2 = generic {
- version = "1.2.0";
- sha256 = "sha256-38mmsolzmCnv+MFUMc+AEiklDLBHIr/jqXMLzc0nVq4=";
+ version = "1.2.1";
+ sha256 = "sha256-jyNmY3n+u8WoVqHY8B5H9Vr9Ix3RogCtm8irkXZ3aek=";
binary = crystal_1_1;
};
diff --git a/pkgs/development/libraries/kweathercore/default.nix b/pkgs/development/libraries/kweathercore/default.nix
new file mode 100644
index 000000000000..f3617059f1e7
--- /dev/null
+++ b/pkgs/development/libraries/kweathercore/default.nix
@@ -0,0 +1,35 @@
+{ mkDerivation
+, lib
+, fetchFromGitLab
+, extra-cmake-modules
+, ki18n
+, qtlocation
+}:
+
+mkDerivation rec {
+ pname = "kweathercore";
+ version = "0.5";
+
+ src = fetchFromGitLab {
+ domain = "invent.kde.org";
+ owner = "libraries";
+ repo = pname;
+ rev = "v${version}";
+ sha256 = "08ipabskhsbspkzzdlpwl89r070q8d0vc9500ma6d5i9fnpmkz6d";
+ };
+
+ buildInputs = [
+ ki18n
+ qtlocation
+ ];
+
+ nativeBuildInputs = [ extra-cmake-modules ];
+
+ meta = with lib; {
+ license = [ licenses.cc0 ];
+ maintainers = [ maintainers.samueldr ];
+ description = ''
+ Library to facilitate retrieval of weather information including forecasts and alerts
+ '';
+ };
+}
diff --git a/pkgs/development/libraries/lpcnetfreedv/default.nix b/pkgs/development/libraries/lpcnetfreedv/default.nix
new file mode 100644
index 000000000000..ac12d3a5fd6b
--- /dev/null
+++ b/pkgs/development/libraries/lpcnetfreedv/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchFromGitHub, fetchurl, cmake, codec2 }:
+
+let
+ dataVersion = "191005_v1.0";
+ data = fetchurl {
+ url = "http://rowetel.com/downloads/deep/lpcnet_${dataVersion}.tgz";
+ sha256 = "1j1695hm2pg6ri611f9kr3spm4yxvpikws55z9zxizai8y94152h";
+ };
+in stdenv.mkDerivation rec {
+ pname = "lpcnetfreedv";
+ version = "unstable-2021-06-29";
+
+ src = fetchFromGitHub {
+ owner = "drowe67";
+ repo = "LPCNet";
+ rev = "0dc5935bbf49ff3ba3c9654cc2f802838ebbaead";
+ sha256 = "0r6488z40fkar11ync8achpg5l6qz7y7cbh7cs3b3w4fsxn58q9i";
+ };
+
+ nativeBuildInputs = [ cmake ];
+ buildInputs = [ codec2 ];
+
+ postPatch = ''
+ mkdir build
+ ln -s ${data} build/lpcnet_${dataVersion}.tgz
+ '';
+
+ meta = with lib; {
+ homepage = "https://freedv.org/";
+ description = "Experimental Neural Net speech coding for FreeDV";
+ license = licenses.bsd3;
+ maintainers = with maintainers; [ mvs ];
+ };
+}
diff --git a/pkgs/development/libraries/pulseaudio-qt/default.nix b/pkgs/development/libraries/pulseaudio-qt/default.nix
index 03d656f91fae..c1ba89f05842 100644
--- a/pkgs/development/libraries/pulseaudio-qt/default.nix
+++ b/pkgs/development/libraries/pulseaudio-qt/default.nix
@@ -9,11 +9,11 @@
mkDerivation rec {
pname = "pulseaudio-qt";
- version = "1.2.0";
+ version = "1.3.0";
src = fetchurl {
url = "mirror://kde/stable/${pname}/${pname}-${lib.versions.majorMinor version}.tar.xz";
- sha256 = "1i0ql68kxv9jxs24rsd3s7jhjid3f2fq56fj4wbp16zb4wd14099";
+ sha256 = "1i4yb0v1mmhih8c2i61hybg6q60qys3pc5wbjb7a0vwl1mihgsxw";
};
buildInputs = [
diff --git a/pkgs/development/tools/delve/default.nix b/pkgs/development/tools/delve/default.nix
index 3ee608d4bb7f..bf0391fd755f 100644
--- a/pkgs/development/tools/delve/default.nix
+++ b/pkgs/development/tools/delve/default.nix
@@ -2,7 +2,7 @@
buildGoPackage rec {
pname = "delve";
- version = "1.7.1";
+ version = "1.7.2";
goPackagePath = "github.com/go-delve/delve";
excludedPackages = "\\(_fixtures\\|scripts\\|service/test\\)";
@@ -11,7 +11,7 @@ buildGoPackage rec {
owner = "go-delve";
repo = "delve";
rev = "v${version}";
- sha256 = "sha256-dnmV7LZjq86AwLWXfWBGm1pmFM0uipv1FwR6EhV8CZQ=";
+ sha256 = "sha256-Mye8Gh73yQ1fhjVpEOKBQGjdOzgMUqzdNiBjRRTteTg=";
};
subPackages = [ "cmd/dlv" ];
@@ -22,12 +22,16 @@ buildGoPackage rec {
# fortify source breaks build since delve compiles with -O0
wrapProgram $out/bin/dlv \
--prefix disableHardening " " fortify
+
+ # add symlink for vscode golang extension
+ # https://github.com/golang/vscode-go/blob/master/docs/debugging.md#manually-installing-dlv-dap
+ ln $out/bin/dlv $out/bin/dlv-dap
'';
meta = with lib; {
description = "debugger for the Go programming language";
homepage = "https://github.com/derekparker/delve";
- maintainers = with maintainers; [ vdemeester ];
+ maintainers = with maintainers; [ SuperSandro2000 vdemeester ];
license = licenses.mit;
platforms = [ "x86_64-linux" ] ++ platforms.darwin;
};
diff --git a/pkgs/development/tools/qtcreator/default.nix b/pkgs/development/tools/qtcreator/default.nix
index 8340891da01a..57a0f188dc8f 100644
--- a/pkgs/development/tools/qtcreator/default.nix
+++ b/pkgs/development/tools/qtcreator/default.nix
@@ -20,12 +20,12 @@ in
mkDerivation rec {
pname = "qtcreator";
- version = "4.14.0";
+ version = "5.0.2";
baseVersion = builtins.concatStringsSep "." (lib.take 2 (builtins.splitVersion version));
src = fetchurl {
url = "http://download.qt-project.org/official_releases/${pname}/${baseVersion}/${version}/qt-creator-opensource-src-${version}.tar.xz";
- sha256 = "07i045mzwbfhwj2jlijhz9xs6ay03qs5dgcw2kzlcr79a69i0h6j";
+ sha256 = "1bf07150226da46237f26f5eaa9f090ce81ed79b9bc75e0dfa6328043e360103";
};
buildInputs = [ qtbase qtscript qtquickcontrols qtdeclarative elfutils.dev ] ++
@@ -75,6 +75,8 @@ mkDerivation rec {
'';
postInstall = ''
+ mkdir -p $out/share/applications
+ cp share/applications/org.qt-project.qtcreator.desktop $out/share/applications
substituteInPlace $out/share/applications/org.qt-project.qtcreator.desktop \
--replace "Exec=qtcreator" "Exec=$out/bin/qtcreator"
'';
diff --git a/pkgs/games/factorio/update.py b/pkgs/games/factorio/update.py
index 3806ba3614f1..833a4ae068ea 100755
--- a/pkgs/games/factorio/update.py
+++ b/pkgs/games/factorio/update.py
@@ -89,7 +89,9 @@ def generate_our_versions(factorio_versions: FactorioVersionsJSON) -> OurVersion
for system in SYSTEMS:
for release_type in RELEASE_TYPES:
for release_channel in RELEASE_CHANNELS:
- version = factorio_versions[release_channel.name][release_type.name]
+ version = factorio_versions[release_channel.name].get(release_type.name)
+ if version == None:
+ continue
this_release = {
"name": f"factorio_{release_type.name}_{system.tar_name}-{version}.tar.xz",
"url": f"https://factorio.com/get-download/{version}/{release_type.name}/{system.url_name}",
diff --git a/pkgs/games/factorio/versions.json b/pkgs/games/factorio/versions.json
index d1175d9670e6..90d472605023 100644
--- a/pkgs/games/factorio/versions.json
+++ b/pkgs/games/factorio/versions.json
@@ -2,56 +2,48 @@
"x86_64-linux": {
"alpha": {
"experimental": {
- "name": "factorio_alpha_x64-1.1.39.tar.xz",
+ "name": "factorio_alpha_x64-1.1.42.tar.xz",
"needsAuth": true,
- "sha256": "1wyvk0niyppg7h9ayfsiy6x309bjwsbgf62nah13aps89jk8n1pc",
+ "sha256": "08h2pxzsk7sigjqnqm1jxya3i9i5g2mgl378gmbp2jcy2mnn4dvm",
"tarDirectory": "x64",
- "url": "https://factorio.com/get-download/1.1.39/alpha/linux64",
- "version": "1.1.39"
+ "url": "https://factorio.com/get-download/1.1.42/alpha/linux64",
+ "version": "1.1.42"
},
"stable": {
- "name": "factorio_alpha_x64-1.1.38.tar.xz",
+ "name": "factorio_alpha_x64-1.1.42.tar.xz",
"needsAuth": true,
- "sha256": "0cjhfyz4j06yn08n239ajjjpgykh39hzifhmd0ygr5szw9gdc851",
+ "sha256": "08h2pxzsk7sigjqnqm1jxya3i9i5g2mgl378gmbp2jcy2mnn4dvm",
"tarDirectory": "x64",
- "url": "https://factorio.com/get-download/1.1.38/alpha/linux64",
- "version": "1.1.38"
+ "url": "https://factorio.com/get-download/1.1.42/alpha/linux64",
+ "version": "1.1.42"
}
},
"demo": {
- "experimental": {
- "name": "factorio_demo_x64-1.1.37.tar.xz",
- "needsAuth": false,
- "sha256": "06qwx9wd3990d3256y9y5qsxa0936076jgwhinmrlvjp9lxwl4ly",
- "tarDirectory": "x64",
- "url": "https://factorio.com/get-download/1.1.37/demo/linux64",
- "version": "1.1.37"
- },
"stable": {
- "name": "factorio_demo_x64-1.1.38.tar.xz",
+ "name": "factorio_demo_x64-1.1.42.tar.xz",
"needsAuth": false,
- "sha256": "0y53w01dyfmavw1yxbjqjiirmvw32bnf9bqz0isnd72dvkg0kziv",
+ "sha256": "155m1ijdbc7szhpdw8f8g82ysd7av9zb6llqq4z96nn834px9m2d",
"tarDirectory": "x64",
- "url": "https://factorio.com/get-download/1.1.38/demo/linux64",
- "version": "1.1.38"
+ "url": "https://factorio.com/get-download/1.1.42/demo/linux64",
+ "version": "1.1.42"
}
},
"headless": {
"experimental": {
- "name": "factorio_headless_x64-1.1.39.tar.xz",
+ "name": "factorio_headless_x64-1.1.42.tar.xz",
"needsAuth": false,
- "sha256": "06figqmyd5bgwhpppziag4hs7x3ixr7wd8186cza3ly57bibha2m",
+ "sha256": "1l217fcjcwfi0g5dilsi703cl0wyxsqdqn422hwdbp2ql839k422",
"tarDirectory": "x64",
- "url": "https://factorio.com/get-download/1.1.39/headless/linux64",
- "version": "1.1.39"
+ "url": "https://factorio.com/get-download/1.1.42/headless/linux64",
+ "version": "1.1.42"
},
"stable": {
- "name": "factorio_headless_x64-1.1.38.tar.xz",
+ "name": "factorio_headless_x64-1.1.42.tar.xz",
"needsAuth": false,
- "sha256": "1c929pa9ifz0cvmx9k5yd267hjd5p7fdbln0czl3dq1vlskk1w71",
+ "sha256": "1l217fcjcwfi0g5dilsi703cl0wyxsqdqn422hwdbp2ql839k422",
"tarDirectory": "x64",
- "url": "https://factorio.com/get-download/1.1.38/headless/linux64",
- "version": "1.1.38"
+ "url": "https://factorio.com/get-download/1.1.42/headless/linux64",
+ "version": "1.1.42"
}
}
}
diff --git a/pkgs/servers/hqplayerd/default.nix b/pkgs/servers/hqplayerd/default.nix
index d2b46097ac10..3bda53ad1404 100644
--- a/pkgs/servers/hqplayerd/default.nix
+++ b/pkgs/servers/hqplayerd/default.nix
@@ -1,5 +1,6 @@
{ stdenv
, alsa-lib
+, addOpenGLRunpath
, autoPatchelfHook
, cairo
, fetchurl
@@ -28,7 +29,7 @@ stdenv.mkDerivation rec {
${rpmextract}/bin/rpmextract $src
'';
- nativeBuildInputs = [ autoPatchelfHook rpmextract ];
+ nativeBuildInputs = [ addOpenGLRunpath autoPatchelfHook rpmextract ];
buildInputs = [
alsa-lib
@@ -86,8 +87,12 @@ stdenv.mkDerivation rec {
--replace "NetworkManager-wait-online.service" ""
'';
- postFixup = ''
- patchelf --replace-needed libomp.so.5 libomp.so $out/bin/hqplayerd
+ # NB: addOpenGLRunpath needs to run _after_ autoPatchelfHook, which runs in
+ # postFixup, so we tack it on here.
+ doInstallCheck = true;
+ installCheckPhase = ''
+ addOpenGLRunpath $out/bin/hqplayerd
+ $out/bin/hqplayerd --version
'';
meta = with lib; {
diff --git a/pkgs/servers/sql/postgresql/packages.nix b/pkgs/servers/sql/postgresql/packages.nix
index 9cca7c8374bd..1986ed681997 100644
--- a/pkgs/servers/sql/postgresql/packages.nix
+++ b/pkgs/servers/sql/postgresql/packages.nix
@@ -1,8 +1,6 @@
self: super: {
- age = super.callPackage ./ext/age.nix {
- bison = self.bison_3_5;
- };
+ age = super.callPackage ./ext/age.nix { };
periods = super.callPackage ./ext/periods.nix { };
diff --git a/pkgs/servers/web-apps/discourse/default.nix b/pkgs/servers/web-apps/discourse/default.nix
index 592b981dd772..587cb363fc6e 100644
--- a/pkgs/servers/web-apps/discourse/default.nix
+++ b/pkgs/servers/web-apps/discourse/default.nix
@@ -266,6 +266,11 @@ let
# Make sure the notification email setting applies
./notification_email.patch
+
+ # Change the path to the public directory reported by Discourse
+ # to its real path instead of the symlink in the store, since
+ # the store path won't be matched by any nginx rules
+ ./public_dir_path.patch
];
postPatch = ''
diff --git a/pkgs/servers/web-apps/discourse/public_dir_path.patch b/pkgs/servers/web-apps/discourse/public_dir_path.patch
new file mode 100644
index 000000000000..0c6579736e22
--- /dev/null
+++ b/pkgs/servers/web-apps/discourse/public_dir_path.patch
@@ -0,0 +1,13 @@
+diff --git a/lib/file_store/local_store.rb b/lib/file_store/local_store.rb
+index 25649532c0..614e062dc1 100644
+--- a/lib/file_store/local_store.rb
++++ b/lib/file_store/local_store.rb
+@@ -88,7 +88,7 @@ module FileStore
+ end
+
+ def public_dir
+- File.join(Rails.root, "public")
++ "/run/discourse/public"
+ end
+
+ def tombstone_dir
diff --git a/pkgs/tools/misc/ethtool/default.nix b/pkgs/tools/misc/ethtool/default.nix
index 9457507458d8..e4ca354e4a3f 100644
--- a/pkgs/tools/misc/ethtool/default.nix
+++ b/pkgs/tools/misc/ethtool/default.nix
@@ -1,22 +1,32 @@
-{ lib, stdenv, fetchurl, pkg-config, libmnl }:
+{ lib
+, stdenv
+, fetchurl
+, libmnl
+, pkg-config
+}:
stdenv.mkDerivation rec {
pname = "ethtool";
- version = "5.13";
+ version = "5.14";
src = fetchurl {
url = "mirror://kernel/software/network/${pname}/${pname}-${version}.tar.xz";
- sha256 = "1wwcwiav0fbl75axmx8wms4xfdp1ji5c7j49k4yl8bngqra74fp6";
+ sha256 = "sha256-uxPbkZFcrNekkrZbZd8Hpn5Ll03b6vdiBbGUWiPSdoY=";
};
- nativeBuildInputs = [ pkg-config ];
- buildInputs = [ libmnl ];
+ nativeBuildInputs = [
+ pkg-config
+ ];
+
+ buildInputs = [
+ libmnl
+ ];
meta = with lib; {
description = "Utility for controlling network drivers and hardware";
homepage = "https://www.kernel.org/pub/software/network/ethtool/";
- license = licenses.gpl2;
+ license = licenses.gpl2Plus;
platforms = platforms.linux;
- maintainers = [ maintainers.bjornfor ];
+ maintainers = with maintainers; [ bjornfor ];
};
}
diff --git a/pkgs/tools/security/keysmith/default.nix b/pkgs/tools/security/keysmith/default.nix
deleted file mode 100644
index 142e9c1e4a04..000000000000
--- a/pkgs/tools/security/keysmith/default.nix
+++ /dev/null
@@ -1,40 +0,0 @@
-{ lib
-, mkDerivation
-, makeWrapper
-, fetchFromGitHub
-, cmake
-, extra-cmake-modules
-, qtbase
-, qtquickcontrols2
-, qtdeclarative
-, qtgraphicaleffects
-, kirigami2
-, oathToolkit
-, ki18n
-, libsodium
-}:
-mkDerivation rec {
-
- pname = "keysmith";
- version = "0.2";
-
- src = fetchFromGitHub {
- owner = "KDE";
- repo = "keysmith";
- rev = "v${version}";
- sha256 = "1gvzw23mly8cp7ag3xpbngpid9gqrfj8cyv9dar6i9j660bh03km";
- };
-
- nativeBuildInputs = [ cmake extra-cmake-modules makeWrapper ];
-
- buildInputs = [ libsodium ki18n oathToolkit kirigami2 qtquickcontrols2 qtbase ];
- propagatedBuildInput = [ oathToolkit ];
-
- meta = with lib; {
- description = "OTP client for Plasma Mobile and Desktop";
- license = licenses.gpl3;
- homepage = "https://github.com/KDE/keysmith";
- maintainers = with maintainers; [ shamilton ];
- platforms = platforms.linux;
- };
-}
diff --git a/pkgs/tools/text/anewer/default.nix b/pkgs/tools/text/anewer/default.nix
new file mode 100644
index 000000000000..e41b12cee447
--- /dev/null
+++ b/pkgs/tools/text/anewer/default.nix
@@ -0,0 +1,22 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+ pname = "anewer";
+ version = "0.1.6";
+
+ src = fetchFromGitHub {
+ owner = "ysf";
+ repo = pname;
+ rev = version;
+ sha256 = "181mi674354bddnq894yyq587w7skjh35vn61i41vfi6lqz5dy3d";
+ };
+
+ cargoSha256 = "sha256-LJ0l5CZM5NqdbCZe4ELkYf9EkKyBxL/LrNmFy+JS6gM=";
+
+ meta = with lib; {
+ description = "Append lines from stdin to a file if they don't already exist in the file";
+ homepage = "https://github.com/ysf/anewer";
+ license = licenses.gpl3Plus;
+ maintainers = with maintainers; [ figsoda ];
+ };
+}
diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix
index 726b7ab33af9..eb5abb37d382 100644
--- a/pkgs/top-level/aliases.nix
+++ b/pkgs/top-level/aliases.nix
@@ -53,6 +53,7 @@ mapAliases ({
aminal = throw "aminal was renamed to darktile."; # added 2021-09-28
ammonite-repl = ammonite; # added 2017-05-02
amsn = throw "amsn has been removed due to being unmaintained."; # added 2020-12-09
+ angelfish = libsForQt5.plasmaMobileGear.angelfish; # added 2021-10-06
antimicro = throw "antimicro has been removed as it was broken, see antimicroX instead."; # added 2020-08-06
arduino_core = arduino-core; # added 2015-02-04
ardour_5 = throw "ardour_5 has been removed. see https://github.com/NixOS/nixpkgs/issues/139549"; # added 2021-09-28
@@ -390,6 +391,7 @@ mapAliases ({
keepassx2-http = keepassx-reboot; # added 2016-10-17
kexectools = kexec-tools; # added 2021-09-03
keybase-go = keybase; # added 2016-08-24
+ keysmith = libsForQt5.plasmaMobileGear.keysmith; # added 2021-07-14
kinetic-cpp-client = throw "kinetic-cpp-client has been removed from nixpkgs, as it's abandoned."; # 2020-04-28
kicad-with-packages3d = kicad; # added 2019-11-25
kindlegen = throw "kindlegen has been removed from nixpkgs, as it's abandoned and no longer available for download."; # 2021-03-09
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 83bfaf3e9d42..1b7375f8126d 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -1178,6 +1178,8 @@ with pkgs;
stdenv = if stdenv.targetPlatform.isAarch64 then gcc10Stdenv else stdenv;
});
+ anewer = callPackage ../tools/text/anewer { };
+
angle-grinder = callPackage ../tools/text/angle-grinder {};
ansifilter = callPackage ../tools/text/ansifilter {};
@@ -6800,6 +6802,8 @@ with pkgs;
lottieconverter = callPackage ../tools/misc/lottieconverter { };
+ lpcnetfreedv = callPackage ../development/libraries/lpcnetfreedv { };
+
lsd = callPackage ../tools/misc/lsd { };
lsdvd = callPackage ../tools/cd-dvd/lsdvd {};
@@ -7036,8 +7040,6 @@ with pkgs;
kea = callPackage ../tools/networking/kea { };
- keysmith = libsForQt5.callPackage ../tools/security/keysmith { };
-
ispell = callPackage ../tools/text/ispell {};
iodash = callPackage ../development/libraries/iodash { };
@@ -23657,8 +23659,6 @@ with pkgs;
});
android-studio = androidStudioPackages.stable;
- angelfish = libsForQt5.callPackage ../applications/networking/browsers/angelfish { };
-
animbar = callPackage ../applications/graphics/animbar { };
antfs-cli = callPackage ../applications/misc/antfs-cli {};
@@ -24994,6 +24994,8 @@ with pkgs;
shiboken2;
};
+ freedv = callPackage ../applications/radio/freedv { };
+
freemind = callPackage ../applications/misc/freemind {
jdk = jdk8; # TODO: remove override https://github.com/NixOS/nixpkgs/pull/89731
jre = jre8; # TODO: remove override https://github.com/NixOS/nixpkgs/pull/89731
diff --git a/pkgs/top-level/qt5-packages.nix b/pkgs/top-level/qt5-packages.nix
index 21d11d339f3a..bc3f5524e6aa 100644
--- a/pkgs/top-level/qt5-packages.nix
+++ b/pkgs/top-level/qt5-packages.nix
@@ -108,6 +108,8 @@ in (kdeFrameworks // plasmaMobileGear // plasma5 // plasma5.thirdParty // kdeGea
kquickimageedit = callPackage ../development/libraries/kquickimageedit { };
+ kweathercore = libsForQt5.callPackage ../development/libraries/kweathercore { };
+
ldutils = callPackage ../development/libraries/ldutils { };
libcommuni = callPackage ../development/libraries/libcommuni { };