Klassenarbeitsmodus richtig beenden per Hook-Script?

Liebe Kollegen,

wir arbeiten mit Windows-Clients Linuxmuster 7.2 ohne separaten Fileserver und haben folgende Situation mit dem Klassenarbeitsmodus:

Der Kollege startet den Klassenarbeitsmodus testweise, bevor es richtig losgeht, um sich mit dem Verfahren (was nur selten benutzt wird) nochmal vertraut zu machen. Dazu nimmt er entweder einen Testschüler mit in den Kurs oder einen Schüler aus dem Kurs zum Testen.
Der Modus wird gestartet, der Testschüler meldet sich an, es wird probiert, ob das Austeilen funktioniert und Internet gesperrt ist, etc. und dann wird der Klassenarbeitsmodus wieder beendet.

Dann kommt die Klassenarbeit, alle sitzen da, der Modus wird gestartet und es klappt bei allen, außer dem Testschüler, der kann sich nicht mehr als Examensschüler anmelden.

Ab diesem Moment hilft nur das folgende Script von hier
Wiki Schuljahreswechsel

 # erster Teil stammt von Tobias Heine (linuxmuster-Forum Dez2020)
 cd /srv/samba/schools/default-school/examusers/
 for dir in $(ls); do
    student=$(echo $dir | cut -d\- -f1)
    active_exam=$(sophomorix-user -iu $student |grep -i exammode)
    active_exam=$(echo $active_exam | cut -d" " -f2)
    if [ $active_exam == "---" ]; then
        printf "%-10s%-15s%-8s%s\n" $student $active_exam Loesche $dir
        rm -rf $dir
    else
        printf "%-10s%-15s%-8s%s\n" $student $active_exam Behalte $dir
    fi
done
# jetzt alle nicht beendeten Klassenarbeiten beenden
Zeit=`date-Id`
Pfad=transfer/collected/autoend
Zeitpfad=$Pfad$Zeit
cd /srv/samba/schools/default-school/examusers/
for i in $(ls); do
        echo "Beende den Klassenarbeitsmodus für:" $i
        sophomorix-exam-mode --unset --subdir $Zeitpfad --participants $i
done

Danach kann man den Klassenarbeitsmodus wie gewohnt für alle wieder neu starten und alle können sich anmelden.

Der Workaround ist momentan: in /usr/lib/linuxmuster-webui/plugins/lmn_session_new/views.py in der Funktion handle_api_stop_exam() am Ende das Script wie folgt aufrufen.

p = subprocess.Popen(['sudo','/home/schuledv/clear_examdirs_workaround.sh'],stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
stdout, stderr = p.communicate()
if stderr: raise Exception(stderr.decode())

Damit wird nach jedem Beenden eines Klassenarbeitsmodus der Originalzustand wiederhergestellt.

Wir würden aber lieber nicht direkt im WebUI Code von @Arnaud arbeiten

Die Idee war das Skript per Sophomorix-Hook-Skript aufzurufen.
Dafür haben wir in /etc/linuxmuster/sophomorix/default-school den Ordner hooks/sophomorix-update.d/ erstellt, in welchem die Hook-Skripte für „sophomorix-update“ liegen.
Das Skript bekommt den Timestamp des „sophomorix-update“ Befehls und schaut dann in /var/log/sophomorix/userlog/user-update.log, ob der Trigger das Beenden eines
Exam-Modus war. Falls ja werden alle Exam-Dirs gelöscht.
Das aktuelle Problem ist, dass der shophomorix-exam-mode Befehl zwar in den „user-update.log“ schreibt, aber das Hook-Skript nicht auslöst.
Nach einer Analyse des Quellcodes scheint es nicht implementiert zu sein. Eine weitere Beobachtung ist, dass der Befehlt „sophomorix-user update“, zwar in den
„user-update.log“ schreibt, aber ebenfalls das Hook-Skript nicht auslöst. Die Hook-Skripte sind wirklich nur an sophomorix-add/update/kill gebunden.

Gibt es hier eine clevere Lösung, die wir übersehen?
Besten Dank für einen Hinweis,
Adrian

Hallo Adrian!

Wir haben schon lange keine Windows-Clients mehr, aber ich vermute das „Problem“ ist unabhängig vom eingesetzten Client-Betriebssystem.
Wenn man sich mit einem Benutzer bei einer Klassenarbeit (BENUTZER-exam) anmeldet, so merkt sich zumindest der Linux-Client die Zugangsdaten dieses Benutzers.
Mit dem Beenden der Klassenarbeit wird dieser Klassenarbeitsbenutzer auf dem Server gelöscht.
Ein erneutes Starten einer Klassenarbeit mit diesem Benutzer erzeugt zwar den Account „BENUTZER-exam“ neu, aber es ist ein neuer Account mit neuer UID.
Wenn man sich nun am Client anmelden will, erkennt der Client, das der Benutzer, den er sich gemerkt hat, und der neue unterschiedlich sind und verweigert die Anmeldung.

Mögliche Lösungen:

  • Man verwendet für den schon einmal verwendeten Benutzer einen anderen Rechner.
  • Man synchronisiert die Rechner vor dem Starten der Klassenarbeit. (Diese Lösung ist bei uns als Standardvorgehen beschrieben, da dies keine 30 Sekunden zusätzliche Startzeit zur Folge hat und dadurch auch alle „Besonderheiten“ an den Rechnern bereinigt werden - siehe hilfe:schulnetz:klassenarbeit:start [ ])

Gruß - Rainer

Hallo Adrian,

Danke für deine Analyse. Ich glaube es wäre erst mal interessant zu wissen ob es weiterhin in 7.3 ein Problem ist. Es gab da einige Fixs.

Der Hinweis von @roesslerrr ist wichtig, ich weiss aber nicht ob beide Situationen verbunden sind (anscheinend kann Adrian das Problem serverseitig lösen).

Ich muss erst mal Zeit finden um es zu testen.

Gruß

Arnaud

Lieber Rainer, lieber Arnaud,

danke für die Rückmeldungen. Offensichtlich gibt es hier Unterschiede zwischen Linux- und Windowsclients. Die Windowsclients haben kein Problem mit neuen UIDs für den gleichen Benutzernamen, es wird jeweils ein neues Profil unter C:\Users\ angelegt.
Bei uns ist es tatsächlich ein serverseitiges Problem, es werden nicht immer für alle Examuser die Verzeichnisse unter

 /srv/samba/schools/default-school/examusers/

entfernt, so dass dann bei einem zweiten Start des Exammodus das Skript bei diesen Usern scheitert, da die Ordner noch existieren und daraufhin diese Examuser kein zweites Mal korrekt angelegt werden. Wir beheben das wie oben beschrieben durch das Löschen der Verzeichnisse nach jedem Beenden des Exammodus.
Wir haben geschaut, ob es mit dem Timing des An- und Abmelden zusammenhängt (Examuser noch angemeldet während der Exammodus beendet wird oder nicht) aber es ist eher erratisch, wann Reste übrig bleiben.
Ich sage nochmal Bescheid wenn wir auf 7.3. sind, ob sich was verändert hat, das Problem ist auf jeden Fall erstmal durch das Serverscript gelöst.

Für eine Möglichkeit das als Hook-Script zu implementieren, wäre ich natürlich trotzdem dankbar.

Vielen Dank fürs Mitdenken,
Adrian