diff options
Diffstat (limited to 'appimage/AppRun')
-rw-r--r-- | appimage/AppRun | 495 |
1 files changed, 484 insertions, 11 deletions
diff --git a/appimage/AppRun b/appimage/AppRun index 8a2e5935..40af9071 100644 --- a/appimage/AppRun +++ b/appimage/AppRun @@ -1,19 +1,492 @@ #!/bin/bash -# The purpose of this custom AppRun script is -# to allow symlinking the AppImage and invoking -# the corresponding binary depending on which -# symlink was used to invoke the AppImage +# Copyright (c) 2017 Simon Peter (@probonopd) +# Copyright (c) 2018 Kurt Pfeifle (@pdfkungfoo) +# +# License: MIT +# +# The purpose of this custom AppRun script is to enable symlinking the AppImage and invoking the corresponding +# binary depending on which symlink name was used to invoke the AppImage. +# +# At the same time it also allows to invoke the embedded binaries as 'sub-commands'. This is in the interest of +# saving users from creating extra symlinks (without preventing others from STILL using such, should they want +# or need these). +# +# It also provides some additional help parameters in order to allow faster familiarization with functionality +# embedded in this AppImage. For example it support the listing and viewing of embedded manpages, HTML files, +# PDF files, licenses and READMEs. +# +# Note, the AppImage can be renamed to anything what's 'legal' for an executable name under Linux or used via +# a symlink under any name and it should behave like 'qpdf' is expected to behave. If the symlink name is +# 'fix-qdf' or 'zlib-flate' it should behave like these... HERE="$(dirname "$(readlink -f "${0}")")" +# Set APPDIR and ARGV0 when running directly from the AppDir. +# Running from the AppDir can be beneficial when debugging the AppImage (or give performance improvements): +if [ -z $APPDIR ]; then + APPDIR="$HERE" + ARGV0="$0" +fi + +# This is a semi-secret environment variable which can be set for debugging the AppImage. +# For now it is only meant for temporary use and may be removed again in the near future once things have +# settled: +if [ "x$SET_BASH_X_FOR_APPRUN" == "xYeSS" ] ; then + set -x +else + set +x +fi + +# Another semi-secret environment var: +if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + env | less +fi + +if [ "x$SET_SHOW_ENV_FOR_APPIMAGE" == "xYeSS" ] ; then + env | grep --color -E '(APPIMAGE|APPDIR|APP|ARGV0|HERE)' +fi + + +function usage() { +echo " + -------------------------------------------------------------------------- + All QPDF command line functionality inside an AppImage package. + -------------------------------------------------------------------------- + + (This package uses the AppImage software packaging technology for Linux ['One App == One File'] + for easy availability of the newest QPDF releases across all major Linux distributions.) + + Usage: + ------ + + $ARGV0 --help + # Show help screen of QPDF itself + + $ARGV0 --ai-usage + # This message (it's only present in the AppImage incarnation of QPDF) + + $ARGV0 fix-qdf|zlib-flate + # Run the named sub-command + + $ARGV0 --list-exe + # List all executables embedded in AppImage + + $ARGV0 --list-man + # List available, embedded manual pages + + $ARGV0 --man qpdf|zlib-flate|fix-qdf + # Display embedded manual page(s) + + $ARGV0 --list-html + # List all HTML documents embedded in AppImage + + $ARGV0 --html <path/to/file> + # Use browser to show HTML file embedded in AppImage + # (for list of available HTML files see \"$ARGV0 --list-html\") + + $ARGV0 --list-pdf + # List all PDF documents embedded in AppImage + + $ARGV0 --pdf <path/to/file> + # Use system default PDF viewer to display embedded PDF document(s) + # (for list of available PDF files see \"$ARGV0 --list-pdf\") + + $ARGV0 --list-readme + # List all READMEs embedded in AppImage + + $ARGV0 --readme <path/to/readme> + # Show content of README embedded in AppImage + # (for list of available READMEs see \"$ARGV0 --list-readme\") + + $ARGV0 --list-license + # List all LICENSE files embedded in AppImage + + $ARGV0 --license <name-of-license> + # Show content of LICENSE file embedded in AppImage (piped thru 'less -N') + + $ARGV0 --show-apprun|--self-show|--selfshow + # Show 'AppRun' invoked by 'less -N'; type '-N' to toogle line number display + + $ARGV0 --appimage-help + # Show AppImage options available for all 'type 2' AppImages + + $ARGV0 --help + # Show help screen of QPDF itself + + ------------------------------------------------------------------------------------------------ + NOTE: The execution of this AppImage is controlled by a custom AppRun script. The state of this + script is experimental and preliminary. Hence it may not work as expected, or miss some + functionality. You can hack on this script by unpacking this AppImage into a local sub directory + [currently named 'squashfs-root'] with this command: + + $ARGV0 --appimage-extract + + After you're done with your hacks, repackage the AppImage again with this command: + + appimagetool [/path/to/]squashfs-root [/path/to/]QPDF-*.AppImage + + Latest versions of tools provided by AppImageKit are always available from + * https://github.com/AppImage/AppImageKit/releases/ and + * https://github.com/AppImage/AppImageUpdate/releases/ and + * https://github.com/AppImage/zsync2/releases and + * https://github.com/probonopd/linuxdeployqt/releases/ + ------------------------------------------------------------------------------------------------ +" +} + + +function mimetype() { +case "$#" in + 1) + # 'file --mime-type some-foo-file.ext' usually returns: 'some-foo-file.ext: major/minor', on stderr... + # However, we want to get back only 'major/minor', on stdout! + file --mime-type "$1" 2>&1 | sed 's#'"$1"':##;s# ##' + ;; + 0) + echo "" 1>&2 + echo " # This is a Bash function, named \"$FUNCNAME\"." 1>&2 + echo " # You cannot run it without an argument. If you run it with a" 1>&2 + echo " # [path to a] file as a single argument, it simply returns the" 1>&2 + echo " # 'major/minor' MIME type. If you add multiple [paths to] files" 1>&2 + echo " # as arguments, it returns a list of 'major/minor' MIME types with" 1>&2 + echo " # the respective file names prepended. Example usage:" 1>&2 + echo " #" 1>&2 + echo " # $> $FUNCNAME /path/to/a.pdf" 1>&2 + echo " #" 1>&2 + echo " # $> $FUNCNAME /path/to/a.txt ./myscript.sh ../some.txt" 1>&2 + echo " #" 1>&2 + echo " # This Bash function's source code is this:" 1>&2 + echo "" 1>&2 + typeset -f "${FUNCNAME}" 1>&2 + echo "" 1>&2 + ;; + *) + file --mime-type "$@" + ;; +esac +} + + +if [ x"$1" == "xshow-apprun" -o x"$1" == "x--show-apprun" -o x"$1" == "x--apprunshow" -o x"$1" == "x--apprun-show" -o x"$1" == "xselfshow" -o x"$1" == "x--selfshow" -o x"$1" == "xself-show" -o x"$1" == "x--self-show" -o x"$1" == "x--show-self" -o x"$1" == "x--showself" -o x"$1" == "xshow-self" -o x"$1" == "xshowself" ] ; then + cd "$HERE" + less -N AppRun + exit $? +fi + + +if [ x"$1" == "xlistlicense" -o x"$1" == "x--listlicense" -o x"$1" == "xlist-license" -o x"$1" == "x--list-license" -o x"$1" == "x--licenselist" -o x"$1" == "x--license-list" ] ; then + cd "$HERE" + echo "" + echo "You may invoke \"$ARGV0\" with one of the following additional arguments." + echo "This will then display the respective license file:" + echo "" + find . -type f -name "*LICENSE*" -o -name "*license*" | sed 's#^./# --license #' + echo "" + exit $? +fi + + +if [ "x$1" == "xai-usage" -o "x$1" == "x--aiusage" -o "x$1" == "x--ai-usage" -o "x$1" == "x-u" ] ; then + usage | less + #usage + exit $? +fi + + +if [ x"$1" == "xlistman" -o x"$1" == "x--listman" -o x"$1" == "xlist-man" -o x"$1" == "x--list-man" -o x"$1" == "x--manlist" -o x"$1" == "x--man-list" ] ; then + cd "$HERE" + echo "" + echo "You may invoke \"$ARGV0\" with one of the following additional arguments." + echo "This will then open the respective manual page:" + echo "" + find usr/share/man* -type f | sed 's#^# --man #' + echo "" + exit $? +fi + + +if [ x"$1" == "xlistexe" -o x"$1" == "x--listexe" -o x"$1" == "xlist-exe" -o x"$1" == "x--list-exe" -o x"$1" == "x--exelist" -o x"$1" == "x--exe-list" ] ; then + cd "$HERE" + echo "" + echo "You may invoke \"$ARGV0\" with one of the following additional arguments." + echo "This would run the respective exe as a 'sub-command':" + echo "" + find . \( \( -type f -o -type l -o -type s -o -type p \) -a -executable \) | grep '/bin/' | grep -v qpdf | sed 's#./usr/bin/# #' | sort -V | grep -v ".sh$" + echo "" + find . \( \( -type f -o -type l -o -type s -o -type p \) -a -executable \) | grep '/bin/' | grep -v qpdf | sed 's#./usr/bin/# #' | sort -V | grep ".sh$" + echo "" + exit $? +fi + + +if [ x"$1" == "xlistreadme" -o x"$1" == "x--listreadme" -o x"$1" == "xlist-readme" -o x"$1" == "x--list-readme" -o x"$1" == "x--readmelist" -o x"$1" == "x--readme-list" ] ; then + cd "$HERE" + echo "" + echo "You may invoke \"$ARGV0\" with one of the following additional arguments." + echo "This will then display the respective README file:" + echo "" + find . -type f -iname "*README*" -o -iname "*.txt" -o -iname "*.md" -o -iname "*copyright*" -o -iname "*changelog*" -o -iname "*todo*" | sed 's#^./# --readme #' + echo "" + exit $? +fi + + +if [ x"$1" == "xlisthtml" -o x"$1" == "x--listhtml" -o x"$1" == "xlist-html" -o x"$1" == "x--list-html" -o x"$1" == "x--htmllist" -o x"$1" == "x--html-list" ] ; then + cd "$HERE" + echo "" + echo "You may invoke \"$ARGV0\" with one of the following additional arguments." + echo "This will then open the respective HTML file in your preferred browser:" + echo "" + find . -type f -name "*.html" | sed 's#^./# --html #' + echo "" + exit $? +fi + + +if [ x"$1" == "xlistpdf" -o x"$1" == "x--listpdf" -o x"$1" == "xlist-pdf" -o x"$1" == "x--list-pdf" -o x"$1" == "x--pdflist" -o x"$1" == "x--pdf-list" ] ; then + cd "$HERE" + echo "" + echo "You may invoke \"$ARGV0\" with one of the following additional arguments." + echo "This will then open the respective PDF file in your preferred viewer program:" + echo "" + find . -type f -name "*.pdf" | sed 's#^./# --pdf #' + echo "" + exit $? +fi + + +if [ x"$1" == "xreadme" -o x"$1" == "x--readme" ] ; then + cd "$HERE" + shift + echo "" + if [ x"$1" == "x" ] ; then + echo " You must give a path to the README you want to open." + echo " For available READMEs run \"$ARGV0 --listreadme\"." + else + readmefile=$( find . -type f -iname "*README*" -o -iname "*.txt" -o -iname "*.md" -o -iname "*copyright*" -o -iname "*changelog*" | grep "${1}" | sort -rV | head -n 1 ) + MIME=$(mimetype $readmefile) + case $MIME in + text/html|application/pdf|application/epub*) + xdg-open "$readmefile" + sleep 3 # sleep to allow slow xdg-open do its job + ;; + inode/x-empty) + echo "" + echo " Sorry, this file, \"$readmefile\", is empty and has no content." + echo "" + ;; + text/*) + less -N "$readmefile" + ;; + esac + sleep 0 + fi + echo "" + exit $? +fi + + +if [ x"$1" == "xlicense" -o x"$1" == "x--license" ] ; then + cd "$HERE" + shift + echo "" + if [ x"$1" == "x" ] ; then + echo " You must give a path to the LICENSE you want to open." + echo " For available LICENSE run \"$ARGV0 --list-license\"." + else + licensefile=$( find . -type f -iname "*LICENSE*" | grep "${1}" | sort -rV | head -n 1 ) + #if PDF or EPUB or HTML ; then xdg-open $licensefile ; else + MIME=$(mimetype $licensefile) + case $MIME in + text/html|application/pdf|application/epub*) + xdg-open "$licensefile" + sleep 3 # sleep to allow slow xdg-open do its job + ;; + inode/x-empty) + echo "" + echo " Sorry, this file, \"$licensefile\", is empty and has no content." + echo "" + ;; + text/*) + less -N "$licensefile" + ;; + esac + sleep 0 + fi + echo "" + exit $? +fi + + +if [ x"$1" == "xman" -o x"$1" == "x--man" ] ; then + export MANPATH="$HERE/usr/share/man:$MANPATH" + shift + exec man "$@" || man $(basename $1) +fi + + +if [ x"$1" == "xpdf" -o x"$1" == "x--pdf" ] ; then + cd "$HERE" + shift + echo "" + if [ x"$1" == "x" ] ; then + echo "" + echo " You must give a path to the PDF file you want to open." + echo " For available PDFs run \"$ARGV0 --list-pdf\"" + echo "" + else + pdffile=$( find . -type f -name "*.pdf" | grep "${1/.pdf/}.pdf" | sort -rV | head -n 1 ) + xdg-open "$pdffile" + sleep 5 + fi + echo "" + exit $? +fi + + +if [ x"$1" == "xhtml" -o x"$1" == "x--html" ] ; then + cd "$HERE" + shift + if [ x"$1" == "x" ] ; then + echo "" + echo " You must give a path to the HTML file you want to open." + echo " For available HTMLs run \"$ARGV0 --list-html\"" + echo "" + else + htmlfile=$( find . -type f -name "*.html" | grep "${1}" | sort -rV | head -n 1 ) + xdg-open "$htmlfile" + sleep 5 + fi + exit $? +fi + + +if [ x"$1" == "x--appimage-help" ] ; then + cd "$HERE" + shift + if [ x"$APPIMAGE" == "x" ] ; then + echo "" + echo " The parameter '--appimage-help' does not work if you run this application from an AppDir (as you do)." + echo " To create an AppImage from your AppDir run this command:" + echo "" + echo " appimagetool -n $APPDIR qpdf.AppImage" + echo "" + echo " You can download the latest version of 'appimagetool' (as an AppImage) from here:" + echo "" + echo " https://github.com/AppImage/AppImageKit/releases" + echo "" + fi + exit $? +fi + + +if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + echo APPIMAGE=$APPIMAGE 1>&2 # Don't leak strings into output of qpdf|fix-qdf|zlib-flate which goes to stdout! + echo ARGV0=$ARGV0 1>&2 # Don't leak strings into output of qpdf|fix-qdf|zlib-flate which goes to stdout! + echo dollar0=$0 1>&2 # Don't leak strings into output of qpdf|fix-qdf|zlib-flate which goes to stdout! + echo dollar1=$1 1>&2 # Don't leak strings into output of qpdf|fix-qdf|zlib-flate which goes to stdout! + echo dollar_at="$@" 1>&2 # Don't leak strings into output of qpdf|fix-qdf|zlib-flate which goes to stdout! +fi + + +### Main stuff happens from here: if [ ! -z $APPIMAGE ] ; then - BINARY_NAME=$(basename "$ARGV0") - if [ -e "$HERE/usr/bin/$BINARY_NAME" ] ; then - exec "$HERE/usr/bin/$BINARY_NAME" "$@" - else - exec "$HERE/usr/bin/qpdf" "$@" - fi + # We run as an AppImage + BINARY_NAME=$(basename "$ARGV0") + APPIMAGE=$APPIMAGE + CALLED_SUBCMD=$( basename $1 2>/dev/null ) + if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + # We have the (hidden) env var for debugging stuff set + echo BINARY_NAME=$BINARY_NAME 1>&2 # Don't leak strings into output of qpdf|fix-pdf|zlib-flate going to stdout! + echo APPIMAGE=$APPIMAGE 1>&2 # Don't leak strings into output of qpdf|fix-pdf|zlib-flate going to stdout! + echo CALLED_SUBCMD=$CALLED_SUBCMD 1>&2 # Don't leak strings into output of qpdf|fix-pdf|zlib-flate going to stdout! + fi + + if [ -x "$HERE/usr/bin/$BINARY_NAME" ] && [ x"$BINARY_NAME" != "x" ] ; then + # We are invoked from a symlink (like 'fix-qdf' or 'zlib-flate') + if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + # We have the (hidden) env var for debugging stuff set + echo BINARY_NAME=$BINARY_NAME 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo APPIMAGE=$APPIMAGE 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo CALLED_SUBCMD=$CALLED_SUBCMD 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + fi + shift + exec "$HERE/usr/bin/$BINARY_NAME" "$@" + + else + if [ -x "$HERE/usr/bin/$CALLED_SUBCMD" ] && [ x"$CALLED_SUBCMD" != "x" ] ; then + # We are invoked by a (currently not yet known future) binary name which may be located in ./usr/bin/ ... + BINARY_NAME=$1 + if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + # We have the (hidden) env var for debugging stuff set + echo BINARY_NAME=$BINARY_NAME 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo APPIMAGE=$APPIMAGE 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo CALLED_SUBCMD=$CALLED_SUBCMD 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + fi + shift + exec "$HERE/usr/bin/$BINARY_NAME" "$@" + elif [ -x "$HERE/$CALLED_SUBCMD" ] && [ x"$CALLED_SUBCMD" != "x" ] ; then + # We are invoked by a (currently not yet known future) binary name which may be located in our root AppDir ... + BINARY_NAME=$CALLED_SUBCMD + if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + # We have the (hidden) env var for debugging stuff set + echo BINARY_NAME=$BINARY_NAME 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo APPIMAGE=$APPIMAGE 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo CALLED_SUBCMD=$CALLED_SUBCMD 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + fi + shift + exec "$HERE/$BINARY_NAME" "$@" + else + # this clause may not be necessary... + exec "$HERE/usr/bin/qpdf" "$@" + fi + fi + else - exec "$HERE/usr/bin/qpdf" "$@" + # Most likely we run from an AppDir, not as an AppImage: + BINARY_NAME=$(basename "$ARGV0") + APPIMAGE=$APPIMAGE + CALLED_SUBCMD=$( basename $1 2>/dev/null ) + if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + # We have the (hidden) env var for debugging stuff set + echo BINARY_NAME=$BINARY_NAME 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo APPIMAGE=$APPIMAGE 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo CALLED_SUBCMD=$CALLED_SUBCMD 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + fi + + if [ -x "$HERE/usr/bin/$CALLED_SUBCMD" ] && [ "x$CALLED_SUBCMD" != "x" ]; then + #echo befor shift dollar_at=$@ + if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + # We have the (hidden) env var for debugging stuff set + echo BINARY_NAME=$BINARY_NAME 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo APPIMAGE=$APPIMAGE 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo CALLED_SUBCMD=$CALLED_SUBCMD 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + fi + shift + #echo after shift dollar_at=$@ + #echo CALLED_SUBCMD=$CALLED_SUBCMD + exec "$HERE/usr/bin/$CALLED_SUBCMD" "$@" + + elif [ -x "$HERE/usr/bin/$BINARY_NAME" ] && [ "x$BINARY_NAME" != "x" ] ; then + if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + # We have the (hidden) env var for debugging stuff set + echo BINARY_NAME=$BINARY_NAME 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo APPIMAGE=$APPIMAGE 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo CALLED_SUBCMD=$CALLED_SUBCMD 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + fi + shift + exec "$HERE/usr/bin/$BINARY_NAME" "$@" + + else + if [ "x$SET_SHOW_ENV_FOR_APPRUN" == "xYeSS" ] ; then + # We have the (hidden) env var for debugging stuff set + echo BINARY_NAME=$BINARY_NAME 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo APPIMAGE=$APPIMAGE 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + echo CALLED_SUBCMD=$CALLED_SUBCMD 1>&2 # Don't leak strings into qpdf|fix-pdf|zlib-flate output going to stdout! + fi + exec "$HERE/usr/bin/qpdf" "$@" + fi + fi + |