view packaging/linux-installer.inc @ 1258:469c1a04b678

(issue54) On update copy and remove the updated files instead of extracting This avoids errors when the application is running.
author Andre Heinecke <andre.heinecke@intevation.de>
date Fri, 26 Sep 2014 12:45:27 +0200
parents 551b274ec4d1
children 5e0c338552b4
line wrap: on
line source
#!/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 (Anwendung "Terminal").
# 3. Wechseln Sie in das Verzeichnis, in dem diese Datei gespeichert
#    ist (z.B. per Kommandozeile mit: "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-amd64.sh
#    Tipp: Die Tab-Taste nach dem "Tr" ergänzt oft den ganzen Namen.
#
# Übrigens, wir konnten kein übliches .deb-Paket verwenden, da
# TrustBridge Ihnen auch die Installation als reiner Nutzer ohne
# Admin-Rechte ermöglichen soll.
#
#
# 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 (application "Terminal").
# 3. Change your working directory to where this file is stored.
#    (e.g. 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-amd64.sh
#    Hint: If you press the tab-key after "Tr" it may complete the
#    filename.
#
# By the way: We could not have used a .deb package, because the
# installation must also work without without adminstrator
# priviledges.
#
#
# Copyright (C) 2014
# by Bundesamt für Sicherheit in der Informationstechnik (BSI).
# Software engineering by Intevation GmbH.
#
# This file is Free Software under the GNU GPL (v>=2)
# and comes with ABSOLUTELY NO WARRANTY!
# For details and the license of TrustBridge
# see the folder "licenses" after installation
# check the corresponding revision of it online at
# https://wald.intevation.org/hg/trustbridge/file/tip/licenses

set -u

###INCLUDE:linux-installer-common.inc
###INCLUDE:linux-installer.l10n-de

###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 "  -u, --uninstall    uninstall 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 uninstall,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
        ;;
      --uninstall|-u)
        DEINSTALL=1
        shift 1
        ;;
      --update)
# Update is an internal option that is used when the application calls
# the installer to install an 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"
    UN_RUNCMD="sudo "
  else
    getxt "Single user installation successful.\n"
    UN_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 uninstall command:\n"
  echo "  $UN_RUNCMD ${instcfg[PREFIX]}/bin/trustbridge-uninstall.sh"

  echo "################################################################################"
  if ! [ $(id -u) -eq 0 ]; then
    getxt "Press enter to launch '%s'\n" "${instcfg[PREFIX]}/bin/trustbridge"
    getxt "or press Control-C to quit the installer.\n"
    read
    "${instcfg[PREFIX]}/bin/trustbridge" &
  else
    getxt "You can now launch '%s'\n" "${instcfg[PREFIX]}/bin/trustbridge"
  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 [ "${TMPEXTRACT_DIR:-}" ]; then
      temp_dirs+=("$TMPEXTRACT_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
  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"
OLDWD="$PWD"

if [ $UPDATE -eq 1 ]; then
    # Trustbridge might be running. Install into temporary dir
    # and move the directory into the installation prefix afterwards
    TMPEXTRACT_DIR=$(mktemp -d)
    cd "$TMPEXTRACT_DIR"
else
    cd "${instcfg[PREFIX]}"
fi

set +u
set -- '-c'
# ----------------------------------------------------------------------
# regular shar archive inserted here:
###SHAR###
# ----------------------------------------------------------------------

if [ $UPDATE -eq 1 ]; then
    cp -fr "$TMPEXTRACT_DIR/bin" "${instcfg[PREFIX]}"
    cp -fr "$TMPEXTRACT_DIR/share" "${instcfg[PREFIX]}"
fi

cd "$OLDWD"

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/