File: //lib/python2.7/site-packages/lap/bacula_time.py
#!/usr/bin/python
from backupmanager import BackupAPI
import socket
import json
from datetime import datetime,timedelta
import argparse
import sys,os
import yaml
from random import randrange
import pwd, grp
import time
auth = BackupAPI()
client = socket.gethostname().split('.')[0]
OK = 0
CRITICAL = 2
WARNING = 1
cache_file = "/tmp/bacula_time.cache"
cache_time = 10950 + randrange(100)
def user_cache():
try:
uid, gid = pwd.getpwnam('check-mk').pw_uid, grp.getgrnam('check-mk').gr_gid
if uid and gid:
os.chown(cache_file, uid, gid)
except KeyError:
pass
def without_backup(jobname):
last_jobok = False
created = auth.login('client', client)['date']
created_format = datetime.strptime(created, '%Y-%m-%dT%H:%M:%S.%fZ')
if datetime.now() - created_format > timedelta(days=3):
warning_days = 2
critical_days = 4
json_jobs = auth.login('jobid', client)
list_jobname = json_jobs[jobname]
if list_jobname:
for values in list_jobname:
if values['jobstatus'] == 'T':
last_jobok = values['endtime']
if values['jobstatus'] in ('R','C'):
last_jobok = last_jobok
if not last_jobok:
last_jobok = datetime.strftime(created_format, "%Y-%m-%d %H:%M:%S")
last_date = datetime.strptime(last_jobok, "%Y-%m-%d %H:%M:%S")
if last_date <= datetime.now() - timedelta(days=warning_days) and last_date >= datetime.now() - timedelta(days=5):
return WARNING
if last_date <= datetime.now() - timedelta(days=critical_days):
return CRITICAL
def cegonha(client, full_json):
if full_json['status'] in ["IN_PRODUCTION","SPARE_INSTALATION","SPARE_MAINTAINCE","PRE_PRODUCTION","MAINTENANCE"] and full_json['flag'] == True:
return True
else:
return False
def __run__(params):
lista_warning = []
lista_critical = []
if os.path.isfile(cache_file) and (time.time() - os.stat(cache_file).st_mtime) < cache_time and \
os.stat(cache_file).st_size > 0:
data = json.loads(open(cache_file).read())
if data:
return [OK, "Cache " + data]
else:
return [CRITICAL, "Cache " + data]
else:
with open(cache_file, 'w') as f:
user_cache()
try:
full_json = auth.login('cegonha', client)
if cegonha(client, full_json):
client_json = auth.login('rotina', client)
if client_json:
for job in client_json:
backup_time = without_backup(job)
if backup_time == WARNING:
lista_warning.append(job)
if backup_time == CRITICAL:
lista_critical.append(job)
if lista_warning and not lista_critical:
return [WARNING, "WARNING: List jobs %s with 3 days without backup" % lista_warning]
elif lista_critical or lista_warning:
return [CRITICAL, "CRITICAL: List jobs %s with 5 days without backup or WARNING: %s and 3 days" % (lista_critical, lista_warning)]
else:
msg = "Backup OK"
f.write(json.dumps(msg))
return [OK, msg]
else:
msg = "OK: Client %s does not exist in backupmanager" % client
f.write(json.dumps(msg))
return [OK, msg]
else:
msg = "Machine flag false or desactived"
f.write(json.dumps(msg))
return [OK, msg]
except Exception, e:
return [WARNING, "WARNING: %s" % e]