init depot renew
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
from pyxll import xl_func
|
||||
|
||||
@xl_func
|
||||
def python_func():
|
||||
return "Hello from Python !"
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env python3
|
||||
import xlwings as xw
|
||||
import pandas as pd
|
||||
|
||||
wb = xw.Book() # this will open a new workbook
|
||||
wb = xw.Book('FileName.xlsx') # connect to a file that is open or in the current working directory
|
||||
sheet = wb.sheets['Sheet1']
|
||||
|
||||
|
||||
df = pd.DataFrame([[1,2], [3,4]], columns=['a', 'b'])
|
||||
sheet['A1'].value = df
|
||||
sheet['A1'].options(pd.DataFrame, expand='table').value
|
||||
|
||||
|
||||
@xw.func
|
||||
@xw.arg('x', pd.DataFrame)
|
||||
def correl2(x):
|
||||
# x arrives as DataFrame
|
||||
return x.corr()
|
||||
@@ -0,0 +1,194 @@
|
||||
#!/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()
|
||||
@@ -0,0 +1,242 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import pathlib
|
||||
import subprocess
|
||||
import os
|
||||
import psycopg2
|
||||
from pathlib import Path
|
||||
|
||||
from sqlalchemy.engine import URL
|
||||
from sqlalchemy import create_engine
|
||||
import paramiko
|
||||
import datetime
|
||||
|
||||
|
||||
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 creer_chaine_connexion(p_utilisateur, p_pass, p_serveur, p_port,p_base):
|
||||
# return f"postgresql://{p_utilisateur}@{p_serveur}:{p_port}"
|
||||
url_geo = URL.create('postgresql+psycopg2',
|
||||
username = p_utilisateur,
|
||||
password = p_pass,
|
||||
host = p_serveur,
|
||||
port = p_port,
|
||||
database = p_base,
|
||||
)
|
||||
return create_engine(url_geo)
|
||||
|
||||
|
||||
def creer_base_de_donnee(p_base_a_creer, p_base_connexion, p_chaine_connexion):
|
||||
requete_SQL = f'CREATE DATABASE "{p_base_a_creer}" WITH OWNER logeproj'
|
||||
commande = [
|
||||
"psql",
|
||||
f"{p_chaine_connexion}/{p_base_connexion}",
|
||||
"-c",
|
||||
f"{requete_SQL}",
|
||||
]
|
||||
commande_run = subprocess.run(commande)
|
||||
code_retour = commande_run.returncode
|
||||
if code_retour != 0:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
def supprimer_base_de_donnee(p_base_a_supprimer, p_base_connexion, p_chaine_connexion):
|
||||
requete_SQL = f'DROP DATABASE "{p_base_a_supprimer}"'
|
||||
commande = [
|
||||
"psql",
|
||||
f"{p_chaine_connexion}/{p_base_connexion}",
|
||||
"-c",
|
||||
f"{requete_SQL}",
|
||||
]
|
||||
commande_run = subprocess.run(commande)
|
||||
code_retour = commande_run.returncode
|
||||
if code_retour != 0:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
def lister_bases_de_donnees(p_connexion):
|
||||
tableau_bases = []
|
||||
requete_SQL = "SELECT datname FROM pg_database WHERE datistemplate = false;"
|
||||
curseur = p_connexion
|
||||
curseur.execute(requete_SQL)
|
||||
for enregistrement in curseur:
|
||||
tableau_bases.append(enregistrement[0])
|
||||
return tableau_bases
|
||||
|
||||
|
||||
def restaurer_sauvegarde(
|
||||
p_chemin_sauvegarde, p_base, p_base_connexion, p_chaine_de_connexion
|
||||
):
|
||||
# connexion = psycopg2.connect(p_chaine_de_connexion)
|
||||
connexion = p_chaine_de_connexion
|
||||
if p_base in lister_bases_de_donnees(connexion):
|
||||
supprimer_base_de_donnee(p_base, p_base_connexion, p_chaine_de_connexion)
|
||||
creer_base_de_donnee(p_base, p_base_connexion, p_chaine_de_connexion)
|
||||
connexion.close()
|
||||
commande = [
|
||||
"pg_restore",
|
||||
"-d",
|
||||
f"{p_chaine_de_connexion}/{p_base}",
|
||||
p_chemin_sauvegarde,
|
||||
]
|
||||
commande_run = subprocess.run(commande)
|
||||
code_retour = commande_run.returncode
|
||||
if code_retour != 0:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
def restaurer_toutes_sauvegardes(
|
||||
p_chemin_sauvegarde, p_base_de_connexion, p_chaine_connexion
|
||||
):
|
||||
repertoire_des_sauvegardes = pathlib.Path(p_chemin_sauvegarde)
|
||||
for sauvegarde in repertoire_des_sauvegardes.glob("*-logeproj-centrale.custom"):
|
||||
sauvegarde.resolve()
|
||||
chemin = str(sauvegarde)
|
||||
fichier = sauvegarde.name
|
||||
fichier_split = fichier.split("-")
|
||||
base = f"{fichier_split[0]}-logeproj-test"
|
||||
restaurer_sauvegarde(chemin, base, p_base_de_connexion, p_chaine_connexion)
|
||||
|
||||
|
||||
def cherche_chemin_rep_sauvegardes_du_jour(p_connexion_sftp, p_rep_racine, p_date, p_format=None):
|
||||
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("-")
|
||||
|
||||
if len(rep_split) < 3 : continue
|
||||
if p_format is not None and rep.find(p_format) == -1: continue
|
||||
|
||||
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 clos_connexion_SFTP(p_connexion_SFTP):
|
||||
p_connexion_SFTP.close()
|
||||
|
||||
|
||||
def main():
|
||||
aujourdhui = datetime.date.today()
|
||||
chemin_rep_local_sauvegarde = "./"
|
||||
sftp_hote = "" # ftp myriadev
|
||||
sftp_port = ""
|
||||
sftp_utilisateur = ""
|
||||
sftp_mot_de_passe = ""
|
||||
sftp_rep_racine_sauvegardes = 'cen-isere'
|
||||
|
||||
repertoire_sauvegardes = "/cen-isere"
|
||||
serveur_postgresql = "XXXXXXXXX" # BDD CEN cible
|
||||
port_postgresql = "5432"
|
||||
utilisateur_postgresql = "XXXXXXXXX"
|
||||
mot_de_passe_postgresql = "XXXXXXXXX"
|
||||
base_de_connexion = "logeproj"
|
||||
|
||||
# Si le mot de passe de postgre est stocké dans une variable d'environnement, plus
|
||||
# besoin de le fournir par la suite
|
||||
os.environ["PGPASSWORD"] = mot_de_passe_postgresql
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
"-b", "--base",
|
||||
required=False,
|
||||
help="nom de la base à restaurer (si non fourni, le script restaure toutes les bases",
|
||||
)
|
||||
|
||||
|
||||
arguments = parser.parse_args()
|
||||
arguments.base = 'logeproj'
|
||||
|
||||
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,'gz'
|
||||
)
|
||||
|
||||
|
||||
# Télécharger la base fournie en argument au format custom
|
||||
chemin_sauvegarde_distante = chemin_rep_sauvegardes_du_jour
|
||||
chemin_sauvegarde_locale = (
|
||||
f"{chemin_rep_local_sauvegarde}"+chemin_rep_sauvegardes_du_jour.rsplit('/',1)[-1]
|
||||
)
|
||||
telecharge_un_fichier(
|
||||
chemin_sauvegarde_distante, chemin_sauvegarde_locale, connexion_sftp
|
||||
)
|
||||
|
||||
clos_connexion_SFTP(connexion_sftp)
|
||||
|
||||
chaine_de_connexion = creer_chaine_connexion(
|
||||
utilisateur_postgresql,mot_de_passe_postgresql, serveur_postgresql, port_postgresql,base_de_connexion
|
||||
)
|
||||
|
||||
if arguments.base is None:
|
||||
# Restaurer toutes les sauvegardes
|
||||
print(f'Restauration de toutes les sauvegardes')
|
||||
restaurer_toutes_sauvegardes(
|
||||
repertoire_sauvegardes, base_de_connexion, chaine_de_connexion
|
||||
)
|
||||
else:
|
||||
# Restaurer la base fournie en argument
|
||||
base=f'{arguments.base}'
|
||||
print(f'Restauration de {base}')
|
||||
fichier_sauvegarde = chemin_sauvegarde_locale
|
||||
path_sauvegarde = pathlib.Path(fichier_sauvegarde)
|
||||
restaurer_sauvegarde(
|
||||
p_chemin_sauvegarde = path_sauvegarde,
|
||||
p_base = base,
|
||||
p_base_connexion = base_de_connexion,
|
||||
p_chaine_de_connexion = chaine_de_connexion,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Binary file not shown.
Reference in New Issue
Block a user