Lompat ke konten
dokumentasi.id
Commit e4397d1
v1
Star2,4 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

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-157. Fungsi main membaca hasil parse itu, menampilkan banner, lalu memilih satu dari tiga jalur: mode diff, wizard setup, atau scan deep_eye.py:238-250. Tabel referensi ringkas untuk flag yang sama ada di README.md:120-136, sedangkan contoh pemakaian --scope-nl, --diff, dan --retest-new ada di README.md:102-118.

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-291.

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.
Fig. 1: Peta flag CLI ke komponenSetiap flag dari parse_arguments mengarah ke fungsi yang membacanya, dari validasi target sampai pembuatan laporan.
FlagBentuk argparseKomponen yang dipanggil
-u, --urltype=strtarget_url = args.url or scanner_config.get('target_url', '') deep_eye.py:274-279
-c, --configtype=str, default config/config.yamlConfigLoader.load(), atau run_onboard() bila berkas tidak ada deep_eye.py:257-264
-v, --verboseaction='store_true'argumen verbose= pada ScannerEngine(...) deep_eye.py:304-314
--versionaction='version'mencetak Deep Eye v1.4.0 (Hanzou) lalu keluar deep_eye.py:88-93
--no-banneraction='store_true'display_banner() tidak dipanggil deep_eye.py:160-163
--formatstype=str, default NoneReportGenerator.generate() untuk setiap format deep_eye.py:381-387
--diffnargs=2, metavar BASELINE CURRENT_run_diff_mode(args) deep_eye.py:193-235
--diff-outputtype=str, default Nonepath reports/diff_<timestamp>.<ext> bila kosong deep_eye.py:210-216
--diff-formatchoices=['html', 'json', 'csv'], default htmlrender_html / render_json / render_csv deep_eye.py:193-235
--retest-newtype=str, metavar BASELINE_JSON_identity_no_sev() dan load_scan_json() deep_eye.py:349-369
--scope-nltype=strapply_nl_scope_to_config() deep_eye.py:266-269
--setupaction='store_true'run_onboard() lalu return 0 deep_eye.py:252-255
--setup-forceaction='store_true'run_onboard(force=True) deep_eye.py:252-255

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-250. --setup dan --setup-force keluar sebelum config dimuat deep_eye.py:252-255. Bila berkas config tidak ada, wizard run_onboard dijalankan otomatis saat scan biasa deep_eye.py:257-264.

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.
Fig. 2: Urutan dispatch di mainmain 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-190. Kegagalan validasi berujung pada sys.exit(1) deep_eye.py:274-279.

Mode diff: scan dilewati

--diff menerima dua path, BASELINE dan CURRENT, dan _run_diff_mode menangani seluruh prosesnya deep_eye.py:193-235. 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-205. Bila --diff-output kosong, path keluaran dibentuk menjadi reports/diff_<timestamp>.<ext> di bawah direktori reports deep_eye.py:210-216.

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-121. Renderer menulis hasilnya: render_json memakai json.dump(..., indent=2, ensure_ascii=False) utils/exports/diff_renderer.py:7-10, sedangkan render_html membangun tabel per kategori temuan utils/exports/diff_renderer.py:54-55. Rincian arti tiap kategori ada di Scan Diff dan Retest.

⚠️ Mode --diff kembali sebelum config dimuat, sehingga -u dan -c diabaikan pada mode ini deep_eye.py:238-250.

Wizard setup

--setup menjalankan wizard interaktif lalu keluar dengan return 0, dan --setup-force mengirim force=True deep_eye.py:252-255. Di dalam run_onboard, parameter force menentukan apakah konfirmasi Overwrite? masih ditanyakan ketika berkas config sudah ada utils/onboard.py:171-181. 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-269. 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-70. 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-97.

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-387. ext_map memberi ekstensi khusus untuk sarif menjadi sarif.json dan junit menjadi junit.xml deep_eye.py:403-412. Format di luar tujuh yang didukung memunculkan ValueError bertuliskan Unsupported format: {format} core/report_generator.py:25-49. 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-369. Kunci pembanding dibentuk oleh _identity_no_sev, yaitu tuple type, url ternormalisasi, dan parameter core/scan_diff.py:41-47. 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-369.

Kode keluar

KondisiKode keluarSumber
validate_config mengembalikan False1deep_eye.py:274-279
Gagal memuat scan JSON pada mode --diff2deep_eye.py:200-205
KeyboardInterrupt saat scan0deep_eye.py:458-464
Exception lain di main1deep_eye.py:458-464

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-464.