Project

General

Profile

Développement #96767

Permission denied: '/media/user_imports'

Added by Florent Angebault about 2 months ago. Updated about 2 months ago.

Status:
Solution déployée
Priority:
Haut
Category:
-
Target version:
-
Start date:
14 October 2024
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

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

Revision 8588101b (diff)
Added by Gael Pasgrimaud about 2 months ago

debian: add MEDIA_ROOT configuration (#96767)

History

#1

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

#2

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.

#3

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 :

#4

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.

#5

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 :

#6

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 :

#7

Updated by Transition automatique about 2 months ago

  • Status changed from Résolu (à déployer) to Solution déployée
#8

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 :)

Also available in: Atom PDF