Yog965/grc-ai-command-deck
0
1"""Phase 1: Fetch NIST controls and generate synthetic CloudTrail logs."""2 3from __future__ import annotations4 5import argparse6from pathlib import Path7 8from grc_ai_pipeline import (9 DEFAULT_NIST_JSON_URL,10 fetch_nist_controls,11 generate_synthetic_cloudtrail_logs,12 save_controls,13)14 15 16def parse_args() -> argparse.Namespace:17 parser = argparse.ArgumentParser(description="Phase 1 - Data Engineering")18 parser.add_argument("--nist-source-url", default=DEFAULT_NIST_JSON_URL)19 parser.add_argument("--logs-count", type=int, default=1000)20 parser.add_argument("--output-dir", type=Path, default=Path("outputs_phase1"))21 return parser.parse_args()22 23 24def main() -> None:25 args = parse_args()26 args.output_dir.mkdir(parents=True, exist_ok=True)27 28 controls_df = fetch_nist_controls(args.nist_source_url)29 controls_json = args.output_dir / "nist_controls_rev5.json"30 controls_csv = args.output_dir / "nist_controls_rev5.csv"31 save_controls(controls_df, controls_json, controls_csv)32 33 logs_df = generate_synthetic_cloudtrail_logs(n_logs=args.logs_count)34 logs_csv = args.output_dir / "synthetic_cloudtrail_logs.csv"35 logs_df.to_csv(logs_csv, index=False)36 37 print("Phase 1 complete:")38 print(f"- Controls JSON: {controls_json}")39 print(f"- Controls CSV: {controls_csv}")40 print(f"- Logs CSV: {logs_csv}")41 42 43if __name__ == "__main__":44 main()45 