Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import threading
- import time
- import os
- from random import SystemRandom
- from argparse import ArgumentParser
- class ProgressSpin(threading.Thread):
- def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=False, sleep=0.5, maximum=100.0):
- super().__init__(group, target, name, args, kwargs, daemon=daemon)
- self.sleep = sleep
- self.value = 0
- self.maximum = maximum
- self.done = False
- @property
- def progress(self):
- return 100.0 * self.value / self.maximum
- @progress.setter
- def progress(self, percentage):
- if percentage > 100.0 or percentage < 0.0:
- raise ValueError("Progress percentage should be a value between 0.0 and 100.0")
- self.value = int(percentage * self.maximum)
- def run(self):
- print()
- i = 1
- while i:
- chars = {0: "/", 1: "-", 2: "\\", 3: "|"}
- print("\r{} {:03.02f}%".format(chars.get(i % 4), self.progress), end="")
- time.sleep(self.sleep)
- i += 1
- if i and (self.done or self.progress == 100.0):
- i = -1
- class SecureDelete:
- def __init__(self, *, bs=1024):
- self.bs = bs
- self.rdev = SystemRandom()
- def erase(self, filename, count, callback=None):
- if not os.path.isfile(filename):
- raise IOError("The file '{}' does not exist.".format(filename))
- size = os.stat(filename).st_size
- if not size:
- return
- chunks, leftover = size // self.bs, size % self.bs
- cnt, total = 0, size * count
- with open(filename, "wb") as fout:
- for i in range(count):
- fout.seek(0)
- for n in range(chunks + 1):
- tmp = leftover if n == chunks else self.bs
- fout.write(os.urandom(tmp))
- cnt += tmp
- if callback:
- callback(cnt, total)
- p = ProgressSpin(sleep=0.25)
- p.start()
- def cb(count, total):
- if p.maximum != total:
- p.maximum = total
- p.value = count
- if __name__ == "__main__":
- ap = ArgumentParser()
- ap.add_argument("-f", "--file", help="Location of the file to securely erase.", type=str, required=True)
- ap.add_argument("-c", "--count", help="", type=int, default=7)
- args = ap.parse_args()
- sd = SecureDelete()
- sd.erase(args.file, args.count, callback=cb)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement