Hallo zusammen,
beim Upgrade von 7.3 auf 7.4, genauer bei der Installation des Pakets linuxmuster-tools7 wird bei uns folgender Fehler ausgegeben:
...
Checking students group in LDAP
Checking students groups from schoolclass klassenname
Empty value given for 'member' via setattr(); use delattr() to clear an attribute.
Checking sophomorix hook scripts
...
An dieser Stelle wird das Python Skript /usr/lib/python3/dist-packages/linuxmusterTools/install-scripts/create_students_groups.py aufgerufen, das für jede Klasse die Gruppenzugehörigkeiten zu den Subgruppen *-teachers, *-parents und *-students prüft und ggf. neu setzt.
Da wir keine Eltern-Accounts angelegt haben, hat die Gruppe klassenname-parents logischerweise auch keine Mitglieder.
Ein
python3 -c "
from linuxmusterTools.ldapconnector import LMNLdapReader as lr
for suf in ['-students', '-teachers', '-parents']:
m = lr.getval(f'/units/klassenname{suf}', 'member')
print(suf, '->', len(m) if m else 0, 'Mitglieder')
"
im Terminal gibt das auch aus:
-students -> 23 Mitglieder
-teachers -> 2 Mitglieder
-parents -> 0 Mitglieder
Da ich des Pythons nicht sehr mächtig bin, hab ich das Problem mal vom Chatbot meiner Wahl analysieren lassen. Folgende Lösung wurde mir angeboten:
In der Datei /usr/lib/python3/dist-packages/linuxmusterTools/ldapconnector/writers/schoolclass.py steht in Zeile 113
self.setattr(data={'member': list(set(members))})
Und genau dort entsteht wohl das Problem. Wenn nämlich die Liste members leer ist, wird versucht mit self.setattr(data={'member': []}) eine leere Liste zu setzen, was von ldap3 anscheinend nicht toleriert wird. Die Fehlermeldung von oben gibt den entscheidenden Hinweis: use delattr() to clear an attribute. Hat eine Gruppe keine Mitglieder soll das Attribut gelöscht werden. Wenn das Attribut member einer Subgruppe jedoch nicht existiert, braucht es auch nicht gelöscht werden.
Ersetzt man die Zeile 113 mit folgendem Code
members = list(set(members))
if members:
self.setattr(data={'member': members})
elif self.schoolclass_data and self.data.get('member'):
self.delattr(data={'member': None})
läuft das Subgruppen-Checking mit
lmncli schoolclass sync --all
erfolgreich durch:
lmncli: Checking groups of schoolclass klassenname in default-school
--> teachers group ✅
--> parents group ✅
--> students group ✅
lmncli: Checking groups of schoolclass ...
@Arnaud: Da ich mir nicht zu 100% sicher bin, ob diese Lösung hinreichend ist, kannst Du dir das bei Gelegenheit mal ansehen?
Eventuell löst das ja auch das Problem im Nachbarthread
LG
Jürgen