gnu: curl: Restore derivation.
[jackhill/guix/guix.git] / gnu / packages / ssh.scm
index c551f18..a75096b 100644 (file)
@@ -1,10 +1,17 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2015, 2016, 2018 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2019 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org>
+;;; Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017 Stefan Reichör <stefan@xsteve.at>
+;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2017 ng0 <ng0@n0.is>
+;;; Copyright © 2018 Manuel Graf <graf@init.at>
+;;; Copyright © 2019 Gábor Boskovits <boskovits@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
   #:use-module (gnu packages base)
   #:autoload   (gnu packages boost) (boost)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages crypto)
   #:use-module (gnu packages elf)
   #:use-module (gnu packages gnupg)
   #:use-module (gnu packages gperf)
   #:use-module (gnu packages groff)
   #:use-module (gnu packages guile)
+  #:use-module (gnu packages libedit)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages logging)
   #:use-module (gnu packages m4)
   #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages nettle)
+  #:use-module (gnu packages kerberos)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages popt)
   #:autoload   (gnu packages protobuf) (protobuf)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages xorg)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system python)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix packages))
+  #:use-module (guix packages)
+  #:use-module (srfi srfi-1))
 
 (define-public libssh
   (package
     (name "libssh")
-    (version "0.7.3")
+    (version "0.8.7")
     (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://red.libssh.org/attachments/download/195/libssh-"
-                    version ".tar.xz"))
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://git.libssh.org/projects/libssh.git")
+                     (commit (string-append "libssh-" version))))
               (sha256
                (base32
-                "165g49i4kmm3bfsjm0n8hm21kadv79g9yjqyq09138jxanz4dvr6"))))
+                "1iqik1ba0g008k1mb1n85iih1azi7giy0c485jnlmsrjxik4q3j2"))
+              (file-name (git-file-name name version))))
     (build-system cmake-build-system)
+    (outputs '("out" "debug"))
     (arguments
      '(#:configure-flags '("-DWITH_GCRYPT=ON")
 
+       #:phases (modify-phases %standard-phases
+                  (add-before 'configure 'avoid-werror
+                    (lambda _
+                      ;; Avoid '-Werror'.  Presumably this works fine with
+                      ;; gcc@8 on x86_64 but leads to errors with our older
+                      ;; compiler.
+                      (substitute* "CompilerChecks.cmake"
+                        (("-Werror=") "-W"))
+                      #t)))
+
        ;; TODO: Add 'CMockery' and '-DWITH_TESTING=ON' for the test suite.
        #:tests? #f))
     (inputs `(("zlib" ,zlib)
               ("libgcrypt" ,libgcrypt)))
     (synopsis "SSH client library")
     (description
-     "libssh is a C library implementing the SSHv2 and SSHv1 protocol for
-client and server implementations.  With libssh, you can remotely execute
-programs, transfer files, and use a secure and transparent tunnel for your
-remote applications.")
-    (home-page "http://www.libssh.org")
+     "libssh is a C library implementing the SSHv2 and SSHv1 protocol for client
+and server implementations.  With libssh, you can remotely execute programs,
+transfer files, and use a secure and transparent tunnel for your remote
+applications.")
+    (home-page "https://www.libssh.org")
     (license license:lgpl2.1+)))
 
 (define-public libssh2
   (package
    (name "libssh2")
-   (version "1.7.0")
+   (version "1.8.1")
    (source (origin
             (method url-fetch)
             (uri (string-append
@@ -91,13 +119,21 @@ remote applications.")
                    version ".tar.gz"))
             (sha256
              (base32
-              "116mh112w48vv9k3f15ggp5kxw5sj4b88dzb5j69llsh7ba1ymp4"))))
+              "0ngif3ynk6xqzy5nlfjs7bsmfm81g9f145av0z86kf0vbgrigda0"))
+            (patches
+             (search-patches "libssh2-fix-build-failure-with-gcrypt.patch"))))
    (build-system gnu-build-system)
    ;; The installed libssh2.pc file does not include paths to libgcrypt and
    ;; zlib libraries, so we need to propagate the inputs.
    (propagated-inputs `(("libgcrypt" ,libgcrypt)
                         ("zlib" ,zlib)))
-   (arguments '(#:configure-flags `("--with-libgcrypt")))
+   (arguments `(#:configure-flags `("--with-libgcrypt")
+                #:phases (modify-phases %standard-phases
+                           (replace 'bootstrap
+                             (lambda _
+                               (invoke "autoreconf" "-v"))))))
+   (native-inputs `(("autoconf" ,autoconf)
+                    ("automake" ,automake)))
    (synopsis "Client-side C library implementing the SSH2 protocol")
    (description
     "libssh2 is a library intended to allow software developers access to
@@ -105,36 +141,47 @@ the SSH-2 protocol in an easy-to-use self-contained package.  It can be built
 into an application to perform many different tasks when communicating with
 a server that supports the SSH-2 protocol.")
    (license license:bsd-3)
-   (home-page "http://www.libssh2.org/")))
+   (home-page "https://www.libssh2.org/")))
 
 (define-public openssh
   (package
    (name "openssh")
-   (version "7.3p1")
+   (version "7.9p1")
    (source (origin
-            (method url-fetch)
-            (uri (let ((tail (string-append name "-" version ".tar.gz")))
-                   (list (string-append "http://openbsd.cs.fau.de/pub/OpenBSD/OpenSSH/portable/"
-                                        tail)
-                         (string-append "http://ftp.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/"
-                                        tail)
-                         (string-append "http://ftp2.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/"
-                                        tail))))
-            (sha256 (base32
-                     "1k5y1wi29d47cgizbryxrhc1fbjsba2x8l5mqfa9b9nadnd9iyrz"))))
+             (method url-fetch)
+             (uri (string-append "mirror://openbsd/OpenSSH/portable/"
+                                 name "-" version ".tar.gz"))
+             (patches (search-patches "openssh-CVE-2018-20685.patch"))
+             (sha256
+              (base32
+               "1b8sy6v0b8v4ggmknwcqx3y1rjcpsll0f1f8f4vyv11x4ni3njvb"))))
    (build-system gnu-build-system)
-   (inputs `(("groff" ,groff)
+   (native-inputs `(("groff" ,groff)
+                    ("pkg-config" ,pkg-config)))
+   (inputs `(("libedit" ,libedit)
              ("openssl" ,openssl)
              ("pam" ,linux-pam)
+             ("mit-krb5" ,mit-krb5)
              ("zlib" ,zlib)
              ("xauth" ,xauth)))                   ;for 'ssh -X' and 'ssh -Y'
    (arguments
     `(#:test-target "tests"
-      #:configure-flags '("--sysconfdir=/etc/ssh"
+      ;; Otherwise, the test scripts try to use a nonexistent directory and
+      ;; fail.
+      #:make-flags '("REGRESSTMP=\"$${BUILDDIR}/regress\"")
+      #:configure-flags  `("--sysconfdir=/etc/ssh"
 
-                          ;; Default value of 'PATH' used by sshd.
+                           ;; Default value of 'PATH' used by sshd.
                           "--with-default-path=/run/current-system/profile/bin"
 
+                          ;; configure needs to find krb5-config
+                          ,(string-append "--with-kerberos5="
+                                          (assoc-ref %build-inputs "mit-krb5")
+                                          "/bin")
+
+                          ;; libedit needed for sftp completion
+                          "--with-libedit"
+
                           ;; Enable PAM support in sshd.
                           "--with-pam")
 
@@ -157,17 +204,16 @@ a server that supports the SSH-2 protocol.")
         (replace 'install
          (lambda* (#:key outputs (make-flags '()) #:allow-other-keys)
            ;; install without host keys and system configuration files
-           (and (zero? (apply system* "make" "install-nosysconf" make-flags))
-                (begin
-                  (install-file "contrib/ssh-copy-id"
-                                (string-append (assoc-ref outputs "out")
-                                               "/bin/"))
-                  (chmod (string-append (assoc-ref outputs "out")
-                                        "/bin/ssh-copy-id") #o555)
-                  (install-file "contrib/ssh-copy-id.1"
-                                (string-append (assoc-ref outputs "out")
-                                               "/share/man/man1/"))
-                  #t)))))))
+           (apply invoke "make" "install-nosysconf" make-flags)
+           (install-file "contrib/ssh-copy-id"
+                         (string-append (assoc-ref outputs "out")
+                                        "/bin/"))
+           (chmod (string-append (assoc-ref outputs "out")
+                                 "/bin/ssh-copy-id") #o555)
+           (install-file "contrib/ssh-copy-id.1"
+                         (string-append (assoc-ref outputs "out")
+                                        "/share/man/man1/"))
+           #t)))))
    (synopsis "Client and server for the secure shell (ssh) protocol")
    (description
     "The SSH2 protocol implemented in OpenSSH is standardised by the
@@ -190,46 +236,75 @@ TCP-forwarding.  It provides a flow control service for these channels.
 Additionally, various channel-specific options can be negotiated.")
    (license (license:non-copyleft "file://LICENSE"
                                "See LICENSE in the distribution."))
-   (home-page "http://www.openssh.org/")))
+   (home-page "https://www.openssh.com/")))
 
 (define-public guile-ssh
   (package
     (name "guile-ssh")
-    (version "0.10.1")
+    (version "0.11.3")
+    (home-page "https://github.com/artyom-poptsov/guile-ssh")
     (source (origin
-              ;; ftp://memory-heap.org/software/guile-ssh/guile-ssh-VERSION.tar.gz
-              ;; exists, but the server appears to be too slow and unreliable.
               (method git-fetch)
               (uri (git-reference
-                    (url "https://github.com/artyom-poptsov/libguile-ssh.git")
+                    (url home-page)
                     (commit (string-append "v" version))))
-              (file-name (string-append name "-" version "-checkout"))
+              (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0ky77kr7rnkhbq938bir61mlr8b86lfjcjjb1bxx1y1fhimsiz72"))))
+                "03bv3hwp2s8f0bqgfjaan9jx4dyab0abv27n2zn2g0izlidv0vl6"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  ;; libssh >= 0.8.0 no longer provides libssh_threads: see
+                  ;; <https://github.com/artyom-poptsov/guile-ssh/issues/9>.
+                  (substitute* "libguile-ssh/Makefile.am"
+                    (("-lssh_threads") ""))
+
+                  ;; This test would wrongfully pick DSS keys when running on
+                  ;; libssh >= 0.8.0, which fails:
+                  ;; <https://github.com/artyom-poptsov/guile-ssh/issues/10>.
+                  (substitute* "tests/server.scm"
+                    (("= %libssh-minor-version 7")
+                     ">= %libssh-minor-version 7"))
+                  #t))))
     (build-system gnu-build-system)
+    (outputs '("out" "debug"))
     (arguments
-     '(#:phases (modify-phases %standard-phases
+     '(;; It makes no sense to build libguile-ssh.a.
+       #:configure-flags '("--disable-static")
+
+       #:phases (modify-phases %standard-phases
                   (add-after 'unpack 'autoreconf
                     (lambda* (#:key inputs #:allow-other-keys)
-                      (chmod "doc/version.texi" #o777) ;make it writable
-                      (zero? (system* "autoreconf" "-vfi"))))
+                      (invoke "autoreconf" "-vfi")))
                   (add-before 'build 'fix-libguile-ssh-file-name
                     (lambda* (#:key outputs #:allow-other-keys)
                       ;; Build and install libguile-ssh.so so that we can use
                       ;; its absolute file name in .scm files, before we build
                       ;; the .go files.
-                      (and (zero? (system* "make" "install"
-                                           "-C" "libguile-ssh"
-                                           "-j" (number->string
-                                                 (parallel-job-count))))
-                           (let* ((out      (assoc-ref outputs "out"))
-                                  (libdir   (string-append out "/lib")))
-                             (substitute* (find-files "." "\\.scm$")
-                               (("\"libguile-ssh\"")
-                                (string-append "\"" libdir "/libguile-ssh\"")))
-                             #t)))))
-
+                      (let* ((out (assoc-ref outputs "out"))
+                             (lib (string-append out "/lib")))
+                        (invoke "make" "install"
+                                "-C" "libguile-ssh"
+                                "-j" (number->string
+                                      (parallel-job-count)))
+                        (substitute* (find-files "." "\\.scm$")
+                          (("\"libguile-ssh\"")
+                           (string-append "\"" lib "/libguile-ssh\"")))
+                        #t)))
+                  (add-after 'install 'remove-bin-directory
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let* ((out (assoc-ref outputs "out"))
+                             (bin (string-append out "/bin"))
+                             (examples (string-append
+                                        out "/share/guile-ssh/examples")))
+                        (mkdir-p examples)
+                        (rename-file (string-append bin "/ssshd.scm")
+                                     (string-append examples "/ssshd.scm"))
+                        (rename-file (string-append bin "/sssh.scm")
+                                     (string-append examples "/sssh.scm"))
+                        (delete-file-recursively bin)
+                        #t))))
        ;; Tests are not parallel-safe.
        #:parallel-tests? #f))
     (native-inputs `(("autoconf" ,autoconf)
@@ -238,7 +313,7 @@ Additionally, various channel-specific options can be negotiated.")
                      ("texinfo" ,texinfo)
                      ("pkg-config" ,pkg-config)
                      ("which" ,which)))
-    (inputs `(("guile" ,guile-2.0)
+    (inputs `(("guile" ,guile-2.2)
               ("libssh" ,libssh)
               ("libgcrypt" ,libgcrypt)))
     (synopsis "Guile bindings to libssh")
@@ -246,9 +321,18 @@ Additionally, various channel-specific options can be negotiated.")
      "Guile-SSH is a library that provides access to the SSH protocol for
 programs written in GNU Guile interpreter.  It is a wrapper to the underlying
 libssh library.")
-    (home-page "https://github.com/artyom-poptsov/libguile-ssh")
     (license license:gpl3+)))
 
+(define-public guile2.2-ssh
+  (deprecated-package "guile2.2-ssh" guile-ssh))
+
+(define-public guile2.0-ssh
+  (package
+    (inherit guile-ssh)
+    (name "guile2.0-ssh")
+    (inputs `(("guile" ,guile-2.0)
+              ,@(alist-delete "guile" (package-inputs guile-ssh))))))
+
 (define-public corkscrew
   (package
     (name "corkscrew")
@@ -256,50 +340,54 @@ libssh library.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "http://www.agroman.net/corkscrew/corkscrew-"
-                           version ".tar.gz"))
+       ;; The agroman.net domain name expired on 2017-03-23, and the original
+       ;; "http://www.agroman.net/corkscrew/corkscrew-2.0.tar.gz" now returns
+       ;; bogus HTML.  Perhaps it will yet return.  Until then, use a mirror.
+       (uri (string-append "https://downloads.openwrt.org/sources/"
+                           "corkscrew-" version ".tar.gz"))
        (sha256 (base32
                 "1gmhas4va6gd70i2x2mpxpwpgww6413mji29mg282jms3jscn3qd"))))
     (build-system gnu-build-system)
     (arguments
-     ;; Replace configure phase as the ./configure script does not link
-     ;; CONFIG_SHELL and SHELL passed as parameters
-     '(#:phases
+     `(#:phases
        (modify-phases %standard-phases
          (replace 'configure
-           (lambda* (#:key outputs inputs system build target
-                           #:allow-other-keys #:rest args)
-             (let* ((configure (assoc-ref %standard-phases 'configure))
-                    (prefix (assoc-ref outputs "out"))
-                    (bash   (which "bash"))
+           ;; Replace configure phase as the ./configure script does not like
+           ;; CONFIG_SHELL and SHELL passed as parameters
+           (lambda* (#:key outputs build target #:allow-other-keys)
+             (let* ((out   (assoc-ref outputs "out"))
+                    (bash  (which "bash"))
                     ;; Set --build and --host flags as the provided config.guess
                     ;; is not able to detect them
-                    (flags `(,(string-append "--prefix=" prefix)
+                    (flags `(,(string-append "--prefix=" out)
                              ,(string-append "--build=" build)
                              ,(string-append "--host=" (or target build)))))
                (setenv "CONFIG_SHELL" bash)
-               (zero? (apply system* bash
-                             (string-append "." "/configure")
-                             flags))))))))
+               (apply invoke bash "./configure" flags))))
+         (add-after 'install 'install-documentation
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (doc (string-append out "/share/doc/" ,name "-" ,version)))
+               (install-file "README" doc)
+               #t))))))
     (home-page "http://www.agroman.net/corkscrew")
-    (synopsis "Tunneling SSH through HTTP proxies")
+    (synopsis "SSH tunneling through HTTP(S) proxies")
     (description
-     "Corkscrew allows creating TCP tunnels through HTTP proxies.  WARNING:
-At the moment only plain text authentication is supported, should you require
-to use it with your HTTP proxy.  Digest based authentication may be supported
-in future and NTLM based authentication is most likey never be supported.")
+     "Corkscrew tunnels SSH connections through most HTTP and HTTPS proxies.
+Proxy authentication is only supported through the plain-text HTTP basic
+authentication scheme.")
     (license license:gpl2+)))
 
 (define-public mosh
   (package
     (name "mosh")
-    (version "1.2.6")
+    (version "1.3.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://mosh.org/mosh-" version ".tar.gz"))
               (sha256
                (base32
-                "118fhpm754wpklf1blnlq5xbvrxqml6rdfs3b07wg666zkxvg0ky"))))
+                "05hjhlp6lk8yjcy59zywpf0r6s0h0b9zxq0lw66dh9x8vxrhaq6s"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
@@ -331,20 +419,53 @@ keystrokes.  Mosh is a replacement for SSH.  It's more robust and responsive,
 especially over Wi-Fi, cellular, and long-distance links.")
     (license license:gpl3+)))
 
+(define-public et
+  (package
+    (name "et")
+    (version "3.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/MisterTea/EternalTCP/archive/et-v"
+             version ".tar.gz"))
+       (sha256
+        (base32 "1n2w2kqbshdmbb0gz4yizyw9gqfls6qm2dnwx1d9c2hz7hmi7521"))))
+    (build-system cmake-build-system)
+    (arguments `(#:tests? #f))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs `(("glog" ,glog)
+              ("gflags" ,gflags)
+              ("libsodium" ,libsodium)
+              ("protobuf" ,protobuf)))
+    (synopsis "Remote shell that automatically reconnects")
+    (description
+     "Eternal Terminal (ET) is a remote shell that automatically reconnects
+without interrupting the session.  Unlike SSH sessions, ET sessions will
+survive even network outages and IP changes.  ET uses a custom protocol over
+TCP, not the SSH protocol.")
+    (home-page "https://mistertea.github.io/EternalTCP/")
+    (license license:asl2.0)))
+
 (define-public dropbear
   (package
     (name "dropbear")
-    (version "2016.74")
+    (version "2018.76")
     (source (origin
               (method url-fetch)
               (uri (string-append
                     "https://matt.ucc.asn.au/" name "/releases/"
                     name "-" version ".tar.bz2"))
+              (patches (search-patches "dropbear-CVE-2018-15599.patch"))
               (sha256
                (base32
-                "14c8f4gzixf0j9fkx68jgl85q7b05852kk0vf09gi6h0xmafl817"))))
+                "0rgavbzw7jrs5wslxm0dnwx2m409yzxd9hazd92r7kx8xikr3yzj"))))
     (build-system gnu-build-system)
-    (arguments  `(#:tests? #f)) ; There is no "make check" or anything similar
+    (arguments `(#:tests? #f)) ; there is no "make check" or anything similar
+    ;; TODO: Investigate unbundling libtommath and libtomcrypt or at least
+    ;; cherry-picking important bug fixes from them. See <bugs.gnu.org/24674>
+    ;; for more information.
     (inputs `(("zlib" ,zlib)))
     (synopsis "Small SSH server and client")
     (description "Dropbear is a relatively small SSH server and
@@ -356,16 +477,15 @@ particularly useful for embedded systems, such as wireless routers.")
 (define-public liboop
   (package
     (name "liboop")
-    (version "1.0")
+    (version "1.0.1")
     (source
      (origin
       (method url-fetch)
-      (uri (string-append "http://download.ofb.net/liboop/liboop-"
-                          version ".tar.gz"))
+      (uri (string-append "http://ftp.lysator.liu.se/pub/liboop/"
+                          name "-" version ".tar.gz"))
       (sha256
        (base32
-        "0z6rlalhvfca64jpvksppc9bdhs7jwhiw4y35g5ibvh91xp3rn1l"))
-      (patches (search-patches "liboop-mips64-deplibs-fix.patch"))))
+        "1q0p1l72pq9k3bi7a366j2rishv7dzzkg3i6r2npsfg7cnnidbsn"))))
     (build-system gnu-build-system)
     (home-page "http://www.lysator.liu.se/liboop/")
     (synopsis "Event loop library")
@@ -405,7 +525,8 @@ basis for almost any application.")
                     (("localhost") "127.0.0.1"))
 
                   (substitute* "src/testsuite/login-auth-test"
-                    (("/bin/cat") "cat"))))))
+                    (("/bin/cat") "cat"))
+                  #t))))
     (build-system gnu-build-system)
     (native-inputs
      `(("m4" ,m4)
@@ -431,7 +552,14 @@ basis for almost any application.")
      '(;; Skip the `configure' test that checks whether /dev/ptmx &
        ;; co. work as expected, because it relies on impurities (for
        ;; instance, /dev/pts may be unavailable in chroots.)
-       #:configure-flags '("lsh_cv_sys_unix98_ptys=yes")
+       #:configure-flags '("lsh_cv_sys_unix98_ptys=yes"
+
+                           ;; Use glibc's argp rather than the bundled one.
+                           "--with-system-argp"
+
+                           ;; 'lsh_argp.h' checks HAVE_ARGP_PARSE but nothing
+                           ;; defines it.
+                           "CPPFLAGS=-DHAVE_ARGP_PARSE")
 
        ;; FIXME: Tests won't run in a chroot, presumably because
        ;; /etc/profile is missing, and thus clients get an empty $PATH
@@ -444,6 +572,12 @@ basis for almost any application.")
            (lambda* (#:key inputs #:allow-other-keys)
              (let* ((nettle    (assoc-ref inputs "nettle"))
                     (sexp-conv (string-append nettle "/bin/sexp-conv")))
+               ;; Remove argp from the list of sub-directories; we don't want
+               ;; to build it, really.
+               (substitute* "src/Makefile.in"
+                 (("^SUBDIRS = argp")
+                  "SUBDIRS ="))
+
                ;; Make sure 'lsh' and 'lshd' pick 'sexp-conv' in the right place
                ;; by default.
                (substitute* "src/environ.h.in"
@@ -498,3 +632,124 @@ manipulating key files.")
 authentication with SSH's so-called @dfn{interactive keyboard password
 authentication}.")
     (license license:gpl2+)))
+
+(define-public autossh
+  (package
+    (name "autossh")
+    (version "1.4g")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://www.harding.motd.ca/autossh/autossh-"
+             version ".tgz"))
+       (sha256
+        (base32 "0xqjw8df68f4kzkns5gcah61s5wk0m44qdk2z1d6388w6viwxhsz"))))
+    (build-system gnu-build-system)
+    (arguments `(#:tests? #f)) ; There is no "make check" or anything similar
+    (inputs `(("openssh" ,openssh)))
+    (synopsis "Automatically restart SSH sessions and tunnels")
+    (description "autossh is a program to start a copy of @command{ssh} and
+monitor it, restarting it as necessary should it die or stop passing traffic.")
+    (home-page "https://www.harding.motd.ca/autossh/")
+    (license
+     ;; Why point to a source file?  Well, all the individual files have a
+     ;; copy of this license in their headers, but there's no separate file
+     ;; with that information.
+     (license:non-copyleft "file://autossh.c"))))
+
+(define-public pdsh
+  (package
+    (name "pdsh")
+    (version "2.33")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/chaos/pdsh/"
+                           "releases/download/pdsh-" version
+                           "/pdsh-" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0bwlkl9inj66iwvafg00pi3sk9n673phdi0kcc59y9nn55s0hs3k"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (list "--with-ssh")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-/bin/sh
+           (lambda _
+             (substitute* '("tests/t0006-pdcp.sh"
+                            "tests/t0004-module-loading.sh"
+                            "tests/t2001-ssh.sh"
+                            "tests/t1003-slurm.sh"
+                            "tests/t6036-long-output-lines.sh"
+                            "tests/aggregate-results.sh"
+                            "tests/t2000-exec.sh"
+                            "tests/t0002-internal.sh"
+                            "tests/t1002-dshgroup.sh"
+                            "tests/t5000-dshbak.sh"
+                            "tests/t0001-basic.sh"
+                            "tests/t0005-rcmd_type-and-user.sh"
+                            "tests/test-lib.sh"
+                            "tests/t2002-mrsh.sh"
+                            "tests/t0003-wcoll.sh"
+                            "tests/test-modules/pcptest.c")
+               (("/bin/sh") (which "bash")))
+             #t))
+         (add-after 'unpack 'patch-tests
+           (lambda _
+             (substitute* "tests/t6036-long-output-lines.sh"
+               (("which") (which "which")))
+             #t)))))
+    (inputs
+     `(("openssh" ,openssh)
+       ("mit-krb5" ,mit-krb5)
+       ("perl" ,perl)))
+    (native-inputs
+     `(("which" ,which)))
+    (home-page "https://github.com/chaos/pdsh")
+    (synopsis "Parallel distributed shell")
+    (description "Pdsh is a an efficient, multithreaded remote shell client
+which executes commands on multiple remote hosts in parallel.  Pdsh implements
+dynamically loadable modules for extended functionality such as new remote
+shell services and remote host selection.")
+    (license license:gpl2+)))
+
+(define-public clustershell
+  (package
+    (name "clustershell")
+    (version "1.8")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/cea-hpc/clustershell/archive/v"
+                           version
+                           ".tar.gz"))
+       (sha256
+        (base32 "1qyf6zp5ikk8rk7zvx5ssbgr9si2bqv3a3415590kd07s7i16nmd"))
+       (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system python-build-system)
+    (inputs `(("openssh" ,openssh)))
+    (propagated-inputs `(("python-pyyaml" ,python-pyyaml)))
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-before 'build 'record-openssh-file-name
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (let ((ssh (assoc-ref inputs "openssh")))
+                        (substitute* "lib/ClusterShell/Worker/Ssh.py"
+                          (("info\\(\"ssh_path\"\\) or \"ssh\"")
+                           (string-append "info(\"ssh_path\") or \""
+                                          ssh "/bin/ssh\"")))
+                        #t))))))
+    (home-page "https://cea-hpc.github.io/clustershell/")
+    (synopsis "Scalable event-driven Python framework for cluster administration")
+    (description
+     "ClusterShell is an event-driven Python framework, designed to run local
+or distant commands in parallel on server farms or on large GNU/Linux
+clusters.  It will take care of common issues encountered on HPC clusters,
+such as operating on groups of nodes, running distributed commands using
+optimized execution algorithms, as well as gathering results and merging
+identical outputs, or retrieving return codes.  ClusterShell takes advantage
+of existing remote shell facilities such as SSH.")
+    (license license:lgpl2.1+)))