Select Git revision
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
linuxparty.sh 15.44 KiB
#!/bin/bash
set -e
#options for GUI are kdialog zenity none
if [ -z "$GUI" ]; then
echo "\$GUI is not set. Auto detecting GUI..."
if command -v zenity 2>&1 > /dev/null && test -n "$DISPLAY"; then
GUI=zenity
elif command -v kdialog 2>&1 > /dev/null && test -n "$DISPLAY"; then
GUI=kdialog
else
GUI=none
fi
fi
echo "Using GUI=$GUI."
if [ "$GUI" == "none" ]; then
NOGUI=yes
fi
MY_DIR="$( readlink -f "$( dirname "${BASH_SOURCE[0]}" )" )"
#images already installed
# TODO: include libreoffice-common (for documentation)?
PREINSTALLED_PKGS="thunderbird vlc kile"
#APT_ARGS="--quiet -y --allow-unauthenticated"
APT_ARGS="--quiet -y"
#Liste, in der alle Pakete verzeichnet werden, die vom Skript tatsächlich installiert werden; Pseudo-Pakete sind "all-capital"
INSTALLED_PKGS="HEADER COMMON $PREINSTALLED_PKGS"
#Paketlisten zur Installation/Auswahl, nur Pakete die im Repo liegen.
#Hive-Programme (z.B. anaconda) müssen extra behandelt werden
#Der Textinstaller installiert _ausschließlich_ Pakete bei denen Preinstalled gesetzt ist!
#Syntax: preinstalled? pkgname description
COMMON_PKGS=()
while read line; do
echo "$line" | grep -q '^[^|#]*[cC][^|]*|' || continue
COMMON_PKGS+=("$(echo "$line" | sed -e '/^[^|#]*C[^|]*|/s/^.*$/TRUE/' -e '/^[^|#]*c[^|]*|/s/^.*$/FALSE/')" \
"$(echo "$line" | cut -d'|' -f 2)" "$(echo "$line" | cut -d'|' -f 3)")
done < "$MY_DIR/../packages"
PH_PKGS=()
while read line; do
echo "$line" | grep -q '^[^|#]*[pP][^|]*|' || continue
PH_PKGS+=("$(echo "$line" | sed -e '/^[^|#]*P[^|]*|/s/^.*$/TRUE/' -e '/^[^|#]*p[^|]*|/s/^.*$/FALSE/')" \
"$(echo "$line" | cut -d'|' -f 2)" "$(echo "$line" | cut -d'|' -f 3)")
done < "$MY_DIR/../packages"
IF_PKGS=()
while read line; do
echo "$line" | grep -q '^[^|#]*[iI][^|]*|' || continue
IF_PKGS+=("$(echo "$line" | sed -e '/^[^|#]*I[^|]*|/s/^.*$/TRUE/' -e '/^[^|#]*i[^|]*|/s/^.*$/FALSE/')" \
"$(echo "$line" | cut -d'|' -f 2)" "$(echo "$line" | cut -d'|' -f 3)")
done < "$MY_DIR/../packages"
M_PKGS=()
while read line; do
echo "$line" | grep -q '^[^|#]*[mM][^|]*|' || continue
M_PKGS+=("$(echo "$line" | sed -e '/^[^|#]*M[^|]*|/s/^.*$/TRUE/' -e '/^[^|#]*m[^|]*|/s/^.*$/FALSE/')" \
"$(echo "$line" | cut -d'|' -f 2)" "$(echo "$line" | cut -d'|' -f 3)")
done < "$MY_DIR/../packages"
if [ -n "$DEBUG" ]
then
# DEBUG-Modus:
echo
echo "DEBUG Modus aktiviert"
echo "MY_DIR: $MY_DIR"
echo
DEBUG="echo DEBUG: "
apt-get() {
echo "APT-GET $@"
}
#/ DEBUG-Modus:
else
# Root pruefen
if [[ $EUID -ne 0 ]]
then
echo "Du bist nicht ROOT ... verwende \"sudo bash $0\" !"
exit 1
fi
fi
# deprecated
preinstalledpkgs() {
local pkglist=$1[@]
local take="FALSE"
local step=0
for i in "${!pkglist}"
do
case $step in
0) take="$i"
step=1
;;
1) if [ $take = "TRUE" ]; then
echo -n " $i"
fi
step=2
;;
*)
step=0
;;
esac
done
}
bright() {
# gruen
echo -ne "\033[1m$@\033[0m"
}
ok() {
echo
echo -ne "\033[32;7m" # gruen
echo -n "$@"
echo -e "\033[0m" # normal
}
warn() {
echo
echo -ne "\033[33;7m" # gelb
echo -n "$@"
echo -e "\033[0m" # normal
}
case "$GUI" in
none)
askyesno() {
while true
do
read -n1 -p "$1 [j,n]"
echo
case "$REPLY" in
y|Y|j|J) return 0;;
n|N) return 1;;
*) echo 'Antworte bitte mit "j" für "Ja" oder "n" für "Nein"' ;;
esac
done
}
pressenter() {
echo $@
echo "Drücke <Enter> um fortzufahren (Strg-C zum Abbrechen)"
read
}
err() {
echo
echo -ne "\033[31;7m" # rot
echo -n "$@"
echo -e "\033[0m" # normal
}
install_pkgs() {
#ACHTUNG: nicht vorausgewählte Pakete werden _nie_ installiert!
local arg=$3[@]
pkglist=$(preinstalledpkgs $3)
if [ -n "$pkglist" ]; then
INSTALLED_PKGS="$INSTALLED_PKGS $4" #register pseudo package
apt-install $pkglist
ok "$pkglist installiert"
else
ok "Keine Pakete installiert"
fi
}
ask_license() {
#TODO dumm Benutzer kann evtl nicht ganze Lizenz lesen...
cat "$1"
askyesno "Die obige Lizenzvereinbarung akzeptieren?"
return $?
}
;;
zenity)
askyesno() {
zenity --width 300 --question --text "$@" 2> /dev/null
}
err() {
zenity --width 300 --error --text "$@" 2> /dev/null
}
pressenter() {
zenity --width 300 --info --text "$@" 2> /dev/null
}
install_pkgs() {
local pkglist=$3[@]
INSTALL=$(zenity --list --hide-column=2 --title "$1" --text "$2" --checklist --separator=" " --width=786 --height=400 --column "Installieren?" --column "Paket" --column "Beschreibung" "${!pkglist}" 2> /dev/null || true)
if [ -n "$INSTALL" ]; then
INSTALLED_PKGS="$INSTALLED_PKGS $4" #register pseudo package
apt-install $INSTALL
ok "$INSTALL installiert"
else
ok "Keine Pakete installiert"
fi
}
ask_license() {
zenity --text-info \
--title="Lizenzvereinbarung akzeptieren" \
--filename="$1" \
--checkbox="Ich habe die Lizenzvereinbarung gelesen und akzeptiere sie."
return $?
}
;;
kdialog)
askyesno() {
kdialog --yesno "$@" 2> /dev/null
}
err() {
kdialog --error "$@" 2> /dev/null
}
pressenter() {
kdialog --msgbox "$@" 2> /dev/null
}
install_pkgs() {
local pkglist=$3[@]
declare -a kdlist
local tag=""
local text=""
local use=""
local n=0
local i=0
for e in "${!pkglist}"; do
case $n in
0)
if [ "$e" == "TRUE" ]; then
use="on"
else
use="off"
fi
n=1
;;
1)
tag="$e"
n=2
;;
2)
text="$e"
kdlist[$i]="$tag"
i=$((i+1))
kdlist[$i]="$text"
i=$((i+1))
kdlist[$i]="$use"
i=$((i+1))
n=0
;;
esac
done
INSTALL=$(kdialog --geometry 786x400 --title "$1" --checklist "$2" "${kdlist[@]}" 2> /dev/null || true)
if [ -n "$INSTALL" ]; then
INSTALLED_PKGS="$INSTALLED_PKGS $4" #register pseudo package
apt-install $(echo $INSTALL | tr -d \")
ok "$INSTALL installiert"
else
ok "Keine Pakete installiert"
fi
}
ask_license() {
kdialog --title="Lizenzvereinbarung akzeptieren" \
--yes-label "Ich habe die Lizenz gelsen und akzeptiere sie." \
--no-label "Abbrechen" --yesno "$(cat "$1")"
return $?
}
;;
*)
echo "Ungültige GUI Option '$GUI'. Möglich Werte sind 'kdialog', 'zenity' oder 'none'"
exit 1
;;
esac
# Verbose error trapping
showerr() {
err "Bei der Installation ist ein Fehler aufgetreten. Frage eine:n Helfer:in."
}
trap showerr ERR
apt-install() {
apt-get ${APT_SOURCE_ARG} install ${APT_ARGS} $@
INSTALLED_PKGS="$INSTALLED_PKGS $@"
}
install_common() {
install_pkgs "Allg. Pakete installieren?" "Programme, die der OSAK/die ALUG für sinnvoll hält, sind bereits zur Installation vorselektiert.\nWenn du keine Pakete aus der Liste installieren willst, einfach Abbrechen.\nBitte beachten: Das LIP-Script deinstalliert keine Pakete, insbesondere also keine Pakete die in einem früheren Lauf aktiv waren,\nund diesmal nicht ausgewählt sind!" COMMON_PKGS ""
}
install_ph() {
install_pkgs "Pakete für Physiker:innen installieren?" "Programme, die der OSAK/die ALUG sowie Lehrstühle der Physik für sinnvoll hält, sind bereits zur Installation vorselektiert.\nWenn du keine Pakete aus der Liste installieren willst, einfach Abbrechen.\nBitte beachten: Das LIP-Script deinstalliert keine Pakete, insbesondere also keine Pakete die in einem früheren Lauf aktiv waren,\nund diesmal nicht ausgewählt sind!" PH_PKGS "PHYSIK"
}
install_m() {
install_pkgs "Pakete für Mathematiker:innen installieren?" "Programme, die der OSAK/die ALUG für sinnvoll hält, sind bereits zur Installation vorselektiert.\nWenn du keine Pakete aus der Liste installieren willst, einfach Abbrechen.\nBitte beachten: Das LIP-Script deinstalliert keine Pakete, insbesondere also keine Pakete die in einem früheren Lauf aktiv waren,\nund diesmal nicht ausgewählt sind!" M_PKGS "MATHEMATIK"
}
install_if() {
install_pkgs "Pakete für Informatik/Programmierung installieren?" "Programme, die der OSAK/die ALUG für sinnvoll hält, sind bereits zur Installation vorselektiert.\nWenn du keine Pakete aus der Liste installieren willst, einfach Abbrechen.\nBitte beachten: Das LIP-Script deinstalliert keine Pakete, insbesondere also keine Pakete die in einem früheren Lauf aktiv waren,\nund diesmal nicht ausgewählt sind!" IF_PKGS "INFORMATIK"
}
create_doc()
{
DOCUDIR="$MY_DIR/../Doku"
if [ ! -f "$DOCUDIR/HEADER.tex" ]; then #HEADER muss ex. sonst kommt auf keinen Fall was sinnvolles bei rum
echo "Leider ist keine Dokumentation auf dem LIP-Stick vorhanden..."
return 0 #linuxparty.sh soll auch ohne Doku Verzeichnis laufen
fi
#DOCFILE=$(mktemp --suffix='.tex')
WORKING_DIR=$(mktemp -d)
cp -a "$DOCUDIR/." "$WORKING_DIR"
for PACKAGE in $INSTALLED_PKGS; do
#zenity and kdialog return quoted package names; nice for apt call but bad here
CLEAN_PACKAGE_NAME=$(echo "$PACKAGE" | tr -d "\" ")
echo "Dokumentation fuer $PACKAGE von ${WORKING_DIR}/${CLEAN_PACKAGE_NAME}.tex"
if [ -f "${WORKING_DIR}/${CLEAN_PACKAGE_NAME}.tex" ]; then
echo "\\input{${CLEAN_PACKAGE_NAME}.tex}" >> "$WORKING_DIR/DOCUMENTATION.gen.tex"
#cat "${DOCUDIR}/${CLEAN_PACKAGE_NAME}.tex" >> "$DOCFILE"
fi
done
pushd "$WORKING_DIR"
pdflatex -output-directory "$WORKING_DIR" "DOCUMENTATION.gen.tex"
pdflatex -output-directory "$WORKING_DIR" "DOCUMENTATION.gen.tex" # ja, ist Absicht
if [ $? -ne 0 ]; then
err "Fehler beim kompilieren der Dokumentation."
return 1
fi
popd
# jetzt wird hoffentlich an alle relevanten Stellen kopiert
ls -1 /home | grep -v '^kubuntu$' | while read line
do
[ -e "/home/$line/Deine-LIP-Dokumentation.pdf" ] && mv "/home/$line/Deine-LIP-Dokumentation.pdf" "/home/$line/Deine-LIP-Dokumentation-old.pdf"
cp "${WORKING_DIR}/DOCUMENTATION.gen.pdf" "/home/$line/Deine-LIP-Dokumentation.pdf"
done
RC=$?
pressenter "Eine Dokumentation der von dir installierten Pakete wurde in deinem Benutzerverzeichnis als 'Deine-LIP-Dokumentation.pdf' abgelegt."
return $RC
}
echo "Entferne Ubuntu Installer (bleibt manchmal über...)"
apt-get purge ubiquity --yes || true
apt-get autoremove --yes
echo
echo "Auf dem Install-USB-Stick liegen viele der zu installierenden Pakete"
bright "Es ist dringend empfohlen, jetzt einen Instaĺl-USB-Stick einzustecken"
echo
echo "Sonst muss aus dem Internet heraus installiert werden. Das ist langsam, geht aber auch."
# Make sure that RWTH update server ist listed in the packages sources
if ! grep -q 'rwth' /etc/apt/sources.list
then
source /etc/lsb-release
newsourcefile=$(mktemp)
echo "deb http://ftp.halifax.rwth-aachen.de/ubuntu/ $DISTRIB_CODENAME main restricted universe multiverse
deb http://ftp.halifax.rwth-aachen.de/ubuntu/ $DISTRIB_CODENAME-security main restricted universe multiverse
deb http://ftp.halifax.rwth-aachen.de/ubuntu/ $DISTRIB_CODENAME-updates main restricted universe multiverse
" > $newsourcefile
cat /etc/apt/sources.list >> $newsourcefile
mv $newsourcefile /etc/apt/sources.list
chmod +r /etc/apt/sources.list
fi
HAVELIPSTICK=0
#Offline-Repo einbinden
if bash "$MY_DIR/infuse_offline_repo.sh"
then
HAVELIPSTICK=1
ok "USB-Repository gefunden und eingebunden"
else
if [[ $? -eq 2 ]]
then
# Exit code 2 is handed up from mount-stick-repo.sh -> "Installation abbrechen"
err "Installation abgebrochen"
exit 2
else
#warn "LIP-Install-USB-Stick nicht nutzbar."
#warn "Stelle eine Internetverbindung her und mache weiter (langsames Installieren)"
#warn "Wenn Du nicht weiter weißt, frage einen Helfer."
#pressenter
pressenter "LIP-Install-USB-Stick nicht nutzbar.\nStelle eine Internetverbindung her und mache weiter (langsames Installieren)\nWenn Du nicht weiter weißt, frage eine:n Helfer:in."
fi
fi
if [ -e /etc/apt/sources.list.d/lipoffline.list ]
then
APT_SOURCE_ARG='-o Dir::Etc::SourceList=/etc/apt/sources.list.d/lipoffline.list'
else
APT_SOURCE_ARG='-o Dir::Etc::SourceList=/etc/apt/sources.list'
fi
# Paketquellen bereitlegen.
echo
echo "Bereitstellung der Paketquellen"
# Entweder apt-get update
# Oder apt-clone restore (apt-clone ist in Kubuntu 21.10 nicht mehr verfügbar)
if [[ $HAVELIPSTICK -eq 1 ]]
then
# infuse script has already done our job here
echo "Nutze Pakete vom USB-Repository"
# echo "Bereite apt-clone vor"
# dpkg -GERi "/var/cache/apt/archives/dpkg-early-install" >/dev/null 2>&1
# APT_CLONE_BACKUP="$(mktemp --tmpdir="$HOME" --suffix='.apt-clone.tar.gz')"
# echo "Erstelle Backup der apt Paketquellen in ${APT_CLONE_BACKUP}"
# apt-clone clone "${APT_CLONE_BACKUP}" >/dev/null 2>&1
# echo "Wende apt-clone an"
# apt-clone restore "/var/cache/apt/archives/apt-clones/ftp-halifax.apt-clone.tar.gz" >/dev/null 2>&1 || true
else
#echo "Update der Paketquellen aus dem Internet mit 'apt-get update'"
# Wie sichert man apt-get update ab ?
# apt-get -o Dir::Etc::SourceList=/etc/apt/sources.list.d/lipoffline.list,Dir::Etc::SourceParts="" update
apt-get ${APT_SOURCE_ARG} update
fi
if [ -n "$ASKTOSKIP" ]; then
if ! askyesno "Möchtest du an dieser Stelle Aktualisierungen und spezielle Software für dein Studium installieren (empfohlen)?"
then
bash $MY_DIR/liprepoctl.sh off
exit 0
fi
fi
pressenter "Im folgenden werden Aktualisierungen installiert. Dies wird einige Minuten dauern."
echo "Installiere Updates (hoffentlich vom USB-Repo)"
apt-get ${APT_SOURCE_ARG} upgrade ${APT_ARGS}
echo "Installiere Standard-Programme"
apt-get ${APT_SOURCE_ARG} install ${APT_ARGS} $(grep '^[^|#]*D[^|]*|' "$MY_DIR/../packages" | cut -d'|' -f 2)
# System absichern
if askyesno "Netzwerk: Soll die Ubuntu Firewall (ufw/gufw) aktiviert werden ?"
then
$DEBUG ufw enable
fi
echo "Installation:"
echo "Programme, die für alle Fachrichtungen interessant sind (7zip, gimp, git, ... )"
if [ -z "$NOGUI" ] || (askyesno "Sollen diese Programme installiert werden ?"); then
install_common
fi
#Fachrichtung wählen
echo
echo "Auswahl fachspezifischer Software:"
if askyesno "Software für Vorlesung 'Programmierung' (Pflicht für Informatiker:innen) installieren ?"
then
install_if
fi
if askyesno "Software für Mathematiker:innen installieren ?"
then
install_m
fi
if askyesno "Software für Physiker:innen (Python-SciPy,-NumPy,diverse Plot-Programme) installieren ?"
then
install_ph
fi
echo
pressenter "Installation abgeschlossen!\n\nFalls Du doch noch mehr Software installieren möchtest, starte $0 erneut."
echo
#Folgende Pakete koennen auch fuer Helfer waehrend der Installation interessant sein:
PKGS_EXTRA="fityk openssh-server linux-firmware-nonfree zsh zsh-doc lftp graphviz gddrescue smartmontools"
echo "Auf dem Installer-USB-Stick sind außerdem noch die folgenden Pakete enthalten:"
echo ${PKGS_EXTRA}
echo "Installiere diese Pakete bei Bedarf bitte selbst mit 'sudo apt-get install <Paketname>' "
echo "Deaktiviere LIP Software Repository"
bash $MY_DIR/liprepoctl.sh off
INSTALLED_PKGS="$INSTALLED_PKGS FOOTER"
create_doc
echo "Installierte Pakete: $INSTALLED_PKGS"
echo
#end;