Borg Checker, petit script Python sans prétention

, par  Genma , popularité : 1%

Prérequis :
 Avoir déjà utilisé Borg
 Connaître Python, ou a minima savoir lire du code

Rôle de ce bout de code

L’objectif est de savoir si les sauvegardes lancées la nuit, reposant sur un script Borg, se sont bien passées. Pour cela, nous partons du principe que si une commande borg c’est bien lancée, dans la liste des sauvegardes renvoyées par Borg, on aura une sauvegarde portant le bon nom (le nom incluant la date du jour). Le nom de chaque sauvegarde est donc l’élément discriminant et est de la forme Documents_AAAA-MM-DD-HH:MM:SS. Exemple Documents_2018-10-31-10:10:10

Le script répond à notre besoin, à savoir éviter de faire un "borg list" sur X répertoires et nous renvoyer un OK quand on a une sauvegarde avec la bonne date, KO si il n’y a pas de sauvegarde ayant la date du jour et il indique le nombre de jours entre la dernière sauvegarde et la date du jour.

Pourquoi en Python et pas en bash ?

J’avais commencé à former mon Pandawan au Shell et nous aurions pu faire un script équivalent en shell. Mais je voulais aussi le former à des notions de programmation objet, lui montrer que l’on pouvait faire aussi des choses en Python et dérouiller mon propre Python. D’où le choix de ce langage.

Attention, nous ne sommes pas des spécialistes Python, nous savons juste faire des bouts de scripts & codes que nous saurons relire et améliorer dans plusieurs mois. Le but n’était pas de faire un code optimisé ultra efficace mais de faire quelque chose de lisible et réutilisable et maintenable, compréhensible par la première personne qui sait lire un peu de code.

Le code

[SauvegardeBorg]
Documents_Dossier_A = /Backup/Documents/Dossier_A/
Documents_Dossier_B = /Backup/Documents/Dossier_B/
Documents_Dossier_C = /Backup/Documents/Dossier_C/
#!/usr/bin/python
# -*-coding:Utf-8 -*
import configparser
import sys
import os.path
import datetime

#===========================================================
# SCRIPT DE VALIDATION DES DIFFERENTES SAUVEGARDES
#==========================================================

#"------------------------------------------------------------
# Initialisation des chemins
# On a un fichier avec 
# * en clef : la sauvegarde à valider
# * en valeur : le chemin dans lequel on vérifie la sauvegarde
# via le check de borg list avec une sauvegarde borg à la date du jour
config = configparser.ConfigParser()
config.optionxform = str
config.read('./Config.ini')
configsauvegardeBorg = config['SauvegardeBorg']

def fctCheckBorg():
	print("==========================================")
	print(" CHECK DES SAUVEGARDES BORG")
	print("==========================================")

	from datetime import datetime
	# Lecture de tous les éléments de BorgBackupPath
	for key,value in config.items('SauvegardeBorg'):
		try:
			borgCommand="borg list "+ value
			sortie = os.popen(borgCommand).read()
			tabBorgList = sortie.split("\n")
			number=len(tabBorgList) -2
			# La ligne est de la forme 
			# Documents_2018-10-31-10:10:10   Wed, 2018-10-31 10:10:10 [b576a0703b7144be76afd2e2]
			# On coupe pour trouver la date
			lastBackupDate = tabBorgList[number].split(",")[1].split("[")[0].split(" ")[1]
			# Conversion du String en Date
			lastBackupDateToDate = datetime.strptime(lastBackupDate,'%Y-%M-%d')
			# Récupération de la date du jour au bon format
			now=datetime.strptime(datetime.now().strftime('%Y-%M-%d'),'%Y-%M-%d')
			# Calcul du delta
			delta = now - lastBackupDateToDate
			if (delta.days == 0):
				print(key, ": statut OK. Nombre de jours depuis la dernière sauvegarde : ", str(delta.days))
			else:
				print(key, ": statut KO. Nombre de jours depuis la dernière sauvegarde :", str(delta.days))
		except Exception as e:
			print("Erreur rencontree : ")
			print(str(e))
			continue
	print("\n")
	return 0;

Exemple de résultat d’exécution

Le script se lance via

python3 BorgChecker.py

Résultat de l’exécution quand on a bien une sauvegarde qui s’est déroulée sur la nuit

Documents_Dossier_A : statut OK. Nombre de jours depuis la dernière sauvegarde : 0.
Documents_Dossier_B : statut OK. Nombre de jours depuis la dernière sauvegarde : 0.

Résultat de l’exécution quand on a bien une erreur (et le nombre de jours permet de détecter que le script ne tourne plus depuis X jours par exemple).

Documents_Dossier_C : statut KO. Nombre de jours depuis la dernière sauvegarde : 3.

Ainsi on sait que pour le dossier A et B, on a bien une sauvegarde. Pour le dossier C, il y a eu une erreur (vu que l’on a un K0) et il faudra donc aller analyser pour en savoir plus (coupure de réseau, lock qui a empêché la bonne exécution de Borg...)

Conclusion

Le code source et l’ensemble de cet article sont en licence CC BY SA, faites en ce que vous voulez. Si ça peut vous être utile, tant mieux ;)