Skip to content
Snippets Groups Projects
Commit 79a2b157 authored by Christoph Johannes Kleine's avatar Christoph Johannes Kleine
Browse files

add main script in bootlocal, installer and functions

parent 9862f470
No related branches found
No related tags found
No related merge requests found
#!/bin/sh
cd /opt
installer.sh
# include develop config
. ./installer.config
# include functions.sh
. ./functions.sh
# wait for Network
# wait max 100 seconds until something is in /etc/resolv.conf
while ! test -s /etc/resolv.conf
do
[ "$counter" -ge 100 ] && exit 1
let "counter+=1"
echo "waiting " $counter "seconds for network :-)"
sleep 1
done
# chmod / or tc user can not login, so no tce-load would be possible
chmod 755 /
# install packages required by diskpreperation.sh
installTcPackages bash parted bc ntfs-3g dosfstools
# workaround for limited availability of btrfs-progs and reiserfsprogs
if [ uname -m -eq x86_64 ]
then installTcPackages btrfs-progs
else installTcPackages reiserfsprogs
fi
# install and set keyboard layout for debugging
installTcPackages kmaps util-linux
loadkmap </usr/share/kmap/qwertz/de-latin1-nodeadkeys.kmap
mkdir /target
chmod 0755 /target
# include install.sh
. ./installer.sh | tee >> /tmp/installer.logfile
mkdir -p /target/etc/ssh/
chmod 0755 /target/etc/ssh/
chown 0:0 /target/etc/ssh/
cp /opt/ansible.pub /target/etc/ssh/authorized_keys
chmod 0644 /target/etc/ssh/authorized_keys
chown 0:0 /target/etc/ssh/authorized_keys
cp /tmp/fstab /etc/fstab
chmod 0644 /etc/fstab
chown 0:0 /etc/fstab
echo "installer finished"
INSTALLER_BIND_MOUNTS="/dev /sys /proc"
INSTALLER_BIND_UMOUNTS="/proc /sys /dev"
# -------------------------------------------------------------------
# Logging
log() {
echo "$@" >> $INSTALLER_LOGFILE
}
exec_log() {
echo "> $@" >> $INSTALLER_LOGFILE
"$@" &>> $INSTALLER_LOGFILE
}
exec_log_err() {
echo "> $@" >> $INSTALLER_LOGFILE
"$@" 2>> $INSTALLER_LOGFILE
}
upload_logfile() {
curl -s --capath ./certs -H "Content-Type: text/plain" -T "$INSTALLER_LOGFILE" -m 20 "$INSTALLER_LOGFILE_URL" > /dev/null
}
# -------------------------------------------------------------------
# UI
# Nachricht ohne OK-Button
dialog_info() {
log ">>> $1"
dialog --title "SDM-Installation" --infobox "$1" 15 70 || exit 1
}
# Nachricht mit OK-Button
dialog_msg() {
log ">>> $1"
dialog --title "SDM-Installation" --msgbox "$1" 15 70 || exit 1
}
dialog_ask_password() {
dialog --title "SDM-Installation" --insecure --nocancel --passwordbox "Passwort:" 15 70
}
fatal_error() {
upload_logfile
log "!!! Installation abgebrochen: "
dialog_msg "$@ Bestätigen, um Rechner neuzustarten."
exit 1
}
# -------------------------------------------------------------------
# Bind mounts
bind_mount() {
for DISKS_PARTITIONS_FS in $INSTALLER_BIND_MOUNTS
do
mount --bind $DISKS_PARTITIONS_FS "$target$DISKS_PARTITIONS_FS"
done
}
bind_umount() {
for DISKS_PARTITIONS_FS in $INSTALLER_BIND_UMOUNTS
do
umount "$target$DISKS_PARTITIONS_FS"
done
}
# -------------------------------------------------------------------
# Paritionierung
# neue Partitionstabelle anlegen
part_clean() {
# Anfang der Festplatte überschreiben, um GPT Tabelle wegzubekommen
exec_log dd if=/dev/zero of="$1" bs=1M count=16
sleep 2
part_rescan
sleep 1
if [ "$part" == "msdos" ]
then
exec_log /usr/local/sbin/fdisk "$1" <<EOF
o
w
EOF
elif [ "$part" == "gpt" ]
then
# EFI-Systempartition anlegen ...
exec_log /usr/local/sbin/fdisk "$1" <<EOF
g
w
EOF
fi
}
# neue Partition anlegen
# $2 = Partitionsnummer
# $3 = Start der Partition
# $4 = Ende der Partition (mit + am Anfang: Größe der Partition)
part_new() {
exec_log /usr/local/sbin/fdisk -u "$1" <<EOF
n
p
$2
$3
$4
w
EOF
}
part_rescan() {
sleep 2
exec_log partprobe
sleep 2
}
# -------------------------------------------------------------------
# Partitionierung
# Partitionen anlegen
frz_partition() {
# Partionstabelle erstellen und Partitionen anlegen ohne Fehlerkontrolle.
# manchmal kommt ein Fehler, dass die Partitionstabelle nicht neu
# eingelesen werden konnte. Das ist aber so ziemlich egal, kann aber
# nicht von anderen Fehlern unterschieden werden.
if [ "$partclean" == "yes" ]
then
dialog_info "Erstelle neue Partitionstabelle auf $disk ..."
sleep 2
part_clean "$disk"
part_rescan
fi
if [ -n "$rootpart" ]
then
dialog_info "Erstelle Root-Partition als Partition $rootpart auf $disk"
sleep 1
if [ -n "$rootsize" ]
then part_new "$disk" "$rootpart" "$rootstart" "$rootsize"
else part_new "$disk" "$rootpart" "$rootstart" "$rootend"
fi
fi
if [ -n "$swappart" ]
then
dialog_info "Erstelle Swap-Partition als Partition $swappart auf $disk"
sleep 1
if [ -n "$swapsize" ]
then part_new "$disk" "$swappart" "$swapstart" "$swapsize"
else part_new "$disk" "$swappart" "$swapstart" "$swapend"
fi
fi
part_rescan
}
# -------------------------------------------------------------------
# Formatierung
frz_format() {
if [ -n "$rootpart" ]
then
dialog_info "Formatiere Root-Partition ${disk}${rootpart} mit ext4"
sleep 1
exec_log mkfs.ext4 -q "${disk}${rootpart}" || fatal_error "Formatierung der Root-Partition fehlgeschlagen!"
fi
if [ -n "$swappart" ]
then
dialog_info "Formatiere Swap-Partition ${disk}${swappart}"
sleep 1
exec_log mkswap "${disk}${swappart}" || fatal_error "Formatierung der Swap-Partition fehlgeschlagen!"
fi
}
# -------------------------------------------------------------------
# Mount
frz_mount() {
dialog_info "Mounte Root-Partition ${disk}${rootpart} auf $target"
if [ -n "$rootpart" ]
then
if [ -z "$roottype" ]
then
roottype="ext4"
fi
mkdir -p $target
mount -t "$roottype" "${disk}${rootpart}" "$target" || fatal_error "Das Ziel-Dateisystem konnte nicht eingehangen werden!"
fi
}
# -------------------------------------------------------------------
# Installation
sdm_install() {
frz_log_vars
frz_pre
frz_partition
frz_format
frz_mount
frz_sync
frz_hostname
frz_bootmgr
frz_provision
frz_post
frz_cleanup
}
# -------------------------------------------------------------------
#
frz_log_vars() {
log hostname=$hostname
log force_hostname=$force_hostname
log target=$target
log source=$source
log config=$config
log disk=$disk
log part=$part
log efidisk=$efidisk
log efipart=$efipart
log partclean=$partclean
log rootpart=$rootpart
log rootsize=$rootsize
log rootstart=$rootstart
log rootend=$rootend
log swappart=$swappart
log swapsize=$swapsize
log swapstart=$swapstart
log swapend=$swapend
log subdir=$subdir
}
# -------------------------------------------------------------------
#
frz_pre() {
:
}
# -------------------------------------------------------------------
#
frz_post() {
:
}
# -------------------------------------------------------------------
#
frz_hostname() {
if [ -n "$force_hostname" ]
then
hostname="$force_hostname"
fi
if [ -n "$target" ] && [ -n "$hostname" ]
then
dialog_info "Setze Hostname auf $hostname"
sleep 1
echo $hostname > "$target/etc/hostname"
fi
}
# -------------------------------------------------------------------
#
provision() {
if [ -n "$provision" ]
then
dialog_info "Provisioniere System mit '$provision' ..."
bind_mount
exec_log chroot "$target" /bin/bash -c "cd /etc/ansible; ansible-playbook ${provision}.yml -i hosts --limit local"
bind_umount
fi
}
# -------------------------------------------------------------------
#
frz_cleanup() {
dialog_info "Führe ldconfig aus ..."
exec_log chroot $target ldconfig
umount $target
rmdir $target
return 0
# installTcPackages - install tiny core packages
# parameter:
# space seperated list of package names
# return:
# 0 is installed
# 1 something went wrong
installTcPackages(){
while [ $# -ne 0 ]
do
sudo -u tc tce-load -w -i $1
shift
done
}
#!/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")")"
#!/usr/bin/env bash
# include functions.sh again, thins it is a new environment
. ./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
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)
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
[ -n "$INSTALLER_LOGFILE_URL" ] && INSTALLER_LOGFILE_URL="$INSTALLER_LOGFILE_URL?hostname=$hostname"
[ -n "$INSTALLER_NOTIFY_URL" ] && INSTALLER_NOTIFY_URL="$INSTALLER_NOTIFY_URL?hostname=$hostname"
# ----------------------------------------------------------------------------------------------------------------------
dialog_info "Starte Installation ... \n\nHostname: $hostname \nDistribution: $OS_DISTRIBUTION\nModus: $INSTALLER_MODE\nKonfiguration: $INSTALLER_CONFIG"
sleep 5
# Installation aufrufen
($INSTALLER_MODE)
# include diskpreperation.sh
. ./diskpreperation.sh
if [ $? -eq 0 ]
then
dialog_info "Installationsprotokolle werden hochgeladen ..."
upload_logfile
if [ -n "$INSTALLER_NOTIFY_URL" ]
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."
fi
# include runinstaller.sh if it exists
if [ -f runinstaller.sh ]
. ./runinstaller.sh
else
echo "file runinstaller.sh not found"
fi
#reboot
exit 0
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment