Source code for backshift_os_mod


"""This module is to handle miscellaneous, OS-related callables."""

import os
import grp
import pwd
import sys
import errno


[docs] def safe_rename(backup_filename, regular_filename): """Rename backup_filename to regular_filename.""" # Deal with the fact that CIFS may EEXIST when renaming to a file that already exists. unlink_and_rename = False try: os.rename(backup_filename, regular_filename) except (OSError, IOError) as extra: if extra.errno == errno.EEXIST: unlink_and_rename = True else: sys.stderr.write('Got errno %s while trying to rename %s to %s\n' % (extra.errno, backup_filename, regular_filename)) raise if unlink_and_rename: os.unlink(regular_filename) os.rename(backup_filename, regular_filename)
[docs] class memoize(object): # pylint: disable=R0903 # R0903: We have a very focused purpose, and don't require a lot of public methods """Cache a function's results.""" # Shamelessly lifted from http://www.quora.com/Is-there-a-decorator-that-does-memoization-built-in-to-Python def __init__(self, function): """Initialize.""" self.function = function self.memoized = {} def __call__(self, *args): """Make us callable, like a decorator.""" try: return self.memoized[args] except KeyError: self.memoized[args] = self.function(*args) return self.memoized[args]
@memoize def my_getpwnam(name): """Look up a pwent by username - cached.""" return pwd.getpwnam(name) @memoize def my_getpwuid(uid): """Look up a pwent by userid - cached.""" return pwd.getpwuid(uid) @memoize def my_getgrnam(name): """Look up a grent by group name - cached.""" return grp.getgrnam(name) @memoize def my_getgrgid(gid): """Look up a grent by groupid - cached.""" return grp.getgrgid(gid)