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.

Files changed (49) hide show
  1. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/METADATA +19 -18
  2. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/RECORD +48 -42
  3. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/WHEEL +1 -1
  4. gns3server/api/routes/controller/images.py +58 -21
  5. gns3server/api/routes/controller/projects.py +20 -4
  6. gns3server/api/routes/controller/templates.py +23 -2
  7. gns3server/api/routes/index.py +3 -3
  8. gns3server/api/server.py +38 -3
  9. gns3server/appliances/arista-veos.gns3a +20 -514
  10. gns3server/appliances/cisco-7200.gns3a +26 -0
  11. gns3server/appliances/cisco-asav.gns3a +14 -1
  12. gns3server/appliances/cisco-iou-l2.gns3a +16 -4
  13. gns3server/appliances/cisco-iou-l3.gns3a +16 -4
  14. gns3server/appliances/innovaphone-app.gns3a +50 -0
  15. gns3server/appliances/innovaphone-ipva.gns3a +78 -0
  16. gns3server/appliances/pfsense.gns3a +14 -0
  17. gns3server/compute/docker/__init__.py +1 -1
  18. gns3server/compute/iou/iou_vm.py +22 -12
  19. gns3server/controller/__init__.py +48 -38
  20. gns3server/controller/appliance_manager.py +2 -2
  21. gns3server/controller/compute.py +8 -3
  22. gns3server/controller/node.py +2 -6
  23. gns3server/controller/project.py +1 -2
  24. gns3server/crash_report.py +1 -1
  25. gns3server/db/repositories/images.py +22 -3
  26. gns3server/db/repositories/pools.py +1 -1
  27. gns3server/db/repositories/templates.py +11 -0
  28. gns3server/db/tasks.py +120 -79
  29. gns3server/disks/empty100G.qcow2 +0 -0
  30. gns3server/disks/empty200G.qcow2 +0 -0
  31. gns3server/disks/empty30G.qcow2 +0 -0
  32. gns3server/disks/empty8G.qcow2 +0 -0
  33. gns3server/schemas/config.py +1 -1
  34. gns3server/server.py +3 -3
  35. gns3server/services/authentication.py +9 -6
  36. gns3server/static/favicon.ico +0 -0
  37. gns3server/static/redoc.standalone.js +1782 -0
  38. gns3server/static/swagger-ui-bundle.js +2 -0
  39. gns3server/static/swagger-ui.css +3 -0
  40. gns3server/static/web-ui/index.html +1 -1
  41. gns3server/static/web-ui/main.62c99707e4709a56.js +1 -0
  42. gns3server/utils/asyncio/__init__.py +4 -12
  43. gns3server/utils/asyncio/pool.py +1 -4
  44. gns3server/utils/images.py +62 -39
  45. gns3server/version.py +2 -2
  46. gns3server/static/web-ui/main.ed82697b58d803e7.js +0 -1
  47. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/LICENSE +0 -0
  48. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.2.dist-info}/entry_points.txt +0 -0
  49. {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.0rc2
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: GNU GENERAL PUBLIC 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.8
699
+ Requires-Python: >=3.9
700
700
  Description-Content-Type: text/markdown
701
701
  License-File: LICENSE
702
- Requires-Dist: uvicorn==0.32.0
703
- Requires-Dist: pydantic==2.9.2
704
- Requires-Dist: fastapi==0.115.5
705
- Requires-Dist: python-multipart==0.0.16
706
- Requires-Dist: websockets==13.1
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==4.0.3
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.4
711
- Requires-Dist: sentry-sdk<2.18,>=2.17
712
- Requires-Dist: psutil>=6.1.0
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.13.3
718
- Requires-Dist: bcrypt==4.2.0
719
- Requires-Dist: python-jose[cryptography]==3.3.0
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: watchfiles==0.24.0
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: httpx-ws==0.6.2; extra == "dev"
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=67G-uyPj9xXnNGGOLbY3GXN75f3YQvVP2k0tfYrZULI,6021
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=6wtW4I0nKXkuIbJAn0h_xgpiOrGjQpnLgs1Ngj8p5Dw,13362
9
- gns3server/version.py,sha256=YN7XwT6qmhM62LJW3GAa6htdu7m4p13nco83zeRPBTo,1467
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=V1hRgbjOg2eCslyuiQNh0kY3ysqGE2PzS-5hirCwZTg,6756
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=z8G4mb0u0xl2JETSlwTv4LugnrWhSCLp_OvqyJU3wUQ,3233
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=YnMf_WL_u5k0SMsOVulTVyJPIov2N6PLgP4hA79EqyM,8993
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=iUTBAiZP9ULJInM8R_ZZUJNXTiO6KPruga2Di9VQlU0,20934
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=jivFmT0JsPwRbixv4urF4CEknt5dX_bjezTpgVTIDvc,6280
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=eYhEjRv3DILXEC7beXSZCdgXlo7sCyDDNtCvA_YX7EU,21384
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=KsWkuAlsdvmaJCh_N-O6iYJ-RNh0TMrJTU9PkqxUkpA,2014
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=zxPEqGn7OlYG4r07G6Xk9pA_L0MybAQ6MiWIAM_OdZI,7901
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=RayCF05ykbkdjEp7BX5tDdcKaQZidmSrACgGytjHObQ,2121
108
- gns3server/appliances/cisco-iou-l3.gns3a,sha256=xfv10BoY2DcsTderTuW1M4Jn2NoFLHefoe3Kyt7yx3g,2170
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=IOEexeiPwgxtS-mIOQoq6RdIOqLktzMcLthD5WN3xTY,5035
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=Lk5Xc4zND2oD9gp-780oGEyj0JfN9gxGkzJ9feibDqg,12470
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=A3iEYcy3EQY9khqojHYrcY6kGIiGuaGSYlcGJXKVdTY,53498
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=KVXSzVZc4-BoeGpwZ4MZnyhWHg2icXx1PzQCD4ezeOw,24614
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=sJD7A9J1bvaLfSycvxaISCVER8AVUvFcW0EytqHqehQ,20984
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=EiTNFp904MO5yh3kAzoGmjtOf6RtQL7uvVGJGxVDobA,25468
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=oPR0vukGgcmGoLnESjuKugmjAxBNB0ARn3n_Id8MzvI,28656
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=GHpG1bnwmIbjotiUx9lqVpMlbqbFcVDBtSx8dTBitEk,46769
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=MjyVRBvnirDhGSe7iPuei6hy7laojECdPfNyGo9dJBM,9334
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=9q4iKsEybNyq2IilfTZ5HgWhJO92LuBEnQC6SueMFo8,4742
442
- gns3server/db/repositories/pools.py,sha256=kWueXAK1Ncm2NIA5gSVx5Xj6GM_a80E56_lmlKdNUaY,7566
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=ut-HtgblS_Sr8q1BxP0dGAXhOvpmwxK5B7N2yzj8T-E,6479
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=PLDeAkln8i0tJ-uHVoa6h2AU0myvAKaW0HaWdT6SQr0,198208
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=E-Xxj1Zg6mr5KdM0ItFymYrljk8nucO2ZI9bXtTsr6g,199808
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=u58rNLrWPEirnIUpxwTEw93oBtdlOs8tznrNqgTI1VA,197088
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=A2xKq9k6cqDJjWTF95bOC9nwai5VyZpWmdkohy3igpg,196736
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=SJRruKmAJ0fuDG9v1y-LpiwQBJklBwUoFJN4HsMZTEA,6791
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=jOIrJW4VMaAf_0zz-1TCyN35sJ2ekDbjRhKFGj4MuGE,3473
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=b8RzdsWVadah1PxiGgUI6weGsvg2idT4Rt9rnwdPQDk,11546
558
- gns3server/static/web-ui/main.ed82697b58d803e7.js,sha256=pH_KdzCd5IPcq0xT5l7O5tB_QK2ePLEnqKe3W6rhBJs,4319498
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=CvjFDqbILuVdbLe9VpO6UevPaXWuD7OjsUMhYAo3LWc,14026
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=59dy1xA7Uvmcmp5CWdiqteP8eRAiXdMdbj3ZwVQ-Vxc,4781
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=syIRSzff_BE-JsVovFkdem9N0Gb8-5zWpS27DB_Ksnc,2171
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.0rc2.dist-info/LICENSE,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
1241
- gns3_server-3.0.0rc2.dist-info/METADATA,sha256=USg6Gz5t50xHP5_Ea9vquRRmjP-hWC91P0FJDL04eus,48267
1242
- gns3_server-3.0.0rc2.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
1243
- gns3_server-3.0.0rc2.dist-info/entry_points.txt,sha256=kgHc6rA0RfDOTAkTDSwgWXKHWG4r5mQ-SsmpCHNgXPI,92
1244
- gns3_server-3.0.0rc2.dist-info/top_level.txt,sha256=GvKJnXIKLBmewtHjQXkvmtz79ZW51IsfCoPMbHoWehQ,11
1245
- gns3_server-3.0.0rc2.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.5.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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 relative path of the image")
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.Allocate"))]
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.Allocate
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 is in any
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
- await images_repo.prune_images()
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(
@@ -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("/")