Accueil » Python – Config Cleaner

Python – Config Cleaner

Récemment j’ai effectué une migration chez un client dans le Béarn.

Le but de cette migration était de changer leur cœur de réseau.

Jusqu’ici, rien de bien problématique pour un ingénieur réseau confirmé.


Suite à cette migration, le lendemain, le client me demande de reconfigurer un port-mirroring qui ne fonctionnait plus.

Aucun problème !

Sauf que son port-mirroring était constitué de plus de 800 interfaces vlans.

Ah !

Je me dis que je vais faire un copier-coller d’un show vlan et je vais pouvoir traiter les données avec notepad++.

Que nenni !

Les données sorties du show vlan étaient mal indenter, avec des espaces dans tous les sens.

C’est là que je me suis dit… Tiens, et si j’utilisais du Python.

Voila comment j’ai procédé

Dans un premier temps j’ai récupérer la liste des vlans pour effectuer mon template de configuration.

vlan 10
   vlan 20
vlan 30
  vlan 45
vlan 50
vlan 60
vlan 700
    vlan 800

PS : J’ai raccourci pour que ce soit lisible.

Le but étant d’avoir cette configuration à la fin

source vlan 10 both
source vlan 20 both
source vlan 30 both
source vlan 45 both
source vlan 50 both
source vlan 60 both
source vlan 700 both
source vlan 800 both

Pour obtenir ce résultat, je vais effectuer 3 actions :

  1. Nettoyer les espaces
  2. Ajouter le texte au début & à la fin de chaque ligne
  3. Sauvegarder le tout dans un fichier

Nettoyage des espaces


Un fois récupéré en CLI, je copie/colle mes données dans mon IDE (integrated development environment)Visual Studio Code.

Je créé ensuite un fichier, que j’appelle cleaner.py.

Il servira de script python pour nettoyer mes données.

Dans un premier temps je vais importer mes données dans cleaner.py

data = "SiteWeb/data.txt"
with open(data, "r") as f:
    for i in f:
        a = i.strip()
        print(a)

Dans les deux premières lignes, je fais définir le chemin des données, puis importer ces données dans mon fichier python.

  • Définir le chemin de mes données (data = « Chemin Relatif »)
  • With open(data, « r ») as f:
    • Ouvrir le fichier définit dans le chemin data
    • L’ouvrir en tant que r, Read-only
    • Stocker le contenu de ce fichier dans la variable f

Dans les 3 dernières lignes, je vais effectuer une action pour chaque ligne dans le fichier.

On pourrait le lire ainsi. Pour chaque ligne (i) dans le fichier (f), je nettoie (strip) la ligne des caractères (strip(), soit les espaces), et je stocke cela dans a. Ensuite j’affiche a.

Une fois fini, je passe à la ligne suivante.

Quand toutes les lignes sont passé dans la moulinette, j’arrête le script.

  • For i in f: Pour chaque ligne dans f
  • a = i.strip() : Je supprime les espaces
  • print(a) : j’affiche

Le résultat :

vlan 10
vlan 20
vlan 30
vlan 45
vlan 50
vlan 60
vlan 700
vlan 800

Youpi ! Mon texte est nettoyé. Il faut maintenant que j’ajoute un morceau au début et à la fin de chaque ligne.

Ajout de texte


Pour rappel on doit avoir cette finalité à chaque ligne.

source vlan 10 both

On note 3 parties :

  • Avant : source
  • Milieu : la valeur de la variable a (ce qui fait le print dans la partie précédente)
  • Après : both

On va faire simple !

Vu que j’ai déjà réussi à faire un print des vlans, il ne me suffit qu’à faire un print avant et un print après.

En gros, afficher « source »; afficher la valeur de « a », afficher « both »

Rien de plus simple

data = "SiteWeb/data.txt"
with open(data, "r") as f:
    for i in f:
        a = i.strip()
        print(f"source {a} both")

J’ai modifié mon code précédent. Je ne souhaite plus afficher que la valeur de « a », je veux afficher d’autre choses.

print(f"source {a} both")

affiche source, puis la variable a, puis both.

C’est quoi le f ?

En faite, dans mon print je mixe des données sous forme de texte (string, str) et des données sous forme de variable (a).

Si je veux faire ça, je dois utiliser des f-string (Qu’à partir de python 3.6)

C’est pour cela que je met le f, puis mon expression avec ma variable entre {}.

Le résultat

source vlan 10 both
source vlan 20 both
source vlan 30 both
source vlan 45 both
source vlan 50 both
source vlan 60 both
source vlan 700 both
source vlan 800 both

Yes !

En soi, je pourrais faire un copier/coller sans nécessairement faire un export dans un fichier. Dans le cas présenter c’est faisable, mais avec 800 lignes c’est moins pratique !

En plus, on touche le but !

Export dans un fichier


Nous y sommes. Comment copier chaque ligne dans un fichier texte ?

On va simplement ouvrir un fichier non créé et dire que pour chaque itération on écrit dans ce fichier.

data = "SiteWeb/data.txt"
destination = "SiteWeb/destination.txt"
with open(data, "r") as f:
    with open(destination, "w") as g:
        for i in f:
         a = i.strip()
         result = f"source {a} both\n"
         g.write(result)

ligne 2 : Je définit un nouveau fichier destination, avec son chemin relatif.

ligne 4 : J’ouvre mon fichier destination, en tant que write (« w »), et j’utilise comme variable g.

La suite peut se lire ainsi :

  • Pour chaque ligne dans le fichier source (ligne 5)
  • Je nettoie les espaces (ligne 6)
  • J’écris « source valeurdea both » et je fais un saut à la ligne (\n) (ligne7)
  • J’écris dans le fichier destination le résultat de mon itération.

Voici mon IDE avant d’avoir lancer le code

Voici mon IDE après d’avoir lancer le code


La différence ?


J’ai un fichier destination.txt qui est apparu !

Voici mon code final :

data = "SiteWeb/data.txt"
destination = "SiteWeb/destination.txt"
with open(data, "r") as f:
    with open(destination, "w") as g:
        for i in f:
         a = i.strip()
         result = f"source {a} both\n"
         g.write(result)

Conclusion


Grâce à un petit morceau de python8 lignes seulement, on peut s’affranchir de tâche répétitives.

Dans le cas présenter, nous nous attardons sur la nécessité de reconfigurer un équipement réseau. Mais la logique s’applique dans d’autres domaines comme pour le nettoyage de document Excel, le inventaire des commerçants…

NB :

  • Les informations ont volontairement été modifié pour garantir la sécurité de données du client. L’idée de base étant la même, à savoir récupérer des données, les nettoyer pour les réutiliser.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut