tunasync_snapshot_gc.py 1.3 KB

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