Skip to content
Snippets Groups Projects
Select Git revision
  • 9b7f5ec332c902ff1a20e49e3552f4d157b4cdba
  • master default protected
  • postgres_integration
  • s3compatible
  • intros
  • bootstrap4
  • modules
7 results

jobmanagement.py

Blame
  • 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;