Mercurial > trustbridge
diff packaging/linux-installer.inc @ 1139:1c9001db6ea2
Split up linux installer in to be able to create a uninstaller (TODO).
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Wed, 17 Sep 2014 18:53:04 +0200 |
parents | packaging/linux-installer.inc.in@f1384bf9d4a4 |
children | f67a6873d9c1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/packaging/linux-installer.inc Wed Sep 17 18:53:04 2014 +0200 @@ -0,0 +1,344 @@ +#!/bin/bash +# Um TrustBridge zu installieren: +# 1. Prüfen Sie ob Sie dieser Datei genügend vertrauen, um ihr die Kontrolle +# über diesen Rechner zu übergeben. Beispielsweise durch Vergleich mit +# einer starken Prüfsumme aus einer zweiten, unabhängigen Quelle. +# 2. Öffnen Sie eine Kommandozeile, z.B. klicken Sie auf das "Terminal"-Symbol. +# 3. Wechseln Sie in das Verzeichnis, in welchem diese Datei gespeichert ist. +# Geben Sie Z.B. in die Kommandozeile ein: cd ~/Schreibtisch +# 4. Starten Sie die Anwendung auf der Kommandozeile, beispielsweise +# als Installation nur für den aktuellen Nutzer, indem Sie eingeben: +# bash TrustBridge-1.0.0-i386.sh +# Tipp: Die Tab-Taste nach dem "Tr" ergänzt oft den ganzen Namen. +# +# NB: Wir konnten kein übliches .deb Paket verwenden, da wir Ihnen +# auch die Installation als reiner Nutzer ohne Admin-Rechte ermöglichen. +# +# To install TrustBridge: +# 1. Verify that you trust this specific file far enough, that you are willing +# to hand over the control of your computer to it. For example compare +# a strong checksum of the file to one from a second, independent source. +# 2. Open a command line, e.g. click on the "Terminal"-Symbol. +# 3. Change your working directory to where this file is stored. +# For example type "cd ~/Desktop" on your command line. +# 4. Start the installation on the command line, e.g. for the current user +# only by typing something like "bash TrustBridge-1.0.0-i386.sh". +# Hint: If you press the tab-key after "Tr" it may complete the filename. +# +# N.B. We could not have used a .deb package, because the installation must +# also work without without adminstrator priviledges. +# +# +# Search the file for 'version()' to find the license information. +set -u + +###INCLUDE:linux-installer-common.inc + +###INCLUDE:linux-installer-uninstall.inc + +usage() +{ + getxt "Usage: %s [OPTION]...\n" "$ME" + getxt "Install TrustBridge.\n\n" + getxt "Options:\n" + getxt " -p, --prefix=PATH install files in PATH\n" + getxt " -f, --force install to given prefix, even when a current\n" + getxt " installation with different prefix exists.\n" + getxt " -d, --deinstall deinstall files from current installation\n" + getxt " -s, --system create a system wide (de)installation\n" + getxt " --help display this help and exit\n" + getxt " --version output version information and exit\n" + exit $1 +} + +parse_args() +{ + OPTS=`getopt \ + -l deinstall,update,show-after-update,force,help,prefix:,system,version \ + -o d,f,p:,s -n "$ME" -- "$@"` + [ $? -eq 0 ] || usage 23 + + eval set -- "$OPTS" + + while true ; do + case "$1" in + --prefix|-p) + instcfg[PREFIX]="$2" + shift 2 + ;; + --system|-s) + SYSINST=1 + shift 1 + ;; + --force|-f) + FORCE=1 + shift 1 + ;; + --deinstall|-d) + DEINSTALL=1 + shift 1 + ;; + --update) + UPDATE=1 + shift 1 + ;; + --help) + usage 0 + ;; + --version) + version + ;; + --) + shift + break + ;; + esac + done +} + +finished() +{ + echo + echo "#################################################################################" + if [ $SYSINST -eq 1 ]; then + getxt "System wide installation successful.\n" + RUNCMD="su -l $SUDO_USER -c " + else + getxt "Single user installation successful.\n" + RUNCMD="" + fi + getxt "TrustBridge has been installed to: '%s'\n\n" "${instcfg[PREFIX]}" + + getxt "To remove the application and the root certificates it has inserted,\n" + getxt "call the deinstall command:\n" + echo " $RUNCMD ${instcfg[PREFIX]}/bin/trustbridge-deinstall-TODO.sh" + + echo "#################################################################################" + getxt "Press enter to launch '%s'\n" "${instcfg[PREFIX]}/bin/trustbridge" + if [ $UPDATE -eq 0 ]; then + read + $RUNCMD "${instcfg[PREFIX]}/bin/trustbridge" & + else + $RUNCMD "${instcfg[PREFIX]}/bin/trustbridge" --tray & + fi +} + +cleanup() +{ + getxt "Cleaning up temporary stuff ...\n" + + # remove temporary directories: + local -a temp_dirs + if [ "${lock_dir:-}" ]; then + # $lock_dir is generate by the shar + temp_dirs+=("${instcfg[PREFIX]}/$lock_dir") + fi + if [ "${lock_dir:-}" ]; then + temp_dirs+=("$extra_bin_path") + fi + + for dir in "${temp_dirs[@]-}" ; do + [ -d "$dir" ] && + rm -rf "$dir" + done +} + +write_instcfg() +{ + install -d `dirname "$instcfg_file"` + echo "# Created by TrustBridge-Installer, don't touch!" >"$instcfg_file" + for key in "${!instcfg[@]}" ; do + echo "${key}=${instcfg[$key]}" >>"$instcfg_file" + done +} + +write_autostart() +{ + cat > "$1" << EOF +[Desktop Entry] +Type=Application +Name=TrustBridge +Exec="${instcfg[PREFIX]}/bin/trustbridge" --tray +EOF + chown "${SUDO_USER:-${USER}}" "$1" + chmod 700 "$1" +} + +write_startmenu() +{ + cat > "$1" << EOF +[Desktop Entry] +Type=Application +Name=TrustBridge +Comment=Install and update trusted root certificates +Comment[de]=Vertrauenswürdige Wurzelzertifikate installieren und aktualisieren +Exec=${instcfg[PREFIX]}/bin/trustbridge +Icon=${instcfg[PREFIX]}/share/pixmaps/trustbridge/trustbridge.png +Terminal=false +Categories=Network;Qt; +StartupNotify=false +EOF +} + +setup_startmenu() +{ + # Supported desktop environments: Unity, GNOME, XFCE, LXDE, KDE + # System wide installation with a nonstandard XDG_DATA_HOME is not + # respected with regards to autostart. + if [ ! -d "${startmenu_path}" ]; then + install -d "${startmenu_path}" || \ + fatal "Failed to create startmenu directory: '%s'\n" "$startmenu_path" + fi + + write_startmenu "${startmenu_path}/trustbridge.desktop" + update-desktop-database 2>&1 || true +} + +setup_autostart() +{ + # Supported desktop environments: Unity, GNOME, XFCE, LXDE, KDE + # System wide installation with a nonstandard XDG_CONFIG_HOME or KDEHOME is not + # respected with regards to autostart. + if [ ! -d "${autostart_path}" ]; then + install -d "${autostart_path}" || \ + fatal "Failed to create autostart directory: '%s'\n" "$autostart_path" + fi + + write_autostart "${autostart_path}/trustbridge.desktop" +} + +provide_uudecode_maybe() +{ + # The shar needs uudecode, which might not be installed. If its not + # available we will provide our own python based implementation. + if which uudecode >/dev/null 2>&1 ; then + getxt "Found system uudecode.\n" + else + local myuudecode="$extra_bin_path/uudecode" + cat >"$myuudecode" <<EOF +#!/usr/bin/python2 +import os +import sys +import uu +os.path.chmod = os.chmod +def rm_if_exists(file): + try: + os.remove(file) + except OSError: + pass +os.path.exists = rm_if_exists +if len(sys.argv) > 1: + f = open(sys.argv[1], 'r') +else: + f = sys.stdin +uu.decode(f, None, None, 1) +EOF + chmod 755 "$myuudecode" + PATH="${extra_bin_path}:$PATH" + getxt "Using python uudecode provided by installer.\n" + fi +} + +#====================================================================== +# main() +trap cleanup EXIT + +parse_args "$@" +check_priv +init_vars +read_oldinstcfg + +cat <<EOF +------------------------------------------------------------------------ + + TrustBridge - Installer + Version ${instcfg[VERSION]} - ${ARCH} (Testversion) + +------------------------------------------------------------------------ +EOF + +if [ "$ARCH" == "x86_64" -a "$ARCH" != "$HOST_ARCH" ]; then + getxt "It appears your system architecture is %s.\n" "$HOST_ARCH" + getxt "This installer is for 64 bit systems.\n" + getxt "Really install TrustBridge for '%s' systems? [y/n]\n" "${ARCH}" + yorn || exit 0 +fi + +if [ "$ARCH" == "i386" ]; then + if [[ "$HOST_ARCH" != *86 ]]; then + getxt "It appears your system architecture is %s.\n" "$HOST_ARCH" + getxt "This installer is for 32 bit systems.\n" + getxt "Really install TrustBridge for '%s' systems? [y/n]\n" "${ARCH}" + yorn || exit 0 + fi +fi + +if [ $DEINSTALL -eq 1 ] ; then + deinstall + # Stop after deinstallation: + exit 0 +fi + +if [ -z "${instcfg[PREFIX]}" ] ; then + + if [ "${oldinstcfg[PREFIX]}" ] ; then + inst_default_prefix="${oldinstcfg[PREFIX]}" + getxt "An existing installation (v%s) was detected!\n" "${oldinstcfg[VERSION]}" + getxt "It is HIGHLY RECOMMENDED to accept the default prefix\n" + getxt "to update the current installation.\n" + getxt "For a new prefix you should deinstall first!\n" + fi + getxt "Select installation prefix for TrustBridge [%s]: " "${inst_default_prefix}" + read -e instcfg[PREFIX] + + [ -z "${instcfg[PREFIX]}" ] && instcfg[PREFIX]="${inst_default_prefix}" +else + # Prefix was given on invocation: + if [ "${oldinstcfg[PREFIX]}" -a \ + "${instcfg[PREFIX]}" != "${oldinstcfg[PREFIX]}" -a \ + $FORCE -ne 1 ] ; then + fatal "Prefix differs from current installation (%s). Aborting!\n" "${oldinstcfg[PREFIX]}" + fi +fi + +getxt "Installing to '%s':\n" "${instcfg[PREFIX]}" + +if [ ! -d "${instcfg[PREFIX]}" ] ; then + getxt "creating installation directory ...\n" + install -d "${instcfg[PREFIX]}" || fatal "Could not create '%s'!\n" "${instcfg[PREFIX]}" +fi + +getxt "checking for uudecode ...\n" +provide_uudecode_maybe + +getxt "unpacking files ...\n" +cd "${instcfg[PREFIX]}" + +set +u +set -- '-c' +# ---------------------------------------------------------------------- +# regular shar archive inserted here: +###SHAR### +# ---------------------------------------------------------------------- + +getxt "Preparing trustbridge-tray-starter ...\n" +sed -i "/^PREFIX=/c\PREFIX='${instcfg[PREFIX]}'" \ + "${instcfg[PREFIX]}/bin/trustbridge-tray-starter.sh" + +getxt "Setting up cronjob ...\n" +setup_cronjob + +getxt "Setting up autostart ...\n" +setup_autostart + +getxt "Setting up start menu entries ...\n" +setup_startmenu + +getxt "Writing installation configuration to: %s ...\n" "$instcfg_file" +write_instcfg + +finished + +# cleanup +# is called implicitly at exit via trap... +exit 0