66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
from pathlib import Path
|
|
|
|
from .adapter_contract import adapter_descriptor
|
|
from .config import load_config
|
|
from .scanner import scan_mailbox
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
parser = argparse.ArgumentParser(prog="email-connect")
|
|
sub = parser.add_subparsers(dest="command", required=True)
|
|
|
|
scan = sub.add_parser("scan-mailbox", help="Scan a return mailbox or fixture directory.")
|
|
scan.add_argument("--config", required=True)
|
|
scan.add_argument("--out", default=None)
|
|
scan.add_argument("--full-rescan", action="store_true")
|
|
scan.add_argument("--since", default=None)
|
|
scan.add_argument("--from", dest="range_from", default=None)
|
|
scan.add_argument("--to", dest="range_to", default=None)
|
|
scan.add_argument("--expected-recipients", default=None)
|
|
scan.add_argument("--expected-recipient-column", default=None)
|
|
scan.add_argument("--report-only-new", action="store_true")
|
|
scan.add_argument("--dry-run", action="store_true")
|
|
scan.add_argument("--fixture-dir", default=None)
|
|
|
|
sub.add_parser("adapter-descriptor", help="Print the initial coordination-engine adapter descriptor.")
|
|
|
|
args = parser.parse_args(argv)
|
|
if args.command == "adapter-descriptor":
|
|
print(json.dumps(adapter_descriptor(), indent=2, sort_keys=True))
|
|
return 0
|
|
|
|
if args.command == "scan-mailbox":
|
|
config = load_config(args.config)
|
|
result = scan_mailbox(
|
|
config,
|
|
output_dir=args.out,
|
|
full_rescan=args.full_rescan,
|
|
report_only_new=args.report_only_new,
|
|
dry_run=args.dry_run,
|
|
fixture_dir=args.fixture_dir,
|
|
since=args.since,
|
|
range_from=args.range_from,
|
|
range_to=args.range_to,
|
|
expected_recipients_path=args.expected_recipients,
|
|
expected_recipient_column=args.expected_recipient_column,
|
|
)
|
|
print(f"scan_id={result.scan.scan_id}")
|
|
print(f"messages_seen={result.scan.messages_seen}")
|
|
print(f"messages_new={result.scan.messages_new}")
|
|
print(f"messages_parsed={result.scan.messages_parsed}")
|
|
print(f"evidence_events_created={result.scan.evidence_events_created}")
|
|
if result.report_path:
|
|
print(f"report_path={Path(result.report_path)}")
|
|
for warning in result.warnings:
|
|
print(f"warning={warning}")
|
|
return 0
|
|
|
|
return 2
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|