#!/bin/sh SELF="${0##*/}" if [ -z "$TMPDIR" ]; then TMPDIR=/tmp elif [ -d "${TMPDIR}/volatile" ]; then TMPDIR="${TMPDIR}/volatile" fi export TMPDIR TMPDIR=$(mktemp -dp "$TMPDIR" mutt.XXXXXXXXXX) cleanup() { cd / && notify_output && rm -rf "$TMPDIR"; } trap cleanup 1 2 3 4 5 6 7 8 10 11 12 13 14 15 cd "$TMPDIR" notify() { if [ -x "$(command -v awesome-client)" ]; then awesome-client <<-_eof local naughty = require("naughty") naughty.notify({ preset = naughty.config.presets.low, title = "$3", text = [[stdout: $(sed -e 's,\",\\\",g' "$1") stderr: $(sed -e 's,\",\\\",g' "$2")]] }) _eof fi } notify_output() { if [ -s "$TMPDIR/output.stdout" ] || [ -s "$TMPDIR/output.stderr" ]; then notify $TMPDIR/output.stdout $TMPDIR/output.stderr \ "Output from mutt/$SELF on $BASENAME" fi } guess_extension() { python -c "import mimetypes; print(mimetypes.guess_extension('$1'))" } launch_viewer() { run-mailcap --action=view "$1":"$2" > output.stdout 2> output.stderr } MIMETYPE="$1"; shift get_file() { local t if [ -z "$1" ]; then t=$(tempfile -d . -p mutt -s $(guess_extension "$MIMETYPE")) cat > "$t" echo "$t" else t="$(echo ${1##*/} | sed -re 's![^[:alnum:],.@%^+=_-]!_!gi')" cp "$1" "$t" echo "$t" fi } case "$SELF" in (bgrun) # make a copy of the file, then launch a shell process in the background # to divert to run-mailcap, after which the temporary directory gets # cleaned up. FILE="$(get_file "${1:-}")" ( launch_viewer "$MIMETYPE" "$FILE" sleep 1 cleanup ) & trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15 ;; (bgrun-fifo) # hack to stay around until the viewer has read the file: make a fifo and # wait for the cat process to finish writing to it, which means that it # must have been consumed on the other end. FILE="$(get_file "${1:-}")" FIFO="${FILE%/*}/fifo-${FILE##*/}" mkfifo "$FIFO" cat "$FILE" > "$FIFO" & # For some reason, we do have to write a tempfile and cannot seem to # redirect stdin directly to the fifo, i.e. this does not work instead of # the previous three lines: ## cat > "$FIFO" & launch_viewer "$MIMETYPE" "${FIFO}" wait cleanup ;; (bgrun-delay) # hack to stay around for a fixed period of time after the viewer process # returns control to the caller, so that we can clean up. This is for # cases when the FIFO method doesn't work, because e.g. Firefox randomly # chooses it needs to read HTML files twice. FILE="$(get_file "${1:-}")" (launch_viewer "$MIMETYPE" "${FILE}") & ( sleep 1m echo Cleaning up $TMPDIR… > $TMPDIR/output.stderr cleanup ) & ;; esac