commit 063f65368f32600904945399f7024be3a6ae1f5f Author: Mike Perry mikeperry-git@torproject.org Date: Mon Apr 20 16:18:38 2015 -0700
Bug 15747: Improve Linux startup script argument handling.
This commit makes the following changes:
1. Allows multiple arguments to be specified at once to start-tor-browser 2. Separates --debug from file logging (and creates --log) 3. Solves #15739 by creating -v and --verbose as --debug aliases 4. Solves #15740 by creating -h and -? aliases for --help. 5. Solves #15741 by creating --detach and using it from the .desktop file --- RelativeLink/start-tor-browser | 128 ++++++++++++++++++++++---------- RelativeLink/start-tor-browser.desktop | 29 ++++---- 2 files changed, 103 insertions(+), 54 deletions(-)
diff --git a/RelativeLink/start-tor-browser b/RelativeLink/start-tor-browser index 098f506..940ec96 100755 --- a/RelativeLink/start-tor-browser +++ b/RelativeLink/start-tor-browser @@ -3,8 +3,6 @@ # GNU/Linux does not really require something like RelativeLink.c # However, we do want to have the same look and feel with similar features. # -# To run in debug mode simply pass --debug -# # Copyright 2015 The Tor Project. See LICENSE for licensing information.
complain_dialog_title="Tor Browser" @@ -35,8 +33,8 @@ complain () { # Trim leading newlines, to avoid breaking formatting in some dialogs. complain_message="`echo "$1" | sed '/./,$!d'`"
- # If we're being run in debug mode, complain to stderr. - if [ "$debug" -eq 1 ]; then + # If we're being run in debug/verbose mode, complain to stderr. + if [ "$show_output" -eq 1 ]; then echo "$complain_message" >&2 return fi @@ -98,30 +96,82 @@ if [ "`id -u`" -eq 0 ]; then exit 1 fi
-debug=0 +tbb_usage () { + printf "\nTor Browser Script Options\n" + printf " --verbose Display Tor and Firefox output in the terminal\n" + printf " --log [file] Record Tor and Firefox output in file (default: tor-browser.log)\n" + printf " --detach Detach from terminal and run Tor Browser in the background.\n" + printf " --register-app Register Tor Browser as a desktop app for this user\n" + printf " --unregister-app Unregister Tor Browser as a desktop app for this user\n" +} +log_output=0 +show_output=0 +detach=0 show_usage=0 register_desktop_app=0 -# !!! We may have more than one argument, changed -eq to -ge in if & elif clauses below -if [ "$#" -ge 1 -a ( "x$1" = "x--debug" -o "x$1" = "x-debug" ) ]; then - debug=1 - shift # pop the debug argument - printf "\nDebug enabled.\n\n" -elif [ "$#" -ge 1 -a ( "x$1" = "x--register-app" -o "x$1" = "x-register-app" ) ]; then - register_desktop_app=1 - shift # pop the register arg -elif [ "$#" -ge 1 -a ( "x$1" = "x--unregister-app" -o "x$1" = "x-unregister-app" ) ]; then - register_desktop_app=-1 - shift # pop the register arg -elif [ "$#" -ge 1 -a ( "x$1" = "x--help" -o "x$1" = "x-help" ) ]; then - show_usage=1 -else +logfile=/dev/null +while : +do + case "$1" in + --detach) + detach=1 + shift + ;; + -v | --verbose | -d | --debug) + show_output=1 + verbose_arg="$2" + shift + ;; + -h | "-?" | --help | -help) + show_usage=1 + show_output=1 + shift + ;; + -l | --log) + if [ -z "$2" -o "${2:0:1}" == "-" ]; then + printf "Logging Tor Browser debug information to tor-browser.log\n" + logfile="../tor-browser.log" + elif [ "${2:0:1}" == "/" -o "${2:0:1}" == "~" ]; then + printf "Logging Tor Browser debug information to %s\n" "$2" + logfile="$2" + shift + else + printf "Logging Tor Browser debug information to %s\n" "$2" + logfile="../$2" + shift + fi + log_output=1 + shift + ;; + --register-app) + register_desktop_app=1 + show_output=1 + shift + ;; + --unregister-app) + register_desktop_app=-1 + show_output=1 + shift + ;; + *) # No more options + break + ;; + esac +done + +# We can't detach and show output at the same time.. +if [ "$show_output" -eq 1 -a "$detach" -eq 1 ]; then + detach=0 +fi + +if [ "$show_output" -eq 0 ]; then # If the user hasn't requested 'debug mode' or --help, close stdout and stderr, # to keep Firefox and the stuff loaded by/for it (including the # system's shared-library loader) from printing messages to # $HOME/.xsession-errors or other files. (Users wouldn't have seen # messages there anyway.) - exec >/dev/null - exec 2>/dev/null + exec > "$logfile" + exec 2> "$logfile" fi
# If XAUTHORITY is unset, set it to its default value of $HOME/.Xauthority @@ -186,7 +236,7 @@ fi cp start-tor-browser.desktop ../ sed -i -e "s,^Name=.*,Name=Tor Browser,g" ../start-tor-browser.desktop sed -i -e "s,^Icon=.*,Icon=$PWD/browser/icons/mozicon128.png,g" ../start-tor-browser.desktop -sed -i -e "s,^Exec=.*,Exec=sh -c '"$PWD/start-tor-browser" || ([ ! -x "$PWD/start-tor-browser" ] && "$(dirname "$*")"/Browser/start-tor-browser)' dummy %k,g" ../start-tor-browser.desktop +sed -i -e "s,^Exec=.*,Exec=sh -c '"$PWD/start-tor-browser" --detach || ([ ! -x "$PWD/start-tor-browser" ] && "$(dirname "$*")"/Browser/start-tor-browser --detach)' dummy %k,g" ../start-tor-browser.desktop
if [ "$register_desktop_app" -eq 1 ]; then mkdir -p "$HOME/.local/share/applications/" @@ -292,33 +342,29 @@ setControlPortPasswd ${TOR_CONTROL_PASSWD:='"secret"'}
cd "${HOME}"
-# We pass all command-line arguments we got (except --debug) to Firefox. Use -# at your own risk! +# We pass all additional command-line arguments we get to Firefox. # # The --class parameter was added to fix bug 11102. -# -# When passed the --debug option, we log all the output that goes to the -# parent terminal stdout and stderr to a file ('tor-browser-debug.log' in Tor -# Browser's $HOME directory). + if [ "$show_usage" -eq 1 ]; then + # Display Firefox help, then our help TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD} ./firefox --class "Tor Browser" \ - -profile TorBrowser/Data/Browser/profile.default "${@}" 2>/dev/null - printf "\nTor Browser Script Options\n" - printf " --debug Display Tor and Firefox output and record in tor-browser-debug.log\n" - printf " --register-app Register Tor Browser as a desktop app for this user\n" - printf " --unregister-app Unregister Tor Browser as a desktop app for this user\n" -elif [ "$debug" -ne 1 ] ; then + -profile TorBrowser/Data/Browser/profile.default --help 2>/dev/null + tbb_usage +elif [ "$detach" -eq 1 ] ; then TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD} ./firefox --class "Tor Browser" \ - -profile TorBrowser/Data/Browser/profile.default "${@}" > /dev/null 2>&1 </dev/null & + -profile TorBrowser/Data/Browser/profile.default "${@}" > "$logfile" 2>&1 </dev/null & disown "$!" +elif [ "$log_output" -eq 1 -a "$show_output" -eq 1 ]; then + TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD} ./firefox --class "Tor Browser" \ + -profile TorBrowser/Data/Browser/profile.default "${@}" 2>&1 </dev/null | \ + tee "$logfile" +elif [ "$show_output" -eq 1 ]; then + TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD} ./firefox --class "Tor Browser" \ + -profile TorBrowser/Data/Browser/profile.default "${@}" < /dev/null else - # Place logfile in the tbb root dir. - logfile=../tor-browser-debug.log - printf "Launching Tor Browser for Linux in ${HOME}...\n" - printf "Logging Tor Browser debug information to file: %s\n" "$logfile" TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD} ./firefox --class "Tor Browser" \ - -profile TorBrowser/Data/Browser/profile.default "${@}" -jsconsole 2>&1 </dev/null | \ - tee $logfile + -profile TorBrowser/Data/Browser/profile.default "${@}" > "$logfile" 2>&1 </dev/null fi
exit $? diff --git a/RelativeLink/start-tor-browser.desktop b/RelativeLink/start-tor-browser.desktop index c8be973..d6c1c63 100755 --- a/RelativeLink/start-tor-browser.desktop +++ b/RelativeLink/start-tor-browser.desktop @@ -3,21 +3,24 @@ # This file is a self-modifying .desktop file that can be run from the shell. # It preserves arguments and environment for the start-tor-browser script. # -# When run, it will update itself with the absolute path to the current TBB -# location. It is therefore possible to install/relocate this file after first -# run (for example, by copying it to ~/.local/share/applications/ so that Tor -# Browser will appear in your desktop applications menu). +# Run './start-tor-browser.desktop --help' to display the full set of options. +# +# When invoked from the shell, this file must always be in a Tor Browser root +# directory. When run from the file manager or desktop GUI, it is relocatable. +# +# After first invocation, it will update itself with the absolute path to the +# current TBB location, to support relocation of this .desktop file for GUI +# invocation. You can also add Tor Browser to your desktop's application menu +# by running './start-tor-browser.desktop --register-app' +# +# If you use --register-app, and then relocate your TBB directory, Tor Browser +# will no longer launch from your desktop's app launcher/dock. However, if you +# re-run --register-app from inside that new directory, the script +# will correct the absolute paths and re-register itself. # # This file will also still function if the path changes when TBB is used as a # portable app, so long as it is run directly from that new directory, either # via the shell or via the file manager. -# -# If you installed this file to ~/.local/share/applications/ and then relocate -# your TBB directory, Tor Browser will no longer launch from your desktop's -# app launcher/dock. However, if you re-run this file from inside that new -# directory, it will correct the absolute paths, and you can then copy it back -# into ~/.local/share/applications/ again to restore desktop launch -# functionality.
[Desktop Entry] Type=Application @@ -25,6 +28,6 @@ Name=Tor Browser Setup GenericName=Web Browser Comment=Tor Browser is +1 for privacy and -1 for mass surveillance Categories=Network;WebBrowser;Security; -Exec=sh -c '"$(dirname "$*")"/Browser/start-tor-browser || ([ ! -x "$(dirname "$*")"/Browser/start-tor-browser ] && "$(dirname "$*")"/start-tor-browser)' dummy %k -X-TorBrowser-ExecShell=./Browser/start-tor-browser +Exec=sh -c '"$(dirname "$*")"/Browser/start-tor-browser --detach || ([ ! -x "$(dirname "$*")"/Browser/start-tor-browser ] && "$(dirname "$*")"/start-tor-browser --detach)' dummy %k +X-TorBrowser-ExecShell=./Browser/start-tor-browser --detach Icon=web-browser