summaryrefslogtreecommitdiff
path: root/indra/viewer_components/updater
diff options
context:
space:
mode:
Diffstat (limited to 'indra/viewer_components/updater')
-rw-r--r--indra/viewer_components/updater/scripts/linux/update_install151
-rwxr-xr-xindra/viewer_components/updater/scripts/linux/xmenity55
2 files changed, 200 insertions, 6 deletions
diff --git a/indra/viewer_components/updater/scripts/linux/update_install b/indra/viewer_components/updater/scripts/linux/update_install
index e0505a9f72..7c08966830 100644
--- a/indra/viewer_components/updater/scripts/linux/update_install
+++ b/indra/viewer_components/updater/scripts/linux/update_install
@@ -1,10 +1,149 @@
#! /bin/bash
-INSTALL_DIR=$(cd "$(dirname "$0")/.." ; pwd)
-export LD_LIBRARY_PATH="$INSTALL_DIR/lib"
-bin/linux-updater.bin --file "$1" --dest "$INSTALL_DIR" --name "Second Life Viewer" --stringsdir "$INSTALL_DIR/skins/default/xui/en" --stringsfile "strings.xml"
-if [ $? -ne 0 ]
- then echo $3 >> "$2"
+# @file update_install
+# @author Nat Goodspeed
+# @date 2013-01-09
+# @brief Update the containing Second Life application bundle to the version in
+# the specified tarball.
+#
+# This bash implementation is derived from the previous linux-updater.bin
+# application.
+#
+# $LicenseInfo:firstyear=2013&license=viewerlgpl$
+# Copyright (c) 2013, Linden Research, Inc.
+# $/LicenseInfo$
+
+tarball="$1" # the file to install
+markerfile="$2" # create this file on failure
+mandatory="$3" # what to write to markerfile on failure
+
+function log {
+ # our log file will be open as stderr -- but until we set up that
+ # redirection, logging to stderr is better than nothing
+ echo "$*" 1>&2
+}
+
+function status {
+ log "$@"
+ # Prefix with '#' so xmenity will recognize it as a status message
+ echo "#$*"
+}
+
+function fail {
+ # Log the message
+ log "$@"
+ # tell subsequent viewer things went south
+ echo "$mandatory" > "$markerfile"
+ # add boilerplate
+ local msg="An error occurred while updating Second Life:
+$*
+Please download the latest viewer from www.secondlife.com."
+ # Restate test from xmenity to detect whether we can use zenity or must
+ # fall back to xmessage
+ zenpath="$(which zenity)"
+ if [ -n "$zenpath" -a -x "$zenpath" ]
+ then "$zenpath" --error --title "Second Life Viewer Updater" \
+ --width=320 --height=120 --text="$msg"
+ else xmessage -buttons -OK:2 -center "$msg"
+ fi
+ exit 1
+}
+
+function sudo_mv {
+ # If we have write permission to both parent directories, shouldn't need
+ # sudo.
+ if [ -w "$(dirname "$1")" -a -w "$(dirname "$2")" ]
+ then mv "$1" "$2" || fail "Couldn't move $1 to $2"
+ else # use one of the likely sudo programs
+ sudo="$(which gksudo)"
+ if [ -z "$sudo" ]
+ then sudo="$(which kdesu)"
+ fi
+ if [ -z "$sudo" ]
+ then # couldn't find either one, just try it anyway
+ mv "$1" "$2" || fail "Couldn't move $1 to $2"
+ else # even with sudo, could fail, e.g. different filesystems
+ "$sudo" mv "$1" "$2" || fail "Couldn't move $1 to $2"
+ fi
+ fi
+}
+
+# empty array
+cleanups=()
+
+function cleanup {
+ # wacky bash syntax for appending to array
+ cleanups[${#cleanups[*]}]="$*"
+}
+
+function onexit {
+ for action in "${cleanups[@]}"
+ do # don't quote, support actions consisting of multiple words
+ $action
+ done
+}
+
+trap 'onexit' EXIT
+
+mydir="$(dirname "$0")"
+# We happen to know that the viewer specifies a marker-file pathname within
+# the logs directory.
+logsdir="$(dirname "$markerfile")"
+logname="$logsdir/updater.log"
+
+# move aside old updater.log; we're about to create a new one
+[ -f "$logname" ] && mv "$logname" "$logname.old"
+
+# Set up redirections for this script such that stderr is logged, while
+# special stdout messages drive our UI, as described in xmenity.
+exec 2> "$logname" | "$mydir/xmenity"
+# Piping to xmenity requires that we end with a line consisting of the string
+# "100" to terminate zenity progress bar.
+cleanup echo 100
+
+# Rather than setting up a special pipeline to timestamp every line of stderr,
+# produce header lines into log file indicating timestamp and the arguments
+# with which we were invoked.
+date 1>&2
+log "$0 $*"
+
+# Log every command we execute, along with any stderr it might produce
+set -x
+
+status 'Installing Second Life...'
+
+# Creating tempdir under /tmp means it's possible that tempdir is on a
+# different filesystem than INSTALL_DIR. One is tempted to create tempdir on a
+# path derived from `dirname INSTALL_DIR`, but then we might need to add
+# another sudo prompt to create it.
+tempdir="/tmp/$(basename "$0").$$"
+tempinstall="$tempdir/install"
+mkdir -p "$tempinstall" || fail "Couldn't create $tempinstall"
+cleanup rm -rf "$tempdir"
+
+# If we already knew the name of the tarball's top-level directory, we could
+# just move that when all was said and done. Since we don't, untarring to the
+# 'install' subdir with --strip 1 effectively renames that top-level
+# directory.
+tar --strip 1 -xjf "$tarball" -C "$tempinstall" || fail "Untar command failed"
+
+INSTALL_DIR="$(cd "$mydir/.." ; pwd)"
+
+# Considering we're launched from a subdirectory of INSTALL_DIR, would be
+# surprising if it did NOT already exist...
+if [ -f "$INSTALL_DIR" ]
+then backup="$INSTALL_DIR.backup"
+ backupn=1
+ while [ -f "$backup" ]
+ do backup="$INSTALL_DIR.backup.$backupn"
+ ((backupn += 1))
+ done
+ sudo_mv "$INSTALL_DIR" "$backup"
fi
+# We unpacked the tarball into tempinstall. Move that.
+sudo_mv "$tempinstall" "$INSTALL_DIR"
+
+rm -f "$tarball"
-rm -f "$1"
+# launch the updated viewer
+"$INSTALL_DIR/secondlife" &
diff --git a/indra/viewer_components/updater/scripts/linux/xmenity b/indra/viewer_components/updater/scripts/linux/xmenity
new file mode 100755
index 0000000000..c0c033904c
--- /dev/null
+++ b/indra/viewer_components/updater/scripts/linux/xmenity
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+# @file xmenity
+# @author Nat Goodspeed
+# @date 2013-01-09
+# @brief Provide progress UI for bash scripts (e.g. update_install) using
+# zenity if available, xmessage if not.
+#
+# $LicenseInfo:firstyear=2013&license=viewerlgpl$
+# Copyright (c) 2013, Linden Research, Inc.
+# $/LicenseInfo$
+
+# This script invokes either zenity --progress or, if zenity is unavailable,
+# wraps xmessage in a zenity-like interface. That is its mutant power.
+# Pass $1 as the title for your zenity box. It is ignored by xmessage.
+# Send updates on stdin:
+# A line containing only a decimal integer from 0 - 100 sets that progress.
+# End with 100 to tell zenity to terminate.
+# A line starting with '#' replaces the progress text.
+# All other stdin lines are ignored.
+
+zenpath="$(which zenity)"
+if [ -n "$zenpath" -a -x "$zenpath" ]
+then # if executable zenity is on PATH, run that instead of this.
+ exec "$zenpath" --progress --title="$1" --auto-close --width=320 --height=120
+fi
+
+# Arriving here means we don't have zenity available. The remainder of this
+# script is the xmessage wrapper.
+
+# We operate by leaving one background xmessage process running. This is the
+# pid of that process.
+xmpid=""
+
+function clear_message {
+ [ -n "$xmpid" ] && kill $xmpid
+ xmpid=""
+}
+
+# Cancel any pending xmessage, regardless of how we exit.
+trap 'clear_message' EXIT
+
+while read line
+do # terminate like zenity --progress
+ [ "$line" == "100" ] && break
+ # ignore everything but replacement text
+ nohash="${line#'#'}"
+ # if stripping leading hash doesn't change line, it doesn't have one
+ [ "$nohash" == "$line" ] && continue
+ # clear any previous message
+ clear_message
+ # put up a new xmessage and capture its pid
+ xmessage -buttons OK:2 -center "$nohash" &
+ xmpid=$!
+done