add: tools, secrets (safe files), updated gitignore
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
har_path = '/home/naeel/terra/har/faststart.har'
|
||||
|
||||
def analyze_har():
|
||||
with open(har_path, 'r', encoding='utf-8') as f:
|
||||
har_data = json.load(f)
|
||||
|
||||
entries = har_data['log']['entries']
|
||||
|
||||
instance_id = None
|
||||
operation_id = None
|
||||
start_time = None
|
||||
end_time = None
|
||||
error_message = None
|
||||
|
||||
# Sort entries by start time
|
||||
entries.sort(key=lambda x: x['startedDateTime'])
|
||||
|
||||
for entry in entries:
|
||||
req = entry['request']
|
||||
res = entry['response']
|
||||
url = req['url']
|
||||
|
||||
# Look for instance UID in body
|
||||
if req.get('postData', {}).get('text'):
|
||||
if 'instanceUid' in req['postData']['text']:
|
||||
try:
|
||||
body = json.loads(req['postData']['text'])
|
||||
instance_id = body.get('instanceUid')
|
||||
except: pass
|
||||
|
||||
# Look for operation creation or status
|
||||
if '/instanceOperations' in url:
|
||||
if req['method'] == 'POST' and res['status'] == 201:
|
||||
try:
|
||||
body = json.loads(res['content'].get('text', '{}'))
|
||||
operation_id = body.get('uid')
|
||||
start_time = entry['startedDateTime']
|
||||
print(f"Operation started: {operation_id} at {start_time}")
|
||||
except: pass
|
||||
|
||||
# Match the UUID from the URL if not found in POST
|
||||
if not operation_id:
|
||||
parts = url.split('/')
|
||||
for part in parts:
|
||||
if len(part) == 36 and '-' in part: # UUID shape
|
||||
operation_id = part
|
||||
break
|
||||
|
||||
# Track operation progress/status
|
||||
if operation_id and f'/instanceOperations/{operation_id}' in url and req['method'] == 'GET':
|
||||
try:
|
||||
text = res['content'].get('text', '{}')
|
||||
if not text: continue
|
||||
body = json.loads(text)
|
||||
if isinstance(body, list):
|
||||
body = body[0] if body else {}
|
||||
status = body.get('status')
|
||||
print(f"Polling {operation_id}: status={status} at {entry['startedDateTime']}")
|
||||
# print(f"DEBUG: {text[:200]}") # Print first 200 chars
|
||||
if status in ['failed', 'completed', 'success', 'error', 'failed-manual-fix']:
|
||||
if not end_time or entry['startedDateTime'] > end_time:
|
||||
end_time = entry['startedDateTime']
|
||||
error_message = body.get('error') or body.get('message') or body.get('statusMessage')
|
||||
if not error_message and body.get('steps'):
|
||||
# Check steps for errors
|
||||
for step in body.get('steps'):
|
||||
if step.get('status') == 'failed':
|
||||
error_message = step.get('error') or step.get('statusMessage')
|
||||
print(f"Operation reached terminal status {status} at {end_time}")
|
||||
print(f"Full response: {text}")
|
||||
except Exception as e:
|
||||
# print(f"Error parsing: {e}")
|
||||
pass
|
||||
|
||||
# Check for Sun/Date anomalies in headers
|
||||
for header in res['headers']:
|
||||
if header['name'].lower() == 'date':
|
||||
if 'Sun' in header['value']:
|
||||
print(f"Strange Date header found: {header['value']} in {url}")
|
||||
|
||||
print(f"\nSummary:")
|
||||
print(f"Instance ID: {instance_id}")
|
||||
print(f"Operation ID: {operation_id}")
|
||||
if start_time and end_time:
|
||||
t1 = datetime.fromisoformat(start_time.replace('Z', '+00:00'))
|
||||
t2 = datetime.fromisoformat(end_time.replace('Z', '+00:00'))
|
||||
duration = (t2 - t1).total_seconds()
|
||||
print(f"Duration: {duration} seconds")
|
||||
else:
|
||||
print("Could not determine duration")
|
||||
print(f"Error: {error_message}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
analyze_har()
|
||||
Reference in New Issue
Block a user