Benoît Verhaeghe

Reporting sur la commande last

Python - TP4

Posted by Benoît "badetitou" Verhaeghe on December 2, 2019

Reporting sur la commande last

Sujet

En utilisant la commande last (ou en utilisant un fichier simulant le résultat de cette commande sur un poste de travail très fréquenté), écrire un script python qui liste les jours de connexion des utilisateurs qui ont fréquenté cette machine (en sachant que vous désirez surveiller les (mauvaises) fréquentations de celle-ci).

Réalisez ce programme en quatre étapes (qui se complèteront progressivement) :

  • Pour information, exécutez dans le script la commande last et affichez son résultat dans le terminal
  • Récupérez maintenant le résultat de cette commande dans votre script. Mettez en place progressivement l’expression régulière qui extrait :
    • le login
    • le nom du mois et le numéro du jour dans le mois (la date)
    • le nombre d’heures
    • le nombre de minutes
  • et affichez ces informations
  • Affichez :
    • le nombre de connexions par login (via un dictionnaire)
    • le nombre de connexions et le temps de connexions (en minutes) par login (via un dictionnaire de listes)
    • puis par login et par date (via un dictionnaires de dictionnaires de listes)
    • Suivant des paramètres indiquant un nombre maximal de connexions et/ou un temps de connexion cumulé maximal, affichez des alertes !

Correction

#!/usr/bin/env python3

import os, sys, collections, re


f = open(sys.argv[1], 'r')
nbConnection = collections.Counter()
connectEtTemps = dict()
loginAndDate = dict()


for line in f:
    username = re.search("^\S* ",line)
    if username:
        print("username: ", username.group())
        username = username.group()[:-1]
    date = re.search(" [A-Z][a-z][a-z] ([0-9]| )[0-9]",line)
    if date:
        print("date: ", date.group())
        date = date.group()[1:]
    nbHeure = re.search("\([0-9][0-9]",line)
    if nbHeure:
        nbHeure = nbHeure.group()[1:]
        print("nbHeure: ", nbHeure)
    nbMinute = re.search("[0-9][0-9]\)",line)
    if nbMinute:
        nbMinute = nbMinute.group()[:-1]
        print("nbMinute: ", nbMinute)

    # le nombre de connexions par login (via un dictionnaire)

    nbConnection[username] += 1
    if username not in connectEtTemps.keys():
        connectEtTemps[username] = list()

    # le nombre de connexions et le temps de connexions (en minutes) par login (via un dictionnaire de listes)

    if nbHeure and nbMinute:
        connectEtTemps[username].append(int(nbHeure)*60 + int(nbMinute))

    # puis par login et par date (via un dictionnaires de dictionnaires de listes)

    if username not in loginAndDate.keys():
        loginAndDate[username] = dict()
    if date not in loginAndDate[username].keys():
        loginAndDate[username][date] = list()
    if nbHeure and nbMinute:
        loginAndDate[username][date].append(int(nbHeure)*60 + int(nbMinute))


# print("nbConnections: ", nbConnection)

# print("connectEtTemps: ", connectEtTemps)

# print("loginAndDate: ", loginAndDate)


# affichage avancé pour login and date


for k, v in loginAndDate.items():
    print(k, " s'est connecté les: ", end = '')
    for k2,v2 in v.items():
        print(k2, " durant", sum(v2), "min ; ", end = '')
    print()