94 lines
2.5 KiB
Markdown
94 lines
2.5 KiB
Markdown
# LLDP Network Mapper
|
|
|
|
SSH-based network topology mapper for FS switches (and IOS-like CLIs).
|
|
Discovers switch topology via LLDP, stores in SQLite, and visualises with Cytoscape.js.
|
|
|
|
## Quick Start
|
|
|
|
### 1. Configure your switches
|
|
|
|
Edit `mapper/config.py`:
|
|
|
|
```python
|
|
SWITCHES = [
|
|
"192.168.1.1",
|
|
"192.168.1.2",
|
|
# Add all switch management IPs
|
|
]
|
|
|
|
SSH_USERNAME = "admin"
|
|
SSH_PASSWORD = "yourpassword"
|
|
```
|
|
|
|
### 2. Build and run
|
|
|
|
```bash
|
|
docker-compose up --build
|
|
```
|
|
|
|
### 3. Open the UI
|
|
|
|
Navigate to: http://localhost:5000
|
|
|
|
Click **Scan Now** to start discovery.
|
|
|
|
---
|
|
|
|
## What it does
|
|
|
|
- SSHs into each switch in parallel (up to 10 at once)
|
|
- Runs `show lldp neighbors` and `show ip interface brief`
|
|
- Parses neighbors, hostnames, management IPs, chassis IDs
|
|
- Stores everything in SQLite (`data/network.db`)
|
|
- De-duplicates bidirectional links automatically
|
|
- Renders an interactive Cytoscape.js topology diagram
|
|
- Exports to CSV, Mermaid (.md), and Graphviz PNG
|
|
|
|
## Outputs
|
|
|
|
All files written to `data/exports/`:
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `topology.csv` | Switch links with hostnames and IPs |
|
|
| `topology.md` | Mermaid diagram (paste into any markdown viewer) |
|
|
| `topology.dot` | Graphviz source |
|
|
| `topology.png` | Rendered network diagram |
|
|
|
|
## Auto-scan
|
|
|
|
Toggle auto-scan on/off from the UI. Set interval (15 min to 6 hours).
|
|
State persists across container restarts.
|
|
|
|
## Troubleshooting
|
|
|
|
**Auth errors**: Check SSH_USERNAME / SSH_PASSWORD in config.py
|
|
|
|
**Timeout errors**: Increase SSH_TIMEOUT in config.py (default: 30s)
|
|
|
|
**Wrong device type**: If your FS switch uses a non-IOS CLI, try changing
|
|
DEVICE_TYPE to `"linux"` or `"generic"` in config.py
|
|
|
|
**No management IP found**: The script looks for Vlan interfaces in
|
|
`show ip interface brief`. If your switch uses a different command,
|
|
edit `parser.py → parse_mgmt_ip_from_interfaces()`
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
lldp-mapper/
|
|
├── app.py # Flask API + scheduler
|
|
├── db.py # SQLite operations
|
|
├── parser.py # LLDP output parser
|
|
├── ssh_client.py # Netmiko SSH + parallel scan
|
|
├── scanner.py # Orchestrator
|
|
├── exports.py # CSV / Mermaid / Graphviz
|
|
├── config.py # Switch IPs + credentials (not committed)
|
|
├── config.py.example # Config template
|
|
├── index.html # Cytoscape.js frontend
|
|
├── data/ # SQLite DB + exports (created at runtime)
|
|
├── Dockerfile
|
|
├── docker-compose.yml
|
|
└── README.md
|
|
```
|