#!/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()