Spaces:
Sleeping
Sleeping
File size: 6,204 Bytes
765065a c7576e1 765065a c7576e1 765065a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | #!/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()
|