summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--maintainers/maintainer-list.nix6
-rw-r--r--nixos/doc/manual/from_md/release-notes/rl-2111.section.xml16
-rw-r--r--nixos/doc/manual/release-notes/rl-2111.section.md4
-rw-r--r--nixos/modules/services/web-apps/wordpress.nix126
-rw-r--r--nixos/tests/wordpress.nix66
-rw-r--r--pkgs/applications/blockchains/bitcoin.nix32
-rw-r--r--pkgs/applications/blockchains/elements.nix86
-rw-r--r--pkgs/applications/misc/dmenu/wayland.nix15
-rw-r--r--pkgs/applications/networking/instant-messengers/pidgin/default.nix17
-rw-r--r--pkgs/desktops/arcan/arcan.nix6
-rw-r--r--pkgs/desktops/arcan/default.nix2
-rw-r--r--pkgs/desktops/arcan/durden.nix6
-rw-r--r--pkgs/desktops/arcan/wrapper.nix2
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-feedback/default.nix8
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-music/default.nix15
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-photos/default.nix15
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-videos/default.nix4
-rw-r--r--pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix4
-rw-r--r--pkgs/desktops/pantheon/granite/default.nix4
-rw-r--r--pkgs/development/libraries/libgnt/default.nix37
-rw-r--r--pkgs/development/tools/rq/default.nix10
-rw-r--r--pkgs/servers/dns/knot-dns/default.nix4
-rw-r--r--pkgs/top-level/all-packages.nix9
23 files changed, 378 insertions, 116 deletions
diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix
index 7e4e02c5a7f..939d6121eee 100644
--- a/maintainers/maintainer-list.nix
+++ b/maintainers/maintainer-list.nix
@@ -7888,6 +7888,12 @@
     githubId = 757752;
     name = "Jonas Heinrich";
   };
+  ony = {
+    name = "Mykola Orliuk";
+    email = "virkony@gmail.com";
+    github = "ony";
+    githubId = 11265;
+  };
   OPNA2608 = {
     email = "christoph.neidahl@gmail.com";
     github = "OPNA2608";
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 b9967ffb982..fcaac9e8bec 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
@@ -546,6 +546,22 @@
           <literal>claws-mail-gtk2</literal> package.
         </para>
       </listitem>
+      <listitem>
+        <para>
+          The wordpress module provides a new interface which allows to
+          use different webservers with the new option
+          <link xlink:href="options.html#opt-services.wordpress.webserver"><literal>services.wordpress.webserver</literal></link>.
+          Currently <literal>httpd</literal> and
+          <literal>nginx</literal> are supported. The definitions of
+          wordpress sites should now be set in
+          <link xlink:href="options.html#opt-services.wordpress.sites"><literal>services.wordpress.sites</literal></link>.
+        </para>
+        <para>
+          Sites definitions that use the old interface are automatically
+          migrated in the new option. This backward compatibility will
+          be removed in 22.05.
+        </para>
+      </listitem>
     </itemizedlist>
   </section>
 </section>
diff --git a/nixos/doc/manual/release-notes/rl-2111.section.md b/nixos/doc/manual/release-notes/rl-2111.section.md
index 377dbf598d9..030f1d21818 100644
--- a/nixos/doc/manual/release-notes/rl-2111.section.md
+++ b/nixos/doc/manual/release-notes/rl-2111.section.md
@@ -135,3 +135,7 @@ In addition to numerous new and upgraded packages, this release has the followin
 - Sway: The terminal emulator `rxvt-unicode` is no longer installed by default via `programs.sway.extraPackages`. The current default configuration uses `alacritty` (and soon `foot`) so this is only an issue when using a customized configuration and not installing `rxvt-unicode` explicitly.
 
 - The `claws-mail` package now references the new GTK+ 3 release branch, major version 4. To use the GTK+ 2 releases, one can install the `claws-mail-gtk2` package.
+
+- The wordpress module provides a new interface which allows to use different webservers with the new option [`services.wordpress.webserver`](options.html#opt-services.wordpress.webserver).  Currently `httpd` and `nginx` are supported. The definitions of wordpress sites should now be set in [`services.wordpress.sites`](options.html#opt-services.wordpress.sites).
+
+  Sites definitions that use the old interface are automatically migrated in the new option. This backward compatibility will be removed in 22.05.
diff --git a/nixos/modules/services/web-apps/wordpress.nix b/nixos/modules/services/web-apps/wordpress.nix
index 775ecb3acaf..6f1ef815bc4 100644
--- a/nixos/modules/services/web-apps/wordpress.nix
+++ b/nixos/modules/services/web-apps/wordpress.nix
@@ -3,13 +3,18 @@
 let
   inherit (lib) mkDefault mkEnableOption mkForce mkIf mkMerge mkOption types;
   inherit (lib) any attrValues concatMapStringsSep flatten literalExample;
-  inherit (lib) mapAttrs mapAttrs' mapAttrsToList nameValuePair optional optionalAttrs optionalString;
+  inherit (lib) filterAttrs mapAttrs mapAttrs' mapAttrsToList nameValuePair optional optionalAttrs optionalString;
 
-  eachSite = config.services.wordpress;
+  cfg = migrateOldAttrs config.services.wordpress;
+  eachSite = cfg.sites;
   user = "wordpress";
-  group = config.services.httpd.group;
+  webserver = config.services.${cfg.webserver};
   stateDir = hostName: "/var/lib/wordpress/${hostName}";
 
+  # Migrate config.services.wordpress.<hostName> to config.services.wordpress.sites.<hostName>
+  oldSites = filterAttrs (o: _: o != "sites" && o != "webserver");
+  migrateOldAttrs = cfg: cfg // { sites = cfg.sites // oldSites cfg; };
+
   pkg = hostName: cfg: pkgs.stdenv.mkDerivation rec {
     pname = "wordpress-${hostName}";
     version = src.version;
@@ -261,21 +266,48 @@ in
   # interface
   options = {
     services.wordpress = mkOption {
-      type = types.attrsOf (types.submodule siteOpts);
+      type = types.submodule {
+        # Used to support old interface
+        freeformType = types.attrsOf (types.submodule siteOpts);
+
+        # New interface
+        options.sites = mkOption {
+          type = types.attrsOf (types.submodule siteOpts);
+          default = {};
+          description = "Specification of one or more WordPress sites to serve";
+        };
+
+        options.webserver = mkOption {
+          type = types.enum [ "httpd" "nginx" ];
+          default = "httpd";
+          description = ''
+            Whether to use apache2 or nginx for virtual host management.
+
+            Further nginx configuration can be done by adapting <literal>services.nginx.virtualHosts.&lt;name&gt;</literal>.
+            See <xref linkend="opt-services.nginx.virtualHosts"/> for further information.
+
+            Further apache2 configuration can be done by adapting <literal>services.httpd.virtualHosts.&lt;name&gt;</literal>.
+            See <xref linkend="opt-services.httpd.virtualHosts"/> for further information.
+          '';
+        };
+      };
       default = {};
-      description = "Specification of one or more WordPress sites to serve via Apache.";
+      description = "Wordpress configuration";
     };
+
   };
 
   # implementation
-  config = mkIf (eachSite != {}) {
+  config = mkIf (eachSite != {}) (mkMerge [{
 
     assertions = mapAttrsToList (hostName: cfg:
       { assertion = cfg.database.createLocally -> cfg.database.user == user;
-        message = "services.wordpress.${hostName}.database.user must be ${user} if the database is to be automatically provisioned";
+        message = ''services.wordpress.sites."${hostName}".database.user must be ${user} if the database is to be automatically provisioned'';
       }
     ) eachSite;
 
+    warnings = mapAttrsToList (hostName: _: ''services.wordpress."${hostName}" is deprecated use services.wordpress.sites."${hostName}"'') (oldSites cfg);
+
     services.mysql = mkIf (any (v: v.database.createLocally) (attrValues eachSite)) {
       enable = true;
       package = mkDefault pkgs.mariadb;
@@ -289,14 +321,18 @@ in
 
     services.phpfpm.pools = mapAttrs' (hostName: cfg: (
       nameValuePair "wordpress-${hostName}" {
-        inherit user group;
+        inherit user;
+        group = webserver.group;
         settings = {
-          "listen.owner" = config.services.httpd.user;
-          "listen.group" = config.services.httpd.group;
+          "listen.owner" = webserver.user;
+          "listen.group" = webserver.group;
         } // cfg.poolConfig;
       }
     )) eachSite;
 
+  }
+
+  (mkIf (cfg.webserver == "httpd") {
     services.httpd = {
       enable = true;
       extraModules = [ "proxy_fcgi" ];
@@ -332,11 +368,13 @@ in
         '';
       } ]) eachSite;
     };
+  })
 
+  {
     systemd.tmpfiles.rules = flatten (mapAttrsToList (hostName: cfg: [
-      "d '${stateDir hostName}' 0750 ${user} ${group} - -"
-      "d '${cfg.uploadsDir}' 0750 ${user} ${group} - -"
-      "Z '${cfg.uploadsDir}' 0750 ${user} ${group} - -"
+      "d '${stateDir hostName}' 0750 ${user} ${webserver.group} - -"
+      "d '${cfg.uploadsDir}' 0750 ${user} ${webserver.group} - -"
+      "Z '${cfg.uploadsDir}' 0750 ${user} ${webserver.group} - -"
     ]) eachSite);
 
     systemd.services = mkMerge [
@@ -350,7 +388,7 @@ in
           serviceConfig = {
             Type = "oneshot";
             User = user;
-            Group = group;
+            Group = webserver.group;
           };
       })) eachSite)
 
@@ -360,9 +398,65 @@ in
     ];
 
     users.users.${user} = {
-      group = group;
+      group = webserver.group;
       isSystemUser = true;
     };
+  }
 
-  };
+  (mkIf (cfg.webserver == "nginx") {
+    services.nginx = {
+      enable = true;
+      virtualHosts = mapAttrs (hostName: cfg: {
+        serverName = mkDefault hostName;
+        root = "${pkg hostName cfg}/share/wordpress";
+        extraConfig = ''
+          index index.php;
+        '';
+        locations = {
+          "/" = {
+            priority = 200;
+            extraConfig = ''
+              try_files $uri $uri/ /index.php$is_args$args;
+            '';
+          };
+          "~ \\.php$" = {
+            priority = 500;
+            extraConfig = ''
+              fastcgi_split_path_info ^(.+\.php)(/.+)$;
+              fastcgi_pass unix:${config.services.phpfpm.pools."wordpress-${hostName}".socket};
+              fastcgi_index index.php;
+              include "${config.services.nginx.package}/conf/fastcgi.conf";
+              fastcgi_param PATH_INFO $fastcgi_path_info;
+              fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
+              # Mitigate https://httpoxy.org/ vulnerabilities
+              fastcgi_param HTTP_PROXY "";
+              fastcgi_intercept_errors off;
+              fastcgi_buffer_size 16k;
+              fastcgi_buffers 4 16k;
+              fastcgi_connect_timeout 300;
+              fastcgi_send_timeout 300;
+              fastcgi_read_timeout 300;
+            '';
+          };
+          "~ /\\." = {
+            priority = 800;
+            extraConfig = "deny all;";
+          };
+          "~* /(?:uploads|files)/.*\\.php$" = {
+            priority = 900;
+            extraConfig = "deny all;";
+          };
+          "~* \\.(js|css|png|jpg|jpeg|gif|ico)$" = {
+            priority = 1000;
+            extraConfig = ''
+              expires max;
+              log_not_found off;
+            '';
+          };
+        };
+      }) eachSite;
+    };
+  })
+
+  ]);
 }
diff --git a/nixos/tests/wordpress.nix b/nixos/tests/wordpress.nix
index a5c10c2de74..45c58b5b65c 100644
--- a/nixos/tests/wordpress.nix
+++ b/nixos/tests/wordpress.nix
@@ -10,48 +10,68 @@ import ./make-test-python.nix ({ pkgs, ... }:
     ];
   };
 
-  machine =
-    { ... }:
-    { services.httpd.adminAddr = "webmaster@site.local";
+  nodes = {
+    wp_httpd = { ... }: {
+      services.httpd.adminAddr = "webmaster@site.local";
       services.httpd.logPerVirtualHost = true;
 
-      services.wordpress."site1.local" = {
-        database.tablePrefix = "site1_";
+      services.wordpress = {
+        # Test support for old interface
+        "site1.local" = {
+          database.tablePrefix = "site1_";
+        };
+        sites = {
+          "site2.local" = {
+            database.tablePrefix = "site2_";
+          };
+        };
       };
 
-      services.wordpress."site2.local" = {
-        database.tablePrefix = "site2_";
+      networking.firewall.allowedTCPPorts = [ 80 ];
+      networking.hosts."127.0.0.1" = [ "site1.local" "site2.local" ];
+    };
+
+    wp_nginx = { ... }: {
+      services.wordpress.webserver = "nginx";
+      services.wordpress.sites = {
+        "site1.local" = {
+          database.tablePrefix = "site1_";
+        };
+        "site2.local" = {
+          database.tablePrefix = "site2_";
+        };
       };
 
+      networking.firewall.allowedTCPPorts = [ 80 ];
       networking.hosts."127.0.0.1" = [ "site1.local" "site2.local" ];
     };
+  };
 
   testScript = ''
     import re
 
     start_all()
 
-    machine.wait_for_unit("httpd")
-
-    machine.wait_for_unit("phpfpm-wordpress-site1.local")
-    machine.wait_for_unit("phpfpm-wordpress-site2.local")
+    wp_httpd.wait_for_unit("httpd")
+    wp_nginx.wait_for_unit("nginx")
 
     site_names = ["site1.local", "site2.local"]
 
-    with subtest("website returns welcome screen"):
+    for machine in (wp_httpd, wp_nginx):
         for site_name in site_names:
-            assert "Welcome to the famous" in machine.succeed(f"curl -fL {site_name}")
+            machine.wait_for_unit(f"phpfpm-wordpress-{site_name}")
 
-    with subtest("wordpress-init went through"):
-        for site_name in site_names:
-            info = machine.get_unit_info(f"wordpress-init-{site_name}")
-            assert info["Result"] == "success"
+            with subtest("website returns welcome screen"):
+                assert "Welcome to the famous" in machine.succeed(f"curl -L {site_name}")
 
-    with subtest("secret keys are set"):
-        pattern = re.compile(r"^define.*NONCE_SALT.{64,};$", re.MULTILINE)
-        for site_name in site_names:
-            assert pattern.search(
-                machine.succeed(f"cat /var/lib/wordpress/{site_name}/secret-keys.php")
-            )
+            with subtest("wordpress-init went through"):
+                info = machine.get_unit_info(f"wordpress-init-{site_name}")
+                assert info["Result"] == "success"
+
+            with subtest("secret keys are set"):
+                pattern = re.compile(r"^define.*NONCE_SALT.{64,};$", re.MULTILINE)
+                assert pattern.search(
+                    machine.succeed(f"cat /var/lib/wordpress/{site_name}/secret-keys.php")
+                )
   '';
 })
diff --git a/pkgs/applications/blockchains/bitcoin.nix b/pkgs/applications/blockchains/bitcoin.nix
index 162a5ddee1a..00727d294df 100644
--- a/pkgs/applications/blockchains/bitcoin.nix
+++ b/pkgs/applications/blockchains/bitcoin.nix
@@ -1,21 +1,22 @@
-{ lib, stdenv
+{ lib
+, stdenv
 , fetchurl
-, pkg-config
 , autoreconfHook
-, db48
-, sqlite
+, pkg-config
+, util-linux
+, hexdump
+, wrapQtAppsHook ? null
 , boost
+, libevent
+, miniupnpc
 , zeromq
-, hexdump
 , zlib
-, miniupnpc
+, db48
+, sqlite
+, qrencode
 , qtbase ? null
 , qttools ? null
-, wrapQtAppsHook ? null
-, util-linux
 , python3
-, qrencode
-, libevent
 , nixosTests
 , withGui
 , withWallet ? true
@@ -43,13 +44,14 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs =
-    [ pkg-config autoreconfHook ]
-    ++ optional stdenv.isDarwin hexdump
-    ++ optional withGui wrapQtAppsHook;
-  buildInputs = [ boost zlib zeromq miniupnpc libevent ]
+    [ autoreconfHook pkg-config ]
     ++ optionals stdenv.isLinux [ util-linux ]
+    ++ optionals stdenv.isDarwin [ hexdump ]
+    ++ optionals withGui [ wrapQtAppsHook ];
+
+  buildInputs = [ boost libevent miniupnpc zeromq zlib ]
     ++ optionals withWallet [ db48 sqlite ]
-    ++ optionals withGui [ qtbase qttools qrencode ];
+    ++ optionals withGui [ qrencode qtbase qttools ];
 
   postInstall = optional withGui ''
     install -Dm644 ${desktop} $out/share/applications/bitcoin-qt.desktop
diff --git a/pkgs/applications/blockchains/elements.nix b/pkgs/applications/blockchains/elements.nix
new file mode 100644
index 00000000000..c44f2078dae
--- /dev/null
+++ b/pkgs/applications/blockchains/elements.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, fetchurl
+, autoreconfHook
+, pkg-config
+, util-linux
+, hexdump
+, wrapQtAppsHook ? null
+, boost
+, libevent
+, miniupnpc
+, zeromq
+, zlib
+, db48
+, sqlite
+, qrencode
+, qtbase ? null
+, qttools ? null
+, python3
+, openssl
+, withGui
+, withWallet ? true
+}:
+
+with lib;
+stdenv.mkDerivation rec {
+  pname = if withGui then "elements" else "elementsd";
+  version = "0.18.1.12";
+
+  src = fetchurl {
+    url = "https://github.com/ElementsProject/elements/archive/elements-${version}.tar.gz";
+    sha256 = "84a51013596b09c62913649ac90373622185f779446ee7e65b4b258a2876609f";
+  };
+
+  nativeBuildInputs =
+    [ autoreconfHook pkg-config ]
+    ++ optionals stdenv.isLinux [ util-linux ]
+    ++ optionals stdenv.isDarwin [ hexdump ]
+    ++ optionals withGui [ wrapQtAppsHook ];
+
+  buildInputs = [ boost libevent miniupnpc zeromq zlib openssl ]
+    ++ optionals withWallet [ db48 sqlite ]
+    ++ optionals withGui [ qrencode qtbase qttools ];
+
+  configureFlags = [
+    "--with-boost-libdir=${boost.out}/lib"
+    "--disable-bench"
+  ] ++ optionals (!doCheck) [
+    "--disable-tests"
+    "--disable-gui-tests"
+  ] ++ optionals (!withWallet) [
+    "--disable-wallet"
+  ] ++ optionals withGui [
+    "--with-gui=qt5"
+    "--with-qt-bindir=${qtbase.dev}/bin:${qttools.dev}/bin"
+  ];
+
+  checkInputs = [ python3 ];
+
+  doCheck = true;
+
+  checkFlags =
+    [ "LC_ALL=C.UTF-8" ]
+    # QT_PLUGIN_PATH needs to be set when executing QT, which is needed when testing Bitcoin's GUI.
+    # See also https://github.com/NixOS/nixpkgs/issues/24256
+    ++ optional withGui "QT_PLUGIN_PATH=${qtbase}/${qtbase.qtPluginPrefix}";
+
+  enableParallelBuilding = true;
+
+  meta = {
+    description = "Open Source implementation of advanced blockchain features extending the Bitcoin protocol";
+    longDescription= ''
+      The Elements blockchain platform is a collection of feature experiments and extensions to the
+      Bitcoin protocol. This platform enables anyone to build their own businesses or networks
+      pegged to Bitcoin as a sidechain or run as a standalone blockchain with arbitrary asset
+      tokens.
+    '';
+    homepage = "https://www.github.com/ElementsProject/elements";
+    maintainers = with maintainers; [ prusnak ];
+    license = licenses.mit;
+    platforms = platforms.unix;
+    # Qt GUI is currently broken in upstream
+    # No rule to make target 'qt/res/rendered_icons/about.png', needed by 'qt/qrc_bitcoin.cpp'.
+    broken = withGui;
+  };
+}
diff --git a/pkgs/applications/misc/dmenu/wayland.nix b/pkgs/applications/misc/dmenu/wayland.nix
index 8d77588ce8f..6b8f92ddb1c 100644
--- a/pkgs/applications/misc/dmenu/wayland.nix
+++ b/pkgs/applications/misc/dmenu/wayland.nix
@@ -1,5 +1,6 @@
 { lib, stdenv, fetchFromGitHub, meson, ninja, cairo, pango, pkg-config, wayland-protocols
-, glib, wayland, libxkbcommon, makeWrapper
+, glib, wayland, libxkbcommon, makeWrapper, wayland-scanner
+, fetchpatch
 }:
 
 stdenv.mkDerivation rec {
@@ -15,9 +16,19 @@ stdenv.mkDerivation rec {
 
   outputs = [ "out" "man" ];
 
-  nativeBuildInputs = [ meson ninja pkg-config makeWrapper ];
+  depsBuildBuild = [ pkg-config ];
+  nativeBuildInputs = [ meson ninja pkg-config makeWrapper wayland-scanner ];
   buildInputs = [ cairo pango wayland-protocols glib wayland libxkbcommon ];
 
+  # Patch to support cross-compilation, see https://github.com/nyyManni/dmenu-wayland/pull/23/
+  patches = [
+    # can be removed when https://github.com/nyyManni/dmenu-wayland/pull/23 is included
+    (fetchpatch {
+      url = "https://github.com/nyyManni/dmenu-wayland/commit/3434410de5dcb007539495395f7dc5421923dd3a.patch";
+      sha256 = "sha256-im16kU8RWrCY0btYOYjDp8XtfGEivemIPlhwPX0C77o=";
+    })
+  ];
+
   postInstall = ''
     wrapProgram $out/bin/dmenu-wl_run \
       --prefix PATH : $out/bin
diff --git a/pkgs/applications/networking/instant-messengers/pidgin/default.nix b/pkgs/applications/networking/instant-messengers/pidgin/default.nix
index dc5a8739760..b5bdef03db7 100644
--- a/pkgs/applications/networking/instant-messengers/pidgin/default.nix
+++ b/pkgs/applications/networking/instant-messengers/pidgin/default.nix
@@ -2,8 +2,9 @@
 , gtkspell2, aspell
 , gst_all_1, startupnotification, gettext
 , perlPackages, libxml2, nss, nspr, farstream
-, libXScrnSaver, ncurses, avahi, dbus, dbus-glib, intltool, libidn
-, lib, python, libICE, libXext, libSM
+, libXScrnSaver, avahi, dbus, dbus-glib, intltool, libidn
+, lib, python3, libICE, libXext, libSM
+, libgnt, ncurses
 , cyrus_sasl ? null
 , openssl ? null
 , gnutls ? null
@@ -16,28 +17,27 @@
 let unwrapped = stdenv.mkDerivation rec {
   pname = "pidgin";
   majorVersion = "2";
-  version = "${majorVersion}.13.0";
+  version = "${majorVersion}.14.6";
 
   src = fetchurl {
     url = "mirror://sourceforge/pidgin/${pname}-${version}.tar.bz2";
-    sha256 = "13vdqj70315p9rzgnbxjp9c51mdzf1l4jg1kvnylc4bidw61air7";
+    sha256 = "bb45f7c032f9efd6922a5dbf2840995775e5584771b23992d04f6eff7dff5336";
   };
 
-  inherit nss ncurses;
-
   nativeBuildInputs = [ makeWrapper ];
 
   NIX_CFLAGS_COMPILE = "-I${gst_all_1.gst-plugins-base.dev}/include/gstreamer-1.0";
 
   buildInputs = let
-    python-with-dbus = python.withPackages (pp: with pp; [ dbus-python ]);
+    python-with-dbus = python3.withPackages (pp: with pp; [ dbus-python ]);
   in [
     aspell startupnotification
     gst_all_1.gstreamer gst_all_1.gst-plugins-base gst_all_1.gst-plugins-good
     libxml2 nss nspr
-    libXScrnSaver ncurses python-with-dbus
+    libXScrnSaver python-with-dbus
     avahi dbus dbus-glib intltool libidn
     libICE libXext libSM cyrus_sasl
+    libgnt ncurses # optional: build finch - the console UI
   ]
   ++ (lib.optional (openssl != null) openssl)
   ++ (lib.optional (gnutls != null) gnutls)
@@ -62,6 +62,7 @@ let unwrapped = stdenv.mkDerivation rec {
     "--disable-meanwhile"
     "--disable-nm"
     "--disable-tcl"
+    "--disable-gevolution"
   ]
   ++ (lib.optionals (cyrus_sasl != null) [ "--enable-cyrus-sasl=yes" ])
   ++ (lib.optionals (gnutls != null) ["--enable-gnutls=yes" "--enable-nss=no"])
diff --git a/pkgs/desktops/arcan/arcan.nix b/pkgs/desktops/arcan/arcan.nix
index 8a30da9e81f..c6a57ecc3bd 100644
--- a/pkgs/desktops/arcan/arcan.nix
+++ b/pkgs/desktops/arcan/arcan.nix
@@ -52,13 +52,13 @@ let
 in
 stdenv.mkDerivation rec {
   pname = "arcan";
-  version = "0.6.1pre1+unstable=2021-07-07";
+  version = "0.6.1pre1+unstable=2021-07-10";
 
   src = fetchFromGitHub {
     owner = "letoram";
     repo = "arcan";
-    rev = "f3341ab94b32d02f3d15c3b91a512b2614e950a5";
-    hash = "sha256-YBtRA5uCk4tjX3Bsu5vMkaNaCLRlM6HVQ53sna3gDsY=";
+    rev = "25da999e6e03688c71c7df3852314c01ed610e0d";
+    hash = "sha256-+ZF6mD/Z0N/5QCjXe80z4L6JOE33+Yv4ZlwKvlG/c44=";
   };
 
   postUnpack = ''
diff --git a/pkgs/desktops/arcan/default.nix b/pkgs/desktops/arcan/default.nix
index dba284f0100..874035c4801 100644
--- a/pkgs/desktops/arcan/default.nix
+++ b/pkgs/desktops/arcan/default.nix
@@ -37,6 +37,6 @@ rec {
 
   everyone-wrapped = callPackage ./wrapper.nix {
     name = "everyone-wrapped";
-    appls = [ durden pipeworld prio ];
+    appls = [ durden pipeworld ];
   };
 }
diff --git a/pkgs/desktops/arcan/durden.nix b/pkgs/desktops/arcan/durden.nix
index cfe41cb6ec2..f6837f96fb6 100644
--- a/pkgs/desktops/arcan/durden.nix
+++ b/pkgs/desktops/arcan/durden.nix
@@ -5,13 +5,13 @@
 
 stdenv.mkDerivation rec {
   pname = "durden";
-  version = "0.6.1+unstable=2021-06-25";
+  version = "0.6.1+unstable=2021-07-11";
 
   src = fetchFromGitHub {
     owner = "letoram";
     repo = pname;
-    rev = "fb618fccc57a68b6ce933b4df5822acd1965d591";
-    hash = "sha256-PovI837Xca4wV0g0s4tYUMFGVUDf+f8HcdvM1+0aDxk=";
+    rev = "8e0a5c07cade9ad9f606781615c9ebae7b28b6d5";
+    hash = "sha256-4cGuCAeYmmr4ACWt2akVQu2cPqqyE6p+XFaKWcFf3t0=";
   };
 
   installPhase = ''
diff --git a/pkgs/desktops/arcan/wrapper.nix b/pkgs/desktops/arcan/wrapper.nix
index a8b93ca1dea..4368b0ad3a5 100644
--- a/pkgs/desktops/arcan/wrapper.nix
+++ b/pkgs/desktops/arcan/wrapper.nix
@@ -21,7 +21,7 @@ symlinkJoin rec {
         --set ARCAN_LIBPATH "${placeholder "out"}/lib/" \
         --set ARCAN_RESOURCEPATH "${placeholder "out"}/share/arcan/resources/" \
         --set ARCAN_SCRIPTPATH "${placeholder "out"}/share/arcan/scripts/" \
-        --set ARCAN_STATEBASEPATH "$HOME/.arcan/resources/savestates/"
+        --set ARCAN_STATEBASEPATH "\$HOME/.arcan/resources/savestates/"
     done
   '';
 }
diff --git a/pkgs/desktops/pantheon/apps/elementary-feedback/default.nix b/pkgs/desktops/pantheon/apps/elementary-feedback/default.nix
index 21aeb38530f..2e20314d480 100644
--- a/pkgs/desktops/pantheon/apps/elementary-feedback/default.nix
+++ b/pkgs/desktops/pantheon/apps/elementary-feedback/default.nix
@@ -11,15 +11,17 @@
 , glib
 , granite
 , libgee
+, libhandy
 , elementary-icon-theme
 , elementary-gtk-theme
 , gettext
 , wrapGAppsHook
+, appstream
 }:
 
 stdenv.mkDerivation rec {
   pname = "elementary-feedback";
-  version = "1.0";
+  version = "6.0.0";
 
   repoName = "feedback";
 
@@ -27,7 +29,7 @@ stdenv.mkDerivation rec {
     owner = "elementary";
     repo = repoName;
     rev = version;
-    sha256 = "sha256-GkVnowqGXwnEgplT34Po/BKzC2F/IQE2kIw0SLSLhGU=";
+    sha256 = "1fh9a0nfvbrxamki9avm9by760csj2nqy4ya7wzbnqbrrvjwd3fv";
   };
 
   passthru = {
@@ -47,11 +49,13 @@ stdenv.mkDerivation rec {
   ];
 
   buildInputs = [
+    appstream
     elementary-icon-theme
     granite
     gtk3
     elementary-gtk-theme
     libgee
+    libhandy
     glib
   ];
 
diff --git a/pkgs/desktops/pantheon/apps/elementary-music/default.nix b/pkgs/desktops/pantheon/apps/elementary-music/default.nix
index 5a5c314b3e9..fe6c3f187fe 100644
--- a/pkgs/desktops/pantheon/apps/elementary-music/default.nix
+++ b/pkgs/desktops/pantheon/apps/elementary-music/default.nix
@@ -1,6 +1,5 @@
 { lib, stdenv
 , fetchFromGitHub
-, fetchpatch
 , nix-update-script
 , pantheon
 , pkg-config
@@ -16,6 +15,7 @@
 , json-glib
 , libgda
 , libgpod
+, libhandy
 , libnotify
 , libpeas
 , libsoup
@@ -31,7 +31,7 @@
 
 stdenv.mkDerivation rec {
   pname = "elementary-music";
-  version = "5.0.5";
+  version = "5.1.0";
 
   repoName = "music";
 
@@ -39,17 +39,9 @@ stdenv.mkDerivation rec {
     owner = "elementary";
     repo = repoName;
     rev = version;
-    sha256 = "sha256-3GZoBCu9rF+BnNk9APBzKWO1JYg1XYWwrEvwcjWvYDE=";
+    sha256 = "13v7rii9ardyd661s6d4hvvs4ig44v7s3qd1bx7imaigr72gg58b";
   };
 
-  patches = [
-    # Fix build with latest Vala.
-    (fetchpatch {
-      url = "https://github.com/elementary/music/commit/9ed3bbb3a0d68e289a772b4603f58e52a4973316.patch";
-      sha256 = "fFO97SQzTc2fYFJFGfFPSUCdkCgZxfX1fjDQ7GH4BUs=";
-    })
-  ];
-
   passthru = {
     updateScript = nix-update-script {
       attrPath = "pantheon.${pname}";
@@ -82,6 +74,7 @@ stdenv.mkDerivation rec {
     libgda
     libgee
     libgpod
+    libhandy
     libnotify
     libpeas
     libsignon-glib
diff --git a/pkgs/desktops/pantheon/apps/elementary-photos/default.nix b/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
index 7280051361a..bced420dbc0 100644
--- a/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
+++ b/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
@@ -1,6 +1,5 @@
 { lib, stdenv
 , fetchFromGitHub
-, fetchpatch
 , nix-update-script
 , pantheon
 , meson
@@ -12,6 +11,7 @@
 , libaccounts-glib
 , libexif
 , libgee
+, libhandy
 , geocode-glib
 , gexiv2
 , libgphoto2
@@ -35,7 +35,7 @@
 
 stdenv.mkDerivation rec {
   pname = "elementary-photos";
-  version = "2.7.0";
+  version = "2.7.1";
 
   repoName = "photos";
 
@@ -43,17 +43,9 @@ stdenv.mkDerivation rec {
     owner = "elementary";
     repo = repoName;
     rev = version;
-    sha256 = "sha256-bTk4shryAWWMrKX3mza6xQ05qpBPf80Ey7fmYgKLUiY=";
+    sha256 = "1dql14k43rv3in451amiwv4z71hz3ailx67hd8gw1ka3yw12128p";
   };
 
-  patches = [
-    # Fix build with latest Vala.
-    (fetchpatch {
-      url = "https://github.com/elementary/photos/commit/27e529fc96da828982563e2e19a6f0cef883a29e.patch";
-      sha256 = "w39wh45VHggCs62TN6wpUEyz/hJ1y7qL1Ox+sp0Pt2s=";
-    })
-  ];
-
   passthru = {
     updateScript = nix-update-script {
       attrPath = "pantheon.${pname}";
@@ -88,6 +80,7 @@ stdenv.mkDerivation rec {
     libgee
     libgphoto2
     libgudev
+    libhandy
     libraw
     librest
     libsoup
diff --git a/pkgs/desktops/pantheon/apps/elementary-videos/default.nix b/pkgs/desktops/pantheon/apps/elementary-videos/default.nix
index e5506093719..95df9a613a8 100644
--- a/pkgs/desktops/pantheon/apps/elementary-videos/default.nix
+++ b/pkgs/desktops/pantheon/apps/elementary-videos/default.nix
@@ -20,7 +20,7 @@
 
 stdenv.mkDerivation rec {
   pname = "elementary-videos";
-  version = "2.7.2";
+  version = "2.7.3";
 
   repoName = "videos";
 
@@ -28,7 +28,7 @@ stdenv.mkDerivation rec {
     owner = "elementary";
     repo = repoName;
     rev = version;
-    sha256 = "sha256-MSyhCXsziQ0MD4lGp9X/9odidjT/L+2Aihwd1qCGvB0=";
+    sha256 = "04nl9kn33dysvsg0n5qx1z8qgrifkgfwsm7gh1l308v3n8c69lh7";
   };
 
   passthru = {
diff --git a/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix b/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix
index 55935b2ee0e..bd4845172c5 100644
--- a/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix
+++ b/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix
@@ -13,7 +13,7 @@
 
 stdenv.mkDerivation rec {
   pname = "elementary-icon-theme";
-  version = "5.3.1";
+  version = "6.0.0";
 
   repoName = "icons";
 
@@ -21,7 +21,7 @@ stdenv.mkDerivation rec {
     owner = "elementary";
     repo = repoName;
     rev = version;
-    sha256 = "sha256-6XFzjpuHpGIZ+azkPuFcSF7p66sDonwLwjvlNBZDRmc=";
+    sha256 = "0k94zi8fzi0nf5q471fmrlz8jjkv8m6vav1spzv7ynkg2hik8d9b";
   };
 
   passthru = {
diff --git a/pkgs/desktops/pantheon/granite/default.nix b/pkgs/desktops/pantheon/granite/default.nix
index 3d4dc6bd84a..2397dd8ffcf 100644
--- a/pkgs/desktops/pantheon/granite/default.nix
+++ b/pkgs/desktops/pantheon/granite/default.nix
@@ -18,7 +18,7 @@
 
 stdenv.mkDerivation rec {
   pname = "granite";
-  version = "6.0.0";
+  version = "6.1.0";
 
   outputs = [ "out" "dev" ];
 
@@ -26,7 +26,7 @@ stdenv.mkDerivation rec {
     owner = "elementary";
     repo = pname;
     rev = version;
-    sha256 = "sha256-RGukXeFmtnyCfK8pKdvTHL0t8yhEYwAiiPelTy1Xcf0=";
+    sha256 = "02hn4abnsn6fm2m33pjmlnkj8dljsm292z62vn8ccvy7l8f9my6l";
   };
 
   passthru = {
diff --git a/pkgs/development/libraries/libgnt/default.nix b/pkgs/development/libraries/libgnt/default.nix
new file mode 100644
index 00000000000..33ce7fbaa11
--- /dev/null
+++ b/pkgs/development/libraries/libgnt/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, lib, fetchurl, meson, ninja, pkg-config
+, gtk-doc, docbook-xsl-nons
+, glib, ncurses, libxml2
+, buildDocs ? true
+}:
+stdenv.mkDerivation rec {
+  pname = "libgnt";
+  version = "2.14.1";
+
+  outputs = [ "out" "dev" ] ++ lib.optional buildDocs "devdoc";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/pidgin/${pname}-${version}.tar.xz";
+    sha256 = "1n2bxg0ignn53c08cp69pj4sdg53kwlqn23rincyjmpr327fdhsy";
+  };
+
+  nativeBuildInputs = [ meson ninja pkg-config ]
+    ++ lib.optionals buildDocs [ gtk-doc docbook-xsl-nons ];
+
+  buildInputs = [ glib ncurses libxml2 ];
+
+  postPatch = ''
+    substituteInPlace meson.build --replace \
+      "ncurses_sys_prefix = '/usr'" \
+      "ncurses_sys_prefix = '${lib.getDev ncurses}'"
+  '' + lib.optionalString (!buildDocs) ''
+    sed "/^subdir('doc')$/d" -i meson.build
+  '';
+
+  meta = with lib; {
+    description = "An ncurses toolkit for creating text-mode graphical user interfaces";
+    homepage = "https://keep.imfreedom.org/libgnt/libgnt/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+    maintainers = with lib.maintainers; [ ony ];
+  };
+}
diff --git a/pkgs/development/tools/rq/default.nix b/pkgs/development/tools/rq/default.nix
index 7d222e03bc9..68669e88516 100644
--- a/pkgs/development/tools/rq/default.nix
+++ b/pkgs/development/tools/rq/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, lib, fetchFromGitHub, rustPlatform, libiconv, llvmPackages, v8 }:
+{ stdenv, lib, fetchFromGitHub, rustPlatform }:
 
 rustPlatform.buildRustPackage rec {
   pname = "rq";
@@ -13,9 +13,6 @@ rustPlatform.buildRustPackage rec {
 
   cargoSha256 = "0071q08f75qrxdkbx1b9phqpbj15r79jbh391y32acifi7hr35hj";
 
-  buildInputs = [ llvmPackages.libclang v8 ]
-  ++ lib.optionals stdenv.isDarwin [ libiconv ];
-
   postPatch = ''
     # Remove #[deny(warnings)] which is equivalent to -Werror in C.
     # Prevents build failures when upgrading rustc, which may give more warnings.
@@ -23,11 +20,6 @@ rustPlatform.buildRustPackage rec {
       --replace "#![deny(warnings)]" ""
   '';
 
-  configurePhase = ''
-    export LIBCLANG_PATH="${llvmPackages.libclang.lib}/lib"
-    export V8_SOURCE="${v8}"
-  '';
-
   meta = with lib; {
     description = "A tool for doing record analysis and transformation";
     homepage = "https://github.com/dflemstr/rq";
diff --git a/pkgs/servers/dns/knot-dns/default.nix b/pkgs/servers/dns/knot-dns/default.nix
index d052ddb7b79..e5192b7b3c1 100644
--- a/pkgs/servers/dns/knot-dns/default.nix
+++ b/pkgs/servers/dns/knot-dns/default.nix
@@ -7,11 +7,11 @@ let inherit (lib) optional optionals; in
 
 stdenv.mkDerivation rec {
   pname = "knot-dns";
-  version = "3.0.7";
+  version = "3.0.8";
 
   src = fetchurl {
     url = "https://secure.nic.cz/files/knot-dns/knot-${version}.tar.xz";
-    sha256 = "2bad8be0be95c8f54a26d1e16299e65f31ae1b34bd6ad3819aa50e7b40521484";
+    sha256 = "df723949c19ebecf9a7118894c3127e292eb09dc7274b5ce9b527409f42edfb0";
   };
 
   outputs = [ "bin" "out" "dev" ];
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 00d2c8f115e..a7b61572351 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -8489,9 +8489,7 @@ in
 
   routino = callPackage ../tools/misc/routino { };
 
-  rq = callPackage ../development/tools/rq {
-    inherit (darwin) libiconv;
-  };
+  rq = callPackage ../development/tools/rq { };
 
   rs-git-fsmonitor = callPackage ../applications/version-management/git-and-tools/rs-git-fsmonitor { };
 
@@ -16542,6 +16540,8 @@ in
 
   libgksu = callPackage ../development/libraries/libgksu { };
 
+  libgnt = callPackage ../development/libraries/libgnt { };
+
   libgpgerror = callPackage ../development/libraries/libgpg-error { };
 
   # https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgpg-error.git;a=blob;f=README;h=fd6e1a83f55696c1f7a08f6dfca08b2d6b7617ec;hb=70058cd9f944d620764e57c838209afae8a58c78#l118
@@ -28510,6 +28510,9 @@ in
 
   electrs = callPackage ../applications/blockchains/electrs.nix { };
 
+  elements  = libsForQt5.callPackage ../applications/blockchains/elements.nix { miniupnpc = miniupnpc_2; withGui = true; };
+  elementsd = callPackage ../applications/blockchains/elements.nix { miniupnpc = miniupnpc_2; withGui = false; };
+
   ergo = callPackage ../applications/blockchains/ergo { };
 
   exodus = callPackage ../applications/blockchains/exodus { };