@@ -52,18 +52,20 @@ def find_asset_events(http_session: requests.AuthorizedSession,
5252 end_time : str ,
5353 reference_time : Optional [str ] = None ,
5454 max_results : Optional [int ] = None ) -> None :
55- """Find asset events in Chronicle using the Legacy Find Asset Events API.
55+ """Find asset events in Chronicle using the Legacy Find Asset Events API.
5656
5757 Args:
5858 http_session: Authorized session for HTTP requests.
5959 proj_id: GCP project id or number to which the target instance belongs.
60- proj_instance: Customer ID (uuid with dashes) for the Chronicle instance.
60+ proj_instance: Customer ID (uuid with dashes) for the instance.
6161 proj_region: region in which the target project is located.
62- asset_indicator: JSON string containing the asset indicator to search for.
62+ asset_indicator: JSON str containing the asset indicator to search for.
6363 start_time: Start time in RFC3339 format (e.g., "2024-01-01T00:00:00Z").
6464 end_time: End time in RFC3339 format (e.g., "2024-01-02T00:00:00Z").
65- reference_time: Optional reference time in RFC3339 format for asset aliasing.
66- max_results: Optional maximum number of results to return (default: 10000, max: 250000).
65+ reference_time: Optional reference time in RFC3339 format for
66+ asset aliasing.
67+ max_results: Optional maximum number of results to return
68+ (default: 10000, max: 250000).
6769
6870 Raises:
6971 requests.exceptions.HTTPError: HTTP request resulted in an error
@@ -73,100 +75,104 @@ def find_asset_events(http_session: requests.AuthorizedSession,
7375 Requires the following IAM permission on the instance resource:
7476 chronicle.legacies.legacyFindAssetEvents
7577 """
76- # Validate and parse the times to ensure they're in RFC3339 format
77- for time_str in [start_time , end_time , reference_time
78- ] if reference_time else [start_time , end_time ]:
79- try :
80- datetime .strptime (time_str , "%Y-%m-%dT%H:%M:%SZ" )
81- except ValueError as e :
82- if "does not match format" in str (e ):
83- raise ValueError (
84- f"Time '{ time_str } ' must be in RFC3339 format (e.g., '2024-01-01T00:00:00Z')"
85- ) from e
86- raise
87-
88- base_url_with_region = regions .url_always_prepend_region (
89- CHRONICLE_API_BASE_URL , proj_region )
90- instance = f"projects/{ proj_id } /locations/{ proj_region } /instances/{ proj_instance } "
91- url = f"{ base_url_with_region } /v1alpha/{ instance } /legacy:legacyFindAssetEvents"
92-
93- # Build query parameters
94- params = [
95- f"assetIndicator={ asset_indicator } " ,
96- f"timeRange.startTime={ start_time } " , f"timeRange.endTime={ end_time } "
97- ]
98-
99- if reference_time :
100- params .append (f"referenceTime={ reference_time } " )
101-
102- if max_results :
103- # Ensure max_results is within bounds
104- max_results = min (max (1 , max_results ), MAX_RESULTS_LIMIT )
105- params .append (f"maxResults={ max_results } " )
106-
107- url = f"{ url } ?{ '&' .join (params )} "
108-
109- response = http_session .request ("GET" , url )
110- if response .status_code >= 400 :
111- print (response .text )
112- response .raise_for_status ()
113-
114- result = response .json ()
115- print (json .dumps (result , indent = 2 ))
116-
117- if result .get ("more_data_available" ):
118- print (
119- "\n Warning: More data is available but was not returned due to maxResults limit."
120- )
121-
122- if result .get ("uri" ):
123- print ("\n Backstory UI URLs:" )
124- for uri in result ["uri" ]:
125- print (f" { uri } " )
126-
127-
128- if __name__ == "__main__" :
129- parser = argparse .ArgumentParser ()
130- # common
131- chronicle_auth .add_argument_credentials_file (parser )
132- project_instance .add_argument_project_instance (parser )
133- project_id .add_argument_project_id (parser )
134- regions .add_argument_region (parser )
135- # local
136- parser .add_argument (
137- "--asset_indicator" ,
138- type = str ,
139- required = True ,
140- help =
141- "JSON string containing the asset indicator (e.g., '{\" hostname\" : \" example.com\" }')"
142- )
143- parser .add_argument (
144- "--start_time" ,
145- type = str ,
146- required = True ,
147- help = "Start time in RFC3339 format (e.g., '2024-01-01T00:00:00Z')" )
148- parser .add_argument (
149- "--end_time" ,
150- type = str ,
151- required = True ,
152- help = "End time in RFC3339 format (e.g., '2024-01-02T00:00:00Z')" )
153- parser .add_argument (
154- "--reference_time" ,
155- type = str ,
156- help = "Optional reference time in RFC3339 format for asset aliasing" )
157- parser .add_argument (
158- "--max_results" ,
159- type = int ,
160- help =
161- f"Maximum number of results to return (default: { DEFAULT_MAX_RESULTS } , max: { MAX_RESULTS_LIMIT } )"
78+ # Validate and parse the times to ensure they're in RFC3339 format
79+ for time_str in [start_time , end_time , reference_time
80+ ] if reference_time else [start_time , end_time ]:
81+ try :
82+ datetime .strptime (time_str , "%Y-%m-%dT%H:%M:%SZ" )
83+ except ValueError as e :
84+ if "does not match format" in str (e ):
85+ raise ValueError (
86+ f"Time '{ time_str } ' must be in RFC3339 format "
87+ "(e.g., '2024-01-01T00:00:00Z')"
88+ ) from e
89+ raise
90+
91+ base_url_with_region = regions .url_always_prepend_region (
92+ CHRONICLE_API_BASE_URL , proj_region )
93+ instance = f"projects/{ proj_id } /locations/{ proj_region } /instances/{ proj_instance } "
94+ url = f"{ base_url_with_region } /v1alpha/{ instance } /legacy:legacyFindAssetEvents"
95+
96+ # Build query parameters
97+ params = [
98+ f"assetIndicator={ asset_indicator } " , f"timeRange.startTime={ start_time } " ,
99+ f"timeRange.endTime={ end_time } "
100+ ]
101+
102+ if reference_time :
103+ params .append (f"referenceTime={ reference_time } " )
104+
105+ if max_results :
106+ # Ensure max_results is within bounds
107+ max_results = min (max (1 , max_results ), MAX_RESULTS_LIMIT )
108+ params .append (f"maxResults={ max_results } " )
109+
110+ url = f"{ url } ?{ '&' .join (params )} "
111+
112+ response = http_session .request ("GET" , url )
113+ if response .status_code >= 400 :
114+ print (response .text )
115+ response .raise_for_status ()
116+
117+ result = response .json ()
118+ print (json .dumps (result , indent = 2 ))
119+
120+ if result .get ("more_data_available" ):
121+ print (
122+ "\n Warning: More data is available but was not returned due to "
123+ "maxResults limit."
162124 )
163125
164- args = parser .parse_args ()
126+ if result .get ("uri" ):
127+ print ("\n Backstory UI URLs:" )
128+ for uri in result ["uri" ]:
129+ print (f" { uri } " )
165130
166- auth_session = chronicle_auth .initialize_http_session (
167- args .credentials_file ,
168- SCOPES ,
169- )
170- find_asset_events (auth_session , args .project_id , args .project_instance ,
171- args .region , args .asset_indicator , args .start_time ,
172- args .end_time , args .reference_time , args .max_results )
131+
132+ if __name__ == "__main__" :
133+ parser = argparse .ArgumentParser ()
134+ # common
135+ chronicle_auth .add_argument_credentials_file (parser )
136+ project_instance .add_argument_project_instance (parser )
137+ project_id .add_argument_project_id (parser )
138+ regions .add_argument_region (parser )
139+ # local
140+ parser .add_argument (
141+ "--asset_indicator" ,
142+ type = str ,
143+ required = True ,
144+ help =
145+ "JSON string containing the asset indicator "
146+ "(e.g., '{\" hostname\" : \" example.com\" }')"
147+ )
148+ parser .add_argument (
149+ "--start_time" ,
150+ type = str ,
151+ required = True ,
152+ help = "Start time in RFC3339 format (e.g., '2024-01-01T00:00:00Z')" )
153+ parser .add_argument (
154+ "--end_time" ,
155+ type = str ,
156+ required = True ,
157+ help = "End time in RFC3339 format (e.g., '2024-01-02T00:00:00Z')" )
158+ parser .add_argument (
159+ "--reference_time" ,
160+ type = str ,
161+ help = "Optional reference time in RFC3339 format for asset aliasing" )
162+ parser .add_argument (
163+ "--max_results" ,
164+ type = int ,
165+ help =
166+ "Maximum number of results to return "
167+ f"(default: { DEFAULT_MAX_RESULTS } , max: { MAX_RESULTS_LIMIT } )"
168+ )
169+
170+ args = parser .parse_args ()
171+
172+ auth_session = chronicle_auth .initialize_http_session (
173+ args .credentials_file ,
174+ SCOPES ,
175+ )
176+ find_asset_events (auth_session , args .project_id , args .project_instance ,
177+ args .region , args .asset_indicator , args .start_time ,
178+ args .end_time , args .reference_time , args .max_results )
0 commit comments