Newer
Older
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2017, Florent Thiery
'''
from datetime import datetime
import imp
GREEN = '\033[92m'
RED = '\033[91m'
DEF = '\033[0m'
def test_ssh(ip):
cmd = 'ssh -o StrictHostKeyChecking=no -o PasswordAuthentication=no %s ls /tmp' % ip
print('Connecting to MediaVault: %s' % cmd)
try:
subprocess.check_output(cmd, shell=True, timeout=2)
print('%sLogged in successfully%s' % (GREEN, DEF))
except subprocess.CalledProcessError:
print('%sFailed to login using SSH, run ssh-copy-id %s %s' % (RED, ip, DEF))
return False
return True
def test_last_backup_is_recent(server):
client = socket.gethostname()
path = '/backup/%s/home/latest' % client
cmd = 'ssh -o StrictHostKeyChecking=no %s ls -l %s | grep latest' % (server, path)
date = out.strip().split(' ')[-1]
pdate = datetime.strptime(date, '%Y-%m-%d-%H%M%S')
print('Backup is older than 2 days')
return False
else:
print('There is a backup that is less than 2 days old, this is fine')
out = out or 'No output.'
print('SSH access is not working (code: %s):\n%s' % (status, out))
def check_backup_is_incremental(path):
Florent Thiéry
committed
# incremental backups done with tmbackup mean that they will all at least contain links
dirs = os.listdir(path)
is_incremental = True
for d in dirs:
Florent Thiéry
committed
files_count = 0
folder_path = os.path.join(path, d)
if os.path.isdir(folder_path):
Florent Thiéry
committed
files_count = len(os.listdir(folder_path))
if files_count == 0:
print('Folder %s is empty, this indicates non-incremental backups (we are expecting links), removing folder' % folder_path)
is_incremental = False
os.rmdir(folder_path)
return is_incremental
backup_folder = os.path.dirname(path)
latest = os.path.join(backup_folder, 'latest')
if os.path.exists(latest):

Florent Thiery
committed
# resolve symbolic link
latest = os.path.realpath(latest)
date = os.path.basename(latest)
d = datetime.strptime(date, '%Y-%m-%d-%H%M%S')
now = datetime.now()
diff_seconds = (now - d).total_seconds()
if diff_seconds > MAX_AGE_H * 3600:
print_red('Backup %s is older than %sh (%ih)' % (backup_folder, MAX_AGE_H, diff_seconds / 3600))
all_ok = False
if not check_backup_is_incremental(backup_folder):
all_ok = False
elif os.path.exists(os.path.join(backup_folder, 'backup.inprogress')):
print_red('Initial backup %s still running' % backup_folder)
def check_local_backups(paths):
all_ok = True
folders = paths.split(',')
for f in folders:
cmd = "find %s -maxdepth 4 -name backup.marker" % f
status, out = subprocess.getstatusoutput(cmd)
for bf in out.split('\n'):
all_ok = min(check_local_backup(bf), all_ok)
return all_ok
if os.path.isfile('../utils.py'):
es_utils = imp.load_source('es_utils', '../utils.py')
conf = es_utils.load_conf()
BACKUP_SERVER = conf.get('BACKUP_SERVER')
LOCAL_BACKUP_FOLDERS = conf.get('LOCAL_BACKUP_FOLDERS')
if BACKUP_SERVER:
if not test_ssh(BACKUP_SERVER):
print('Failed to ssh into backup server')
sys.exit(1)
else:
if not test_last_backup_is_recent(BACKUP_SERVER):

Florent Thiery
committed
sys.exit(0)
elif LOCAL_BACKUP_FOLDERS:

Florent Thiery
committed
sys.exit(not check_local_backups(LOCAL_BACKUP_FOLDERS))
print('No BACKUP_SERVER defined in config, untestable')
sys.exit(2)
else:
print('Unable to load config, untestable')