gns3-server 3.0.0rc2__py3-none-any.whl → 3.0.2__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.2.dist-info}/METADATA +19 -18
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/RECORD +48 -42
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/WHEEL +1 -1
- gns3server/api/routes/controller/images.py +58 -21
- gns3server/api/routes/controller/projects.py +20 -4
- gns3server/api/routes/controller/templates.py +23 -2
- 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/docker/__init__.py +1 -1
- gns3server/compute/iou/iou_vm.py +22 -12
- gns3server/controller/__init__.py +48 -38
- gns3server/controller/appliance_manager.py +2 -2
- gns3server/controller/compute.py +8 -3
- gns3server/controller/node.py +2 -6
- gns3server/controller/project.py +1 -2
- gns3server/crash_report.py +1 -1
- gns3server/db/repositories/images.py +22 -3
- gns3server/db/repositories/pools.py +1 -1
- gns3server/db/repositories/templates.py +11 -0
- gns3server/db/tasks.py +120 -79
- 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/server.py +3 -3
- gns3server/services/authentication.py +9 -6
- 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.62c99707e4709a56.js +1 -0
- gns3server/utils/asyncio/__init__.py +4 -12
- gns3server/utils/asyncio/pool.py +1 -4
- gns3server/utils/images.py +62 -39
- gns3server/version.py +2 -2
- gns3server/static/web-ui/main.ed82697b58d803e7.js +0 -1
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/LICENSE +0 -0
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/entry_points.txt +0 -0
- {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/top_level.txt +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: gns3-server
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.2
|
|
4
4
|
Summary: GNS3 graphical interface for the GNS3 server.
|
|
5
5
|
Author-email: Jeremy Grossmann <developers@gns3.com>
|
|
6
|
-
License:
|
|
6
|
+
License: GNU GENERAL PUBLIC LICENSE
|
|
7
7
|
Version 3, 29 June 2007
|
|
8
8
|
|
|
9
9
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
|
@@ -690,35 +690,36 @@ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
|
690
690
|
Classifier: Natural Language :: English
|
|
691
691
|
Classifier: Operating System :: POSIX :: Linux
|
|
692
692
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
693
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
694
693
|
Classifier: Programming Language :: Python :: 3.9
|
|
695
694
|
Classifier: Programming Language :: Python :: 3.10
|
|
696
695
|
Classifier: Programming Language :: Python :: 3.11
|
|
697
696
|
Classifier: Programming Language :: Python :: 3.12
|
|
697
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
698
698
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
699
|
-
Requires-Python: >=3.
|
|
699
|
+
Requires-Python: >=3.9
|
|
700
700
|
Description-Content-Type: text/markdown
|
|
701
701
|
License-File: LICENSE
|
|
702
|
-
Requires-Dist: uvicorn==0.
|
|
703
|
-
Requires-Dist: pydantic==2.
|
|
704
|
-
Requires-Dist: fastapi==0.115.
|
|
705
|
-
Requires-Dist: python-multipart==0.0.
|
|
706
|
-
Requires-Dist: websockets==
|
|
702
|
+
Requires-Dist: uvicorn==0.33.0
|
|
703
|
+
Requires-Dist: pydantic==2.10.4
|
|
704
|
+
Requires-Dist: fastapi==0.115.6
|
|
705
|
+
Requires-Dist: python-multipart==0.0.20
|
|
706
|
+
Requires-Dist: websockets==14.1
|
|
707
707
|
Requires-Dist: aiohttp<3.11,>=3.10.10
|
|
708
|
-
Requires-Dist: async-timeout==
|
|
708
|
+
Requires-Dist: async-timeout==5.0.1; python_version < "3.11"
|
|
709
709
|
Requires-Dist: aiofiles<25.0,>=24.1.0
|
|
710
|
-
Requires-Dist: Jinja2<3.2,>=3.1.
|
|
711
|
-
Requires-Dist: sentry-sdk<2.
|
|
712
|
-
Requires-Dist: psutil>=6.1.
|
|
710
|
+
Requires-Dist: Jinja2<3.2,>=3.1.5
|
|
711
|
+
Requires-Dist: sentry-sdk<2.20,>=2.19.2
|
|
712
|
+
Requires-Dist: psutil>=6.1.1
|
|
713
713
|
Requires-Dist: distro>=1.9.0
|
|
714
714
|
Requires-Dist: py-cpuinfo<10.0,>=9.0.0
|
|
715
|
+
Requires-Dist: greenlet==3.1.1
|
|
715
716
|
Requires-Dist: sqlalchemy==2.0.36
|
|
716
717
|
Requires-Dist: aiosqlite==0.20.0
|
|
717
|
-
Requires-Dist: alembic==1.
|
|
718
|
-
Requires-Dist: bcrypt==4.2.
|
|
719
|
-
Requires-Dist:
|
|
718
|
+
Requires-Dist: alembic==1.14.0
|
|
719
|
+
Requires-Dist: bcrypt==4.2.1
|
|
720
|
+
Requires-Dist: joserfc==1.0.1
|
|
720
721
|
Requires-Dist: email-validator==2.2.0
|
|
721
|
-
Requires-Dist:
|
|
722
|
+
Requires-Dist: watchdog==6.0.0
|
|
722
723
|
Requires-Dist: zstandard==0.23.0
|
|
723
724
|
Requires-Dist: platformdirs<3,>=2.4.0
|
|
724
725
|
Requires-Dist: importlib-resources>=1.3; python_version <= "3.9"
|
|
@@ -730,7 +731,7 @@ Requires-Dist: pytest-timeout==2.3.1; extra == "dev"
|
|
|
730
731
|
Requires-Dist: pytest-asyncio==0.21.2; extra == "dev"
|
|
731
732
|
Requires-Dist: requests==2.32.3; extra == "dev"
|
|
732
733
|
Requires-Dist: httpx==0.27.2; extra == "dev"
|
|
733
|
-
Requires-Dist:
|
|
734
|
+
Requires-Dist: httpx_ws==0.6.2; extra == "dev"
|
|
734
735
|
|
|
735
736
|
# GNS3 server repository
|
|
736
737
|
|
|
@@ -2,15 +2,15 @@ gns3server/__init__.py,sha256=7t93V0ASczMyzTR7up2g0FBQ6Rm1eC8wxyysMKUeAKE,716
|
|
|
2
2
|
gns3server/__main__.py,sha256=5CO8WDwpzZ2BRo3Ct95MhMGxyXQ3QsHBcWt3jPlcLb0,736
|
|
3
3
|
gns3server/alembic.ini,sha256=XWHHdJ3QOHO3NJh5LK6bMHT6kv7GzAr26X1hs43DH4o,3086
|
|
4
4
|
gns3server/config.py,sha256=3UmjwcthW-gMKbLEPzygzrEVJYza-H1IWRjJZ_L1-tg,9244
|
|
5
|
-
gns3server/crash_report.py,sha256=
|
|
5
|
+
gns3server/crash_report.py,sha256=WLpcAtoTZ_MFDuPpJo6L6MW0OqGjMTrIilSc7oditOE,6021
|
|
6
6
|
gns3server/logger.py,sha256=zjHjyyqK74YMVPdjjznj03xWO42Kx3RDeVnZflT-0eI,5309
|
|
7
7
|
gns3server/main.py,sha256=w16TCAYfTmdKsrCjm7rt4hlwsaMfLiWxw8598K4B3zA,2286
|
|
8
|
-
gns3server/server.py,sha256=
|
|
9
|
-
gns3server/version.py,sha256=
|
|
8
|
+
gns3server/server.py,sha256=ZoqI8I1UI_gQgescnEiT0XFijJVo86vM3aowGLUOXHw,13362
|
|
9
|
+
gns3server/version.py,sha256=QxUxoSMx508tXlMSHuEUDgxjrmPrqRyrX3VxGhKmlbE,1462
|
|
10
10
|
gns3server/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
-
gns3server/api/server.py,sha256=
|
|
11
|
+
gns3server/api/server.py,sha256=LQAKxtBaVxylgVTqRpVhdwACdkaibDryOSUT2us5PUk,7972
|
|
12
12
|
gns3server/api/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
-
gns3server/api/routes/index.py,sha256=
|
|
13
|
+
gns3server/api/routes/index.py,sha256=Zw5RerRIurKRE5773D9vvtvYjQqBtD1R_q-UiDGwwx0,3308
|
|
14
14
|
gns3server/api/routes/compute/__init__.py,sha256=Mccr7yhdhHtPN_5THI9Zqj0sJUKiEHm6kK0kaQpXd8I,7648
|
|
15
15
|
gns3server/api/routes/compute/atm_switch_nodes.py,sha256=pWUQszCnK0j4bfSvT90z8tcuuK-M_2f0KKvtpCPV0dM,7294
|
|
16
16
|
gns3server/api/routes/compute/capabilities.py,sha256=vCaxxzVuTKbTWwXUf_Y829XjIetONUFSlEO5w5fq-7I,1604
|
|
@@ -40,16 +40,16 @@ gns3server/api/routes/controller/controller.py,sha256=6S8pMz5aj47RSrFeGP8CTuGYs8
|
|
|
40
40
|
gns3server/api/routes/controller/drawings.py,sha256=E76kffF_AqXtdY684snU507uAalLNVv-0l2eXe0b5WM,4076
|
|
41
41
|
gns3server/api/routes/controller/gns3vm.py,sha256=7uwJYx7PSkol6_trM8uN4g_XL7SNds8_r0EMC8UyNHM,2035
|
|
42
42
|
gns3server/api/routes/controller/groups.py,sha256=Haqy3lzYRS1-FcS15yXEeAPz6k7-sD1_RaPxPVZc85A,6962
|
|
43
|
-
gns3server/api/routes/controller/images.py,sha256=
|
|
43
|
+
gns3server/api/routes/controller/images.py,sha256=MJiMxvmG6P3BNd71tQ5EYbpd7xotm2VJRBYujY1hYV8,10334
|
|
44
44
|
gns3server/api/routes/controller/links.py,sha256=LgqmdVUUwtpipDhDzRdzUyKpsr1Or-t-E05SXAzGNkA,8464
|
|
45
45
|
gns3server/api/routes/controller/nodes.py,sha256=WeWmKVDU7aG9GeW4ZbvD79P12Ov0jTIZ5lw4fJjWq8s,18855
|
|
46
46
|
gns3server/api/routes/controller/pools.py,sha256=FCSqEmRxRvjMKM_iGwERxUrukJEGczV_XRpa8mSZmFw,7806
|
|
47
47
|
gns3server/api/routes/controller/privileges.py,sha256=mdjt1oHg2rIGonCopFfDXr7BCa_y3ky4_pMu8no0BCQ,1011
|
|
48
|
-
gns3server/api/routes/controller/projects.py,sha256=
|
|
48
|
+
gns3server/api/routes/controller/projects.py,sha256=1I5QL3rB35POkfBoObPH0xbUz-NkJlyJirqO-xIm2QE,21846
|
|
49
49
|
gns3server/api/routes/controller/roles.py,sha256=IQ-9BcUDOWqFpxSU7CEZWuEZ6H0VaWv4AfHxT0NZ8ME,6089
|
|
50
50
|
gns3server/api/routes/controller/snapshots.py,sha256=GMBL2nQJp8VJRpo7LpzHSBhPn1SJbvjs0HugDFqCOYE,3559
|
|
51
51
|
gns3server/api/routes/controller/symbols.py,sha256=D_fD-j421LJjiO0Rtgo82psxm4WLgN1psVqTdc4psSw,3825
|
|
52
|
-
gns3server/api/routes/controller/templates.py,sha256=
|
|
52
|
+
gns3server/api/routes/controller/templates.py,sha256=ZeD3eT2x__FvCqRLc85AukOkpHnBCwg1msYL826uqBI,7296
|
|
53
53
|
gns3server/api/routes/controller/users.py,sha256=cwf11_V1gZ-DThKILGlPZq-g6C4PuAJPU8HyEu5FdVU,8056
|
|
54
54
|
gns3server/api/routes/controller/dependencies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
55
|
gns3server/api/routes/controller/dependencies/authentication.py,sha256=-XeUWr21hYkQovqUhcctinPuLqk-q6803evBSTMHtNM,3979
|
|
@@ -64,7 +64,7 @@ gns3server/appliances/almalinux.gns3a,sha256=F37VYRnx0twhNxibZsAN9BKjISl1zu-6hwj
|
|
|
64
64
|
gns3server/appliances/alpine-linux-virt.gns3a,sha256=0BDnDSVRIllXk6Tpuyk1G2vWv9uiwyaCmdd_vYyBK-g,2567
|
|
65
65
|
gns3server/appliances/alpine-linux.gns3a,sha256=LZs8KQNJQtmpUn7uVOmLlb23kjQHc9Vbrhk-VzwT68o,810
|
|
66
66
|
gns3server/appliances/arista-ceos.gns3a,sha256=_N88hNErMaD4Wt7AcL4EfGpaohsMhvXWqFkvgcgPeiE,2316
|
|
67
|
-
gns3server/appliances/arista-veos.gns3a,sha256=
|
|
67
|
+
gns3server/appliances/arista-veos.gns3a,sha256=loRhjHc9FBTYd9yVvXAlkhJUmHEBi6MPua2Cxq5h4z4,3852
|
|
68
68
|
gns3server/appliances/aruba-arubaoscx.gns3a,sha256=01hM4O8Ji_-37gkIItYIcIlCpdc8CIkThxk40jZ-17U,8936
|
|
69
69
|
gns3server/appliances/aruba-vgw.gns3a,sha256=r5SiuZteas6ELVyZKnZQ3HDH8KkvZv2W5XSBVApNg-0,2664
|
|
70
70
|
gns3server/appliances/aruba-vmc.gns3a,sha256=OUcQEmC8F_56AjcFDlRYgv86BJD4L4bufNhJXSahId4,1884
|
|
@@ -89,9 +89,9 @@ gns3server/appliances/cisco-3640.gns3a,sha256=V1aVDoC3CJn0nOSPsA6-FIsr9TUhyjW5EU
|
|
|
89
89
|
gns3server/appliances/cisco-3660.gns3a,sha256=Dquz2Jbh6buXpAnxg6s5MlIu_7KAypPHBrC5_vD_BXY,1087
|
|
90
90
|
gns3server/appliances/cisco-3725.gns3a,sha256=H-nJfGPXbFpYrYcDIYYDGqhqDdEIK5Vt3KZaYj8SNyk,1109
|
|
91
91
|
gns3server/appliances/cisco-3745.gns3a,sha256=t0EXMF5EGhFJ7EPYjrtNILYvmv-GBETiu78kKkrLP9g,1333
|
|
92
|
-
gns3server/appliances/cisco-7200.gns3a,sha256=
|
|
92
|
+
gns3server/appliances/cisco-7200.gns3a,sha256=ewMAXkl7DyFNEUVdGnQvGrGU7vI4yzg18IabGLuptmc,2813
|
|
93
93
|
gns3server/appliances/cisco-asa.gns3a,sha256=4sd-9i6LvGFZbeE44UMe2hZlvBPIa9EdyEvVCUR56YY,3364
|
|
94
|
-
gns3server/appliances/cisco-asav.gns3a,sha256=
|
|
94
|
+
gns3server/appliances/cisco-asav.gns3a,sha256=Hy8NSkO69wMUcIBpdneQfTDdVkAa3CrH1ytBaF_Txk0,8451
|
|
95
95
|
gns3server/appliances/cisco-c8000v.gns3a,sha256=5XBHc8wxxWWsrleLwEjbEVUnC_SVJwtgJl-q3f2iKMU,4302
|
|
96
96
|
gns3server/appliances/cisco-cat9k.gns3a,sha256=j7TII2wOGAnnC5Cnphd1s5yYTGuga4Vh3z7fBST20ko,2342
|
|
97
97
|
gns3server/appliances/cisco-csr1000v.gns3a,sha256=ftxLK9BKSbU006mmIO13UjPVp9bDjrBLK0z1sO1hzSo,12622
|
|
@@ -104,8 +104,8 @@ gns3server/appliances/cisco-iosv.gns3a,sha256=c0KC3BWrSNaVzPkyrGHHkdLFbILcLDKmye
|
|
|
104
104
|
gns3server/appliances/cisco-iosvl2.gns3a,sha256=40W6B4gkcA0j9j8tqODxrmAOfMHJwZ6-ejjivJxuekc,3433
|
|
105
105
|
gns3server/appliances/cisco-iosxrv.gns3a,sha256=608DbTO8S53OHa-7LxQs6ACaP74isocPgvuaoCQnoWs,1957
|
|
106
106
|
gns3server/appliances/cisco-iosxrv9k.gns3a,sha256=KnkkQ8-29Mnsh_GlxnjhBAp5tUSGhgxEVvsBJttgf94,6912
|
|
107
|
-
gns3server/appliances/cisco-iou-l2.gns3a,sha256=
|
|
108
|
-
gns3server/appliances/cisco-iou-l3.gns3a,sha256=
|
|
107
|
+
gns3server/appliances/cisco-iou-l2.gns3a,sha256=4X-X747kuqFi0JCMyvDVJ2kMvv4XE2C0PvN0XGnfe7o,2490
|
|
108
|
+
gns3server/appliances/cisco-iou-l3.gns3a,sha256=NauCJq61HwXxK_5UMxk-YIWjEsRPethDc7XGJ9j4imM,2533
|
|
109
109
|
gns3server/appliances/cisco-ise.gns3a,sha256=L4pE-_DT4PzyAcysEtv797-wMycVfmt0tceh3JAIlHw,6264
|
|
110
110
|
gns3server/appliances/cisco-ngipsv.gns3a,sha256=haggzWY-W2kYY9GxX9ZAFaM46pLrb9Qz0P1t1NTPIDw,3137
|
|
111
111
|
gns3server/appliances/cisco-nxosv.gns3a,sha256=uK8j6LIo7U4WFnDpy4az3fH4WgB_4uT71w8ocmGHxkM,1963
|
|
@@ -160,6 +160,8 @@ gns3server/appliances/huawei-ar1kv.gns3a,sha256=O4pNFq11tL123Wat4CO2R0A3AB_I3TfR
|
|
|
160
160
|
gns3server/appliances/huawei-ce12800.gns3a,sha256=3vmwHdIwP6jE0hl3pFtN0eLpYj5hE4Plm9kj4766izw,1670
|
|
161
161
|
gns3server/appliances/huawei-ne40e.gns3a,sha256=PM8IyxRXCIl450LSyoPCAtNJtPLe6e5BZTim2m6Vj7I,3669
|
|
162
162
|
gns3server/appliances/huawei-usg6kv.gns3a,sha256=UK0gAqn8UlUQPzpwqU0uttoUbFLVTy4GZyYNMr3GirE,2357
|
|
163
|
+
gns3server/appliances/innovaphone-app.gns3a,sha256=tzzaLqnF_K3PhFmRRSjgbhu-WCHs9dNCS3FPVtiojXA,2645
|
|
164
|
+
gns3server/appliances/innovaphone-ipva.gns3a,sha256=iMEFGOTW8xS1l5L8Xha8qGI56cBR_Y_F5c48zklhHyg,3446
|
|
163
165
|
gns3server/appliances/ipfire.gns3a,sha256=oOsJiAgTAQ9WMiVF6qSqFFeF-bMZHNUyZQF7EXzUyx4,7726
|
|
164
166
|
gns3server/appliances/ipterm.gns3a,sha256=6FGTKH-uhZxOyFgI101twv-Y8ozD5cdk_j0nV2bdBZY,763
|
|
165
167
|
gns3server/appliances/ipxe.gns3a,sha256=-bTj1C5fSFpyAeMJfxeN3YPEoKmpFtjo8NJwIMbOHa4,1705
|
|
@@ -222,7 +224,7 @@ gns3server/appliances/ovs-snmp.gns3a,sha256=df-qv6BACuNzLYiLGAV5JS_LVMLZMAHdQ-RI
|
|
|
222
224
|
gns3server/appliances/packetfence-zen.gns3a,sha256=MvdTQ8rP-U0SwHMYmU1jyBIbIqh72wJySBf3Zi8EcR8,6488
|
|
223
225
|
gns3server/appliances/pan-vm-fw.gns3a,sha256=lCcDKXG3W0R8QFbCAYvBpFEVFZQ80JiwkOpFO8gt9WQ,8933
|
|
224
226
|
gns3server/appliances/parrot-os.gns3a,sha256=gh7TcG5RHAnr-RZZZzqqvb_LGyHciwt7tsNHqfr0PHk,2768
|
|
225
|
-
gns3server/appliances/pfsense.gns3a,sha256=
|
|
227
|
+
gns3server/appliances/pfsense.gns3a,sha256=5zADm3wUCUZi8hjGeb-bhrLJLagoz4khUK4F2DrCD_M,5544
|
|
226
228
|
gns3server/appliances/proxmox-mg.gns3a,sha256=4tCaKnj9DUxwBkq5coLFI0QuqHBC31hlSjHax8CGvk0,3320
|
|
227
229
|
gns3server/appliances/puppy-linux.gns3a,sha256=FyqZdUkdTv7JiNwSuMGzQ56ukGmf6428RIH2l2HL0Mw,3083
|
|
228
230
|
gns3server/appliances/python-go-perl-php.gns3a,sha256=IIa_eJyzsHs35LFcjpvgKup6hVemMxDjCXQuzNsNv8I,590
|
|
@@ -282,7 +284,7 @@ gns3server/compute/builtin/nodes/cloud.py,sha256=r3tq0b-7uvM9xHRVtNx65Dv3D69_TDO
|
|
|
282
284
|
gns3server/compute/builtin/nodes/ethernet_hub.py,sha256=_aPL_bKpvYY_REHRcUlkSLMobN4ZhhGGCJLgQNHUvtc,2708
|
|
283
285
|
gns3server/compute/builtin/nodes/ethernet_switch.py,sha256=Xc59N3kM9nuzLjHlgllRI3pzXtDQdc2SsCucdZxMebs,2733
|
|
284
286
|
gns3server/compute/builtin/nodes/nat.py,sha256=rs1M_VZ42zhtb0RmukD7zHEEpR80WAACZykY9ETN0MQ,3804
|
|
285
|
-
gns3server/compute/docker/__init__.py,sha256=
|
|
287
|
+
gns3server/compute/docker/__init__.py,sha256=DqR1b_qZQnS9Ej4kN6_w3fmYzNdf3N1Hw_UudcmIwOs,12476
|
|
286
288
|
gns3server/compute/docker/docker_error.py,sha256=Rj5QDgOFt8ENZy23nDI8J-gmtt8-lDDtlNdmK70d_tg,904
|
|
287
289
|
gns3server/compute/docker/docker_vm.py,sha256=4IQdr-5rL5ylnhPNPaCzU65EZLRSH1yKTWzwuu3cuco,49601
|
|
288
290
|
gns3server/compute/docker/resources/init.sh,sha256=7BxZQm5TXOmDk-TVc0zJmXOX5Jx3azOOnpbPJohF_x0,2868
|
|
@@ -350,7 +352,7 @@ gns3server/compute/dynamips/nodes/frame_relay_switch.py,sha256=HY7RXSpFQ9SfMMyPw
|
|
|
350
352
|
gns3server/compute/dynamips/nodes/router.py,sha256=vVqFpC9VAWg4mqPLo1Vhu9jg1-HFtJDI6wFOvR6ulxE,60555
|
|
351
353
|
gns3server/compute/iou/__init__.py,sha256=pgEHE_zN-N7uQc35hxOfpJxz1jHherz_BGJ-IMTVrcE,1660
|
|
352
354
|
gns3server/compute/iou/iou_error.py,sha256=222QePf0Hftip6s3q7Xk2xpDLIOXjCsXTRpytrflU4Q,798
|
|
353
|
-
gns3server/compute/iou/iou_vm.py,sha256=
|
|
355
|
+
gns3server/compute/iou/iou_vm.py,sha256=jRZ59D3LnjKC1zk2y1NcLWQbL0VyZWKTiT8YemuHleg,53783
|
|
354
356
|
gns3server/compute/iou/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
355
357
|
gns3server/compute/iou/utils/iou_export.py,sha256=hAscEFSunx537Itu1VgrNOKwy5uyzl2zX3Kf-b2fcGQ,7272
|
|
356
358
|
gns3server/compute/iou/utils/iou_import.py,sha256=YgjCbdLF5zN2pyRKeZe7JWKRmQKs8sm10Z3KUJUQvr8,7439
|
|
@@ -386,19 +388,19 @@ gns3server/configs/ios_etherswitch_startup-config.txt,sha256=zf1QafnlBe729AsDcqL
|
|
|
386
388
|
gns3server/configs/iou_l2_base_startup-config.txt,sha256=LYtQ1pOsmLzEg6DjObmB7PvOhMP93DZkQDFvXh1b2IU,1726
|
|
387
389
|
gns3server/configs/iou_l3_base_startup-config.txt,sha256=zF3Ovq-jKZY0UpiAe8VqhlTzcA7ms1JHWY67vj5gmJQ,1495
|
|
388
390
|
gns3server/configs/vpcs_base_config.txt,sha256=HsThZLGuqANwIjYrCUklQlvHQq6owMdzlXDDE2aWrBQ,199
|
|
389
|
-
gns3server/controller/__init__.py,sha256=
|
|
391
|
+
gns3server/controller/__init__.py,sha256=VRKkV0SqZOs99A4LbZV7Is_705_K62PVj7vcg0rsEes,25423
|
|
390
392
|
gns3server/controller/appliance.py,sha256=xxHdtgBHFN85hxeg3kS6SLyFYDJp3llTSr0LXupByr0,2128
|
|
391
|
-
gns3server/controller/appliance_manager.py,sha256=
|
|
393
|
+
gns3server/controller/appliance_manager.py,sha256=cOCHFdxFhpjnoW1de2LdcE0K_ptVw6DKPxedbXALt3A,20996
|
|
392
394
|
gns3server/controller/appliance_to_template.py,sha256=nM4PIbPxXqYUq7B1oyLhyGz3ZC2QAdk7qClMVTdlJQo,5224
|
|
393
|
-
gns3server/controller/compute.py,sha256=
|
|
395
|
+
gns3server/controller/compute.py,sha256=OamRdq5cZDXSx5QpDIHeq7RWvTWtXtSvcJUua2S9pzE,25581
|
|
394
396
|
gns3server/controller/controller_error.py,sha256=pYW8eY3VZeBl6nSUOUQh-47pbeKfRtSwbkLiWpleHoo,2071
|
|
395
397
|
gns3server/controller/drawing.py,sha256=yMN46Ev0dV-wBA4P4g0xzq-XU1qHVcKGmwriO_0GvsU,7179
|
|
396
398
|
gns3server/controller/export_project.py,sha256=uN5NeMCy1ajMhrEWOli6lHsJNQCI6eRatMss4_kX8vE,12917
|
|
397
399
|
gns3server/controller/import_project.py,sha256=Lz7ZT0-e_q-5vnzudyAHU4azi-IDLb1MDHZoIGekYEo,13442
|
|
398
400
|
gns3server/controller/link.py,sha256=EG2iTVSZLpy-xMKCnVEWueRrR1c2MpDJFkWLaihfeM8,14205
|
|
399
|
-
gns3server/controller/node.py,sha256=
|
|
401
|
+
gns3server/controller/node.py,sha256=JRpKD_9crOWJyTvYObZjeV78n7OvAHfg8RjEGEp3vkg,28487
|
|
400
402
|
gns3server/controller/notification.py,sha256=HXFx5dWMxNOW6vrquz8-j9UGbQGgRmvudX5-okhQPL0,4995
|
|
401
|
-
gns3server/controller/project.py,sha256=
|
|
403
|
+
gns3server/controller/project.py,sha256=6dWTWx07-MG2QQ0FiDi4M49l7ns2BF1XrjZEUG2MhHU,46709
|
|
402
404
|
gns3server/controller/snapshot.py,sha256=v3ai8e60i34eSPH3XyGYlol-Tm7LjDOjpI2XxPjC6VA,5150
|
|
403
405
|
gns3server/controller/symbol_themes.py,sha256=2ElOc3myCkukM60xLkiKfONPPV4jGseFoEEKBotMpYk,7897
|
|
404
406
|
gns3server/controller/symbols.py,sha256=3vKGTSvpMDVsT8AadxurUWHulJ4k45wj7rLHppf_-XA,6106
|
|
@@ -424,7 +426,7 @@ gns3server/controller/ports/serial_port.py,sha256=FdyfxZN1VGn6_DqEE4p8OBkO-IUaFM
|
|
|
424
426
|
gns3server/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
425
427
|
gns3server/core/tasks.py,sha256=Zo5pCs4LKBUb1I9mgWgQ_h0Bj-_n33-zeCNFZ5xQQl0,3329
|
|
426
428
|
gns3server/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
427
|
-
gns3server/db/tasks.py,sha256=
|
|
429
|
+
gns3server/db/tasks.py,sha256=aK2USujpgxIP4nlEH8MgGp3CPpZc6B_3TudYJwD-t7Q,10145
|
|
428
430
|
gns3server/db/models/__init__.py,sha256=X3jpiZd7WqERqYmrtalcAvWatfnSL5NaKrgvZPHRs8k,1192
|
|
429
431
|
gns3server/db/models/acl.py,sha256=jpcCWTEMAEHDQG5mdHhAYkX80oiPc5pQ9LQ9UoJluFI,1776
|
|
430
432
|
gns3server/db/models/base.py,sha256=E73cXMoRr85tOaDEPcMCtfBMxdd1H_vIPU0wKiCGC2w,3419
|
|
@@ -438,10 +440,10 @@ gns3server/db/models/users.py,sha256=78037IGFag5Fp7NlIWywycYF5otMWGmsMSROrPvmZK0
|
|
|
438
440
|
gns3server/db/repositories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
439
441
|
gns3server/db/repositories/base.py,sha256=a6HZJ4mu9GVpdUCZseA65xy8nzrkN_M00WLFKYVmCzM,874
|
|
440
442
|
gns3server/db/repositories/computes.py,sha256=Km00JeclL6xDZ_863keGTiU38lZ-ufQhKmiU8hvWEj8,3445
|
|
441
|
-
gns3server/db/repositories/images.py,sha256=
|
|
442
|
-
gns3server/db/repositories/pools.py,sha256=
|
|
443
|
+
gns3server/db/repositories/images.py,sha256=UNNxXTxo04Ih-hwbJMmSwKom5XC88qcwNL3meamq9wI,5547
|
|
444
|
+
gns3server/db/repositories/pools.py,sha256=2Iqwg1DPuEr1e47trjBtSHLPwuRP7PtxVpMUA6VyY3M,7569
|
|
443
445
|
gns3server/db/repositories/rbac.py,sha256=vkWFp2OiehaETpaff_-_BHFQJZxX1wiukqmdj0rAbQk,15052
|
|
444
|
-
gns3server/db/repositories/templates.py,sha256=
|
|
446
|
+
gns3server/db/repositories/templates.py,sha256=b6v7mxPWVhPTrF6J-fzwi86pdMDJIlotAz_gHSGRajI,6875
|
|
445
447
|
gns3server/db/repositories/users.py,sha256=e1NCZFR8f00MvwovBwXbn0oEo8lAo1okEC01DSuJY2E,9914
|
|
446
448
|
gns3server/db_migrations/README,sha256=JNt8RkbFUWF8Ba9uw0bCvMvNW7PONXJvDhREDLOy61o,171
|
|
447
449
|
gns3server/db_migrations/env.py,sha256=mieif6012ww6wn9JPReZy1WvZHVsTyojbesYpqSE8qw,2782
|
|
@@ -451,18 +453,18 @@ gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.
|
|
|
451
453
|
gns3server/disks/OVMF.fd,sha256=-OwrYUOfa6EMWK7AyA04iz1YFPuHVflpT3AgSOfF7JQ,2097152
|
|
452
454
|
gns3server/disks/OVMF_CODE.fd,sha256=qg-YobiVMx1MrrdiWlNkQrFL0PbDcK-aVT5qMnE9H8c,3653632
|
|
453
455
|
gns3server/disks/OVMF_VARS.fd,sha256=XSrDgzcbQIOYrM7n7CfIwJ6lt0oN4M7qZRM4ixW-XR4,540672
|
|
454
|
-
gns3server/disks/empty100G.qcow2,sha256=
|
|
456
|
+
gns3server/disks/empty100G.qcow2,sha256=szO0OyVI4flYHU-1L1wtYDx9Q6FLcKaJ3dPjvJE-a7Q,198656
|
|
455
457
|
gns3server/disks/empty10G.qcow2,sha256=I6Ht6slptJiHRIRjcWn9CN5Kfxj0OFlP7nEDI2ugANs,196768
|
|
456
458
|
gns3server/disks/empty150G.qcow2,sha256=vFOkEJL4NX0InGZ1XoL53iw2UkWaTEvhRSBeTFUCfok,199008
|
|
457
459
|
gns3server/disks/empty1T.qcow2,sha256=r_BqVG-qu_ZxI7dQ39jUngQG1XZzAFCiKcCUpF7UDsM,212992
|
|
458
|
-
gns3server/disks/empty200G.qcow2,sha256=
|
|
460
|
+
gns3server/disks/empty200G.qcow2,sha256=aAiNh79kOgVQdUA8Sb-aSiE5lE0uwhfbPq4H6Ucddd4,200192
|
|
459
461
|
gns3server/disks/empty20G.qcow2,sha256=aTMT09WvnXxLfxRbFBuzNC1Dm_oaRFtf_R8c3vVxZHY,196928
|
|
460
462
|
gns3server/disks/empty250G.qcow2,sha256=Xk5PBfkCWLhga83vBHwH20vPUwPzWvVXsJK4qBexAP4,200608
|
|
461
|
-
gns3server/disks/empty30G.qcow2,sha256=
|
|
463
|
+
gns3server/disks/empty30G.qcow2,sha256=jH0MvSQQRMF0MBiluNBtwIKoq0ig0Uk00paT4QV5Q8g,197120
|
|
462
464
|
gns3server/disks/empty40G.qcow2,sha256=BAgrXgv4OqWc3ntbuTKNlwe7HmOJu_W8gk7SMRHLIl4,197248
|
|
463
465
|
gns3server/disks/empty500G.qcow2,sha256=1bzhErVA92teI8eGanRfWNz5L_qsoXcjw8S6ogVnHkk,204608
|
|
464
466
|
gns3server/disks/empty50G.qcow2,sha256=0xH2zzGoXFtZkp4sohs2f2TTxNpmuYcifZ3RIUV8oy0,197408
|
|
465
|
-
gns3server/disks/empty8G.qcow2,sha256=
|
|
467
|
+
gns3server/disks/empty8G.qcow2,sha256=h4opruf7CAaeU_cHVc7O-hYYLEnsRfxxKKpP1zUxpR8,197120
|
|
466
468
|
gns3server/gns3_server.egg-info/PKG-INFO,sha256=tyJRDvQJPe9Io7DKt8iLFENR1986XEgTIRh95qFeZmo,8496
|
|
467
469
|
gns3server/gns3_server.egg-info/SOURCES.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
468
470
|
gns3server/gns3_server.egg-info/dependency_links.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
@@ -472,7 +474,7 @@ gns3server/gns3_server.egg-info/requires.txt,sha256=Qe88BytcYyC7Y5VIC2C2p6uGkwsw
|
|
|
472
474
|
gns3server/gns3_server.egg-info/top_level.txt,sha256=RDXhr8McCnZQAwpsyWA2Ob6qpksfGyfsINUHMBnHYrE,17
|
|
473
475
|
gns3server/schemas/__init__.py,sha256=CRQ-F1ECLygbNG7507CLDy61T24MaelgofgOERwnVLA,4595
|
|
474
476
|
gns3server/schemas/common.py,sha256=Ey3u-2qJtla421XA9pAas0fl5S-jyB2aBH-JR-pIyC4,1630
|
|
475
|
-
gns3server/schemas/config.py,sha256=
|
|
477
|
+
gns3server/schemas/config.py,sha256=ijOqQgdR_5SXgV51rifub7vxFhPrbyKyJs_TRe1pBzI,6769
|
|
476
478
|
gns3server/schemas/link.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
477
479
|
gns3server/schemas/qemu_disk_image.py,sha256=8v5WTPugneV-o6zD4WC1ydx3rqNAq_PmqIUMbGauGI0,2850
|
|
478
480
|
gns3server/schemas/version.py,sha256=j-AF7nqpSWONh24wnJV5ksY5dkLQftrxpTW_q5ONJvQ,1029
|
|
@@ -522,10 +524,14 @@ gns3server/schemas/controller/templates/virtualbox_templates.py,sha256=8DZEUBe2l
|
|
|
522
524
|
gns3server/schemas/controller/templates/vmware_templates.py,sha256=_W7ObQArm1aMd6ANGOzhV8A8C4IEuIGvOAvlVu5x3ag,2843
|
|
523
525
|
gns3server/schemas/controller/templates/vpcs_templates.py,sha256=cAPdGve1OJCPaSdYLZfxFwidkTL4pzaJxfdtVKI8bFE,1400
|
|
524
526
|
gns3server/services/__init__.py,sha256=Qdb0EuWkPSLx9HeWcV8lJ1qPez288e7vgpCNLNGbvxw,753
|
|
525
|
-
gns3server/services/authentication.py,sha256
|
|
527
|
+
gns3server/services/authentication.py,sha256=-8nABBBN0co-xDCBjeu9ZMVrlQNq-7QmX4JjAuKHZ_A,3630
|
|
526
528
|
gns3server/services/computes.py,sha256=ZcHb7HXxdVjtV0N0ggxOkvDL7mFpemisXLwXMrNNmpQ,3411
|
|
527
529
|
gns3server/services/templates.py,sha256=w_8grcTPVMXFWGqF40aBQ2OeXK5WDd-yQ4OD6q9jKIg,14211
|
|
528
530
|
gns3server/static/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
531
|
+
gns3server/static/favicon.ico,sha256=FXPutWm5O1TQ2lJKKCRD5PWoF6oKrx5ANf28LOTWQO0,15086
|
|
532
|
+
gns3server/static/redoc.standalone.js,sha256=77kGx7mVN9EcdER2ZM4gQ-E-ra_N6AZq9QseAeD6kt0,1042008
|
|
533
|
+
gns3server/static/swagger-ui-bundle.js,sha256=xQuUu8TwI5Qyb7eu0fT7aTs2d_Sz0zRODWExgIy_KB8,1426050
|
|
534
|
+
gns3server/static/swagger-ui.css,sha256=jzPZlgJTFwSdSphk9CHqsrKiR4cvOIAm-pTGVJEyWec,152072
|
|
529
535
|
gns3server/static/web-ui/3rdpartylicenses.txt,sha256=sSjcTMHISiaRrJTrJ8j9YnEq3wX0iGQOoYjvrjW7Oss,129318
|
|
530
536
|
gns3server/static/web-ui/465.92c7ab880f2504d3.js,sha256=66TyTl_8pCOnZTB2nJZQLFkhuf91y3nPE9eW-BY-yRM,14038
|
|
531
537
|
gns3server/static/web-ui/MaterialIcons-Regular.196fa4a92dd6fa73.ttf,sha256=t_Sjq1YgSPKN0fppFgG8QzY6YdD4dtFtgxbFLk8y1pY,128180
|
|
@@ -554,8 +560,8 @@ gns3server/static/web-ui/NotoSans-Regular.bb384defbe36eaec.svg,sha256=uECuQtpAPz
|
|
|
554
560
|
gns3server/static/web-ui/NotoSans-Regular.e6139cb1663a1c57.ttf,sha256=NPyxxROGVf4PlLBl3aiZC8bvHIpeR0bbt37H7hWtNGI,512588
|
|
555
561
|
gns3server/static/web-ui/ReleaseNotes.txt,sha256=uag7ABM-yXleLBxhtetbpVOCssZPXcd_lLMyUAdQsn4,5527
|
|
556
562
|
gns3server/static/web-ui/favicon.ico,sha256=ucy7cQDhOulawYo6ntAIV_MhtjtJjx-3q6tQb8HEDpk,5430
|
|
557
|
-
gns3server/static/web-ui/index.html,sha256=
|
|
558
|
-
gns3server/static/web-ui/main.
|
|
563
|
+
gns3server/static/web-ui/index.html,sha256=mear17OnyP8egGZXvsUmuuClEa01X_YIFZZbb5OBPDc,11546
|
|
564
|
+
gns3server/static/web-ui/main.62c99707e4709a56.js,sha256=m0OxkO_z5Zosa-n7qxnT3OvXjtgMYCL348nJ4iZrpws,4319606
|
|
559
565
|
gns3server/static/web-ui/polyfills.319c79dd175e50d0.js,sha256=sQPX0SyLyUHk_0gvODKsdL3-lQsQ_whJeMgxx6tO04A,38362
|
|
560
566
|
gns3server/static/web-ui/roboto-latin-100.539f0a96b40596f7.woff2,sha256=EoI9WFYFI4EhVUr_i7BgojXcNvN-_Z-x5-bqGpYivDU,15808
|
|
561
567
|
gns3server/static/web-ui/roboto-latin-100.5ba994dac3e79ea8.woff,sha256=xOrU3p96_yN9BrUw6thBPRNXQn9qkllENCu04rHc5tA,20368
|
|
@@ -1219,27 +1225,27 @@ gns3server/utils/file_watcher.py,sha256=CF-5dB-RVSj8xuVxJ9siSpf3QOnXpw3n2IkjCzRg
|
|
|
1219
1225
|
gns3server/utils/get_resource.py,sha256=WWW4mejsye6Tpw5UmIT6drfcUDqs-YhLxSlQaNboRDg,1534
|
|
1220
1226
|
gns3server/utils/hostname.py,sha256=XUswUi47n-LfUbMiZ5AOs_Crl6lln606nhttEaJanpA,3342
|
|
1221
1227
|
gns3server/utils/http_client.py,sha256=MD-yZA2VjQonqOlPiU4SXo9AjQWDYFFP0ZeZzz680EI,2318
|
|
1222
|
-
gns3server/utils/images.py,sha256=
|
|
1228
|
+
gns3server/utils/images.py,sha256=v7kPc3iDN6E84naQcS9OUHpZLQ2xfY5syeqY0p_bZ4Y,14840
|
|
1223
1229
|
gns3server/utils/interfaces.py,sha256=DwsZXwPxmc5E-QwquzMqAfQRLrrt-GyYUjUDxFKqEZo,8981
|
|
1224
1230
|
gns3server/utils/notification_queue.py,sha256=EO2vHr_Lkxiq9NP-6u6eDsVvFNKbe-QSZqHADU-Ynss,2688
|
|
1225
1231
|
gns3server/utils/path.py,sha256=m4kj9NoFMLQfMAEG1HJ97x-zAdw0bxq-14tCwaIOSKc,2348
|
|
1226
1232
|
gns3server/utils/picture.py,sha256=xC6KASep9RHUNzcb6scL5POPNZ04uROXJmTub3INpto,6160
|
|
1227
1233
|
gns3server/utils/qt.py,sha256=rNABILwh9iqK6XCqBOjjk60ELPPaI7DFQWfKrORk2Kk,1461
|
|
1228
1234
|
gns3server/utils/vmnet.py,sha256=_7foMqHldwH2kXMtgkpEqOKMJAU7reGI42v1Svnj3gw,9981
|
|
1229
|
-
gns3server/utils/asyncio/__init__.py,sha256=
|
|
1235
|
+
gns3server/utils/asyncio/__init__.py,sha256=43PKts4ppmCaFgfepYsI3BfhuqV77gnIudzdWk0umaw,4522
|
|
1230
1236
|
gns3server/utils/asyncio/aiozipstream.py,sha256=cZF-ASUuqLtXN1vJaDW2PfvSE9O4BjV55yGapelo1Ko,18984
|
|
1231
1237
|
gns3server/utils/asyncio/embed_shell.py,sha256=J9a3ibTi9AlRJ4YvFAhPmjz68lla0pNgzN31JMMkJXY,11490
|
|
1232
1238
|
gns3server/utils/asyncio/input_stream.py,sha256=hUnspj9z0X-mvTLi5EMTXpfQLAIIUvEfgjh-7zMug8Y,14560
|
|
1233
|
-
gns3server/utils/asyncio/pool.py,sha256=
|
|
1239
|
+
gns3server/utils/asyncio/pool.py,sha256=EV8ZMPmLe6vIsGjN9QrcxP1XZxjucxlIrWXtJkdd4Iw,2014
|
|
1234
1240
|
gns3server/utils/asyncio/raw_command_server.py,sha256=Thr023djzxIriw5Au3Y5BMAeQ6R7KNttOy-1Gs_gPvI,4671
|
|
1235
1241
|
gns3server/utils/asyncio/serial.py,sha256=VNhqaRkN9Mk3Z30CD6wMNfdTNqlY5YUbMyrAwuBsvXM,2333
|
|
1236
1242
|
gns3server/utils/asyncio/telnet_server.py,sha256=dteUIryUX25iRr5-dMkdBYSTNZQZfLKnw00Y4C87ewc,16752
|
|
1237
1243
|
gns3server/utils/zipfile_zstd/__init__.py,sha256=QXfnwyxx_CDJdAgOzqqBAD_7WDudc9VN03U0Gfccr5I,163
|
|
1238
1244
|
gns3server/utils/zipfile_zstd/_patcher.py,sha256=RCMj1y8OrIJheEGnuERDH0l2hvLaFl5wa_IZNiTpBbU,380
|
|
1239
1245
|
gns3server/utils/zipfile_zstd/_zipfile.py,sha256=KvAeNmWZHu2LHuUOZ8_Tnu_dRi3NOIWM6I3hg_c7NsQ,2189
|
|
1240
|
-
gns3_server-3.0.
|
|
1241
|
-
gns3_server-3.0.
|
|
1242
|
-
gns3_server-3.0.
|
|
1243
|
-
gns3_server-3.0.
|
|
1244
|
-
gns3_server-3.0.
|
|
1245
|
-
gns3_server-3.0.
|
|
1246
|
+
gns3_server-3.0.2.dist-info/LICENSE,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
|
|
1247
|
+
gns3_server-3.0.2.dist-info/METADATA,sha256=F5fxjfxloNsp52Ga_hxOtfUOYyQkBEV48WNwXadIMPk,48323
|
|
1248
|
+
gns3_server-3.0.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
1249
|
+
gns3_server-3.0.2.dist-info/entry_points.txt,sha256=kgHc6rA0RfDOTAkTDSwgWXKHWG4r5mQ-SsmpCHNgXPI,92
|
|
1250
|
+
gns3_server-3.0.2.dist-info/top_level.txt,sha256=GvKJnXIKLBmewtHjQXkvmtz79ZW51IsfCoPMbHoWehQ,11
|
|
1251
|
+
gns3_server-3.0.2.dist-info/RECORD,,
|
|
@@ -27,11 +27,11 @@ from fastapi.encoders import jsonable_encoder
|
|
|
27
27
|
from starlette.requests import ClientDisconnect
|
|
28
28
|
from sqlalchemy.orm.exc import MultipleResultsFound
|
|
29
29
|
from typing import List, Optional
|
|
30
|
-
from gns3server import schemas
|
|
31
30
|
|
|
31
|
+
from gns3server import schemas
|
|
32
32
|
from gns3server.config import Config
|
|
33
33
|
from gns3server.compute.qemu import Qemu
|
|
34
|
-
from gns3server.utils.images import InvalidImageError, write_image, read_image_info, default_images_directory
|
|
34
|
+
from gns3server.utils.images import InvalidImageError, write_image, read_image_info, default_images_directory, get_builtin_disks
|
|
35
35
|
from gns3server.db.repositories.images import ImagesRepository
|
|
36
36
|
from gns3server.db.repositories.templates import TemplatesRepository
|
|
37
37
|
from gns3server.db.repositories.rbac import RbacRepository
|
|
@@ -51,7 +51,6 @@ log = logging.getLogger(__name__)
|
|
|
51
51
|
|
|
52
52
|
router = APIRouter()
|
|
53
53
|
|
|
54
|
-
|
|
55
54
|
@router.post(
|
|
56
55
|
"/qemu/{image_path:path}",
|
|
57
56
|
response_model=schemas.Image,
|
|
@@ -175,6 +174,61 @@ async def upload_image(
|
|
|
175
174
|
return image
|
|
176
175
|
|
|
177
176
|
|
|
177
|
+
@router.delete(
|
|
178
|
+
"/prune",
|
|
179
|
+
status_code=status.HTTP_204_NO_CONTENT,
|
|
180
|
+
dependencies=[Depends(has_privilege("Image.Allocate"))]
|
|
181
|
+
)
|
|
182
|
+
async def prune_images(
|
|
183
|
+
images_repo: ImagesRepository = Depends(get_repository(ImagesRepository)),
|
|
184
|
+
) -> None:
|
|
185
|
+
"""
|
|
186
|
+
Prune images not attached to any template.
|
|
187
|
+
|
|
188
|
+
Required privilege: Image.Allocate
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
skip_images = get_builtin_disks()
|
|
192
|
+
await images_repo.prune_images(skip_images)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@router.post(
|
|
196
|
+
"/install",
|
|
197
|
+
status_code=status.HTTP_204_NO_CONTENT,
|
|
198
|
+
dependencies=[Depends(has_privilege("Image.Allocate"))]
|
|
199
|
+
)
|
|
200
|
+
async def install_images(
|
|
201
|
+
images_repo: ImagesRepository = Depends(get_repository(ImagesRepository)),
|
|
202
|
+
templates_repo: TemplatesRepository = Depends(get_repository(TemplatesRepository))
|
|
203
|
+
) -> None:
|
|
204
|
+
"""
|
|
205
|
+
Attempt to automatically create templates based on image checksums.
|
|
206
|
+
|
|
207
|
+
Required privilege: Image.Allocate
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
skip_images = get_builtin_disks()
|
|
211
|
+
images = await images_repo.get_images()
|
|
212
|
+
for image in images:
|
|
213
|
+
if skip_images and image.filename in skip_images:
|
|
214
|
+
log.debug(f"Skipping image '{image.path}' for image installation")
|
|
215
|
+
continue
|
|
216
|
+
templates = await images_repo.get_image_templates(image.image_id)
|
|
217
|
+
if templates:
|
|
218
|
+
# the image is already used by a template
|
|
219
|
+
log.warning(f"Image '{image.path}' is used by one or more templates")
|
|
220
|
+
continue
|
|
221
|
+
await Controller.instance().appliance_manager.install_appliances_from_image(
|
|
222
|
+
image.path,
|
|
223
|
+
image.checksum,
|
|
224
|
+
images_repo,
|
|
225
|
+
templates_repo,
|
|
226
|
+
None,
|
|
227
|
+
None,
|
|
228
|
+
os.path.dirname(image.path)
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
|
|
178
232
|
@router.get(
|
|
179
233
|
"/{image_path:path}",
|
|
180
234
|
response_model=schemas.Image,
|
|
@@ -218,7 +272,7 @@ async def delete_image(
|
|
|
218
272
|
image = await images_repo.get_image(image_path)
|
|
219
273
|
except MultipleResultsFound:
|
|
220
274
|
raise ControllerBadRequestError(f"Image '{image_path}' matches multiple images. "
|
|
221
|
-
f"Please include the
|
|
275
|
+
f"Please include the absolute path of the image")
|
|
222
276
|
|
|
223
277
|
if not image:
|
|
224
278
|
raise ControllerNotFoundError(f"Image '{image_path}' not found")
|
|
@@ -236,20 +290,3 @@ async def delete_image(
|
|
|
236
290
|
success = await images_repo.delete_image(image_path)
|
|
237
291
|
if not success:
|
|
238
292
|
raise ControllerError(f"Image '{image_path}' could not be deleted")
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
@router.post(
|
|
242
|
-
"/prune",
|
|
243
|
-
status_code=status.HTTP_204_NO_CONTENT,
|
|
244
|
-
dependencies=[Depends(has_privilege("Image.Allocate"))]
|
|
245
|
-
)
|
|
246
|
-
async def prune_images(
|
|
247
|
-
images_repo: ImagesRepository = Depends(get_repository(ImagesRepository)),
|
|
248
|
-
) -> None:
|
|
249
|
-
"""
|
|
250
|
-
Prune images not attached to any template.
|
|
251
|
-
|
|
252
|
-
Required privilege: Image.Allocate
|
|
253
|
-
"""
|
|
254
|
-
|
|
255
|
-
await images_repo.prune_images()
|
|
@@ -426,26 +426,42 @@ async def import_project(
|
|
|
426
426
|
status_code=status.HTTP_201_CREATED,
|
|
427
427
|
response_model=schemas.Project,
|
|
428
428
|
responses={**responses, 409: {"model": schemas.ErrorMessage, "description": "Could not duplicate project"}},
|
|
429
|
-
dependencies=[Depends(has_privilege("Project.
|
|
429
|
+
dependencies=[Depends(has_privilege("Project.Audit"))]
|
|
430
430
|
)
|
|
431
431
|
async def duplicate_project(
|
|
432
432
|
project_data: schemas.ProjectDuplicate,
|
|
433
433
|
project: Project = Depends(dep_project),
|
|
434
|
+
current_user: schemas.User = Depends(get_current_active_user),
|
|
435
|
+
rbac_repo: RbacRepository = Depends(get_repository(RbacRepository)),
|
|
434
436
|
pools_repo: ResourcePoolsRepository = Depends(get_repository(ResourcePoolsRepository))
|
|
435
437
|
) -> schemas.Project:
|
|
436
438
|
"""
|
|
437
439
|
Duplicate a project.
|
|
438
440
|
|
|
439
|
-
Required privilege: Project.
|
|
441
|
+
Required privilege: Project.Audit
|
|
440
442
|
"""
|
|
441
443
|
|
|
444
|
+
pool_memberships = await pools_repo.get_resource_memberships(project.id)
|
|
445
|
+
|
|
446
|
+
# check if the project can be duplicated somewhere (either in a pool or in the root)
|
|
447
|
+
if not current_user.is_superadmin:
|
|
448
|
+
can_be_duplicated_somewhere = False
|
|
449
|
+
if pool_memberships:
|
|
450
|
+
for pool in pool_memberships:
|
|
451
|
+
if await rbac_repo.check_user_has_privilege(current_user.user_id, f"/pools/{pool.resource_pool_id}", "Project.Allocate"):
|
|
452
|
+
can_be_duplicated_somewhere = True
|
|
453
|
+
break
|
|
454
|
+
|
|
455
|
+
if not can_be_duplicated_somewhere and not await rbac_repo.check_user_has_privilege(current_user.user_id, "/projects", "Project.Allocate"):
|
|
456
|
+
log.warning(f"Project {project.name} cannot be duplicated anywhere")
|
|
457
|
+
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
|
|
458
|
+
|
|
442
459
|
reset_mac_addresses = project_data.reset_mac_addresses
|
|
443
460
|
new_project = await project.duplicate(
|
|
444
461
|
name=project_data.name, reset_mac_addresses=reset_mac_addresses
|
|
445
462
|
)
|
|
446
463
|
|
|
447
|
-
# Add the new project in the same resource pools if the duplicated project
|
|
448
|
-
pool_memberships = await pools_repo.get_resource_memberships(project.id)
|
|
464
|
+
# Add the new project in the same resource pools if the duplicated project belongs to any
|
|
449
465
|
if pool_memberships:
|
|
450
466
|
resource_create = schemas.ResourceCreate(resource_id=new_project.id, resource_type="project", name=new_project.name)
|
|
451
467
|
resource = await pools_repo.create_resource(resource_create)
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
API routes for templates.
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
+
import os
|
|
21
22
|
import hashlib
|
|
22
23
|
import json
|
|
23
24
|
|
|
@@ -34,6 +35,8 @@ from gns3server.db.repositories.templates import TemplatesRepository
|
|
|
34
35
|
from gns3server.services.templates import TemplatesService
|
|
35
36
|
from gns3server.db.repositories.rbac import RbacRepository
|
|
36
37
|
from gns3server.db.repositories.images import ImagesRepository
|
|
38
|
+
from gns3server.controller.controller_error import ControllerError
|
|
39
|
+
from gns3server.utils.images import get_builtin_disks
|
|
37
40
|
|
|
38
41
|
from .dependencies.authentication import get_current_active_user
|
|
39
42
|
from .dependencies.rbac import has_privilege
|
|
@@ -132,10 +135,28 @@ async def delete_template(
|
|
|
132
135
|
Required privilege: Template.Allocate
|
|
133
136
|
"""
|
|
134
137
|
|
|
138
|
+
images = await templates_repo.get_template_images(template_id)
|
|
135
139
|
await TemplatesService(templates_repo).delete_template(template_id)
|
|
136
140
|
await rbac_repo.delete_all_ace_starting_with_path(f"/templates/{template_id}")
|
|
137
|
-
if prune_images:
|
|
138
|
-
|
|
141
|
+
if prune_images and images:
|
|
142
|
+
skip_images = get_builtin_disks()
|
|
143
|
+
for image in images:
|
|
144
|
+
if image.filename in skip_images:
|
|
145
|
+
continue
|
|
146
|
+
templates = await images_repo.get_image_templates(image.image_id)
|
|
147
|
+
if templates:
|
|
148
|
+
template_names = ", ".join([template.name for template in templates])
|
|
149
|
+
raise ControllerError(f"Image '{image.path}' is used by one or more templates: {template_names}")
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
os.remove(image.path)
|
|
153
|
+
except OSError:
|
|
154
|
+
log.warning(f"Could not delete image file {image.path}")
|
|
155
|
+
|
|
156
|
+
print(f"Deleting image '{image.path}'")
|
|
157
|
+
success = await images_repo.delete_image(image.path)
|
|
158
|
+
if not success:
|
|
159
|
+
raise ControllerError(f"Image '{image.path}' could not removed from the database")
|
|
139
160
|
|
|
140
161
|
|
|
141
162
|
@router.get(
|
gns3server/api/routes/index.py
CHANGED
|
@@ -27,20 +27,20 @@ router = APIRouter()
|
|
|
27
27
|
templates = Jinja2Templates(directory=os.path.join("gns3server", "templates"))
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
@router.get("/")
|
|
30
|
+
@router.get("/", include_in_schema=False)
|
|
31
31
|
async def root():
|
|
32
32
|
|
|
33
33
|
return RedirectResponse("/static/web-ui/bundled", status_code=308) # permanent redirect
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
@router.get("/debug", response_class=HTMLResponse, deprecated=True)
|
|
36
|
+
@router.get("/debug", response_class=HTMLResponse, deprecated=True, include_in_schema=False)
|
|
37
37
|
def debug(request: Request):
|
|
38
38
|
|
|
39
39
|
kwargs = {"request": request, "gns3_version": __version__, "gns3_host": request.client.host}
|
|
40
40
|
return templates.TemplateResponse("index.html", kwargs)
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
@router.get("/static/web-ui/{file_path:path}", description="Web user interface")
|
|
43
|
+
@router.get("/static/web-ui/{file_path:path}", description="Web user interface", include_in_schema=False)
|
|
44
44
|
async def web_ui(file_path: str):
|
|
45
45
|
|
|
46
46
|
file_path = os.path.normpath(file_path).strip("/")
|