gns3-server 3.0.0b3__py3-none-any.whl → 3.0.0rc2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of gns3-server might be problematic. Click here for more details.

Files changed (93) hide show
  1. {gns3_server-3.0.0b3.dist-info → gns3_server-3.0.0rc2.dist-info}/METADATA +32 -31
  2. {gns3_server-3.0.0b3.dist-info → gns3_server-3.0.0rc2.dist-info}/RECORD +93 -89
  3. {gns3_server-3.0.0b3.dist-info → gns3_server-3.0.0rc2.dist-info}/WHEEL +1 -1
  4. gns3server/api/routes/compute/cloud_nodes.py +1 -1
  5. gns3server/api/routes/compute/docker_nodes.py +3 -0
  6. gns3server/api/routes/compute/nat_nodes.py +1 -1
  7. gns3server/api/routes/compute/vmware_nodes.py +1 -1
  8. gns3server/api/routes/compute/vpcs_nodes.py +10 -4
  9. gns3server/api/routes/controller/projects.py +13 -1
  10. gns3server/api/routes/controller/users.py +2 -2
  11. gns3server/appliances/almalinux.gns3a +6 -6
  12. gns3server/appliances/aruba-arubaoscx.gns3a +39 -0
  13. gns3server/appliances/cisco-csr1000v.gns3a +28 -2
  14. gns3server/appliances/cisco-iou-l2.gns3a +2 -2
  15. gns3server/appliances/cisco-iou-l3.gns3a +2 -2
  16. gns3server/appliances/cisco-vWLC.gns3a +29 -1
  17. gns3server/appliances/debian.gns3a +28 -0
  18. gns3server/appliances/fortiadc.gns3a +46 -4
  19. gns3server/appliances/fortianalyzer.gns3a +42 -0
  20. gns3server/appliances/fortiauthenticator.gns3a +58 -2
  21. gns3server/appliances/fortigate.gns3a +42 -0
  22. gns3server/appliances/fortimanager.gns3a +42 -0
  23. gns3server/appliances/fortiweb.gns3a +56 -0
  24. gns3server/appliances/hbcd-pe.gns3a +62 -0
  25. gns3server/appliances/juniper-junos-space.gns3a +3 -2
  26. gns3server/appliances/juniper-vmx-legacy.gns3a +1 -1
  27. gns3server/appliances/juniper-vmx-vcp.gns3a +1 -1
  28. gns3server/appliances/juniper-vmx-vfp.gns3a +2 -1
  29. gns3server/appliances/juniper-vqfx-pfe.gns3a +1 -1
  30. gns3server/appliances/juniper-vqfx-re.gns3a +2 -1
  31. gns3server/appliances/juniper-vrr.gns3a +1 -1
  32. gns3server/appliances/juniper-vsrx.gns3a +2 -1
  33. gns3server/appliances/mikrotik-chr.gns3a +30 -99
  34. gns3server/appliances/nixos.gns3a +52 -0
  35. gns3server/appliances/opnsense.gns3a +13 -0
  36. gns3server/appliances/pan-vm-fw.gns3a +26 -0
  37. gns3server/appliances/reactos.gns3a +10 -10
  38. gns3server/appliances/security-onion.gns3a +27 -3
  39. gns3server/appliances/truenas.gns3a +104 -0
  40. gns3server/appliances/ubuntu-cloud.gns3a +35 -20
  41. gns3server/appliances/ubuntu-docker.gns3a +1 -1
  42. gns3server/appliances/ubuntu-gui.gns3a +13 -0
  43. gns3server/appliances/viptela-edge-genericx86-64.gns3a +28 -2
  44. gns3server/appliances/viptela-smart-genericx86-64.gns3a +27 -1
  45. gns3server/appliances/viptela-vmanage-genericx86-64.gns3a +32 -4
  46. gns3server/appliances/vyos.gns3a +95 -98
  47. gns3server/compute/base_node.py +1 -0
  48. gns3server/compute/docker/__init__.py +8 -2
  49. gns3server/compute/docker/docker_vm.py +56 -2
  50. gns3server/compute/docker/resources/init.sh +5 -2
  51. gns3server/compute/dynamips/__init__.py +0 -4
  52. gns3server/compute/dynamips/nodes/router.py +20 -0
  53. gns3server/compute/notification_manager.py +2 -2
  54. gns3server/compute/qemu/qemu_vm.py +26 -15
  55. gns3server/config_samples/gns3_server.conf +13 -3
  56. gns3server/configs/iou_l2_base_startup-config.txt +1 -1
  57. gns3server/configs/iou_l3_base_startup-config.txt +1 -1
  58. gns3server/controller/__init__.py +27 -13
  59. gns3server/controller/appliance_manager.py +9 -6
  60. gns3server/controller/export_project.py +27 -23
  61. gns3server/controller/import_project.py +24 -3
  62. gns3server/controller/node.py +8 -2
  63. gns3server/controller/notification.py +4 -4
  64. gns3server/controller/project.py +96 -8
  65. gns3server/controller/snapshot.py +3 -8
  66. gns3server/controller/symbols.py +1 -1
  67. gns3server/controller/topology.py +31 -2
  68. gns3server/crash_report.py +1 -1
  69. gns3server/db/models/templates.py +1 -0
  70. gns3server/db/tasks.py +1 -1
  71. gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py +27 -0
  72. gns3server/schemas/compute/docker_nodes.py +1 -0
  73. gns3server/schemas/compute/ethernet_switch_nodes.py +1 -1
  74. gns3server/schemas/config.py +3 -0
  75. gns3server/schemas/controller/templates/cloud_templates.py +2 -2
  76. gns3server/schemas/controller/templates/docker_templates.py +4 -3
  77. gns3server/schemas/controller/templates/dynamips_templates.py +5 -5
  78. gns3server/schemas/controller/templates/ethernet_hub_templates.py +1 -1
  79. gns3server/schemas/controller/templates/ethernet_switch_templates.py +2 -2
  80. gns3server/schemas/controller/templates/iou_templates.py +2 -2
  81. gns3server/schemas/controller/templates/qemu_templates.py +12 -12
  82. gns3server/schemas/controller/templates/virtualbox_templates.py +4 -5
  83. gns3server/schemas/controller/templates/vmware_templates.py +4 -4
  84. gns3server/schemas/controller/templates/vpcs_templates.py +2 -2
  85. gns3server/static/web-ui/index.html +3 -3
  86. gns3server/static/web-ui/{main.f3840f9b1c0240e6.js → main.ed82697b58d803e7.js} +1 -1
  87. gns3server/utils/__init__.py +32 -0
  88. gns3server/utils/asyncio/aiozipstream.py +15 -11
  89. gns3server/utils/hostname.py +53 -0
  90. gns3server/version.py +1 -1
  91. {gns3_server-3.0.0b3.dist-info → gns3_server-3.0.0rc2.dist-info}/LICENSE +0 -0
  92. {gns3_server-3.0.0b3.dist-info → gns3_server-3.0.0rc2.dist-info}/entry_points.txt +0 -0
  93. {gns3_server-3.0.0b3.dist-info → gns3_server-3.0.0rc2.dist-info}/top_level.txt +0 -0
@@ -58,7 +58,7 @@ class CrashReport:
58
58
  Report crash to a third party service
59
59
  """
60
60
 
61
- DSN = "https://99870c759d1c1d62ceb091d59dbcfa78@o19455.ingest.us.sentry.io/38482"
61
+ DSN = "https://29d15f2b7fde7fbd860843b7ee24dc7f@o19455.ingest.us.sentry.io/38482"
62
62
  _instance = None
63
63
 
64
64
  def __init__(self):
@@ -66,6 +66,7 @@ class DockerTemplate(Template):
66
66
  template_id = Column(GUID, ForeignKey("templates.template_id", ondelete="CASCADE"), primary_key=True)
67
67
  image = Column(String)
68
68
  adapters = Column(Integer)
69
+ mac_address = Column(String)
69
70
  start_command = Column(String)
70
71
  environment = Column(String)
71
72
  console_type = Column(String)
gns3server/db/tasks.py CHANGED
@@ -77,7 +77,7 @@ async def connect_to_db(app: FastAPI) -> None:
77
77
 
78
78
  db_path = os.path.join(Config.instance().config_dir, "gns3_controller.db")
79
79
  db_url = os.environ.get("GNS3_DATABASE_URI", f"sqlite+aiosqlite:///{db_path}")
80
- engine = create_async_engine(db_url, connect_args={"check_same_thread": False}, future=True)
80
+ engine = create_async_engine(db_url, connect_args={"check_same_thread": False, "timeout": 20}, future=True)
81
81
  alembic_cfg = config.Config()
82
82
  alembic_cfg.set_main_option("script_location", "gns3server:db_migrations")
83
83
  #alembic_cfg.set_main_option('sqlalchemy.url', db_url)
@@ -0,0 +1,27 @@
1
+ """add mac_address field in Docker templates table
2
+
3
+ Revision ID: 9a5292aa4389
4
+ Revises: 7ceeddd9c9a8
5
+ Create Date: 2024-09-18 17:52:53.429522
6
+
7
+ """
8
+ from alembic import op
9
+ import sqlalchemy as sa
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = '9a5292aa4389'
14
+ down_revision = '7ceeddd9c9a8'
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+
21
+ op.add_column('docker_templates', sa.Column('mac_address', sa.String()))
22
+
23
+
24
+ def downgrade() -> None:
25
+
26
+ op.drop_column('docker_templates', 'mac_address')
27
+
@@ -39,6 +39,7 @@ class DockerBase(BaseModel):
39
39
  usage: Optional[str] = Field(None, description="How to use the Docker container")
40
40
  start_command: Optional[str] = Field(None, description="Docker CMD entry")
41
41
  adapters: Optional[int] = Field(None, ge=0, le=99, description="Number of adapters")
42
+ mac_address: Optional[str] = Field(None, description="Base MAC address", pattern="^([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})$")
42
43
  environment: Optional[str] = Field(None, description="Docker environment variables")
43
44
  extra_hosts: Optional[str] = Field(None, description="Docker extra hosts (added to /etc/hosts)")
44
45
  extra_volumes: Optional[List[str]] = Field(None, description="Additional directories to make persistent")
@@ -43,7 +43,7 @@ class EthernetSwitchPort(BaseModel):
43
43
  port_number: int
44
44
  type: EthernetSwitchPortType = Field(..., description="Port type")
45
45
  vlan: int = Field(..., ge=1, le=4094, description="VLAN number")
46
- ethertype: Optional[EthernetSwitchEtherType] = Field("0x8100", description="QinQ Ethertype")
46
+ ethertype: Optional[EthernetSwitchEtherType] = Field(EthernetSwitchEtherType.ethertype_8021q, description="QinQ Ethertype")
47
47
 
48
48
  @model_validator(mode="after")
49
49
  def check_ethertype(self) -> "EthernetSwitchPort":
@@ -69,6 +69,7 @@ class QemuSettings(BaseModel):
69
69
  monitor_host: str = "127.0.0.1"
70
70
  enable_hardware_acceleration: bool = True
71
71
  require_hardware_acceleration: bool = False
72
+ allow_unsafe_options: bool = False
72
73
  model_config = ConfigDict(validate_assignment=True, str_strip_whitespace=True)
73
74
 
74
75
 
@@ -126,6 +127,7 @@ class ServerSettings(BaseModel):
126
127
  appliances_path: str = "~/GNS3/appliances"
127
128
  symbols_path: str = "~/GNS3/symbols"
128
129
  configs_path: str = "~/GNS3/configs"
130
+ resources_path: str = None
129
131
  default_symbol_theme: BuiltinSymbolTheme = BuiltinSymbolTheme.affinity_square_blue
130
132
  allow_raw_images: bool = True
131
133
  auto_discover_images: bool = True
@@ -144,6 +146,7 @@ class ServerSettings(BaseModel):
144
146
  default_nat_interface: str = None
145
147
  allow_remote_console: bool = False
146
148
  enable_builtin_templates: bool = True
149
+ install_builtin_appliances: bool = True
147
150
  model_config = ConfigDict(validate_assignment=True, str_strip_whitespace=True, use_enum_values=True)
148
151
 
149
152
  @field_validator("additional_images_paths", mode="before")
@@ -29,13 +29,13 @@ from typing import Optional, Union, List
29
29
 
30
30
  class CloudTemplate(TemplateBase):
31
31
 
32
- category: Optional[Category] = "guest"
32
+ category: Optional[Category] = Category.guest
33
33
  default_name_format: Optional[str] = "Cloud{0}"
34
34
  symbol: Optional[str] = "cloud"
35
35
  ports_mapping: List[Union[EthernetPort, TAPPort, UDPPort]] = Field(default_factory=list)
36
36
  remote_console_host: Optional[str] = Field("127.0.0.1", description="Remote console host or IP")
37
37
  remote_console_port: Optional[int] = Field(23, gt=0, le=65535, description="Remote console TCP port")
38
- remote_console_type: Optional[CloudConsoleType] = Field("none", description="Remote console type")
38
+ remote_console_type: Optional[CloudConsoleType] = Field(CloudConsoleType.none, description="Remote console type")
39
39
  remote_console_http_path: Optional[str] = Field("/", description="Path of the remote web interface")
40
40
 
41
41
 
@@ -24,15 +24,16 @@ from typing import Optional, List
24
24
 
25
25
  class DockerTemplate(TemplateBase):
26
26
 
27
- category: Optional[Category] = "guest"
27
+ category: Optional[Category] = Category.guest
28
28
  default_name_format: Optional[str] = "{name}-{0}"
29
29
  symbol: Optional[str] = "docker_guest"
30
30
  image: str = Field(..., description="Docker image name")
31
31
  adapters: Optional[int] = Field(1, ge=0, le=100, description="Number of adapters")
32
+ mac_address: Optional[str] = Field("", description="Base MAC address", pattern="^([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})$|^$")
32
33
  start_command: Optional[str] = Field("", description="Docker CMD entry")
33
34
  environment: Optional[str] = Field("", description="Docker environment variables")
34
- console_type: Optional[ConsoleType] = Field("telnet", description="Console type")
35
- aux_type: Optional[AuxType] = Field("none", description="Auxiliary console type")
35
+ console_type: Optional[ConsoleType] = Field(ConsoleType.telnet, description="Console type")
36
+ aux_type: Optional[AuxType] = Field(AuxType.none, description="Auxiliary console type")
36
37
  console_auto_start: Optional[bool] = Field(
37
38
  False, description="Automatically start the console when the node has started"
38
39
  )
@@ -32,7 +32,7 @@ from enum import Enum
32
32
 
33
33
  class DynamipsTemplate(TemplateBase):
34
34
 
35
- category: Optional[Category] = "router"
35
+ category: Optional[Category] = Category.router
36
36
  default_name_format: Optional[str] = "R{0}"
37
37
  symbol: Optional[str] = "router"
38
38
  platform: DynamipsPlatform = Field(..., description="Cisco router platform")
@@ -51,11 +51,11 @@ class DynamipsTemplate(TemplateBase):
51
51
  disk0: Optional[int] = Field(0, description="Disk0 size in MB")
52
52
  disk1: Optional[int] = Field(0, description="Disk1 size in MB")
53
53
  auto_delete_disks: Optional[bool] = Field(False, description="Automatically delete nvram and disk files")
54
- console_type: Optional[DynamipsConsoleType] = Field("telnet", description="Console type")
54
+ console_type: Optional[DynamipsConsoleType] = Field(DynamipsConsoleType.telnet, description="Console type")
55
55
  console_auto_start: Optional[bool] = Field(
56
56
  False, description="Automatically start the console when the node has started"
57
57
  )
58
- aux_type: Optional[DynamipsConsoleType] = Field("none", description="Auxiliary console type")
58
+ aux_type: Optional[DynamipsConsoleType] = Field(DynamipsConsoleType.none, description="Auxiliary console type")
59
59
  slot0: Optional[DynamipsAdapters] = Field(None, description="Network module slot 0")
60
60
  slot1: Optional[DynamipsAdapters] = Field(None, description="Network module slot 1")
61
61
  slot2: Optional[DynamipsAdapters] = Field(None, description="Network module slot 2")
@@ -72,8 +72,8 @@ class C7200DynamipsTemplate(DynamipsTemplate):
72
72
 
73
73
  ram: Optional[int] = Field(512, description="Amount of RAM in MB")
74
74
  nvram: Optional[int] = Field(512, description="Amount of NVRAM in KB")
75
- npe: Optional[DynamipsNPE] = Field("npe-400", description="NPE model")
76
- midplane: Optional[DynamipsMidplane] = Field("vxr", description="Midplane model")
75
+ npe: Optional[DynamipsNPE] = Field(DynamipsNPE.npe_400, description="NPE model")
76
+ midplane: Optional[DynamipsMidplane] = Field(DynamipsMidplane.vxr, description="Midplane model")
77
77
  sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
78
78
 
79
79
 
@@ -35,7 +35,7 @@ DEFAULT_PORTS = [
35
35
 
36
36
  class EthernetHubTemplate(TemplateBase):
37
37
 
38
- category: Optional[Category] = "switch"
38
+ category: Optional[Category] = Category.switch
39
39
  default_name_format: Optional[str] = "Hub{0}"
40
40
  symbol: Optional[str] = "hub"
41
41
  ports_mapping: Optional[List[EthernetHubPort]] = Field(DEFAULT_PORTS, description="Ports")
@@ -45,11 +45,11 @@ class ConsoleType(str, Enum):
45
45
 
46
46
  class EthernetSwitchTemplate(TemplateBase):
47
47
 
48
- category: Optional[Category] = "switch"
48
+ category: Optional[Category] = Category.switch
49
49
  default_name_format: Optional[str] = "Switch{0}"
50
50
  symbol: Optional[str] = "ethernet_switch"
51
51
  ports_mapping: Optional[List[EthernetSwitchPort]] = Field(DEFAULT_PORTS, description="Ports")
52
- console_type: Optional[ConsoleType] = Field("none", description="Console type")
52
+ console_type: Optional[ConsoleType] = Field(ConsoleType.none, description="Console type")
53
53
 
54
54
 
55
55
  class EthernetSwitchTemplateUpdate(EthernetSwitchTemplate):
@@ -24,7 +24,7 @@ from typing import Optional
24
24
 
25
25
  class IOUTemplate(TemplateBase):
26
26
 
27
- category: Optional[Category] = "router"
27
+ category: Optional[Category] = Category.router
28
28
  default_name_format: Optional[str] = "IOU{0}"
29
29
  symbol: Optional[str] = "multilayer_switch"
30
30
  path: str = Field(..., description="Path of IOU executable")
@@ -36,7 +36,7 @@ class IOUTemplate(TemplateBase):
36
36
  startup_config: Optional[str] = Field("iou_l3_base_startup-config.txt", description="Startup-config of IOU")
37
37
  private_config: Optional[str] = Field("", description="Private-config of IOU")
38
38
  l1_keepalives: Optional[bool] = Field(False, description="Always keep up Ethernet interface (does not always work)")
39
- console_type: Optional[ConsoleType] = Field("telnet", description="Console type")
39
+ console_type: Optional[ConsoleType] = Field(ConsoleType.telnet, description="Console type")
40
40
  console_auto_start: Optional[bool] = Field(
41
41
  False, description="Automatically start the console when the node has started"
42
42
  )
@@ -33,17 +33,17 @@ from typing import Optional, List
33
33
 
34
34
  class QemuTemplate(TemplateBase):
35
35
 
36
- category: Optional[Category] = "guest"
36
+ category: Optional[Category] = Category.guest
37
37
  default_name_format: Optional[str] = "{name}-{0}"
38
38
  symbol: Optional[str] = "qemu_guest"
39
39
  qemu_path: Optional[str] = Field("", description="Qemu executable path")
40
- platform: Optional[QemuPlatform] = Field("x86_64", description="Platform to emulate")
40
+ platform: Optional[QemuPlatform] = Field(QemuPlatform.x86_64, description="Platform to emulate")
41
41
  linked_clone: Optional[bool] = Field(True, description="Whether the VM is a linked clone or not")
42
42
  ram: Optional[int] = Field(256, description="Amount of RAM in MB")
43
43
  cpus: Optional[int] = Field(1, ge=1, le=255, description="Number of vCPUs")
44
44
  maxcpus: Optional[int] = Field(1, ge=1, le=255, description="Maximum number of hotpluggable vCPUs")
45
45
  adapters: Optional[int] = Field(1, ge=0, le=275, description="Number of adapters")
46
- adapter_type: Optional[QemuAdapterType] = Field("e1000", description="QEMU adapter type")
46
+ adapter_type: Optional[QemuAdapterType] = Field(QemuAdapterType.e1000, description="QEMU adapter type")
47
47
  mac_address: Optional[str] = Field(
48
48
  "", description="QEMU MAC address", pattern="^([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})$|^$"
49
49
  )
@@ -55,20 +55,20 @@ class QemuTemplate(TemplateBase):
55
55
  0,
56
56
  description="Optional port segment size. A port segment is a block of port. For example Ethernet0/0 Ethernet0/1 is the module 0 with a port segment size of 2",
57
57
  )
58
- console_type: Optional[QemuConsoleType] = Field("telnet", description="Console type")
58
+ console_type: Optional[QemuConsoleType] = Field(QemuConsoleType.telnet, description="Console type")
59
59
  console_auto_start: Optional[bool] = Field(
60
60
  False, description="Automatically start the console when the node has started"
61
61
  )
62
- aux_type: Optional[QemuConsoleType] = Field("none", description="Auxiliary console type")
63
- boot_priority: Optional[QemuBootPriority] = Field("c", description="QEMU boot priority")
62
+ aux_type: Optional[QemuConsoleType] = Field(QemuConsoleType.none, description="Auxiliary console type")
63
+ boot_priority: Optional[QemuBootPriority] = Field(QemuBootPriority.c, description="QEMU boot priority")
64
64
  hda_disk_image: Optional[str] = Field("", description="QEMU hda disk image path")
65
- hda_disk_interface: Optional[QemuDiskInterfaceType] = Field("none", description="QEMU hda interface")
65
+ hda_disk_interface: Optional[QemuDiskInterfaceType] = Field(QemuDiskInterfaceType.none, description="QEMU hda interface")
66
66
  hdb_disk_image: Optional[str] = Field("", description="QEMU hdb disk image path")
67
- hdb_disk_interface: Optional[QemuDiskInterfaceType] = Field("none", description="QEMU hdb interface")
67
+ hdb_disk_interface: Optional[QemuDiskInterfaceType] = Field(QemuDiskInterfaceType.none, description="QEMU hdb interface")
68
68
  hdc_disk_image: Optional[str] = Field("", description="QEMU hdc disk image path")
69
- hdc_disk_interface: Optional[QemuDiskInterfaceType] = Field("none", description="QEMU hdc interface")
69
+ hdc_disk_interface: Optional[QemuDiskInterfaceType] = Field(QemuDiskInterfaceType.none, description="QEMU hdc interface")
70
70
  hdd_disk_image: Optional[str] = Field("", description="QEMU hdd disk image path")
71
- hdd_disk_interface: Optional[QemuDiskInterfaceType] = Field("none", description="QEMU hdd interface")
71
+ hdd_disk_interface: Optional[QemuDiskInterfaceType] = Field(QemuDiskInterfaceType.none, description="QEMU hdd interface")
72
72
  cdrom_image: Optional[str] = Field("", description="QEMU cdrom image path")
73
73
  initrd: Optional[str] = Field("", description="QEMU initrd path")
74
74
  kernel_image: Optional[str] = Field("", description="QEMU kernel image path")
@@ -82,9 +82,9 @@ class QemuTemplate(TemplateBase):
82
82
  )
83
83
  tpm: Optional[bool] = Field(False, description="Enable Trusted Platform Module (TPM)")
84
84
  uefi: Optional[bool] = Field(False, description="Enable UEFI boot mode")
85
- on_close: Optional[QemuOnCloseAction] = Field("power_off", description="Action to execute on the VM is closed")
85
+ on_close: Optional[QemuOnCloseAction] = Field(QemuOnCloseAction.power_off, description="Action to execute on the VM is closed")
86
86
  cpu_throttling: Optional[int] = Field(0, ge=0, le=800, description="Percentage of CPU allowed for QEMU")
87
- process_priority: Optional[QemuProcessPriority] = Field("normal", description="Process priority for QEMU")
87
+ process_priority: Optional[QemuProcessPriority] = Field(QemuProcessPriority.normal, description="Process priority for QEMU")
88
88
  options: Optional[str] = Field("", description="Additional QEMU options")
89
89
  custom_adapters: Optional[List[CustomAdapter]] = Field(default_factory=list, description="Custom adapters")
90
90
 
@@ -28,7 +28,7 @@ from typing import Optional, List
28
28
 
29
29
  class VirtualBoxTemplate(TemplateBase):
30
30
 
31
- category: Optional[Category] = "guest"
31
+ category: Optional[Category] = Category.guest
32
32
  default_name_format: Optional[str] = "{name}-{0}"
33
33
  symbol: Optional[str] = "vbox_guest"
34
34
  vmname: str = Field(..., description="VirtualBox VM name (in VirtualBox itself)")
@@ -38,8 +38,7 @@ class VirtualBoxTemplate(TemplateBase):
38
38
  1, ge=0, le=36, description="Number of adapters"
39
39
  ) # 36 is the maximum given by the ICH9 chipset in VirtualBox
40
40
  use_any_adapter: Optional[bool] = Field(False, description="Allow GNS3 to use any VirtualBox adapter")
41
- adapter_type: Optional[VirtualBoxAdapterType] = Field(
42
- "Intel PRO/1000 MT Desktop (82540EM)", description="VirtualBox adapter type"
41
+ adapter_type: Optional[VirtualBoxAdapterType] = Field(VirtualBoxAdapterType.intel_pro_1000_mt_desktop, description="VirtualBox adapter type"
43
42
  )
44
43
  first_port_name: Optional[str] = Field("", description="Optional name of the first networking port example: eth0")
45
44
  port_name_format: Optional[str] = Field(
@@ -51,9 +50,9 @@ class VirtualBoxTemplate(TemplateBase):
51
50
  )
52
51
  headless: Optional[bool] = Field(False, description="Headless mode")
53
52
  on_close: Optional[VirtualBoxOnCloseAction] = Field(
54
- "power_off", description="Action to execute on the VM is closed"
53
+ VirtualBoxOnCloseAction.power_off, description="Action to execute on the VM is closed"
55
54
  )
56
- console_type: Optional[VirtualBoxConsoleType] = Field("none", description="Console type")
55
+ console_type: Optional[VirtualBoxConsoleType] = Field(VirtualBoxConsoleType.none, description="Console type")
57
56
  console_auto_start: Optional[bool] = Field(
58
57
  False, description="Automatically start the console when the node has started"
59
58
  )
@@ -29,7 +29,7 @@ from typing import Optional, List
29
29
 
30
30
  class VMwareTemplate(TemplateBase):
31
31
 
32
- category: Optional[Category] = "guest"
32
+ category: Optional[Category] = Category.guest
33
33
  default_name_format: Optional[str] = "{name}-{0}"
34
34
  symbol: Optional[str] = "vmware_guest"
35
35
  vmx_path: str = Field(..., description="Path to the vmx file")
@@ -45,11 +45,11 @@ class VMwareTemplate(TemplateBase):
45
45
  adapters: Optional[int] = Field(
46
46
  1, ge=0, le=10, description="Number of adapters"
47
47
  ) # 10 is the maximum adapters support by VMware VMs
48
- adapter_type: Optional[VMwareAdapterType] = Field("e1000", description="VMware adapter type")
48
+ adapter_type: Optional[VMwareAdapterType] = Field(VMwareAdapterType.e1000, description="VMware adapter type")
49
49
  use_any_adapter: Optional[bool] = Field(False, description="Allow GNS3 to use any VMware adapter")
50
50
  headless: Optional[bool] = Field(False, description="Headless mode")
51
- on_close: Optional[VMwareOnCloseAction] = Field("power_off", description="Action to execute on the VM is closed")
52
- console_type: Optional[VMwareConsoleType] = Field("none", description="Console type")
51
+ on_close: Optional[VMwareOnCloseAction] = Field(VMwareOnCloseAction.power_off, description="Action to execute on the VM is closed")
52
+ console_type: Optional[VMwareConsoleType] = Field(VMwareConsoleType.none, description="Console type")
53
53
  console_auto_start: Optional[bool] = Field(
54
54
  False, description="Automatically start the console when the node has started"
55
55
  )
@@ -24,11 +24,11 @@ from typing import Optional
24
24
 
25
25
  class VPCSTemplate(TemplateBase):
26
26
 
27
- category: Optional[Category] = "guest"
27
+ category: Optional[Category] = Category.guest
28
28
  default_name_format: Optional[str] = "PC{0}"
29
29
  symbol: Optional[str] = "vpcs_guest"
30
30
  base_script_file: Optional[str] = Field("vpcs_base_config.txt", description="Script file")
31
- console_type: Optional[ConsoleType] = Field("telnet", description="Console type")
31
+ console_type: Optional[ConsoleType] = Field(ConsoleType.telnet, description="Console type")
32
32
  console_auto_start: Optional[bool] = Field(
33
33
  False, description="Automatically start the console when the node has started"
34
34
  )
@@ -36,7 +36,7 @@
36
36
  <body class="mat-app-background" oncontextmenu="return false;">
37
37
  <app-root></app-root>
38
38
  <!-- Global site tag (gtag.js) - Google Analytics -->
39
- <script async="" src="https://www.googletagmanager.com/gtag/js?id=G-5D6FZL9923"></script>
39
+ <script async="" src="https://www.googletagmanager.com/gtag/js?id=G-0BT7QQV1W1"></script>
40
40
  <script>
41
41
  window.dataLayer = window.dataLayer || [];
42
42
  function gtag() {
@@ -44,8 +44,8 @@
44
44
  }
45
45
  gtag('js', new Date());
46
46
 
47
- gtag('config', 'G-5D6FZL9923');
47
+ gtag('config', 'G-0BT7QQV1W1');
48
48
  </script>
49
- <script src="runtime.24fa95b7061d7056.js" type="module"></script><script src="polyfills.319c79dd175e50d0.js" type="module"></script><script src="main.f3840f9b1c0240e6.js" type="module"></script>
49
+ <script src="runtime.24fa95b7061d7056.js" type="module"></script><script src="polyfills.319c79dd175e50d0.js" type="module"></script><script src="main.ed82697b58d803e7.js" type="module"></script>
50
50
 
51
51
  </body></html>