Développement #96767
Permission denied: '/media/user_imports'
0%
Description
Après mise à jour en v5.72 à partir des paquets Debian, le service authentic2 ne démarre plus et on voit l'erreur "Permission denied: '/media/user_imports'" en boucle dans journalctl.
# journaltcl -fu authentic2 ... Oct 14 10:50:32 demo uwsgi/authentic[264520]: Operations to perform: Oct 14 10:50:32 demo uwsgi/authentic[264520]: Apply all migrations: a2_rbac, admin, attribute_aggregator, auth, authentic2, authentic2_auth_fc, authentic2_auth_oidc, authentic2_auth_saml, authentic2_idp_cas, authentic2_idp_oidc, authenticators, contenttypes, custom_user, django_rbac, idp, journal, mellon, nonce, saml, sessions Oct 14 10:50:32 demo uwsgi/authentic[264520]: Running migrations: Oct 14 10:50:32 demo uwsgi/authentic[264520]: Applying authentic2.0054_migrate_user_imports...Traceback (most recent call last): Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/authentic2/manage.py", line 20, in <module> Oct 14 10:50:32 demo uwsgi/authentic[264520]: execute_from_command_line(sys.argv[:1] + argv) Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 419, in execute_from_command_line Oct 14 10:50:32 demo uwsgi/authentic[264520]: utility.execute() Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 413, in execute Oct 14 10:50:32 demo uwsgi/authentic[264520]: self.fetch_command(subcommand).run_from_argv(self.argv) Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 354, in run_from_argv Oct 14 10:50:32 demo uwsgi/authentic[264520]: self.execute(*args, **cmd_options) Oct 14 10:50Le service authentic2 ne démarre plus en v5.72:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 398, in execute Oct 14 10:50:32 demo uwsgi/authentic[264520]: output = self.handle(*args, **options) Oct 14 10:50:32 demo uwsgi/authentic[264520]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 89, in wrapped Oct 14 10:50:32 demo uwsgi/authentic[264520]: res = handle_func(*args, **kwargs) Oct 14 10:50:32 demo uwsgi/authentic[264520]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/core/management/commands/migrate.py", line 244, in handle Oct 14 10:50:32 demo uwsgi/authentic[264520]: post_migrate_state = executor.migrate( Oct 14 10:50:32 demo uwsgi/authentic[264520]: ^^^^^^^^^^^^^^^^^ Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/db/migrations/executor.py", line 117, in migrate Oct 14 10:50:32 demo uwsgi/authentic[264520]: state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) Oct 14 10:50:32 demo uwsgi/authentic[264520]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards Oct 14 10:50:32 demo uwsgi/authentic[264520]: state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) Oct 14 10:50:32 demo uwsgi/authentic[264520]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/db/migrations/executor.py", line 227, in apply_migration Oct 14 10:50:32 demo uwsgi/authentic[264520]: state = migration.apply(state, schema_editor) Oct 14 10:50:32 demo uwsgi/authentic[264520]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/db/migrations/migration.py", line 126, in apply Oct 14 10:50:32 demo uwsgi/authentic[264520]: operation.database_forwards(self.app_label, schema_editor, old_state, project_state) Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/django/db/migrations/operations/special.py", line 190, in database_forwards Oct 14 10:50:32 demo uwsgi/authentic[264520]: self.code(from_state.apps, schema_editor) Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/authentic2/migrations/0054_migrate_user_imports.py", line 16, in create_imports Oct 14 10:50:32 demo uwsgi/authentic[264520]: for uimport in user_import.UserImport.all(): Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/authentic2/manager/user_import.py", line 103, in all Oct 14 10:50:32 demo uwsgi/authentic[264520]: for subpath in os.listdir(cls.base_path()): Oct 14 10:50:32 demo uwsgi/authentic[264520]: ^^^^^^^^^^^^^^^ Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "/usr/lib/python3/dist-packages/authentic2/manager/user_import.py", line 84, in base_path Oct 14 10:50:32 demo uwsgi/authentic[264520]: os.makedirs(path) Oct 14 10:50:32 demo uwsgi/authentic[264520]: File "<frozen os>", line 225, in makedirs Oct 14 10:50:32 demo uwsgi/authentic[264520]: PermissionError: [Errno 13] Permission denied: '/media/user_imports' ...
Du coup, dans l'urgence, j'ai réinstallé une version v5.67.
Associated revisions
History
Updated by Gael Pasgrimaud about 2 months ago
Bonjour,
Visiblement vous avez configuré la valeur du settings MEDIA_ROOT d'authentic à /media. Ceci devrait pointer vers un répertoire ou l'application peut écrire.
En l'état, il vous est impossible d'utiliser la fonctionnalité "import d'utilisateurs"
Si cette fonctionnalité ne vous est pas utile, vous pouvez vous contenter de créer le dossier /media/user_imports pour que l'application ne cherche pas à le créer
La vrai bonne solution serait de faire pointer MEDIA_ROOT vers un répertoire ou l'application peu écrire comme l'indique la documentation de django: https://docs.djangoproject.com/en/5.1/ref/settings/#media-root
Updated by Benjamin Renard about 2 months ago
Il me semble que ce serait plutôt au paquet Debian de définir une valeur par défaut correcte pour MEDIA_ROOT dans le fichier /usr/lib/authentic2/debian_config.py :
MEDIA_ROOT = '/var/lib/authentic2/media/'
C'est bien le cas pour STATIC_ROOT par exemple, mais par pour MEDIA_ROOT qui est laissé à sa valeur par défaut issue de /usr/lib/python3/dist-packages/authentic2/settings.py valant juste media.
Updated by Robot Gitea about 2 months ago
- Tracker changed from Support to Développement
- Status changed from Nouveau to Solution proposée
- Assignee set to Gael Pasgrimaud
Gael Pasgrimaud (gpasgrimaud) a ouvert une pull request sur Gitea concernant cette demande :
- URL : https://git.entrouvert.org/entrouvert/authentic/pulls/423
- Titre : debian: add MEDIA_ROOT configuration (#96767)
- Modifications : https://git.entrouvert.org/entrouvert/authentic/pulls/423/files
Updated by Gael Pasgrimaud about 2 months ago
Benjamin Renard a écrit :
Il me semble que ce serait plutôt au paquet Debian de définir une valeur par défaut correcte pour MEDIA_ROOT dans le fichier /usr/lib/authentic2/debian_config.py :
[...]C'est bien le cas pour STATIC_ROOT par exemple, mais par pour MEDIA_ROOT qui est laissé à sa valeur par défaut issue de /usr/lib/python3/dist-packages/authentic2/settings.py valant juste media.
Effectivement. Je ne sais pas pourquoi celui-ci était laissé de coté. Merci pour la suggestion. J'ai fait une PR en ce sens.
Updated by Robot Gitea about 2 months ago
- Status changed from Solution proposée to Solution validée
Thomas NOËL (tnoel) a approuvé une pull request sur Gitea concernant cette demande :
Updated by Robot Gitea about 2 months ago
- Status changed from Solution validée to Résolu (à déployer)
Gael Pasgrimaud (gpasgrimaud) a mergé une pull request sur Gitea concernant cette demande :
- URL : https://git.entrouvert.org/entrouvert/authentic/pulls/423
- Titre : debian: add MEDIA_ROOT configuration (#96767)
- Modifications : https://git.entrouvert.org/entrouvert/authentic/pulls/423/files
Updated by Transition automatique about 2 months ago
- Status changed from Résolu (à déployer) to Solution déployée
Updated by Florent Angebault about 2 months ago
Hello, du coup la source du problème est résolue, et ça c'est cool. Mais ça soulève une question concernant le comportement du service systemd tel qu'il est défini actuellement.
Avec "Restart=on-failure" et un script "ExecStartPre=..." qui échoue (ici c'est le script "authentic2-manage migrate" qui plantait), on se retrouve avec un service authentic2 qui redémarre en boucle et qui n’est jamais listé par la commande systemctl list-units --state failed
. La panne peut donc échapper à la supervision (ça a été notre cas) et le problème ne sera vu que plus tard lorsque les utilisateurs seront confrontés à la panne.
De notre côté (chez Easter-Eggs) nous avons effectivement des pistes pour améliorer notre supervision, mais à mon avis, c'est quand même une anomalie qu'un service puisse se retrouver dans cette situation de boucle infinie.
Pour info, j'ai expérimenté le fait de remplacer "Restart=on-failure" par "Restart=on-abnormal" et ça résout le problème, au moins dans le cas présent. Je n'arrive pas imaginer les éventuels effets de bord de ce changement par contre.
Cf. https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html#Restart=
If set to on-abnormal, the service will be restarted when the process is terminated by a signal [...], when an operation times out, or when the watchdog timeout is triggered
[...]
Setting this to on-failure is the recommended choice for long-running services, in order to increase reliability by attempting automatic recovery from errors. For services that shall be able to terminate on their own choice (and avoid immediate restarting), on-abnormal is an alternative choice.
Vous en faites ce que vous voulez hein :)
debian: add MEDIA_ROOT configuration (#96767)