overgrowth / mcp-server /complete_ccna_links.py
Graham Paasch
Fix: Use environment variables for GNS3 server URL
c7576e1
Raw
History Blame
6.2 kB
#!/usr/bin/env python3
"""
Complete the CCNA topology links after switches have booted
Run this AFTER you start the switches in GNS3 GUI
"""
import requests
import time
import os
GNS3_SERVER = os.getenv("GNS3_SERVER", "http://localhost:3080")
GNS3_API = f"{GNS3_SERVER}/v2"
PROJECT_NAME = os.getenv("GNS3_PROJECT_NAME", "overgrowth")
def get_project_id(name):
resp = requests.get(f"{GNS3_API}/projects")
projects = resp.json()
project = next((p for p in projects if p['name'] == name), None)
return project['project_id'] if project else None
def get_nodes(project_id):
resp = requests.get(f"{GNS3_API}/projects/{project_id}/nodes")
all_nodes = resp.json()
return {n['name']: n for n in all_nodes}
def start_all_switches(project_id, nodes):
"""Start all switches"""
switches = [n for name, n in nodes.items() if 'SW' in name]
print(f"Starting {len(switches)} switches...")
for sw in switches:
if sw['status'] != 'started':
requests.post(f"{GNS3_API}/projects/{project_id}/nodes/{sw['node_id']}/start")
print(f" ✓ Starting {sw['name']}")
if switches:
print("\n⏱️ Waiting 30 seconds for switches to boot...")
print(" (Cisco IOSvL2 takes time to initialize all interfaces)")
for i in range(30, 0, -5):
print(f" {i} seconds remaining...")
time.sleep(5)
def create_link(project_id, node1_id, adapter1, port1, node2_id, adapter2, port2, desc=""):
data = {
"nodes": [
{"node_id": node1_id, "adapter_number": adapter1, "port_number": port1},
{"node_id": node2_id, "adapter_number": adapter2, "port_number": port2}
]
}
resp = requests.post(f"{GNS3_API}/projects/{project_id}/links", json=data)
if resp.status_code in [200, 201]:
print(f" ✓ {desc}")
return True
else:
print(f" ✗ {desc} - {resp.status_code}: {resp.text[:100]}")
return False
def main():
project_id = get_project_id(PROJECT_NAME)
if not project_id:
print(f"Project '{PROJECT_NAME}' not found!")
return
print("="*70)
print("COMPLETING CCNA TOPOLOGY LINKS")
print("="*70)
print()
nodes = get_nodes(project_id)
# Find switch nodes (they might have version suffixes)
sw1 = next((n for name, n in nodes.items() if 'SW1' in name and 'Access' in name), None)
sw2 = next((n for name, n in nodes.items() if 'SW2' in name and 'Core' in name), None)
sw3 = next((n for name, n in nodes.items() if 'SW3' in name and 'Access' in name), None)
# Check if switches are running
sw1_running = sw1 and sw1.get('status') == 'started'
sw2_running = sw2 and sw2.get('status') == 'started'
sw3_running = sw3 and sw3.get('status') == 'started'
if not (sw1_running and sw2_running and sw3_running):
print("⚠️ Switches are not all running. Starting them now...")
start_all_switches(project_id, nodes)
nodes = get_nodes(project_id) # Refresh after starting
else:
print("✅ All switches are already running!")
print("\nCreating Network Links...")
links = 0
# Find nodes dynamically
pc1 = nodes.get('PC1-Sales')
pc2 = nodes.get('PC2-Sales')
pc3 = nodes.get('PC3-Engineering')
pc4 = nodes.get('PC4-Engineering')
pc5 = nodes.get('PC5-Guest')
pc6 = nodes.get('PC6-Guest')
sw1 = next((n for name, n in nodes.items() if 'SW1' in name and 'Access' in name), None)
sw2 = next((n for name, n in nodes.items() if 'SW2' in name and 'Core' in name), None)
sw3 = next((n for name, n in nodes.items() if 'SW3' in name and 'Access' in name), None)
# PC1 -> SW1
if pc1 and sw1:
if create_link(project_id,
pc1['node_id'], 0, 0,
sw1['node_id'], 0, 0,
"PC1-Sales → SW1 Gi0/0"):
links += 1
# PC2 -> SW1 (Ethernet1 = adapter 1, port 0)
if pc2 and sw1:
if create_link(project_id,
pc2['node_id'], 0, 0,
sw1['node_id'], 1, 0,
"PC2-Sales → SW1 e1"):
links += 1
# SW1 -> SW2 (Trunk: SW1 Ethernet2 = adapter 2)
if sw1 and sw2:
if create_link(project_id,
sw1['node_id'], 2, 0,
sw2['node_id'], 2, 0,
"SW1 e2 ↔ SW2 e2 (TRUNK)"):
links += 1
# PC3 -> SW2 (Ethernet1)
if pc3 and sw2:
if create_link(project_id,
pc3['node_id'], 0, 0,
sw2['node_id'], 1, 0,
"PC3-Engineering → SW2 e1"):
links += 1
# PC4 -> SW2 (Ethernet3)
if pc4 and sw2:
if create_link(project_id,
pc4['node_id'], 0, 0,
sw2['node_id'], 3, 0,
"PC4-Engineering → SW2 e3"):
links += 1
# SW2 -> SW3 (Trunk: Ethernet4 on both)
if sw2 and sw3:
if create_link(project_id,
sw2['node_id'], 4, 0,
sw3['node_id'], 2, 0,
"SW2 e4 ↔ SW3 e2 (TRUNK)"):
links += 1
# PC5 -> SW3
if pc5 and sw3:
if create_link(project_id,
pc5['node_id'], 0, 0,
sw3['node_id'], 0, 0,
"PC5-Guest → SW3 Gi0/0"):
links += 1
# PC6 -> SW3 (Ethernet1)
if pc6 and sw3:
if create_link(project_id,
pc6['node_id'], 0, 0,
sw3['node_id'], 1, 0,
"PC6-Guest → SW3 e1"):
links += 1
print("\n" + "="*70)
print(f"✅ TOPOLOGY COMPLETE: {links} links created")
print("="*70)
print("\n🎓 Next Steps:")
print(" 1. Open GNS3 GUI and verify topology")
print(" 2. Console into each switch (right-click → Console)")
print(" 3. Follow VLAN configuration from build script output")
print(" 4. Configure PC IP addresses")
print(" 5. Test connectivity!")
if __name__ == "__main__":
main()