summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2017-09-13 11:51:30 +0200
committerErich Eckner <git@eckner.net>2017-09-13 11:51:30 +0200
commit6dc42ff6e8f0b52aa0ed7b5e4d18e39dfcca1ce1 (patch)
tree0efd8273fb2310b5ddcb9a9fd50677570ce9a84e
parent5e30d7046ec0b7ca39bb368331d49001bc6003cb (diff)
downloadbuilder-6dc42ff6e8f0b52aa0ed7b5e4d18e39dfcca1ce1.tar.xz
bin/interpret-mail: log errors and infos
-rwxr-xr-xbin/interpret-mail77
-rwxr-xr-xconf/default.conf3
2 files changed, 73 insertions, 7 deletions
diff --git a/bin/interpret-mail b/bin/interpret-mail
index 5d3cc51..92725b6 100755
--- a/bin/interpret-mail
+++ b/bin/interpret-mail
@@ -31,6 +31,51 @@ if [ $# -ne 0 ]; then
exit 1
fi
+log() {
+ # shellcheck disable=SC2059
+ >&2 printf "$@"
+ {
+ cat "${webserver_directory}/mail-log.html"
+ # shellcheck disable=SC2059
+ printf "$@" | \
+ sed '
+ s|$|<br>|
+ s|^|'"$(date)"': |
+ '
+ } | \
+ tail -n "${max_mail_log_lines}" | \
+ sponge "${webserver_directory}/mail-log.html"
+}
+
+log_from_file() {
+ >&2 cat "$@"
+ {
+ cat "${webserver_directory}/mail-log.html"
+ sed '
+ s|$|<br>|
+ s|^|'"$(date)"': |
+ ' "$@"
+ } | \
+ tail -n "${max_mail_log_lines}" | \
+ sponge "${webserver_directory}/mail-log.html"
+}
+
+run_and_log_on_error() {
+ err=0
+ "$@" 2> "${tmp_dir}/stderr" > "${tmp_dir}/stdout" || \
+ err=$?
+ if [ "${err}" -eq 0 ]; then
+ return 0
+ fi
+ log_from_file "${tmp_dir}/stderr" "${tmp_dir}/stdout"
+ if [ "${err}" -eq 1 ]; then
+ log '^ temporary error - I keep the message.\n'
+ exit 1
+ else
+ return 1
+ fi
+}
+
tmp_dir=$(mktemp -d)
trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT
@@ -42,7 +87,7 @@ if ! hashcash -qXc -b 20 \
-r 'archlinux32-buildmaster@eckner.net' \
-r 'buildmaster@archlinux32.org' < \
"${tmp_dir}/mail"; then
- >&2 echo 'Invalid stamp - ignoring this message.'
+ log 'Invalid stamp - ignoring this message.\n'
exit
fi
@@ -56,7 +101,9 @@ if ! sed -n '
p
}
' "${tmp_dir}/mail" | \
- chronic gpg --batch --status-file "${tmp_dir}/gpg-status" -q -d -o "${tmp_dir}/plain-content"; then
+ gpg --batch --status-file "${tmp_dir}/gpg-status" -q -d -o "${tmp_dir}/plain-content" > /dev/null 2>&1; then
+ log 'Invalid encryption/signature - ignoring this message.\n'
+ log_from_file "${tmp_dir}/gpg-status"
exit
fi
@@ -79,10 +126,14 @@ join -j 1 -o 2.2 \
"${tmp_dir}/allowed-actions"
if [ ! -s "${tmp_dir}/allowed-actions" ]; then
- >&2 echo 'No valid signature found.'
+ log 'No known signature found - I found:\n'
grep '^\[GNUPG:] VALIDSIG ' "${tmp_dir}/gpg-status" | \
cut -d' ' -f3 | \
- sort -u >&2
+ sort -u | \
+ sed 's|^|> |' > \
+ "${tmp_dir}/log"
+ log_from_file "${tmp_dir}/log"
+ log 'ignoring this message.\n'
exit
fi
@@ -127,16 +178,28 @@ sed -n "$(
)" "${tmp_dir}/raw-content"
if [ -s "${tmp_dir}/block" ]; then
- chronic "${base_dir}/bin/block-package" "${tmp_dir}/block"
+ if run_and_log_on_error "${base_dir}/bin/block-package" "${tmp_dir}/block"; then
+ log 'Successfully blocked %s packages.\n' "$(wc -l < "${tmp_dir}/block")"
+ else
+ log 'There was an error while blocking the packages - ignoring this message.\n'
+ fi
fi
if [ -s "${tmp_dir}/stabilize" ]; then
sed -i '
/\.pkg\.tar\.xz$/!s/$/.pkg.tar.xz/
' "${tmp_dir}/stabilize"
-# chronic "${base_dir}/bin/db-update" -b -f "${tmp_dir}/stabilize"
+ if run_and_log_on_error "${base_dir}/bin/db-update" -b -f "${tmp_dir}/stabilize"; then
+ log 'Successfully stabilized %s packages.\n' "$(wc -l < "${tmp_dir}/stabilize")"
+ else
+ log 'There was an error while stabilizing the packages - ignoring this message.\n'
+ fi
fi
if [ -s "${tmp_dir}/unblock" ]; then
- chronic "${base_dir}/bin/block-package" -u "${tmp_dir}/unblock"
+ if run_and_log_on_error "${base_dir}/bin/block-package" -u "${tmp_dir}/unblock"; then
+ log 'Successfully unblocked %s packages.\n' "$(wc -l < "${tmp_dir}/unblock")"
+ else
+ log 'There was an error while unblocking the packages - ignoring this message.\n'
+ fi
fi
diff --git a/conf/default.conf b/conf/default.conf
index 808f76c..63b14f1 100755
--- a/conf/default.conf
+++ b/conf/default.conf
@@ -35,6 +35,9 @@ package_key='0x15eebadc0de'
# what can be done via the email interface
possible_email_actions='stabilize block unblock'
+# how many lines of email logs should be kept maximally
+max_mail_log_lines=100
+
# who can do above actions
if [ -s "${base_dir}/conf/admin-gpg-keys" ]; then
admin_gpg_keys=$(