
Generates reproducible CORE network topologies from XML scenario files for cybersecurity training and experimentation. Provides Web GUI and CLI for deterministic topology previews, vulnerability assignment, and traffic generation.
Generate reproducible CORE network topologies from scenario XML files using a rich Web GUI or a command-line interface.
View the WebUI images gallery docs/screenshots.md.
core-daemon runningpython -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python main.py
http://127.0.0.1:9090 by default (reverse proxy nginx compose targets https://localhost).coreadmin / coreadmin account; change it immediately under Profile → Change Password.make host-web, make host-web-nginx, or make host-web PROXY=envoy. The helper script scripts/dev_gen_certs.sh issues self-signed certificates with SAN support.Existing Router, Existing Switch, or New Router. The legacy New Switch choice was removed to prevent hidden switch fan-out; saved scenarios using it are normalized to Existing Router during load.python -m core_topo_gen.cli --xml path/to/scenario.xml --seed 42 --verbose
Popular options:
--scenario NAME pick a specific scenario entry--host / --port override the CORE gRPC endpoint (defaults 127.0.0.1:50051)--layout-density {compact|normal|spacious} adjust map spacing--seg-include-hosts, --seg-allow-docker-ports, --nat-mode, --dnat-prob fine-tune segmentation--traffic-pattern, --traffic-rate, --traffic-content override traffic defaults./reports/.base_nodes, additive_nodes, combined_nodes, etc.) for round-trip fidelity.explicit_count, derived_count, and total_planned.scenario_total_nodes summarises planned hosts, routers, and vulnerability targets.core_topo_gen.parsers.planning_metadata.parse_planning_metadata().existing_router, existing_switch, or new_router; legacy new_switch values are coerced to existing_router so previews remain deterministic and switch overlays aren’t synthesized implicitly.r2r_mode supports Exact, Uniform, NonUniform, Min, Max, and legacy meshes tied to --router-mesh-style.r2s_mode, r2s_edges, optional r2s_hosts_min/max) regroup hosts behind dedicated switches, with “Exact=1” aggregating all hosts per router into a single switch./tmp/traffic (with companion services) and respect overrides for pattern, rate, jitter, and content hints./tmp/segmentation alongside a segmentation_summary.json; NAT mode, DNAT probability, host inclusion, and docker port allowances are configurable./tmp/vulns, with metadata embedded into CORE nodes.core_topo_gen.plugins.traffic.register() for bespoke sender/receiver code../reports/scenario_report_<timestamp>.md) enumerate topology stats, planning metadata, segmentation results, and runtime artefacts. Each run also emits a JSON summary alongside the Markdown file (scenario_report_<timestamp>.json) plus per-run connectivity CSVs when router degree data is available.outputs/run_history.json for the Reports page.outputs/ when scenarios are removed via the GUI.| Folder | Purpose |
|---|---|
core_topo_gen/cli.py | CLI entry point; orchestrates parsing, planning, building, and report generation |
core_topo_gen/parsers/ | Modular XML parsers per scenario section (node info, routing, traffic, services, vulnerabilities, segmentation) |
core_topo_gen/builders/topology.py | Builds star, multi-switch, and segmented topologies using CORE gRPC APIs |
core_topo_gen/utils/ | Supporting allocators, report writers, traffic/segmentation/service helpers |
webapp/ | Flask Web UI, templates, SSE log streaming, history persistence |
webapp/templates/partials/dock.html | Persistent logs/XML dock with follow toggle and filters |
tests/ | Pytest suite covering planning semantics, policy enforcement, preview parity, and CLI behaviours |
docs/ | Additional documentation assets (screenshots, notes) |