tunasync_snapshot_gc.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. #!/usr/bin/env python2
  2. # -*- coding:utf-8 -*-
  3. import re
  4. import sh
  5. import os
  6. import argparse
  7. if __name__ == "__main__":
  8. parser = argparse.ArgumentParser(prog="tunasync_snapshot_gc")
  9. parser.add_argument("--max-level", type=int, default=2, help="max walk level to find garbage snapshots")
  10. parser.add_argument("--pattern", default=r"^_gc_\d+", help="pattern to match garbage snapshots")
  11. parser.add_argument("mirror_root", help="tunasync mirror root")
  12. args = parser.parse_args()
  13. pattern = re.compile(args.pattern)
  14. def walk(_dir, level=1):
  15. if level > 2:
  16. return
  17. for fname in os.listdir(_dir):
  18. abs_fname = os.path.join(_dir, fname)
  19. if os.path.isdir(abs_fname):
  20. if pattern.match(fname):
  21. print("GC: {}".format(abs_fname))
  22. try:
  23. ret = sh.btrfs("subvolume", "delete", abs_fname)
  24. except sh.ErrorReturnCode:
  25. print("Error: {}".format(ret.stderr))
  26. else:
  27. walk(abs_fname, level+1)
  28. walk(args.mirror_root)
  29. # vim: ts=4 sw=4 sts=4 expandtab