Bug 52136 - permission error in upload directory leads to HTTP 500, but problem/traceback is not logged
permission error in upload directory leads to HTTP 500, but problem/traceback...
Status: NEW
Product: UCS@school
Classification: Unclassified
Component: Import scripts
UCS@school 4.4
Other Linux
: P5 normal (vote)
: ---
Assigned To: UCS@school maintainers
:
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2020-09-25 12:24 CEST by Daniel Tröder
Modified: 2020-09-25 12:46 CEST (History)
1 user (show)

See Also:
What kind of report is it?: Bug Report
What type of bug is this?: 3: Simply Wrong: The implementation doesn't match the docu
Who will be affected by this bug?: 1: Will affect a very few installed domains
How will those affected feel about the bug?: 2: A Pain – users won’t like this once they notice it
User Pain: 0.034
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number: 2020092121000135
Bug group (optional):
Max CVSS v3 score:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Daniel Tröder univentionstaff 2020-09-25 12:24:01 CEST
When using the HTTP-API for UCS@school imports and the upload directory '/var/spool/ucs-school-import/media/uploads/' is not writable for the gunicorn process (running as user uas-import:uas-import), in the regular log level no helpful error message is logged.
When raising the log level to DEBUG, the following traceback is produced:

-------------------------------------------------------------------------------
==> /var/log/univention/ucs-school-import/gunicorn_error.log <==
Internal Server Error: /api/v1/imports/users/
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/exception.py", line 42, in inner
    response = get_response(request)
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python2.7/dist-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/rest_framework/viewsets.py", line 87, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/rest_framework/views.py", line 466, in dispatch
    response = self.handle_exception(exc)
  File "/usr/lib/python2.7/dist-packages/rest_framework/views.py", line 463, in dispatch
    response = handler(request, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/rest_framework/mixins.py", line 21, in create
    self.perform_create(serializer)
  File "/usr/lib/pymodules/python2.7/ucsschool/http_api/import_api/views.py", line 313, in perform_create
    serializer.save(principal=self.request.user)
  File "/usr/lib/python2.7/dist-packages/rest_framework/serializers.py", line 191, in save
    self.instance = self.create(validated_data)
  File "/usr/lib/pymodules/python2.7/ucsschool/http_api/import_api/serializers.py", line 212, in create
    instance = super(UserImportJobSerializer, self).create(validated_data)
  File "/usr/lib/python2.7/dist-packages/rest_framework/serializers.py", line 872, in create
    instance = ModelClass.objects.create(**validated_data)
  File "/usr/lib/python2.7/dist-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 399, in create
    obj.save(force_insert=True, using=self.db)
  File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 796, in save
    force_update=force_update, update_fields=update_fields)
  File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 824, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 908, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 947, in _do_insert
    using=using, raw=raw)
  File "/usr/lib/python2.7/dist-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 1045, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 1053, in execute_sql
    for sql, params in self.as_sql():
  File "/usr/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 1006, in as_sql
    for obj in self.query.objs
  File "/usr/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 955, in pre_save_val
    return field.pre_save(obj, add=True)
  File "/usr/lib/python2.7/dist-packages/django/db/models/fields/files.py", line 292, in pre_save
    file.save(file.name, file, save=False)
  File "/usr/lib/python2.7/dist-packages/django/db/models/fields/files.py", line 91, in save
    self.name = self.storage.save(name, content, max_length=self.field.max_length)
  File "/usr/lib/python2.7/dist-packages/django/core/files/storage.py", line 54, in save
    return self._save(name, content)
  File "/usr/lib/python2.7/dist-packages/django/core/files/storage.py", line 317, in _save
    os.makedirs(directory, self.directory_permissions_mode)
  File "/usr/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/var/spool/ucs-school-import/media/uploads/2020-09-25'
-------------------------------------------------------------------------------

Either make Django log its errors to the log file or enclose the relevant object creation code in a try-except block that logs the error.
Comment 1 Dirk Schnick univentionstaff 2020-09-25 12:46:50 CEST
added customer ticket