diff options
Diffstat (limited to 'rainbow/rainbow/gc.py')
-rw-r--r-- | rainbow/rainbow/gc.py | 50 |
1 files changed, 0 insertions, 50 deletions
diff --git a/rainbow/rainbow/gc.py b/rainbow/rainbow/gc.py deleted file mode 100644 index 2198367..0000000 --- a/rainbow/rainbow/gc.py +++ /dev/null @@ -1,50 +0,0 @@ -from subprocess import call, check_call, CalledProcessError -from os import listdir, unlink -from os.path import join, isdir, islink, exists -from rainbow.util import trace - -def active_uid(uid): - cmd = ['/usr/bin/pgrep', '-U', uid] - ret = call(cmd, stdout=open('/dev/null')) - if ret in (0, 1): - return ret == 0 - raise CalledProcessError(ret, cmd) - -def gc_uid(spool, uid): - """This function conservatively attempts to garbage-collect stale uid - reservations. - """ - - # XXX: D-Bus caches passwd-db data! - # XXX: D-Bus uses a fixed 1k passwd buffer - be careful with long paths & - # comments - - reservation = join(spool, 'uid_pool', uid) - assert not isdir(reservation) and not islink(reservation) - - # XXX: We perform several execv()'s as root based on strings derived from - # this 'uid' parameter, which originates as a file-name in a user-writable - # directory. Better ideas for input validation would be welcome. - uid_num = int(uid) - assert uid_num >= 1000 and uid_num <= 65534 # XXX: magic numbers from util/spool.py - - if active_uid(uid): - return - - for table in ('uid_to_instance_dir', 'uid_to_home_dir', 'uid_to_gid'): - row = join(spool, table, uid) - # NB: it is important that rm -rf doesn't follow links. <MS> - check_call(['/bin/rm', '-r', '-f', row]) - - # So long as we unlink the reservation last, we run no risk of seeing inconsistency - unlink(reservation) - -def gc_spool(log, spool): - uspool = join(spool, 'uid_pool') - if exists(uspool) and isdir(uspool): - for maybe_uid in listdir(uspool): - try: gc_uid(spool, maybe_uid) - except: trace() - else: - log(1, "Skipping spool %s", spool) - |