Skip to content

g-admin-api: endpoint /api/v1/system/logs/ fails when reading blob-type journal-entries with TypeError: Object of type bytes is not JSON serializable #56

@umgfoin

Description

@umgfoin

Assume an arbitrary journal-log containing blob-entries similar to:

journalctl -u gromox-imap

Nov 25 13:44:11 postkastl.umgfoin.is imap[2795947]: [::ffff:117.32.102.38]:45596 httpswww.voelkner.deinfo@umgfoin.is < LOGIN ****: ret=800770h code=1904
Nov 25 13:55:27 postkastl.umgfoin.is imap[2795947]: [::ffff:162.142.125.208]:15224  < a001 STARTTLS: ret=6a8h code=1704
Nov 25 13:55:58 postkastl.umgfoin.is imap[2795947]: [83B blob data]
Nov 25 13:56:00 postkastl.umgfoin.is imap[2795947]: [92B blob data]
Nov 25 13:56:01 postkastl.umgfoin.is imap[2795947]: [53B blob data]
Nov 25 13:59:24 postkastl.umgfoin.is imap[2795947]: [::ffff:45.79.181.223]:46424  < GET / HTTP/1.1: ret=0h code=0
Nov 25 13:59:24 postkastl.umgfoin.is imap[2795947]: [::ffff:45.79.181.223]:46424  < Host: 8.9.23.9:993: ret=0h code=0
Nov 25 13:59:24 postkastl.umgfoin.is imap[2795947]: [::ffff:45.79.181.223]:46424  < User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36: ret=0h code=0
Nov 25 13:59:24 postkastl.umgfoin.is imap[2795947]: [::ffff:45.79.181.223]:46424  < Accept: */*: ret=0h code=0
Nov 25 13:59:24 postkastl.umgfoin.is imap[2795947]: [::ffff:45.79.181.223]:46424  < Accept-Encoding: gzip: ret=0h code=0
Nov 25 14:21:06 postkastl.umgfoin.is imap[2795947]: [::ffff:105.159.255.190]:57086  < JPOP0 CAPABILITY: ret=0h code=0
Nov 25 14:21:08 postkastl.umgfoin.is imap[2795947]: [::ffff:105.159.255.190]:57086 test < LOGIN ****: ret=800770h code=1904

Monitoring gromox-imap-journal in g-webadmin asserts with
(The server encountered an error while processing the request.):

journalctl -u grommunio-admin-api

Nov 25 13:58:13 postkastl.umgfoin.is uwsgi[3718034]: [WARNING] (grommunio Admin API) GET /api/v1/system/logs/Gromox imap?n=100 from 5002:a3:3d3a:da00:a980:151f:2329:1f59 -> 500 '{"message":"The server encountered an error while processing the request."}\n'
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]: [ERROR] (grommunio Admin API) Traceback (most recent call last):
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/share/grommunio-admin-api/venv/lib/python3.13/site-packages/flask/app.py", line 917, in full_dispatch_request
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     rv = self.dispatch_request()
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/share/grommunio-admin-api/venv/lib/python3.13/site-packages/flask/app.py", line 902, in dispatch_request
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/share/grommunio-admin-api/api/core.py", line 204, in wrapper
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     return call()
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/share/grommunio-admin-api/api/core.py", line 169, in call
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     ret = func(*args, **kwargs)
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/share/grommunio-admin-api/endpoints/system/logs.py", line 35, in getLog
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     return jsonify(data=LogReader.tail(log.get("format", "journald"), log["source"], n, skip, after))
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/share/grommunio-admin-api/venv/lib/python3.13/site-packages/flask/json/__init__.py", line 170, in jsonify
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     return current_app.json.response(*args, **kwargs)  # type: ignore[return-value]
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:            ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/share/grommunio-admin-api/venv/lib/python3.13/site-packages/flask/json/provider.py", line 214, in response
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:        ~~~~~~~~~~^^^^^^^^^^^^^^^^^^
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/share/grommunio-admin-api/venv/lib/python3.13/site-packages/flask/json/provider.py", line 179, in dumps
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     return json.dumps(obj, **kwargs)
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:            ~~~~~~~~~~^^^^^^^^^^^^^^^
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/lib/python3.13/json/__init__.py", line 238, in dumps
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     **kw).encode(obj)
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:           ~~~~~~^^^^^
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/lib/python3.13/json/encoder.py", line 200, in encode
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     chunks = self.iterencode(o, _one_shot=True)
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/lib/python3.13/json/encoder.py", line 261, in iterencode
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     return _iterencode(o, 0)
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:   File "/usr/share/grommunio-admin-api/venv/lib/python3.13/site-packages/flask/json/provider.py", line 121, in _default
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]:     raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable")
Nov 25 13:58:17 postkastl.umgfoin.is uwsgi[3718034]: TypeError: Object of type bytes is not JSON serializable

codebase:
admin-api: master 1.17-35-g0445e1c

(venv) dev@wurzelsepp /usr/share/grommunio-admin-api/venv/bin #  ./python --version
Python 3.13.5

(venv) dev@wurzelsepp /usr/share/grommunio-admin-api/venv/bin # ./pip list
Package                   Version
------------------------- ----------
argcomplete               3.6.3
attrs                     25.4.0
blinker                   1.9.0
certifi                   2025.11.12
cffi                      2.0.0
charset-normalizer        3.4.4
click                     8.3.1
crypt_r                   3.13.1
cryptography              46.0.3
dnspython                 2.8.0
Flask                     3.1.2
greenlet                  3.2.4
idna                      3.11
inflection                0.5.1
isodate                   0.7.2
itsdangerous              2.2.0
Jinja2                    3.1.6
jsonschema                4.25.1
jsonschema-path           0.3.4
jsonschema-specifications 2025.9.1
lazy-object-proxy         1.12.0
ldap3                     2.9.1
legacycrypt               0.3
MarkupSafe                3.0.3
mattermostdriver          7.3.2
more-itertools            10.8.0
multidict                 6.7.0
mysqlclient               2.2.7
openapi                   2.0.0
openapi-core              0.19.5
openapi-schema-validator  0.6.3
openapi-spec-validator    0.7.2
parse                     1.20.2
pathable                  0.4.4
pip                       25.3
psutil                    7.1.3
pyasn1                    0.6.1
pycparser                 2.23
PyJWT                     2.10.1
PyYAML                    6.0.3
redis                     7.1.0
referencing               0.37.0
requests                  2.32.5
rfc3339-validator         0.1.4
rpds-py                   0.29.0
six                       1.17.0
SQLAlchemy                2.0.44
systemd-python            235
typing_extensions         4.15.0
urllib3                   2.5.0
uwsgidecorators           1.1.0
websockets                15.0.1
Werkzeug                  3.1.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions