2.2
Antarmuka CLI
deep_eye.py adalah satu-satunya titik masuk CLI Deep Eye. Seluruh flag dideklarasikan dalam satu fungsi, parse_arguments, dan tidak ada argumen posisional: target selalu datang dari -u atau dari config deep_eye.py:47-1571. Fungsi main membaca hasil parse itu, menampilkan banner, lalu memilih satu dari tiga jalur: mode diff, wizard setup, atau scan deep_eye.py:238-2502. Tabel referensi ringkas untuk flag yang sama ada di README.md:120-1363, sedangkan contoh pemakaian --scope-nl, --diff, dan --retest-new ada di README.md:102-1184.
Hanya sebagian perilaku scan yang bisa dikendalikan dari CLI. Depth, threads, AI provider, recon, dan mode scan dibaca langsung dari bagian scanner di config, sehingga flag seperti --depth tidak pernah ada deep_eye.py:281-2915.
Peta flag ke komponen
Setiap flag berakhir di satu komponen yang berbeda. Diagram berikut memetakan flag dari parse_arguments ke fungsi yang benar-benar membacanya.
graph TD
CLI["main()"] --> PA["parse_arguments()"]
PA --> U["-u / --url"] --> VAL["validate_config()"]
PA --> C["-c / --config"] --> CL["ConfigLoader.load() / run_onboard()"]
PA --> V["-v / --verbose"] --> SE["ScannerEngine(...)"]
PA --> NB["--no-banner"] --> BN["display_banner()"]
PA --> F["--formats"] --> RG["ReportGenerator.generate()"]
PA --> D["--diff BASELINE CURRENT"] --> SD["diff_scans()"]
PA --> RO["--diff-output / --diff-format"] --> DR["render_html() / render_json() / render_csv()"]
SD --> DR
PA --> R["--retest-new"] --> ID["_identity_no_sev()"]
PA --> NL["--scope-nl"] --> NS["apply_nl_scope_to_config()"]
PA --> S["--setup / --setup-force"] --> OB["run_onboard(force=...)"]
style PA fill:#f59e0b,color:#000
style CL fill:#f59e0b,color:#000
style OB fill:#f59e0b,color:#000
style VAL fill:#dc2626,color:#fff
style SD fill:#8b5cf6,color:#fff
style DR fill:#8b5cf6,color:#fff
style ID fill:#8b5cf6,color:#fff
style NS fill:#8b5cf6,color:#fff
style RG fill:#2d7d46,color:#fff
style SE fill:#2d7d46,color:#fff
%% fig: Peta flag CLI ke komponen
%% desc: Setiap flag dari parse_arguments mengarah ke fungsi yang membacanya, dari validasi target sampai pembuatan laporan.| Flag | Bentuk argparse | Komponen yang dipanggil |
|---|---|---|
-u, --url | type=str | target_url = args.url or scanner_config.get('target_url', '') deep_eye.py:274-2796 |
-c, --config | type=str, default config/config.yaml | ConfigLoader.load(), atau run_onboard() bila berkas tidak ada deep_eye.py:257-2647 |
-v, --verbose | action='store_true' | argumen verbose= pada ScannerEngine(...) deep_eye.py:304-3148 |
--version | action='version' | mencetak Deep Eye v1.4.0 (Hanzou) lalu keluar deep_eye.py:88-939 |
--no-banner | action='store_true' | display_banner() tidak dipanggil deep_eye.py:160-16310 |
--formats | type=str, default None | ReportGenerator.generate() untuk setiap format deep_eye.py:381-38711 |
--diff | nargs=2, metavar BASELINE CURRENT | _run_diff_mode(args) deep_eye.py:193-23512 |
--diff-output | type=str, default None | path reports/diff_<timestamp>.<ext> bila kosong deep_eye.py:210-21613 |
--diff-format | choices=['html', 'json', 'csv'], default html | render_html / render_json / render_csv deep_eye.py:193-23512 |
--retest-new | type=str, metavar BASELINE_JSON | _identity_no_sev() dan load_scan_json() deep_eye.py:349-36914 |
--scope-nl | type=str | apply_nl_scope_to_config() deep_eye.py:266-26915 |
--setup | action='store_true' | run_onboard() lalu return 0 deep_eye.py:252-25516 |
--setup-force | action='store_true' | run_onboard(force=True) deep_eye.py:252-25516 |
Urutan dispatch di main
Urutan pemeriksaan menentukan flag mana yang menang. Banner dicetak lebih dulu kecuali --no-banner dipakai, lalu args.diff diperiksa sebelum apa pun yang lain deep_eye.py:238-2502. --setup dan --setup-force keluar sebelum config dimuat deep_eye.py:252-25516. Bila berkas config tidak ada, wizard run_onboard dijalankan otomatis saat scan biasa deep_eye.py:257-2647.
graph TD
M["main()"] --> BQ{"--no-banner?"}
BQ -->|tidak| BN["display_banner()"]
BQ -->|ya| DQ{"args.diff?"}
BN --> DQ
DQ -->|ya| DM["_run_diff_mode()"]
DM --> OUT1["return 0 atau 2"]
DQ -->|tidak| SQ{"--setup atau --setup-force?"}
SQ -->|ya| OW["run_onboard(force=...)"] --> OUT2["return 0"]
SQ -->|tidak| CFG["ConfigLoader.load() atau run_onboard()"]
CFG --> NQ{"--scope-nl?"}
NQ -->|ya| NS["apply_nl_scope_to_config()"]
NS --> TGT["target_url = args.url or config"]
NQ -->|tidak| TGT
TGT --> VL{"validate_config()"}
VL -->|False| E1["sys.exit(1)"]
VL -->|True| SC["ScannerEngine.scan()"]
SC --> RQ{"--retest-new?"}
RQ -->|ya| RF["saring findings vs baseline"]
RF --> RP["ReportGenerator.generate() per format"]
RQ -->|tidak| RP
style DM fill:#8b5cf6,color:#fff
style NS fill:#8b5cf6,color:#fff
style OW fill:#f59e0b,color:#000
style CFG fill:#f59e0b,color:#000
style VL fill:#f59e0b,color:#000
style E1 fill:#dc2626,color:#fff
style RF fill:#8b5cf6,color:#fff
style OUT1 fill:#2d7d46,color:#fff
style OUT2 fill:#2d7d46,color:#fff
style RP fill:#2d7d46,color:#fff
%% fig: Urutan dispatch di main
%% desc: main memeriksa mode diff dan wizard setup lebih dulu, lalu memuat config, menerapkan scope, memvalidasi target, baru menjalankan scan dan laporan.Sebelum ScannerEngine dibuat, validate_config menolak URL kosong, skema selain http:// atau https://, default_depth di luar 1 sampai 10, dan default_threads di luar 1 sampai 50 deep_eye.py:166-19017. Kegagalan validasi berujung pada sys.exit(1) deep_eye.py:274-2796.
Mode diff: scan dilewati
--diff menerima dua path, BASELINE dan CURRENT, dan _run_diff_mode menangani seluruh prosesnya deep_eye.py:193-23512. Kedua berkas dimuat lewat load_scan_json, dan kegagalan muat menghasilkan Error: Failed to load scan JSON: ... dengan kode keluar 2 deep_eye.py:200-20518. Bila --diff-output kosong, path keluaran dibentuk menjadi reports/diff_<timestamp>.<ext> di bawah direktori reports deep_eye.py:210-21613.
diff_scans membandingkan vulnerabilities dari kedua hasil scan dan mengembalikan blok baseline, current, summary, serta daftar new, fixed, unchanged, dan severity_changed core/scan_diff.py:56-12119. Renderer menulis hasilnya: render_json memakai json.dump(..., indent=2, ensure_ascii=False) utils/exports/diff_renderer.py:7-1020, sedangkan render_html membangun tabel per kategori temuan utils/exports/diff_renderer.py:54-5521. Rincian arti tiap kategori ada di Scan Diff dan Retest.
⚠️ Mode
--diffkembali sebelum config dimuat, sehingga-udan-cdiabaikan pada mode ini deep_eye.py:238-2502.
Wizard setup
--setup menjalankan wizard interaktif lalu keluar dengan return 0, dan --setup-force mengirim force=True deep_eye.py:252-25516. Di dalam run_onboard, parameter force menentukan apakah konfirmasi Overwrite? masih ditanyakan ketika berkas config sudah ada utils/onboard.py:171-18122. Detail isi wizard ada di Instalasi dan Konfigurasi Awal.
Scope bahasa alami
--scope-nl diterapkan tepat setelah config dimuat, sebelum target divalidasi deep_eye.py:266-26915. parse_nl_scope memetakan frasa only/allow/include ke path_allow, no/not/exclude/skip ke excluded_paths, host/domain ke allowed_hosts, dan ports ke allowed_ports; bila tidak ada satu pun yang cocok, enabled diset False utils/nl_scope.py:8-7023. apply_nl_scope_to_config menggabungkan hasil parse dengan scope yang sudah ada memakai dict.fromkeys agar tidak ada duplikat utils/nl_scope.py:73-9724.
Resolusi format laporan
--formats dipecah dengan split(','), lalu setiap potongan dipangkas spasinya. Prioritasnya: nilai CLI, lalu reporting.formats, lalu reporting.default_format dengan fallback html deep_eye.py:381-38711. ext_map memberi ekstensi khusus untuk sarif menjadi sarif.json dan junit menjadi junit.xml deep_eye.py:403-41225. Format di luar tujuh yang didukung memunculkan ValueError bertuliskan Unsupported format: {format} core/report_generator.py:25-4926. Daftar format dan isi berkasnya dibahas di Pelaporan dan Ekspor.
Retest hanya temuan baru
--retest-new bekerja setelah scanner.scan() selesai dan menyaring results['vulnerabilities'] deep_eye.py:349-36914. Kunci pembanding dibentuk oleh _identity_no_sev, yaitu tuple type, url ternormalisasi, dan parameter core/scan_diff.py:41-4727. Ringkasan yang dicetak berbentuk Retest-new: kept X/Y new findings, sedangkan kegagalan apa pun hanya mencetak Retest-new skipped: tanpa menghentikan proses deep_eye.py:349-36914.
Kode keluar
| Kondisi | Kode keluar | Sumber |
|---|---|---|
validate_config mengembalikan False | 1 | deep_eye.py:274-2796 |
Gagal memuat scan JSON pada mode --diff | 2 | deep_eye.py:200-20518 |
KeyboardInterrupt saat scan | 0 | deep_eye.py:458-46428 |
Exception lain di main | 1 | deep_eye.py:458-46428 |
Interupsi pengguna mencetak Scan interrupted by user, sedangkan exception lain dicatat lewat logger.error dengan exc_info=True sebelum sys.exit(1) deep_eye.py:458-46428.