diff --git a/stage3/00-install-yunohost/files/install_yunohost b/stage3/00-install-yunohost/files/install_yunohost deleted file mode 100644 index 754aa43..0000000 --- a/stage3/00-install-yunohost/files/install_yunohost +++ /dev/null @@ -1,520 +0,0 @@ -#!/bin/bash - -# Copyright (C) 2015-2017 YunoHost -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - -set -u - -# Globals - -readonly YUNOHOST_LOG="/var/log/yunohost-installation_$(date +%Y%m%d_%H%M%S).log" - -############################################################################### -# Main functions # -############################################################################### - -function usage() { - echo " -Usage : - `basename $0` [-a] [-d ] [-h] - -Options : - -a Enable automatic mode. No questions are asked. - This does not perform the post-install step. - -d Choose the distribution to install ('stable', 'testing', 'unstable'). - Defaults to 'stable' - -f Ignore checks before starting the installation. Use only if you know - what you are doing. - -h Prints this help and exit -" -} - -function parse_options() -{ - AUTOMODE=0 - DISTRIB=stable - BUILD_IMAGE=0 - FORCE=0 - - while getopts ":aid:fh" option; do - case $option in - a) - AUTOMODE=1 - export DEBIAN_FRONTEND=noninteractive - ;; - d) - DISTRIB=$OPTARG - ;; - f) - FORCE=1 - ;; - i) - # This hidden option will allow to build generic image for Rpi/Olimex - BUILD_IMAGE=1 - ;; - h) - usage - exit 0 - ;; - :) - usage - exit 1 - ;; - \?) - usage - exit 1 - ;; - esac - done -} - -function main() -{ - parse_options "$@" - - check_assertions - - step upgrade_system || die "Unable to update the system" - step install_script_dependencies || die "Unable to install dependencies to install script" - step create_custom_config || die "Creating custom configuration file /etc/yunohost/yunohost.conf failed" - step confirm_installation || die "Installation cancelled at your request" - step setup_package_source || die "Setting up deb package sources failed" - step apt_update || die "Error caught during 'apt-get update'" - step register_debconf || die "Unable to insert new values into debconf database" - step workaround_avahi_installation || die "Unable to install workaround for avahi installation" - step install_yunohost_packages || die "Installation of Yunohost packages failed" - step restart_services || die "Error caught during services restart" - - if is_raspbian ; then - step del_user_pi || die "Unable to delete user pi" - step setup_firstboot || die "Unable to setup firstboot" - fi - - if [[ "$BUILD_IMAGE" == "1" ]] ; then - step clean_image || die "Unable to clean image" - fi - - if is_raspbian ; then - # Reboot should be done before postinstall to be able to run iptables rules - reboot - fi - - step post_install || die "Post-installation failed" - - info "Installation logs are available in $YUNOHOST_LOG" - success "YunoHost installation completed !" - exit 0 -} - -############################################################################### -# Helpers # -############################################################################### - -readonly normal=$(printf '\033[0m') -readonly bold=$(printf '\033[1m') -readonly faint=$(printf '\033[2m') -readonly underline=$(printf '\033[4m') -readonly negative=$(printf '\033[7m') -readonly red=$(printf '\033[31m') -readonly green=$(printf '\033[32m') -readonly orange=$(printf '\033[33m') -readonly blue=$(printf '\033[34m') -readonly yellow=$(printf '\033[93m') -readonly white=$(printf '\033[39m') - -function success() -{ - local msg=${1} - echo "[${bold}${green} OK ${normal}] ${msg}" | tee -a $YUNOHOST_LOG -} - -function info() -{ - local msg=${1} - echo "[${bold}${blue}INFO${normal}] ${msg}" | tee -a $YUNOHOST_LOG -} - -function warn() -{ - local msg=${1} - echo "[${bold}${orange}WARN${normal}] ${msg}" | tee -a $YUNOHOST_LOG >&2 -} - -function error() -{ - local msg=${1} - echo "[${bold}${red}FAIL${normal}] ${msg}" | tee -a $YUNOHOST_LOG >&2 -} - -function die() { - error "$1" - info "Installation logs are available in $YUNOHOST_LOG" - exit 1 -} - -function step() { - info "Running $1" - $* - local return_code="$?" - return $return_code -} - -function apt_get_wrapper() { - if [[ "$AUTOMODE" == "0" ]] ; - then - debconf-apt-progress \ - --logfile $YUNOHOST_LOG \ - -- \ - apt-get $* - else - apt-get $* >> $YUNOHOST_LOG 2>&1 - fi -} - - -function apt_update() { - apt_get_wrapper update -} - -############################################################################### -# Installation steps # -############################################################################### - -function check_assertions() -{ - # Assert we're on Debian - # Note : we do not rely on lsb_release to avoid installing a dependency - # only to check this... - [[ -f "/etc/debian_version" ]] || die "This script can only be ran on Debian." - - # Assert we're on Stretch - # Note : we do not rely on lsb_release to avoid installing a dependency - # only to check this... - [[ "$(cat /etc/debian_version)" =~ ^9.* ]] || die "This script can only be ran on Debian Stretch." - - # Assert we're root - [[ "$(id -u)" == "0" ]] || die "This script must be run as root." - - # Assert systemd is installed - command -v systemctl > /dev/null || die "YunoHost requires systemd to be installed." - - # If we're on Raspbian, we want the user 'pi' to be logged out because - # it's going to be deleted for security reasons... - if is_raspbian ; then - user_pi_logged_out || die "The user pi should be logged out." - fi - - # Check possible conflict with apache, bind9. - [[ -z "$(dpkg --get-selections | grep -v deinstall | grep 'bind9 ')" ]] || [[ "$FORCE" == "1" ]] \ - || die "Bind9 is installed and might conflict with dnsmasq. Uninstall it first, or if you know what you are doing, run this script with -f." - - [[ -z "$(dpkg --get-selections | grep -v deinstall | grep 'apache2 ')" ]] || [[ "$FORCE" == "1" ]] \ - || die "Apache is installed and might conflict with nginx. Uninstall it first, or if you know what you are doing, run this script with -f." - -} - -function upgrade_system() { - - apt_get_wrapper update \ - || return 1 - - apt_get_wrapper -y dist-upgrade \ - || return 2 - - if is_raspbian ; then - apt_get_wrapper -o Dpkg::Options::="--force-confold" \ - -y --force-yes install rpi-update \ - || return 3 - - if [[ "$BUILD_IMAGE" != "1" ]] ; then - rpi-update >> $YUNOHOST_LOG 2>&1 \ - || return 4 - fi - fi -} - -function install_script_dependencies() { - # dependencies of the install script itself - local DEPENDENCIES="lsb-release wget whiptail" - - if [[ "$AUTOMODE" == "0" ]] ; - then - DEPENDENCIES+=" dialog" - fi - - apt_get_wrapper -o Dpkg::Options::="--force-confold" \ - -y --force-yes install \ - $DEPENDENCIES \ - || return 1 -} - -function create_custom_config() { - # Create YunoHost configuration folder - mkdir -p /etc/yunohost/ - - # Store info about installation method - touch /etc/yunohost/from_script -} - -function confirm_installation() { - [[ "$AUTOMODE" == "1" ]] && return 0 - - local text=" -Caution ! - -Your configuration files for : - - postfix - - dovecot - - mysql - - nginx - - metronome -will be overwritten ! - -Are you sure you want to proceed with the installation of Yunohost? -" - whiptail --title "Yunohost Installation" --yesno "$text" 20 78 -} - -function setup_package_source() { - - local CUSTOMAPT=/etc/apt/sources.list.d/yunohost.list - - # Debian repository - - # FIXME : move "vinaigrette." to "repo." at some point... - local CUSTOMDEB="deb http://vinaigrette.yunohost.org/debian/ stretch stable testing unstable" - - if [[ "$DISTRIB" == "stable" ]] ; then - echo "$CUSTOMDEB" > $CUSTOMAPT - elif [[ "$DISTRIB" == "testing" ]] ; then - echo "$CUSTOMDEB testing" > $CUSTOMAPT - elif [[ "$DISTRIB" == "unstable" ]] ; then - echo "$CUSTOMDEB testing unstable" > $CUSTOMAPT - fi - - # Add YunoHost repository key to the keyring - # FIXME : move "vinaigrette." to "repo." at some point... - wget -O- https://vinaigrette.yunohost.org/yunohost.asc -q | apt-key add -qq - >/dev/null 2>&1 -} - -function register_debconf() { - debconf-set-selections << EOF -slapd slapd/password1 password yunohost -slapd slapd/password2 password yunohost -slapd slapd/domain string yunohost.org -slapd shared/organization string yunohost.org -slapd slapd/allow_ldap_v2 boolean false -slapd slapd/invalid_config boolean true -slapd slapd/backend select MDB -postfix postfix/main_mailer_type select Internet Site -postfix postfix/mailname string /etc/mailname -mysql-server-5.5 mysql-server/root_password password yunohost -mysql-server-5.5 mysql-server/root_password_again password yunohost -mariadb-server-10.0 mysql-server/root_password password yunohost -mariadb-server-10.0 mysql-server/root_password_again password yunohost -nslcd nslcd/ldap-bindpw password -nslcd nslcd/ldap-starttls boolean false -nslcd nslcd/ldap-reqcert select -nslcd nslcd/ldap-uris string ldap://localhost/ -nslcd nslcd/ldap-binddn string -nslcd nslcd/ldap-base string dc=yunohost,dc=org -libnss-ldapd libnss-ldapd/nsswitch multiselect group, passwd, shadow -EOF -} - -function workaround_avahi_installation() { - - # When attempting several installation of Yunohost on the same host - # with a light VM system like LXC - # we hit a bug with avahi-daemon postinstallation - # This is described in detail in https://github.com/lxc/lxc/issues/25 - # - # It makes the configure step of avahi-daemon fail, because the service does - # start correctly. Then all other packages depending on avahi-daemon refuse to - # configure themselves. - # - # The workaround we use is to generate a random uid for the avahi user, and - # create the user with this id beforehand, so that the avahi-daemon postinst - # script does not do it on its own. Our randomized uid has far less chances to - # be already in use in another system than the automated one (which tries to use - # consecutive uids). - - # Return without error if avahi already exists - if id avahi > /dev/null 2>&1 ; then - info "User avahi already exists (with uid $(id avahi)), skipping avahi workaround" - return 0 - fi - - # Get a random unused uid between 500 and 999 (system-user) - local avahi_id=$((500 + RANDOM % 500)) - while cut -d ':' -f 3 /etc/passwd | grep -q $avahi_id ; - do - avahi_id=$((500 + RANDOM % 500)) - done - - info "Workaround for avahi : creating avahi user with uid $avahi_id" - - # Use the same adduser parameter as in the avahi-daemon postinst script - # Just specify --uid explicitely - adduser --disabled-password --quiet --system \ - --home /var/run/avahi-daemon --no-create-home \ - --gecos "Avahi mDNS daemon" --group avahi \ - --uid $avahi_id -} - -function install_yunohost_packages() { - # Allow sudo removal even if no root password has been set (on some DO - # droplet or Vagrant virtual machines), as YunoHost use sudo-ldap - export SUDO_FORCE_REMOVE=yes - - # On some machines (e.g. OVH VPS), the /etc/resolv.conf is immutable - # We need to make it mutable for the resolvconf dependency to be installed - chattr -i /etc/resolv.conf 2>/dev/null || true - - # Install YunoHost - apt_get_wrapper \ - -o Dpkg::Options::="--force-confold" \ - -y --force-yes install \ - yunohost yunohost-admin postfix -} - -function restart_services() { - service slapd restart -# service yunohost-firewall start - service unscd restart - service nslcd restart - - # NOTE : We don't fail if slapd fails to restart... - return 0 -} - -function post_install() { - # No postinstall in auto mode - [[ "$AUTOMODE" == "1" ]] && return 0 - - # Remove whiptail and dialog remains... - clear - - local text=" -Yunohost packages have been installed successfully! - -You can now proceed with Yunohost post-installation. -This is where you will be asked for : -- the main DNS domain name of your server -- the administration password - -You can also perform this step later on your own : -- either from a shell, by running 'yunohost tools postinstall' - as root -- either from your web browser, by accessing https://yunohost.local - -Please refer to https://yunohost.org/#/postinstall -for additionnal information. - -Do you want to proceed with YunoHost post-installation now? -" - whiptail --title "Post-installation" --yesno "$text" 25 78 \ - || return 0 - - /usr/bin/yunohost tools postinstall - - local POSTINSTALL_EXIT_CODE="$?" - while [[ "$POSTINSTALL_EXIT_CODE" != "0" ]] ; - do - local text_retry=" -Yunohost post-installation has failed. - -Do you want to try again now? -" - whiptail --title "Post-installation" --yesno "$text_retry" 12 78 --defaultno \ - || return $POSTINSTALL_EXIT_CODE - - /usr/bin/yunohost tools postinstall - POSTINSTALL_EXIT_CODE="$?" - done - return 0 -} - -############################################################################### -# Raspbian specific stuff # -############################################################################### - -function is_raspbian() { - # On Raspbian image lsb_release is available - if [[ "$(lsb_release -i -s 2> /dev/null)" != "Raspbian" ]] ; - then - return 1 - fi - return 0 -} - -function user_pi_logged_out() { - who | grep pi > /dev/null && return 1 - return 0 -} - -function del_user_pi() { - deluser --remove-all-files pi >> $YUNOHOST_LOG 2>&1 -} - -function setup_firstboot() { - - cat > /etc/init.d/yunohost-firstboot << EOF -#!/bin/sh -### BEGIN INIT INFO -# Provides: expand rootfs and Generates new ssh host keys on first boot -# Required-Start: \$remote_fs \$syslog -# Required-Stop: \$remote_fs \$syslog -# Default-Start: 2 3 4 5 -# Default-Stop: -# Short-Description: Generates new ssh host keys on first boot -# Description: Generates apt-get --purge clean new ssh host keys on $ -### END INIT INFO -echo "Expanding rootfs ..." -raspi-config --expand-rootfs -echo "Removing myself ..." -insserv -r /etc/init.d/yunohost-firstboot -rm -f /etc/init.d/yunohost-firstboot -rm /etc/yunohost/firstboot -echo "Rebooting ..." -reboot -EOF - chmod a+x /etc/init.d/yunohost-firstboot - insserv /etc/init.d/yunohost-firstboot - touch /etc/yunohost/firstboot -} - -############################################################################### -# Image building specific stuff # -############################################################################### - -function clean_image() { - # Delete SSH keys - rm -f /etc/ssh/ssh_host_* >> $YUNOHOST_LOG 2>&1 - yes | ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa >> $YUNOHOST_LOG 2>&1 - yes | ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa >> $YUNOHOST_LOG 2>&1 - yes | ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -N '' -t ecdsa -b 521 >> $YUNOHOST_LOG 2>&1 - - # Deleting logs ... - find /var/log -type f -exec rm {} \; >> $YUNOHOST_LOG 2>&1 - - # Purging apt ... - apt-get --purge clean >> $YUNOHOST_LOG 2>&1 -} - - -############################################################################### - -main "$@"