2
0

tunasync_snapshot_gc.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/env python2
  2. # -*- coding:utf-8 -*-
  3. import re
  4. import sh
  5. import os
  6. import argparse
  7. import toml
  8. if __name__ == "__main__":
  9. parser = argparse.ArgumentParser(prog="tunasync_snapshot_gc")
  10. parser.add_argument("--max-level", type=int, default=1, 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 > args.max_level:
  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. sh.btrfs("subvolume", "delete", abs_fname)
  25. except sh.ErrorReturnCode as e:
  26. print("Error: {}".format(e.stderr))
  27. else:
  28. walk(abs_fname, level+1)
  29. with open(args.config) as f:
  30. settings = toml.loads(f.read())
  31. mirror_root = settings["global"]["mirror_root"]
  32. gc_root = settings["btrfs"]["gc_root"].format(mirror_root=mirror_root)
  33. walk(gc_root)
  34. # vim: ts=4 sw=4 sts=4 expandtab