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

http://wald.intevation.org/projects/trustbridge/