;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 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 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; 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 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:)
(define-public libssh
(package
(name "libssh")
- (version "0.7.4")
+ (version "0.8.7")
(source (origin
- (method url-fetch)
- (uri (string-append
- "https://red.libssh.org/attachments/download/210/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
- "03bcp9ksqp0s1pmwfmzhcknvkxay5k0mjzzxp3rjlifbng1vxq9r"))))
+ "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.")
+ "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.8.0")
+ (version "1.8.1")
(source (origin
(method url-fetch)
(uri (string-append
version ".tar.gz"))
(sha256
(base32
- "1m3n8spv79qhjq4yi0wgly5s5rc8783jb1pyra9bkx1md0plxwrr"))
+ "0ngif3ynk6xqzy5nlfjs7bsmfm81g9f145av0z86kf0vbgrigda0"))
(patches
(search-patches "libssh2-fix-build-failure-with-gcrypt.patch"))))
(build-system gnu-build-system)
;; 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
- (add-before 'configure 'autoreconf
+ (replace 'bootstrap
(lambda _
- (zero? (system* "autoreconf" "-v")))))))
+ (invoke "autoreconf" "-v"))))))
(native-inputs `(("autoconf" ,autoconf)
("automake" ,automake)))
(synopsis "Client-side C library implementing the SSH2 protocol")
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.5p1")
+ (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
- "1w7rb5gbrikxdkp8w7zxnci4549gk4bw1lml01s59w5rzb2y6ilq"))))
+ (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)
- (native-inputs `(("groff" ,groff)))
- (inputs `(("openssl" ,openssl)
+ (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"
+ ;; 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.
(assoc-ref %build-inputs "mit-krb5")
"/bin")
+ ;; libedit needed for sftp completion
+ "--with-libedit"
+
;; Enable PAM support in sshd.
"--with-pam")
(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
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.11.0")
+ (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.
- ;; Also, using this URL allows the GitHub updater to work.
- (method url-fetch)
- (uri (string-append home-page "/archive/v"
- version ".tar.gz"))
+ (method git-fetch)
+ (uri (git-reference
+ (url home-page)
+ (commit (string-append "v" version))))
(file-name (string-append name "-" version ".tar.gz"))
(sha256
(base32
- "0r261i8kc3avbmbwgyzak2vnqwssjlgz37g2y2fwm80w9bmn2m7j"))
- (patches (search-patches "guile-ssh-rexec-bug.patch"
- "guile-ssh-double-free.patch"))
+ "03bv3hwp2s8f0bqgfjaan9jx4dyab0abv27n2zn2g0izlidv0vl6"))
(modules '((guix build utils)))
(snippet
- ;; 'configure.ac' mistakenly tries to link files from examples/
- ;; that are not instantiated yet. Work around it.
- '(substitute* "configure.ac"
- (("AC_CONFIG_LINKS\\(\\[examples/([^:]+):.*" _ file)
- (string-append "AC_CONFIG_FILES([examples/" file
- "], [chmod +x examples/"
- file "])\n"))))))
+ '(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)
- (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)
"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/corkscrew")))
+ (doc (string-append out "/share/doc/" ,name "-" ,version)))
(install-file "README" doc)
#t))))))
(home-page "http://www.agroman.net/corkscrew")
(define-public mosh
(package
(name "mosh")
- (version "1.3.0")
+ (version "1.3.2")
(source (origin
(method url-fetch)
(uri (string-append "https://mosh.org/mosh-" version ".tar.gz"))
(sha256
(base32
- "0xikz40q873g9ihvz3x6bwkcb9hb8kcnp5wpcmb72pg5c7s143ij"))))
+ "05hjhlp6lk8yjcy59zywpf0r6s0h0b9zxq0lw66dh9x8vxrhaq6s"))))
(build-system gnu-build-system)
(arguments
'(#:phases
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 "2017.75")
+ (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
- "1309cm2aw62n9m3h38prvgsqr8bj85hfasgnvwkd42cp3k5ivg3c"))))
+ "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
(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")
(("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)
(define-public autossh
(package
(name "autossh")
- (version "1.4e")
+ (version "1.4g")
(source
(origin
(method url-fetch)
(uri (string-append
- "http://www.harding.motd.ca/autossh/autossh-"
+ "https://www.harding.motd.ca/autossh/autossh-"
version ".tgz"))
(sha256
- (base32 "0mlicw28vq2jxa0jf0dys5ja75v0fxpjavlq9dpif6bnknji13ly"))))
+ (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 "http://www.harding.motd.ca/autossh/")
+ (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+)))