0% found this document useful (0 votes)
11 views29 pages

Python Configuration for Cisco Switches

python_network_automation python_network_automation python_network_automation python_network_automation
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views29 pages

Python Configuration for Cisco Switches

python_network_automation python_network_automation python_network_automation python_network_automation
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

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

You might also like