Welcome, guest | Sign In | My Account | Store | Cart
from os import path, walk, rename, urandom, remove, rmdir
from sys import argv
from uuid import uuid4

################################################################################

def main():
    "Test arguments and either destroy path or print help."
    if len(argv) == 2 and path.isdir(argv[1]):
        destroy(argv[1])
    else:
        print('Usage: {} <directory>'.format(path.basename(argv[0])))

def destroy(directory):
    "Render the directory with its contents unrecoverable."
    for root, dirs, files in walk(directory, False):
        for name in files:
            try_delete(try_overwrite(try_rename(root, name)))
        try_delete(try_rename(root))

def try_rename(root, name=None):
    "Try to rename a file or directory."
    if name is None:
        old, new = root, path.join(path.dirname(root), uuid4().hex)
    else:
        old, new = path.join(root, name), path.join(root, uuid4().hex)
    try:
        rename(old, new)
    except EnvironmentError:
        return old
    return new

def try_overwrite(filename):
    "Try to overwrite a file."
    try:
        size = path.getsize(filename)
        if size > 0:
            with open(filename, 'r+b', 0) as file:
                while size > 0:
                    size -= file.write(urandom(min(size, 1 << 20)))
    except EnvironmentError:
        pass
    return filename

def try_delete(file_or_dir):
    "Try to delete a file or directory."
    try:
        if path.isfile(file_or_dir):
            remove(file_or_dir)
        elif path.isdir(file_or_dir):
            rmdir(file_or_dir)
    except EnvironmentError:
        pass
    return file_or_dir

################################################################################

if __name__ == '__main__':
    main()

History