You are on page 1of 2

#!

/usr/bin/env python3

import datetime
import os
import re
import sys
import time
import subprocess as sp

ZK_CONF = os.path.expanduser("~/zookeeper/conf/zoo.cfg")

MAX_BACKUPS = 5

def find_property(cfg, prop, mandatory=True):


with open(cfg, 'r') as f:
for line in f:
if re.search(prop, line):
return line.split("=")[1].strip()

if mandatory:
raise RuntimeError("Property '{}' not found in config {}\n".format(prop,
cfg))

def cleanup_existing_backups(prefix, backup_dir):


backups = list(f for f in os.listdir(backup_dir) if f.startswith(prefix))
num_backups = len(backups)
num_to_delete = num_backups - MAX_BACKUPS

if num_to_delete > 0:
backups.sort(key=lambda x: os.path.getmtime(backup_dir + x))
oldest = backups[0:num_to_delete]
print("Number of '{}' backups ({}) exceeds max backups ({}). Deleting
oldest #{} file(s).".format(prefix, num_backups, MAX_BACKUPS, num_to_delete))

for old_backup in oldest:


os.remove("{}/{}".format(backup_dir, old_backup))

def backup():
start = time.time()

print(datetime.datetime.now())

timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")

data_dir = find_property(ZK_CONF, "dataDir")


data_log_dir = find_property(ZK_CONF, "dataLogDir", mandatory=False)

backup_dir = find_property(ZK_CONF, "backupDir")


backup_tar = backup_dir + "zookeeper-data-%s.tar.bz2" % timestamp
backup_log_tar = backup_dir + "log-%s.tar.bz2" % timestamp

print("About to backup data dir {} to {}".format(data_dir, backup_tar))

os.makedirs(backup_dir, exist_ok=True)
sp.call(["tar", "cjf", backup_tar, "-C", data_dir, ".", "--
exclude=lost+found"])
cleanup_existing_backups("zookeeper-data-", backup_dir)

if data_log_dir and data_log_dir != data_dir:


print("About to backup log dir {} to {}".format(data_log_dir,
backup_log_tar))
sp.call(["tar", "cjf", backup_log_tar, "-C", data_log_dir, ".", "--
exclude=lost+found"])
cleanup_existing_backups("log-", backup_dir)
print("Backups done: {} and {} ({} secs)".format(backup_tar,
backup_log_tar, time.time() - start))
else:
print("Backup done: {} ({} secs)".format(backup_tar, time.time() - start))

if __name__ == "__main__":
try:
backup()
except Exception as e:
sys.stderr.write("ERROR: unable to backup: {}".format(e))
sys.exit(1)

You might also like