Python_scripts/7_LOGEPROJ/recup_backups.py

195 lines
6.1 KiB
Python

#!/usr/bin/env python3
# PLT 2022-03-29
# Script de téléchargement des sauvegardes des bases de données
# logeproj sur le serveur SFTP
from contextlib import nullcontext
import argparse
import subprocess
import shutil
import datetime
from time import strftime
from uuid import SafeUUID
import paramiko
import getpass
def demande_nom_utilisateur(p_hote):
return str(input(f"Entrer le nom d'utilisateur de connexion à {p_hote} :"))
def demande_mot_de_passe(p_hote, p_utilisateur):
return getpass.getpass(
f"Entrer le mot de passe de l'utilisateur {p_utilisateur} pour le serveur {p_hote} :"
)
def verifie_ping_host(p_hote):
commande_ping = ["ping", f"{p_hote}", "-c1"]
commande_ping_run = subprocess.run(commande_ping, stdout=None)
commande_returncode = commande_ping_run.returncode
if commande_returncode != 0:
return False
else:
return True
def verifie_presence_commande_sftp():
return shutil.which("sftp")
def effectue_verifications(p_hote):
if not verifie_ping_host(p_hote):
print("Erreur : hôte injoignable")
exit(0)
if not verifie_presence_commande_sftp():
print("Erreur : commande sftp introuvable")
exit(0)
def demande_infos_utilisateur(p_hote):
utilisateur = demande_nom_utilisateur(p_hote)
mdp = ""
if not utilisateur:
print("Erreur : aucun nom d'utilisateur saisi")
exit(0)
else:
mdp = demande_mot_de_passe(p_hote, utilisateur)
return utilisateur, mdp
def etablit_connexion_SFTP(p_hote, p_port, p_utilisateur, p_motdepasse):
connexion_ssh = paramiko.SSHClient()
connexion_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
connexion_ssh.connect(p_hote, p_port, p_utilisateur, p_motdepasse)
return connexion_ssh.open_sftp()
def clos_connexion_SFTP(p_connexion_SFTP):
p_connexion_SFTP.close()
def cherche_chemin_rep_sauvegardes_du_jour(p_connexion_sftp, p_rep_racine, p_date):
liste_rep_backups_du_jour = []
date_backup = "1900-01-01"
rep_split = ["1900", "01", "01"]
p_connexion_sftp.chdir(p_rep_racine)
for rep in p_connexion_sftp.listdir():
rep_split = rep.split("-")
date_backup = f"{rep_split[0]}-{rep_split[1]}-{rep_split[2]}"
if date_backup == p_date.strftime("%Y-%m-%d"):
liste_rep_backups_du_jour.append(rep)
nombre_de_rep = len(liste_rep_backups_du_jour)
if nombre_de_rep > 1:
print(
f"Le serveur de sauvegarde dispose de plusieurs répertoires de sauvegardes datés du {p_date.strftime('%d/%m/%Y')} :"
)
for indice in range(0, nombre_de_rep):
numero_rep = indice + 1
print(f"- {numero_rep} : {liste_rep_backups_du_jour[indice]}")
choix = int(
input(
"Entrer le numéro du répertoire dont vous souhaitez télécharger les sauvegardes : "
)
)
rep_sauvegarde_du_jour = liste_rep_backups_du_jour[choix - 1]
else:
rep_sauvegarde_du_jour = liste_rep_backups_du_jour[0]
chemin_sauvegardes_du_jour = f"/{p_rep_racine}/{rep_sauvegarde_du_jour}"
return chemin_sauvegardes_du_jour
def telecharge_un_fichier(
p_chemin_fichier_distant, p_chemin_fichier_local, p_connexionSFTP
):
print(
f"- Téléchargement de {p_chemin_fichier_distant} dans {p_chemin_fichier_local}"
)
p_connexionSFTP.get(p_chemin_fichier_distant, p_chemin_fichier_local)
def telecharge_toutes_sauvegardes(
p_chemin_rep_distant_sauvegardes, p_chemin_rep_local, p_connexionSFTP
):
print(
f"Téléchargement de toutes les sauvegardes de {p_chemin_rep_distant_sauvegardes}"
)
liste_fichiers = p_connexionSFTP.listdir(p_chemin_rep_distant_sauvegardes)
for sauvegarde in liste_fichiers:
sauvegarde_split = sauvegarde.split("-")
if len(sauvegarde_split) > 1:
if sauvegarde_split[1] == "logeproj":
chemin_sauvegarde_locale = f"{p_chemin_rep_local}/{sauvegarde}"
chemin_sauvegarde_distante = (
f"{p_chemin_rep_distant_sauvegardes}/{sauvegarde}"
)
telecharge_un_fichier(
chemin_sauvegarde_distante,
chemin_sauvegarde_locale,
p_connexionSFTP,
)
def main():
print("recup_base.py : téléchargement des bases sur le serveur SFTP")
aujourdhui = datetime.date.today()
chemin_rep_local_sauvegarde = "./backups"
sftp_hote = "ftpmdv.myriadev.fr"
sftp_port = "22060"
sftp_utilisateur = "cen-isere"
sftp_mot_de_passe = "gaic4Ao'Do1O"
sftp_rep_racine_sauvegardes = "pg_db_backup"
parser = argparse.ArgumentParser()
parser.add_argument(
"-b",
"--base",
required=False,
help="nom de la base à télécharger (si non fourni, le script télécharge toutes les bases",
)
arguments = parser.parse_args()
effectue_verifications(sftp_hote)
sftp_utilisateur, sftp_mot_de_passe = demande_infos_utilisateur(sftp_hote)
connexion_sftp = etablit_connexion_SFTP(
sftp_hote, sftp_port, sftp_utilisateur, sftp_mot_de_passe
)
chemin_rep_sauvegardes_du_jour = cherche_chemin_rep_sauvegardes_du_jour(
connexion_sftp, sftp_rep_racine_sauvegardes, aujourdhui
)
if arguments.base is None:
# Télécharger toutes les sauvegardes
telecharge_toutes_sauvegardes(
chemin_rep_sauvegardes_du_jour, chemin_rep_local_sauvegarde, connexion_sftp
)
else:
formats = ["custom", "sql.gz"]
for format in formats:
# Télécharger la base fournie en argument au format custom
chemin_sauvegarde_distante = (
f"{chemin_rep_sauvegardes_du_jour}/{arguments.base}-logeproj-centrale.{format}"
)
chemin_sauvegarde_locale = (
f"{chemin_rep_local_sauvegarde}/{arguments.base}-logeproj-centrale.{format}"
)
telecharge_un_fichier(
chemin_sauvegarde_distante, chemin_sauvegarde_locale, connexion_sftp
)
clos_connexion_SFTP(connexion_sftp)
if __name__ == "__main__":
main()