UIN
******
Niveau : Bachelor 4 Telecoms Module : Routage et Commutation Enseignant : ALMOU Bassirou
Objectif : Programmation Système/Réseaux avec Python
Exercice 1
Etape 1 : configuration du service SSH sur chaque routeur
conf t
line vty 0 4
login local
password ben
transport input ssh telnet
exit
ip domain-name benad
hostname tessaoua
username ben password ben
enable password ben
crypto key gener rsa gener modul 1024
int f0/0
no sh
ip add [Link] [Link]
do write
Etape 2 : script Python avec le module netmiko
from netmiko import ConnectHandler as CH
class Configurer:
def __init__(self,h:int):
self.h=h
[Link] = {
'device_type':'cisco_ios',
'host':'192.168.1.'+str(self.h),
'username':'ben',
'password':'ben',
'secret':'ben',
}
[Link] = None
[Link]=CH(**[Link])
def configurer(self):
commands = [
'line consol aux',
'login local',
'password ben',
'exit',
'hostname benadom',
'line console 0',
'login local',
'password ben',
'do wr',
'end'
]
[Link]()
[Link].send_config_set(commands)
[Link]()
return f"Configuration effectuee sur 192.168.1.{self.h}"
for h in (17,18,20):
C = Configurer(h)
[Link]()
Exercice
from netmiko import ConnectHandler as CH
class Acces:
def __init__(self,h):
self.h=h
def acces(self):
[Link] = {
'device_type':'cisco_ios','username':'uin',
'password':'uin',
'host':'172.16.16.'+str(self.h),'secret':'uin',
}
[Link]=CH(**[Link])
return [Link]
def configuration(self):
con=[Link]()
[Link]()
V=['clientelle','compta','finance','RH','IT','securite','vente',
'production','marketing','partenariat']
for v in V:
con.send_config_set([f'vlan {[Link](v)+2}',f'name {v}','exit'])
con.send_config_set(['int r e0/0 - 1','no sh','swicthport tr encapsul
dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
if self.h in (2,3):
con.send_config_set(['int r e0/2 - 3','no sh','swicthport tr encapsul
dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
con.send_config_set(['do write','end'])
for h in range(1,7):
print(f'[+] switch {h}')
A = Acces(h)
[Link]()
Exercice 1
Etape 1 : Adressage IP de VLAN 1 de chaque Switch et configuration d
conf t
int vlan 1
no shutdown
ip address 172.16.16.x [Link]
exit
username epn password epn
service password-encryption
enable password enp
secret password epn24
line vty 0 4
password epn
login local
transport input ssh
exit
ip domain-name EPN
crypto key generat rsa general modul 1024
do write
Etape 2 : Ecrire le script Python de configuration des switch, exécutable depuis la machine cliente. Ce script utilise le
module netmiko
Objectif : Vérifier la configuration SSH de chaque switch
from netmiko import ConnectHandler as H
r='172.16.16.'
for h in range(2,7):
cn={
'type_device':'cisco_ios',
'host':r+str(h),
'username':'epn',
'password':'epn',
'secret':'epn24',
'verbose':True,
}
cnS=H(**cn)
result=cnS.send_command('show run | section ssh')
print(result)
[Link]()
Exercice 2-
from netmiko import ConnectHandler as H
r='172.16.16.'
for h in range(2,7):
cn={
'type_device':'cisco_ios',
'host':r+str(h),
'username':'epn',
'password':'epn',
'secret':'epn24',
'verbose':True,
}
cnS=H(**cn)
[Link]()
for i in range(2,111):
result=cnS.send_config_set('vlan %d' %i)
print(result)
[Link]()
Exercice 3: configuration des consoles
from netmiko import ConnectHandler as H
r='172.16.16.'
for h in range(2,7):
cn={
'type_device':'cisco_ios',
'host':r+str(h),
'username':'epn',
'password':'epn',
'secret':'epn24',
'verbose':True,
}
cnS=H(**cn)
[Link]()
print(cnS.send_config_set(['line cons 0','login local','password epn','line aux
0','login local','password epn','do wr']))
[Link]()
exercice 4: config a partir du fichier
from netmiko import ConnectHandler as H
r='172.16.16.'
for h in range(2,7):
cn={
'type_device':'cisco_ios',
'host':r+str(h),
'username':'epn',
'password':'epn',
'secret':'epn24',
'verbose':True,
}
cnS=H(**cn)
[Link]()
cnS.send_config_from_file('[Link]')
[Link]()
TD 2
[Link] :
int range e0/0 - 1
no sh
channel-group 1 mode on
int range e0/2 - 3
no sh
channel-group 2 mode on
int range e1/0 - 1
no sh
channel-group 3 mode on
int range po1 , po2 , po3 , e1/2 - 3 , e2/0
switchport encapsul dot1q
switchport mode trunk
switchport tr allowed vlan add 2-7
do write
[Link]
int range e0/0 - 1
no shut
switchport encapsul dot1q
switchport mode trunk
switchport tr allowed vlan add 2-7
do write
Travail demandé
1. Ecrire un script Python qui permet de.
a. Configurer la sécurité des consoles
b. Configurer le protocole VTP sur les switches 2 et 3
c. Configurer le trunc
d. Configurer le protocole LACP
from netmiko import ConnectHandler as H
r='192.168.1.'
for h in range(2,9):
cn={
'type_device':'cisco_ios',
'host':r+str(h),
'username':'epn',
'password':'epn',
'secret':'epn24',
'verbose':True,
}
cnS=H(**cn)
[Link]()
for i in range(2,7):
cnS.send_config_set('vlan %d' % i)
if h in [2,3,4,5]:
cnS.send_config_from_file('[Link]')
else:
cnS.send_config_from_file('[Link]')
[Link]()
Autre façon : Programmation fonctionnelle
from netmiko import ConnectHandler as H
def programmer(a,f):
cn={
'type_device':'cisco_ios',
'host':a,
'username':'epn',
'password':'epn',
'secret':'epn24',
'verbose':True,
}
cnS=H(**cn)
[Link]()
for i in range(2,7):
cnS.send_config_set('vlan %d' % i)
cnS.send_config_from_file(f)
[Link]()
Autre façon : utilisation de parametres
from netmiko import ConnectHandler as H
def programmer(a,u,p,s,f):
cn={
'type_device':'cisco_ios',
'host':a,
'username':u,
'password':p,
'secret':s,
'verbose':True,
}
cnS=H(**cn)
[Link]()
for i in range(2,7):
cnS.send_config_set('vlan %d' % i)
cnS.send_config_from_file(f)
[Link]()
Exercice
from netmiko import ConnectHandler as CH
class Acces:
def __init__(self,h):
self.h=h
def acces(self):
[Link] = {
'device_type':'cisco_ios','username':'uin','password':'uin',
'host':'10.0.0.'+str(self.h),'secret':'uin',}
[Link]=CH(**[Link])
return [Link]
def configuration(self):
con=[Link]()
[Link]()
V=['clientelle','compta','finance','RH','IT','securite','vente','produc-
tion','marketing','partenariat']
for v in V:
con.send_config_set([f'vlan {[Link](v)+2}',f'name {v}','exit'])
if self.h in range(1,5):
interface=(((0,0),1,1),((0,2),3,2),((1,0),1,3))
for i in interface:
con.send_config_set([f' int range e{i[0][0]}/{i[0][1]} -
{i[1]}','no sh',
f'channel-group {i[2]}','switchport mode tr','switchport tr allow
vlan add 1-11'])
con.send_config_set([' int range po1 , po2 , po3 , e1/2 - 3','no sh',
'switchport tr encapsul dot1q','switchport mode tr','switchport tr al-
low vlan add 1-11'])
if self.h in range(5,9):
con.send_config_set(['int range e0/0 - 1','no sh','switchport tr encap-
sul dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
con.send_config_set(['int range e0/2 - 3','no sh','switchport mode ac-
cess'])
if self.h in (9,10):
con.send_config_from_file('[Link]')
con.send_config_set(['do write','end'])
[Link]()
for h in range(1,9):
print(f'[+] switch {h}')
Acces(h).configuration()
Exercice
11
10
1 2
3
7
6
from netmiko import ConnectHandler as CH
class Acces:
def __init__(self,h):
self.h=h
def acces(self):
[Link] = {
'device_type':'cisco_ios','username':'uin','password':'uin',
'host':'10.0.0.'+str(self.h),'secret':'uin',}
[Link]=CH(**[Link])
return [Link]
def configuration(self):
con=[Link]()
[Link]()
V=['clientelle','compta','finance','RH','IT','securite','vente',
'production','marketing','partenariat']
for v in V:
con.send_config_set([f'vlan {[Link](v)+2}',f'name {v}','exit'])
if self.h in range(1,4):
con.send_config_set(['int r e0/0 - 3 , e1/0','no sh','switchport tr en-
capsul dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
elif self.h in (5,6):
con.send_config_set(['int r e0/0 - 2','no sh','switchport tr encapsul
dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
elif self.h in (4,7) :
con.send_config_set(['int r e0/0 - 1','no sh','switchport tr encapsul
dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
else:
con.send_config_set(['router ospf 1','network [Link] [Link]
area 0'])
if self.h in range(8,11):
con.send_config_set(['router ospf 1','redistribut connected'])
con.send_config_set(['do write','end'])
[Link]()
for h in range(1,12):
print(f'[+] switch {h}')
Acces(h).configuration()
Exercice 6
e0/0 -1
e0/0 -1
e0/2 -3 e1/0 -1 e0/2 -3
e0/2 -3 e1/0 -1
e0/2 -3
e0/0 -1
e2/0 e2/0 e1/2 e0/0 -1
e1/2 e1/3 e1/3
e1/2 e2/0 e2/0 e1/2
e1/3 e1/3
e0/0 e0/1
e0/0 e0/1
e0/2 e0/1
e0/1
e0/0 e0/0 e0/1
e0/3 e0/0
e0/2
Travail demandé :
Etape 1:
- Assigner l’adresse IP au VLAN de chaque switch
- Configurer le service SSH
conf t
int vlan 1
no shutdown
ip address 192.168.1.x [Link]
exit
username ben password ben
service password-encryption
enable password ben
line vty 0 4
password ben
login local
transport input ssh
exit
ip domain-name [Link]
crypto key generat rsa general modul 1024
do write
Etape 2:
Configurer les switchs
- Configurer 12 VLAN
- Le protocole LACP
- Trunk des ports
import schedule as Sh, time
from netmiko import ConnectHandler as Ch
class configurer:
def __init__(self,h:int,u:str,p:str):
self.h,self.u,self.p=h,u,p
[Link]='192.168.1.'+str(self.h)
def connecter(self):
cn = {
'device_type':'cisco_ios',
'host':[Link],
'username':self.u,
'password':self.p,
'verbose':True,
}
con = Ch(**cn)
[Link]()
return con
class automatiser(configurer):
def configNoeud(self):
con=[Link]()
#-------------Creation de VLANs
VLAN = ['marketing','compta','finance','clientelle','informatique','secu-
rite',
'production','partenariat','fournisseur','logistique','mainte-
nance','juridique']
for v in VLAN:
con.send_config_set([f'vlan {[Link](v)}+2',f'name {v}','exit'])
if self.h in (2,3,4,5,9,10,11,12):
iface=(((0,0)1),((0,2),3),((1,0),1))
for i in iface:
con.send_config_set([f"int range e{i[0][0]}/{i[0][1]} - {i[1]}","no
shut",f"channel-group {[Link](i)+1}"])
con.send_config_set(["int range po1, po2 , po3","switchport trunk en-
capsul dot1q",
"switchport mode trunk","switchport trunk allow
vlan add 2-13","do write","end"])
if self.h in (6, 7,8,13,14):
con.send_command(['int range e0/0 - 1','no sh','switchport trunk encap-
sul dot1q',
'switchport mode trunk','switchport trunk allow vlan
add 2-13','do write','end'])
#-----------Appel de la conf
def executer():
for h in (2,15):
A=automatiser(h,'ben','ben')
[Link]()
Exercice 7
Etape 1 : Configuration du serveur SSH sur chaque switch, tout en remplaçant la valeur de X par le numero en couleur
rouge de chaque nœud
conf t
line vty 0 4
transport input SSH
login local
password ben
exit
hostname SWX
ip domain-name [Link]
username ben password ben
enable password ben
crypto key gener rsa gener modul 1024
int vlan 1
no sh
ip add 172.16.16.X [Link]
do wr
Etape 2 : script Python pour configurer chaque nœud
from netmiko import ConnectHandler as Ch
class configurer:
def __init__(self,h:int,u:str,p:str):
self.h,self.u,self.p=h,u,p
[Link]='172.16.16.'+str(self.h)
def connecter(self):
cn = {
'device_type':'cisco_ios',
'host':[Link],
'username':self.u,
'password':self.p,
'secret':self.p,
}
con = Ch(**cn)
return [Link]()
def automatiser(self,con):
L = ['comptabilite','rh','it','marketing']
if self.h in (12,13):
con.send_config_from_file("[Link]")
elif self.h in (10,11):
for v in L:
con.send_config_set([f"vlan {[Link](v)}+2",f"name \ {v}","exit"])
con.send_config_from_file("[Link]")
else:
for v in L:
con.send_config_set([f"vlan {[Link](v)}+2",f"name {v}","exit"])
con.send_config_from_file("[Link]")
if self.h in (4,5,8,9):
con.send_config_set(["int range e1/2 - 3","no shut","switchport mode
access","do write","end"])
elif self.h in (2,3,6,7):
con.send_config_set(["int range e1/2 - 3 , e2/0 - 1","no shut","switch-
port trunk encapsul dot1q",\
"switchport mode trunk","switchport trunk allow
vlan add 2-5","do write","end"])
[Link]()
#-----------Appel de la fonction
for h in range(2,14):
C = configurer(h,'ben','ben')
con=[Link]()
[Link](con)
Etape 3 : contenu des fichiers [Link], [Link] et [Link]
[Link]
int f0/0
no sh
no ip add
int f0/0.1
glbp 1 preempt
glbp 1 priority 150
glbp 1 ip [Link]
int f0/0.2
glbp 2 preempt
glbp 2 priority 150
glbp 2 ip [Link]
int f2/0
no sh
no ip add
int f2/0.1
glbp 3 preempt
glbp 3 priority 150
glbp 3 ip [Link]
int f2/0.2
glbp 4 preempt
glbp 4 priority 150
glbp 4 ip [Link]
do write
end
[Link]
int range e0/2 - 3
no shut
channel-group 1 mode on
int range e0/0 - 1, e1/0 - 3 , po1
no sh
switchport trunk encapsul dot1q
switchport mode trunk
switchport trunk allowed vlan add 2-5
do write
end
[Link]
int range e0/0 - 1
no sh
channel-group 1 mode on
int range e0/2 - 3
no sh
channel-group 2 mode on
int range e1/0 - 1
no sh
channel-group 3 mode on
int range po1 , po2 , po3
switchport trunk encapsul dot1q
switchport mode trunk
switchport trunk allowed vlan add 2-5
do write
end
Exercice
from netmiko import ConnectHandler as CH
class Acces:
def __init__(self,h):
self.h=h
def acces(self):
[Link] = {
'device_type':'cisco_ios','username':'uin','password':'uin',
'host':'192.168.1.'+str(self.h),'secret':'uin',}
[Link]=CH(**[Link])
return [Link]
def configuration(self):
con=[Link]()
[Link]()
V=['clientelle','compta','finance','RH','IT','securite','vente','produc-
tion','marketing','partenariat']
for v in V:
con.send_config_set([f'vlan {[Link](v)+2}',f'name {v}','exit'])
interface=(((0,0),1,1),((0,2),3,2),((1,0),1,3))
for i in interface:
con.send_config_set([f' int range e{i[0][0]}/{i[0][1]} - {i[1]}','no
sh',
f'channel-group {i[2]}','switchport mode tr','switchport tr allow vlan
add 1-11'])
con.send_config_set([' int range po1 , po2 , po3','no sh','switchport
tr encapsul dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
if self.h in range(1,13):
con.send_config_set(['int range e1/2 - 3','no sh','switchport tr encap-
sul dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
con.send_config_set(['do write','end'])
[Link]()
for h in range(1,25):
print(f'[+] switch {h}')
Acces(h).configuration()
Exercice
from netmiko import ConnectHandler as CH
class Acces:
def __init__(self,h):
self.h=h
def acces(self):
[Link] = {
'device_type':'cisco_ios','username':'uin','password':'uin',
'host':'172.16.1.'+str(self.h),'secret':'uin',}
[Link]=CH(**[Link])
return [Link]
def configuration(self):
con=[Link]()
[Link]()
V=['clientelle','compta','finance','RH','IT','securite',
'vente','production','marketing','partenariat']
for v in V:
con.send_config_set([f'vlan {[Link](v)+2}',f'name {v}','exit'])
interface=(((0,0),1,1),((0,2),3,2),((1,0),1,3))
for i in interface:
con.send_config_set([f' int range e{i[0][0]}/{i[0][1]} - {i[1]}','no
sh',
f'channel-group {i[2]}','switchport mode tr','switchport tr allow vlan
add 1-11'])
con.send_config_set([' int range po1 , po2 , po3 , e1/2 - 3','no
sh','switchport tr encapsul dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
if self.h in (3,4):
con.send_config_set(['int range e2/0 - 1','no sh','switchport tr encap-
sul dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
con.send_config_set(['do write','end'])
[Link]()
for h in range(1,13):
print(f'[+] switch {h}')
Acces(h).configuration()
Exercice
from netmiko import ConnectHandler as CH
class Acces:
def __init__(self,h):
self.h=h
def acces(self):
[Link] = {
'device_type':'cisco_ios','username':'uin','password':'uin',
'host':'172.16.1.'+str(self.h),'secret':'uin',}
[Link]=CH(**[Link])
return [Link]
def configuration(self):
con=[Link]()
[Link]()
V=['clientelle','compta','finance','RH','IT','securite',
'vente','production','marketing','partenariat']
for v in V:
con.send_config_set([f'vlan {[Link](v)+2}',f'name {v}','exit'])
interface=(((0,0),1,1),((0,2),3,2),((1,0),1,3))
for i in interface:
con.send_config_set([f' int range e{i[0][0]}/{i[0][1]} - {i[1]}','no
sh',
f'channel-group {i[2]}','switchport mode tr','switchport tr allow vlan
add 1-11'])
con.send_config_set([' int range po1 , po2 , po3 , e1/2 - 3','no
sh','switchport tr encapsul dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
if self.h in (3,4,15,16):
con.send_config_set(['int range e2/0 - 1','no sh','switchport tr encap-
sul dot1q',
'switchport mode tr','switchport tr allow vlan add 1-11'])
con.send_config_set(['do write','end'])
[Link]()
for h in range(1,20):
print(f'[+] switch {h}')
Acces(h).configuration()
Exercice 8
e2/0
e1/2
e1/3 e1/3
e1/2
e1/2
e1/3
e2/0
Travail demandé :
1. Ecrire un script qui configure les switches de la topologie ci-dessus
import schedule as Sh, time
from netmiko import ConnectHandler as Ch
class configurer:
def __init__(self,h:int,u:str,p:str):
self.h,self.u,self.p=h,u,p
[Link]='10.16.0.'+str(self.h)
def connecter(self):
cn = {
'device_type':'cisco_ios',
'host':[Link],
'username':self.u,
'password':self.p,
'verbose':True,
}
con = Ch(**cn)
[Link]()
return con
class automatiser(configurer):
def automat(self):
con=[Link]()
if self.h in (5, 8,11,14):
con.send_command(['int range e1/2 - 3 , e2/0','no sh','switchport
trunk encapsul dot1q','switchport mode trunk','switchport trunk allow vlan add 2-
13'])
VLAN = ['marketing','compta','finance','clientelle','informatique','secu-
rite','production','partenariat','fournisseur','logistique','maintenance','juri-
dique']
for v in VLAN:
con.send_config_set([f'vlan {[Link](v)}+2',f'name {v}','exit'])
iface=(((0,0)1),((0,2),3),((1,0),1))
for i in iface:
con.send_config_set([f"int range e{i[0][0]}/{i[0][1]} - {i[1]}","no
shut",f"channel-group {[Link](i)+1}"])
con.send_config_set(["int range po1, po2 , po3","switchport trunk encap-
sul dot1q","switchport mode trunk","switchport trunk allow vlan add 2-13","do
write","end"])
#-----------Appel
def executer():
for h in (2,18):
A=automatiser(h,'ben','ben')
[Link]()
2. Ecrire un script qui permet de faire le backup de la configuration de chaque switch dans un fichier diffèrent.
Planifier l’exécution du script chaque jour à 22h30
class sauvegarder(configurer):
def backup(self):
con=[Link]()
with open(f"{[Link]}.txt","w") as f:
[Link](con.send_command("show running-config"))
def plannifier():
for h in (2,18):
A=sauvegarder(h,'ben','ben')
[Link]()
[Link]().[Link]("22:30").do(plannifier)
while True:
Sh.run_pending()
[Link](1)
Exercice :
1. Ecrire un script qui redémarre chaque serveur linux, et ce, chaque dimanche à 23h30
import schedule as Sh, time
from netmiko import ConnectHandler as Ch
class configurer:
def __init__(self,h:int,u:str,p:str):
self.h,self.u,self.p=h,u,p
[Link]='172.16.16.'+str(self.h)
def connecter(self):
cn = {
'device_type':'linux',
'host':[Link],
'username':self.u,
'password':self.p,
}
con = Ch(**cn)
return con
def redemarrer(self,con):
print(f"Le serveur {[Link]} va redemarrer dans 5 minutes")
con.send_command("shutdown -r +5")
#----plannier l'execution du script chaque dimanche a 23h30
def plannifier():
for h in (5,6,10):
C=configurer(h,'ben','ben')
con=[Link]()
[Link](con)
[Link]().[Link]("23:30").do(plannifier)
while True:
Sh.run_pending()
[Link](1)
2. Audit système (quelques commandes)
Etape 1 : Envoyer le fichier [Link] dans le dossier /bin de chaque serveur. Voici le code de [Link] :
#!/bin/bash
rapport(){
echo "=== $(date +'%d-%m-%Y %H:%M') ==="
echo "CPU: $(top -bn1 | grep load | awk '{printf "%.2f\n", $(NF-2)}')"
echo "Memory: $(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2}')"
echo "Disk: $(df -h | awk '$NF=="/"{printf "%s", $5}')"
echo "Dix consommateurs de RAM: $(ps aux --sort=-%mem | head -10)"
}
rapport
exit 0
Etape 2 : Une fois le fichier [Link] est envoyé sur chaque serveur, il faut ensuite le rendre executable.
chmod +x [Link]
Etape 3 : Ecriture du script Python avec planification d’exécution à 21h30 chaque jour
import schedule as Sh, time
from netmiko import ConnectHandler as Ch
class configurer:
def __init__(self,h:int,u:str,p:str):
self.h,self.u,self.p=h,u,p
[Link]='192.168.56.'+str(self.h)
def connecter(self):
cn = {
'device_type':'linux',
'host':[Link],
'username':self.u,
'password':self.p,
'verbose':True,
}
con = Ch(**cn)
[Link]()
return con
def auditer(self,con):
print(f"Audit du serveur {[Link]}")
con.send_command("bash /bin/[Link] >./[Link]")
[Link]()
def plannifier():
for h in (5,6,10):
C=configurer(h,'ben','ben')
con=[Link]()
[Link](con)
[Link]().[Link]("21:30").do(plannifier)
while True:
Sh.run_pending()
[Link](1)
Exercice
Adresse BDD Structure de la table
172.16.16. vente commande(id int primary key auti_increment,jour date default curdate()) ,total int(7) not null)
1 Lignecommande(id,
172.16.16.
2
172.16.32.
1
172.16.32.
2
172.16.48.
1
172.16.48.
2
172.16.64.
1
172.16.64.
2