195 lines
6.1 KiB
Python
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()
|