WebUI Problem: context has no attribute schoolmgr

Hallo zusammen,

seit dieser Woche haben wir ein seltsames Problem, dass wir die Schulkonsole nicht mehr öffnen können, letzte Woche ging noch alles und seither wurde über Ostern eigentlich nichts verändert…

Nach Anmeldung an der Schulkonsole erscheint nun eine Fehlermeldung:

Traceback (most recent call last):
  File "/usr/lib/linuxmuster-webui/plugins/lmn_auth/api.py", line 367, in get_profile
    if self.context.schoolmgr.schools and len(self.context.schoolmgr.schools) > 1 and "role-globaladministrator" in ''.join(profil.get('memberOf', [])):
AttributeError: 'Context' object has no attribute 'schoolmgr'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/aj/api/endpoint.py", line 77, in wrapper
    result = fx(self, context, *args, **kwargs)
  File "/usr/local/lib/python3.10/dist-packages/ajenti_plugin_core/views/api.py", line 44, in handle_api_identity
    'profile': AuthenticationService.get(self.context).get_provider().get_profile(
  File "/usr/lib/linuxmuster-webui/plugins/lmn_auth/api.py", line 379, in get_profile
    logging.error(e)
  File "/usr/local/lib/python3.10/dist-packages/aj/log.py", line 139, in <lambda>
    (lambda method: lambda message, *args: fx(
  File "/usr/local/lib/python3.10/dist-packages/aj/gate/worker.py", line 204, in send_log_event
    'message': message % args,
TypeError: unsupported operand type(s) for %: 'AttributeError' and 'tuple'

und wir kommen gar nicht in das Webinterface…

Wir haben dann erfolglos versucht:

  • ein Update auf die aktuelle Version
  • eine Neuinstallation des linuxmuster-webui7

Komisch ist, dass wir keinerlei Änderungen gemacht haben, die das Problem verursacht haben könnte und letzt Woche eben alles noch funktioniert hatte.

Jemand eine Idee, woran das liegen könnte bzw. wie wir das Problem beheben können?

Danke und Grüße
Alex

Hallo Alex,

Ich kann es reproduzieren. Kannst du bitte folgendes probieren ?
Wahrscheinlich gibt es am Start eine Fehlermeldung. Wenn nicht, man kann damit den Loginprozess auch damit beobachten, und vielleicht kann ich mit den Logs etwas anfangen.

systemctl stop linuxmuster-webui7
ajenti-panel --dev

Man kann dann live beobachten, was da passiert ( Ctrl-C zum Abbrechen und dann wieder den Service neu starten ).

Oder gibt es vielleicht eine andere Fehlermeldung in /var/log/ajenti ?

Gruß

Arnaud

Hallo Arnaud,

du kannst es reproduzieren, also tritt der Fehler bei dir ebenfalls auf?

ajenti-panel --dev --stock-plugins --plugins /usr/lib/linuxmuster-webui/plugins

hatte ich schon in einem anderen Thread gefunden. Ich habe das gerade nochmals ausgeführt, im ersten Durchlauf (auf die ERRORs reduziert):

[...]
25.04.2025 14:21:05  [worker 82199]          gate.py:167   DEBUG    Building resources in /usr/lib/linuxmuster-webui/plugins
25.04.2025 14:21:05  [worker 82199]          gate.py:167   DEBUG    Popen: ['ajenti-dev-multitool', '--build']
25.04.2025 14:21:05  [worker 82199]          gate.py:167   ERROR    Resource compilation failed: please install ajenti-dev-multitool.
[...]
25.04.2025 14:21:06  [worker 82199]          gate.py:167   ERROR    Unhandled endpoint error at /api/core/identity
Traceback (most recent call last):
  File "/usr/lib/linuxmuster-webui/plugins/lmn_auth/api.py", line 367, in get_profile
    if self.context.schoolmgr.schools and len(self.context.schoolmgr.schools) > 1 and "role-globaladministrator" in ''.join(profil.get('memberOf', [])):
AttributeError: 'Context' object has no attribute 'schoolmgr'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/aj/api/endpoint.py", line 77, in wrapper
    result = fx(self, context, *args, **kwargs)
  File "/usr/local/lib/python3.10/dist-packages/ajenti_plugin_core/views/api.py", line 44, in handle_api_identity
    'profile': AuthenticationService.get(self.context).get_provider().get_profile(
  File "/usr/lib/linuxmuster-webui/plugins/lmn_auth/api.py", line 379, in get_profile
    logging.error(e)
  File "/usr/local/lib/python3.10/dist-packages/aj/log.py", line 139, in <lambda>
    (lambda method: lambda message, *args: fx(
  File "/usr/local/lib/python3.10/dist-packages/aj/gate/worker.py", line 204, in send_log_event
    'message': message % args,
[...]

hmm… also pip3 install ajenti-dev-multitool installiert, zweiter Durchlauf:

25.04.2025 14:23:51  [worker 82259]          gate.py:167   DEBUG    Building resources in /usr/lib/linuxmuster-webui/plugins
25.04.2025 14:23:51  [worker 82259]          gate.py:167   DEBUG    Popen: ['ajenti-dev-multitool', '--build']
25.04.2025 14:23:51  [worker 82259]          gate.py:167   ERROR    Resource compilation failed
25.04.2025 14:23:51  [worker 82259]          gate.py:167   ERROR    2025-04-25 14:23:51 XXX-FQDN-XXX root[82260] INFO Building resources for ./lmn_auth
2025-04-25 14:23:51 XXX-FQDN-XXX root[82260] INFO Compiling ./lmn_auth/resources/js/module.coffee
2025-04-25 14:23:51 XXX-FQDN-XXX root[82260] INFO Compiling ./lmn_auth/resources/js/controllers/index.controller.coffee
Traceback (most recent call last):
  File "src/gevent/greenlet.py", line 908, in gevent._gevent_cgreenlet.Greenlet.run
  File "/usr/local/bin/ajenti-dev-multitool", line 114, in worker
    set_cached(path, subprocess.check_output(args, stderr=subprocess.STDOUT) + b'\n')
  File "/usr/local/lib/python3.10/dist-packages/gevent/subprocess.py", line 404, in check_output
    with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
  File "/usr/local/lib/python3.10/dist-packages/gevent/subprocess.py", line 807, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/lib/python3.10/dist-packages/gevent/subprocess.py", line 1814, in _execute_child
    raise child_exception
FileNotFoundError: [Errno 2] No such file or directory: 'coffee'
2025-04-25T12:23:51Z <Greenlet at 0x7f34c1251800: worker('./lmn_auth/resources/js/module.coffee', ['coffee', '-p', '-c', './lmn_auth/resources/js/mo)> failed with FileNotFoundError

Traceback (most recent call last):
  File "src/gevent/greenlet.py", line 908, in gevent._gevent_cgreenlet.Greenlet.run
  File "/usr/local/bin/ajenti-dev-multitool", line 114, in worker
    set_cached(path, subprocess.check_output(args, stderr=subprocess.STDOUT) + b'\n')
  File "/usr/local/lib/python3.10/dist-packages/gevent/subprocess.py", line 404, in check_output
    with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
  File "/usr/local/lib/python3.10/dist-packages/gevent/subprocess.py", line 807, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/lib/python3.10/dist-packages/gevent/subprocess.py", line 1814, in _execute_child
    raise child_exception
FileNotFoundError: [Errno 2] No such file or directory: 'coffee'
2025-04-25T12:23:51Z <Greenlet at 0x7f34c12532e0: worker('./lmn_auth/resources/js/controllers/index.control, ['coffee', '-p', '-c', './lmn_auth/resources/js/co)> failed with FileNotFoundError

Traceback (most recent call last):
  File "/usr/local/bin/ajenti-dev-multitool", line 716, in <module>
    run_build(plugin, True)
  File "/usr/local/bin/ajenti-dev-multitool", line 172, in run_build
    all_js += get_cached(path)
TypeError: can only concatenate str (not "NoneType") to str

Jetzt fehlt coffee, wobei ich da jetzt nicht weiß, welches Paket dafür zuständig ist.

Ich finde es noch immer komisch, dass das Problem so urplötzlich auftritt…

In /var/log/ajenti gibt’s lediglich

2025-04-25 14:14:52,555 ERROR   : Unhandled endpoint error at /api/core/identity

also den selben Fehler nur weniger detailliert.

Grüße
Alex

Ergänzung:

ich hab jetzt npm, darüber dann coffee-script und anschließend noch babel-cli (er wollte den Befehl „babel“ ausführen) installiert. Dann kommen immer weiter Fehlermeldungen:

25.04.2025 14:44:51  [worker 85934]          gate.py:167   ERROR    Resource compilation failed
25.04.2025 14:44:51  [worker 85934]          gate.py:167   ERROR    2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] INFO Building resources for ./lmn_auth
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] INFO Building resources for ./lmn_clients
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] INFO Compiling ./lmn_clients/resources/js/module.es
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] INFO Compiling ./lmn_clients/resources/js/routing.es
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] INFO Compiling ./lmn_clients/resources/js/controllers/index.controller.es
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] ERROR BUILD FAILED
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] INFO   3 error(s):
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] ERROR  * ./lmn_clients/resources/js/routing.es
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'ReferenceError: Unknown plugin "external-helpers" specified in "base" at 0, attempted to resolve relative to "./lmn_clients/resources/js"'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at /usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:180:17'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Array.map (<anonymous>)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Function.normalisePlugins (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:158:20)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at OptionManager.mergeOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:234:36)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at OptionManager.init (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:368:12)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at File.initOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/index.js:212:65)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at new File (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/index.js:135:24)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Pipeline.transform (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/pipeline.js:46:16)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at transform (/usr/local/lib/node_modules/babel-cli/lib/babel/util.js:50:22)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Object.compile (/usr/local/lib/node_modules/babel-cli/lib/babel/util.js:59:12)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] ERROR  * ./lmn_clients/resources/js/module.es
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'ReferenceError: Unknown plugin "external-helpers" specified in "base" at 0, attempted to resolve relative to "./lmn_clients/resources/js"'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at /usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:180:17'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Array.map (<anonymous>)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Function.normalisePlugins (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:158:20)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at OptionManager.mergeOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:234:36)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at OptionManager.init (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:368:12)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at File.initOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/index.js:212:65)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at new File (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/index.js:135:24)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Pipeline.transform (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/pipeline.js:46:16)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at transform (/usr/local/lib/node_modules/babel-cli/lib/babel/util.js:50:22)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Object.compile (/usr/local/lib/node_modules/babel-cli/lib/babel/util.js:59:12)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] ERROR  * ./lmn_clients/resources/js/controllers/index.controller.es
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'ReferenceError: Unknown plugin "external-helpers" specified in "base" at 0, attempted to resolve relative to "./lmn_clients/resources/js/controllers"'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at /usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:180:17'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Array.map (<anonymous>)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Function.normalisePlugins (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:158:20)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at OptionManager.mergeOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:234:36)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at OptionManager.init (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:368:12)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at File.initOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/index.js:212:65)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at new File (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/index.js:135:24)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Pipeline.transform (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/pipeline.js:46:16)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at transform (/usr/local/lib/node_modules/babel-cli/lib/babel/util.js:50:22)'
2025-04-25 14:44:51 XXX-FQDN-XXX root[85937] WARNING b'    at Object.compile (/usr/local/lib/node_modules/babel-cli/lib/babel/util.js:59:12)'

Aber ich glaube sowieso nicht, dass es gedacht ist, die Pakete alle manuell installieren zu müssen…

Hallo Alex,

Sorry, ich habe das „nicht“ vergessen: ich kann es nicht reproduzieren.
Das ist nicht nötig alles zu kompilieren und weitere Pakete zu installieren, die Fehlermeldung mit ajenti-dev-multitool kann man ignorieren, das sollte das Prozess nicht stören.

Mit welchem User probierst du dich zu melden ? Du kannst mir es auch per PM schreiben.
Das ist natürlich nicht normal, dass es „plötzlich“ nicht mehr geht, es gibt bestimmt eine Erklärung dafür, wir müssen nur auf die richtige Fehlermeldung kommen.

Gruß

Arnaud

Hallo Arnaud,

Sorry, ich habe das „nicht“ vergessen: ich kann es nicht reproduzieren.

Ahh, hab mich schon gewundert :sweat_smile:

Das ist nicht nötig alles zu kompilieren und weitere Pakete zu installieren, die Fehlermeldung mit ajenti-dev-multitool kann man ignorieren, das sollte das Prozess nicht stören.

Okay, alles klar. Hätte mich auch gewundert.

Mit welchem User probierst du dich anzumelden?

Völlig egal… sowohl mit global-admin als auch mit einem normalen User kommt beide Male die selbe Fehlermeldung.

Ich habe auch schonmal in der api.py bissel rumexperimentiert und bin zu folgendem Ergebnis gekommen: in der Methode prepare_environment wird ja im Context das Attribut schoolmgr festgelegt. Und da hab ich einfach mal ein File-Logging einprogrammiert:

f = open("/tmp/log","w")
f.write("TEST: " + username + "\n")
try:
  f.write("1\n")
  schoolmgr = SchoolManager()
  f.write("2\n")
  schoolmgr.switch(active_school)
  f.write("3\n")
  self.context.schoolmgr = schoolmgr
  self.context.ldapreader = LMNLdapReader
  f.write("4\n")
[...]
except Exception as e:
  f.write("EXCEPTION!\n")
  f.write(str(e))
  logging.warning(str(e))
f.close()

Und in meinem Log-File war dann:

TEST: global-admin
1
EXCEPTION!
mismatched tag: line 20, column 6

Also schon beim Aufruf des SchoolManager() tritt ein Fehler auf. Ich kann aber mit dem „mismatched tag“ leider nichts anfangen. (Anmerkung: wir nutzen keine Multi-Schul-Installation, nur die „default-school“)

Grüße
Alex

Ahhh, weitere Erkenntnis.

Kurzer Hintergrund: wir haben die LMN 7.2 erst kürzlich auf einem neuen Server komplett neu installiert. Wir nutzen den Server auch zusammen mit der Nachbarschule (trotzdem ohne Multi-Schul-Installation, da diese Funktionen ja nirgends dokumentiert sind…)

Der Kollege von nebenan hat letzte Woche jetzt die Laptops auf den neuen Server eingerichtet bzw. neu installiert und hat dafür natürlich die GPOs laut Anleitung mit dem Befehl sophomorix-school --gpo-create default-school erstellt. → d.h. das war die einzige Änderung, die letzte Woche passiert ist

Als ich mit den SchoolManager näher angeschaut hab, ist mir aufgefallen, dass dort im Konstuktor der GPOManager geladen wird. Das hab ich mal auskommentiert und in Zeile 150ff ebenfalls die den gpomgr auskommentiert und self.drivemgr = DriveManager(None) pauschal aktiviert.

Damit funktioniert die Anmeldung an der Schulkonsole wieder.

Also muss der Fehler irgendwo in den GPOs liegen :face_with_raised_eyebrow:

Grüße
Alex

:see_no_evil: nachdem ich meine Kollegen von der Nachbarschule nochmals gefragt hab, was sie alles mit dem GPOs gemacht haben.

Da kam dann, dass sie das hier gemacht hätten:

Tjoa… da war der Fehler - leider hatte der Kollege bei der Anpassung der XML im Properties-Tag den abschließenden Schrägstrich vergessen. Dadurch war das schließende </Drive> in Zeile 20, 6. Stelle leider ungültig…

Korrigiert, sämtliche Python-Skripte wieder auf Ausgangszustand → Funktioniert wieder!

Danke dir für’s Anstoßen in die richtige Richtung!

Grüße
Alex