Aller au contenu

TP Python – Analyser un journal de connexions

BTS SIO SISR 2e année – Pour aller plus loin – S18

Note

Comment ce TP fonctionne. Chaque exercice a un éditeur Python intégré à la page (il s'exécute dans ton navigateur, rien à installer). Avant de lancer, écris sur ta feuille ce que tu anticipes (« J'anticipe »). Puis lance et compare. Le bouton Valider exécute des tests : un test réussi ne dispense pas de comprendre pourquoi.

Exercice A – Lire une ligne

Écris parse_ligne(ligne) qui renvoie le couple (adresse, statut) d'une ligne "adresse;statut", en retirant les espaces autour des deux champs.

J'anticipe. Que renvoie " a ; OK ".split(";") ? Que faut-il en plus ?

###
assert parsepy-undligne("10.0.0.1;OK") == ("10.0.0.1", "OK")bksl-nlassert parsepy-undligne(" 10.0.0.2 ; ECHEC ") == ("10.0.0.2", "ECHEC")bksl-nlassert parsepy-undligne("a;ECHEC") == ("a", "ECHEC")bksl-nlbksl-nl ∞/∞

def parsepy-undligne(ligne):bksl-nl """(adresse, statut) d'une ligne 'adresse;statut'."""bksl-nl ...bksl-nlbksl-nl



Exercice B – Compter les échecs

Écris echecs_par_ip(lignes) qui renvoie un dictionnaire adresse → nombre d'échecs, uniquement pour les adresses ayant au moins un échec. Réutilise parse_ligne (recopie-la au début du fichier).

###
assert echecspy-undparpy-undip(["10.0.0.1;OK", "10.0.0.2;ECHEC", "10.0.0.2;ECHEC", "10.0.0.3;ECHEC", "10.0.0.2;ECHEC", "10.0.0.1;ECHEC"]) == {"10.0.0.2": 3, "10.0.0.3": 1, "10.0.0.1": 1}bksl-nlassert echecspy-undparpy-undip([]) == {}bksl-nlassert echecspy-undparpy-undip(["a;OK"]) == {}bksl-nlassert echecspy-undparpy-undip(["a;ECHEC"]) == {"a": 1}bksl-nlassert echecspy-undparpy-undip([" a ; ECHEC ", "a;ECHEC"]) == {"a": 2}bksl-nlbksl-nl ∞/∞

def parsepy-undligne(ligne):bksl-nl ip, statut = ligne.split(";")bksl-nl return (ip.strip(), statut.strip())bksl-nlbksl-nlbksl-nldef echecspy-undparpy-undip(lignes):bksl-nl """Dictionnaire adresse -> nombre d'echecs (>= 1)."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Énonce l'invariant de ta boucle.

Exercice C – Adresses suspectes

Écris suspectes(lignes, seuil) qui renvoie la liste triée des adresses ayant au moins seuil échecs.

###
assert suspectes(["10.0.0.1;OK", "10.0.0.2;ECHEC", "10.0.0.2;ECHEC", "10.0.0.3;ECHEC", "10.0.0.2;ECHEC", "10.0.0.1;ECHEC"], 2) == ["10.0.0.2"]bksl-nlassert suspectes(["10.0.0.1;OK", "10.0.0.2;ECHEC", "10.0.0.2;ECHEC", "10.0.0.3;ECHEC", "10.0.0.2;ECHEC", "10.0.0.1;ECHEC"], 1) == ["10.0.0.1", "10.0.0.2", "10.0.0.3"]bksl-nlassert suspectes(["10.0.0.1;OK", "10.0.0.2;ECHEC", "10.0.0.2;ECHEC", "10.0.0.3;ECHEC", "10.0.0.2;ECHEC", "10.0.0.1;ECHEC"], 4) == []bksl-nlassert suspectes([], 1) == []bksl-nlassert suspectes(["a;OK"], 1) == []bksl-nlbksl-nl ∞/∞

def parsepy-undligne(ligne):bksl-nl ip, statut = ligne.split(";")bksl-nl return (ip.strip(), statut.strip())bksl-nlbksl-nlbksl-nldef echecspy-undparpy-undip(lignes):bksl-nl d = {}bksl-nl for l in lignes:bksl-nl ip, statut = parsepy-undligne(l)bksl-nl if statut == "ECHEC":bksl-nl d[ip] = d.get(ip, 0) + 1bksl-nl return dbksl-nlbksl-nlbksl-nldef suspectes(lignes, seuil):bksl-nl """Adresses (triees) avec au moins seuil echecs."""bksl-nl ...bksl-nlbksl-nl



Exercice D – Rafale d'échecs

Écris rafale(lignes, ip, k) qui renvoie True si l'adresse ip a au moins k échecs consécutifs parmi ses lignes (un OK interrompt la série). On considère k >= 1.

J'anticipe. Pour ["a;ECHEC", "a;OK", "a;ECHEC", "a;ECHEC"], quelle est la plus longue série d'échecs de a ?

###
assert rafale(["10.0.0.1;OK", "10.0.0.2;ECHEC", "10.0.0.2;ECHEC", "10.0.0.3;ECHEC", "10.0.0.2;ECHEC", "10.0.0.1;ECHEC"], "10.0.0.2", 3) == Truebksl-nlassert rafale(["10.0.0.1;OK", "10.0.0.2;ECHEC", "10.0.0.2;ECHEC", "10.0.0.3;ECHEC", "10.0.0.2;ECHEC", "10.0.0.1;ECHEC"], "10.0.0.1", 2) == Falsebksl-nlassert rafale(["a;ECHEC", "a;OK", "a;ECHEC", "a;ECHEC"], "a", 2) == Truebksl-nlassert rafale(["a;ECHEC", "a;OK", "a;ECHEC", "a;ECHEC"], "a", 3) == Falsebksl-nlassert rafale([], "a", 1) == Falsebksl-nlassert rafale(["a;ECHEC", "a;OK", "a;ECHEC", "a;ECHEC"], "b", 1) == Falsebksl-nlbksl-nl ∞/∞

def rafale(lignes, ip, k):bksl-nl """True si ip a au moins k echecs consecutifs."""bksl-nl ...bksl-nlbksl-nl



Exercice E – Rapport

Écris rapport(lignes, seuil) qui renvoie la liste de chaînes "adresse : n" pour les adresses suspectes, triée par nombre d'échecs décroissant, puis par adresse croissante.

###
assert rapport(["10.0.0.1;OK", "10.0.0.2;ECHEC", "10.0.0.2;ECHEC", "10.0.0.3;ECHEC", "10.0.0.2;ECHEC", "10.0.0.1;ECHEC"], 2) == ["10.0.0.2 : 3"]bksl-nlassert rapport(["10.0.0.1;OK", "10.0.0.2;ECHEC", "10.0.0.2;ECHEC", "10.0.0.3;ECHEC", "10.0.0.2;ECHEC", "10.0.0.1;ECHEC"], 1) == ["10.0.0.2 : 3", "10.0.0.1 : 1", "10.0.0.3 : 1"]bksl-nlassert rapport(["10.0.0.1;OK", "10.0.0.2;ECHEC", "10.0.0.2;ECHEC", "10.0.0.3;ECHEC", "10.0.0.2;ECHEC", "10.0.0.1;ECHEC"], 9) == []bksl-nlassert rapport([], 1) == []bksl-nlbksl-nl ∞/∞

def rapport(lignes, seuil):bksl-nl """Lignes 'adresse : n' triees par n decroissant puis adresse."""bksl-nl ...bksl-nlbksl-nl