File size: 2,344 Bytes
55e2289
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from pydantic import BaseModel, Field
from typing import List, Optional, Dict, Any

class Interface(BaseModel):
    name: str
    ip: Optional[str] = None
    subnet: Optional[str] = None
    ipv6: Optional[str] = None
    vlan: Optional[str] = None

class WirelessInfo(BaseModel):
    role: str # "server" or "client"
    ssid: Optional[str] = None
    encryption: Optional[str] = None
    key: Optional[str] = None

class OSPFNetwork(BaseModel):
    network: str

class OSPFProcess(BaseModel):
    process_id: str
    networks: List[str]

class Routing(BaseModel):
    static_routes: List[str] = []
    ospf: List[OSPFProcess] = []
    nat: List[str] = []
    dhcp_pools: List[Dict[str, Any]] = []

class Security(BaseModel):
    acls: List[Dict[str, Any]] = []
    vulnerabilities: List[str] = []
    decrypted_passwords: List[Dict[str, Any]] = []

class Device(BaseModel):
    name: str
    type: str
    model: Optional[str] = ""
    interfaces: List[Interface] = []
    wireless_info: Optional[WirelessInfo] = None
    vlans: List[Dict[str, str]] = []
    routing: Optional[Routing] = None
    security: Optional[Security] = None
    services: List[Dict[str, Any]] = []

class PhysicalLink(BaseModel):
    type: str
    from_device: str
    to_device: str
    from_port: Optional[str] = None
    to_port: Optional[str] = None

class WirelessConnection(BaseModel):
    from_device: str
    to_device: str
    ssid: str
    type: str = "wireless"

class NetworkTopology(BaseModel):
    version: Optional[str] = "1.0"
    devices: List[Device] = []
    physical_links: List[PhysicalLink] = []
    wireless_connections: List[WirelessConnection] = []
    vlans: Dict[str, str] = {}
    instructions: str = ""

    model_config = {
        "json_schema_extra": {
            "example": {
                "version": "1.0",
                "devices": [
                    {
                        "name": "Router-ISP",
                        "type": "Router",
                        "model": "2911",
                        "interfaces": [
                            {"name": "GigabitEthernet0/0", "ip": "10.0.0.1", "subnet": "255.255.255.0"}
                        ]
                    }
                ],
                "physical_links": [],
                "instructions": "This is an example topology."
            }
        }
    }