#!/bin/bash true <<'EOF'
This script downloads the latest version of GNU Parallel, checks the signature and installs it.
It first tries to install it globally.
If that fails, it does a personal installation.
If that fails, it copies to $HOME/bin
You can download and run the script directly by:
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 ||
curl pi.dk/3/ || fetch -o - http://pi.dk/3) > install.sh
$ sha1sum install.sh | grep 12345678
$ md5sum install.sh
$ sha512sum install.sh
Check the sums from https://gnu.org/s/parallel/checksums
Then run:
$ bash install.sh
EOF
# SPDX-FileCopyrightText: 2013-2022 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc.
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of
# the License, or (at your option) any later version.
run() {
# FreeBSD prefers 'fetch', MacOS prefers 'curl', Linux prefers 'wget'
get=$(
(lynx -source /dev/null && echo lynx -source) ||
(fetch -o /dev/null file:///bin/sh && echo fetch -o -) ||
(curl -h >/dev/null && echo curl -L) ||
(wget -h >/dev/null && echo wget -qO -) ||
echo 'No lynx, wget, curl, fetch: Please inform parallel@gnu.org what you use for downloading URLs' >&2
)
if test "$get" = ""; then
exit 1
fi
if ! perl -e 1; then
echo No perl installed. GNU Parallel depends on perl. Install perl and retry.
exit 1
fi
LANG=C
latest=$($get http://ftpmirror.gnu.org/parallel |
perl -ne '/.*(parallel-\d{8})/ and print $1."\n"' |
perl -e 'print ((reverse sort <>)[0])')
if test \! -e "$latest".tar.bz2; then
# Source tar does not exist
rm -f "$latest".tar.bz2 "$latest".tar.bz2.sig
$get http://ftpmirror.gnu.org/parallel/"$latest".tar.bz2 > "$latest".tar.bz2
$get http://ftpmirror.gnu.org/parallel/"$latest".tar.bz2.sig > "$latest".tar.bz2.sig
fi
fetch_keys() {
if gpg -h 2>/dev/null >/dev/null ; then
# GnuPG installed
# Setup .gnupg/gpg.conf if not already done
echo | gpg 2>/dev/null >/dev/null
if gpg --list-keys 0x2C6229E2FFFFFFF1 && gpg --list-keys 0xD1AB451688888888 ; then
echo Keys fetched
# OK
return 0
else
keyservers="keyserver.ubuntu.com
pgp.surf.nl
keys.openpgp.org
pgp.benny-baumann.de"
for keyserver in $keyservers ; do
if gpg --keyserver "$keyserver" --recv-key 0x2C6229E2FFFFFFF1 &&
gpg --keyserver "$keyserver" --recv-key 0xD1AB451688888888 ; then
# OK
return 0
fi
done
echo
echo "Cannot fetch keyID 0xD1AB451688888888, so the signature cannot be checked."
return 1
fi
else
# GnuPG not installed
echo
echo "GnuPG (gpg) is not installed so the signature cannot be checked."
return 1
fi
}
# Check signature - in case ftpmirror.gnu.org is compromised
if fetch_keys; then
if gpg --with-fingerprint "$latest".tar.bz2.sig 2>&1 |
perl -e 'exit not grep /^Primary key fingerprint: BE9C B493 81DE 3166 A3BC..66C1 2C62 29E2 FFFF FFF1|^Primary key fingerprint: CDA0 1A42 08C4 F745 0610..7E7B D1AB 4516 8888 8888/, <>'; then
# Source code signed by Ole Tange