summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2020-05-17 17:43:50 +0000
committerKarl Berry <karl@freefriends.org>2020-05-17 17:43:50 +0000
commitad41eab31b79739233027df1c00bdc7951030d14 (patch)
treeae5c4967c649ae9a504705fd71a24ca47800e48c
parentf8c9cbfe16ae8eac7e44b3353f4d3a8bf64e3936 (diff)
tlgpg: new program for common gpg arguments for TL usage, notably --homedir.
tlgpg-verify: new script, following TLCrypto.pm for checks. tl-sign-file: use tlgpg and tlgpg-verify. tl-update-tlnet: run tlgpg-verify on the new tlnet's tlpdb, both before and installation, since we've seen it fail. git-svn-id: svn://tug.org/texlive/trunk@55180 c570f23f-e606-0410-a88d-b1316a301751
-rwxr-xr-xMaster/tlpkg/bin/tl-sign-file72
-rwxr-xr-xMaster/tlpkg/bin/tl-update-tlnet13
-rwxr-xr-xMaster/tlpkg/bin/tlgpg34
-rwxr-xr-xMaster/tlpkg/bin/tlgpg-verify61
4 files changed, 119 insertions, 61 deletions
diff --git a/Master/tlpkg/bin/tl-sign-file b/Master/tlpkg/bin/tl-sign-file
index f79a2256dcc..05acf1a81e6 100755
--- a/Master/tlpkg/bin/tl-sign-file
+++ b/Master/tlpkg/bin/tl-sign-file
@@ -3,73 +3,31 @@
# Public domain. Originally written 2016, Norbert Preining.
# Sign a file for release in TeX Live. Used in tl-update-images,
# tl-update-tlnet, et al. See tlpkg/gpg/tl-key-extension.txt for some info.
+# Perhaps someday we will rename this to tlgpg-sign at some point,
+# to be more parallel with tlgpg-verify.
if test $# -ne 1; then
echo "$0: Exactly one argument must be given, the file to sign." >&2
exit 1
fi
-# remove previous signature else gpg will bail out.
-rm -f "$1.asc"
-
-gpg_prog=gpg
-gpg_opts="--batch --homedir /home/texlive/.gnupg \
- --passphrase-file /home/texlive/.gnupg/passphrase \
- --local-user 0x06BAB6BC "
-gpg_sign_opts="--armor --detach-sign"
+mydir=`cd \`dirname $0\` && pwd`
+PATH=$mydir:$PATH # for our tlgpg* commands
-# use the environment variables if set. This is for testing;
-# we don't define them in normal usage.
-if test -n "$TL_GNUPG"; then
- gpg_prog=$TL_GNUPG
-fi
-if test -n "$TL_GNUPGOPTS"; then
- gpg_opts=$TL_GNUPGOPTS
-fi
-if test -n "$TL_GNUPG_SIGN_OPTS"; then
- gpg_sign_opts=$TL_GNUPG_SIGN_OPTS
-fi
+# remove any previous signature, else gpg will bail out.
+rm -f "$1.asc"
-# sign, check that result is valid and doesn't use something expired.
-# both --detach-sign and --verify exit 0 even when something is expired.
-if $gpg_prog $gpg_sign_opts $gpg_opts "$1"; then
- status_out=`mktemp`
- verify_out=`mktemp`
- verify_cmd="$gpg_prog $gpg_opts --status-file=$status_out --verify --verbose"
- if $verify_cmd "$1".asc >$verify_out 2>&1; then
- if grep EXPKEYSIG $status_out >/dev/null; then
- err="expired key"
- elif grep REVKEYSIG $status_out >/dev/null; then
- err="revoked key"
- else
- err= # ok we hope
- fi
- else
- err="other error ($?)"
- fi
- if test -n "$err"; then
- echo "$0: gpg verification failed." >&2
- if test -r "$1".asc; then
- echo "$0: moving $1.asc to $1.asc.badv." >&2
- mv "$1".asc "$1".asc.badv || exit 1
- else
- echo "$0: no file $1.asc" >&2
- fi
- echo "$0: gpg verify command was:" >&2
- echo "$0: $verify_cmd" "$1" >&2
- echo "$0: STATUS FILE OUTPUT:" >&2
- cat $status_out >&2
- echo "$0: -------------------" >&2
- echo "$0: STDOUT/STDERR:" >&2
- cat $verify_out >&2
- echo "$0: -------------------" >&2
- echo "$0: goodbye and good luck." >&2
- rm -f $status_out $verify_out
+sign_cmd="tlgpg --detach-sign --armor"
+if $sign_cmd "$1"; then
+ # signing will succeed even with expired keys and other problems, so
+ # do verification; our tlpgpg-verify script will report the errors, so
+ # just exit if it fails.
+ if tlgpg-verify "$1"; then :; else
+ echo "$0: gpg signing did not verify, exiting." >&2
exit 1
fi
- rm -f $status_out $verify_out
-
-else # the original gpg run failed.
+
+else # original gpg signing failed.
echo "$0: gpg signing failed." >&2
if test -r "$1".asc; then
echo "$0: moving $1.asc to $1.asc.bads." >&2
diff --git a/Master/tlpkg/bin/tl-update-tlnet b/Master/tlpkg/bin/tl-update-tlnet
index e9deda32076..ce3eff07b9a 100755
--- a/Master/tlpkg/bin/tl-update-tlnet
+++ b/Master/tlpkg/bin/tl-update-tlnet
@@ -268,12 +268,13 @@ fi
# more consistency checks.
if test $failure = false; then
for cmd in \
+ "$Master/tlpkg/bin/tlgpg-verify $tltry/tlpkg/texlive.tlpdb" \
+ "$Master/tlpkg/bin/tl-compare-tlpdbs $critical $tltry/tlpkg/texlive.tlpdb" \
+ "$Master/tlpkg/bin/tl-check-symlinks $tltryinst/$yyyy/bin" \
"$tltryinst/$yyyy/bin/*/tlmgr --repository $tltry update --list" \
"$tltryinst/$yyyy/bin/*/updmap-sys -n" \
"$tltryinst/$yyyy/bin/*/mktexlsr -n --verbose" \
- "$Master/tlpkg/bin/tl-check-symlinks $tltryinst/$yyyy/bin" \
"$Master/tlpkg/bin/tl-check-tlnet-consistency --location=$tltry" \
- "$Master/tlpkg/bin/tl-compare-tlpdbs $critical $tltry/tlpkg/texlive.tlpdb" \
; do
cmdname=`echo "$cmd" | awk '{print $1}'`
if echo "$cmdname" | grep check-tlnet-consistency >/dev/null; then
@@ -313,7 +314,7 @@ test ! -r $install_tl_log || cp -f $install_tl_log /tmp
if $failure || $chicken; then
echo >&2
- echo "$prg: Our transcript file: $tlnet_install_log" >&2
+ echo "$prg: tl-update-tlnet transcript file: $tlnet_install_log" >&2
echo "$prg: install-tl log file: $install_tl_log" >&2
echo "$prg: Copies of both are in /tmp." >&2
echo "$prg: Please rm -rf the trial dir." >&2
@@ -338,10 +339,14 @@ for f in $tlweb/*mactex*; do
test ! -r $f || cp -pf $f $tltry
done
-# mv then rm to avoid the mirmon probe from making the rm fail.
+# mv then rm to avoid the mirmon probe failing during the rm.
mv $tlweb $tltrybase/tlnet.old
mv $tltry $tlweb
rm -rf $tltrybase
+
+# We checked this above also, but check again.
+$Master/tlpkg/bin/tlgpg-verify $tlweb/tlpkg/texlive.tlpdb
+
echo "$0: Done."
exit 0
diff --git a/Master/tlpkg/bin/tlgpg b/Master/tlpkg/bin/tlgpg
new file mode 100755
index 00000000000..624c61e4ec7
--- /dev/null
+++ b/Master/tlpkg/bin/tlgpg
@@ -0,0 +1,34 @@
+#!/bin/sh
+# $Id$
+# Public domain. Originally written 2016, Norbert Preining.
+# Run a gpg command for TeX Live, that is, with the TL --homedir, etc.
+# Since we want to be able to independently sign and verify, factor this out.
+
+if test $# -eq 0; then
+ echo "$0: At least one argument must be given." >&2
+ exit 1
+fi
+
+gpg_prog=gpg
+gpg_opts="--batch --homedir /home/texlive/.gnupg \
+ --passphrase-file /home/texlive/.gnupg/passphrase \
+ --local-user 0x06BAB6BC "
+
+# use the environment variables if set. This is for testing;
+# we don't define them in normal usage.
+if test -n "$TL_GNUPG"; then
+ gpg_prog=$TL_GNUPG
+fi
+if test -n "$TL_GNUPGOPTS"; then
+ gpg_opts=$TL_GNUPGOPTS
+fi
+
+if $gpg_prog $gpg_opts "$@" </dev/null; then
+ :
+else
+ echo "$0: gpg failed; command was:" >&2
+ echo "$0: $gpg_prog $gpg_opts" "$@" >&2
+ exit 1
+fi
+
+exit 0
diff --git a/Master/tlpkg/bin/tlgpg-verify b/Master/tlpkg/bin/tlgpg-verify
new file mode 100755
index 00000000000..1f0a6b0fb40
--- /dev/null
+++ b/Master/tlpkg/bin/tlgpg-verify
@@ -0,0 +1,61 @@
+#!/bin/sh
+# $Id$
+# Public domain. Originally written 2020, Norbert Preining.
+# gpg --verify ARG.asc. If verification fails, show all output.
+# Adapted from TeXLive/TLCrypto.pm.
+
+if test $# -ne 1; then
+ echo "$0: Exactly one argument must be given, the file to verify," >&2
+ echo "$0: with or without the .asc." >&2
+ exit 1
+fi
+
+if echo "$1" | grep '\.asc$' >/dev/null; then
+ asc_file=$1
+else
+ asc_file=$1.asc
+fi
+
+if test ! -s "$asc_file"; then
+ echo "$0: $asc_file nonexistent or empty, goodbye." >&2
+ exit 1
+fi
+
+mydir=`cd \`dirname $0\` && pwd`
+PATH=$mydir:$PATH # for our tlgpg command
+
+status_out=`mktemp`
+verify_out=`mktemp`
+verify_cmd="tlgpg --status-file=$status_out --verify --verbose"
+
+# gpg exit status is zero with expired keys,
+# but we want to fail in that case.
+if $verify_cmd "$asc_file" >$verify_out 2>&1; then
+ if grep EXPKEYSIG $status_out >/dev/null; then
+ err="expired key"
+ elif grep REVKEYSIG $status_out >/dev/null; then
+ err="revoked key"
+ else
+ err= # ok we hope
+ fi
+else
+ err="other error ($?)"
+fi
+
+if test -n "$err"; then
+ echo "$0: gpg verification failed for: $asc_file" >&2
+ echo "$0: moving $asc_file to $asc_file.badv." >&2
+ mv "$asc_file" "$asc_file".badv || exit 1
+ echo "$0: gpg verify command was:" >&2
+ echo "$0: $verify_cmd" "$1" >&2
+ echo "$0: GPG STATUS FILE OUTPUT:" >&2
+ cat $status_out >&2
+ echo "$0: GPG STDOUT/STDERR:" >&2
+ cat $verify_out >&2
+ echo "$0: goodbye and good luck." >&2
+ rm -f $status_out $verify_out
+ exit 1
+fi
+rm -f $status_out $verify_out
+
+exit 0