Spaces:
Sleeping
Sleeping
| import sys | |
| from typing import Any | |
| import requests | |
| # ========================================== | |
| # CONFIGURATION | |
| # ========================================== | |
| MY_SPACE_URL = "https://shiggii-s3-security-agent-env.hf.space" | |
| ENV_NAME = "CloudGuard-S3-Auditor" | |
| MODEL_NAME = "rule-based-baseline" | |
| # ========================================== | |
| # LOGGING UTILITIES | |
| # ========================================== | |
| def log_start(task: str) -> None: | |
| print(f"[START] task={task} env={ENV_NAME} model={MODEL_NAME}", flush=True) | |
| def log_step(step: int, action: str, reward: float, done: bool, error: str | None) -> None: | |
| err_str = error if error else "null" | |
| print( | |
| f"[STEP] step={step} action={action} reward={reward:.2f} " | |
| f"done={str(done).lower()} error={err_str}", | |
| flush=True, | |
| ) | |
| def log_end(success: bool, steps: int, score: float, rewards: list[float]) -> None: | |
| rewards_str = ",".join(f"{r:.2f}" for r in rewards) | |
| print( | |
| f"[END] success={str(success).lower()} steps={steps} " | |
| f"score={score:.4f} rewards={rewards_str}", | |
| flush=True, | |
| ) | |
| # ========================================== | |
| # REFINED BASELINE POLICY | |
| # ========================================== | |
| def decide_actions(obs: dict) -> list[str]: | |
| actions = [] | |
| if "buckets" not in obs: return ["noop"] | |
| for bucket in obs["buckets"]: | |
| name = bucket.get("name") | |
| is_public = bucket.get("policy") == "public" | |
| has_pii = bucket.get("contains_pii") is True | |
| is_req_public = bucket.get("is_required_public") is True | |
| is_encrypted = bucket.get("encryption") != "none" | |
| # 1. Priority: Secure PII (Confirmed working with make_private) | |
| if is_public and has_pii: | |
| actions.append(f"make_private:{name}") | |
| # 2. Priority: Compliance Encryption (Adding algorithm parameter to fix Error 400) | |
| if not is_encrypted and not is_req_public: | |
| actions.append(f"enable_encryption:{name}:aes256") | |
| return actions if actions else ["noop"] | |
| # ========================================== | |
| # EXECUTION ENGINE | |
| # ========================================== | |
| def run_task(task_id: str, base_url: str): | |
| log_start(task_id) | |
| base_url = base_url.rstrip('/') | |
| # 1. Reset | |
| try: | |
| resp = requests.post(f"{base_url}/reset", json={"task_id": task_id}, timeout=15) | |
| resp.raise_for_status() | |
| obs = resp.json() | |
| except Exception as e: | |
| print(f"❌ Connection Error: {e}") | |
| return | |
| all_rewards = [] | |
| step_num = 0 | |
| plan = decide_actions(obs) | |
| # 2. Execute Actions | |
| for action_str in plan: | |
| step_num += 1 | |
| try: | |
| resp = requests.post(f"{base_url}/step", json={"action": action_str}, timeout=10) | |
| # Fallback: If colon fails, try underscore, then Uppercase | |
| if resp.status_code == 400: | |
| alt_action = action_str.replace(":", "_") | |
| resp = requests.post(f"{base_url}/step", json={"action": alt_action}, timeout=10) | |
| if resp.status_code == 200: | |
| action_str = alt_action | |
| if resp.status_code != 200: | |
| log_step(step_num, action_str, 0.0, False, f"Err {resp.status_code}") | |
| all_rewards.append(0.0) | |
| continue | |
| result = resp.json() | |
| reward = result.get("reward", 0.0) | |
| done = result.get("done", False) | |
| all_rewards.append(reward) | |
| log_step(step_num, action_str, reward, done, None) | |
| if done: break | |
| except Exception as e: | |
| log_step(step_num, action_str, 0.0, False, str(e)) | |
| # 3. Final Grade | |
| try: | |
| grade_resp = requests.post(f"{base_url}/grade", timeout=10) | |
| grade = grade_resp.json() | |
| log_end( | |
| success=grade.get("success", False), | |
| steps=step_num, | |
| score=grade.get("score", 0.0), | |
| rewards=all_rewards | |
| ) | |
| except: | |
| print("❌ Final Grade failed.") | |
| # ========================================== | |
| # RUN | |
| # ========================================== | |
| print("🚀 Running Final CloudGuard Baseline...\n") | |
| for t in ["critical_leak", "audit_and_protect", "compliance_sweep"]: | |
| run_task(t, MY_SPACE_URL) | |
| print("-" * 50) |