diff --git a/session_redis/README.rst b/session_redis/README.rst index 949f8b4..e4e32ec 100644 --- a/session_redis/README.rst +++ b/session_redis/README.rst @@ -18,6 +18,10 @@ The storage of sessions in Redis is activated using environment variables. the sessions (default is 7 days) * ``ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS`` is the time in seconds before expiration of the anonymous sessions (default is 3 hours) +* ``ODOO_SESSION_REDIS_COPY_EXISTING_FS_SESSIONS`` when ``1`` or ``true`` copies the existing odoo sessions from + the filesystem to redis when starting +* ``ODOO_SESSION_REDIS_PURGE_EXISTING_FS_SESSIONS`` when ``1`` or ``true`` deletes the existing odoo sessions from + the filesystem to redis when starting The keys are set to ``session:``. @@ -32,8 +36,12 @@ Limitations * The server has to be restarted in order for the sessions to be stored in Redis. -* All the users will have to login again as their previous session will be - dropped. * The addon monkey-patch ``odoo.http.Root.session_store`` with a custom method when the Redis mode is active, so incompatibilities with other addons is possible if they do the same. + +Preseve Sessions +---------------- + +In order to preserve sessions when switching to redis run odoo with +``ODOO_SESSION_REDIS_COPY_EXISTING_FS_SESSIONS=true odoo --load session_redis --stop-after-init`` diff --git a/session_redis/__init__.py b/session_redis/__init__.py index af491fc..a64bcb4 100644 --- a/session_redis/__init__.py +++ b/session_redis/__init__.py @@ -1,4 +1,2 @@ -# -*- coding: utf-8 -*- - from . import http from . import session diff --git a/session_redis/__manifest__.py b/session_redis/__manifest__.py index 2498a86..89c7f78 100644 --- a/session_redis/__manifest__.py +++ b/session_redis/__manifest__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2016 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) @@ -16,4 +15,5 @@ 'website': 'http://www.camptocamp.com', 'data': [], 'installable': True, + 'post_load': False, } diff --git a/session_redis/http.py b/session_redis/http.py index a4b5c17..77c6417 100644 --- a/session_redis/http.py +++ b/session_redis/http.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2016 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) @@ -77,6 +76,20 @@ def purge_fs_sessions(path): pass +def copy_fs_sessions(path): + from odoo.http import OpenERPSession + from werkzeug.contrib.sessions import FilesystemSessionStore + werkzeug_session_store = FilesystemSessionStore(path, session_class=OpenERPSession) + session_store = http.Root().session_store + filename_prefix_len = len('werkzeug_') + filename_suffix_len = len('.sess') + + for fname in os.listdir(path): + session_file = fname[filename_prefix_len:filename_suffix_len * -1] + session = werkzeug_session_store.get(session_file) + session_store.save(session) + + if is_true(os.environ.get('ODOO_SESSION_REDIS')): if sentinel_host: _logger.debug("HTTP sessions stored in Redis with prefix '%s'. " @@ -88,5 +101,9 @@ if is_true(os.environ.get('ODOO_SESSION_REDIS')): http.Root.session_store = session_store http.session_gc = session_gc - # clean the existing sessions on the file system - purge_fs_sessions(odoo.tools.config.session_dir) + + if is_true(os.environ.get('ODOO_SESSION_REDIS_COPY_EXISTING_FS_SESSIONS')): + copy_fs_sessions(odoo.tools.config.session_dir) + if is_true(os.environ.get('ODOO_SESSION_REDIS_PURGE_EXISTING_FS_SESSIONS')): + # clean the existing sessions on the file system + purge_fs_sessions(odoo.tools.config.session_dir) diff --git a/session_redis/session.py b/session_redis/session.py index 00e4433..de54509 100644 --- a/session_redis/session.py +++ b/session_redis/session.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2016 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)