view packaging/linux-installer.inc @ 1306:845048d4a69f

(issue159) Use user specific appdata directory for nss list with simple rights. Using the ProgramData folder with resticted access rights failed in case the process was not elevated.
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 13 Oct 2014 12:31:37 +0200
parents 34c92dbfee7e
children 77c9e35657ab
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 u,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 [ $UPDATE -eq 0 ]; then
    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
  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/