Пример #1
0
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)
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
                )