Ross Peoples and I created a new version of sessions2trash.py. Features
include:
- Deletes expired sessions files only based on sessions actual expiration
value.
- An option to delete sessions files once, then exit.
- An option to set the expiration time, overriding the default 60
minutes.
- An option to modify the sleep time between executions.
- Ability to delete all sessions files regardless of expiration time.
For help:
python web2py.py -S app -M -R scripts/sessions2trash.py -A --help
Examples of typical usage are incuded in the script comments. This script
works with session files only.
Everyone is welcome to it.
Regards
Jim Karsten #!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
sessions2trash.py
Run this script in a web2py environment shell e.g. python web2py.py -S app
If models are loaded (-M option) auth.settings.expiration is assumed
for sessions without an expiration. If models are not loaded, sessions older
than 60 minutes are removed. Use the --expiration option to override these
values.
Typical usage:
# Delete expired sessions every 5 minutes
nohup python web2py.py -S app -M -R scripts/sessions2trash.py &
# Delete sessions older than 60 minutes regardless of expiration,
# with verbose output, then exit.
python web2py.py -S app -M -R scripts/sessions2trash.py -A -o -x 3600 -f -v
# Delete all sessions regardless of expiry and exit.
python web2py.py -S app -M -R scripts/sessions2trash.py -A -o -x 0
"""
from gluon.storage import Storage
from optparse import OptionParser
import cPickle
import datetime
import os
import stat
import time
EXPIRATION_MINUTES = 60
SLEEP_MINUTES = 5
VERSION = 0.3
def main():
"""Main processing."""
usage = '%prog [options]' + '\nVersion: %s' % VERSION
parser = OptionParser(usage=usage)
parser.add_option('-o', '--once',
action='store_true', dest='once', default=False,
help='Delete sessions, then exit.',
)
parser.add_option('-s', '--sleep',
dest='sleep', default=SLEEP_MINUTES * 60, type="int",
help='Number of seconds to sleep between executions. Default 300.',
)
parser.add_option('-x', '--expiration',
dest='expiration', default=None, type="int",
help='Expiration value for sessions without expiration (in seconds)',
)
parser.add_option('-f', '--force',
action='store_true', dest='force', default=False,
help=('Ignore session expiration. '
'Force expiry based on -x option or auth.settings.expiration.')
)
parser.add_option('-v', '--verbose',
action='store_true', dest='verbose', default=False,
help='Print verbose output.',
)
(options, unused_args) = parser.parse_args()
expiration = options.expiration
if expiration is None:
try:
expiration = auth.settings.expiration
except:
expiration = EXPIRATION_MINUTES * 60
while True:
trash_session_files(expiration, options.force, options.verbose)
if options.once:
break
else:
time.sleep(options.sleep)
def trash_session_files(expiration, force=False, verbose=False):
"""
Trashes expired session files.
Arguments::
expiration: integer, expiration value to use for sessions without one.
force: If True, ignores session expiration and use value of
expiration argument.
verbose: If True, print names of sessions trashed.
"""
now = datetime.datetime.now()
path = os.path.join(request.folder, 'sessions')
for file in os.listdir(path):
filename = os.path.join(path, file)
last_visit = datetime.datetime.fromtimestamp(
os.stat(filename)[stat.ST_MTIME])
if expiration > 0:
try:
f = open(filename, 'rb+')
session = Storage()
session.update(cPickle.load(f))
f.close()
if session.auth:
if session.auth.expiration and not force:
expiration = session.auth.expiration
if session.auth.last_visit:
last_visit = session.auth.last_visit
except:
pass
if expiration == 0 or \
total_seconds(now - last_visit) > expiration:
os.unlink(filename)
if verbose:
print('Session trashed: %s' % file)
def total_seconds(delta):
"""
Adapted from Python 2.7's timedelta.total_seconds() method.
Args:
delta: datetime.timedelta instance.
"""
return (delta.microseconds + (delta.seconds + (delta.days * 24 * 3600)) * \
10 ** 6) / 10 ** 6
main()