0% ont trouvé ce document utile (0 vote)
34 vues171 pages

Python Networking

Ce document présente des instructions pour l'installation et l'utilisation de Python, ainsi que des exemples de code pour diverses opérations. Il couvre des sujets tels que l'importation de modules, le formatage de chaînes, les listes, les tuples et les dictionnaires. Des exercices pratiques sont également inclus pour renforcer la compréhension des concepts abordés.

Transféré par

Hadad Moussa Malan
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
34 vues171 pages

Python Networking

Ce document présente des instructions pour l'installation et l'utilisation de Python, ainsi que des exemples de code pour diverses opérations. Il couvre des sujets tels que l'importation de modules, le formatage de chaînes, les listes, les tuples et les dictionnaires. Des exercices pratiques sont également inclus pour renforcer la compréhension des concepts abordés.

Transféré par

Hadad Moussa Malan
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 171

UIN

Niveau Bachelor 4 Module : Routage et Commutation Enseignant : ALMOU Bassirou.

Activité 3 : Utilisation de Python pour configurer/automatiser les taches

Installation de package selon la version de python déjà installée

Sous Linux
python2 -m pip install Package # default Python 2
python2.7 -m pip install Package # specifically Python 2.7
python3 -m pip install Package # default Python 3
python3.4 -m pip install Package # specifically Python 3.4
python3 -m pip install -U Package

sous Windows
py -2 -m pip install Package # default Python 2
py -2.7 -m pip install Package # specifically Python 2.7
py -3 -m pip install Package # default Python 3
py -3.4 -m pip install Package # specifically Python 3.4
python -m pip install -U Package
Remarque:
Pour certains packages scientifiques, consulter:
https://packaging.python.org/en/latest/science/

Présentation de python
Python est un langage interprété. Chaque ligne lue est exécutée sans avoir besoin d’un compilateur. Il est un langage
modulaire. L’un des 3 premiers langages de programmation. Utilisé dans divers domaines tels que :
- La météo, la cartographie
- Les réseaux informatique/ télécoms {Admiration, sécurité, audit, hacking}
- administration des bases de données {Oracle, MySQl, PostgreSQL, MongoDB, SQL Server, Cassandra, …}
- Analyse et visualisation de donnees, Machine learning, ….
Téléchargement : www.python.org/downloads
docs.python.org
Les IDE python :
- IDLE
- Pycharm
- wing IDE Personal
- Sublime text3
- Atom
- Vs code
- Vim / neovim
Installation de python sous Linux : sudo apt-get install python3
Installation de pip : sudo apt-get install python3-pip
Importation du module
from unModule import uneFonction[, uneAutreFonction,…] Importer une ou plusieurs fonctions
from unModule import * Importer toutes les fonctions
 Import module Importer le module en entier
from unModule import uneFonction as fc Alias d’une fonction importée
Sous linux il faut préciser le chemin ou se trouve python, même chose que le bash
# !/usr/bin/en python

print('Presentez vous s\'il vous plait')


nom=input('Quel est votre nom ? ')
langage=input('Quel est votre langage de programmation prefere ? ')
if langage=='Python':
print('Bienvenue dans la famille')
else:
print(nom, “qu'est-ce que vous attendez ?. Rejoignez la famille Python“)
chaine de caracteres
Donner le role des methodes suivantes.
i='Universite'
j='2'
i.capitalize()
i.upper()
i.lower()
i.center()
i.rjust()
i.count()
i.encode('ascii')
i.encode('utf-8')
i.join('-')
i.endswith('e')
i.startswith('U')
i.count('v')
j.isalnum()
j.isdecimal()
i.isascii()
j.isdigit()
i.index('s')
i.lstrip()
j.isnumeric()
i.rsplit()
i.isspace()
i.title()

Formatage :
age=25
nom='Ousmane'
prenom='Hadi'
print('{} {} a {} ans '.format(nom,prenom,age))
print(nom, prenom, 'a' , age, 'ans')
print(f'{nom} {prenom} a{age} ans')

Long text
exemple :
print("je suis nigerien , je suis etudiant \
a l'Ecole Superieure des Telecommunication ")

Erreur Correction
print(‘c:\niger\niamey’) print(‘c:\\niger\\niamey’)
print(‘je m’en vais’) print(‘je m\’en vais’)

Exécution d’un script python (sous Linux)


a. Rendre le fichier exécutable : chmod u+x fichier.py
b. Exécution : python fichier.py ou ./ fichier.py
# Commenter une ligne
‘’’ Commenter un paragraphe ‘’’
Les mots réservés

And del from None lambda


As elif global local with
Assert else if not yield
Break except import or
Class False in pass
Continue finally is Try
Def for True while
Quelques fonctions mathématiques
abs(number) Retourne la valeur absolue d’un nombre
cmath.sqrt(number) Retourne la racine d’un nombre négatif
float(object) Convertit un nombre ou une chaine de caractères en nombre flottant
input(prompt) Demande à l’utilisateur d’entrer une valeur
int(object) Convertit un nombre en entier
long(object) Convertit un nombre en entier long
str(object) Convertit une valeur en chaine de caractères
round(number[, ndigits]) Arrondir un nombre a n chiffres après la virgule
math.sqrt(number) Retourne la racine carrée d’un nombre positif

Les opérateurs arithmétiques : +, -, *, /, %, **, //


Exemple :
print("5+2=",5+2)
print("5-2=",5-2)
print("5*2=",5*2)
print("5/2=",5/2)
print("5**2=",5**2)
print("5//2=",5//2)
print("1+2-3*2="1+2-3*2)
print("(1+2-3)*2="(1+2-3)*2)
print('\n'*3)
print((2+3j)*(1-5j)/2j)

Appel du module __future__ qui contient la fonction division


from __future__ import division
>>> 5/8
Affectation
x=2 x=y=z=14 nom=input(‘Entrer le nom’) e=’PATRIOTISME’
print(‘Votre nom est %s’ %) *x,z=e
x+=z x,y,z = 5,17,25 e=’PATRIOTISME’
x,*y=e
x*=5 x/=2 e=’PATRIOTISME’
x,*y,z=e

print('%s %s %s' % ('Je pense','donc','je suis'))


print('Ecole ',end='EST')
les opérateurs de comparaison
== égal à
!= différent de
> supérieur à
>= supérieur ou égal à
< inférieur à
<= inférieur ou égal à

Concaténation
nom="Moussa"
prenom="Dan Ladi"
print(nom+" "+prenom)
recherche d’une chaine de caractères
presention="EST, Ecole Superieure des Telecommunications, situee a Niamey face ENAM"
presentation.find('EST')

Liste : ensemble d’éléments séparés par des virgules, compris entre crochets

linux=['debian','ubuntu','redhat','centos']
print("premiere distrition est", linux[0])
print("deuxieme distrition est", linux[1])
Modifier le contenu d’une variable
linux[0]="Slax"
print("premiere distrition est",linux[0])
Format de liste : tableau [0-Nn-1]
print(linux[2 :]) #affiche les éléments de la liste à partir du 3e jusqu’au denier
print(linux[2 :]*2) #afficher le résultat 2 fois

Liste des listes


Indicer de liste
Soit la liste :
mot= [‘Fraternite ‘Travai ‘Progre ‘Libert ‘Justice ‘Honneur
’, l’, s’, e’, ’, ’]
Indice positif 0 1 2 3 4 5
Indice négatif -6 -5 -4 -3 -2 -1

mot[-1] mot[ :-1] mot[ -4:-1] mot[2 :] mot[0 :3] mot[0]+ mot[-1] mot[0]*5

Produit=['mil','mais','sorgho','riz','patate','manioc']
print(Produit[-1])
print(Produit[ :])
print(Produit[ :-1])
print(Produit[2 :4])
prix=[450,375,300,22550,125,200]
Quantite=[5,5,2,3,14,6]
print('le montant total de',produit[0],prix[0]*quantite[5])
tout=[[produit],[prix]]
print(tout[0],tout[1])
Exercice 1
Soit la liste : nbre = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Avant de le vérifier a l’aide de python, donner le résultat mentalement
nbre [3:6] nbre [7:10] nbre [3:0] nbre[3:6:3]
nbre [0:1] nbre [-3:-1] nbre [:] nbre[::4]
nbre [-3:0] nbre [-3:0] nbre[0:10:1]*2 [8:3:-1]
[0:10:-2] [::-2] [5::-2] [1:5:-2]

Quelques fonctions predefinies


sep=’/’ d/e/m/o/c/r/a/t/i/e
rep=’democratie’
j=sep.join(rep)
o=j.split(‘/’) Renvoie la liste sans le séparateur
o.lower Formate les éléments de la liste en minuscule
Exemple :
eleve=['ali','sani','issa','mairo','hadi'] eleve=['Ali','Sani','Issa','Mairo','Hadi']
trouve=input('Entre un nom ') trouve=input('Entre un nom ')
if trouve.lower() in eleve : if trouve.capwords() in eleve :
print('Alors trouve') print('Alors trouve')
else : else:
print('Pas trouve') print('Pas trouve')

Formatage du texte
nom= input("Quel est votre nom? ")
veux = input("Quel est votre meilleur voeux pour le Niger? ")
print("{} souhaite {} pour le Niger").format(nom,veux)

Ordre d’affichage des variables (avec 0 pour la variable à afficher en premier, 1 pour la variable à afficher en
second,..
nom= input("Quel est votre nom? ")
veux = input("Quel est votre meilleur voeux pour le Niger? ")
print("{0} souhaite {1} pour le Niger").format(nom,veux)

Manipulation de chaine de caractères


Vérifier les fonctions liées à string : dir(string)
regle1=’ Dans une Entreprise, l\’informaticien est le premier a venir et est le dernier a partir ’
regle1.strip()
regle1.replace(‘Entreprise’,’Organisation’)
regle1.capwords()

Liste d’un nombre :


soit le numéro de téléphone : tel=20123456
Incorrect Correcte
lister=list(tel) lister=list(str(tel))
Longueur=len(tel) Longueur=len(str(tel))

Structure de données
list.clear() list.append(x) list.insert(i, x) list.remove(x) list.clear() list.pop([i]) list.index(x[, start[, end]])
list.count(x) list.sort(key=None, reverse=False) list.reverse()
list.popleft() del list[n]

list(‘Afrique’)
Ajout d’un élément en tête de liste
L=[]
produit.append('oignon')
produit.append(0,'Riz')

print(produit)
Ajouter un élément à la position k de la liste
produit.insert(1,'tomate')
Supprimer un élément de la liste
produit.remove('riz’)
Renverser l’ordre du contenu de la liste : le premier élément devient le dernier
produit.reverse()
Supprimer le dernier élément de la liste
produit.pop()
Supprimer un élément de la liste à la position k
del produit[1]
print(produit)
Concaténer les contenus de deux listes
produit1=['mil','mais','sorgho']
produit2=['riz','patate','manioc']
produit=produit1+produit2
toutProduit=[produit1,produit2]
print(toutProduit[][])
print(toutProduit[1][1])
Exemple 1:créer une liste a partir d’une boucle
carre = []
for x in range(10):
carre.append(x**2)
Exemple 2:
carre = [x**2 for x in range(10)]

Exemple 3 :
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
Exercice
Soit d = [-4, -2, 0, 2, 4]
1. Créer une liste avec des valeurs doubles de d
2. Exclure des valeurs négatives dans d
3. Utiliser une fonction aux valeurs de d
4. Donner une liste qui contient le tuple carre des valeurs de d
Exercice :
Soit la matrice
A= [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12] ]
1. Donner la transposée de A
Solution 1:
H=[
[row[i] for row in A]
for i in range(4)]
print(H)
Solution 2
A=[]
for i in range(4):
A.append([row[i] for row in A])
Déterminer la valeur maximale
print(max(prix)) #affiche le prix maximal
print(min(prix)) #affiche le prix minimal
Le nombre d’éléments de la liste
print(len(prix))
Exercice 1
Soit rep= ‘decolonisation’
1 col=list(rep) 6 d[0],d[2],d[4], d[5],d[6] =’d’,’ m’,’c’,’r’, ’t’
2 del col[0 :2] 7 print(d)
3 re=list(‘re’) 8 d.insert(6,’a’)
4 rec=re+col 9 print(d)
print(rec)
5 d=rec 10 d[9 :]=’e’

Exercice 2
Soit d=’democratisation’
1 dl=list(d) 9 k.index(‘e’)
2 dl.count(‘i’) 10 k.pop()
3 dl.count(‘i’) 11 k.pop(0)
4 s=d[ :4] 12 k.remove(‘m’)
5 t=d+s 13 m=k
6 t.count(‘d’) 14 m.sort()
7 l=list(‘anti’) 15 y=sorted(k)
8 k.extend(d)

pop() supprime par défaut le dernier élément de la liste.


remove() supprimer la première occurrence de l’élément trouvé dans la liste
Les tuples : ensemble d’éléments compris entre parenthèses
() Tuple vide
t=tuple(‘REPUBLIQUE’) Retourne la chaine de caractères en tuple
t[2 :4]
list(t) Convertit le tuple t en liste

Ensemble. Set()
s0={1,7,7,2}
s1={1,2,10,20}
print(len(s0))
s0.add(5)
print(s1.discard(s0))
print(not s0.isdisjoint(s1))
print(s0.intersection(s1))
print(s0.difference(s1))
print(s0.union(s1))
print(s0.issubset(s1))
Exercice : donner le role de chaque met
Produit=(‘Tomate’,’Riz’,’Arome’)
Dictionnaire : c’est comme un tableau
Pourquoi le dictionnaie ?
Soit eleve=[‘Ali’,’Iro’,’Ami’,’Hadi’]
telephone=[20586313,20659874,21561202,20265981]
Chercher le numéro de Ami : telephone[eleve.index(‘Ami’)]
Sous forme de dictionnaire :
eleve=[‘Ali’ : 20586313,’Iro’: 20659874,’Ami’: 21561202,’Hadi’: 20265981]
fourniture={'cahier':'200','crayon':'couteur','gomme' :'100','livre' :'Afrique mon
Afrique'}
etudiant={'nom':'ali','prenom':'sani','adresse' :'Lamorde','genre' :'H'}
print(fourniture)
print(fourniture['cahier'])
del (fourniture['gomme'])

fourniture ['livre']='Histoire du Niger']


print(len(fourniture))
print(fourniture.keys())
print(fourniture.values())

Afficher une colonne d’enregistrement


print(etudiant['nom'])
Supprimer un champ de la liste
del etudiant['nom']
print(etudiant.get('prenom'))
print(etudiant.keys()) # afficher les champs
Les fonctions liées au dictionnaire
etudiant=[(‘Nom’,’Ali’),(‘bourse’,65000)] d=dict(Nom=’Ali’,bourse=65000)
d=dict(etudiant)
print(d)
eleve={ d={}
'ali':{ d[‘nom']='Ali'
'tel':22, d[‘bourse']=35200
'adress':'yantala' print(d)
}, d.clear() Supprime le contenu du dictionnaire d
'sani':{'tel':23,'adress':' boutique={
Liberte' 'nom':'Gogormaya','contact':{'Yantala':22222
} } 200,'Haro banda':22222201}
print(eleve) }
print(boutique)

boutique={ Sauver=boutique.copy() Copier le dictionnaire boutique dans


sauver
x={}.fromkeys(boutique)
'nom':'Gogormaya','tel':[22222200,22222201] Créer un nouveau dictionnaire
dict.fromkeys([‘nom’,’tel’]) sans les valeurs
}
print(boutique)
On peut assigner une valeur au lieu de None dict.fromkeys([‘nom’,’tel’],(‘vide’))
vacataire={‘nom’ :’Ali’,’nbreHeure’ :60
,’module’ :’Linux’,’classe’ :’L1’}
libelle,valeur = vacataire.popitem()
print(libelle)
print(valeur)

Etudiant={‘nom’ :’Ali’,’prenom’ :’Sani’,’bourse’ :’oui’}


etudiant.pop(‘nom’) Supprime l’item nom
etudiant.popitem() Supprime arbitrairement l’item du dictionnaire
stagiaire={} Assigner une valeur par défaut a un item du dictionnaire
stagiaire.setdefault(‘profile’,100)
print(stagiaire)
vac={‘vacataire’ :’Alou’} update() met à jour le dictionnaire à partir du contenu d’un autre
stagiare.update(di)
Values
region={} values() retourne les valeurs du dictionnaire
region[1]='Agadez'
region[2]=' Diffa'
region[3]=' Dosso'
r=region.values()
print(r)

Exercice
v=[
{'cmd':1,'jr':'2022-04-15','tel':20659874,
'achat':[
{'art':'bic','qte':5,'px':75},
{'art':'regle','qte':2,'px':50},
{'art':'Ardoise','qte':3,'px':250}
]
},
{'cmd':2,'jr':'2022-04-15','tel':93659874,
'achat':[
{'art':'gomme','qte':2,'px':25},
{'art':'crayon','qte':5,'px':50},
{'art':'Ardoise','qte':3,'px':250}
]
},
{'cmd':3,'jr':'2022-04-17','tel':87659874,
'achat':[
{'art':'bic','qte':14,'px':75},
{'art':'regle','qte':7,'px':50},
{'art':'Ardoise','qte':3,'px':250},
{'art':'Classeur','qte':3,'px':1250}
]
}
]
1. Donner le nombre de commandes
2. Donner le nombre de commandes par jour
3. Donner le nombre de commandes par mois
4. Donner le nombre de commandes par an
5. Donner le le montant total de chquae commande
6. Donner le chiffre d’affaires par jour
7. Donner le jour ou il ya plus de chiffre d’affaires

Les structures de contrôle


if (condition1) : age= int(input('Entrez votre age'))
instruction1 if age>=6)and age<11:
elif(condition2) : print('Vous etes au primaire')
instruction2
elif age>=11 and age<15:
else :
instruction3 print('Vous etes au colege')
else:
print('Vous devrez etre a l\'Universite')
ecole=input('Entrez votre ecole:EST,EPN,UAM')
if ecole=='EST':
print('Soyez les bienvenue au MASTER 2 GL. Vous etes
pythonien')
else:
print('Desole, vous n\'allez pas suivre le cours de python')

electeur={'id':22,'Nom':'Ali','age':25,'nationalite':'nigerienne'}
print(electeur,"\n",electeur1)
if (electeur.get('nationalite')=='nigerienne' and (electeur.get('age')>=18)):
print("vous pouvez voter")
else:
print("Vous ne pouvez pas voter. DESOLE")

import math as m import math as m


a,b,c=2,4,6 a=float(input("Entrer la valeur de a: "))
dt=b**2-4*a*c b= float (input("Entrer la valeur de b: "))
c= float (input("Entrer la valeur de c: "))
if dt>0: dt=b**2-4*a*c
x1=-b-m.sqrt(dt) if dt>0:
x2=-b+m.sqrt(dt) x1=-b-m.sqrt(dt)
print("racine1 %s" % x1,"\n") x2=-b+m.sqrt(dt)
print("racine2 %s" % x2,"\n") print("racine1 %s" % x1,"\n")
elif dt==0: print("racine2 %s" % x2,"\n")
x1=x2=-b/2*a elif dt==0:
print("Racine double x1==x2: ",x1) x1=x2=-b/2*a
else: print("Racine double x1==x2: ",x1)
print("Pas de solution") else:
print("Pas de solution")

eleve=['Ali','Sani','Iro','Hadi']
donnee=input('Nom')
if donnee:
print('ok')
else:
print('non’)

while True:
print('*'*50)
print('*'*15,'Presention du membre de UIN','*'*15)
print('1: Presentez-vous\n2:Vos propositions ')
ch=input('Faire un choix: ')
if ch == '1':
nom=input("Nom: ")
prenom=input("Prenom: ")
niveau=input("Niveau: ")
genre=input("Genre: ")
age=input("Age: ")
elif ch == '2':
message=input("Saisir le message: ")
if message:
print("Merci pour votre production")
Pour les nombres complexes, importer le module cmath
Reoudre (1+3j) * (9+4j)
Resoudre (1+3j) / (9+4j)

WHILE
i=0 On peut également utiliser un else pour faire les
while(i<8): instructions qui ne remplissent pas les conditions du while.
print(‘tour numero’,i) i=9
i+=1 while(i<8):
print('tour',i)
i+=1
else:
print('hors condition!')

FOR
for i in [1,2,3]: condiment=['Huile','Tomate','Oignon','S
print(i) el']
for c in condiment:
print(c)
break ou continue for n in range(2,25,3):
i=1 print(n)
while(i<8):
print('tour',i) = ['Ali', 'Adi', 'Kaka', 'Sani',
i+=1 'Labo']
if(i==5): for i in range(len(a)):
break print(i, a[i])
else:
print('hors sujet!')

ecole=[['UAM','UM','UZ','UT'],
['EST','EPN', 'EMIG']]
for u in range(0,1) :
for e in range(0,1) :
print (ecole[u][e]):

for n in range(2, 10): for num in range(2, 10):


for x in range(2, n): if num % 2 == 0:
if n % x == 0: print(num,"est premier")
print(n, 'equale', x, '*', n//x) continue
break print(num,'est un nombre premier ')
else:
print(n,'est un nombre premier ')

def fib(n): def fib2(n):


L=[] 'Donne la suite de Fibonacci de n'
a, b = 0, 1 result = []
while a < n: a, b = 0, 1
a, b = b, a+b while a < n:
L.append(a) result.append(a)
Return L a, b = b, a+b
print(fib(10)) return result
def fib3(n,a=0,b=1,L=[]):
while a < n:
a, b = b, a+b
L.append(a)
Return L
print(fib3(10))

a) [x*x for x in range(10)]


b) [(x, y) for x in range(3) for y in range(3)]
c) eval(raw_input("Enter an arithmetic expression: "))
d) c = {}
c['x'] = 2
c['y'] = 3
eval('x * y', c)
les fonctions
chr(n)
eval(source[, globals[, locals]])
enumerate(seq)
range([start,] stop[, step])
reversed(seq)
i=5
def f(arg=i):
print(arg)
i=6
f()

Le fichier
Script python Contenu du fichier f.txt

Ecriture dans un fichier


Exercice d’application 1

Exercice d’application 2
Exercice d’application 3 : Objectif : écrire un programme qui copie certaines données d’un fichier vers un autre
Les fonctions
Syntaxe

def nomFonction([parametre1[:type], parametre2 [:type] ,..., parametreN [:type]]) [->


type]:
{instructions}
[return resultat]

Exemple :
def menu():
l=50
lg=10
lg_item=l - lg
entete = '%-*s%*s'
frm= '%-*s%*.2f'
print('*'*l)
print(entete %(lg_item,'TABLEAU DE BORD',lg,''))
print('*'*l)
print(entete %(lg_item,'Menu',lg,'Choix'))
print('*'*l)
print(entete %(lg_item,'Afficher',lg,1))
print(entete %(lg_item,'Rechercher',lg,2))
print(entete %(lg_item,'Ecrire',lg,3))
print(entete %(lg_item,'Charger les donnees d\'un fichier',lg,4))
print(entete %(lg_item,'Exporter les donnees dans un fichier',lg,5))
print(entete %(lg_item,'Statistiques',lg,6))
print(entete %(lg_item,'Quitter',lg,7))
print(entete %(lg_item,'Quitter',lg,8))
menu()

Exemple : Ecriture d’une fonction qui inscrire les etudiants dans un fichier
def inscrire(n,p,d,f,dp,v):
with open('C:\\db\\inscrire.txt','a') as fic:
fic.write(f'{n} {p} {d} {f} {dp} {v} \n ')
inscrire('Ali', 'Kaka', 'Licence', 'FST', 'Informatique', 'Bac')
Exercice : Gestion de versement/retrait d’argent d’un compte bancaire
from datetime import datetime as D
jr=D.now().date()
while True:
print('*'*50)
print('*'*10, "Tableau de bord",'*'*10)
ch=input('1:Crediter\n2:Debiter\n3:Rechercher\n4:Quitter')
if ch=='1':
c=input('Entrer le numero de compter a crediter: ')
if c.isdigit():
m=input('Entrer le montant: ')
if m.isdigit():
with open("bank.txt","a") as f:
f.write("{};{};{};{}".format(jr,c,m,0))
if ch=='2':
c=input('Entrer le numero de compter a crediter: ')
if c.isdigit():
m=input('Entrer le montant: ')
if m.isdigit():
with open("bank.txt","a") as f:
f.write("{};{};{};{}".format(jr,c,m,1))
if ch == '3':
r=input('Entrer le numero a rechercher: ')
if r.isdigit():
with open("bank.txt") as f:
for ligne in f:
l=ligne.split(";")
if l[1] == r:
print(l[1], 'existe')

Exercice: Introduction au module tabulate


from tabulate import tabulate
print('-'*25)
print('Vente des produits artisanaux')
c=input('1:Lister les produit\n2:Acheter')
if c == '1':
L=[]
with open('produit.csv') as f:
for ligne in f:
l=ligne.split(';')
L.append(l)
print(tabulate(L,['Produit','Prix'],tablefmt='grid'))

Exercice : Convertir un fichier csv(avec separateur virgure) vers json


import json,csv
def convertCSVJson(fcsv,fjon):
tabJson=[]
with open(fcsv,encoding='utf-8') as fc:
lireJson=csv.DictReader(fc)
for ligne in lireJson:
tabJson.append(ligne)
with open(fjon,'a',encoding='utf-8') as fj:
jsonDump=json.dumps(tabJson)
fj.write(jsonDump)

convertCSVJson('recrute.csv','recrute.py')

Exercices d’application
Soit une base de données contenant les ventes
d=[
{'cmd':5,'cl':'Abdou','prd':[{'p':'Bic','px':100,'qte':2},{'p':'Gomme','px':50,'qte':3}]},
{'cmd':6,'cl':'Ari','prd':[{'p':'eponge','px':200,'qte':8},{'p':'marqueur','px':800,'qte':
6},{'p':'Gomme','px':50,'qte':3}]},
{'cmd':8,'cl':'Abou','prd':[{'p':'Regle','px':100,'qte':2},{'p':'compas','px':50,'qte':3}]
},
]
1. Ecrire une fonction qui retourne le nombre de commandes
def compter(i=0):
for x in d:
i+=1
return i
print(compter())
2. Ecrire une fonction qui retourne le nombre de produits achetés pour chaque commande
def compterCmd():
L=[]
for x in d:
i=0
for y in x['prd']:
i+=1
L.append([x['cmd'],i])
return L
print(compterCmd())

def compterCmd(c,i=0):
for x in d:
if x['cmd'] ==c:
for y in x['prd']:
i+=1
return c,i
for x in d:
print(compterCmd(x['cmd']))

3. Ecrire une fonction qui retourne le total de chaque commande


def compterCmd(c,S=0):
for x in d:
if x['cmd'] ==c:
for y in x['prd']:
S+=y['px']*y['qte']
return c,S
for x in d:
print(compterCmd(x['cmd']))
4. Chercher la commande qui a le plus grand montant
def compterCmd(c,S=0):
for x in d:
if x['cmd'] ==c:
for y in x['prd']:
S+=y['px']*y['qte']
return c,S
L=[]
V=[]
for x in d:
L.append(compterCmd(x['cmd']))
V.append(compterCmd(x['cmd'])[1])
m=max(V)
for l in L:
if l[1]==m:
print(l)
break

5. Donner le produit qui a la plus grande quantité acheté


Exercice d’application
Objectif : Calculer la somme des valeurs d’une colonne d’un fichier csv

print sys.modules.keys() Affiche tous les modules chargés


print sys.platform Afficher le système d’exploitation
sys.version Afficher la version de python
Os
os.name Retourne le nom de la machine
os.chdir(‘devoirs’) Aller dans le répertoire devoirs
os.lstate(‘/home’) Etat du dossier /home
os.startfile(‘/var/www/html/index.html’) Exécute le fichier index.html
os.getcwd() Retourne le répertoire courant
os.listdir(‘/etc/init.d’) Afficher le contenu du répertoire init.d
Exemple :
contenu=os.listdir(‘/etc/init.d’)
for c in contenu :
print(c)
os.access(‘fichier’,0) Vérifier l’accessibilité du ficher
os.chown(‘fichier’,’uid’,’gid’) Changer le propriétaire et groupe du fichier

os.rename(‘src’,’dst’) Renommer un fichier


Exemple : os.rename(‘~ben/exo2017’,
‘~ben/exercice2017’)
os.getuid() Retourne l’identifiant de l’utilisateur courant

os.path.isfile() Vérifier si c’est un fichier


Exemple :
import os as o
print(o.path.isfile('C:\\app\\rh.txt'))
os.path.isdir() Vérifier si c’est un dossier
Exemple :
import os as o
print(o.path.isfile('C:\\app'))
os.path.exists() Vérifier si le chemin existe
Exemple : print(o.path.exists('C:\\app'))
os.system(‘commande’) Exécuter une commande shell
os.system(‘mdkir dossier’)
os.popen() Exécute la commande et retourne un fichier objet
Exemple :
f=o.popen('dir C:')
for f in f:
print(f)
os.getpid() Retour l’identifiant du processus
import os as o
f=o.getpid()
print(f)

os.getlogin() Retourne le nom de l’utilisateur connecté


print(o.getlogin())
os.chmod(‘fichier’,droits) Modifier les droits d’un fichier
Exemple :
os.chmod(‘/home/ali/exercice.doc’,744)
os.makedirs() Créer les répertoires de façon récursive
Exemple:
os.makedirs(‘/home/ali/annee2018/notes/devoirs’)
os.removedirs(‘chemin’) Supprimer le répertoire de façon récursive
Exemple : os.removedirs(‘notes/devoirs’)
Supprimer l’arborescence import shutil
shutil.rmtree(‘notes/devoirs’)
Copie shutil.copy(’source’, ’destination’)
Copier l’arborescence shutil.copytree(’source’, ’destination’)
os.rmdir(‘chemin’) Supprimer le répertoire
os.rmdir(‘(‘~ali/annee2018/’)
os.remove(‘fichier’) Supprime le fichier
Execution des programmes externs
a. Ecrire un programme shell qui ping toutes la plage des machines 10.16.0.1 à 10.16.0.20
b. Exécuter ce programme dans python
a. Script pro.sh b. Script pro.sh c. Script pro.py
#!/bin/bash #!/bin/bash #!/usr/bin/python
for I in {1..20} For ((i=1;$i<20;$i++)); do import os as o
do ping 10.16.0.$i r=o.system(‘./pro.sh’)
pring 10.16.0.$i done for r in r:
done print(r)
d. Lister le contenu du dossier e. Pinguer cinq machines du resau f. Changer les droits des fichiers
si vous etes root 10.0.0 contenus dans un dossier
#!/usr/bin/python #!/usr/bin/env python #!/usr/bin/python
import os as o import os as o import os
ut=o.getuid() add='10.0.0.' doc=raw_input('Entrer le dossier')
if ut== 0: for i in range(1,5): if os.path.isdir(doc):
l=o.listdir('/home') o.system('ping -c 1'+' '+add+str(i)) rep=os.listdir(doc)
for i in l: for rep in rep:
print(i) os.chmod(rep,764)
d=os.listdir(doc)
print(d)
Programme shell qui compresse le contenu d’un dossier :
#!/bin/bash
declare -a doc=(/etc /var)
for rep in ${doc[@]}
do
find $rep -name "*.sh" | xargs tar -cvf archive.tar
done
4exercice : ecrire un programme qui compresse le contenu de chacun des dossiers lu dans un fichier
Script SHELL pour le changement de droit des fichiers
#!/bin/bash
echo Entrer le dossier
read d
echo Entrer l\'utilisateur
read u
echo Entrer le droit
read dr
if [ -d $d ]
then
ru=$(( cat /etc/passwd | grep $u | cut -d ':' -f 1 ))
if [ -n "$ru" ]; then
for tr in "find $d -user $ru -exec ls -lR"
do
ls -l $tr
chmod $dr $tr
done
fi
fi
Une fonction qui desactive un utilisateur
#!/bin/bash

desactiver(){
cat /etc/passwd | cut -d ':' -f 1 | grep $d | while read line
do
echo $line
done
}
desactiver ben
Programme SHELL qui désactive les comptes des utilisateurs se trouvant dans un fichier
#!/bin/bash
c="$(cut -d : -f 1 /etc/passwd)"
while read l; do
for i in $c;do
if [ $i = $l ]; then
if [ $? -eq 0 ]; then
passwd -l $i
echo "$i est desactive"> /tmp/cmp.txt
else
echo "$i n'est pas desactive" >> /tmp/cmp.txt
fi
fi
done
done < utilisateur.txt
Programme qui créer les comptes des utilisateurs :
#!/bin/bash
while read ligne; do
useradd $ligne
done < utilisateur.txt
Programme SHELL qui permet d’expirer les comptes des utilisateurs au 31 décembre 2018
#!/bin/bash
while read ligne; do
#chage -E 2018-12-31 $ligne
echo "========$ligne========="
chage -l $ligne
done < utilisateur.txt
Programme qui recherche un dans un fichier :
#/bin/bash
echo 'Entrer le fichier'
read fich
echo 'Entre le mot recherche'
read mot
cat $fich | while read line
do

grep $mot $fich


if [ $? > 0 ]
then
echo $mot >> /tmp/copie.txt
fi
done
Exercice : Partant de l’exercice ci-dessous, écrire un programme qui recherche un mot dans une liste de fichiers
Programme qui permet de verifier si des utilisateurs existent sur le système(utilisation du tableau)
#/bin/bash
declare -a tab=(ali ben dodo)
for d in ${tab[@]}
do
cat /etc/passwd | cut -d ':' -f 1 | grep -x $d | while read line
do
if [ $?> 0 ]
then
echo "$d trouve"
else echo "$d non trouve"
fi
done
done
#Le fichier exoPing.sh
#!/bin/bash
>/tmp/erreur.txt
pinger(){
for i in {1..5}
do
ping -c 1 $ad.$i
if [ $? -ne 0 ]
then
echo "$ad.$i est Hors Reseau" >> /tmp/erreur.txt
fi

done
}
Programmation module avec SHELL
#!/bin/bash
source exoPing.sh
for address in 10.0.0 172.16.128
do
pinger $address
done
Création des comptes utilisateurs en utilisant la commande newusers
a. Creation du fichier qui contient les comptes a créer
kaka :kaka2018 :1050 :1050 :kakale:/home/kaka/ :/bin/bash
nana: nanachoi :1051 :1051 : nana:/home/nana/ :/bin/sh

b. Creation du programmme:
#!/bin/bash
echo 'Entrer le fichier contenant les comptes a creer'
read fich
if [ -f $fich ]
then
newusers $fich
fi
Ecriture dans un fichier avec Python
#!/usr/bin/python
ecriture=raw_input('Saisir un text')
f=open('./b.txt','a')
while ecriture !='':
f.write(ecriture)
f=open('./b.txt','r')
for k in f:
print(k+'\n')
Exemple : ecriture dans un fichier

Exexution de programme avec le module popen()


#!/usr/bin/python
import os
p=os.popen('date')
print p.read()

Exercices d’application
1. Ecrire un script python qui pingue une liste des machines saisie dans un fichier
2. Ecrire un script python qui permet de changer les droits du contenu du dossier d’un utilisateur de votre choix
3. Ecrire un script python qui pingue les 10 premières machines de chacun des réseaux : 10.16.0.0/12,
10.32.0.0/12 et 10.48.0.0/12
4. Ecrire un script python qui copie uniquement les fichiers du dossier /etc et les place dans un dossier de votre
choix
5. Ecrire un script python qui créer des utilisateurs saisis dans un fichier
6. A la fin du stage, le directeur des ressources humaines vous demande de supprimer une liste des stagiaires
contenus dans un fichier.
7. Ecrire un script python qui fixe la date d’expiration des mots de passe des utilisateurs saisis dans un fichier
texte
Proposition de solution:
Exercice 1 Exercice 2
import os as o Ecrire un script Pytho qui permet
f=open('machine.txt') compter le nombre de fichiers et sous
for f in f: dossiers contenus dans un dossier
o.system('ping'+' '+f)
os.startfile() Démarrer un programme
Exemple: o.startfile('notepad.exe')
Subprocess
Ouvrir le fichier rh.txt dans notepad subprocess.call(['notepad.exe','C:\\app\\ rh.txt '])
Ouvrir notepad subprocess.Popen(['notepad.exe'])

Urllib2
import urllib2 as u
r=u.urlopen('https://www.google.com')
print(r.info())
html=r.read()
r.close()

Scapy
sudo scapy
pk=IP(dst=’www.google.fr’)
pk.show
p[0]
P=sniff(iface=’eth1’,count=3) Sniffer 3 pauets sur l’interface eth1
p.summary()
P[0].show()
P[0].[IP].show() Avoir des infos précises sur la couche IP
pour sniffer les packets en temps reel, il faut user la fonction lambda:
packet=sniff(filter="icmp", iface='eth1', count=3, prn=lambda x:x.summary())
scapy sera plus détaillé dans l’activité 5

Fernet utilise l’algorithme symétrique. Ainsi, le message crypté ne peut être lu sans la clef

Method md5 Generer la clef Cryptage et decryptage


#!/usr/bin/python #!/usr/bin/python from cryptography.fernet import Fernet
import hashlib as h from cryptography.fernet import Fernet F=Fernet.generate_key()
m=h.md5() F=Fernet.generate_key() print(F)
m.update('Ben Bass') print(F) m=Fernet(F)
p=m.digest() textClaire=b'Je suis pythonien'
print(p) cryp=m.encrypt(textClaire)
p=m.hexdigest() print(cryp)
print(p) decryp=m.decrypt(cryp)
s=m.digest_size print(decryp)
print(s)

import hashlib as h import hashlib as h


p=h.sha1(b'je suis en classe') p=h.sha384(b'je suis en classe')
print(p.hexdigest()) print(p.hexdigest())
import hashlib as h import hashlib as h
p=h.sha512(b'je suis en classe') p=h.sha256(b'je suis en classe')
print(p.hexdigest()) print(p.hexdigest())
#!/usr/bin/env python
import hashlib as h
f=open('./f.txt','r')
for f in f:
p=h.sha512(f).digest()
print(p)

Objectif: testez les failles de vos propres équipements dans le but de vous protéger.

L’enseignant n’est pas responsable de tout acte indésirable posé par l’apprenant

1) Scanner le port d’une machine

2) scanner plusieurs ports pour chaque machine d’un réseau

Client Python

metasploit
3) à partir d’un fichier

Pour ma machine, le séparateur est le séparateur

4) Nmap
Installer le module nmap de Python : pip install nmap

5) Chercher le service, sa version, le système d’exploitation


6) Exercice : Ecrire un script Python qui renvoie la version des services installée sur les machines du
réseau 192.168.56.0/24

7) Script Python qui retourne la version de service exécutée sur les ports et ce, sur chaque machine
8) Connexion SSH avec le module pexpect
Ssh compte@machine
9) Exercice : écrire un script qui teste les mots de passe contenus dans un fichier pour se connecter au
serveur distant
10) Exercice : écrire un script qui teste les mots de passe contenus dans un fichier pour se connecter aux
serveurs distants
11) Autre méthodes
12) Configuration d’un routeur avec le module telnetlib

192.168.56.0/24

.1 .5

from telnetlib import Telnet


u,p='ben','ben'
tn=Telnet("192.168.56.5")
tn.read_until(b"Username: ")
tn.write(u.encode('ascii') + b"\n")
if p:
tn.read_until(b"Password: ")
tn.write(p.encode('ascii') + b"\n")

tn.write(b"enable\n")
tn.write(p.encode('ascii') + b"\n")
tn.write(b"conf t\n")
tn.write(b"hostname DELEGUE\n")
tn.write(b"end\n")
tn.write(b"exit\n")

print(tn.read_all().decode('ascii'))

13) Configuration des routeurs Cisco avec le module telnetlib


a. Exercice 1
b. Exercice 2
c. Exercice 3 : les scripts sont dans des fichiers

Fichier niv1.txt
Fichier niv1.txt Fichier niv2.txt

d. Scapy

from scapy.all import sr1,IP,TCP,ICMP


cn=sr1(IP(dst="192.168.1.90/30")/ICMP())
X=[x for x in cn]
print(X)

from scapy.all import sr1,IP,TCP,ICMP,Ether,UDP


cn=sr1(Ether(dst="ff:ff:ff:ff:ff:ff")/IP(dst=["192.168.1.90","192.168.1.91"],ttl=(1,
10))/UDP())
X=[x for x in cn]
print(X)
from scapy.all import sniff
from matplotlib.pyplot import plot
p=sniff(count=50)
p.plot(lambda x:len(x))

from scapy.all import sendp,IP,Ether


x=Ether()/IP(dst='192.168.56.5')
sendp(x,loop=1,inter=0.2)

from scapy.all import traceroute


x,y=traceroute(['192.168.1.90','192.168.1.93'])
x.trace3D()

e. Hacker son propre compte gmail

psutil
Les liens utiles

Home page : https://github.com/giampaolo/psutil


Install : https://github.com/giampaolo/psutil/blob/master/INSTALL.rst
Blog : http://grodola.blogspot.com/search/label/psutil
Forum : http://groups.google.com/group/psutil/topics
Download : https://pypi.python.org/pypi?:action=display&name=psutil#downloads
Development guide : https://github.com/giampaolo/psutil/blob/master/DEVGUIDE.rst

Domaines: CPU, memory, disks, network, sensors


Les outils implementes:
*ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice, ionice, iostat, iotop, uptime, pidof, tty, taskset, pmap*
Suporte Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD et NetBSD 32bits et 64 bits
Installation: pip install psutil
Importer le module psutil: import psutil
Les fonctions

psutil.cpu_times(percpu=False) Retourne le temps CPU.


Chaque attribut représente le temps passé par le CPU dans un mode
bien déterminé.
User : le temps d’exécution des processus normaux en mode
utilisateur.
System : temps d’exécution passé par le processus en mode kernel
idle : temps passé à ne rien faire
Nice : temps passé par les processus prioritaires en mode utilisateur
iowait : temps passé en attendant que les entrées/sorties soient
complètes
irq (Linux,BSD): temps passe après interruption
steal : temps passe par d’autres Systèmes d’exploitation dans un
environnement virtuel
psutil.cpu_percent(interval=None, percpu=False)
psutil. cpu_count(logical=True) Retourne le nombre de CPU logiques
Voir la documentation :
http://docs.python.org/3/library/os.html#os.cpu_count
psutil. os.cpu_count() Retourne le nombre de CPU dans le système
len(psutil.Process().cpu_affinity()) Retourne le nombre de CPU utilisé
psutil.cpu_count(logical=False) Retourne le nombre de CPU physiques
Psutil. cpu_stats() ctx_switches(Volontaire et involontaire ) depuis le démarrage du système
soft_interrupts : nombre d’interruption depuis le démarrage du système. Cette
valeur est égale à zéro sous Windows et SunOS
syscalls : nombre d’appels système depuis le démarrage du système
psutil.cpu_freq Renvoie la fréquence du CPU en Mhz. Sous Linux, le résultat est donné
en temps réel
Mémoire
psutil.virtual_memory() Retourne les informations sur la mémoire
Total : capacité totale de la mémoire
Used : mémoire utilisée, égale à total – free
Active:memoire actuellement utilisee
psutil. swap_memory() Information sur la mémoire SWAP
Total
Used
Free
Percent= (total – available)/total *100
sin: le nombre de byte que le système a swappé sur le disque
Sout : le nombre de byte que le système a swappé a partir du disque
Voir la documentation :
https://github.com/giampaolo/psutil/blob/master/scripts/meminfo.py
psutil. disk_partitions(all=False) Information sur les partitions montées.
Si all=False, il renvoie les partitions physiques
Voir la doc :
http://www.manpagez.com/man/2/getfsstat/
psutil. disk_usage(path) Retourne les infos sur l’utilisation du disque
Doc : http://docs.python.org/3/library/shutil.html#shutil.disk_usage

Psutil. disk_io_counters(perdisk=False, nowrap=True) Statistiques sur les entrées/sorties du disque


read_count :nombre de lecture
write_count : nombre d’écritures
read_bytes : nombre de bytes lus
write_bytes : nombre de bytes écrits
read_time : sauf openBSD et netBSD
Reseau
psutil.net_io_counters(pernic=False) Statistiques sur le réseau
bytes_sent
bytes_recv
packets_sent
packets_recv
errin :nombre total d’erreurs à la réception
errout: nombre total d’erreur à l’envoi
dropin : nombre de paquet supprimé à l’arrivée
dropout : nombre de paquet supprimé a la sortie
psutil.net_io_counters(pernic=True) Ajout d’adresse dans le résultat retourné
Pour plus de détails, voir la documentation suivante :
https://github.com/giampaolo/psutil/blob/master/scripts/nettop.py
https://github.com/giampaolo/psutil/blob/master/scripts/ifconfig.py

net_connections(kind='inet') Renvoie le nombre de sockets


http://docs.python.org//library/socket.html#socket.AF_INET
http://docs.python.org//library/socket.html#socket.AF_INET6
http://docs.python.org//library/socket.html#socket.SOCK_STREAM
http://docs.python.org//library/socket.html#socket.SOCK_DGRAM

Valeur de kind Connexion utilisée


inet IPv4 and IPv6
inet4 IPv4
inet6 IPv6
tcp TCP
tcp4 TCP over IPv4
tcp6 TCP over IPv6
udp UDP
udp4 UDP over IPv4
udp6 UDP over IPv6
unix UNIX socket (Pour UDP et TCP)
All Toutes les familles et protocoles
Documentation : https://github.com/giampaolo/psutil/blob/master/scripts/netstat.py
for ligne in psutil.net_connections(): Interpreter le resultat
print(l)
psutil.net_if_addrs()

Hacking
https://packetstormsecurity.com
http://www.securityfocus.com
www.securitytube.net
https://www.xmco.fr
www.zataz.com
https://www.owasp.org
https://www.hackerzvoice.net

Exercice :
1. Ecrire un script python qui permet de crypter tous les fichiers contenus dans un dossier
2. Ecrire un script python qui permet de crypter tous les fichiers appartenant à un utilisateur
3. Ecrire un script python qui permet de crypter tous les fichiers appartenant à plusieurs utilisateurs

TCP UDP
import socket as s import socket as s
s.setdefaulttimeout(5) s.setdefaulttimeout(5)
n=s.socket(s.AF_INET,s.SOCK_STREAM) n=s.socket(s.AF_INET,s.SOCK_DGRAM)
POST,PORT=’172.16.128.2’,80 POST,PORT=’172.16.128.2’,80
n.connect((POST,PORT)) n.sendto(‘Bonjour’, (POST,PORT))
n.send(‘Bonjour’) rep=n.recvfrom(1024)
rep=n.recv(1024) print(rep)
print(rep)

Exercice: bloquer les sites facebook et youtube avec Python

Lister les services démarrés


Information sur les mémoires

Informations sur les disques

Liste des processus et leurs noms

Exercice
Ecrire un programme Python qui redémarre un programme s’il est arrêté.
Exercice d’application
Exercice
Ecrire un programme python qui retourne des informations sur les partitions de disque, les mémoires, les
processus et ce, sur toutes machines appartenant aux réseaux 10.16.0.0/12, 10.32.0.0/12, 10.48.0.0/12
Utilisation de python dans l’audit du réseau
Premier cas : pour une seule machine distance

Utilisation du module telnetlib de python


Exercice : écrire un programme python qui va éteindre les serveurs à 21h30
Exercice: Configuter un routeur
Exercice: configurer plusieurs routeurs avec python

Exercice : configurer les switch


Contenu du fichier fichier2.txt

Proposition du script de configuration des switch


Partie 1

Commandes nécessaires: usseradd, chage, passwd

Exercice 1

a. Ecrire un programme SHELL qui crée les utilisations se trouvant dans un fichier tout en fixant
la date d’expiration de leurs comptes au 31 décembre 2019.
b. Configurer le nombre maximum de 40 jours pendant lesquels un mot de passe est valable.
Ainsi l’'utilisateur est obligé de changer son mot de passe avant de pouvoir utiliser son compte.
Configurer le nombre de 5 jours d'avertissement avant que le changement de mot de passe ne soit
obligatoire.
c. Vérifier si ce changement est prise en compte pas le système

Exercice 2

Commande : lastb

Ecrire un programme SHELL qui liste les utilisateurs dont les tentatives d’authentification d’accès ont
échoué.

Exercice 3 :

La commande newusers lit un fichier (ou l’entrée standard par défaut) et utilise ces informations
pour mettre à jour un ensemble d’utilisateurs existants ou pour créer de nouveaux utilisateurs. Chaque
ligne a le même format que le fichier de mot de passe standard (voir passwd (5)).

Pour plus de détails, utiliser le manuel : man newusers


 Analyser le contenu du fichier /etc/login.defs

Quelques fichiers importants sur la gestion des utilisateurs

/etc/passwd Informations de compte d'utilisateurs.


/etc/shadow Informations de compte d'utilisateurs sécurisés
/etc/group Informations sur les groupes
/etc/gshadow Informations sur les groupes sécurisés
Exemple :

a. Créer d’abord un fichier nommé utilisateur.txt qui contient les utilisateurs à créer :

fati :fati :1040 :1040 :fati:/home/fati:/bin/bash

issa :issa :1041 :1041 :issa:/home/issa:/bin/bash

sani : sani :1043 :1043 : sani:/home/ sani:/bin/sh

b. Exécution la commande de création de nouveaux comptes :


#newusers utilisateur.txt

Partant de l’exemple ci-dessus, écrire un script SHELL qui automatique la création des utilisateurs le janvier
2019. A cet effet, un fichier sera créé et indiquera si un utilisateur n’a pas été crée

Partie 2

Prérequis:

- Sur la machine physique ou VM Kali Linux, installer Python et les modules:


o scapy => python –m pip install -U scapy
o ssh2-python => python –m pip install –U ssh2-python
o mechanize => python -m pip install –U mechanize
o beautifullsoup4 => python –m pip install –U beautifullsoup4
- sur la machine(s) virtuelle(s) [Linux OS] :
o installer le service ssh => apt-get install openssh-server
o installer telnet => apt-get install telnet
- créer une liaison entre les machines physique et virtuelles

Exercice 1

Nb: Vous pouvez utiliser l’adresse IP du réseau de votre choix

Exemple 1: avec le module ssh2-python, connecter à la VM et créer un fichier classe.txt dans le dossier ecole

Pour plus de compréhension, chercher la documentation de ssh2-python


Exemple 2 (avec le module telnetlib)

Exercice 2

Ecrire un script python (avec le module ssh2-python) qui :

- donne la liste des utilisateurs créés sur la VM


- les dossiers accessibles sans privilèges
- l’espace disque restant pour chaque partition
- liste les programmes qui s’exécutent avec les privilèges de root quelle que soit la personne
qui les utilise
find / -type f –perm +6000 -ls
- liste les fichiers « world writable »
find / -perm -2 ! -type l -ls
- liste les fichiers/dossiers qui n’ont pas de propriétaires
find / -nouser -o -nogroup
- les cinq premiers processus qui consomment la mémoire
- liste des fichiers ouverts et leurs utilisateurs
- automatiser l’exécution de ces points ci-dessus et ce, chaque mois et envoyer le résultat
dans un fichier

Exercice 3

Ecrire un programme SHELL qui vide les corbeilles de tous les utilisateurs et ce, chaque dimanche à 22h15

Exercice 4

Ecrire un script python (avec le module telnetlib) qui :

- nettoie la mémoire cache de la VM


- supprime les fichiers inutiles et leurs dépendants
- supprime les fichiers/dossiers qui n’ont pas de propriétaires
- purge le système de la VM
- qui protège les fichiers suivants contre la suppression(sauf root) :

chattr +i /bin/login ; chattr +a /var/log/messages

- protège le dossiers /var/log et ses fichiers contre tout accès par les simples utilisateurs :

chmod 751 /var/log /etc/logrotate.d

chmod 640 /etc/syslog.conf /etc/logrotate.conf

chmod 640 /var/log/*log

Exercice 5

Ecrire un programme python (avec le module ssh2-python) pour :

- mettre à jour les liens vers les miroirs : apt-get update


- mettre à jour les logiciels existants : apt-get upgrade
- installer une liste des packages contenus dans un fichier,
- lister les fichiers appartenant aux utilisateurs saisis dans un fichier
- Liste des programmes qui s’exécuteront au démarrage de la Machine Virtuelle
- Lister les packages installés sur la Machine Virtuelle

Exercice 6

Partie A

Ecrire un programme python (avec ssh2-python) pour :

- Lister les fichiers/répertoires accédés il y a deux semaines de cela


- Liste des fichiers modifiés il y a trois semaines de cela
- Liste des personnes connectées ayant ouvert la session
- Liste des personnes dont l’authentification a échoue
- Liste des personnes ayant un mot de passe faible
- Liste les règles de sécurité dans les chaines du firewall, définies avec la commande iptables
- En somme, automatiser l’exécution de ces points ci-dessus et ce, chaque mois et envoyer le
résultat dans un fichier

Partie 7

Reprendre les questions de la partie A sur les machines de la topologie ci-dessous. Utiliser le module
telnetlib ou ssh2-python
Avec le module ssh2-python, écrire un script qui vide les corbeilles de tous les utilisateurs, et ce, chaque
dimanche à 22h15 sur chaque machine virtuelle.

Exercice 8

Logiciels : GNS3

Travail préliminaire :

a. Configurer les interfaces des routeurs avec les adresses IP


Exemple : cas du routeur R1
Nb : configurez les interfaces des autres routeurs
b. Configurer le service telnet sur chaque routeur
Exemple : cas du routeur R1

c. Configurer le protocole OSPF


Nb : configurer le telnet sur les autres routeurs
d. Configurer les interfaces physiques sur la machine Linux et les routeurs
Interface Adresse IP
PyNet-1 eth0 172.16.0.1
R1 f0/0 172.16.0.2
R2 f0/0 172.16.0.3
R3 f0/0 172.16.0.4
R4 f0/0 172.16.0.5
e. Configuration du protocole OSPF grâce au module telnetlib de python
Les sous réseaux 11.16.0.0, 11.32.0.0, 11.48.0.0 et 11.64.0.0/12 ont été agrégés en 11.0.0.0/8
f. Partant cet exemple, écrire un script python(avec telnetlib) pour sécuriser les consoles AUX, CONS 0
de chaque routeur. Et vérifier cela

Exercice : configurer les switch

Switch VLAN Script telnet


ESW1 8.0.0.5 conf t
ESW2 8.0.0.2 line vty 0 4
ESW3 8.0.0.3 transport input telnet
ESW4 8.0.0.4 password ben
login local
exit
username ben password ben
enable password ben
service password-encryption
do wr

Fichiers de configuration

Switch ESW3, ESW4, ESW5

Switch ESW2

Exercice 9

a. Ecrire un programme python (avec le module ssh2-python) qui liste les utilisateurs dont les
tentatives d’authentification d’accès ont échoué sur les serveurs
b. Ecrire un programme python (avec le module ssh2-python) qui installe le SGBD PostgreSQL
sur tous les serveurs.
c. Ecrire un programme python (avec le module ssh2-python) qui donne l’espace disque restant
sur chaque partition de chaque serveur.
d. Ecrire un programme python (avec le module ssh2-python) qui nettoie les fichiers inutiles sur
chaque serveur

Exercice 10
a. Créer une base de données BANQUE
Create database BANQUE ;
b. Créer une table COMPTE
Create table COMPTE(id INT PRIMARY KEY AUTO_INCREMENT, numCompte INT(25) NOT NULL
UNIQUE, nom VARCHAR(50) NOT NULL, prenom VARCHAR(50) NOT NULL, adresse TEXT, telephone
INT(8)) ;
c. Créer la table MOUVEMENT
Create table MOUVEMENT(id INT PRIMARY KEY AUTO_INCREMENT, montant INT(15) NOT NULL,
type INT(1) ENUM(0,1),idCompte INT NOT NULL);
d. Création de la clef étrangère dans la table MOUVEMENT
ALTER TABLE MOUVEMENT ADD CONSTRAINT fki_dCompte FOREIGN KEY(idCompte) REFERENCES
COMPTE(idCompte)
e. Charger les données dans les tables COMPTE et MOUVEMENT

Ecrire un programme python (avec ssh2-python) qui :

- Vérifie les bases de données se trouvant sur le serveur MySQL


- Liste les utilisateurs de chaque base de données
- Liste les privilèges de chaque utilisateur
- Fait le dump de toutes les bases de données sur le serveur de fichiers dans un dossier
nommée BackupDB. Ainsi, chaque dump sera associé avec la date à laquelle il est effectué (exemple :
BackupDB /dump2018-11-15.txt)
- Liste les tables de chaque base de données se trouvant sur le serveur

Exercice 11

Ecrire un programme python qui copie les fichiers/dossiers des utilisateurs se trouvant dans un fichier
‘utilisateurs.txt’ sur le serveur de fichiers et ce, chaque samedi à partir de 23h :59

Exercice 8

Ecrire un programme python (avec ssh2-python) qui :

ˉ implémente les règles de sécurité du firewall(avec la commande iptables) sur les serveurs :
ˉ liste les règles de sécurité définies
ˉ donne les statistiques sur le trafic du réseau 172.16.116.0/20
Exercice 4

 Utilisation de la machine Metasploit, version 2

a. module mechanize
br=mechanize.Browser() → creation d’une instance browser

br.set_all_readonly() --> permettre l'ecriture

br.set_handle_robots(false) --> ignorer les robots

br.set_handle_refresh(false) --> ne pas actualiser la page

----------------Ouverture de page web-----------------------------------------------------------------------------------------------

ouvrir=br.open(url)

----------------------Objets du formulaire--------------------------------------------------------------------------------------------

for form in br.forms():

print 'Objet du formulaire: ', form.name

print form

----------------------------------------------------------------------------------------------------------------------------------------------

br.select('form1') --> si le formulaire a un nom

br.form=list(br.forms())[0] si le formulaire n'est pas nomme

b. Le module urllib

c. Le module BeautifulSoup

Parser Avantage inconvenient


Html BeautifulSoup(markup,'html') Simple moins rapide
Lxml BeautifulSoup(markup,'lxml') + rapide dependance
lxml-xml BeautifulSoup(markup,'lxml-xml') ++ rapide Dependance
html5lib BeautifulSoup(markup,'html5lib') + lent
Partie B

A. Configuration manuelle du réseau


Configuration des sous interfaces du routeur R1 Configuration des sous interfaces du routeur R2
>enable >enable
#config t #config t
(config)# int f0/0 (config)# int f0/0
(config-if)#no sh (config-if)#no sh
(config-if)#no ip addr (config-if)#no ip addr
(config-if)#int f0/0.1 (config-if)#int f0/0.1
(config-subif)#encap dot1q 2 (config-subif)#encap dot1q 2
(config-subif)#ip add 10.16.0.1 255.240.0.0 (config-subif)#ip add 10.16.0.2 255.240.0.0
(config-subif)#exit (config-subif)#exit
(config)#int f0/0.2 (config)#int f0/0.2
(config-subif)#encap dot1q 3 (config-subif)#encap dot1q 3
(config-subif)#ip add 10.32.0.1 255.240.0.0 (config-subif)#ip add 10.32.0.2 255.240.0.0
(config-subif)#exit (config-subif)#exit
(config)# (config)#do copy r s
Configuration du switch 1(VTP Server) Configuration du switch 2(VTP Client)
>enable >enable
#vlan database #vlan database
(vlan)#vlan 2 name IT (vlan)#vtp domain etude
(vlan)#vlan 3 name RH (vlan)#vtp password ecole@ne
(vlan)#vtp domain etude (vlan)#exit
(vlan)#vtp password ecole@ne #conf t
(vlan)#apply (config)#int f0/0
(vlan)#exit (config-if)#switchport mode trunk
#conf t (config-if)#switchport trunk allow vlan add 2-3
(config)#int f0/0 (config-if)#exit
(config-if)#switchport mode trunk (config)#int range f0/1 - 2
(config-if)#switchport trunk allow vlan add 2-3 (config-range-if)#channel-group 1 mode on
(config-if)#exit (config-range-if)#exit
(config)#int range f0/1 - 2 (config)#int po1
(config-range-if)#channel-group 1 mode on (config-if)#switchport mode trunk
(config-range-if)#exit (config-if)#switchport trunk allow vlan add 2-3
(config)#int po1 (config-if)#no shut
(config-if)#switchport mode trunk (config-if)#exit
(config-if)#switchport trunk allow vlan add 2-3 (config)#int range f0/3 - 4
(config-if)#no shut (config-range-if)#switchport mode access
(config-if)#exit (config-range-if)#exit
(config)#int range f0/3 - 4 (config)#int f0/3
(config-range-if)#switchport mode access (config-if)#switchport access vlan 2
(config-range-if)#exit (config-if)#exit
(config)#int f0/3 (config)#int f0/4
(config-if)#switchport access vlan 2 (config-if)#switchport access vlan 3
(config-if)#exit (config-if)#do copy r s
(config)#int f0/4
(config-if)#switchport access vlan 3
(config-if)#do copy r s
Configuration du service DHCP sur le routeur R1 Configuration du service DHCP sur le routeur R2
#conf t #conf t
(config)#ip dhcp pool p16 (config)#ip dhcp pool p16
(dhcp-config)#network 10.16.0.0 255.240.0.0 (dhcp-config)#network 10.16.0.0 255.240.0.0
(dhcp-config)#default-router 10.16.0.1 (dhcp-config)#default-router 10.16.0.2
(dhcp-config)#lease 1 (dhcp-config)#lease 1
(dhcp-config)#exit (dhcp-config)#exit
(config)#ip dhcp excluded-addr 10.16.0.1 10.16.0.10 (config)#ip dhcp excluded-addr 10.16.0.1 10.16.0.10
(config)#end (config)#end
#conf t #conf t
(config)#ip dhcp pool p32 (config)#ip dhcp pool p32
(dhcp-config)#network 10.32.0.0 255.240.0.0 (dhcp-config)#network 10.32.0.0 255.240.0.0
(dhcp-config)#default-router 10.32.0.1 (dhcp-config)#default-router 10.32.0.2
(dhcp-config)#lease 1 (dhcp-config)#lease 1
(dhcp-config)#exit (dhcp-config)#exit
(config)#ip dhcp excluded-addr 10.32.0.1 10.32.0.10 (config)#ip dhcp excluded-addr 10.32.0.1 10.32.0.10
(config)#do copy r s (config)#do copy r s

Passez a la verification
a. Vérifier si le switch client VTP a reçu des vlan
b. Vérifier si les machines clients ont reçu des adresses IP via le service DHCP
c. Faire le ping des machines appartenant aux VLANs différents
d. Pour chaque machines cliente, vérifier sa passerelle par défaut
e. Arrêter un des routeurs et vérifiez si les machines reçoivent des adresses IP

B. Automatiser la configuration grâce au module telnetlib de python

Nb : telnetlib est un module standard de python donc ne nécessite pas d’être installé encore

Travail demandé :

Partant de l’exemple manuel de configuration de la topologie ci-dessus, écrire un programme python (avec
telnetlib) pour configurer les routeurs et switch de cette topologie.
(module : ssh2-python)

Exercice

Utiliser le module ssh2-python pour auditer les serveurs et stocker le contenu dans un fichier.

. config_mode() Entrer en mode de configuration globale


. check_config_mode() Vérifier si on est en mode de configuration globale
. exit_config_mode() Quitte le mode de configuration globale
.clear_buffer() Nettoie le buffer
.enable() Entre en mode utilisateur
.exit_enable_mode() Quitte le mode utilisateur
.find_prompt() Retourne le prompt courant
.disconnect() Ferme la session SSH
.send_command(arguments) Exécute la commande mise en paramètre en mode privilégie
.send_config_set(arguments) Exécute la commande mise en paramètre en mode de
configuration globale
send_config_from_file(arguments) Exécute une suite de commande se trouvant dans un fichier

Module zlib

zlib permet de compresser ou décompresser un document comme zip ou gunzip

syntaxe : gzip.GzipFile([filename[, mode[, compresslevel[, fileobj]]]])

Les différents modes : 'r', 'rb', 'a', 'ab', 'w', or 'wb'

Nb : le mode par défaut est rb

Le niveau de compression : [1,9]

Niveau
1 Plus rapide mais la compression n’est pas efficace
9 Très bonne compression mais lent
Exemple 1 : lire le contenu d’un fichier compresser

Exemple2 : Créer un fichier compressé

Exemple 3 : Compresser un fichier


Atelier activité 5

Exercice 1

Guide pour la configuration

Travail demandé :

ˉ configurer les interfaces et les sous interfaces des routeurs


ˉ configurer le protocole OSPF entre les routeurs Niger et Tchad ; RIP entre les Routeurs Niger et
Nigeria ; le protocole EIGRP entre les routeurs Nigeria et R4
ˉ Vérifier l’interconnexion entre les différents routeurs
ˉ Configurer le protocole GLBP pour optimiser le flux entre ESW3, Niger et Nigeria
ˉ Configurer le protocole GLBP pour optimiser le flux entre ESW4, Niger et Nigeria
ˉ Configurer le DHCP sur le routeur Niger pour que les machines des VLAN puissent obtenir
dynamiquement des adresses IP
ˉ Fixer l’adresse IP 10.16.0.10 sur le Call_manager et l’adresse IP 10.32.0.10 sur le serveur Oracle
ˉ Configurer le protocole HSRP pour le flux entre ESW1, ESW3 et ESW4
ˉ Configurer le protocole HSRP pour le flux entre ESW2, ESW3 et ESW4
ˉ Configurer les VLAN sur le switch ESW 1 qui pourront être attribués dynamiquement aux autres
switch
ˉ Configurer le protocole LACP pour agréger les ports entre les différents switch
ˉ Sécuriser les consoles des routeurs et switch
ˉ Configurer le SSH entre le routeur Niger
ˉ Configurer le NAT dynamique le routeur Niger de telle sorte que les adresses des machines du VLAN
2 puissent être traduites en adresses publiques et vis-versa
ˉ Désactiver les services inutiles sur les routeurs et switch
ˉ Sur les routeurs Niger et Nigeria, écrire une ACL qui autorise le trafic entre le VLAN5 et VLAN4 et
rejette les autres trafics
PARTIE A

ˉ Configuration
Configuration du protocole OSPF sur le routeur Tchad
>enable
#conf t
(config)#int s3/0
(config-if)#ip address 12.0.0.2 255.0.0.0
(config-if)#no shutdown
(config-if)#exit
(config)#router ospf 1
(config-router)#network 12.0.0.0 0.255.255.255 area 0
(config-router)#redistribute connected
(config-router)#end
#copy r s
Configuration des sous-interfaces, OSPF, RIP sur le routeur Niger
>enable
#conf t
(config)#int f0/1
(config-if)#no ip address
(config-if)#no shutdown
(config-if)#exit
(config)#int f0/1.1
(config-subif)#encapsul dot 2
(config-subif)#ip add 10.16.16.1 255.255.240.0
(config-subif)#exit
(config)#int f0/1.2
(config-subif)#encapsul dot 5
(config-subif)#ip add 172.16.32.1 255.255.240.0
(config-subif)#exit
(config)#int f0/0
(config-if)#no ip address
(config-if)#no shutdown
(config-if)#exit
(config)#int f0/0.1
(config-subif)#encapsul dot 3
(config-subif)#ip add 10.16.32.1 255.255.240.0
(config-subif)#exit
(config)#int f0/0.2
(config-subif)#encapsul dot 4
(config-subif)#ip add 172.16.16.1 255.255.240.0
(config-subif)#exit
(config)#router ospf 1
(config-router)#network 12.0.0.0 0.255.255.255 area 0
(config-router)#redistribute connected
(config-router)#redistribute rip
(config-router)#exit
(config)#router rip
(config-router)#network 11.0.0.0
(config-router)#redistribute connected
(config-router)#redistribute ospf 1
config-router)#do copy r s
Configuration des sous-interfaces, EIGRP, RIP sur le routeur Nigeria
>enable
#conf t
(config)#int f0/0
(config-if)#no ip address
(config-if)#no shutdown
(config-if)#exit
(config)#int f0/0.1
(config-subif)#encapsul dot 2
(config-subif)#ip add 10.16.16.2 255.255.240.0
(config-subif)#exit
(config)#int f0/0.2
(config-subif)#encapsul dot 5
(config-subif)#ip add 172.16.32.2 255.255.240.0
(config-subif)#exit
(config)#int f0/1
(config-if)#no ip address
(config-if)#no shutdown
(config-if)#exit
(config)#int f0/1.1
(config-subif)#encapsul dot 3
(config-subif)#ip add 10.16.32.2 255.255.240.0
(config-subif)#exit
(config)#int f0/1.2
(config-subif)#encapsul dot 4
(config-subif)#ip add 172.16.16.2 255.255.240.0
(config-subif)#exit
(config)#router eigrp 1
(config-router)#network 13.0.0.0 0.255.255.255
(config-router)#redistribute connected
(config-router)#redistribute rip
(config-router)#exit
(config)#router rip
(config-router)#network 11.0.0.0
(config-router)#redistribute connected
(config-router)#redistribute eigrp 1
(config-router)#exit
(config)#int s3/0
(config-if)#ip add 13.0.0.1 255.0.0.0
(config-if)#no sh
(config-if)#end
#copy r s
Configuration du protocole EIGRP sur le routeur R2
>enable
#conf t
(config)#int s3/0
(config-if)#ip add 13.0.0.2 255.0.0.0
(config-if)#no sh
(config-if)#exit
(config)#router eigrp 1
(config-router)#network 13.0.0.0 0.255.255.255
(config-router)#redistribute connected
(config-router)#do cop r s
Configuration des VLAN, VTP sur le switch ESW1
>en
#vlan database
(vlan)#vlan 2 name IT
(vlan)#vlan 3 name RH
(vlan)#vlan 4 name MARKETING
(vlan)#vlan 5 name COMPTA
(vlan)#vtp domain ETUDES
(vlan)#vtp password etudes@ne
(vlan)#apply
(vlan)#exit
#show vlan-switch
#config t
(config)#int range f0/2 - 4
(config-range-if)#channel-group 1 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po1
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/5 - 7
(config-range-if)#channel-group 2 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po2
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/8 - 10
(config-range-if)#channel-group 3 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po3
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#
(config)#int range f0/0 - 1
(config-range-if)#switchport mode access
(config-range-if)#no sh
(config-range-if)#exit
(config)#int f0/0
(config-if)#switchport access vlan 3
(config-if)#exit
(config)#int f0/1
(config-if)#switchport access vlan 4
(config-if)#do copy r s
ESW2
>en
#vlan database
(vlan)#vtp client
(vlan)#vtp domain ETUDES
(vlan)#vtp password etudes@ne
(vlan)#apply
(vlan)#exit
#show vlan-switch
#config t
(config)#int range f0/2 - 4
(config-range-if)#channel-group 1 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po1
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/5 - 7
(config-range-if)#channel-group 2 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po2
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/8 - 10
(config-range-if)#channel-group 3 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po3
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#
(config)#int range f0/0 - 1
(config-range-if)#switchport mode access
(config-range-if)#no sh
(config-range-if)#exit
(config)#int f0/0
(config-if)#switchport access vlan 5
(config-if)#exit
(config)#int f0/1
(config-if)#switchport access vlan 2
(config-if)#end
#copy r s
#show vlan-switch
ESW3
>en
#vlan database
(vlan)#vtp client
(vlan)#vtp domain ETUDES
(vlan)#vtp password etudes@ne
(vlan)#apply
(vlan)#exit
#show vlan-switch
#config t
(config)#int range f0/2 - 4
(config-range-if)#channel-group 1 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po1
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/5 - 7
(config-range-if)#channel-group 2 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po2
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/8 - 10
(config-range-if)#channel-group 3 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po3
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#
(config)#int range f0/0 - 1
(config-range-if)#switchport mode trunk
(config-range-if)#no shutdown
(config-range-if)#end
#copy r s
#show vlan-switch
ESW4
>en
#vlan database
(vlan)#vtp client
(vlan)#vtp domain ETUDES
(vlan)#vtp password etudes@ne
(vlan)#apply
(vlan)#exit
#show vlan-switch
#config t
(config)#int range f0/2 - 4
(config-range-if)#no sh
(config-range-if)#channel-group 1 mode on
(config-range-if)#exit
(config)#int po1
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/5 - 7
(config-range-if)#no sh
(config-range-if)#channel-group 2 mode on
(config-range-if)#exit
(config)#int po2
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/8 - 10
(config-range-if)#channel-group 3 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po3
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#
(config)#int range f0/0 - 1
(config-range-if)#switchport mode trunk
(config-range-if)#no shutdown
(config-range-if)#end
#copy r s
#show vlan-switch
Configuration du protocole GLBP sur le routeur Niger
(config)#int f0/1.1
(config-subif)#glbp 1 preempt
(config-subif)#glbp 1 priority 200
(config-subif)#glbp 1 ip 10.16.16.5
(config-subif)#glbp 1 load ro
(config-subif)#exit
(config)#int f0/1.2
(config-subif)#glbp 2 preempt
(config-subif)#glbp 2 priority 200
(config-subif)#glbp 2 ip 172.16.32.5
(config-subif)#glbp 2 load ro
(config-subif)#exit
(config)#int f0/0.1
(config-subif)#glbp 3 preempt
(config-subif)#glbp 3 priority 200
(config-subif)#glbp 3 ip 10.16.32.5
(config-subif)#glbp 3 load ro
(config-subif)#exit
(config-subif)#exit
(config)#int f0/0.2
(config-subif)#glbp 4 preempt
(config-subif)#glbp 4 priority 200
(config-subif)#glbp 4 ip 172.16.16.5
(config-subif)#glbp 4 load ro
(config-subif)#exit
(config-subif)#end
#copy r s
Configuration du protocole GLBP sur le routeur Nigeria
(config)#int f0/0.1
(config-subif)#glbp 1 preempt
(config-subif)#glbp 1 priority 200
(config-subif)#glbp 1 ip 10.16.16.6
(config-subif)#glbp 1 load ro
(config-subif)#exit
(config)#int f0/0.2
(config-subif)#glbp 2 preempt
(config-subif)#glbp 2 priority 200
(config-subif)#glbp 2 ip 172.16.32.6
(config-subif)#glbp 2 load ro
(config-subif)#exit
(config)#int f0/1.1
(config-subif)#glbp 3 preempt
(config-subif)#glbp 3 priority 200
(config-subif)#glbp 3 ip 10.16.32.6
(config-subif)#glbp 3 load ro
(config-subif)#exit
(config-subif)#exit
(config)#int f0/1.2
(config-subif)#glbp 4 preempt
(config-subif)#glbp 4 priority 200
(config-subif)#glbp 4 ip 172.16.16.6
(config-subif)#glbp 4 load ro
(config-subif)#exit
(config-subif)#end
#copy r s
Configuration du DHCP sur le routeur Niger
#conf t
(config)#ip dhcp pool pool101616
(dchp-config)#network 10.16.16.0 255.255.240
(dchp-config)#lease 2
(dchp-config)#default-router 10.16.16.5
(dchp-config)#exit
(config)#ip dhcp pool pool1721632
(dchp-config)#network 172.16.32.0 255.255.240
(dchp-config)#lease 2
(dchp-config)#default-router 172.16.32.5
(dchp-config)#exit
(dchp-config)#exit
(config)#ip dhcp pool pool101632
(dchp-config)#network 10.16.32.0 255.255.240
(dchp-config)#lease 2
(dchp-config)#default-router 10.16.32.5
(dchp-config)#exit
(dchp-config)#exit
(config)#ip dhcp pool pool1721616
(dchp-config)#network 172.16.16.0 255.255.240
(dchp-config)#lease 2
(dchp-config)#default-router 172.16.16.5
(dchp-config)#exit
(config)#ip dhcp excluded-addr 10.16.16.1 10.16.16.10
(config)#ip dhcp excluded-addr 10.16.32.1 10.16.32.10
(config)#ip dhcp excluded-addr 172.16.32.1 172.16.32.10
(config)#ip dhcp excluded-addr 172.16.16.1 172.16.16.10
Configuration du SSH sur le routeur Niger
(config)#line vty 0 4
(config-line)#password etudiant@NE
(config-line)#login local
(config-line)#transport input ssh
(config-line)#exit
(config)#ip domain-name 8.8.8.8
(config)#username etudes passw etude@NE
(config)#enable password etude@NE
(config)#service password-encryption
Configuration du protocole HSRP sur ESW3
(config)#int vlan 2
(config-if)#ip add 10.16.16.4 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 ip 10.16.16.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config)#int vlan 3
(config-if)#ip add 172.16.32.4 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 ip 172.16.32.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config)#int vlan 4
(config-if)#ip add 10.16.32.4 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 ip 10.16.32.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config-if)#exit
(config)#int vlan 5
(config-if)#ip add 172.16.16.4 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 172.16.16.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#end
#cop r s
Configuration du protocole HSRP sur ESW4
(config)#int vlan 2
(config-if)#ip add 10.16.16.6 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 150
(config-if)#standby 1 ip 10.16.16.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config)#int vlan 3
(config-if)#ip add 172.16.32.6 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 150
(config-if)#standby 1 ip 172.16.32.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config)#int vlan 4
(config-if)#ip add 10.16.32.6 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 150
(config-if)#standby 1 ip 10.16.32.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config-if)#exit
(config)#int vlan 5
(config-if)#ip add 172.16.16.6 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 172.16.16.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#end
#cop r s

PARTIE B

Travail demandé :

Utiliser le module telnetlib ou ssh2-python pour auditer :


a. La configuration brève des interfaces des routeurs Niger et Nigeria
b. la sécurité définie au niveau des consoles de tous les équipements du réseau
c. les demandes d’adresses IP au niveau du routeur Niger, qui est un serveur DHCP
d. si les switch clients ont reçu des VLAN
e. les ACL créer sur les routeurs Niger et Nigeria
f. les interfaces virtuelles définies grâce au protocole GLBP sur les routeurs Niger et Niger
Exercice 2

Sujet 2

Utiliser python pour configurer les points suivants :

Vous pouvez utiliser le module de votre choix [ssh2-python, netmiko, paramiko, fabric, telnetlib,….]

Objectif : assurer l’interconnexion des équipements de la topologie ci-dessus.

ˉ Définir une liaison entre le routeur Tenere et votre machine physique


ˉ Définir une liaison WIFI avec le routeur Air
ˉ Configurer le VPN entre R3 et R4
ˉ Configurer le NAT dynamique sur le routeur Air de telle sorte que les adresses IP des machines du
VLAN 2 puissent être traduites en adresses IP publiques
ˉ Configurer le routage inter VLAN
ˉ Configurer le protocole VRRP entre les switch et les routeurs
ˉ Configurer le protocole GLBP entre les switch
ˉ Attribuer des adresses IP statiques su les serveurs des VLAN3 et VLAN4
ˉ Configurer le DHCP sur le routeur Air et sur le routeur Tenere
ˉ Configurer le LACP entre les switch ESW4 et ESW5
ˉ Sécuriser les routeurs et switch
ˉ Désactiver les services inutiles sur les routeurs et switch
Supperposer les protocoles

Lister les champs d’un paquets


Première couche avec un champ dst, i.e. Ether

accès explicite au champ dst de la couche IP

un champ peut contenir plusieurs valeurs

Avec tuple

Avec liste

Interaction avec le réseau

ˉ la fonction sr1() envoie un paquet et reçoit une réponse


ˉ Scapy sait associer réponse et question
CAS PRATIQUES
PARTIE 1 : CRYPTOGRAPHIE
PARTIE 2 : AUTOMATISATION DE CONFIGURATION DE RESEAUX
Exerice 1
import psycopg2 as P, sqlite3 as S
cnS=S.connect('C:/iut/haraka.db')
cnP=P.connect("host='127.0.0.1' user='ben' dbname='haraka'
password='ben'")
crP=cnP.cursor()
crS=cnS.cursor()

crS.execute('SELECT * FROM client')


d=crS.fetchall()
for d in d:
try:
print('[+] Enregistrement PostgreSQL ...')
crP.execute('''INSERT INTO client VALUES('%s','%s','%s') '''
%(d[0],d[1],d[2]))
cnP.commit()
except Exception as e:
raise e

import psycopg2 as P, sqlite3 as S


cnS=S.connect('C:/iut/haraka.db')
cnP=P.connect("host='127.0.0.1' user='ben' dbname='haraka'
password='ben'")
crP=cnP.cursor()
crS=cnS.cursor()

crS.execute('SELECT * FROM client')


d=crS.fetchall()
for d in d:
try:
print('[+] Enregistrement PostgreSQL ...')
crP.execute('''INSERT INTO client VALUES('%s','%s','%s') '''
%(d[0],d[1],d[2]))
cnP.commit()
except Exception as e:
raise e
PARTIE 3 : GESTION DE BASE DE DONNEES
Activité 3 : Oracle

CANDIDAT ELECTEUR
1,N VOTER 1,N
numCandidat numElecteur REGION
Voix
nomCandidat nomElecteur numRegion
Jour
prenomCandidat Procuration prenomElecteur region
INSCRIRE 1,N
date_naissCandidat dateNaissElecteur
lieuNaissCandidat 1,N genreElecteur
genreCandidat numPiece
1,N 1,N POSSEDER
1,1 BUREAU
1,1 1,1
numBureau AVOIR
ETRE APPARTENIR 1,1

1,N 1,N DEPARTEMENT


1,N 1,N
TYPECANDIDAT COMMUNE 1,1 POSSEDER1
numDepartement
PARTI
idType numCommune
departement
NumParti Commune
type
nomParti
1. Importation de données

2. Exporation des données des tables dans différents fichiers

Exportation de données de tables dans de fichiers différents en fonction du temps


Importation de données d’un fichier CSV dans une table

Cryptage de données
A. A partir des fichiers CSV
B. A partir des tables

Création de comptes
Création d’utilisateurs

Gestion des rôles et profiles


Cryptage de données dans des fichiers CSV
TD 2 sur les bases de données

192.168.10/24
.93
PostgreSQL

.92
MySQL

.91
Création des tables sous le serveur MySQL Oracle
Création des tables sous PostgreSQL

Creation des tables electeur, candidat et vote sur Oracle


Exerice 1
Objectif : Migrer les donnees du serveur Oracle vers le serveur distant PostgreSQL

Exerice 2
Objectif : migrer les données des tables candidat, electeur et vote du serveur MySQL vers celles du serveur
PostgreSQL.
Le script s’exécute sur la machine cliente
Exercice : Migration de données SQL vers NoSQL, cas de MySQL vers MongoDB

192.168.1.0/24

.93 .1 { }

MongoDB
MySQL
import pymysql as M
from pymongo import MongoClient as Mg
from sshtunnel import SSHTunnelForwarder as F
cnS=F(('192.168.1.93',22),ssh_username="root",ssh_password="6858",remote_bind_address=("loc
alhost",3306))
cnS.start()
print(cnS.local_bind_port)
cnMg=Mg("localhost:27017")
col=cnMg["bk"]["mouvement"]
cnL=M.connect(host='localhost',
port=cnS.local_bind_port,user='root',password='mysql',database='bk')
crL=cnL.cursor()
crL.execute("SELECT SUM(cd-db) solde,idct FROM mouvement GROUP BY idct")
for l in crL.fetchall():
col.insert_one({"compte":l[1],"solde":int(l[0])})

cnL.close()
cnS.close()
Exercice : Centraliser les données des serveurs distants MySQL et PostgreSQL dans le serveur MongoDB

{ }
MongoDB
MySQL .1
.92
PostgreSQL
.93

import pymysql as M,psycopg2 as P


from pymongo import MongoClient as Mg
from sshtunnel import SSHTunnelForwarder
cnL=Mg("localhost:27017")
col=cnL['vente']['vente']
def migration():
v=[['192.168.1.92','root',3306,'mysql'],['192.168.1.93','postgres',5432,'6858']]
for l in v:
cnS=SSHTunnelForwarder((l[0],22),ssh_username='root',ssh_password='6858',remote_bin
d_address=('localhost',l[2]))
cnS.start()
port=cnS.local_bind_port
if l[2] == 3306:
cn=M.connect(host='localhost',
port=port,user=l[1],password=l[3],database='affaires')
elif l[2] == 5432:
cn=P.connect(host='localhost',
port=port,user=l[1],password=l[3],database='affaires')
cr=cn.cursor()
cr.execute("SELECT jr,montant FROM commande")
for x in cr.fetchall():
col.insert_one({"jr":str(x[0]),"montant":int(x[1])})
cnS.close()
cn.close()

Exercice

import psycopg2 as P, cx_Oracle as O


cnO=O.connect('ben/[email protected]/XE')
p={'host':'127.0.0.1','user':'ben','dbname':'haraka','password':'ben'}
cnP=P.connect(**p)
crP=cnP.cursor()

crO=cnO.cursor()
crO.execute('SELECT debit,credit,jour,idc FROM mouvement')
d=crO.fetchall()
for d in d:
print(d)
crP.execute('''INSERT INTO mouvement(debit,credit,jour,idc)
VALUES(%s,%s,'%s',%s)''' %(d[0],d[1],d[2],d[3]))
cnP.commit()
Exercice

import cx_Oracle as O,pymysql as M,psycopg2 as P,pyodbc as A,sqlite3 as S


from time import strftime, gmtime
cnA=A.connect(r'Driver={Microsoft Access Driver (*.mdb,
*.accdb)};DBQ=C:\\pysec\\db.accdb;')
cnO=O.connect('ben/[email protected]/XE')
cnP=P.connect("host='127.0.0.1' user='ben' dbname='haraka' password='ben'")
cnM=M.connect(host='127.0.0.1', user='root', db='haraka', password='')
cnS=S.connect('C:/iut/haraka.db')
crP=cnP.cursor()
crA=cnA.cursor()
crO=cnO.cursor()
crM=cnM.cursor()
crS=cnS.cursor()
table=['client','mouvement']
for t in table:
with open('C:\\pysec\\'+strftime('%d-%m-%Y',gmtime())+'db_pg_%s.txt' %t,'a') as f:
crP.execute('SELECT * FROM %s'%t)
d=crP.fetchall()
f.write(str(d))
with open('C:\\pysec\\'+strftime('%d-%m-%Y',gmtime())+'db_ora_%s.txt' %t,'a') as f:
crO.execute('SELECT * FROM %s'%t)
d=crO.fetchall()
f.write(str(d))
with open('C:\\pysec\\'+strftime('%d-%m-%Y',gmtime())+'db_my_%s.txt' %t,'a') as f:
crM.execute('SELECT * FROM %s'%t)
d=crM.fetchall()
f.write(str(d))
with open('C:\\pysec\\'+strftime('%d-%m-%Y',gmtime())+'db_my_%s.txt' %t,'a') as f:
crS.execute('SELECT * FROM %s'%t)
d=crS.fetchall()
f.write(str(d))

Exercice

import cx_Oracle as O, psycopg2 as P, csv


from sshtunnel import SSHTunnelForwarder as F
o=['192.168.16.20','system','exam2020','1521','business']
oo=['192.168.16.36','system','exam2020','1521','business']
p['192.168.16.33','postgres','exam2020','5432','business']
#-------------Acces SSH pour PostgreSQL 192.168.1.33
cnSSHp=F((p[0],22),ssh_username=p[1],ssh_password=p[2],remote_bind_address=('localhost',int
(p[3])))
cnSSHp.start()
cnLlocalp=P.connect(host=p[0],user=p[1],dbname=p[4],password=p[2],port=cnSSHp.local_bind_po
rt)
crLocalp=cnLocalp.cursor()
#-------------------Acces SSH pour Oracle 192.168.1.20
cnSSHo=F((o[0],22),ssh_username=o[1],ssh_password=o[2],remote_bind_address=('localhost',int
(o[3])))
cnSSHo.start()
#-------------------Pour Oracle 192.168.1.36
cnSSHoo=F((oo[0],22),ssh_username=oo[1],ssh_password=oo[2],remote_bind_address=('localhost'
,int(oo[3])))
cnSSHoo.start()
#Connexion a la base de donnees Oracle distante
cnLocalo=O.connect(o[1]+'/'+o[2]+'@'+o[0]+'/'+o[4],port=cnSSHo.local_bind_port)
crLocalo=cnLocalo.cursor()
cnLocaloo=O.connect(oo[1]+'/'+oo[2]+'@'+oo[0]+'/'+oo[4],port=cnSSHoo.local_bind_port)
crLocaloo=cnLocaloo.cursor()
print('[+] Oracle(192.168.16.20) vers Oracle(192.168.16.36) ...')
#Exportation de donnees Oracle dans un fichier
crLocalo.execute("exp %s/%s file=/home/oracle/base_%s.sql"%(o[1],o[2],o[4]))
#Importation de donnees dans la base de donnees du serveur 192.168.1.36
crLocaloo.execute("imp %s/%s file=/home/oracle/base_%s.sql full=y"%(oo[1],oo[2],oo[4]))
cnLocaloo.commit()

#Replication de donnees de Oracle distant vers Postgres distant


print('[+] Oracle(192.168.16.20) vers postgreSQl(192.168.16.33) ...')
table=['client','forfait','abonner']
for t in tables:
crLocalo.execute("SELECT * FROM %s"%t)
with open("%s.csv",'a') as f:
e=csv.writer(f,delimer=';')
for d in crLocalo.fetchall():
e.writerow(str(d))
crLocalp.execute("copy %s FROM %s delimiter ';'"%(t,t))
cnLlocalp.commit()

cnLlocalp.close()
cnLlocaloo.close()
cnLlocalo.close()
cnSSHoo.close()
cnSSHp.close()
cnSSHo.close()

Exercice

import cx_Oracle as O, psycopg2 as P, csv


from sshtunnel import SSHTunnelForwarder as F
#Connexion aux serveurs distants via le module sshtunnel
x=['192.168.16.21','postgres','exam2020','5432','business']
y=['192.168.16.33','postgres','exam2020','5432','business']
cnSSHx=F((x[0],22),ssh_username=x[1],ssh_password=x[2],remote_bind_address=('localhost',int
(x[3])))
cnSSHx.start()
cnSSHy=F((y[0],22),ssh_username=y[1],ssh_password=y[2],remote_bind_address=('localhost',int
(y[3])))
cnSSHy.start()
#Connexion aux bases de donnees des serveurs distants grace a la redirection de ports
cnLocalx=P.connect(host=x[1],user=x[1],password=x[2],dbname=x[4],port=cnSSHx.local_bind_por
t)
crLocalx=cnLocalx.cursor()
cnLocaly=P.connect(host=y[1],user=y[1],password=y[2],dbname=y[4],port=cnSSHy.local_bind_por
t)
crLocaly=cnLocaly.cursor()
table=['client','forfait','abonner']
for t in table:
crLocalx.execute("SELECT * FROM %s"%t)
d=crLocalx.fetchall()
if d:
with open('%s.csv'%t,'a') as f:
e=csv.writer(f,delimiter=';')
for d in d:
e.writerow(d)
#Chargement de donnees dans chaque table du serveur 192.168.1.33
crLocaly.execute("copy %s FROM %s.csv delimiter ';'"%(t,t))
cnLocaly.commit()
cnLocaly.close()
cnLocalx.close()
cnSSHy.close()
cnSSHx.close()

Exercice

# METHODE 1
import os
import cx_Oracle as O, psycopg2 as P, csv
from sshtunnel import SSHTunnelForwarder as F
parametre=[['192.168.16.19','system','exam2020','1521','business'],
['192.168.16.20','system','exam2020','1521','business'],
['192.168.16.21','postgres','exam2020','5432','business']]
for p in parametre:
cnSSH=F((p[0],22),ssh_username=p[1],ssh_password=p[2],remote_bind_address=('localhost',
int(p[3])))
cnSSH.start()
if p[3]=='1521':
cnLocal=O.connect(p[1]+'/'+p[2]+'@'+p[0]+'/'+p[4],port=cnSSH.local_bind_port)
crLocal=cnLocal.cursor()
table=['client','forfait','abonner']
for t in table:
with open('/home/oracle/%s_.csv'%(t,p[0]),'a') as f:
dl=csv.writer(f,delimiter=';')
crLocal.execute("SELECT * FROM %s"%t)
d=crLocal.fetchall()
for d in d:
dl.writerow(str(d))
os.system("cd /home;scp -r oracle [email protected]:/home/Backup_oracle")
elif p[3]=='5432':
cnLocal=P.connect(host=p[1],user=p[1],password=p[2],dbname=p[4],port=cnSSH.local_bi
nd_port)
crLocal=cnLocal.cursor()
table=['client','forfait','abonner']
for t in table:
with open('/home/postgres/%s.csv'%(t,p[0]),'a') as f:
dl=csv.writer(f,delimiter=';')
crLocal.execute("SELECT * FROM %s"%t)
d=crLocal.fetchall()
for d in d:
dl.writerow(str(d))
os.system("cd /home;scp -r postgres [email protected]:/home/Backup_postgres")

Exercice
Soit la structure de la base de données de gestion de ventes
commande(idc,jour, total)
ligne(idl,qte,prix,#idc)

Reseau:192.168.56.0/24

.1 .102

from sshtunnel import SSHTunnelForwarder as F


import pymysql as M
cnF=F(('192.168.56.102',22),ssh_username='root',ssh_password='6858',remote_bind_address=('l
ocalhost',3306))
cnF.start()
cnL=M.connect(host='localhost',
port=cnF.local_bind_port,user='root',password='mysql',database='commerce')
crL=cnL.cursor()
#---------------------------------------------------------------------------------
cnLoc=M.connect(host='localhost',user='root',password='',database='commerce')
crLoc=cnLoc.cursor()
for t in ['commande','ligne']:
crLoc.execute("SELECT * FROM %s"%t)
for l in crLoc.fetchall():
if t == 'commande':
crL.execute("INSERT INTO %s VALUES(%s,'%s',%s)"%(l[0],l[1],l[2]))
else:
crL.execute("INSERT INTO %s VALUES(%s,%s,%s,%s)"%(l[0],l[1],l[2],l[3]))
cnL.commit()

cnF.close()
cnL.close()

Exerice
) Ecrire un script Shell Linux ou Python qui permet de vérifier si les services mysql, nginx
sont actifs. Au cas où un service est inactif alors alerter l’administrateur

import os
service=['mysql','nginx']
for s in service:
if os.system("systemctl is-active %s"%s):
print(s,'est actif')
else:
print(s,"n'est pas actif")

use autre façon

import os
from datetime import datetime as D
D=str(D.now().date())
service=['mysql','nginx']
r=open("resultat.txt","a")
for s in service:
if not os.system("systemctl is-active %s"%s):
r.write("%s %s n'est pas actif"%(D,s))

Exercice : Creation des utilisateurs sous Oracle

import cx_Oracle as O
cn=
cr=
with open('util.csv') as f:
for ligne in f:
x=ligne.split(';')
cr.execute('''CREATE USER '%s' IDENTIFIED BY '%s' DEFAULT TABLESPACE '%s'
QUOTA '%s' ON '%s' ACCOUNT '%s'
''') %(x[0],x[1],x[2],x[3],x[2],x[4])
cr.commit()

Exercice: Creation des utilisateurs sous PostgreSQL

import psycopg2 as P
cnP=P.connect("host='127.0.0.1' user='ben' dbname='haraka' password='ben'")
crP=cnP.cursor()
with open('C:\\listUser.txt') as f:
for l in f:
l=l.split(';')
crP.execute('''CREATE USER %s WITH LOGIN CONNECTION LIMIT %s
ENCRYPTED PASSWORD %s VALID UNTIL %s''' %(l[0],l[1],l[2],l[3]))
cnP.commit()

Exercice

import pyodbc as A, pymysql as M,cx_Oracle as O,psycopg2 as P,sqlite3 as S


from time import strftime,gmtime
cnA=A.connect(r'Driver={Microsoft Access Driver (*.mdb,
*.accdb)};DBQ=C:\\pysec\\db.accdb;')
cnO=O.connect('ben/[email protected]/XE')
cnP=P.connect("host='127.0.0.1' user='ben' dbname='haraka' password='ben'")
cnM=M.connect(host='127.0.0.1', user='root', db='haraka', password='')
cnS=S.connect('C:/iut/haraka')
crP=cnP.cursor()
crA=cnA.cursor()
crO=cnO.cursor()
crM=cnM.cursor()
crS=cnS.cursor()
jr=strftime('%Y-%m-%d',gmtime())
#--------------------------------SQLite --> Oracle
crS.execute('''SELECT * FROM mouvement WHERE jour=?''',[jr])
d=crS.fetchall()
for d in d:
jr=strftime('%d-%b-%y',gmtime())
try:
print('[+] Enregistrement SQLite--> ORACLE ...')
crO.execute("INSERT INTO mouvement VALUES('%s','%s','%s','%s') "
%(d[0],d[1],[jr],d[3]))
cnO.commit()
except Exception as e:
pass
#----------------------------------MySQL --> Oracle
crM.execute("SELECT * FROM mouvement WHERE jour='%s'" %jr)
d=crM.fetchall()
for d in d:
jr=strftime('%d-%b-%y',gmtime())
try:

print('[+] Enregistrement MySQL --> ORACLE ...')


crO.execute("INSERT INTO mouvement VALUES('%s','%s',%s,'%s') "
%(d[1],d[2],jr,d[4]))
cnO.commit()
except Exception as e:
pass

Exercice: Création de plusieurs rôles

import cx_Oracle as O
cn=O.connect('system/[email protected]/gestiondiplome')
cr=cn.cursor()
with open('util.csv') as f:
for ligne in f:
x=ligne.split(';')
cr.execute('''CREATE role '%s''' %(x[0]))
i=x[2].split(',')
for k in i:
cr.execute("GRANT '%s' on '%s' to '%s' " %(x[1],k,x[0]))
cr.commit()

Exercice : charger le contenu d’un fichier dans une table d’une base de données sous Oracle
import cx_Oracle as O
cnO=O.connect('system/[email protected]/orcl')
crO=cnO.cursor()
with open('ajouter.csv','r') as f:
for ligne in f:
l=ligne.split(';')
crO.execute("INSERT INTO etudiant VALUES(%s,'%s')"%(l[0],l[1]))
cnO.commit()
cnO.close()

Exercice : Exporter le contenu d’une table d’une base de données Oracle vers un fichier csv

import cx_Oracle as O,csv


cnO=O.connect('system/[email protected]/orcl')
crO=cnO.cursor()
with open('etd.csv','w') as f:
e=csv.writer(f,delimiter=';')
crO.execute("SELECT * FROM etudiant WHERE ide<5")
for x in crO.fetchall():
e.writerow(x)
cnO.close()

Exercice: Exporter le contenu d’une table Oracle vers PostgreSQL, sur le serveur local

import cx_Oracle as O,psycopg2 as P


cnO=O.connect('system/[email protected]/orcl')
cnP=P.connect(user='postgres',database='postgres',password='ben')
crO=cnO.cursor()
crP=cnP.cursor()
crO.execute("SELECT * from etudiant")
for x in crO.fetchall():
crP.execute("INSERT INTO etudiant VALUES(%s,'%s')"%(x[0],x[1]))
cnP.commit()
cnP.close()
cnO.close()
Exercice : Saisir les donnees a inserer dans la table filiere. Faites marcher ce code
Create table filiere(id int primary key auto_increment,filiere varchar(25) not null unique,cycle int(1) not null,
constraint ckCycle check(cycle in (1,2)))

import pymysql as P
cn=P.connect(host='127.0.0.1',user='root',db='iut',password='')
cr=cn.cursor()
f=input("Entrer la filiere: ")
c=input("Entrer le cycle [1,2]: ")
if f is not None and f.isalpha():
if int(c) in (1,2):
try:
cr.execute('INSERT INTO filiere(filiere,cycle) values(%s,%s)' %(f,c))
cn.commit()
except:
cn.rollback()
cr.execute('SELECT * FROM filiere')
d=cr.fetchall()
for d in d:
print(d)

Exercice : corriger ce script

import cx_Oracle as O
import csv
cnO=O.connect("system/motTpass@localhost/orcl")
crO=cnO.cursor()
class insertion:
def __init__(self,f):
self.f=f
def ajoutAgence(self):
with open(self.f) as fich:
for ligne in fich:
l=ligne.split(';')
crO.execute("INSERT INTO agence
VALUES(%s,'%s','%s','%s')"%(l[0],l[1],l[2],l[3]))
cnO.commit()
def ajoutAgent(self):
with open(self.f) as fich:
for ligne in fich:
l=ligne.split(';')
crO.execute("INSERT INTO agent
VALUES(%s,'%s','%s',%s,%s)"%(l[0],l[1],l[2],l[3],l[4]))
cnO.commit()
def ajoutExped(self):
with open(self.f) as fich:
for ligne in fich:
l=ligne.split(';')
crO.execute("INSERT INTO expediteur
VALUES(%s,'%s','%s',%s)"%(l[0],l[1],l[2],l[3]))
cnO.commit()
def transfert(self):
with open(self.f) as fich:
for ligne in fich:
l=ligne.split(';')
crO.execute("INSERT INTO transfert
VALUES(%s,'%s','%s','%s','%s',%s,'%s','%s','%s',%s,%s,%s,%s)"%(l[0],l[1],l[2],l[3],l[5],l[6
],l[7],l[8],l[9],l[10],l[11],l[12]))
cnO.commit()
class exporter:
def __init__(self,t):
self.t=t
def Exporter(self):
with open("%s.csv"%self.t,'a') as f:
fich=csv.writer(f,delimiter=";")
crO.execute("SELECT * FROM %s"%self.t)
for l in crO.fetchall():
fich.writerow(l)
class cloner:
def Clonner(self,b1,b2,t):
crO.execute("SELECT COUNT(*) nbre FROM %s.%s"%(b2,t))
d=crO.fetchall()
if int(d[0][0])>0:
crO.execute("SELECT * FROM %s.%s"%(b2,t))
d1=crO.fetchall()
for l in d1:
crO.execute("INSERT INTO ")
crO.execute("CREATE TABLE IF NOT EXISTS %s.%s AS SELECT * FROM
%s.%s"%(b2,t,b1,t))
cnO.commit()
#T=exporter('transfert')
#T.Exporter()

Exercice

import cx_Oracle as O, pymysql as M,psycopg2 as P


from sshtunnel import SSHTunnelForwarder as F
class connecter:
def __init__(self,a,u,m,p):
self.a,self.u,self.p,self.m=a,u,p,m
def accesDistant(self):
cn=F((self.a,22),ssh_username=self.u,ssh_password=self.m,remote_bind_address=("loca
lhost",self.p))
cn.start()
return cn.local_bind_port
def accesLocalPMO(self,e:int,db,p):
if e == 0:
cnL=M.connect(host="localhost",user=self.u,password=self.m,database=db,port=p)
elif e == 1:
cnL=P.connect(host="localhost",user=self.u,password=self.m,database=db,port=p)
elif e == 2:
cnL=O.connect(self.u+'/'+self.m+'@'+self.a+'/'+db)
cr=cnL.cursor()
return cr
class operation:
def __init__(self,cr,crO):
self.cr=cr
self.crO=crO
def migrer(self):
self.cr.execute('''SELECT numCompte,nomCompte,dateCreation,
nature,dateOp,montant,caution,affaire,typeService
FROM operation O, service S,affaire A,compte C
WHERE O.numCompte=C.numCompte AND A.idAffaire=O.idAffaire
AND S.idService=O.idService ''')
for l in self.cr.fetchall():
self.crO.execute('''INSERT INTO operation
VALUES(seqOp.next,utl_raw.cast_to_raw('{"numCompte":%s,"nomCompte":%s,"date
Creation":%s,
"operation":[{"nature":%s,"dateOp":%s,"montant":%s,
"natureFonds":%s,"devise":%s,"affaire":%s,"typeService":%s}]}')
''')

Exercice

import cx_Oracle as O, pymysql as M,psycopg2 as Pg


from sshtunnel import SSHTunnelForwarder as F
class connecter:
def __init__(self,a,u,m,p):
self.a,self.u,self.p,self.m=a,u,p,m
def accesDistant(self):
cn=F((self.a,22),ssh_username=self.u,ssh_password=self.m,remote_bind_address=("loca
lhost",self.p))
cn.start()
return cn.local_bind_port
def accesLocalPM(self,e:int,db,p):
if e == 0:
cnL=M.connect(host="localhost",user=self.u,password=self.m,database=db,port=p)
elif e == 1:
cnL=Pg.connect(host="localhost",user=self.u,password=self.m,database=db,port=p)
return cnL.cursor()

class operation:
def __init__(self,cr):
self.cnO=O.connect("system/ben@localhost:1521/XE")
self.crO=self.cnO.cursor()
self.cr=cr

def migrer(self):
self.cr.execute('''SELECT C.numCompte,nomCompte,dateCreation,
nature,dateOp,montant,naturefonds,affaire,typeService
FROM operation O, service S,affaire A,compte C
WHERE O.numCompte=C.numCompte AND A.idAff=O.idAff
AND S.idService=O.idService ''')

for l in self.cr.fetchall():
self.crO.execute('''INSERT INTO operation
VALUES(seqOp.nextval,utl_raw.cast_to_raw('
{"numCompte":"%s","nomCompte":"%s", "dateCreation":"%s",
"operation":[
{"nature":"%s","dateOp":"%s","montant":"%s",
"natureFonds":"%s","affaire":"%s","typeService":"%s"
}
]
}
')
)'''%(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8]))
print('Operation realisee avec succes')
self.cnO.commit()

#con=connecter('192.168.56.106','ben','ben',3306)
con=connecter('192.168.56.106','ben','ben',5432)
P=con.accesDistant()
#L=con.accesLocalPM(0,"cdc",P) #MySQL
L=con.accesLocalPM(1,"cdc",P) #PostgreSQL
op=operation(L)
op.migrer()

Structure de la base de donnees

-------- Creation de la table operation


create table operation(
id NUMBER NOT NULL primary key,
operation BLOB NOT NULL
)
--- Accepter uniquement les donnees json
ALTER TABLE operation ADD constraint ckOp CHECK(operation is JSON);
---------- Creation de sequence
CREATE SEQUENCE seqOp START WITH 1;
------------
donnees='{"num_compte":1,"nomCompte":"Hadjara",
"dateCreation":"2020-04-13 10:17:09","operation":
[{"nature":"credit",
"dateOp":"2021-03-09 11:34:06",
"montant":75000,"natureFonds":
"Caution","devise":"XOF",
"affaire":"MPC/X","typeService":"scaj"},
{"nature":"credit",
"dateOp":"2021-04-01 16:15:13",
"montant":200000,"natureFonds":
"Caution","devise":"XOF",
"affaire":"MPC/X","typeService":"scaj"},
{"nature":"credit",
"dateOp":"2021-06-15 09:30:02",
"montant":50000,"natureFonds":
"Caution","devise":"XOF",
"affaire":"MPC/X","typeService":"scaj"},
]}'
INSERT INTO operation VALUES(seqOp.nextVal,donnees);

-------------------MySQL

CREATE TABLE operation(idOp int primary key auto_increment,


nature VARCHAR(25) NOT NULL,
dateOp TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
montant INT NOT NULL,device VARCHAR(15) NOT NULL, caution VARCHAR(50),
numCompte INT NOT NULL,idAff INT NOT NULL,idService INT NOT NULL);
CREATE TABLE compte(numCompte INT NOT NULL primary key auto_increment,
nomCompte VARCHAR(45) NOT NULL,
dateCreation TIMESTAMP DEFAULT CURRENT_TIMESTAMP());
CREATE TABLE affaire(idAff INT NOT NULL primary key auto_increment,
affaire VARCHAR(50) NOT NULL);

CREATE TABLE service(idService INT NOT NULL primary key auto_increment,


typeService VARCHAR(50) NOT NULL);
-----Creation des contraintes
ALTER TABLE operation ADD constraint fknc FOREIGN KEY(numCompte) REFERENCES
compte(numCompte);
ALTER TABLE operation ADD constraint fkaf FOREIGN KEY(idAff) REFERENCES affaire(idAff);
ALTER TABLE operation ADD constraint fkser FOREIGN KEY(idService) REFERENCES
service(idService);

-------------------PostgreSQL

CREATE TABLE operation(idOp SERIAL primary key,


nature VARCHAR(25) NOT NULL,
dateOp TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
montant INTEGER NOT NULL,device VARCHAR(15) NOT NULL, caution VARCHAR(50),
numCompte INTEGER NOT NULL,idAff INTEGER NOT NULL,idService INT NOT NULL);
CREATE TABLE compte(numCompte SERIAL NOT NULL primary key ,
nomCompte VARCHAR(45) NOT NULL,
dateCreation TIMESTAMP DEFAULT CURRENT_TIMESTAMP());
CREATE TABLE affaire(idAff SERIAL NOT NULL primary key,
affaire VARCHAR(50) NOT NULL);

CREATE TABLE service(idService SERIAL NOT NULL primary key,


typeService VARCHAR(50) NOT NULL);
-----Creation des contraintes
ALTER TABLE operation ADD constraint fknc FOREIGN KEY(numCompte) REFERENCES
compte(numCompte);
ALTER TABLE operation ADD constraint fkaf FOREIGN KEY(idAff) REFERENCES affaire(idAff);
ALTER TABLE operation ADD constraint fkser FOREIGN KEY(idService) REFERENCES
service(idService);

Exercice: Migration Oracle vers Oracle NoSQL

#{'note':5.75,'coef':4,'matiere':'BDD','jour':'2021-02-12','matricule':152}
import cx_Oracle as O
cn=O.connect("system/[email protected]/orcl")
cr=cn.cursor()
cr.execute("SELECT note,ceoff,matiere,jour,matricule FROM etudiant E,matiere M, noter N
WHERE E.ide=N.ide and N.idm=M.idm")
for l in cr.fetchall():
cr.execute('''INSERT INTO noSQL.noter VALUES(seqOp.nextval,utl_raw.cast_to_raw('
{"note":"%s","coeff":"%s","matiere":"%s","jour":"%s","matricule":"%s"}')
)'''%(l[0],l[1],l[2],l[3],l[4]))
cn.commit()

PARTIE 4 :
TD1 : Gestion des diplomes
Voici un extrait de la base de donnees de gestion des diplôme

d=[
{'id':1,'nom':'Moussa','prenom':'Ali','genre':'M','nationalite':'nigerienne','dateNaiss':'1
998-05-14','lieuNaiss':'Dosso',
'diplome':[{'codeDipl':5211,'domaine':'Mathematique','obtenu':'2018-04-
12','niveau':'Licence','etab':'UAM'},
{'codeDipl':1231,'domaine':'Mathematique','obtenu':'2021-07-
13','niveau':'Master','etab':'UAM'},
]},

{'id':2,'nom':'Jika','prenom':'Dodo','genre':'M','nationalite':'nigerienne','dateNaiss':'19
95-05-14','lieuNaiss':'Miriah',
'diplome':[{'codeDipl':5001,'domaine':'Informatique','obtenu':'2017-08-
12','niveau':'Licence','etab':'UZ'}
]},
{'id':3,'nom':'Habibou','prenom':'Aminatou','genre':'F','nationalite':'nigerienne','dateNai
ss':'1999-075-18','lieuNaiss':'Agadez',
'diplome':[{'codeDipl':6211,'domaine':'Marketing','obtenu':'2019-04-
12','niveau':'Licence','etab':'IUT Tahoua'},

Travail demande
1. Donner le nombre de diplômes de licence obtenu par les filles en 2019
2. Donner le nombre de diplômes attribué par établissement en 2020
3. Donner le nombre de diplômes attribué par année, de 2016 à 2020
4. Donner le nombre de diplômes par domaine attribué pour une année de votre choix
5. Donner le pourcentage de diplômes attribué par établissement pour une année de votre choix
6. Donner l’établissement qui a plus attribué de diplômes pour une année de votre choix
7. Donner le pourcentage de diplômes attribué par genre pour une année de votre choix

TD2 : Gestion de recrutements de diplômés


Voici un extrait de base de données de recrutement de diplômés

r=[{"code":"1","nom":"AK","prenom":"AB","dateNaiss":"12/05/1977","lieuNaiss":"L1","national
ite":"nigerienne","genre":"M","contrat":"CDI","employeur":"SemiPublic","diplome":"Licence",
"domaine":"Informatique","annee":"2015","nature":"General","salaireBase":"123206","etat":"l
icencie","loacalite":"Agadez"}
1) le nombre de diplômés recrutés par an (ok)
2) le nombre de diplômés recrutés par an et par domaine
3) le nombre de diplômés recrutés par mois et par domaine
4) le nombre de diplômés recrutés par an, domaine et par genre
5) pourcentage de diplômés recrutés par nature (general/prof) par an
6) diplômés recrutés par CDI ou CDD par an ou par mois
TD 3:
Exercice 1 : gestion de resultats du Bac
 voir le fichier joint qui contient la base de données(format json)
Questionnaire
1)lister les candidats de la série D

Utilisation du module tabulate

2)lister les candidates de la serie C


3) donner la somme des coefficients et le nombre de matieres composees en serie C

from bac import r


def somCoeffNbrMat(s):
i=0
Som=0
for x in r:
if x['serie'] == s:
for y in x['note']:
i+=1
Som+=y['coef']
break
return s,i,Som
for s in ['A','C','D','E']:
print(somCoeffNbrMat(s))

4) donner le nombre de candidats par série

#4) donner le nombre de candidats par serie


from bac import r
def nbrCandSerie(s):
i=0
for x in r:
if x['serie'] == s:
i+=1
return s,i
for s in ['A','C','D','E']:
print(nbrCandSerie(s))

5)donner le nombre de candidates par serie

#4) donner le nombre de candidats par serie


from bac import r
def nbrCandSerie(s):
i=0
for x in r:
if x['serie'] == s and x['genre'] =='F':
i+=1
return s,i
for s in ['A','C','D','E']:
print(nbrCandSerie(s))

6) donner le pourcentage des candidates de la serie D

#4) donner le nombre de candidats par serie


from bac import r
def PrCandSerie(s):
i=j=0
for x in r:
i+=1
if x['serie'] == s:
j+=1
if i:
return s,round(j*100/i,2)
for s in ['A','C','D','E']:
print(PrCandSerie(s))
7) donner le pourcentage des candidates par serie

#4) donner le nombre de candidats par serie


from bac import r
def PrCandSerie(s):
i=j=0
for x in r:
if x['genre'] == 'F':
i+=1
if x['serie'] == s:
j+=1
if i:
return s,round(j*100/i,2)
for s in ['A','C','D','E']:
print(PrCandSerie(s))

8) donner la serie ou il ya plus de candidats

from bac import r


def nbrCandSerie(s):
i=0
for x in r:
if x['serie'] == s:
i+=1
return s,i
def trouveMax():
L=[]
for s in ['A','C','D','E']:
L.append(nbrCandSerie(s))
v=[]
for y in L:
v.append(y[1])
mx=max(v)
for x in L:
if x[1]==mx:
return x

print(trouveMax())

9) donner les deux premieres series ou il ya plus de candidats

from bac import r


def nbrCandSerie(s):
i=0
for x in r:
if x['serie'] == s:
i+=1
return s,i
def trouveMax():
L=[]
for s in ['A','C','D','E']:
L.append(nbrCandSerie(s))
v=[]
for y in L:
v.append(y[1])
v.sort()
deux=v[-2:]
W=[]
for d in deux:
for x in L:
if x[1]==d:
W.append(x)
return W
print(trouveMax())

10) donner la série ou il y a moins de candidates

from bac import r


def nbrCandSerie(s):
i=0
for x in r:
if x['serie'] == s:
i+=1
return s,i
def trouveMin():
L=[]
for s in ['A','C','D']:
L.append(nbrCandSerie(s))
v=[]
for y in L:
v.append(y[1])
v.sort()
m=v[0]
for x in L:
if x[1]==m:
return x
print(trouveMin())

11) donner la liste des candidats de la serie D qui ont des notes inferieures a 10 en mathématique

from bac import r


def mpInf10(s):
i=0
for x in r:
if x['serie'] == s:
for y in x['note']:
if y['m'] =='Math' and y['n']<10:
n1=y['n']
k=x['cd']
for x in r:
if x['cd'] == k:
for y in x['note']:
if y['m'] == 'Physique Chimie' and y['n']<10:

print(x['cd'],x['nom'],'Maths:',n1,'Physique
Chimie:',y['n'])
mpInf10('D')

12) Calculer la moyenne de chaque candidat

from tabulate import tabulate


from bac import r
def calmoyenne(s):
C=S=0
L=[]
for x in r:
if x['serie'] == s:
for y in x['note']:
S+=y['n']*y['coef']
C+=y['coef']
L.append([x['cd'],x['nom'],x['prenom'],x['dateNaiss'],round(S/C, 2),s])
return L
#print(tabulate(calmoyenne('D'),['Mat','Nom','Pren','Moy','Serie'],tablefmt='grid'))
for s in ['A','C','D']:
print(tabulate(calmoyenne(s),['Mat','Nom','Pren','Moy','Serie'],tablefmt='grid'))

13) Donner la liste des admis en serie A

from tabulate import tabulate


from bac import r
def calmoyenne(s):
C=S=0
L=[]
for x in r:
if x['serie'] == s:
for y in x['note']:
S+=y['n']*y['coef']
C+=y['coef']
L.append([x['cd'],x['nom'],x['prenom'],x['dateNaiss'],round(S/C, 2),s])
return L
L=[]
for s in ['A','C','D']:

for e in calmoyenne(s):
if e[4]>=10:
L.append(e)
print(tabulate(L,['Mat','Nom','Pren','Moy','Serie'],tablefmt='grid'))

14) Donner la liste des echec en serie C


from tabulate import tabulate
from bac import r
def calmoyenne(s):
C=S=0
L=[]
for x in r:
if x['serie'] == s:
for y in x['note']:
S+=y['n']*y['coef']
C+=y['coef']
L.append([x['cd'],x['nom'],x['prenom'],x['dateNaiss'],round(S/C, 2),s])
return L
L=[]
for s in ['A','C','D']:

for e in calmoyenne(s):
if e[4]<=10:
L.append(e)
print(tabulate(L,['Mat','Nom','Pren','Moy','Serie'],tablefmt='grid'))

15) donner les candidats ayant des notes inferieures a 10 en Physique et Math en serie C
16) apprecier le resultat:
si moyenne >=10 alors admis
si moyenne >=9.75 et 9.99 alors second group
sinon refuse

from tabulate import tabulate


from bac import r
def calmoyenne(s):
C=S=0
L=[]
for x in r:
if x['serie'] == s:
for y in x['note']:
S+=y['n']*y['coef']
C+=y['coef']
L.append([x['cd'],x['nom'],x['prenom'],x['dateNaiss'],round(S/C, 2),s])
return L
L=[]
for s in ['A','C','D']:

for e in calmoyenne(s):
if e[4]>=10:
a='Admis'
elif e[4]>=9.75 and e[4]<=9.99:
a='Second groupe'
else:
a='Refuse'
e+=[a]
L.append(e)
print(tabulate(L,['Mat','Nom','Pren','Moy','Serie','Appreciation'],tablefmt='grid'))

17) donner le pourcentage des admis au premier groupe

from tabulate import tabulate


from bac import r
def calmoyenne(s):
C=S=0
L=[]
for x in r:
if x['serie'] == s:
for y in x['note']:
S+=y['n']*y['coef']
C+=y['coef']
L.append([x['cd'],x['nom'],x['prenom'],x['dateNaiss'],round(S/C, 2),s])
return L
L=[]
for s in ['A','C','D']:
i=j=0
for e in calmoyenne(s):
i+=1
if e[4]>=10:
j+=1
if i !=0:
print(s,round(j*100/i,2))

18) donner le pourcentage des filles admises au premier groupe

from bac import r


def calmoyenne(id):
C=S=0
for x in r:
if x['cd']==id:
for y in x['note']:
S+=y['n']*y['coef']
C+=y['coef']
return round(S/C,2)

def filleAdmise():
i=j=0
for l in r:
if l['genre']=='F':
i+=1
if calmoyenne(l['cd'])>=10:
j+=1
return round(j*100/i,2)
print(filleAdmise())

19) donner le pourcentage des filles admises et refusees au premier groupe par serie

from tabulate import tabulate


from bac import r
def calmoyenne(id):
C=S=0
for x in r:
if x['cd']==id:
for y in x['note']:
S+=y['n']*y['coef']
C+=y['coef']
return round(S/C,2)

def filleAdmisRefusee():
i=j=0
for l in r:
if l['genre']=='F':
i+=1
if calmoyenne(l['cd'])>=10:
j+=1
return round(j*100/i,2)
print('Admises:',filleAdmisRefusee())
print('Refusees:',100-filleAdmisRefusee())

TD 2: gestion des ventes a partir d’un fichier de type json

d=[
{'c':1,'cl':'IAT','jr':'2022-06-
15','prd':[{'p':'bic','px':75,'q':50},{'p':'regle','px':50,'q':25}]},
{'c':2,'cl':'IAI','jr':'2022-06-
14','prd':[{'p':'bic','px':75,'q':50},{'p':'gomme','px':50,'q':25}]},
{'c':3,'cl':'IAT','jr':'2022-06-
13','prd':[{'p':'mark','px':375,'q':150},{'p':'regle','px':50,'q':25}]},
{'c':4,'cl':'EST','jr':'2022-06-
11','prd':[{'p':'craie','px':25,'q':500},{'p':'mark','px':375,'q':825}]},
{'c':5,'cl':'IUT','jr':'2022-06-
15','prd':[{'p':'bic','px':75,'q':550},{'p':'regle','px':200,'q':25}]},
{'c':6,'cl':'UAM','jr':'2022-06-
11','prd':[{'p':'bic','px':75,'q':500},{'p':'crayon','px':20,'q':1025}]},
]

1. Que font ces scrypts ?

from commande import d


m=0
for x in d:
for j in x['prd']:
m+=int(j['px'])*int(j['q'])
print(m)

from commande import d

for x in d:
m=0
for j in x['prd']:
m+=int(j['px'])*int(j['q'])
print(x['c'],'=',m)
2. Que fait ce script ?

from commande import d


def rechercher(jr):
m=0
for x in d:
if x['jr'] == jr:
for j in x['prd']:
m+=int(j['px'])*int(j['q'])
return m
jr=['2022-06-11','2022-06-15','2022-06-14']
for j in jr:
print(j,'=',rechercher(j))
3. Corriger ce script

from commande import d


#Chercher les differents jours
jr=[]
for x in d:
jr.append(x['jr'])
jr=set(jr)
for j in jr:
m=0
for x in d:
for i in x['prd']:
if x['jr'] == j:
m+=int(i['px'])*int(i['q'])
print(j,'=',m)

Exercice: voici un extrait de la base de données de la gestion des prisonniers

p= [
{
"matricule": "501",
"nom": "Ousmane",
"prenom": "Garba",
"datenaiss": "1990-03-12",
"lieunaiss": "ADERBISSINAT",
"nationalite": "nigerienne",
"genre": "H",
"jourIncarseration": "2010-11-28",
"jourJugement": "2011-05-15",
"jourLiberation": "2014-05-28",
"prison": "Koutoukale",
"delit": "Cooruption",
"peine": "12"
},
{
"matricule": "506",
"nom": "Sanoussi",
"prenom": "Hadi",
"datenaiss": "1990-04-17",
"lieunaiss": "Arlit",
"nationalite": "nigerienne",
"genre": "H",
"jourIncarseration": "2011-01-19",
"jourJugement": "2011-07-16",
"jourLiberation": "2015-07-31",
"prison": "Maradi",
"delit": "Tricherie Bac",
"peine": "1"
},
{
"matricule": "511",
"nom": "Hadiza",
"prenom": "manane",
"datenaiss": "1990-05-23",
"lieunaiss": "BILMA",
"nationalite": "nigerienne",
"genre": "H",
"jourIncarseration": "2011-03-12",
"jourJugement": "2011-07-04",
"jourLiberation": "2019-11-19",
"prison": "Niamey",
"delit": "Terriorisme",
"peine": "12"
},
]

Travail demandé :
Différence entre deux dates

from datetime import datetime


def calcJour(a):
a=a.split('/')
b=str(datetime.now().date()).split('-')
a=datetime(int(a[2]),int(a[1]),int(a[0]))
b=datetime(int(b[0]),int(b[1]),int(b[2]))
return str(b-a).split(' ')[0]
print(calcJour('24/09/2022'))
1. Donner le nombre de prisonniers par tranche d’age :[18-25] ; [26-30],[31-37],[38-45],[46-56],[57-80]
Exercice : corriger ce script et ajouter les classes suivantes
Structure de la base de donnees

CREATE TABLE public.client (


idcl serial NOT NULL primary key,
nom character varying(50) NOT NULL,
prenom character varying(50),
tel numeric(8,0) NOT NULL,
actif numeric(1,0) DEFAULT 0
);

CREATE TABLE public.transfert (


idt serial NOT NULL primary key,
jour timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
teldest numeric(8,0) NOT NULL,
villeexp character varying(50) NOT NULL,
villedest character varying(50) NOT NULL,
montant numeric(7,0) NOT NULL,
frais numeric(5,0) NOT NULL,
typeenv numeric(1,0) DEFAULT 0,
codeenv character varying(25) NOT NULL,
ok numeric(1,0) DEFAULT 0,
daterec date,
annuler numeric(1,0) DEFAULT 0,
nom character varying(50) NOT NULL,
prenom character varying(50) NOT NULL,
idcl integer NOT NULL
);

import psycopg2 as P
from random import random as R
from tabulate import tabulate
cn=P.connect(host='127.0.0.1',
port=5432,user='postgres',password='ben',database='transferer')
cr=cn.cursor()

class client:
def ajouter(self,n,p,t):
cr.execute("INSERT INTO client(nom,prenom,tel) VALUES('%s','%s',%s)"%(n,p,t))
cn.commit()
def afficher(self,t=''):
if t == '':
cr.execute("SELECT nom,prenom,tel,actif FROM client")
else:
cr.execute("SELECT nom,prenom,cast(tel as varchar) FROM client WHERE tel=%s"%t)
return cr.fetchall()
def modifier(self,t:int,n,p):
cr.execute("UPDATE client SET nom='%s',prenom='%s' WHERE tel=%s"%(n,p,t))
cn.commit()
def desactiver(self,t:int,v=1):
cr.execute("UPDATE client SET actif=%s WHERE tel=%s"%(v,t))
cn.commit()
class transfert:
def rechExpediteur(self,t):
cr.execute('SELECT nom,prenom,tel,idcl from client WHERE tel=%s'%t)
return cr.fetchall()
def rechDestinataire(self,t):
cr.execute('''SELECT T.nom,T.prenom,E.nom,E.prenom,villeEnvoi,villeDest,montant,tel
FROM client E,transfert T WHERE T.idcl=E.idcl and T.tel=%s'''%t)
return cr.fetchone()
def envoyer(self,t,m,d,nd,pd,te,tp=0):
r=str(R()).split('.')[1]
if tp == 1:
f=m*0.04
else:
f=m*0.03
if self.rechExpediteur(te):
i=self.rechExpediteur(te)[0][3]
else:
print("Saisie du nom et prenom du numero: ",te)
n=input("Entrer le nom de l'expediteur: ")
p=input("Entrer le prenom de l'expediteur: ")

if n and p and t:
client().ajouter(n,p,te)
i=self.rechExpediteur(t)[0][3]
else:
print("Erreur de saisie !")

cr.execute('''INSERT INTO
transfert(teldest,villeexp,villedest,montant,frais,typeenv,codeenv,nom,prenom,idcl)
VALUES(%s,'%s','%s',%s,%s,%s,%s,'%s','%s',%s)'''%(t,d,'Niamey',m,f,tp,r,nd,pd,i))
cn.commit()

C=client()
#C.ajouter('Alio','Kadade', 95214577)
#C.modifier(95214577, 'Fatouma', 'Nahantshi')
'''C.desactiver(95214577)
L=[]
for i in C.afficher():
L.append(i)
print(tabulate(L,['Nom','Prenom','Tel','actif'],tablefmt="grid"))'''
T=transfert()
T.envoyer(94360884,30000,'Agadez','Ghaicha','Goumour',80866873,0)
#print(T.rechExpediteur(95214577)[0][2])
PARTIE 5 : Cryptographie
Exerice 1
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
message = input("Entrer le message a crypter: ")
n = len(message)
resultat = ""
k=3
for i in range(n):
c = message[i]
rech = alphabet.find(c)
newrech = rech + k
resultat += alphabet[newrech]
print ("Resultat du cryptage:", resultat)

# ou
def cryptage(k):
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
m=input("Message: ")
r=""
for i in range(len(m)):
if alpha.find(m[i]):
r+=alpha[alpha.find(m[i])+k]
return r
print(cryptage(3))

# ou
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
m=input("message: ")
n=len(m)
k=4
r=""
for i in range(len(m)):
loc=alpha.find(m[i])
nloc=(loc+k)%26
r+=alpha[nloc]
print(r)
#ou
def crypto(m:str,k:int,r=""):
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(len(m)):
r+=alpha[(alpha.find(m[i])+k)%26]
return r
print(crypto("UNIVERSIE",400))
hacker algorithm de Cesar
a. Cryptage

alpha='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def hackCesar(m):
for i in range(len(alpha)):
trouve=""
for c in m:
if c in alpha:
trouve+=alpha[(alpha.find(c)+i)%26]
print(i,trouve)
hackCesar("HELLO JE SUIS NIGERIEN")
b. deryptage

alpha='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def hackCesar(m):

for i in range(len(alpha)):
trouve=""
for c in m:
if c in alpha:
x=alpha.find(c)-i
if x<0:
x+=len(alpha)
trouve+=alpha[x]
else:
trouve+=c
print(i,trouve)
hackCesar("KHOORMHVXLVQLJHULHQ")

c. attaque but-force

c1. Le message cryptes et enregistres dans un fichier


alpha='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def hackCesar(m):
f=open("resultat.txt","a")
for i in range(len(alpha)):
trouve=""
for c in m:
if c in alpha:
trouve+=alpha[(alpha.find(c)+i)%26]
f.write(trouve+'\n')
f.close()

hackCesar("HELLO JE SUIS NIGERIEN")

c.2 Decodage du fichier par l’attaque brut-force


alpha='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def hackCesar(m):
for i in range(len(alpha)):
trouve=""
for c in m:
if c in alpha:
x=alpha.find(c)-i
if x<0:
x+=len(alpha)
trouve+=alpha[x]
else:
trouve+=c
print(i,trouve)
with open("resultat.txt") as f:
for ligne in f:
hackCesar(ligne)
print('-'*100)

ROT13
def crypto(m:str,k:int,r=""):
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(len(m)):
r+=alpha[(alpha.find(m[i])+k)%26]
return r
print("Cryptage: ",crypto("UNIVERSITE",13))
print("Decryptage: ",crypto(crypto("UNIVERSITE",13),13))

# crypter N fois
def crypto(m:str,k:int,r=""):
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(len(m)):
r+=alpha[(alpha.find(m[i])+k)%26]
return r
m=input("messahe: ")

for i in range(20):
m+=crypto(m,4)
print(m)
Exercice
def renverser(m):
r=""
i=len(m)-1
while i>=0:
r+=m[i]
i-=1
return r
print(renverser("Fraternite Travail Progres"))

from cryptography.fernet import Fernet as F


cle=F.generate_key()
f=F(cle)
c=f.encrypt(b"Je chercher")
print("-"*20," Resultat du cryptage","*"*20)
print(c)
print("-"*20," Resultat du decryptage","*"*20)
print(f.decrypt(c))

Exercice 2 : crypter les lignes d’un fichier


from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
with open("note.txt") as fic:
for l in fic:
c=f.encrypt(l.encode("ascii"))
print(c)

exercice 3 : Crypter le contenu d’un fichier dans un autre fichier


from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
fic=open("note.cr","ab")
with open("note.txt") as fi:
for l in fi:
c=f.encrypt(l.encode("ascii"))
fic.write(c+b"\n")

Exercice 4: décrypter le contenu du fichier précèdent


from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
fi=open("note2.txt","a")
with open("note.cr","rb") as fic:
for l in fic:
print(l)
c=f.decrypt(l)
fi.write(c+"\n")

exercice 5: crypter le contenu d’un dossier


import os
from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
D=input("Entrer le chemin du dossier: ")
if os.path.exists(D):
L=os.listdir(D)
print(L)
for fic in L:
if os.path.isfile(fic):
for l in fic:
print(f.encrypt(l.encode("ascii")))

Exercice 6 : appliquer la cryptographie dans le domaine de réseau


Objectif : crypter le fichier du serveur SRV1 et envoyer la copie cryptée sur le serveur SRV2

192.168.56.0/24

.1 .104

import os
from cryptography.fernet import Fernet as F
cle=F.generate_key()
fic=open("finance.cr","ab")
f=F(cle)
with open("note.txt") as fi:
for line in fi:
fic.write(f.encrypt(line.encode("ascii")))
if os.system("ping 192.168.56.92") == 0:
os.system("scp finance.cr [email protected]:/root/")

exercice 7: Crypter le fichier d’un dossier et envoyer le résultat dans le serveur SRV2
import os
from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
Ds=input("Entrer le chemin du dossier source: ")
Dd=input("Entrer le chemin du dossier destination: ")
if os.path.exists(Ds) and os.path.exists(Dd):
for ft in os.listdir(Ds):
if os.path.isfile(ft):
fcr=open("%s/%s.cr"%(Dd,ft),"ab")
for l in open(ft):
fcr.write(f.encrypt(l.encode("ascii")))

if os.system("ping 192.168.56.92") == 0:
os.system("tar cjvf %s.tar.bz2 %s"%(Dd,Dd))
os.system("scp %s.tar.bz2 [email protected]:/root/"%Dd)

Exercice 8:

.92
.93
.1
192.168.56.0/24

import os
from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
Ds=input("Entrer le chemin du dossier source: ")
Dd=input("Entrer le chemin du dossier destination: ")
if os.path.exists(Ds) and os.path.exists(Dd):
for ft in os.listdir(Ds):
if os.path.isfile(ft):
fcr=open("%s/%s.cr"%(Dd,ft),"ab")
for l in open(ft):
fcr.write(f.encrypt(l.encode("ascii")))
os.system("tar cjvf %s.tar.bz2 %s"%(Dd,Dd))
for m in 192.168.56.92 192.168.56.93:
if os.system("ping %s"%m) == 0:
os.system("scp %s.tar.bz2 root@%m:/root/"%(Dd,m))

Exercice 9 : faire le dump des tables compte et mouvement de la base banque

import os,csv
from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
import pymysql as M
cn=M.connect(host="localhost",user="root",password="est",database="banque")
cr=cn.cursor()
for t in ['compte','mouvement']:
with open("%s.csv"%t,"a") as fic:
e=csv.writer(fic, delimiter=";")
cr.execute("SELECT * FROM %s"%t)
for l in cr.fetchall():
e.writerow(l)
fc=open("%s.cr"%t,"ab")
with open("%s.csv"%t) as fic:
for l in fic:
fc.write(f.encrypt(l.encode("ascii")))
os.system("scp %s.cr [email protected]:/root/"%t)
fc.close()

OpenSSL : coté système


Exercice 1
import os
f=input("Entrer un fichier: ")
if os.path.isfile(f):
os.system("openssl aes-256-cbc -k secret -in %s -out %s.cr" %(f,f))
Exercice 2
import os
def crypto(m,f):
if os.path.isfile(f):
os.system("openssl %s -k secret -in %s -out %s.cr" %(m,f,f))
crypto('aes-128-cbc','resultat.txt')

Exercice 3: crypter les fichier du dossier courant


import os
def crypto(m,f):
if os.path.isfile(f):
os.system("openssl %s -k secret -in %s -out %s.cr" %(m,f,f))
def crypter():
contenu=os.listdir(".")
for f in contenu:
if os.path.isfile(f):
crypto('aes-256-cbc',f)
crypter()

exercice 4: écrire un script qui fait le décryptage des fichiers cryptés précédemment

Hashage

import hashlib as H import hashlib as H


print(H.algorithms_available) print(H.sha256(b"travaille!").hexdigest())
import hashlib as H import hashlib as H
print(H.md5(b"travaillez!").hexdigest()) print(H.sha3_256(b"travaille!").hexdigest())
import hashlib as H import hashlib as H
print(H.sha1 (b"travaille!").hexdigest()) print(H.sha3_512(b"travaille!").hexdigest())
import hashlib as H from hashlib import *
print(H.sha512(b"travaille!").hexdigest()) def hasher(algo):
import hashlib as H print(algo(b"Securite
print(H.sha224(b"travaille!").hexdigest()) nationale").hexdigest())
hasher(md5)

Verifer si les machines sont hors reseau


import os
from datetime import datetime as D
jr=str(D.now().date())[0:10]
#yyyy-mm-dd HH:mm:ss

l=['192.168.56.1','127.0.0.1','8.8.8.8','8.8.4.4','1.1.1.1','2.2.2.2']
erreur=open('erreur.txt','a')
for x in l:
if os.system('ping %s'%x) != 0:
erreur.write('%s %s est hors reseau'%(jr,x))
erreur.close()

Accès distant avec le module netmiko de Python

192.168.56.0/24

 Script a saisir sur la machine cliente

from pprint import pprint


from netmiko import ConnectHandler as H
u,p='root','6858'
r='192.168.56.'
for i in [92,93]:
h=r+str(i)
conf={'device_type':'linux',
'username':u,
'host':h,
'password':p,
'secret':p
}
cn=H(**conf)
commande="ls -l /root/"
resultat=cn.send_command(commande)
pprint(resultat)
cn.disconnect()

Exercice : utiliser netmiko pour créer des utilisateurs


from print import pprint
from netmiko import ConnectHandler as H
u,p='root','6858'
r='192.168.1.'
for i in [92,93]:
h=r+str(i)
conf={'device_type':'linux',
'username':u,
'host':h,
'password':p,
'secret':p
}
cn=H(**conf)
commande="ls -l /root/"
for user in ["kiari","harou","balla","ladidi"]:
resultat=cn.send_config_set("useradd %s"%user)
print("operation effectuee avec succes")
cn.disconnect()

Gestion de base de données a l’aide de netmiko

1 mysql -u root -p Se connecter au serveur de base de données


MySQL
2 Create database vote ; Créer la base de données
3 use vote ; Entrer dans la base vote
4 CREATE TABLE electeur ( Création des table electeur, candidat et voter
ide int(11) NOT NULL AUTO_INCREMENT,
nom varchar(50) NOT NULL,
datenaiss date NOT NULL,
lieunaiss varchar(25) NOT NULL,
genre char(1) DEFAULT 'M',
PRIMARY KEY (ide)
);

CREATE TABLE candidat (


idc int(11) NOT NULL AUTO_INCREMENT,
nom varchar(50) NOT NULL,
datenaiss date NOT NULL,
lieunaiss varchar(25) NOT NULL,
codec int(6) NOT NULL,
parti varchar(25) NOT NULL,
PRIMARY KEY (idc),
UNIQUE KEY codec (codec)
);

CREATE TABLE voter (


idv int(11) NOT NULL AUTO_INCREMENT,
voix int(1) NOT NULL,
ide int(11) NOT NULL,
idc int(11) NOT NULL,
bureau int(6) NOT NULL,
commune varchar(50) NOT NULL,
departement varchar(50) NOT NULL,
region varchar(9) NOT NULL,
PRIMARY KEY (idv)
)

5 Script de requêtes sur la table VOTE, exécuté sur les serveurs 192.168.56.92 et 192.168.56.93
from netmiko import ConnectHandler as H
def connection(u:str,p:str,h:str):
conf={'device_type':'linux',
'username':u,
'host':h,
'password':p,
'secret':p,
'timeout':250,
'verbose':True}
return H(**conf)
r='192.168.1.'
for h in [92,93]:
cn=connection("root","6858",r+str(h))
commande=["mysql -u root --password='mysql' vote","SELECT * FROM vote"]
for l in commande:
result=cn.send_command(l)
cn.disconnec()
print(result)

Partie 6
Python & SQLite3
>import sqlite3
conn=sqlite3.connect(‘C:/sqliteDB/master2EST.db')
c=conn.cursor()
‘’’c.execute("CREATE TABLE etudiant(ide integer primary key autoincrement,nom varchar(50) not
null)")’’’
c.execute("INSERT INTO etudiant(nom) VALUES('Ali')")
c.execute("INSERT INTO etudiant VALUES(2,'Moussa')")
c.execute("INSERT INTO etudiant VALUES(3,'Sani')")
conn.commit()
li=c.execute("SELECT * FROM etudiant")
for tab in li:
print(tab[0])
print(tab[1])
print(tab[2])
>import sqlite3
conn=sqlite3.connect('uin4.db')
c=conn.cursor()
def crate_table():
c.execute("CREATE TABLE etudiant(ide integer primary key autoincrement,nom varchar(50)
not null)")
def crate_entry():
c.execute("INSERT INTO etudiant VALUES(1,'Ali')")
c.execute("INSERT INTO etudiant VALUES(2,'Moussa')")
c.execute("INSERT INTO etudiant VALUES(3,'Sani')")
c.close()
conn.close()
-----------------------------
appel
create_table()
crate_entry()
li=c.execute("SELECT * FROM etudiant")
for tab in li:
print(tab[0])
print(tab[1])
print(tab[2])

Python & MongoDB


Insertion des donnees
from pymongo import MongoClient Insertion de donnees
cn = MongoClient()
tab=cn.etude
resultat=tab.etudiant.insert({
'nom':'Ali','prenom':'Moussa', 'telephone':97811897
})

resultat=tab.etudiant.find() Affichage
for document in resultat:
print(document)
tab.etudiant.create_index([("telephone", pymongo.ASCENDING)]) Création d’un index sur le champ telephone

resultat = tab.etudiant.delete_many({}) Suppression


resultat=tab.etudiant.update_one(
{
'nom':'Ali'},
{"$set":{'prenom':'Oussou'}} )

Excell et Python

import openpyxl
import os
os.chdir('c:\\backup')
wb=openpyxl.load_workbook('exemple.xls')
wb.get_get_sheet_names()
sheet=wb.get_sheet_by_name('categorie')
sheet['A1'].value
sheet['C1'].value=100
wb.save('exemple.xls')
sheet.title='Mes donnees'
wb.save('exemple.xls')
sheet.cell(row=1,column=3).value
for i in range(1,5): print(sheet.cell(row=i,column=3).value)

sheet.max_row
sheet.max_column
openpyxl.cell.get_column_letter(1)
openpyxl.cell.get_column_letter(26)
openpyxl.cell.column_index_from_string('B2')
wb.create_sheet(title='Ma feuille',index=1)
wb.save('exemple2.xls')
sheet.column_dimensions['B'].width=20
wb.save('exemple2.xls')

Python & MySQL


Importer les données dans une table

import xlrd
import MySQLdb
#ouvrir le classeur et definir la feuille
book=xlrd.open_workbook("fichier.xls")
sheet=book.sheet_by_name("source")
sheet=book.sheet_by_index(0)
#connexion a la base de donnees boutique
cn=MySQLdb.connect(host="localhost",user="root",passwd="",db="boutique");
#creation du cursor
cr=cn.cursor()
req="INSERT INTO categorie(categorie) VALUES(%s,%s)"
for r in range(1,sheet.nrows):
categorie= sheet.cell(r,0).value
#assigner les valeurs de chaque ligne excel
values(cotegorie)
#executer le requete SQL
cr.execute(req,values)
#fermer le curseur
cr.close()
#valider la transaction
cn.commit()
#fermer la connexion
cn.close()
#afficher le contenu de la table
columns=str(sheet.ncols)
rows=str(sheet.nrows)

Python & Oracle


import cx_Oracle as o
c=o.connect('ben/[email protected]/XE')
cr=c.cursor()
d=cr.execute('SELECT * FROM personne')
j=d.fetchall()
for i in j:
print(i)

Python & PostgreSQL


Exemple1
import psycopg2 as pg
cn= pg.connect("dbname=’sco’ user=’postgres’ host=’localhost’ password=’ben’ port=’5432’")
cr=cn.cursor()
d=cr.execute("SELECT * FROM etudiant")
print(d.fetchall())

Exemple 2
import psycopg2
from pprint import pprint
class DatabaseConnection :
def _init_(self):
try:
self.cn=psycopg2.connect(
"dbname='etudiant' user='postgres' host='localhost' password='' port='5432'")
self.connection.autcommit=True
self.cursor=self.connection.cursor()
except:
pprint("Connexion a echoue")
'''def create_table(self):
createT="CREATE TABLE if not exists produit(idpro serial primary key,produit varchar(25) not null)"
self.cursor.execute(createT)'''
def insertN(self):
inserer="INSERT INTO produit VALUES(1,'Tomate')"
self.cursor.execute(inserer)
def afficher(self):
aff="SELECT * FRON produit"
self.cursor.execute(aff)

if __name__=='__main__':
dc= DatabaseConnection()
#dc.create_table()
#dc.insertN()
dc.afficher()

-----------------------------
import psycopg2 as pg
cn= pg.connect("dbname='ben' user='postgres' host='localhost' password='ben' port='5432'")
cr=cn.cursor()

Déduction du Modèle Logique de Données(MLD)


ETUDIANT(ide, nom, prenom, date_naiss, genre)
MATIERE(idm, libelle, coeff)
NOTER(idn, #idm, #ide, note, jour)

 Il s’agit ici de la relation PLUSIEURS à PLUSIEURS. Dans ce cas, l’association NOTER devient une table
Donc la table NOTER va hériter des clés de ses tables mères à savoir ETUDIANT et MATIERE
Les champs soulignés sont des clés primaire et les champs précédés de # sont des clés étrangères

Python et Système: cas de Linux

#!/usr/bin/env python
#Avoir des informations sur le système d'exploitation Linux
import subprocess
#Fonction 1
def noyauInfo() :

noyau = “uname”
noyau_arg = “-a”
print "Avoir des infos du systeme avec la commande %s :\n" % noyau
subprocess.call([noyau,noyau_arg])

#Fonction 2
def diskInfo() :
espaceDisk = "df"
espaceDisk_arg = "-h"
print "Information sur l'espace disque restant %s :\n" % epaceDisk
subprocess.call([espaceDisk, espaceDisk_arg])
Enregistrer ce fichier sous pysy.py
 On peut toutefois ecrire: subprocess.call("df -h",shell=True)
def main():
def noyauInfo()
def diskInfo()
 Appel d’une function dans du script
from pysy import diskInfo

Problème :
Lors de l’exécution du script, nous souhaitons que seule la fonction appelée s’exécute. Cela est possible grâce à la
technique d’idiom
def main():
def noyauInfo() def __main__()
def diskInfo()

def __name == “__main__” :


main()

Graphisme avec Python

import matplotlib
import matplotlib.pyplot as pt
pt.plot([1,2,3,4],[3,8,10,25])
pt.show()
import matplotlib fig=pt.figure
import matplotlib.pyplot as pt rect=fig.patch
rect.set_facecolor('green')
fichier=open("C:\\Python34\\fich.txt","r") x=[3,7,8,12]
donnees=fichier.read().split("\n") y=[5,13,2,8]
print(donnees) graph1=fig.add_subplot(1,1,1,axisbg='black')
x=[] graph1.plot(x,y,'red',linewidth=4.0)
y=[] pt.show()
for i in donnees:
c=i.split(',')
x.append(int(c[0]))
y.append(int(c[1]))
pt.plot(x,y)
pt.show()

PANDAS
DataFrame peut contenir des listes, les tableaux NumPy, dictionnaire,...
Exemple1:
inport pandas as pd
import numpy as np
mon_dataFrame = pd.DataFrame([1,2,3])
print(mon_dataFrame)
Exemple 2
cols = ['A', 'B']
idx = pd.Index(list('name'), name='a')
data = np.random.normal(10, 1, (4, 2))
df = pd.DataFrame(data, columns=cols, index=idx)
Création des interfaces

Editeur utilisé : pycharm version commuity


import tkinter as tk
win = tk.Tk()
win.title("Python GUI")
win.mainloop()
Appuyer sur la touche F5 pour exécuter
 Importer le module tkinter et faire un alias tk.
Créer une instance de class Tk et appeler son constructeur et assigner l’instance à la variable win.
 Python est un langage dynamique, on utilise une variable sans même la déclarer à plus forte raison lui assigner
un type
Redimensionner une fenêtre
import tkinter as tk
win = tk.Tk()
win.title("Python GUI")
win.resizable(10, 15)
win.mainloop()
Pour mettre un label, nous importons un module ttk de tkinter
import tkinter as tk
from tkinter import ttk
win = tk.Tk()
win.title("Python GUI")
win.resizable(30, 15)
ttk.Label(win, text="A Label").grid(column=0, row=0)
win.mainloop()
Création d’une zone de texte et un combobox
import tkinter as tk
from tkinter import ttk
win = tk.Tk()
win.title("Python GUI")
win.resizable(30, 15)
#----------Ajouter une zone de texte---------------------
ttk.Label(win, text="Enter a name:").grid(column=0, row=0)
name = tk.StringVar()
nameEntered = ttk.Entry(win, width=25, textvariable=name)
nameEntered.grid(column=0, row=1)
nameEntered.focus()
#----------Ajouter un combobox----------------------------
ttk.Label(win, text="Choose a number:").grid(column=1, row=0)
number = tk.StringVar()
numberChosen = ttk.Combobox(win, width=12, textvariable=number)
numberChosen['values'] = (1, 2, 4, 42, 100)
numberChosen.grid(column=1, row=1)
numberChosen.current(0)
#-----------Lancement du formulaire-----------------------
chVarDis = tk.IntVar()
check1 = tk.Checkbutton(win, text="Disabled", variable=chVarDis, state='disabled')
check1.select()
win.mainloop()

Exemple d’utilisation de Matplotlib


Exercice 1
Exercice 2
Exercice 3
Exercice 4
Exercice 5

Les couleurs usuelles :

b blue
g green
r red
c cyan
m magenta
y yellow
k black
w white

Données issues d’un fichier de 5 lignes


Exercice 6

a.
b.
c.
d.
Exercice 7

Exercice 8
Exercice 9

Exercice 10

Pour le hash : /,\, |, -,+,x,o,O,*

Marqueur
Exercice 11

Introductoion a Webio
from index import article
from pywebio.input import input, TEXT,select,input_group
from pywebio.output import output, put_text,put_table
def ajout():
donnee=input_group("Ajouter article",[
input("Entrer l'article",name="article",type=TEXT,placeholder="Article"),
select("Category",['Bureautique' , 'Menage'],name="categorie",required=True)
])
put_text(donnee['article'],donnee['categorie'])
put_table([['Article','Categorie','Menu'],['Bic','Bureautique','x'],['Gomme','Bureautiq
ue','x']])

if __name__ == "__main__":
ajout()
Code de index.py
import pymysql as M
cn=M.connect(host="localhost",port=3305,user="root",password="ben",database="stock")
cr=cn.cursor()
class article:
def ajouter(self,a,c):
cr.execute("INSERT INTO produit(article,idc) VALUES('%s','%s')"%(a,c))
cn.commit()

Exemple d’utilisation de flask

A. Python et MySQL
Installez : pymysql en ligne avec la commande : pip install pymysql ou python –m pip install pymysql
Activité 1 : Gestion des inscriptions scolaires
Activité 2 : Gestion des membres des clubs
Activité 3 : Gestion des cartes d’identité
Activité 4 : Gestion des diplômes

Création la base de données pharmacie et de la table produit

create database pharmacie;


use pharmacie
create table produit(id int primary key auto_increment,
produit varchar(100) not null UNIQUE,
prix int(6) not null,
quantite int(5) not null,
marque varchar(50) not null
);
alter table produit add constraint cknull check(prix>0);
import pymysql as m
cn=m.connect(host='localhost',user='root',password='',db='pharmacie')
cr=cn.cursor()
def menu():
while(1):
print('Choisissez une operation: ')
op=int(input('1:Afficher, 2: Inserer, 3: Modifier, 4: Rechercher, 5: Supprimer'))
if op==1:
afficher()
elif op==2:
inserer()
elif op==3:
modifier()
elif op==4:
rechercher()
elif op==5:
supprimer()
else:
print('Choix invalide')

def afficher():
try:
cr.execute('SELECT * FROM produit ORDER BY id DESC')
da=cr.fetchall()
for d in da:
print(d)
except:
print('Aucun produit')
def inserer():
produit=str(input('Entrer le nom du produit'))
prix=int(input('Entrer le prix du produit'))
quantite=int(input('Entrer la quantite du produit'))
marque=str(input('Entrer la marque du produit'))
try:
cr.execute('''INSERT INTO produit(produit,prix,quantite,marque)
VALUES(%s,%s,%s,%s)''',(produit,prix,quantite,marque))
cn.commit()
print('Insertion effectuee avec success')
except Exception as e:
print('Insertion a echoue :',e)
cn.rollback()
finally:
afficher()
def modifier():
idp=input('Saisissez le numero du produit a Modifier')
produit=str(input('Entrer le nom du produit'))
prix=int(input('Entrer le prix du produit'))
quantite=int(input('Entrer la quantite du produit'))
marque=str(input('Entrer la marque du produit'))
try:
cr.execute('''UPDATE produit SET produit=%s,prix=%s,quantite=%s,marque=%s
WHERE id=%s''',(produit,prix,quantite,marque,idp))
cn.commit()
print('Modification effectuee avec success')
except:
print('Modification a echoue')
cn.rollback()
finally:
afficher()
def rechercher():
produit=input('Entrer le nom du produit que vous cherchez')
try:
cr.execute("SELECT * FROM produit WHERE produit=%s",produit)
da=cr.fetchone()
for d in da:
print(d)
except:
print('Pas de resultat pour votre recherche')
def supprimer():
idp=input('Entrer le numero du produit a supprimer')
try:
cr.execute('DELETE FROM produit WHERE id=%s',idp)
cn.commit()
print('Suppression effectuee avec success')
except Exception as e:
print('Operation de suppression a echoue',e)
cn.rollback()
finally:
afficher()
if __name__ == '__main__':
menu()

B. Python avec MongoDB


Installation du module pymongo : pip install pymongo ou python –m pip install pymongo
 a. création de la base de donnees pharmacie : use pharmacie
b. creation de la collection produit : db.createCollection(‘produit’)
from pymongo import MongoClient as m
client=m('localhost:27017')
col=client.pharma.produit
def menu():
while(1):
op=int(input('Choisissez:
1=>Insertion,2=>Affichage,3=>Modifcation,4=>Suppression,5=>Rechercher'))
if op==1:
inserer()
elif op==2:
afficher()
elif op==3:
modifier()
elif op==4:
supprimer()
elif op==5:
rechercher()
else:
print('Choix invalide')
def inserer():
try:
code=str(input('Entrer le code du produit'))
produit=str(input('Entrer le nom du produit'))
prix=int(input('Entrer le prix'))
marque=str(input('Entrer la marque'))
quantite=int(input('Entrer la quantite'))
col.insert({
'code':code,
'produit':produit,
'prix':prix,
'marque':marque,
'quantite':quantite
})
print('Enregistrement effectue avec success')
afficher()
except Exception as e:
print(str(e))
def afficher():
try:
print('Liste des produits')
tr=col.find()
for d in tr:
print(d)
except Exception as e:
print(str(e))
def modifier():
try:
ide=input('Entrer l\'identifiant a modifier')
produit=str(input('Entrer le produit'))
prix=int(input('Entrer le prix'))
marque=str(input('Entrer la marque'))
quantite=int(input('Entrer la quantite'))
col.update({'id':ide},{'$set':{
'produit':produit,
'prix':prix,
'marque':marque,
'quantite':quantite
}})
afficher()
except Exception as e:
print(str(e))
print('Modifcation effectuee avec success')
afficher()
def supprimer():
try:
idp=input('Entrer l\'identifiant a supprimer')
col.remove({'id':idp})
afficher()
except Exception as e:
print(str(e))
print('suppression effectuee avec success')
def rechercher():
rech=input('Entrer le produit a rechercher')
try:
print(rech)
tr=col.find({'produit':rech},{'_id':0,'produit':1,'prix':1,'quantite':1,'marque':1})
for d in tr:
print(d)

except Exception as e:
print('Aucun produit',str(e))
if __name__ == '__main__':
menu()

Connection au SGBD [exemple] Commentaire


Python avec Oracle import cx_Oracle as o Importation du module cx_Oracle
c=o.connect('compte/[email protected]/XE') Connexion à la base de données XE se
cr=c.cursor() trouvant sur le serveur local
il s’agit de Oracle Express
Création de table produit sous Oracle :
Create table produit(id number primary key,
produit varchar2(100) not null UNIQUE,
prix number (6) not null,
quantite number(5) not null,
marque varchar2(50) not null ) ;

Python avec SQLite


Python avec PostgreSQL import psycopg2 as pg Importation du module psycopg2 puis
cn= pg.connect("dbaname=’pharmacie’ connexion à la base pharmacie se trouvant sur
user=’compte’ host=’localhost’ le serveur local
password=’motdepasse’ port=’5432’")
cr=cn.cursor()

Activité 1 : Administration de base de données avec python

EPREUVE
CANDIDAT
1,N 1,N Ide
idc
COMPOSER libelle
nom
note coeff
prenom
jour
genre
tel 1,1
dateNaiss
lieuNaiss FILIERE
nat Id
photo filiere AVOIR
cycle
1,N
1,N

CANDIDATER
annee
1,N

MLD
CANDIDAT(idc,nom,prenom,genre,tel,dateNaiss,lieuNaiss,nat,photo)
FILIERE(idf,filiere,cycle)
EPREUVE(ide,libelle,coeff,#idf)
COMPOSER(jour,note,#idc,#ide)

champ TYPE(Taille) CONTRAINTE


idc INT, AUTO_INCREMENT PRIMARY KEY
nom VARCHAR(50) NOT NULL
prenom VARCHAR(50) NOT NULL
genre ENUM(‘H’,’F’) NOT NULL
tel INT(8) NOT NULL, UNIQUE
dateNaiss DATE NOT NULL, format yyyy-mm-dd
lieuNaiss VARCHAR(50) NOT NULL
nat VARCHAR(50) NOT NULL
photo TEXT

champ TYPE(Taille) CONTRAINTE


ide INT, AUTO_INCREMENT PRIMARY KEY
libelle VARCHAR(50) NOT NULL
coeff INT(2) NOT NULL, [1-5]

champ TYPE(Taille) CONTRAINTE


Idf INT, AUTO_INCREMENT PRIMARY KEY
Filiere VARCHAR(50) NOT NULL
Cycle INT(1) NOT NULL, [1-2]

champ TYPE(Taille) CONTRAINTE


Note DECIMAL(2,2) NOT NULL, [0-20]
Jour DATE NOT NULL, jour <=curdate()

Travail préliminaire

A. Installer le module pymysql

B. Connexion à la base de données

1. LDD
a. Création de la base de données concours
CREATE DATABASE concours ;
b. Création des tables
i. Table candidat

ii. Table filiere

iii. Table epreuve

iv. Table composer


c. Creation des contraintes

d. Modification de la structure de la base de donnees


e. Creation de la vue
i. Créer une vue qui permet de lister les candidats admis et trier la liste par ordre croissant des
moyennes

ii.
f. Création de procédures stockées
i. Procédure qui liste les candidats pour une tranche d’âgés

ii. Procédure qui liste des candidats admis et trier la liste par decroissant des moyennes
g. Création des fonctions
h. Création de cluster
2. LMD
a. Insertion des donnees
b. Modification des donnees
c. Suppression des donnees
3. LID
a. Requetes mono-tables
i. Selectionner tous les candidats

ii. Sélectionner toutes les candidates âgées de 22 ans au plus

iii. Sélectionner le nombre de candidats par sexe, âgés de moins de 23 ans

b. Requetes multi-tables
i. Chercher les candidats de la filière CPI
ii. Calculer la moyenne de chaque candidat

iii. Donner la liste des candidats admis et trier la liste par ordre décroissant de la moyenne

4. LCD
5. Gestion des utilisateurs
6. Sauvegarde et Restauration des données
7. Securite
8. Replication
Etude de cas 1 : messagerie avec Python + MongoDB
Structure projet
projet

template

Loging.html static
message.html
css
entete.html
fonts
js
Server.py

Script du fichier server.py


Script de entete.html
Script de login.html
Exercice d’application
Objectif: poursuivre la programmation de l’application de gestion de stock

index.py
from flask import Flask, render_template,url_for,request,session,redirect
import pymysql as pm
cn=pm.connect(host='127.0.0.1',user='root',password='',db='stock')
cr=cn.cursor()
app=Flask(__name__)
app.secret_key='honneur'
@app.route('/')
def login():
return render_template('login.html')
@app.route('/authentic',methods=['POST','GET'])
def authentic():
if request.method=='POST':
compte=request.form['cmp']
motpasse=request.form['mdp']
profile=request.form['profile']
cr.execute("SELECT cmp,mdp FROM admin WHERE cmp='"+compte+"'AND mdp='"+motpasse+"' AND pro='"+profile+"'")
donnees=cr.fetchone()
if donnees is None:
msg='Erreur'
return render_template('erreur.html',msg=msg)
else:
session['cmp']=compte
return redirect(url_for('index'))
@app.route('/quitter')
def quitter():
session.pop('cmp',None)
return redirect(url_for('login'))
@app.route('/accueil')
def accueil():
return render_template('accueil.html')
@app.route('/lister')
def index():
cr.execute('SELECT ida,article,categorie FROM article a, categorie c WHERE a.idc=c.idc')
da=cr.fetchall()
cr.execute('SELECT * FROM categorie')
dc=cr.fetchall()
return render_template('liste.html',da=da,dc=dc)
@app.route('/ajouter',methods=['POST','GET'])
def ajouter():
if request.method=='POST':
try:
article=request.form['article']
idc=request.form['idc']
cr.execute('INSERT INTO article(article,idc) VALUES(%s,%s)',(article,idc))
cn.commit()
msg='ok'
except:
msg='Echec'
cn.rollback()
finally:
return render_template('resultat.html',msg=msg)

#Modification
@app.route('/modification',methods=['POST','GET'])
def modification():
if request.method=='POST':
try:
ida=request.form['ida']
article=request.form['article'+str(ida)]
idc=request.form['idc'+ida]
cr.execute('UPDATE article SET article=%s,idc=%s WHERE ida=%s',(article,idc,ida))
cn.commit()
msg='ok'
except:
msg='Echec'
cn.rollback()
finally:
return render_template('resultat.html',msg=msg)
#fin modification
@app.route('/supprimer/<int:ida>')
def supprimer(ida):
try:
cr.execute('DELETE FROM article WHERE ida=%s',[ida])
cn.commit()
msg='ok'
return render_template('resultat.html',msg=msg)
except:
msg='Echec'
cn.rollback()
return render_template('resultat.html',msg=msg)

if __name__ == '__main__':
app.run(host='localhost',port=8000,debug=True)

templates/index.html

a. script templates/index.html
{% block body %}
<link rel="stylesheet" type="text/css" href="{{url_for('static',filename='css/bootstrap.min.css')}}">
<script type="text/javascript" src="{{url_for('static',filename='js/jquery.js')}}"></script>
<script type="text/javascript" src="{{url_for('static',filename='js/bootstrap.min.js')}}"></script>

<div class="container-fluid">
<div class="row">
<div class="col-md-offset-6 col-md-4">
<img src="{{url_for('static',filename='logo.png')}}" class="img img-rounded">
<!-- --> </div>
<div class="col-md-offset-4 col-md-5" style="padding-top: 60px;">

<ul id="myTab" class="nav nav-tabs">


<li class="active">
<a href="#home" data-toggle="tab">Connexion</a>
</li>
<li>
<a href="#ios" data-toggle="tab">Inscription</a>
</li>
</ul>
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade in active" id="home"><br>
<form class="form-horizontal" role="form" action="#" method="POST">
<div class="form-group"> <label for="cmp" class="col-sm-3 control-label">Compte</label> <div class="col-sm-7"> <input
type="text" class="form-control" id="cmp" placeholder="Compte utilisateur"> </div>
</div>
<div class="form-group"> <label for="cmp" class="col-sm-3 control-label">Mot de passe</label> <div class="col-sm-7"> <input
type="password" class="form-control" id="cmp" placeholder="Mot de passe"></div> </div>
<div class="form-group">
<div class="col-sm-3">

</div><div class="col-sm-7"><button class="btn btn-primary btn-block" style="background-color:#00B5E1"><span


class="glyphicon glyphicon-log-in"></span>&nbsp;Connexion</button></div>
</div>
</form>
</div>
<div class="tab-pane fade" id="ios"><br>
<form class="form-horizontal" role="form" action="#" method="POST">
<div class="form-group"> <label for="cmp" class="col-sm-3 control-label">Compte</label> <div class="col-sm-7"> <input
type="text" class="form-control" id="cmp" placeholder="Compte utilisateur"> </div>
</div>
<div class="form-group"> <label for="cmp" class="col-sm-3 control-label">Mot de passe</label> <div class="col-sm-7"> <input
type="password" class="form-control" id="cmp" placeholder="Mot de passe"></div>
</div>
<div class="form-group"> <label for="cmp" class="col-sm-3 control-label">E-mail</label> <div class="col-sm-7"> <input
type="email" class="form-control" id="email" placeholder="E-mail"></div>
</div>
<div class="form-group"> <label for="cmp" class="col-sm-3 control-label">Telephone</label> <div class="col-sm-7"> <input
type="number" class="form-control" id="tel" placeholder="Numero de telephone"></div>
</div>
<div class="form-group">
<div class="col-sm-3">

</div><div class="col-sm-7"><button class="btn btn-primary btn-block" style="background-color:#00B5E1"><span


class="glyphicon glyphicon-pencil"></span>&nbsp;Inscription</button></div>
</div>
</form>
</div>
</div>
<!-- -->
</div>
</div>
</div>
{% endblock %}

b. templates/entete.html
<link rel="stylesheet" type="text/css" href="{{url_for('static',filename='css/bootstrap.min.css')}}">
<script type="text/javascript" src="{{url_for('static',filename='js/jquery.js')}}"></script>
<script type="text/javascript" src="{{url_for('static',filename='js/bootstrap.min.js')}}"></script>
<div class="col-md-6 col-md-offset-4">
<ul class="nav nav-tabs">
<li class="active"><a href="/accueil">Accueil</a></li>
<li><a href="/lister">Articles</a></li>
<li><a href="#">Stock</a></li>
<li><a href="#">Service</a></li>
<li><a href="/quitter">Quitter</a></li>
</ul>
</div>
templates/lister.html
{% block body %}

<link rel="stylesheet" type="text/css" href="{{url_for('static',filename='css/bootstrap.min.css')}}">


<script type="text/javascript" src="{{url_for('static',filename='js/jquery.js')}}"></script>
<script type="text/javascript" src="{{url_for('static',filename='js/bootstrap.min.js')}}"></script>
<div class="container-fluid">
<div class="row">

{% include 'entete.html' %}
<div class="col-md-6 col-md-offset-4">
<button class="btn btn-primary pull-right" data-toggle="modal" data-target="#ajout">Ajouter</button>
<table class="table table-bordered table-striped">
<thead>
<tr class="info">
<th width="5%">#</th>
<th width="20%">Article</th>
<th width="20%">Categorie</th>
<th width="20%">Menu</th>
</tr>
</thead>
<tbody>
Bonjour&nbsp;{{ session['cmp'] }}
{% for da in da %}
<tr>
<td>{{ da[0] }}</td>
<td>{{ da[1] }}</td>
<td>{{ da[2] }}</td>
<td>
<button class="btn btn-default"><span class="glyphicon glyphicon-pencil" data-toggle="modal" data-target="#modif{{ da[0] }}"></span></button>

<!--Modale modification -->


<div class="modal fade" tabindex="-1"
aria-labelledby="modification{{ da[0] }}" aria-hidden="true" role="dialog" id="modif{{ da[0] }}">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button class="close" data-dismiss="modal" aria-hidden="true">&times</button>
</div>
<div class="modal-body">
<form action="{{url_for('modification')}}" method="POST">
<input type="text" name="article{{ da[0] }}" class="form-control" placeholder="Entrer l'article"
required value="{{ da[1] }}">
<input type="hidden" name="ida" value="{{ da[0] }}">
<select class="form-control" name="idc{{ da[0] }}" required >

<option value="" selected>Categorie</option>


{% for dc in dc %}
<option value="{{ dc[0] }}">{{ dc[1] }}
</option>
{% endfor %}
</select>
<button class="btn btn-primary btn-block">Modifier</button>
</form>
</div>
</div>

</div>
</div>
</div>
<!--fin modale modification -->
<a href="/supprimer/{{ da[0] }}"><button class="btn btn-danger"><span class="glyphicon
glyphicon-trash"></span></button></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="modal fade" tabindex="-1" aria-labelledby="inscritption" aria-hidden="true" role="dialog" id="ajout">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button class="close" data-dismiss="modal" aria-hidden="true">&times</button>
</div>
<div class="modal-body">
<form action="{{url_for('ajouter')}}" method="POST">
<input type="text" name="article" class="form-control" placeholder="Entrer l'article" required>

<select class="form-control" name="idc" required>


{% for dc in dc %}
<option value="" selected>Categorie</option>
<option value="{{ dc[0] }}">{{ dc[1] }}
</option>
{% endfor %}
</select>
<button class="btn btn-primary btn-block">Enregistrer</button>
</form>
</div>
</div>

</div>
</div>
</div>
</div>
</div>

{% endblock %}
Travaux dirigés

 Dans le but de recevoir les propositions des enseignants, le personnel et les étudiants, le coordonnateur de la
formation MIAGE demande aux étudiants de MIAGE 1 de créer une application mobile.

Langage de programmation : Python, Framework: Flask, SGBD: MySQL, Framework: Bootstrap

Structure de la base de données:

CREATE DATABASE messagerie;

use messagerie;

CREATE TABLE message(

id INT PRIMARY KEY


AUTO_INCREMENT,

objet TEXT NOT NULL,

message TEXT NOT NULL

);

Figure 1

Travail à faire :

1. Créer le formulaire de la figure 1


2. Créer le formulaire de la figure 2
3. Ecrire le script Python qui permet d’insérer le message dans la table message depuis le formulaire de la figure 1
4. Ecrire le script Python qui permet d’afficher le message de la table message (voir figure 2)
5. Ecrire le script Python qui permet de lire le message de la table message (voir figure 3)
 Remarque : L’utilisateur lira le message s’il clique sur le bouton ‘Bleu’ du message
6. Ecrire le script Python qui permet de supprimer un message en cliquant sur le bouton ‘rouge’ du message
correspondant (voir figure 3)

154
Figure 2

Figure 3

155
1. Créer le formulaire de la figure 1 : templates/index.html

156
2. figure 2

157
Templates/code.html

158
Script de la base de données

159
160/3
Gestion de stock avec Flask

import pymysql
from flask import Flask,render_template,redirect,session,request
cn=pymysql.connect(host='localhost',
port=3306,database='stockL1',user='root',password='root')
cr=cn.cursor()
#-----------------------------------------------
app=Flask(__name__)
@app.route('/')
def index():
return render_template("index.html")
@app.route("/authentifier",methods=['POST','GET'])
def authentifier():
if request.method == 'POST':
c=request.form['compte']
p=request.form['motpasse']
cr.execute("SELECT compte,motpasse FROM compte WHERE compte='%s' and
motpasse='%s'"%(c,p))
d=cr.fetchall()
if d:
if d[0][0] == c and d[0][1] == p:
session['c']=d[0][0]
return accueil()
else:
return render_template("erreur.html",e=1)
else:
return index()
@app.route('/accueil')
def accueil():
cr.execute('''SELECT ida,article,categorie,0 as reste FROM categorie C,article A
where C.idcat=A.idcat and
ida not in (SELECT ida from stock) UNION
SELECT A.ida,article,categorie,sum(qtee-qtes) reste FROM categorie C,article
A,stock S
where C.idcat=A.idcat and S.ida=A.ida group by A.idA;''')
a=cr.fetchall()
cr.execute("SELECT * FROM categorie")
C=cr.fetchall()
cr.execute("SELECT * FROM service")
s=cr.fetchall()
return render_template("accueil.html",d=a,c=C,S=s)

@app.route('/ajoutArticle',methods=['POST','GET'])
def ajoutArticle():
if request.method == 'POST':
a=request.form['article']
c=request.form['idcat']
cr.execute("INSERT INTO article(article,idcat) VALUES('%s',%s)"%(a,c))
cn.commit()
return accueil()
@app.route('/nouvelQte',methods=['POST','GET'])
def nouvelQte():
161/3
if request.method == 'POST':
a=request.form['ida']
qe=request.form['qtee']
cr.execute("INSERT INTO stock(qtee,ida) VALUES(%s,%s)"%(qe,a))
cn.commit()
return accueil()
@app.route('/retraitQte',methods=['POST','GET'])
def retraitQte():
if request.method == 'POST':
ids=request.form['ids']
a=request.form['ida']
qs=request.form['qtes']
cr.execute("INSERT INTO stock(qtes,ida,ids,op) VALUES(%s,%s,%s,1)"%(qs,a,ids))
cn.commit()
return accueil()
@app.route('/detail/<int:id>')
def detail(id):
cr.execute("SELECT A.ida,qtee,qtes,op,jour FROM article A,stock S where S.ida=A.ida
and A.ida=%s"%id)
Det=cr.fetchall()
return render_template("detail.html",Det=Det)
if __name__ == "__main__":
app.run(port=7777,debug=True)

Exercice d’application

Objectifs globaux : Créer une application avec le langage PYTHON


Objectifs spécifiques :

- Création d’une application de vente des chaussures. En effet, le gestionnaire peut choisir les
chaussures et chaque chaussure choisie est envoyée dans le panier virtuel.
- Le gestionnaire peut visualiser le contenu du panier et décidera de valider sa commande

Remarque : Enregistrez tous les fichiers dans un dossier qui portera vos Nom et Prénoms. Y compris le
fichier du script python.
A la fin, l’administration s’en chargera d’attribuer un numéro anonyme pour la correction
 Explications relatives aux champs des tables de la base de données VENTES
Table ARTICLE
Propriété Type Contraintes Explication
numArticle INT PRIMARY KEY Numéro de de l’article. Il est auto incrémenté
prixArticle INT(7) NOT NULL Le prix de l’article
photo TEXT Photo de l’article
Table ACHAT
Propriété Type Contraintes Explication
id INT PRIMARY KEY Identifiant de la table ACHAT. Il est auto incrémenté

162/3
qte INT(7) NOT NULL, la valeur 1 par défaut Quantité de l’article acheté
idCommande INT FOREIGN KEY La clef étrangère fournie par la table COMMANDE
idArticle INT FOREIGN KEY La clef étrangère fournie par la table ARTICLE
Table COMMANDE
Propriété Type Contraintes Explication
id INT PRIMARY KEY Identifiant de la commande, Il est auto incrémenté
jour DATE NOT NULL Date de la commande
Outils de travail :

- SGBDR : SQLITE
- Langage de programmation : PHP (pour la première partie)
- Langage de programmation : PYTHON (pour la deuxième partie)
- Framework : Bootstrap

Travail demandé

PARTIE 1 : (sur 14) :

1. Créer la base de données VENTES et les tables ARTICLE, COMMANDE, MOUVEMENT, en


utilisant SQLITE (3 points)

2. Programmer le scenario de choix des chaussures et leur envoi dans le panier virtuel avec le
langage PHP. (Voir la figure 1) (11 points)

PARTIE 2 : (sur 6 points)

1. Ecrire le script python qui permettra d’ajouter les articles dans la table ARTICLE (2 points)

2. Ecrire le script python qui permet d’afficher tous les articles ajoutés dans la table ARTICLE

(2 points)

3. Ecrire le script python qui permet de modifier un enregistrement d’article (2 points)

163/3
Figure 1

164/3
Objectifs : créer une application d’authentification des diplômes nigériens. Permettre aux
institutions publiques, privées de vérifier l’authenticité du diplôme avant de recruter ou confier un
poste de responsabilité à une personne détentrice du diplôme. Ce qui permettra de limiter la
circulation des faux diplômes au Niger et garder toujours la crédibilité de nos diplômes.
Le nom de l’application est ADN : Authentification des Diplômes Nigériens
Description du système d’information
A chaque diplôme enregistré correspond un numéro généré automatique. Ce numéro est remis au
détenteur du diplôme. Il introduit ce numéro dans son dossier à chaque fois qu’il souhaite déposer
son dossier de candidature pour un poste de responsabilité.
Pour vérifier l’authenticité du diplôme, l’internaute entre le numéro du diplôme enregistré dans la
base de données. S’il existe un résultat correspondant au numéro saisi alors la page résultat s’affiche
sinon un message s’affiche pour lui indiquer qu’aucune donnée ne correspond à sa demande. Il peut
pourra aussi imprimer le résultat de la recherche.
Outils utilisés :

- Langage de programmation : PYTHON


- Framework : FLASH
- SGBD : MySQL(voir la structure de la base de données à la suivante)

Dictionnaire de données simplifié

Nomenclature Explication Type (taille) Contrainte


codeDip Code du diplôme INT PRIMARY KEY, auto_increment
libelle Le diplôme VARCHAR(50) NOT NULL
intitule L’intitulé du diplôme TEXT NOT NULL
domaine La spécialisation du diplôme VARCHAR(50) NOT NULL
dateOb La date d’obtention du diplôme DATE NOT NULL, Format YYYY- MM-DD
etab Etablissement qui a délivré le diplôme TEXT NOT NULL
mention La mention obtenue VARCHAR(25) NOT NULL.
nomPro Le nom du propriétaire du diplôme VARCHAR(50) NOT NULL.
prenomPro Le prénom du propriétaire du diplôme VARCHAR(50) NOT NULL.
dateNaiss La date de naissance du propriétaire DATE NOT NULL, Format YYYY- MM-DD
lieuNaiss Le lieu de naissance du propriétaire VARCHAR(50) NOT NULL.
tel Le numéro de téléphone du INT(8) NOT NULL.
propriétaire
photo La photo du propriétaire du diplôme TEXT NOT NULL.

Structure de la base de données

create database adn;


use adn;
create table diplome (
codeDip INT PRIMARY KEY AUTO_INCREMENT,
libelle VARCHAR(50) NOT NULL,

165
intitule TEXT NOT NULL,
domaine VARCHAR(50) NOT NULL,
dateOb DATE NOT NULL,
etab TEXT NOT NULL,
mention VARCHAR(25) NOT NULL,
nomPro VARCHAR(50) NOT NULL,
prenomPro VARCHAR(50) NOT NULL,
dateNaiss DATE NOT NULL,
lieuNaiss VARCHAR(50) NOT NULL,
tel INT(8) NOT NULL,
photo TEXT NOT NULL
);

create table admin(id int PRIMARY KEY AUTO_INCREMENT,cmp VARCHAR(30) NOT NULL UNIQUE,
mdp VARCHAR(30) NOT NULL,profile INT(1));
insert into admin values(1,'admin','admin',0);

Barème du travail demandé:

a. Création de l’interface statique figure 1 = 0.5 point


b. Recherche du diplôme et obtention d’un résultat avec code PHP [figure 2] = 2 points
c. Création de l’interface statique pour afficher le résultat de la recherche = 1 point
d. Création du formulaire statique de connexion à l’application = 1 point
e. Connexion à l’application [voir figure 3] avec PHP = 2 points
 L’utilisateur saisit son compte et mot de passe et se connecte à l’application
f. Création de la page statique [figure 4] = 1 point
g. Créer le formulaire statique de figure 5] = 1.5 points
h. Ecrire le script PHP pour insérer les données dans la table ‘diplôme’ = 2 points
i. Ecrire un script PHP d’affichage des données sur la figure 4 = 2 points
j. Ecrire un script PHP de modification des données sur la figure 6 = 2 points
k. Créer le page statique de la figure 7 = 1 point
l. Ecrire un script PHP d’affichage des détails du diplôme [figure 6] = 1 point
m. Ecrire le script PHP pour la déconnexion à l’application = 1 point
n. Interaction Homme-Machine (afficher des messages sil l’opération échouée ou réussie) = 1 point
o. Contrôle des champs de saisie sur les formulaires 1 point

166
Figure 1 :

 L’internaute saisit le code du diplôme recherché et il est redirigé sur la page de la figure 2. S’il existe un
résultat correspondant à sa recherche alors il aura les informations souhaitées sinon un message d’erreur
s’affiche.

167
Figure 2 : résultat de la recherche en fonction du code de diplôme saisi.

168
Figure 3 : connexion à l’application.

L’utilisation saisit son compte et mot de passe et coche la case au cas où il s’agit d’un administrateur. Si
l’authentification est réalisée avec succès alors il redirigé vers la page Figure 4. La vérification du compte
et mot de passe se fait dans la table admin sur les champs cmp, mdp et profile

Figure 4 : liste des diplômes enregistrés dans la table ‘diplôme’.

169
Figure 5 : Enregistrement des données dans la table ‘diplôme’.

Pour ajouter un nouveau diplôme, l’utilisateur doit cliquer sur le bouton Ajouter un diplôme et la page
modale ci-dessus.

Figure 6 : Modification d’un enregistrement de la table ‘diplôme’.

 Pour modifier un enregistrement, l’utilisateur doit cliquer sur le bouton ‘edit, voir le schéma de la
figure ci-dessus

170
Figure 7 : Obtenir les détails sur un enregistrement de la table ‘diplôme’.

 Pour obtenir les détails sur un enregistrement l’utilisateur doit cliquer sur le bouton en bleu, voir la
figure ci-dessus

171

Vous aimerez peut-être aussi