def telecharger_fichiers_base(base, livraison='fondation', cache='cache'): # Vérification des paramètres base = base.upper() if base not in bases: raise NomBaseException() if livraison not in ['fondation','tout'] and \ not isinstance(livraison, datetime): livraison = datetime.strptime(livraison, '%Y%m%d-%H%M%S') # Télécharger les fichiers date_fond, dates_majo = telecharger_base(base, livraison, cache) # Télécharger les fichiers decompresser_base(base, date_fond, dates_majo, cache)
def decompresser_base(base, date_fond, dates_majo, cache='cache'): # Vérification des paramètres base = base.upper() if base not in bases: raise NomBaseException() if not isinstance(date_fond, datetime) or not isinstance(dates_majo, list): raise ValueError() for date in dates_majo: if not isinstance(date, datetime): raise ValueError() # Créer le répertoire rattaché à ce dump complet rep = os.path.join(cache, 'bases-xml', date_fond.strftime('%Y%m%d-%H%M%S')) Path(rep).mkdir_p() # Décompresser le dump complet date = date_fond.strftime('%Y%m%d-%H%M%S') if not os.path.exists(os.path.join(rep, 'fond-' + date)) or \ os.path.exists(os.path.join(rep, 'fond-' + date, 'erreur-tar')): if os.path.exists(os.path.join(rep, 'fond-' + date, 'erreur-tar')): shutil.rmtree(os.path.join(rep, 'fond-' + date)) Path(os.path.join(rep, 'fond-' + date)).mkdir_p() # Décompression - en cas d’arrêt le fichier 'erreur-tar' reste open(os.path.join(rep, 'fond-' + date, 'erreur-tar'), 'w').close() subprocess.call([ 'tar', 'xzf', os.path.join(cache, 'tar', base + '-fond-' + date + '.tar.gz'), '-C', os.path.join(rep, 'fond-' + date) ]) os.remove(os.path.join(rep, 'fond-' + date, 'erreur-tar')) shutil.move(os.path.join(rep, 'fond-' + date, 'legi'), os.path.join(cache, 'bases-xml', 'legi')) shutil.rmtree(os.path.join(rep, 'fond-' + date)) # Inscrire cette livraison dans la base de données try: entree_livraison = Livraison.get(Livraison.date == date_fond) except Livraison.DoesNotExist: entree_livraison = Livraison.create(date=date_fond, type='fondation', base=base, precedent=None, fondation=None) entree_livraison_fondation = entree_livraison # Décompresser les dumps incrémentaux for date_majo in dates_majo: date = date_majo.strftime('%Y%m%d-%H%M%S') if not os.path.exists(os.path.join(rep, 'majo-' + date)) or \ os.path.exists(os.path.join(rep, date)) or \ os.path.exists(os.path.join(rep, 'majo-' + date, 'erreur-tar')): if os.path.exists(os.path.join(rep, date)): shutil.rmtree(os.path.join(rep, date), True) shutil.rmtree(os.path.join(rep, 'majo-' + date), True) if os.path.exists(os.path.join(rep, 'majo-' + date, 'erreur-tar')): shutil.rmtree(os.path.join(rep, 'majo-' + date), True) Path(os.path.join(rep, date)).mkdir_p() # Décompression - en cas d’arrêt le fichier 'erreur-tar' reste open(os.path.join(rep, date, 'erreur-tar'), 'w').close() subprocess.call([ 'tar', 'xzf', os.path.join(cache, 'tar', base + '-majo-' + date + '.tar.gz'), '-C', rep ]) os.rename(os.path.join(rep, date), os.path.join(rep, 'majo-' + date)) os.remove(os.path.join(rep, 'majo-' + date, 'erreur-tar')) # Retrait des fichiers à supprimer if os.path.exists( os.path.join(rep, 'majo-' + date, 'liste_suppression_legi.dat')): f_liste = open( os.path.join(rep, 'majo-' + date, 'liste_suppression_legi.dat'), 'r') liste_fichiers_sup = f_liste.read().strip().split('\n') f_liste.close() for fichier_sup in liste_fichiers_sup: print('Retrait de ' + os.path.join(cache, 'bases-xml', fichier_sup.strip() + '.xml')) if os.path.exists( os.path.join(cache, 'bases-xml', fichier_sup.strip() + '.xml')): os.remove( os.path.join(cache, 'bases-xml', fichier_sup.strip() + '.xml')) else: print('Erreur') # Intégration des nouveaux fichiers dans l’arborescence existante fusionner(os.path.join(rep, 'majo-' + date, 'legi'), os.path.join(cache, 'bases-xml', 'legi')) shutil.rmtree(os.path.join(rep, 'majo-' + date)) # Inscrire cette livraison dans la base de données try: entree_livraison = Livraison.get(Livraison.date == date_majo) except Livraison.DoesNotExist: entree_livraison = Livraison.create( date=date_majo, type='miseajour', base=base, precedent=entree_livraison, fondation=entree_livraison_fondation) try: os.rmdir(rep) except OSError: pass
def telecharger_base(base, livraison='tout', cache='cache'): # Vérification des paramètres base = base.upper() if base not in bases: raise NomBaseException() if livraison not in ['fondation','tout'] and \ not isinstance(livraison, datetime): livraison = datetime.strptime(livraison, '%Y%m%d-%H%M%S') if serveurs[base][0] != 'ftp': raise NonImplementeException() # Créer le dossier de cache des fichiers téléchargés Path(os.path.join(cache, 'tar')).mkdir_p() # Connexion FTP serveur = serveurs[base][0] + ':' + \ '//' + serveurs[base][2] + ':' + serveurs[base][3] + \ '@' + serveurs[base][1] + serveurs[base][4] connexion_ftp = ftplib.FTP(serveurs[base][1], \ serveurs[base][2], \ serveurs[base][3]) # Reconnaître les dates des fichiers connexion_ftp.cwd(serveurs[base][4]) fichiers = connexion_ftp.nlst() date_fond = None dates_majo = [] for fichier in fichiers: # Si c’est un fichier de dump complet try: datetime.strptime(fichier, fichiers_fond[base]) if date_fond: raise FondationNonUniqueException() date_fond = datetime.strptime(fichier, fichiers_fond[base]) except ValueError: pass # Si c’est un fichier de dump incrémental try: dates_majo.append(datetime.strptime(fichier, fichiers_majo[base])) except ValueError: pass # Normaliser les paramètres relatifs aux dates dates_majo.sort() if not date_fond: raise FondationNonTrouveeException() if livraison == 'fondation': livraison = date_fond if livraison == 'tout': livraison = dates_majo[-1] dates_majo = [ date for date in dates_majo if date_fond <= date <= livraison ] # Téléchargement du dump complet telecharger_cache( serveur + date_fond.strftime(fichiers_fond[base]), os.path.join(cache, 'tar', base + date_fond.strftime('-fond-%Y%m%d-%H%M%S.tar.gz'))) # Téléchargement des dumps incrémentaux for date_majo in dates_majo: telecharger_cache( serveur + date_majo.strftime(fichiers_majo[base]), os.path.join( cache, 'tar', base + date_majo.strftime('-majo-%Y%m%d-%H%M%S.tar.gz'))) # Clôturer la connexion connexion_ftp.close() return date_fond, dates_majo
def decompresser_base(base, date_fond, dates_majo, cache='cache'): # Vérification des paramètres base = base.upper() if base not in bases: raise NomBaseException() if not isinstance(date_fond, datetime) or not isinstance(dates_majo, list): raise ValueError() for date in dates_majo: if not isinstance(date, datetime): raise ValueError() # Créer le répertoire rattaché à ce dump complet rep = os.path.join(cache, 'bases-xml', date_fond.strftime('%Y%m%d-%H%M%S')) path(rep).mkdir_p() # Décompresser le dump complet date = date_fond.strftime('%Y%m%d-%H%M%S') if not os.path.exists(os.path.join(rep, 'fond-' + date)) or \ os.path.exists(os.path.join(rep, 'fond-' + date, 'erreur-tar')): if os.path.exists(os.path.join(rep, 'fond-' + date, 'erreur-tar')): shutil.rmtree(os.path.join(rep, 'fond-' + date)) path(os.path.join(rep, 'fond-' + date)).mkdir_p() open(os.path.join(rep, 'fond-' + date, 'erreur-tar'), 'w').close() subprocess.call(['tar', 'xzf', os.path.join(cache, 'tar', base + '-fond-' + date + '.tar.gz'), '-C', os.path.join(rep, 'fond-' + date)]) os.remove(os.path.join(rep, 'fond-' + date, 'erreur-tar')) # Inscrire cette livraison dans la base de données try: entree_livraison = Livraison.get(Livraison.date == date_fond) except Livraison.DoesNotExist: entree_livraison = Livraison.create( date=date_fond, type='fondation', base=base, precedent=None, fondation=None ) entree_livraison_fondation = entree_livraison # Décompresser les dumps incrémentaux for date_majo in dates_majo: date = date_majo.strftime('%Y%m%d-%H%M%S') if not os.path.exists(os.path.join(rep, 'majo-' + date)) or \ os.path.exists(os.path.join(rep, date)) or \ os.path.exists(os.path.join(rep, 'majo-' + date, 'erreur-tar')): if os.path.exists(os.path.join(rep, date)): shutil.rmtree(os.path.join(rep, date), True) shutil.rmtree(os.path.join(rep, 'majo-' + date), True) if os.path.exists(os.path.join(rep, 'majo-' + date, 'erreur-tar')): shutil.rmtree(os.path.join(rep, 'majo-' + date), True) path(os.path.join(rep, date)).mkdir_p() open(os.path.join(rep, date, 'erreur-tar'), 'w').close() subprocess.call(['tar', 'xzf', os.path.join(cache, 'tar', base + '-majo-' + date + '.tar.gz'), '-C', rep]) os.rename(os.path.join(rep, date), os.path.join(rep, 'majo-' + date)) os.remove(os.path.join(rep, 'majo-' + date, 'erreur-tar')) # Inscrire cette livraison dans la base de données try: entree_livraison = Livraison.get(Livraison.date == date_majo) except Livraison.DoesNotExist: entree_livraison = Livraison.create( date=date_majo, type='miseajour', base=base, precedent=entree_livraison, fondation=entree_livraison_fondation )