-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparseur_arguments_cli.py
More file actions
124 lines (106 loc) · 4.43 KB
/
parseur_arguments_cli.py
File metadata and controls
124 lines (106 loc) · 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"""
Module pour analyser les arguments passés en ligne de commande.
"""
from argparse import ArgumentParser, Namespace
from re import match
from typing import Optional
class ParseurArgumentsCLI(ArgumentParser):
"""
Représente un parseur pour analyser les arguments passés en ligne
de commande pour l'application.
"""
def __init__(self):
"""
Initialise uparseur pour analyser les arguments passés en ligne de commande.
"""
super().__init__(
description="LogBuster, l'analyseur de log Apache.", allow_abbrev=False,
)
self.__set_arguments()
def __set_arguments(self) -> None:
"""
Définit les arguments attendus par l'application.
Returns:
None
"""
# -- Argument obligatoire --
self.add_argument(
"chemin_log",
type=str,
help="Chemin du fichier log Apache à analyser."
)
# -- Argument optionnel --
self.add_argument(
"-s",
"--sortie",
type=str,
default="./",
help="Dossier où sera écrit l'analyse du fichier de log Apache. Par défaut,"
"sa valeur est le répertoire d'exécution du script.",
)
self.add_argument(
"-i",
"--ip",
type=str,
help="L'adresse IP que doivent avoir les entrées à analyser."
)
self.add_argument(
"-c",
"--code-statut-http",
type=int,
help="Le code de statut http que doivent avoir les entrées à analyser."
)
self.add_argument(
"--camembert",
action="store_true",
help="Active la génération d'histogrammes pour les statistiques compatibles."
)
def parse_args(self,
args: Optional[list] = None,
namespace: Optional[Namespace] = None) -> Namespace:
"""
Récupère les arguments passés en ligne de commande puis vérifie
que leur format est conforme à ceux attendus.
Args:
args (Optional[list]): Liste des arguments passés en paramètre.
Si ``None``, les arguments de la ligne de commande sont utilisés.
namespace (Optional[Namespace]): Un espace de noms (namespace)
pour stocker les résultats. Si ``None``, un nouvel espace de noms est créé.
Returns:
Namespace: L'objet contenant les arguments analysés et leurs valeurs.
Raises:
ArgumentCLIException: Si une erreur se produit lors du parsing des arguments
(par exemple, si un argument inconnu est fourni ou si son format est invalide).
"""
# Vérification du type des paramètres
if args is not None and not isinstance(args, list):
raise TypeError("Les arguments doivent soit être None, soit être dans une liste.")
if namespace is not None and not isinstance(args, Namespace):
raise TypeError("L'espace de noms doit soit être None, soit être un objet Namespace.")
# Analyse des arguments
try:
arguments_parses = super().parse_args(args, namespace)
except SystemExit as ex: #Arguments inconnus
raise ArgumentCLIException() from ex
# Vérification syntaxique des arguments
regex_chemin = r"^[a-zA-Z0-9:_\\\-.\/]+$"
if not match(regex_chemin, arguments_parses.chemin_log):
raise ArgumentCLIException(
"Le chemin du fichier log doit uniquement contenir les caractères autorisés. "
"Les caractères autorisés sont les minuscules, majuscules, chiffres ou les "
"caractères spéciaux suivants: _, \\, -, /."
)
if not match(regex_chemin, arguments_parses.sortie):
raise ArgumentCLIException(
"Le chemin du dossier de sortie doit uniquement contenir les caractères "
"autorisés. Les caractères autorisés sont les minuscules, majuscules, "
"chiffres ou les caractères spéciaux suivants: _, \\, -, /."
)
return arguments_parses
class ArgumentCLIException(Exception):
"""
Représente une erreur lorsque un argument passé en ligne de commande
est inconnu ou que son format est invalide.
"""
def __init__(self, *args):
super().__init__(*args)