Skip to main content

Python wrapper over `atd` to schedule deletion of files.

Project description

A pythonic wrapper over atd to schedule deletion of files/directories.

Source code: https://github.com/lonetwin/expyre

Install using pip pip install expyre or download from https://pypi.python.org/pypi/expyre

What is expyre ?

expyre is a python module that provides a command line as well as a contextmanager which enables you to schedule files/directories for deletion at some point in the future. It does this by relying on the atd(8) service for the scheduling of jobs.

Since usually examples are better than a long README

Command line usage

# - schedule a file for deletion 2 days from now
$ expyre -p path/to/file0 @now + 2days
[212] /home/steve/src/venvs/expyre/path/to/file0 will expire at 2016-05-16 19:10

# - schedule a file for deletion a minute befor new year 2018
$ expyre --unless-modified -p path/to/file1 @23:59 2017-12-31
[213] /home/steve/src/venvs/expyre/path/to/file1 will expire at 2017-12-31 23:59

# - list the current expiry schedule
$ expyre -l
/home/steve/src/venvs/expyre/path/to/file1 scheduled to expire at 2017-01-01 19:07 unless modified after 19:07 2016-05-14
/home/steve/src/venvs/expyre/path/to/file0 scheduled to expire at 2016-05-16 19:10

# - remove a file from the expiry schedule
$ expyre -r /home/steve/src/venvs/expyre/path/to/file0
Successfully removed these paths from expiry list:
/home/steve/src/venvs/expyre/path/to/file0

Python usage

from datetime import datetime, timedelta
from expyre.helpers import open_expiring, expire_path, get_scheduled_jobs, remove_from_schedule

# - as a contextmanager
filename = '/path/to/file'
with open_expiring(filename, 'w', at='now + 3days', unless_accessed=True) as fd:
    # - create a file with a scheduled deletion time exactly 3 days from
    # time of creation unless it has been accessed before the deletion time.
    pass  # - do stuff with file

# - schedule a file for deletion providing time as a string
expire_path('./path/to/file0', 'now + 2days')
JobSpec(job_id='216', path='/home/steve/src/venvs/expyre/path/to/file0', timestamp=datetime.datetime(2016, 5, 16, 19, 20), conditions='unless accessed after 19:20 2016-05-14 or unless modified after 19:20 2016-05-14')

# - schedule a file for deletion providing time as a datetime object
expire_path('./path/to/file1', (datetime.now() + timedelta(days=3)), unless_modified=True)
JobSpec(job_id='217', path='/home/steve/src/venvs/expyre/path/to/file1', timestamp=datetime.datetime(2016, 5, 17, 19, 20), conditions='unless accessed after 19:20 2016-05-14 or unless modified after 19:20 2016-05-14')

# - Get the expiry schedule as a dict
get_scheduled_jobs()
{'/home/steve/src/venvs/expyre/path/to/file0': JobSpec(job_id='216', path='/home/steve/src/venvs/expyre/path/to/file0', timestamp=datetime.datetime(2016, 5, 16, 19, 20), conditions='unless accessed after 19:20 2016-05-14 or unless modified after 19:20 2016-05-14'),
 '/home/steve/src/venvs/expyre/path/to/file1': JobSpec(job_id='217', path='/home/steve/src/venvs/expyre/path/to/file1', timestamp=datetime.datetime(2016, 5, 17, 19, 20), conditions='unless accessed after 19:20 2016-05-14 or unless modified after 19:20 2016-05-14')}

# - remove a file from the expiry schedule
remove_from_schedule(['/home/steve/src/venvs/expyre/path/to/file0'])
(['/home/steve/src/venvs/expyre/path/to/file0'], [])

A few things to note

  • This has only be tested on my local dev box (Fedora 23 with python 2.7). So, YMMV. Please do some cursory testing before relying on this tool.

  • Since (AFAICT), atd(8) has only minute level precision, the same limitation applies to expyre.

  • Directories will be deleted with a rm -rf option ! So, you need to be careful when scheduling those for deletion.

  • The --unless_accessed and --unless_modified options to directories imply the access time and modification time for the directory, not the files under them.

  • Currently no checks are done to see whether there is already an existing job for a path being scheduled for deletion. I am not yet convinced that this is really necessary to be done as a default action.

  • Please, please, please do report bugs or send in suggestions for improvements if you can. This would be greatly appreciated.

  • Patches and code reviews would be even more appreciated.

TODO

  • More tests

  • Write docs

Usage examples

  • Write a inotify based example of how you may set auto-expiry for files in the Downloads/ folder.

  • Write an example file-upload web service with an expiry schedule.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

expyre-0.1.3.tar.gz (7.4 kB view details)

Uploaded Source

Built Distribution

expyre-0.1.3-py2.py3-none-any.whl (10.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file expyre-0.1.3.tar.gz.

File metadata

  • Download URL: expyre-0.1.3.tar.gz
  • Upload date:
  • Size: 7.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for expyre-0.1.3.tar.gz
Algorithm Hash digest
SHA256 82f552c3a98d264f4cb8aba0b215a9c4ebf67f8967711f0ed58d77c4616520d3
MD5 a5489514f34027a4dbf978476e03b046
BLAKE2b-256 aa93c13000a633e0473a9141728ee275a31570c17cf75481c691c7caace60a71

See more details on using hashes here.

File details

Details for the file expyre-0.1.3-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for expyre-0.1.3-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 3ca553c910237995c5bcaf1f3f44dc1d70a92f10dae13f0328e167abfef351a0
MD5 d40d90f38fb784c65a4d3e7826d1716b
BLAKE2b-256 62d91f18be32e17f4b7641c86e8fa435027b50e01be2c07584b850c8d9816f59

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page