Home page > OS X Portable Applications > Portable Firefox OS X source code
Source code index | Portable Firefox OS X script source code:
Shell Script (from release 4.0)
Portable Firefox.app is packaged using the Platypus script wrapper from
http://sveinbjorn.sytes.net/platypus
#!/bin/sh -x
##########################################################################
#
# Portable Firefox OS X
# $Revision: 4.1
#
# The Contents of this file are made available subject to the terms
# of the following license
#
# - GNU General Public License Version 3
#
# Carlo Gandolfi, Paolo Portaluri January 2010
#
# GNU General Public License Version 3
# =============================================
# Copyright 2006-2010 by:
# Carlo Gandolfi - http://www.freesmug.org
# Paolo Portaluri - http://plus2.it/~paolo/
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##########################################################################
# Reset PATH
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
appid=Firefox
appbin=firefox-bin
userprefbase="Library/Application Support"
userpref="$HOME/$userprefbase/$appid/Profiles"
usercachebase="$HOME/Library/Caches"
usercache="$usercachebase/$appid"
p_userbase="$1/Contents/Resources"
p_userpref="$p_userbase/profile"
copy_pref="$p_userbase/CopyPref_Done"
CD="$p_userbase/CocoaDialog.app/Contents/MacOS/CocoaDialog"
appicon="$p_userbase/appIcon.icns"
cautionicon="$p_userbase/P_${appid}_Caution.icns"
# ========================================================
# CDokmessage
# CocoaDialog Ok/Cancel message box
# $1 "text"
# $2 "informative text"
# $3 "--no-cancel" = don't show a cancel button
# ========================================================
function CDokmessage {
beep
"$CD" ok-msgbox --icon-file "$appicon" \
--text "$1" --informative-text "$2" "$3"
}
function CDokmessagec {
beep
"$CD" ok-msgbox --icon-file "$cautionicon" \
--text "$1" --informative-text "$2" "$3"
}
function beep {
/usr/bin/osascript << EOT
tell application "Finder"
beep
end tell
EOT
}
# ========================================================
# bsd_command_check
# Check that the required BSD command are installed
# ========================================================
function command_check_msg {
message1="One or more *BSD commands* to run Portable $appid were not found on \
this machine. You must install the BSD Subsystem package that is in the \
following folder on disk 1 of your Mac OS X installation DVD:\n/Welcome to Mac \
OS X/Optional Installs.\n\nNow quit."
button=`/usr/bin/osascript << EOT
tell application "Finder"
beep
display dialog "$message1" buttons {"Quit"} \
with icon caution default button "Quit"
set result to button returned of result
end tell
EOT`
if test "$button" == "Quit"; then # Quit application
exit 112
fi
}
function bsd_command_check { # written by Patrick Luby
commands="awk cp defaults diskutil echo grep ln mkfifo mkdir mv plutil ps rm sed sleep touch"
for i in $commands ; do
if [ ! -x "/usr/bin/$i" -a ! -x "/bin/$i" -a ! -x "/usr/sbin/$i" -a ! -x "/sbin/$i" ] ; then
# Return 96 + 16 if a command is not found
command_check_msg;
exit 112;
fi
done
}
# ========================================================
# osx_version_check
# Check that the user is running Mac OS X 10.4 or higher
# ========================================================
function version_check_msg {
message1="You are running OS X version $version.\n\
Portable $appid can only be opened on Mac OS X 10.4 or higher."
button=`/usr/bin/osascript << EOT
tell application "Finder"
beep
display dialog "$message1" buttons {"Quit"} \
with icon caution default button "Quit"
set result to button returned of result
end tell
EOT`
if test "$button" == "Quit"; then # Quit application
exit 113
fi
}
function osx_version_check { # written by Patrick Luby
if [ -x "/usr/bin/sw_vers" ] ; then
# Return 96 + 17 if it is a bad version
version=`/usr/bin/sw_vers | grep '^ProductVersion:' | awk '{ print $2 }'`
case "$version" in
10.[0123]) version_check_msg ; exit 113;;
10.[0123].*) version_check_msg ; exit 113;;
esac
fi
}
# ========================================================
# quitapp
# Check if local app is open and quit
# ========================================================
function quitapp {
if ps cx | grep '[0-9] '"$appbin"'$' > /dev/null; then
rv=` CDokmessage "$appid is already running on this system" \
"Only one copy can be run at a time. \
Quit runnig $appid and reopen Portable $appid." "--no-cancel" `
if [ "$rv" == "1" ] ; then # Quit application
exit 0
fi
fi
}
# ========================================================
# check_p_asf
# Check and create Portable Application Support folders
# ========================================================
function check_p_asf {
# "Read Only" string in till OsX 10.5
readonly5=`diskutil info "$p_userbase" | grep "Read Only" | awk '{ print $3 }'`
# "Read-Only Volume:" srting on OsX 10.6
readonly6=`diskutil info "$p_userbase" | grep "Read-Only Volume" | awk '{ print $3 }'`
if [ "$readonly5" = Yes ] || [ "$readonly6" = Yes ]; then
CDokmessagec "Portable $appid is on a locked volume" "Portable $appid can't \
be opened on a locked volume. Now quit." "--no-cancel" > /dev/null
exit 0
else
if [ ! -d "$p_userpref" ] ; then
mkdir -p "$p_userpref"
fi
fi
}
# ========================================================
# copy_local_pref
# Copy local preferences to Portable Application
# ========================================================
function select_profile {
rvpf=` "$CD" fileselect --title "Select local $appid Profile folder" \
--text "Look for a folder named \"********.default\" or similar." \
--select-only-directories --with-directory "$userpref" `
if [ -f "$rvpf/prefs.js" ] ; then
profilepath="$rvpf"; export profilepath
else
rv=` CDokmessagec "$appid Profile folder not selected" "Sorry you have not choose \
$appid Profile folder. You have selected: \"$rvpf\". Try again?" `
if [ "$rv" == "1" ] ; then
select_profile
elif [ "$rv" == "2" ] ; then
rv=` CDokmessage "Portable $appid now quit" \
"You have not choose $appid Profile folder, now Portable $appid quit." \
"--no-cancel" `
if [ "$rv" == "1" ] ; then # Quit application
exit 0
fi
fi
fi
}
function runcopypref { # written by Kevin Hendricks
rm -f /tmp/hpipe
mkfifo /tmp/hpipe
"$CD" progressbar --indeterminate --title "Copying $appid Profile" \
--text "Copying \"$rvpf\". Please wait..." < /tmp/hpipe &
exec 3<> /tmp/hpipe
echo -n . >&3
# do all of your work here
cp -R "$rvpf/" "$p_userpref"
exec 3>&-
wait
rm -f /tmp/hpipe
}
function check_asf {
if [ -d "$p_userpref" ] ; then
# delete p_userpref if it still exist
rm -Rf "$p_userpref"
else
mkdir -p "$p_userpref"
fi
}
# copy Preferences Folder
function copy_pf {
userprefsize=`du -hc "$userpref" | cut -f1 | tail -1`
freesize=`df -H "$p_userbase" | tail -1 | awk '{print $4}'`
buserprefsize=`du -c "$userpref" | cut -f1 | tail -1`
bfreesize=`df "$p_userbase" | tail -1 | awk '{print $4}'`
if [ $buserprefsize -lt $bfreesize ] ; then
rv=` CDokmessage "Copy $appid Profile" \
"Your $appid Profile folder \"$rvpf\" is $userprefsize. \
You have $freesize available. Copy to Portable $appid?" `
if [ "$rv" == "1" ] ; then
if check_asf ; runcopypref ; then
touch -f "$copy_pref"
"$CD" bubble --title "$appid Profile copied" --text "Local \
$appid Profile copied to Portable $appid with success." \
--icon-file "$appicon"
else
"$CD" bubble --title "$appid Profile copy error" \
--text "An error occurred copying $appid Profile to Portable $appid." \
--icon-file "$cautionicon" --no-timeout
fi
fi
else
CDokmessagec "No space to copy $appid Profile" \
"Your $appid Profile folder is $userprefsize. \
You have $freesize available. There is no enough space. Portable $appid will \
open without copy existing $appid Profile." "--no-cancel" > /dev/null
fi
}
function copy_local_pref {
if [ ! -f "$copy_pref" ] && [ -d "$userpref" ] ; then
beep
text="Copy local Profile"
informativetext="Copy the existing $appid Profile \
on this system to Portable $appid?"
rv=`"$CD" msgbox --no-newline --icon-file "$appicon" \
--text "$text" --informative-text "$informativetext" \
--button1 "Copy" --button2 "Don't Copy" --button3 "Never"`
if [ "$rv" == "1" ] ; then
select_profile
copy_pf
elif [ "$rv" == "3" ] ; then
touch -f "$copy_pref"
fi
fi
}
# ========================================================
# bu/recover cache
# BackUp existing cache
# ========================================================
function bu_cache {
if [ -d "$usercache" ] ; then
mv "$usercache" "$usercache.pabu"
fi
}
function recover_cache {
if [ -d "$usercache.pabu" ] ; then
mv "$usercache.pabu" "$usercache"
fi
}
function remove_p_cache {
if [ -d "$usercache" ] ; then
rm -rf "$usercache"
fi
}
# ========================================================
# run
# Open Portable Application
# ========================================================
function run_app {
"$p_userbase/$appid.app/Contents/MacOS/$appbin" -profile "$p_userpref"
}
# ========================================================
# open_p_app
# Run Portable Application script
# ========================================================
function set_p_app {
bu_cache # Backup exixting Cache folder
}
function close_p_app {
remove_p_cache # Remove portable cache
recover_cache # Restore existing cache
}
function open_p_app {
if set_p_app ; then
"$CD" bubble --title "Portable $appid setup ok" --text "Portable \
$appid open with success." --icon-file "$appicon" &
else
CDokmessagec "Portable $appid setup error" \
"An error occour while opening portable preferences. Now quit." "--no-cancel" > /dev/null
close_p_app
exit 0
fi
run_app # Run application from external drive
if close_p_app ; then
"$CD" bubble --title "Portable $appid quit" --text "Portable \
$appid quit with success." --icon-file "$appicon" &
else
CDokmessagec "Portable $appid quit error" \
"Portable $appid can't restore local cache." "--no-cancel" > /dev/null
fi
}
bsd_command_check
osx_version_check
check_p_asf
quitapp
copy_local_pref
open_p_app
exit 0
Shell Scrip (from release 4.0)
AppleScript (from release 3.0)
tell application "Finder" to set perc to the container of (path to me) as alias
set perc to quoted form of POSIX path of perc
do shell script "" & perc & "app/Firefox.app/Contents/MacOS/firefox -profile " & perc & "app/profile"
If you are one of the few that have not Finder open and don't wont to start it opening Portable Applications, use this code:
tell application "System Events" to set perc to the path of container of (path to me)
Shell Script (till release 2.0)
From How Do I run Firefox off a USB drive? and with the help listed in Credits, this is the script that start Firefox from any device:
#!/bin/sh
here="`dirname \"$0\"`"
echo "Starting Firefox from '$here'."
echo "Wait a while before Firefox start."
sh "$here/app/Firefox.app/Contents/MacOS/firefox" -profile "$here/profile"
echo "Done!"
echo "When finish, quit Terminal.app before eject your portable device."
EOF