Skip to content

Commit cfd8ccb

Browse files
authored
Add argparse to bin/aip (#51)
* Refactor imports * Fix bad date reference (introduced error) * Add argparse with date and model options * Run if model selected or all * Move date funct. to utils * Create output dir on run_model to simplify logic * Add param to adjust logging level
1 parent 080a482 commit cfd8ccb

File tree

2 files changed

+51
-34
lines changed

2 files changed

+51
-34
lines changed

bin/aip

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -29,69 +29,72 @@ __license__ = "GPLv3"
2929
__maintainer__ = "Joaquin Bogado"
3030
__version__ = "1.0.0"
3131

32+
import argparse
3233
import logging
33-
import pandas as pd
34-
35-
from aip.data.access import data_path, project_dir
34+
from datetime import date
35+
from os import makedirs
36+
from os import path
37+
from aip.data.access import data_path
3638
from aip.models.alpha import Alpha
3739
from aip.models.prioritize import New
3840
from aip.models.prioritize import Consistent
3941
from aip.models.prioritize import RandomForest
40-
from os import makedirs, path, scandir
41-
from datetime import date, timedelta, datetime
42-
import sys
43-
42+
from aip.utils.date_utils import validate_and_convert_date
4443

45-
def validate_and_convert_date(date_str):
46-
"""
47-
Validates a date string in 'YYYY-MM-DD' format and converts it to a date object.
48-
"""
49-
try:
50-
dateobj = datetime.strptime(date_str, '%Y-%m-%d')
51-
return dateobj.date()
52-
except ValueError as e:
53-
print('Invalid date format. It should be YYYY-MM-DD')
54-
raise e
5544

56-
def run_model(aip_model_name, aip_output_dir, aip_model, date_day):
45+
def run_model(aip_model_name, aip_model, date_day):
5746
"""
5847
Run a given model with exception handling
5948
"""
6049
blocklist=""
50+
model_output_dir = path.join(data_path,'output',aip_model_name)
6151
# Make sure output directory is created
62-
if not path.exists(aip_output_dir):
63-
makedirs(aip_output_dir)
52+
if not path.exists(model_output_dir):
53+
makedirs(model_output_dir)
6454

6555
try:
66-
blocklist = aip_model.run(day)
67-
blocklist.to_csv(path.join(aip_output_dir, f'AIP-{aip_model_name}-{str(date_day)}.csv.gz'), index=False, compression='gzip')
56+
blocklist = aip_model.run(date_day)
57+
blocklist.to_csv(path.join(model_output_dir, f'AIP-{aip_model_name}-{str(date_day)}.csv.gz'), index=False, compression='gzip')
6858
logging.info(f"{aip_model_name} model completed successfully.")
6959
except Exception as e:
7060
logging.error(f"Error running {aip_model_name} model: {e}", exc_info=True)
7161

7262

73-
if __name__ == '__main__':
74-
if len(sys.argv) == 2:
75-
datestr = sys.argv[1]
76-
day = validate_and_convert_date(datestr)
77-
else:
78-
day = date.today()
63+
def main():
64+
parser = argparse.ArgumentParser(description='Attacker IP Prioritization (AIP) Tool')
65+
parser.add_argument('--date', type=str, help='The date for running the models in YYYY-MM-DD format. Defaults to today.', default=str(date.today()))
66+
parser.add_argument('--model', type=str, choices=['Alpha', 'Alpha7', 'Prioritize_New', 'Prioritize_Consistent', 'Random_Forest', 'all'], default='all', help='Select AIP model to run. Defaults to all.')
67+
parser.add_argument('-d', '--debug', required=False, help="Debugging mode.", action="store_const", dest="log_level", const=logging.DEBUG, default=logging.ERROR,)
68+
parser.add_argument('-v', '--verbose', required=False, help="Verbose mode", action="store_const", dest="log_level", const=logging.INFO,)
69+
70+
args = parser.parse_args()
7971

8072
# Set up logging
8173
log_fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
82-
logging.basicConfig(level=logging.DEBUG, format=log_fmt)
74+
logging.basicConfig(level=args.log_level, format=log_fmt)
75+
76+
# Validate input date
77+
run_date_day = validate_and_convert_date(args.date)
8378

8479
# Run Alpha Model
85-
run_model('Alpha', path.join(data_path, 'output', 'Alpha'), Alpha(), day)
80+
if args.model in ['Alpha', 'all']:
81+
run_model('Alpha', Alpha(), run_date_day)
8682

8783
# Alpha 7 Model
88-
run_model('Alpha7', path.join(data_path, 'output', 'Alpha7'), Alpha(lookback=7), day)
84+
if args.model in ['Alpha7', 'all']:
85+
run_model('Alpha7', Alpha(lookback=7), run_date_day)
8986

9087
# Prioritize New Model
91-
run_model('Prioritize_New', path.join(data_path, 'output', 'Prioritize_New'), New(), day)
88+
if args.model in ['Prioritize_New', 'all']:
89+
run_model('Prioritize_New', New(), run_date_day)
9290

9391
# Prioritize Consistent Model
94-
run_model('Prioritize_Consistent', path.join(data_path, 'output', 'Prioritize_Consistent'), Consistent(), day)
92+
if args.model in ['Prioritize_Consistent', 'all']:
93+
run_model('Prioritize_Consistent', Consistent(), run_date_day)
9594

9695
# Prioritize Random Forest Model
97-
run_model('Random_Forest', path.join(data_path, 'output', 'random_forest'), RandomForest(), day)
96+
if args.model in ['Random_Forest', 'all']:
97+
run_model('Random_Forest', RandomForest(), run_date_day)
98+
99+
if __name__ == '__main__':
100+
main()

lib/aip/utils/date_utils.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import logging
2+
from datetime import datetime
3+
4+
5+
def validate_and_convert_date(date_str):
6+
"""
7+
Validates a date string in 'YYYY-MM-DD' format and converts it to a date object.
8+
"""
9+
try:
10+
dateobj = datetime.strptime(date_str, '%Y-%m-%d')
11+
return dateobj.date()
12+
except ValueError as e:
13+
logging.error(f"Invalid date format for '{date_str}', expected YYYY-MM-DD")
14+
raise ValueError(f"Invalid date format: {date_str}, expected YYYY-MM-DD") from e

0 commit comments

Comments
 (0)