Skip to content

Instantly share code, notes, and snippets.

@bactisme
Created June 17, 2015 11:18
Show Gist options
  • Save bactisme/a3598d89601beb41271f to your computer and use it in GitHub Desktop.
Save bactisme/a3598d89601beb41271f to your computer and use it in GitHub Desktop.
Keep two version of my vzdump rsynced files
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
import os
import os.path
import re
class VMFileRotator:
def __init__(self, path, regexp, max_keep = 2):
self.path = path
self.regexp = regexp
self.regexp = self.regexp.replace('%ident', '([a-zA-Z0-9]+)')
self.regexp = self.regexp.replace('%date', '([0-9_-]+)')
self.max_keep = max_keep
def list_files(self):
self._files = []
for (dirpath, dirnames, filenames) in os.walk(self.path):
self._files.extend(filenames)
break
def filter_files(self):
self.files_db = dict()
for f in self._files:
m = re.match(self.regexp, f)
if not m:
continue
ident = m.group(1)
if ident not in self.files_db:
self.files_db[ident] = []
self.files_db[ident].append((f, m.group(2)))
def sort_files(self):
for vm in self.files_db:
self.files_db[vm].sort(key=lambda tup: tup[1])
def unlink(self, f):
p = os.path.join(self.path, f)
print "discard %s" % p
os.remove(p)
def discard_files(self):
for vm in self.files_db:
if len(self.files_db[vm]) > self.max_keep:
print "on %s, count=%d" % (vm, len(self.files_db[vm]))
for f, date in self.files_db[vm][:-self.max_keep]:
self.unlink(f)
def run(self):
self.list_files()
self.filter_files()
self.sort_files()
self.discard_files()
vmfr = VMFileRotator("/home/backup-user/droid/dumps", 'vzdump-openvz-%ident-%date.tar.lzo' ).run()
vmfr = VMFileRotator("/home/backup-user/golem/dumps/dump", 'vzdump-openvz-%ident-%date.tar.lzo', 3 ).run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment