#!/usr/bin/env python from prometheus_client import start_http_server, Gauge from time import sleep from datetime import datetime import re import os import sys HTTP_PORT = 9401 BACKUP_DIRECTORY = '/srv/dropzone/' INTERVAL = 30 * 60 # seconds DATEREGEX = re.compile("[0-9]{4}-[0-9]{2}-[0-9]{2}") files_touched_recently = Gauge('veeam_has_touched_files', 'Files have been modified in past 24h', ['name']) def isNotHidden(dirname): return dirname[0] != '.' def hasDate(filename): return DATEREGEX.search(filename) is not None def deltaInDays(filename): filedate = datetime.strptime(DATEREGEX.search(filename).group(), "%Y-%m-%d") return (datetime.today() - filedate).days # Because Prometheus has no binary datatype, we use integers in a Gauge. # Sorry, dear reader... def hasRecentFile(deltaList): if 0 in deltaList or 1 in deltaList: return 1 else: return 0 def deltaList(dirname): return [deltaInDays(f) for f in os.listdir(dirname) if hasDate(f)] if __name__ == '__main__': if len(sys.argv) == 2: BACKUP_DIRECTORY = sys.argv[1] elif len(sys.argv) > 2: sys.exit("Invalid number of arguments." "Usage: ./prometheus-borgbackup-exporter [backup-directory]") # Serve metrics over HTTP. print("Starting prometheus-veeam-exporter on port", "{}...".format(HTTP_PORT), end='') start_http_server(HTTP_PORT) print(" OK.") os.chdir(BACKUP_DIRECTORY) while True: try: print(">> Running check...") result = [(backupjob, hasRecentFile(deltaList(backupjob))) for backupjob in os.listdir(BACKUP_DIRECTORY) if isNotHidden(backupjob)] for job in result: files_touched_recently.labels(job[0]).set(job[1]) print(" OK.") except Exception as e: print("Error! {}".format(e)) sleep(INTERVAL)