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/http.py b/session_redis/http.py index a4b5c17..57eed19 100644 --- a/session_redis/http.py +++ b/session_redis/http.py @@ -77,6 +77,20 @@ def purge_fs_sessions(path): pass +def copy_fs_sessions(path): + from odoo.http import OpenERPSession + import werkzeug.contrib.sessions + werkzeug_session_store = werkzeug.contrib.sessions.FilesystemSessionStore(path, session_class=OpenERPSession) + session_store = http.Root().session_store + filename_prefix='werkzeug_' + filename_suffix = '.sess' + + for fname in os.listdir(path): + path = os.path.join(path, fname) + session = werkzeug_session_store.get(fname[len(filename_prefix):len(filename_suffix) * -1]) + 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 +102,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)