gns3-server 3.0.0rc2__py3-none-any.whl → 3.0.1__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.
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/METADATA +3 -3
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/RECORD +37 -31
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/WHEEL +1 -1
- gns3server/api/routes/controller/projects.py +20 -4
- gns3server/api/routes/index.py +3 -3
- gns3server/api/server.py +38 -3
- gns3server/appliances/arista-veos.gns3a +20 -514
- gns3server/appliances/cisco-7200.gns3a +26 -0
- gns3server/appliances/cisco-asav.gns3a +14 -1
- gns3server/appliances/cisco-iou-l2.gns3a +16 -4
- gns3server/appliances/cisco-iou-l3.gns3a +16 -4
- gns3server/appliances/innovaphone-app.gns3a +50 -0
- gns3server/appliances/innovaphone-ipva.gns3a +78 -0
- gns3server/appliances/pfsense.gns3a +14 -0
- gns3server/compute/iou/iou_vm.py +22 -12
- gns3server/controller/__init__.py +22 -21
- gns3server/controller/compute.py +1 -1
- gns3server/controller/node.py +2 -6
- gns3server/controller/project.py +1 -2
- gns3server/crash_report.py +1 -1
- gns3server/db/repositories/pools.py +1 -1
- gns3server/disks/empty100G.qcow2 +0 -0
- gns3server/disks/empty200G.qcow2 +0 -0
- gns3server/disks/empty30G.qcow2 +0 -0
- gns3server/disks/empty8G.qcow2 +0 -0
- gns3server/schemas/config.py +1 -1
- gns3server/static/favicon.ico +0 -0
- gns3server/static/redoc.standalone.js +1782 -0
- gns3server/static/swagger-ui-bundle.js +2 -0
- gns3server/static/swagger-ui.css +3 -0
- gns3server/static/web-ui/index.html +1 -1
- gns3server/static/web-ui/{main.ed82697b58d803e7.js → main.e55eeff5c0ba1cf4.js} +1 -1
- gns3server/utils/images.py +45 -35
- gns3server/version.py +2 -2
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/LICENSE +0 -0
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/entry_points.txt +0 -0
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/top_level.txt +0 -0
|
@@ -13,13 +13,19 @@
|
|
|
13
13
|
"iou": {
|
|
14
14
|
"ethernet_adapters": 4,
|
|
15
15
|
"serial_adapters": 0,
|
|
16
|
-
"nvram":
|
|
17
|
-
"ram":
|
|
16
|
+
"nvram": 512,
|
|
17
|
+
"ram": 512,
|
|
18
18
|
"startup_config": "iou_l2_base_startup-config.txt"
|
|
19
19
|
},
|
|
20
20
|
"images": [
|
|
21
21
|
{
|
|
22
|
-
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms.
|
|
22
|
+
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms.iol",
|
|
23
|
+
"version": "17.15.1",
|
|
24
|
+
"md5sum": "6c587cdfd5056078e70b3f6c26800d66",
|
|
25
|
+
"filesize": 243251976
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms",
|
|
23
29
|
"version": "17.12.1",
|
|
24
30
|
"md5sum": "2b5055e4cef8fd257416d74a94adb626",
|
|
25
31
|
"filesize": 240355720
|
|
@@ -44,10 +50,16 @@
|
|
|
44
50
|
}
|
|
45
51
|
],
|
|
46
52
|
"versions": [
|
|
53
|
+
{
|
|
54
|
+
"name": "17.15.1",
|
|
55
|
+
"images": {
|
|
56
|
+
"image": "x86_64_crb_linux_l2-adventerprisek9-ms.iol"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
47
59
|
{
|
|
48
60
|
"name": "17.12.1",
|
|
49
61
|
"images": {
|
|
50
|
-
"image": "x86_64_crb_linux_l2-adventerprisek9-ms
|
|
62
|
+
"image": "x86_64_crb_linux_l2-adventerprisek9-ms"
|
|
51
63
|
}
|
|
52
64
|
},
|
|
53
65
|
{
|
|
@@ -13,13 +13,19 @@
|
|
|
13
13
|
"iou": {
|
|
14
14
|
"ethernet_adapters": 2,
|
|
15
15
|
"serial_adapters": 2,
|
|
16
|
-
"nvram":
|
|
17
|
-
"ram":
|
|
16
|
+
"nvram": 512,
|
|
17
|
+
"ram": 512,
|
|
18
18
|
"startup_config": "iou_l3_base_startup-config.txt"
|
|
19
19
|
},
|
|
20
20
|
"images": [
|
|
21
21
|
{
|
|
22
|
-
"filename": "x86_64_crb_linux-adventerprisek9-ms.
|
|
22
|
+
"filename": "x86_64_crb_linux-adventerprisek9-ms.iol",
|
|
23
|
+
"version": "17.15.1",
|
|
24
|
+
"md5sum": "5d584f6cfbeaadc87d55f613da1049ed",
|
|
25
|
+
"filesize": 292001512
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"filename": "x86_64_crb_linux-adventerprisek9-ms",
|
|
23
29
|
"version": "17.12.1",
|
|
24
30
|
"md5sum": "4a2fce8de21d1831fbceffd155e41ae7",
|
|
25
31
|
"filesize": 288947184
|
|
@@ -44,10 +50,16 @@
|
|
|
44
50
|
}
|
|
45
51
|
],
|
|
46
52
|
"versions": [
|
|
53
|
+
{
|
|
54
|
+
"name": "17.15.1",
|
|
55
|
+
"images": {
|
|
56
|
+
"image": "x86_64_crb_linux-adventerprisek9-ms.iol"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
47
59
|
{
|
|
48
60
|
"name": "17.12.1",
|
|
49
61
|
"images": {
|
|
50
|
-
"image": "x86_64_crb_linux-adventerprisek9-ms
|
|
62
|
+
"image": "x86_64_crb_linux-adventerprisek9-ms"
|
|
51
63
|
}
|
|
52
64
|
},
|
|
53
65
|
{
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"appliance_id": "92dbd0e9-144e-4c59-a4a8-97b6a1661818",
|
|
3
|
+
"name": "Innovaphone App-Platform",
|
|
4
|
+
"category": "guest",
|
|
5
|
+
"description": "In addition to telephony, apps for Video Telephony, Chat, Conferencing, Application Sharing and many other functions have become indispensable UCC tools in the area of business communication. Based on the myApps platform and its various components, innovaphone provides a collaborative work and communication platform for enhanced corporate communications \u2013 regardless of the location and the device being used. The innovaphone platform myApps consists of many independent components that work well individually, yet unfold their remarkable performance when combined.",
|
|
6
|
+
"vendor_name": "Innovaphone",
|
|
7
|
+
"vendor_url": "https://www.innovaphone.com",
|
|
8
|
+
"vendor_logo_url": "https://www.innovaphone.com/content/downloads/innovaphone-myapps-logo-short-without-background-screen.png",
|
|
9
|
+
"documentation_url": "https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform",
|
|
10
|
+
"product_name": "App-Platform",
|
|
11
|
+
"product_url": "https://www.innovaphone.com/en/products/myapps/myapps-platform.html",
|
|
12
|
+
"registry_version": 4,
|
|
13
|
+
"status": "experimental",
|
|
14
|
+
"availability": "free-to-try",
|
|
15
|
+
"maintainer": "Thomas Marchsteiner",
|
|
16
|
+
"maintainer_email": "thomas.marchsteiner@acp.at",
|
|
17
|
+
"usage": "Default users console:root/iplinux , ssh:admin/ipapps , Webinterface:pwd \nAfter first boot wait for automatic reboot.\nA static ip can be set via the setip utility. \nLoading another keymap can be done via the loadkeys command. \nThe app-platform-disk1.vmdk file is contained within an ova file. \nIt can be extraced with the tar utility, 7Zip or any other tool which can handle tar files.",
|
|
18
|
+
"symbol": "innovaphone-ap-icon.jpg",
|
|
19
|
+
"first_port_name": "eth0",
|
|
20
|
+
"qemu": {
|
|
21
|
+
"adapter_type": "vmxnet3",
|
|
22
|
+
"adapters": 1,
|
|
23
|
+
"ram": 512,
|
|
24
|
+
"cpus": 1,
|
|
25
|
+
"hda_disk_interface": "scsi",
|
|
26
|
+
"arch": "x86_64",
|
|
27
|
+
"console_type": "vnc",
|
|
28
|
+
"boot_priority": "d",
|
|
29
|
+
"kvm": "allow",
|
|
30
|
+
"on_close": "power_off",
|
|
31
|
+
"process_priority": "normal"
|
|
32
|
+
},
|
|
33
|
+
"images": [
|
|
34
|
+
{
|
|
35
|
+
"filename": "app-platform-disk1_120010.vmdk",
|
|
36
|
+
"version": "12.0010",
|
|
37
|
+
"md5sum": "d5a5a77f682c2c988b0810935d79a787",
|
|
38
|
+
"filesize": 129474560,
|
|
39
|
+
"download_url": "https://store.innovaphone.com/"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"versions": [
|
|
43
|
+
{
|
|
44
|
+
"images": {
|
|
45
|
+
"hda_disk_image": "app-platform-disk1_120010.vmdk"
|
|
46
|
+
},
|
|
47
|
+
"name": "12.0010"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"appliance_id": "ddf8f7a4-60c0-4c9d-849c-ffc3c9d1d082",
|
|
3
|
+
"name": "Innovaphone IPVA",
|
|
4
|
+
"category": "guest",
|
|
5
|
+
"description": "The innovaphone PBX is a professional IP telephone system. The IPVA is a software-only solution. It appears as and performs as an innovaphone 'hard-box' excluding DSP-, ISDN-/AB-resources.",
|
|
6
|
+
"vendor_name": "Innovaphone",
|
|
7
|
+
"vendor_url": "https://www.innovaphone.com/",
|
|
8
|
+
"vendor_logo_url": "https://www.innovaphone.com/content/downloads/innovaphone-myapps-logo-short-without-background-screen.png",
|
|
9
|
+
"documentation_url": "https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_Innovaphone_Virtual_Appliance_(IPVA)",
|
|
10
|
+
"product_name": "IPVA",
|
|
11
|
+
"product_url": "https://www.innovaphone.com/en/products/innovaphone-pbx.html",
|
|
12
|
+
"registry_version": 4,
|
|
13
|
+
"status": "experimental",
|
|
14
|
+
"availability": "free-to-try",
|
|
15
|
+
"maintainer": "Thomas Marchsteiner",
|
|
16
|
+
"maintainer_email": "thomas.marchsteiner@acp.at",
|
|
17
|
+
"usage": "Default user admin/ipva \nDefault network configuration: DHCP client on eth0 with fallback to static address 192.168.0.1/24 after timeout. Static address 192.168.1.1/24 on eth1\n The ova in the zip file contains the disk images to run this appliance. Disableing the dhcp client and setting a static IP is possible with the following commands:\n> config change IP0 ETH0 /addr 192.168.0.1 /mask 255.255.255.0 \n> config change DHCP0 /mode off \n> config write \n> config activate \n> reset",
|
|
18
|
+
"symbol": "innovaphone-pbx-green.png",
|
|
19
|
+
"first_port_name": "eth0",
|
|
20
|
+
"port_name_format": "eth{port1}",
|
|
21
|
+
"qemu": {
|
|
22
|
+
"adapter_type": "vmxnet3",
|
|
23
|
+
"adapters": 2,
|
|
24
|
+
"ram": 256,
|
|
25
|
+
"cpus": 1,
|
|
26
|
+
"hda_disk_interface": "ide",
|
|
27
|
+
"hdb_disk_interface": "ide",
|
|
28
|
+
"hdc_disk_interface": "ide",
|
|
29
|
+
"hdd_disk_interface": "ide",
|
|
30
|
+
"arch": "x86_64",
|
|
31
|
+
"console_type": "vnc",
|
|
32
|
+
"boot_priority": "d",
|
|
33
|
+
"kvm": "allow",
|
|
34
|
+
"on_close": "power_off",
|
|
35
|
+
"process_priority": "normal"
|
|
36
|
+
},
|
|
37
|
+
"images": [
|
|
38
|
+
{
|
|
39
|
+
"filename": "ipva-qemu-disk1-14r2.vmdk",
|
|
40
|
+
"version": "14r2",
|
|
41
|
+
"md5sum": "aaa1c3885eee30ca6ffa3827619e8643",
|
|
42
|
+
"filesize": 6269952,
|
|
43
|
+
"download_url": "https://store.innovaphone.com/"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"filename": "ipva-qemu-disk2-14r2.vmdk",
|
|
47
|
+
"version": "14r2",
|
|
48
|
+
"md5sum": "008a8fc6b0b1e5f11a3e7fd6f22ba349",
|
|
49
|
+
"filesize": 72192,
|
|
50
|
+
"download_url": "https://store.innovaphone.com/"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"filename": "ipva-qemu-disk3-14r2.vmdk",
|
|
54
|
+
"version": "14r2",
|
|
55
|
+
"md5sum": "20516731c480e2112b3fb4a4d7f514f2",
|
|
56
|
+
"filesize": 68096,
|
|
57
|
+
"download_url": "https://store.innovaphone.com/"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"filename": "ipva-qemu-disk4-14r2.vmdk",
|
|
61
|
+
"version": "14r2",
|
|
62
|
+
"md5sum": "15d7d79ef8c28bd29b2eceac8405f964",
|
|
63
|
+
"filesize": 68096,
|
|
64
|
+
"download_url": "https://store.innovaphone.com/"
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"versions": [
|
|
68
|
+
{
|
|
69
|
+
"images": {
|
|
70
|
+
"hda_disk_image": "ipva-qemu-disk1-14r2.vmdk",
|
|
71
|
+
"hdb_disk_image": "ipva-qemu-disk2-14r2.vmdk",
|
|
72
|
+
"hdc_disk_image": "ipva-qemu-disk3-14r2.vmdk",
|
|
73
|
+
"hdd_disk_image": "ipva-qemu-disk4-14r2.vmdk"
|
|
74
|
+
},
|
|
75
|
+
"name": "14r2"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
@@ -24,6 +24,13 @@
|
|
|
24
24
|
"process_priority": "normal"
|
|
25
25
|
},
|
|
26
26
|
"images": [
|
|
27
|
+
{
|
|
28
|
+
"filename": "pfSense-CE-2.7.2-RELEASE-amd64.iso",
|
|
29
|
+
"version": "2.7.2",
|
|
30
|
+
"md5sum": "50c3e723d68ec74d038041a34fa846f8",
|
|
31
|
+
"filesize": 874672128,
|
|
32
|
+
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
|
33
|
+
},
|
|
27
34
|
{
|
|
28
35
|
"filename": "pfSense-CE-2.7.0-RELEASE-amd64.iso",
|
|
29
36
|
"version": "2.7.0",
|
|
@@ -76,6 +83,13 @@
|
|
|
76
83
|
}
|
|
77
84
|
],
|
|
78
85
|
"versions": [
|
|
86
|
+
{
|
|
87
|
+
"name": "2.7.2",
|
|
88
|
+
"images": {
|
|
89
|
+
"hda_disk_image": "empty100G.qcow2",
|
|
90
|
+
"cdrom_image": "pfSense-CE-2.7.2-RELEASE-amd64.iso"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
79
93
|
{
|
|
80
94
|
"name": "2.7.0",
|
|
81
95
|
"images": {
|
gns3server/compute/iou/iou_vm.py
CHANGED
|
@@ -436,14 +436,16 @@ class IOUVM(BaseNode):
|
|
|
436
436
|
)
|
|
437
437
|
)
|
|
438
438
|
|
|
439
|
-
|
|
439
|
+
def _is_iou_license_check_enabled(self):
|
|
440
440
|
"""
|
|
441
|
-
|
|
441
|
+
Returns if IOU license check is enabled.
|
|
442
|
+
|
|
443
|
+
:return: boolean
|
|
442
444
|
"""
|
|
443
445
|
|
|
444
446
|
# license check is sent by the controller
|
|
445
447
|
if self.license_check is False:
|
|
446
|
-
return
|
|
448
|
+
return False
|
|
447
449
|
|
|
448
450
|
try:
|
|
449
451
|
# we allow license check to be disabled server wide
|
|
@@ -453,7 +455,14 @@ class IOUVM(BaseNode):
|
|
|
453
455
|
|
|
454
456
|
if server_wide_license_check is False:
|
|
455
457
|
log.warning("License check is explicitly disabled on this server")
|
|
456
|
-
return
|
|
458
|
+
return False
|
|
459
|
+
|
|
460
|
+
return True
|
|
461
|
+
|
|
462
|
+
async def _check_iou_license(self):
|
|
463
|
+
"""
|
|
464
|
+
Checks for a valid IOU key in the iourc file (paranoid mode).
|
|
465
|
+
"""
|
|
457
466
|
|
|
458
467
|
config = configparser.ConfigParser()
|
|
459
468
|
try:
|
|
@@ -559,15 +568,16 @@ class IOUVM(BaseNode):
|
|
|
559
568
|
except OSError as e:
|
|
560
569
|
raise IOUError(f"Could not rename nvram files: {e}")
|
|
561
570
|
|
|
562
|
-
iourc_path =
|
|
563
|
-
if
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
571
|
+
iourc_path = None
|
|
572
|
+
if self._is_iou_license_check_enabled():
|
|
573
|
+
iourc_path = self.iourc_path
|
|
574
|
+
if not iourc_path:
|
|
575
|
+
raise IOUError("Could not find an iourc file (IOU license), please configure an IOU license")
|
|
576
|
+
if not os.path.isfile(iourc_path):
|
|
577
|
+
raise IOUError(f"The iourc path '{iourc_path}' is not a regular file")
|
|
578
|
+
await self._check_iou_license()
|
|
567
579
|
|
|
568
|
-
await self._check_iou_licence()
|
|
569
580
|
await self._start_ubridge()
|
|
570
|
-
|
|
571
581
|
self._create_netmap_config()
|
|
572
582
|
if self.use_default_iou_values:
|
|
573
583
|
# make sure we have the default nvram amount to correctly push the configs
|
|
@@ -579,7 +589,7 @@ class IOUVM(BaseNode):
|
|
|
579
589
|
|
|
580
590
|
self._nvram_watcher = FileWatcher(self._nvram_file(), self._nvram_changed, delay=2)
|
|
581
591
|
|
|
582
|
-
# created
|
|
592
|
+
# created an environment variable pointing to the iourc file.
|
|
583
593
|
env = os.environ.copy()
|
|
584
594
|
if "IOURC" not in os.environ and iourc_path:
|
|
585
595
|
env["IOURC"] = iourc_path
|
|
@@ -64,7 +64,7 @@ class Controller:
|
|
|
64
64
|
self.gns3vm = GNS3VM(self)
|
|
65
65
|
self.symbols = Symbols()
|
|
66
66
|
self._appliance_manager = ApplianceManager()
|
|
67
|
-
self._iou_license_settings = {"iourc_content": "", "license_check":
|
|
67
|
+
self._iou_license_settings = {"iourc_content": "", "license_check": False}
|
|
68
68
|
self._vars_loaded = False
|
|
69
69
|
self._vars_file = Config.instance().controller_vars
|
|
70
70
|
log.info(f'Loading controller vars file "{self._vars_file}"')
|
|
@@ -134,7 +134,9 @@ class Controller:
|
|
|
134
134
|
log.warning(str(e))
|
|
135
135
|
|
|
136
136
|
await self.load_projects()
|
|
137
|
-
|
|
137
|
+
|
|
138
|
+
# start to auto open projects (if configured) 5 seconds after the controller has started
|
|
139
|
+
asyncio.get_event_loop().call_later(5, asyncio.create_task, self._project_auto_open())
|
|
138
140
|
|
|
139
141
|
def _create_ssl_context(self, server_config):
|
|
140
142
|
|
|
@@ -208,19 +210,15 @@ class Controller:
|
|
|
208
210
|
if self._vars_loaded:
|
|
209
211
|
controller_vars = {
|
|
210
212
|
"appliances_etag": self._appliance_manager.appliances_etag,
|
|
213
|
+
"iou_license_check": self._iou_license_settings["license_check"],
|
|
211
214
|
"version": __version__
|
|
212
215
|
}
|
|
213
216
|
|
|
214
217
|
if self._iou_license_settings["iourc_content"]:
|
|
215
218
|
|
|
216
|
-
iou_config = Config.instance().settings.IOU
|
|
217
219
|
server_config = Config.instance().settings.Server
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
iourc_path = iou_config.iourc_path
|
|
221
|
-
else:
|
|
222
|
-
os.makedirs(server_config.secrets_dir, exist_ok=True)
|
|
223
|
-
iourc_path = os.path.join(server_config.secrets_dir, "gns3_iourc_license")
|
|
220
|
+
os.makedirs(server_config.secrets_dir, exist_ok=True)
|
|
221
|
+
iourc_path = os.path.join(server_config.secrets_dir, "iou_license")
|
|
224
222
|
|
|
225
223
|
try:
|
|
226
224
|
with open(iourc_path, "w+") as f:
|
|
@@ -251,15 +249,11 @@ class Controller:
|
|
|
251
249
|
return []
|
|
252
250
|
|
|
253
251
|
# load the IOU license settings
|
|
254
|
-
iou_config = Config.instance().settings.IOU
|
|
255
252
|
server_config = Config.instance().settings.Server
|
|
256
253
|
|
|
257
|
-
if
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
if not server_config.secrets_dir:
|
|
261
|
-
server_config.secrets_dir = os.path.dirname(Config.instance().server_config)
|
|
262
|
-
iourc_path = os.path.join(server_config.secrets_dir, "gns3_iourc_license")
|
|
254
|
+
if not server_config.secrets_dir:
|
|
255
|
+
server_config.secrets_dir = os.path.dirname(Config.instance().server_config)
|
|
256
|
+
iourc_path = os.path.join(server_config.secrets_dir, "iou_license")
|
|
263
257
|
|
|
264
258
|
if os.path.exists(iourc_path):
|
|
265
259
|
try:
|
|
@@ -268,7 +262,10 @@ class Controller:
|
|
|
268
262
|
log.info(f"iourc file '{iourc_path}' loaded")
|
|
269
263
|
except OSError as e:
|
|
270
264
|
log.error(f"Cannot read IOU license file '{iourc_path}': {e}")
|
|
271
|
-
|
|
265
|
+
|
|
266
|
+
# IOU license check is disabled by default
|
|
267
|
+
self._iou_license_settings["license_check"] = controller_vars.get("iou_license_check", False)
|
|
268
|
+
log.info("IOU license check is {} on the controller".format("enabled" if self._iou_license_settings["license_check"] else "disabled"))
|
|
272
269
|
|
|
273
270
|
# install the built-in appliances if needed
|
|
274
271
|
if Config.instance().settings.Server.install_builtin_appliances:
|
|
@@ -347,6 +344,7 @@ class Controller:
|
|
|
347
344
|
dst_path = self.configs_path()
|
|
348
345
|
log.info(f"Installing base configs in '{dst_path}'")
|
|
349
346
|
try:
|
|
347
|
+
# do not overwrite base configs because they may have been customized by the user
|
|
350
348
|
Controller.install_resource_files(dst_path, "configs", upgrade_resources=False)
|
|
351
349
|
except OSError as e:
|
|
352
350
|
log.error(f"Could not install base config files to {dst_path}: {e}")
|
|
@@ -360,7 +358,7 @@ class Controller:
|
|
|
360
358
|
dst_path = self.disks_path()
|
|
361
359
|
log.info(f"Installing built-in disks in '{dst_path}'")
|
|
362
360
|
try:
|
|
363
|
-
Controller.install_resource_files(dst_path, "disks"
|
|
361
|
+
Controller.install_resource_files(dst_path, "disks")
|
|
364
362
|
except OSError as e:
|
|
365
363
|
log.error(f"Could not install disk files to {dst_path}: {e}")
|
|
366
364
|
|
|
@@ -600,9 +598,12 @@ class Controller:
|
|
|
600
598
|
Auto open the project with auto open enable
|
|
601
599
|
"""
|
|
602
600
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
601
|
+
try:
|
|
602
|
+
for project in self._projects.values():
|
|
603
|
+
if project.auto_open:
|
|
604
|
+
await project.open()
|
|
605
|
+
except ControllerError as e:
|
|
606
|
+
log.error(f"Could not auto open projects: {e}")
|
|
606
607
|
|
|
607
608
|
def get_free_project_name(self, base_name):
|
|
608
609
|
"""
|
gns3server/controller/compute.py
CHANGED
|
@@ -502,7 +502,7 @@ class Compute:
|
|
|
502
502
|
""" Returns URL for specific path at Compute"""
|
|
503
503
|
return self._getUrl(path)
|
|
504
504
|
|
|
505
|
-
async def _run_http_query(self, method, path, data=None, timeout=
|
|
505
|
+
async def _run_http_query(self, method, path, data=None, timeout=120, raw=False):
|
|
506
506
|
async with async_timeout.timeout(delay=timeout):
|
|
507
507
|
url = self._getUrl(path)
|
|
508
508
|
headers = {"content-type": "application/json"}
|
gns3server/controller/node.py
CHANGED
|
@@ -572,15 +572,11 @@ class Node:
|
|
|
572
572
|
Start a node
|
|
573
573
|
"""
|
|
574
574
|
try:
|
|
575
|
-
# For IOU we need to send the licence everytime
|
|
575
|
+
# For IOU: we need to send the licence everytime we start a node
|
|
576
576
|
if self.node_type == "iou":
|
|
577
577
|
license_check = self._project.controller.iou_license.get("license_check", True)
|
|
578
578
|
iourc_content = self._project.controller.iou_license.get("iourc_content", None)
|
|
579
|
-
|
|
580
|
-
# raise aiohttp.web.HTTPConflict(text="IOU licence is not configured")
|
|
581
|
-
await self.post(
|
|
582
|
-
"/start", timeout=240, data={"license_check": license_check, "iourc_content": iourc_content}
|
|
583
|
-
)
|
|
579
|
+
await self.post("/start", timeout=240, data={"license_check": license_check, "iourc_content": iourc_content})
|
|
584
580
|
else:
|
|
585
581
|
await self.post("/start", data=data, timeout=240)
|
|
586
582
|
except asyncio.TimeoutError:
|
gns3server/controller/project.py
CHANGED
|
@@ -595,7 +595,7 @@ class Project:
|
|
|
595
595
|
|
|
596
596
|
if node_type == "iou":
|
|
597
597
|
async with self._iou_id_lock:
|
|
598
|
-
# wait for
|
|
598
|
+
# wait for an IOU node to be completely created before adding a new one
|
|
599
599
|
# this is important otherwise we allocate the same application ID (used
|
|
600
600
|
# to generate MAC addresses) when creating multiple IOU node at the same time
|
|
601
601
|
if "properties" in kwargs.keys():
|
|
@@ -1339,7 +1339,6 @@ class Project:
|
|
|
1339
1339
|
Copy the project files directly rather than in an import-export fashion.
|
|
1340
1340
|
|
|
1341
1341
|
:param name: Name of the new project. A new one will be generated in case of conflicts
|
|
1342
|
-
:param location: Parent directory of the new project
|
|
1343
1342
|
:param reset_mac_addresses: Reset MAC addresses for the new project
|
|
1344
1343
|
"""
|
|
1345
1344
|
|
gns3server/crash_report.py
CHANGED
|
@@ -58,7 +58,7 @@ class CrashReport:
|
|
|
58
58
|
Report crash to a third party service
|
|
59
59
|
"""
|
|
60
60
|
|
|
61
|
-
DSN = "https://
|
|
61
|
+
DSN = "https://847198b87dbd50ef8962901641918a08@o19455.ingest.us.sentry.io/38482"
|
|
62
62
|
_instance = None
|
|
63
63
|
|
|
64
64
|
def __init__(self):
|
|
@@ -80,7 +80,7 @@ class ResourcePoolsRepository(BaseRepository):
|
|
|
80
80
|
await self._db_session.commit()
|
|
81
81
|
return result.rowcount > 0
|
|
82
82
|
|
|
83
|
-
async def get_resource_memberships(self, resource_id: UUID) -> List[models.
|
|
83
|
+
async def get_resource_memberships(self, resource_id: UUID) -> List[models.ResourcePool]:
|
|
84
84
|
"""
|
|
85
85
|
Get all resource memberships in resource pools.
|
|
86
86
|
"""
|
gns3server/disks/empty100G.qcow2
CHANGED
|
Binary file
|
gns3server/disks/empty200G.qcow2
CHANGED
|
Binary file
|
gns3server/disks/empty30G.qcow2
CHANGED
|
Binary file
|
gns3server/disks/empty8G.qcow2
CHANGED
|
Binary file
|
gns3server/schemas/config.py
CHANGED
|
@@ -147,7 +147,7 @@ class ServerSettings(BaseModel):
|
|
|
147
147
|
allow_remote_console: bool = False
|
|
148
148
|
enable_builtin_templates: bool = True
|
|
149
149
|
install_builtin_appliances: bool = True
|
|
150
|
-
model_config = ConfigDict(validate_assignment=True, str_strip_whitespace=True
|
|
150
|
+
model_config = ConfigDict(validate_assignment=True, str_strip_whitespace=True)
|
|
151
151
|
|
|
152
152
|
@field_validator("additional_images_paths", mode="before")
|
|
153
153
|
@classmethod
|
|
Binary file
|