Package: calibre Version: 3.33.1+dfsg-1 Severity: normal File: /usr/bin/calibre-server
I was trying to run calibre-server in a readonly sandbox that didn't actually have write permissions to my library for security reasons. So I create a separate user (adduser --disabled-password calibre-sandbox), sudo'd to that user, and called: calibre-server --enable-auth /srv/books/ --disable-local-write The first problem was this: calibre server listening on 0.0.0.0:8080 OPDS feeds advertised via BonJour at: 192.168.0.3 port: 8080 Failed login attempt from: 192.168.0.7 Unhandled exception in state: State: _job_done Client: 192.168.0.7:59050 Request: GET /interface-data/init?1541644405904 HTTP/1.1 Traceback (most recent call last): File "/usr/lib/calibre/calibre/srv/loop.py", line 569, in tick conn.handle_event(event) File "/usr/lib/calibre/calibre/srv/loop.py", line 307, in _job_done self.job_done(*event) File "/usr/lib/calibre/calibre/srv/pool.py", line 35, in run result = func() File "/usr/lib/calibre/calibre/srv/http_response.py", line 441, in run_request_handler result = self.request_handler(data) File "/usr/lib/calibre/calibre/srv/routes.py", line 313, in dispatch ans = endpoint_(self.ctx, data, *args) File "/usr/lib/calibre/calibre/srv/code.py", line 257, in interface_data ans['library_id'], db, sorts, orders, vl = get_basic_query_data(ctx, rd) File "/usr/lib/calibre/calibre/srv/code.py", line 75, in get_basic_query_data db, library_id, library_map, default_library = get_library_data(ctx, rd) File "/usr/lib/calibre/calibre/srv/utils.py", line 493, in get_library_data db = get_db(ctx, rd, library_id) File "/usr/lib/calibre/calibre/srv/utils.py", line 480, in get_db db = ctx.get_library(rd, library_id) File "/usr/lib/calibre/calibre/srv/handler.py", line 71, in get_library return self.library_broker.get(library_id) File "/usr/lib/calibre/calibre/srv/library_broker.py", line 104, in get path, library_id == self.default_library) File "/usr/lib/calibre/calibre/srv/library_broker.py", line 113, in init_library return init_library(library_path, is_default_library) File "/usr/lib/calibre/calibre/srv/library_broker.py", line 46, in init_library library_path, load_user_formatter_functions=is_default_library)) File "/usr/lib/calibre/calibre/db/legacy.py", line 48, in create_backend load_user_formatter_functions=load_user_formatter_functions) File "/usr/lib/calibre/calibre/db/backend.py", line 382, in __init__ self.is_case_sensitive = is_case_sensitive(self.library_path) File "/usr/lib/calibre/calibre/utils/filenames.py", line 124, in is_case_sensitive open(f1, 'w').close() IOError: [Errno 13] Permission non accordée: u'/srv/books/calibre_test_case_sensitivity.txt' It seems it's trying to create a test file, and failing. If I fix the permissions on the folder (e.g. make them group-writable and add the user to the group), that error goes away, and I'm confronted with the next one: calibre-sandbox@marcos:~$ calibre-server --enable-auth /srv/books/ --disable-local-write calibre server listening on 0.0.0.0:8080 OPDS feeds advertised via BonJour at: 192.168.0.3 port: 8080 Failed login attempt from: 192.168.0.7 Unhandled exception in state: State: _job_done Client: 192.168.0.7:59060 Request: GET /interface-data/init?1541644438465 HTTP/1.1 Traceback (most recent call last): File "/usr/lib/calibre/calibre/srv/loop.py", line 569, in tick conn.handle_event(event) File "/usr/lib/calibre/calibre/srv/loop.py", line 307, in _job_done self.job_done(*event) File "/usr/lib/calibre/calibre/srv/pool.py", line 35, in run result = func() File "/usr/lib/calibre/calibre/srv/http_response.py", line 441, in run_request_handler result = self.request_handler(data) File "/usr/lib/calibre/calibre/srv/routes.py", line 313, in dispatch ans = endpoint_(self.ctx, data, *args) File "/usr/lib/calibre/calibre/srv/code.py", line 257, in interface_data ans['library_id'], db, sorts, orders, vl = get_basic_query_data(ctx, rd) File "/usr/lib/calibre/calibre/srv/code.py", line 75, in get_basic_query_data db, library_id, library_map, default_library = get_library_data(ctx, rd) File "/usr/lib/calibre/calibre/srv/utils.py", line 493, in get_library_data db = get_db(ctx, rd, library_id) File "/usr/lib/calibre/calibre/srv/utils.py", line 480, in get_db db = ctx.get_library(rd, library_id) File "/usr/lib/calibre/calibre/srv/handler.py", line 71, in get_library return self.library_broker.get(library_id) File "/usr/lib/calibre/calibre/srv/library_broker.py", line 104, in get path, library_id == self.default_library) File "/usr/lib/calibre/calibre/srv/library_broker.py", line 113, in init_library return init_library(library_path, is_default_library) File "/usr/lib/calibre/calibre/srv/library_broker.py", line 46, in init_library library_path, load_user_formatter_functions=is_default_library)) File "/usr/lib/calibre/calibre/db/legacy.py", line 48, in create_backend load_user_formatter_functions=load_user_formatter_functions) File "/usr/lib/calibre/calibre/db/backend.py", line 384, in __init__ SchemaUpgrade(self, self.library_path, self.field_metadata) File "/usr/lib/calibre/calibre/db/schema_upgrades.py", line 19, in __init__ db.execute('BEGIN EXCLUSIVE TRANSACTION') File "/usr/lib/calibre/calibre/db/backend.py", line 844, in execute return self.conn.cursor().execute(sql, bindings) File "src/cursor.c", line 236, in resetcursor ReadOnlyError: ReadOnlyError: attempt to write a readonly database This problem seems more serious; in my experience, sqlite databases really don't like readonly files and filesystems, as they try to write their journal there. A workaround is to disable the journal (PRAGMA journal_mode=off or =memory) but that requires a writable database in the first place, and has reliability implications. I'm not sure I would risk that. Once I made the metadata.db file writable, the warnings went away and the server worked properly, at least at first glance. But it seems to me the "local-write" mode really does not do what it says on the tin and, even if it's specified, the calibre-server still tries to write to the files. Thanks for packaging calibre! A. -- System Information: Debian Release: buster/sid APT prefers testing APT policy: (500, 'testing'), (1, 'experimental'), (1, 'unstable') Architecture: amd64 (x86_64) Kernel: Linux 4.18.0-2-amd64 (SMP w/4 CPU cores) Locale: LANG=fr_CA.UTF-8, LC_CTYPE=fr_CA.UTF-8 (charmap=UTF-8), LANGUAGE=fr_CA.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages calibre depends on: ii calibre-bin 3.33.1+dfsg-1 ii fonts-liberation 1:1.07.4-8 ii imagemagick 8:6.9.10.14+dfsg-7 ii imagemagick-6.q16 [imagemagick] 8:6.9.10.14+dfsg-7 ii libjpeg-turbo-progs 1:1.5.2-2+b1 ii libjs-coffeescript 1.12.8~dfsg-1 ii libjs-mathjax 2.7.4+dfsg-1 ii optipng 0.7.6-1.1 ii poppler-utils 0.69.0-2 ii python-apsw 3.24.0-r1-1 ii python-chardet 3.0.4-1 ii python-cherrypy3 8.9.1-2 ii python-cssselect 1.0.3-1 ii python-cssutils 1.0.2-1 ii python-dateutil 2.6.1-1 ii python-dbus 1.2.8-2+b1 ii python-feedparser 5.2.1-1 ii python-html5-parser 0.4.4-1+b1 ii python-html5lib 1.0.1-1 ii python-lxml 4.2.5-1 ii python-markdown 2.6.9-1 ii python-mechanize 1:0.2.5-3 ii python-msgpack 0.5.6-1+b1 ii python-netifaces 0.10.4-1+b1 ii python-pil 5.3.0-1 ii python-pkg-resources 40.4.3-1 ii python-pyparsing 2.2.0+dfsg1-2 ii python-pyqt5 5.11.3+dfsg-1+b1 ii python-pyqt5.qtsvg 5.11.3+dfsg-1+b1 ii python-pyqt5.qtwebkit 5.11.3+dfsg-1+b1 ii python-regex 0.1.20180609-1+b1 ii python-routes 2.4.1-1 ii python2.7 2.7.15-4 ii xdg-utils 1.1.3-1 Versions of packages calibre recommends: ii python-dnspython 1.15.0-1 calibre suggests no packages. -- debconf-show failed