Skip to content
Snippets Groups Projects
Commit a61c23a8 authored by Pietsch, Martin's avatar Pietsch, Martin
Browse files

current state of installer

parent 9862f470
No related branches found
No related tags found
No related merge requests found
#!/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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment