diff --git a/files/installer.sh b/files/installer.sh index 8d242deab8f2687906b512d90ca386ff73204410..547d4bfd58eac0dcd5857a2b7ef3871904c457bb 100755 --- a/files/installer.sh +++ b/files/installer.sh @@ -1,176 +1,194 @@ -#!/bin/bash -# Variablen: -export INSTALLER_DNS="tu-dresden.de" -export INSTALLER_CONFIG='' -export INSTALLER_CONFIG_FILE="/tmp/installer-tmpfile.sh" -export INSTALLER_CONFIG_URL='' -export INSTALLER_DEBUGGING='' -export INSTALLER_ERROR_ACTION=reboot -export INSTALLER_LOGFILE="/tmp/installer.log" -export INSTALLER_MODE='sdm_install' -export INSTALLER_NOTIFY_URL='' - -# VERWENDETE VARIABLEN -# OS_DISTRIBUTION - -# ---------------------------------------------------------------------------------------------------------------------- -# Vorbereitung -update-ca-certificates -uname -r -[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS -sleep 5 -export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin/ - - - -# damit das Skript von überall aus gestartet werden kann: -# in eigenen Ordner wechseln -# dirname: gibt Pfad aus ohne Dateiname -# readlink: kompletter Pfad aus $0 -cd "$(dirname "$(readlink -f "$0")")" - -. ./functions.sh - -# prüfe, wenn uid ungliche Null -if ! [ $EUID -eq 0 ] -then - echo "Der SDM-Installer muss als Benutzer »root« gestartet werden!" - exit 1 -fi - -clear -# dmesg -n: gibt auf Konsole Nr x aus -dmesg -n 1 -# swap auschalten -swapoff -a - - -# ---------------------------------------------------------------------------------------------------------------------- -# Auf Netzwerk warten - -# hier wird mit Status-Anzeige 10x probiert INSTALLER_DNS (tu-dresden.de) aufzulösen (um die DNS-Konfiguration durch DHCP abzuwarten) -( - -counter=0 -while ! nslookup $INSTALLER_DNS 2> /dev/null > /dev/null +#!/usr/bin/env bash + +export DISK_SDA_SCHEME="msdos" +declare -a DISK_SDA_PARTITIONS=() +DISK_SDA_PARTITIONS+=("1GB:fat32:/boot:defaults:0:0:False") +DISK_SDA_PARTITIONS+=("12.5GB:ext4:/:defaults:0:0:True") +export DISK_SDA_PARTITIONS +export DISK_SDB_SCHEME="mbr" +declare -a DISK_SDB_PARTITIONS=() +DISK_SDB_PARTITIONS+=("12G:swap::defaults:0:0:true") +export DISK_SDB_PARTITIONS + +declare -a DISK_DEVICES=("sda") +export DISK_DEVICES + +# convertSizeToByte - converts a given size to byte +# parameter: +# $1 - size in "kB", "MB", "MiB", "GB", "GiB", "TB" or "TiB" +# return: +# size in byte +convertSizeToByte() { + local unit=$(echo $1 | sed "s/[1-9\.]*//g") + local value=$(echo $1 | sed "s/[a-zA-Z%]*//g") + local factor=1 + + case ${unit} in + "B") factor=1;; + "kB") factor=1000 ;; + "MB") factor=1000000 ;; + "GB") factor=1000000000 ;; + "TB") factor=1000000000000 ;; + "kiB") factor=1024 ;; + "MiB") factor=1048576 ;; + "GiB") factor=1073741824 ;; + "TiB") factor=1099511627776 ;; + *) factor=1 ;; + esac + + res=$(dc -e "0k ${value} ${factor} * p") + + echo "${res%.*}" +} + +# convertByteToSize - converts a byte size to a given unit +# parameter: +# $1 - size in byte +# $2 - unit like "kB", "MB", "MiB", "GB", "GiB", "TB" or "TiB" +# return: +# rounded size with unit +convertByteToSize() { + local factor=1 + + case $2 in + "B") factor=1;; + "kB") factor=1000 ;; + "MB") factor=1000000 ;; + "GB") factor=1000000000 ;; + "TB") factor=1000000000000 ;; + "kiB") factor=1024 ;; + "MiB") factor=1048576 ;; + "GiB") factor=1073741824 ;; + "TiB") factor=1099511627776 ;; + *) factor=1 ;; + esac + + res=$(dc -e "2k $1 ${factor} / p") + echo "${res%.*}$2" +} + +# validateDiskScheme - checks the scheme of a disk device +# parameter: +# $1 - disk device name +# retur: +# 0 - no changes +# 1 - label has changed +validateScheme() { + local lbl=$(echo $diskdata[0] | cut -f 6 -d ":") + local retval=1 + local scheme=$(eval echo \$DISK_$(echo $1 | tr [a-z] [A-Z])_SCHEME) + + if [ "x${scheme}" = "x${lbl}" ]; + then + retval=0 + fi + + return ${retval} +} + +# initialDiskScheme - initials the scheme of a disk device +# parameter: +# $1 - disk device name +# return: +# none +initialDiskScheme() { + local scheme=$(eval echo \$DISK_$(echo $1 | tr [a-z] [A-Z])_SCHEME) + + if [ ${scheme} = "mbr" ]; + then + parted -s -m /dev/$1 mklabel msdos + else + parted -s -m /dev/$1 mklabel ${scheme} + fi + + return +} + +# validateDiskPartitions - checks the partitions of a disk device +# parameter: +# $1 - disk device name +# return: +# 0 - no changes +# 1 - partions has changed +validateDiskPartitions() { + declare -a parts=() + local retval=0 + + for part in $(eval "for p in \${DISK_$(echo $1 | tr [a-z] [A-Z])_PARTITIONS[@]}; do echo \$p; done ") + do + parts+=(${part}) + done + + if [ ${#parts[@]} -eq $((${#diskdata[@]} - 1)) ]; + then + for idx in $(seq 1 1 ${#parts[@]}) + do + gsize=$(convertSizeToByte $(echo ${parts[$((${idx} - 1))]} | cut -f 1 -d ":")) + dsize=$(convertSizeToByte $(echo ${diskdata[${idx}]} | cut -f 4 -d ":")) + diffperc=$(dc -e "2k $dsize $gsize - 100 * $gsize / p" | sed -e "s/^-//g") + + if [ -n "x${diffperc%.*}" ]; + then + diffperc=0 + fi + + #if difference between current disk size and given disk size more than 1% then partitions has changed + if [ ${diffperc%.*} -gt 1 ]; + then + retval=1 + fi + done + else + retval=1 + fi + + return ${retval} +} + +# initialDiskPartitions - initial the partitions of a disk device +# parameter: +# $1 - disk device name +# return: +# none +initialDiskPartitions() { + declare -a parts=() + local start=$(convertSizeToByte "1MiB") + local fs="" + local size="" + local end="" + + for part in $(eval "for p in \${DISK_$(echo $1 | tr [a-z] [A-Z])_PARTITIONS[@]}; do echo \$p; done ") + do + fs=$(echo ${part} | cut -f 2 -d ":") + fsize=$(echo ${part} | cut -f 1 -d ":") + size=$(convertSizeToByte $(echo ${part} | cut -f 1 -d ":")) + end=$((${start} + ${size})) + parted -a optimal -s -m /dev/$1 mkpart primary ${fs} $(convertByteToSize ${start} "MiB") $(convertByteToSize ${end} "MiB") + start=${end} + done +} + +for disk in ${DISK_DEVICES[@]} do - [ "$counter" -ge 100 ] && exit 1 - - counter=$(expr $counter + 1) - echo $counter - - sleep 1 -done - -echo XXX -echo 100 -echo "Netzwerkverbindung erfolgreich." -echo XXX - -sleep 5 -# Lampda Funktion, die Klammern "fangen" die Ausgabe ab -# --gauge Infobox mit Höhe Breite %Anzeige, XXX ist für dialog erforderlich -) | dialog --title "SDM-Installation" --gauge "Warte auf Netzwerk-Verbindung ..." 15 70 0 - -if [ ${PIPESTATUS[0]} -eq 1 ] -then - dialog_info "Netzwerkverbindung gescheitert! Der Rechner wird neugestartet." && sleep 3 - $INSTALLER_ERROR_ACTION; exit 1 -fi - - -export hostname="$(hostname)" - - -# ---------------------------------------------------------------------------------------------------------------------- -# Parameter - -# Kernel-Parameter in Umgebung übernehmen -export $(cat /proc/cmdline) - -# Debug-Modus -> Installation überspringen und in eine Shell droppen -# verlassen durch? vielleicht reboot oder poweroff -if [ -n "$INSTALLER_DEBUGGING" ] -then - while true - do - bash - done -fi - -# Parameter prüfen -if [ -z "$OS_DISTRIBUTION" ] && [ -n "$INSTALLER_MODE" ] -then - dialog_info "Fehlende Parameter! Der Rechner wird neugestartet." && sleep 3 - $INSTALLER_ERROR_ACTION; exit 1 -fi - -# ---------------------------------------------------------------------------------------------------------------------- -# Konfiguration laden -if [ -n "$INSTALLER_CONFIG_URL" ] -then - if [[ "$INSTALLER_CONFIG_URL" == http* ]] - then - INSTALLER_CONFIG_URL="$INSTALLER_CONFIG_URL?hostname=$hostname" - dialog_info "Hole Installationskonfiguration von Server ..." && sleep 1 - - if ! curl -s --capath ./certs/ -o "$INSTALLER_CONFIG_FILE" "$INSTALLER_CONFIG_URL?hostname=$hostname" > /dev/null - then - dialog_info "Installations-Skript konnten nicht geholt werden!\n\nDer Rechner wird neugestartet." && sleep 3 - $INSTALLER_ERROR_ACTION; exit 1 - fi - chmod +x "$INSTALLER_CONFIG_FILE" - export $INSTALLER_CONFIG="$INSTALLER_CONFIG_FILE" - fi -fi - - -# Konfiguration entweder über URL oder fest in das Tinycore einbauen unter $INSTALLER_CONFIG_FILE -# das . VAR lädt den Inhalt der Datei in die Shell Umgebung -. "$INSTALLER_CONFIG" - - -# nochmal aus cmdline überschreiben -export $(cat /proc/cmdline) + declare -a diskdata=() -if [ $(type -t $INSTALLER_MODE) != "function" ] -then - dialog_info "Unbekannte Methode: $INSTALLER_MODE. Der Rechner wird neugestartet." && sleep 3 - $INSTALLER_ERROR_ACTION; exit 1 -fi + for ddt in $(parted -s -m /dev/${disk} print 2>/dev/null | sed '1d;s/[ ]*//g') + do + diskdata+=(${ddt}) + done -[ -n "$INSTALLER_LOGFILE_URL" ] && INSTALLER_LOGFILE_URL="$INSTALLER_LOGFILE_URL?hostname=$hostname" -[ -n "$INSTALLER_NOTIFY_URL" ] && INSTALLER_NOTIFY_URL="$INSTALLER_NOTIFY_URL?hostname=$hostname" + validateScheme ${disk} + + if [ $? -eq 0 ]; + then + validateDiskPartitions ${disk} - -# ---------------------------------------------------------------------------------------------------------------------- - - -dialog_info "Starte Installation ... \n\nHostname: $hostname \nDistribution: $OS_DISTRIBUTION\nModus: $INSTALLER_MODE\nKonfiguration: $INSTALLER_CONFIG" -sleep 5 - -# Installation aufrufen -($INSTALLER_MODE) - -if [ $? -eq 0 ] -then - dialog_info "Installationsprotokolle werden hochgeladen ..." - upload_logfile - - if [ -n "$INSTALLER_NOTIFY_URL" ] + if [ $? -ne 0 ]; then - dialog_info "Installation erfolgreich.\n\nMelde an Server ..." - - if curl -s --capath ./certs/ "$INSTALLER_NOTIFY_URL" > /dev/null - then - dialog_info "Installation erfolgreich.\n\nDer Rechner wird neugestartet." && sleep 3 - else - dialog_msg "Installation erfolgreich.\n\nServer nicht erreichbar.\n\nBestätigen, um Rechner neuzustarten." - fi - else - dialog_msg "Installation erfolgreich.\n\nBestätigen, um Rechner neuzustarten." + initialDiskPartitions ${disk} fi -fi - -#reboot -exit 0 + else + initialDiskScheme ${disk} + initialDiskPartitions ${disk} + fi +done