1+ import json
2+ from pystackpath .util import BaseObject , api_time_format
3+ from datetime import datetime as dt
4+ from datetime import timedelta
5+
6+
7+ ACCEPTED_ACTIONS = (
8+ 'ANY_ACTION' , 'ALLOW_ACTION' ,
9+ 'BLOCK_ACTION' , 'CAPTCHA_ACTION' ,
10+ 'HANDSHAKE_ACTION' , 'MONITOR_ACTION'
11+ )
12+ ACCEPTED_RESULTS = ('ANY_RESULT' , 'BLOCKED_RESULT' )
13+ ACCEPTED_SORT_BY = ('TIMESTAMP' , 'COUNTRY' , 'RULE_NAME' )
14+ ACCEPTED_SORT_ORDER = ('ASCENDING' , 'DESCENDING' )
15+ DEFAULT_DELTA_TIME = 1 # day
16+
17+
18+ class Events (BaseObject ):
19+
20+ def get (self , event_id ):
21+ """
22+ Get an Event by its ID
23+ """
24+ response = self ._client .get (f"{ self ._base_api } /events/{ event_id } " )
25+ return self .loaddict (response .json ())
26+
27+ def index (
28+ self ,
29+ page_request_first = None ,
30+ page_request_after = None ,
31+ page_request_filter = None ,
32+ page_request_sort_by = None ,
33+ start_date = None ,
34+ end_date = None ,
35+ filter_action_value = ACCEPTED_ACTIONS [0 ],
36+ filter_result_value = ACCEPTED_RESULTS [0 ],
37+ filter_client_ip = None ,
38+ filter_reference_id = None ,
39+ sort_by = ACCEPTED_SORT_BY [0 ],
40+ sort_order = ACCEPTED_SORT_ORDER [0 ]
41+ ):
42+ """
43+ Get all the Events.
44+ You can use the parameters to add options to your request.
45+ """
46+
47+ params = Events ._common_params (start_date , end_date , filter_action_value , \
48+ filter_result_value , filter_client_ip , filter_reference_id )
49+
50+ if page_request_first :
51+ params ['page_request.first' ] = page_request_first
52+
53+ if page_request_after :
54+ params ['page_request.after' ] = page_request_after
55+
56+ if page_request_filter :
57+ params ['page_request.filter' ] = page_request_filter
58+
59+ if page_request_sort_by :
60+ params ['page_request.sort_by' ] = page_request_sort_by
61+
62+ if sort_by not in ACCEPTED_SORT_BY :
63+ raise ValueError (f"{ sort_by } is not a valid sort type: { ACCEPTED_SORT_BY } " )
64+ params ['sort_by' ] = sort_by
65+
66+ if sort_order not in ACCEPTED_SORT_ORDER :
67+ raise ValueError (f"{ sort_order } is not a valid sort type: { ACCEPTED_SORT_ORDER } " )
68+ params ['sort_order' ] = sort_order
69+
70+ response = self ._client .get (f"{ self ._base_api } /events" , params = params )
71+ return self .loaddict (response .json ())
72+
73+
74+ def get_event_statistics (
75+ self ,
76+ start_date = None ,
77+ end_date = None ,
78+ filter_action_value = ACCEPTED_ACTIONS [0 ],
79+ filter_result_value = ACCEPTED_RESULTS [0 ],
80+ filter_client_ip = None ,
81+ filter_reference_id = None
82+ ):
83+ """
84+ Get WAF Event statistics
85+ You can use the parameters to add options to your request.
86+ """
87+ params = Events ._common_params (start_date , end_date , filter_action_value , \
88+ filter_result_value , filter_client_ip , filter_reference_id )
89+ response = self ._client .get (f"{ self ._base_api } /event_stats" , params = params )
90+ return self .loaddict (response .json ())
91+
92+
93+ @staticmethod
94+ def _common_params (
95+ start_date ,
96+ end_date ,
97+ filter_action_value ,
98+ filter_result_value ,
99+ filter_client_ip ,
100+ filter_reference_id
101+ ):
102+ params = dict ()
103+
104+ if end_date is None :
105+ end_date = dt .today ()
106+ if start_date is None :
107+ start_date = end_date - timedelta (days = DEFAULT_DELTA_TIME )
108+
109+ end_date_iso = api_time_format (end_date )
110+ start_date_iso = api_time_format (start_date )
111+
112+ if start_date_iso > end_date_iso :
113+ raise ValueError (f"Search start date, \" { start_date_iso } \" , is later than end date, \" { end_date_iso } \" !" )
114+
115+ params ['start_date' ] = start_date_iso
116+ params ['end_date' ] = end_date_iso
117+
118+ if filter_action_value not in ACCEPTED_ACTIONS :
119+ raise ValueError (f"{ filter_action_value } is not a valid action filter: { ACCEPTED_ACTIONS } " )
120+ params ['filter.action_value' ] = filter_action_value
121+
122+ if filter_result_value not in ACCEPTED_RESULTS :
123+ raise ValueError (f"{ filter_result_value } is not a valid action filter: { ACCEPTED_RESULTS } " )
124+ params ['filter.result_value' ] = filter_result_value
125+
126+ if filter_client_ip :
127+ params ['filter.client_ip' ] = filter_client_ip
128+
129+ if filter_reference_id :
130+ params ['filter.reference_id' ] = filter_reference_id
131+
132+ return params
0 commit comments