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()