#!/bin/bash

#Aufgabe 2f
if [ "$EUID" -ne 0 ]; then
    echo "Bitte mit sudo ausführen."
    exit 1
fi

# Aufgabe 2a
create_course() {	#Hier wird der Studiengang angelegt.
    course="$1"

    if [ -z "$course" ]; then		#Wenn kein Studiengangsname angegeben wird, kommt eine Fehlermeldung
        echo "Fehler: Kein Studiengang angegeben."
        exit 1		#Es gab einen Fehler und das Script wird beendet
    fi

    mkdir -p /home/studiengang		#Hier wird das Verzeichnis angelegt

    if getent group "$course" > /dev/null; then		#Es wird überprüft ob die Gruppe schon existiert
        echo "Fehler: Gruppe existiert bereits."
        exit 1
    fi
    

    if [ -d "/home/studiengang/$course" ]; then		#Hier wird überprüft ob das Verzeichnis des Studiengangs schon existiert
        echo "Fehler: Studiengang existiert bereits."
        exit 1
    fi

    groupadd "$course"		#Hier wird die entsprechende Gruppe angelegt
    mkdir "/home/studiengang/$course"		#Hier wird das Verzeichnis des Studiengangs angelegt
    chown root:"$course" "/home/studiengang/$course"		#Besitzer ist root, Gruppe ist der Studiengang
    chmod 770 "/home/studiengang/$course"		#Besitzer und Gruppen dürfen alles (lesen, schreiben, ausführen), alle anderen nichts

    echo "Studiengang $course wurde angelegt."
}


# Aufgabe 2b
create_class() {    #Hier wird ein Fach angelegt
    fach="$1"

    if [ -z "$fach" ]; then        #Wenn kein Fachname angegeben wurde wird eine Fehlermeldung ausgegeben
        echo "Fehler: Kein Fach angegeben."
        exit 1
    fi

    mkdir -p /home/fach        #Hier wird das Basisverzeichnis /home/fach angelegt, falls es noch nicht existiert


    if [ -d "/home/fach/$fach" ]; then        #Hier wird überprüft, ob das Verzeichnis des Fachs bereits existiert
        echo "Fehler: Fach existiert bereits."
        exit 1
    fi

    mkdir "/home/fach/$fach"        #Hier wird das Verzeichnis des Fachs angelegt
    chmod 770 "/home/fach/$fach"        #Der Besitzer und die Gruppe dürfen alles aber alle anderen nichts.

    echo "Fach $fach wurde angelegt."
}


#Aufgabe 2c
assign_class() {    #Hier wird ein Fach einem Studiengang zugeordnet
    course="$1"
    fach="$2"

    if [ -z "$course" ] || [ -z "$fach" ]; then    #Es wird geprüft ob Studiengang und Fach angegeben wurden
        echo "Fehler: Studiengang und Fach müssen angegeben werden."
        exit 1
    fi


    if ! getent group "$course" > /dev/null; then    #Es wird auch hier geprüft, ob die Gruppe des Studiengangs existiert
        echo "Fehler: Studiengang existiert nicht."
        exit 1
    fi


    if [ ! -d "/home/fach/$fach" ]; then    #Es wird geprüft ob das Fachverzeichnis existiert
        echo "Fehler: Fach existiert nicht."
        exit 1
    fi

    setfacl -m g:"$course":rwx "/home/fach/$fach"    #Hier werden ACL-Rechte für die Studiengangsgruppe auf das Fach gesetzt
    setfacl -d -m g:"$course":rwx "/home/fach/$fach" #Hier werden Default-ACLs für neu angelegte Dateien und Unterordner gesetzt

    echo "Fach $fach wurde dem Studiengang $course zugeordnet."
}


#Aufgabe 2d
create_student() {    #Hier wird ein Student als Benutzer angelegt
    student="$1"

    if [ -z "$student" ]; then    #Es wird geprüft ob kein Studentenname angegeben wurde
        echo "Fehler: Kein Student angegeben."
        exit 1
    fi


    if ! getent group studenten > /dev/null; then    #Es wird geprüft ob die Gruppe studenten existiert
        groupadd studenten
    fi
    

    if id "$student" > /dev/null 2>&1; then    #Es wird geprüft ob der Benutzer bereits existiert
        echo "Fehler: Student existiert bereits."
        exit 1
    fi

    useradd -m -g studenten -s /bin/bash "$student"    #Es wird der Benutzer mit Home-Verzeichnis und Gruppe studenten angelegt.
    passwd "$student"    #Hier wird das Passwort für den Benutzer gesetzt

    echo "Student $student wurde angelegt."
}


add_student() {    #Hier wird ein Student einem Studiengang zugewiesen
    course="$1"
    student="$2"

    if [ -z "$course" ] || [ -z "$student" ]; then    #Es wird geprüft ob Studiengang und Student angegeben wurden
        echo "Fehler: Studiengang und Student müssen angegeben werden."
        exit 1
    fi


    if ! getent group "$course" > /dev/null; then    #Hier wird geprüft ob der Studiengang als Gruppe existiert
        echo "Fehler: Studiengang existiert nicht."
        exit 1
    fi


    if ! id "$student" > /dev/null 2>&1; then    #Es wird hier geprüft ob der Student als Benutzer existiert
        echo "Fehler: Student existiert nicht."
        exit 1
    fi

    usermod -aG "$course" "$student"    #Es wird der Student der Gruppe des Studiengangs hinzugefügt

    echo "Student $student wurde dem Studiengang $course zugewiesen."
}

#Aufgabe 2e
list_classes() {    #Hier werden die einem Studiengang zugewiesenen Fächer angezeigt
    course="$1"

    if [ -z "$course" ]; then    #Es wird hier geprüft, ob ein Studiengang angegeben wurde
        echo "Fehler: Kein Studiengang angegeben."
        exit 1
    fi


    if ! getent group "$course" > /dev/null; then    #Es wird geprüft ob der Studiengang als Gruppe existiert
        echo "Fehler: Studiengang existiert nicht."
        exit 1
    fi

    echo "Zugewiesene Fächer für den Studiengang $course:"

    found=0

    for fachpfad in /home/fach/*; do    #Durchläuft alle Fächer unter /home/fach 
        if [ -d "$fachpfad" ]; then    #Prüft ob es sich um ein Verzeichnis handelt
            if getfacl "$fachpfad" 2>/dev/null | grep -q "group:$course:rwx"; then
                basename "$fachpfad"    #Gibt nur den Namen des Fachordners aus
                found=1
            fi
        fi
    done

    if [ "$found" -eq 0 ]; then    #Falls kein Fach gefunden wurde gibt es diese Meldung
        echo "Keine Fächer zugewiesen."
    fi
}

case "$1" in
    --create-course|-s)
        create_course "$2"
        ;;
    --create-class|-f)
        create_class "$2"
        ;;
    --assign-class|-z)
        assign_class "$2" "$3"
        ;;
    --create-student|-u)
        create_student "$2"
        ;;
    --list-classes|-l)
        list_classes "$2"
        ;;
    --add-student|-a)
        add_student "$2" "$3"
        ;;
    --help|-h)
        echo "Verwendung:"
        echo "--create-student | -u <Name>"
        echo "# Studierende anlegen"
        echo "--create-course | -s <Studiengang>"
        echo "# Neuen Studiengang erstellen"
        echo "--create-class | -f <Fach>"
        echo "# Neues Fach erstellen"
        echo "--assign-class | -z <Studiengang> <Fach>"
        echo "# Fach einem Studiengang zuordnen"
        echo "--list-classes | -l <Studiengang>"
        echo "# Zugeordnete Fächer eines Studiengangs anzeigen"
        echo "--add-student | -a <Studiengang> <Student>"
        echo "# Student einem Studiengang zuweisen"
        echo "--help | -h"
        echo "# Diese Hilfe anzeigen"
        ;;
    *)
        echo "Verwendung:"
        echo "$0 --create-course <Studiengang>"
        echo "$0 --create-class <Fach>"
        echo "$0 --assign-class <Studiengang> <Fach>"
        echo "$0 --create-student <Name>"
        echo "$0 --list-classes <Studiengang>"
        echo "$0 --add-student <Studiengang> <Student>"
        ;;
esac

