gns3-server 3.0.0__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 (1251) hide show
  1. gns3_server-3.0.0.dist-info/LICENSE +674 -0
  2. gns3_server-3.0.0.dist-info/METADATA +868 -0
  3. gns3_server-3.0.0.dist-info/RECORD +1251 -0
  4. gns3_server-3.0.0.dist-info/WHEEL +5 -0
  5. gns3_server-3.0.0.dist-info/entry_points.txt +3 -0
  6. gns3_server-3.0.0.dist-info/top_level.txt +1 -0
  7. gns3server/__init__.py +17 -0
  8. gns3server/__main__.py +20 -0
  9. gns3server/alembic.ini +103 -0
  10. gns3server/api/__init__.py +0 -0
  11. gns3server/api/routes/__init__.py +0 -0
  12. gns3server/api/routes/compute/__init__.py +267 -0
  13. gns3server/api/routes/compute/atm_switch_nodes.py +233 -0
  14. gns3server/api/routes/compute/capabilities.py +51 -0
  15. gns3server/api/routes/compute/cloud_nodes.py +249 -0
  16. gns3server/api/routes/compute/compute.py +143 -0
  17. gns3server/api/routes/compute/dependencies/__init__.py +0 -0
  18. gns3server/api/routes/compute/dependencies/authentication.py +83 -0
  19. gns3server/api/routes/compute/docker_nodes.py +393 -0
  20. gns3server/api/routes/compute/dynamips_nodes.py +367 -0
  21. gns3server/api/routes/compute/ethernet_hub_nodes.py +236 -0
  22. gns3server/api/routes/compute/ethernet_switch_nodes.py +246 -0
  23. gns3server/api/routes/compute/frame_relay_switch_nodes.py +240 -0
  24. gns3server/api/routes/compute/images.py +156 -0
  25. gns3server/api/routes/compute/iou_nodes.py +344 -0
  26. gns3server/api/routes/compute/nat_nodes.py +244 -0
  27. gns3server/api/routes/compute/notifications.py +88 -0
  28. gns3server/api/routes/compute/projects.py +243 -0
  29. gns3server/api/routes/compute/qemu_nodes.py +412 -0
  30. gns3server/api/routes/compute/virtualbox_nodes.py +377 -0
  31. gns3server/api/routes/compute/vmware_nodes.py +355 -0
  32. gns3server/api/routes/compute/vpcs_nodes.py +343 -0
  33. gns3server/api/routes/controller/__init__.py +147 -0
  34. gns3server/api/routes/controller/acl.py +268 -0
  35. gns3server/api/routes/controller/appliances.py +150 -0
  36. gns3server/api/routes/controller/computes.py +231 -0
  37. gns3server/api/routes/controller/controller.py +319 -0
  38. gns3server/api/routes/controller/dependencies/__init__.py +0 -0
  39. gns3server/api/routes/controller/dependencies/authentication.py +117 -0
  40. gns3server/api/routes/controller/dependencies/database.py +38 -0
  41. gns3server/api/routes/controller/dependencies/rbac.py +78 -0
  42. gns3server/api/routes/controller/drawings.py +131 -0
  43. gns3server/api/routes/controller/gns3vm.py +71 -0
  44. gns3server/api/routes/controller/groups.py +231 -0
  45. gns3server/api/routes/controller/images.py +255 -0
  46. gns3server/api/routes/controller/links.py +287 -0
  47. gns3server/api/routes/controller/nodes.py +619 -0
  48. gns3server/api/routes/controller/pools.py +239 -0
  49. gns3server/api/routes/controller/privileges.py +43 -0
  50. gns3server/api/routes/controller/projects.py +595 -0
  51. gns3server/api/routes/controller/roles.py +224 -0
  52. gns3server/api/routes/controller/snapshots.py +124 -0
  53. gns3server/api/routes/controller/symbols.py +133 -0
  54. gns3server/api/routes/controller/templates.py +192 -0
  55. gns3server/api/routes/controller/users.py +254 -0
  56. gns3server/api/routes/index.py +93 -0
  57. gns3server/api/server.py +224 -0
  58. gns3server/appliances/6wind-turbo-router.gns3a +47 -0
  59. gns3server/appliances/IPCop.gns3a +52 -0
  60. gns3server/appliances/a10-vthunder.gns3a +72 -0
  61. gns3server/appliances/aaa.gns3a +20 -0
  62. gns3server/appliances/alcatel-7750.gns3a +74 -0
  63. gns3server/appliances/almalinux.gns3a +84 -0
  64. gns3server/appliances/alpine-linux-virt.gns3a +59 -0
  65. gns3server/appliances/alpine-linux.gns3a +21 -0
  66. gns3server/appliances/arista-ceos.gns3a +20 -0
  67. gns3server/appliances/arista-veos.gns3a +577 -0
  68. gns3server/appliances/aruba-arubaoscx.gns3a +233 -0
  69. gns3server/appliances/aruba-vgw.gns3a +60 -0
  70. gns3server/appliances/aruba-vmc.gns3a +56 -0
  71. gns3server/appliances/asterfusion-vAsterNOS.gns3a +49 -0
  72. gns3server/appliances/asterisk.gns3a +114 -0
  73. gns3server/appliances/bigswitch-bigcloud-fabric.gns3a +42 -0
  74. gns3server/appliances/bird.gns3a +42 -0
  75. gns3server/appliances/bird2.gns3a +57 -0
  76. gns3server/appliances/brocade-vadx.gns3a +43 -0
  77. gns3server/appliances/brocade-vrouter.gns3a +138 -0
  78. gns3server/appliances/brocade-vtm.gns3a +136 -0
  79. gns3server/appliances/bsdrp.gns3a +117 -0
  80. gns3server/appliances/centos-cloud.gns3a +115 -0
  81. gns3server/appliances/centos7.gns3a +72 -0
  82. gns3server/appliances/checkpoint-gaia.gns3a +81 -0
  83. gns3server/appliances/chromium.gns3a +19 -0
  84. gns3server/appliances/cisco-1700.gns3a +39 -0
  85. gns3server/appliances/cisco-2600.gns3a +38 -0
  86. gns3server/appliances/cisco-2691.gns3a +38 -0
  87. gns3server/appliances/cisco-3620.gns3a +38 -0
  88. gns3server/appliances/cisco-3640.gns3a +38 -0
  89. gns3server/appliances/cisco-3660.gns3a +38 -0
  90. gns3server/appliances/cisco-3725.gns3a +38 -0
  91. gns3server/appliances/cisco-3745.gns3a +45 -0
  92. gns3server/appliances/cisco-7200.gns3a +92 -0
  93. gns3server/appliances/cisco-asa.gns3a +86 -0
  94. gns3server/appliances/cisco-asav.gns3a +227 -0
  95. gns3server/appliances/cisco-c8000v.gns3a +108 -0
  96. gns3server/appliances/cisco-cat9k.gns3a +58 -0
  97. gns3server/appliances/cisco-csr1000v.gns3a +316 -0
  98. gns3server/appliances/cisco-dcnm.gns3a +96 -0
  99. gns3server/appliances/cisco-fcnf.gns3a +71 -0
  100. gns3server/appliances/cisco-fmcv.gns3a +139 -0
  101. gns3server/appliances/cisco-fsve.gns3a +57 -0
  102. gns3server/appliances/cisco-ftdv.gns3a +99 -0
  103. gns3server/appliances/cisco-iosv.gns3a +178 -0
  104. gns3server/appliances/cisco-iosvl2.gns3a +95 -0
  105. gns3server/appliances/cisco-iosxrv.gns3a +57 -0
  106. gns3server/appliances/cisco-iosxrv9k.gns3a +188 -0
  107. gns3server/appliances/cisco-iou-l2.gns3a +84 -0
  108. gns3server/appliances/cisco-iou-l3.gns3a +84 -0
  109. gns3server/appliances/cisco-ise.gns3a +154 -0
  110. gns3server/appliances/cisco-ngipsv.gns3a +73 -0
  111. gns3server/appliances/cisco-nxosv.gns3a +56 -0
  112. gns3server/appliances/cisco-nxosv9k.gns3a +433 -0
  113. gns3server/appliances/cisco-pyats.gns3a +19 -0
  114. gns3server/appliances/cisco-smc.gns3a +71 -0
  115. gns3server/appliances/cisco-vWLC.gns3a +140 -0
  116. gns3server/appliances/cisco-wsav.gns3a +44 -0
  117. gns3server/appliances/citrix-netscaler-vpx.gns3a +72 -0
  118. gns3server/appliances/citrix-sd-wan.gns3a +46 -0
  119. gns3server/appliances/citrix-sdwan-center.gns3a +46 -0
  120. gns3server/appliances/clavister-netsheild.gns3a +59 -0
  121. gns3server/appliances/clavister-netwall.gns3a +71 -0
  122. gns3server/appliances/clearos.gns3a +107 -0
  123. gns3server/appliances/cloudrouter.gns3a +72 -0
  124. gns3server/appliances/coreos.gns3a +329 -0
  125. gns3server/appliances/cumulus-vx.gns3a +440 -0
  126. gns3server/appliances/danos.gns3a +57 -0
  127. gns3server/appliances/debian.gns3a +85 -0
  128. gns3server/appliances/deft-linux.gns3a +96 -0
  129. gns3server/appliances/dell-ftos.gns3a +71 -0
  130. gns3server/appliances/dns.gns3a +20 -0
  131. gns3server/appliances/empty-vm.gns3a +199 -0
  132. gns3server/appliances/endhost.gns3a +17 -0
  133. gns3server/appliances/exos.gns3a +51 -0
  134. gns3server/appliances/extreme-networks-voss.gns3a +152 -0
  135. gns3server/appliances/f5-bigip.gns3a +322 -0
  136. gns3server/appliances/f5-bigiq.gns3a +165 -0
  137. gns3server/appliances/fedora-cloud.gns3a +70 -0
  138. gns3server/appliances/firefox.gns3a +59 -0
  139. gns3server/appliances/fortiadc-manager.gns3a +54 -0
  140. gns3server/appliances/fortiadc.gns3a +502 -0
  141. gns3server/appliances/fortianalyzer.gns3a +519 -0
  142. gns3server/appliances/fortiauthenticator.gns3a +251 -0
  143. gns3server/appliances/forticache.gns3a +210 -0
  144. gns3server/appliances/fortigate.gns3a +742 -0
  145. gns3server/appliances/fortimail.gns3a +392 -0
  146. gns3server/appliances/fortimanager.gns3a +519 -0
  147. gns3server/appliances/fortiproxy.gns3a +83 -0
  148. gns3server/appliances/fortirecorder.gns3a +69 -0
  149. gns3server/appliances/fortisandbox.gns3a +210 -0
  150. gns3server/appliances/fortisiem-super_worker.gns3a +210 -0
  151. gns3server/appliances/fortiweb.gns3a +308 -0
  152. gns3server/appliances/freeRouter.gns3a +44 -0
  153. gns3server/appliances/freebsd.gns3a +75 -0
  154. gns3server/appliances/freenas.gns3a +183 -0
  155. gns3server/appliances/frr.gns3a +84 -0
  156. gns3server/appliances/haproxy.gns3a +18 -0
  157. gns3server/appliances/hbcd-pe.gns3a +62 -0
  158. gns3server/appliances/hp-vsr1001.gns3a +149 -0
  159. gns3server/appliances/huawei-ar1kv.gns3a +58 -0
  160. gns3server/appliances/huawei-ce12800.gns3a +43 -0
  161. gns3server/appliances/huawei-ne40e.gns3a +94 -0
  162. gns3server/appliances/huawei-usg6kv.gns3a +50 -0
  163. gns3server/appliances/innovaphone-app.gns3a +50 -0
  164. gns3server/appliances/innovaphone-ipva.gns3a +78 -0
  165. gns3server/appliances/ipfire.gns3a +181 -0
  166. gns3server/appliances/ipterm.gns3a +19 -0
  167. gns3server/appliances/ipxe.gns3a +47 -0
  168. gns3server/appliances/juniper-junos-space.gns3a +46 -0
  169. gns3server/appliances/juniper-vmx-legacy.gns3a +55 -0
  170. gns3server/appliances/juniper-vmx-vcp.gns3a +520 -0
  171. gns3server/appliances/juniper-vmx-vfp.gns3a +281 -0
  172. gns3server/appliances/juniper-vqfx-pfe.gns3a +71 -0
  173. gns3server/appliances/juniper-vqfx-re.gns3a +85 -0
  174. gns3server/appliances/juniper-vrr.gns3a +66 -0
  175. gns3server/appliances/juniper-vsrx.gns3a +332 -0
  176. gns3server/appliances/jupyter.gns3a +20 -0
  177. gns3server/appliances/jupyter27.gns3a +20 -0
  178. gns3server/appliances/kali-linux-cli.gns3a +18 -0
  179. gns3server/appliances/kali-linux.gns3a +248 -0
  180. gns3server/appliances/kemp-vlm.gns3a +111 -0
  181. gns3server/appliances/kerio-connect.gns3a +131 -0
  182. gns3server/appliances/kerio-control.gns3a +143 -0
  183. gns3server/appliances/kerio-operator.gns3a +130 -0
  184. gns3server/appliances/lancom-vrouter.gns3a +45 -0
  185. gns3server/appliances/loadbalancer_org-va.gns3a +56 -0
  186. gns3server/appliances/macos-install.gns3a +72 -0
  187. gns3server/appliances/mcjoin.gns3a +19 -0
  188. gns3server/appliances/microcore-linux.gns3a +72 -0
  189. gns3server/appliances/mikrotik-ccr1036-8g-2s+.gns3a +165 -0
  190. gns3server/appliances/mikrotik-ccr1072-1g-8s+.gns3a +161 -0
  191. gns3server/appliances/mikrotik-chr.gns3a +108 -0
  192. gns3server/appliances/mikrotik-crs328-24p-4s+.gns3a +173 -0
  193. gns3server/appliances/mikrotik-crs328-4c-20s-4s+.gns3a +189 -0
  194. gns3server/appliances/mikrotik-rb1100ahx4-dude-edition.gns3a +155 -0
  195. gns3server/appliances/mikrotik-rb2011uias.gns3a +161 -0
  196. gns3server/appliances/mikrotik-rb3011uias.gns3a +161 -0
  197. gns3server/appliances/mikrotik-rb4011igs+.gns3a +161 -0
  198. gns3server/appliances/mikrotik-rb450g.gns3a +155 -0
  199. gns3server/appliances/mikrotik-rb450gx4.gns3a +155 -0
  200. gns3server/appliances/mikrotik-winbox.gns3a +19 -0
  201. gns3server/appliances/mininet.gns3a +47 -0
  202. gns3server/appliances/net_toolbox.gns3a +20 -0
  203. gns3server/appliances/netapp-ontapsim.gns3a +185 -0
  204. gns3server/appliances/netem.gns3a +44 -0
  205. gns3server/appliances/network_automation.gns3a +19 -0
  206. gns3server/appliances/nixos.gns3a +52 -0
  207. gns3server/appliances/nokia-vsim.gns3a +47 -0
  208. gns3server/appliances/ntopng.gns3a +24 -0
  209. gns3server/appliances/onos.gns3a +19 -0
  210. gns3server/appliances/op5-monitor.gns3a +72 -0
  211. gns3server/appliances/open-media-vault.gns3a +120 -0
  212. gns3server/appliances/openbsd.gns3a +44 -0
  213. gns3server/appliances/opennac.gns3a +45 -0
  214. gns3server/appliances/opensuse.gns3a +47 -0
  215. gns3server/appliances/openvswitch-management.gns3a +21 -0
  216. gns3server/appliances/openvswitch.gns3a +21 -0
  217. gns3server/appliances/openwrt-realview.gns3a +56 -0
  218. gns3server/appliances/openwrt.gns3a +359 -0
  219. gns3server/appliances/opnsense.gns3a +122 -0
  220. gns3server/appliances/oracle-linux-cloud.gns3a +115 -0
  221. gns3server/appliances/ostinato-wireshark.gns3a +20 -0
  222. gns3server/appliances/ostinato.gns3a +75 -0
  223. gns3server/appliances/ovs-snmp.gns3a +18 -0
  224. gns3server/appliances/packetfence-zen.gns3a +151 -0
  225. gns3server/appliances/pan-vm-fw.gns3a +241 -0
  226. gns3server/appliances/parrot-os.gns3a +68 -0
  227. gns3server/appliances/pfsense.gns3a +122 -0
  228. gns3server/appliances/proxmox-mg.gns3a +69 -0
  229. gns3server/appliances/puppy-linux.gns3a +82 -0
  230. gns3server/appliances/python-go-perl-php.gns3a +17 -0
  231. gns3server/appliances/raspian.gns3a +79 -0
  232. gns3server/appliances/reactos.gns3a +67 -0
  233. gns3server/appliances/rhel.gns3a +207 -0
  234. gns3server/appliances/riverbed-steelhead-ng-vcx.gns3a +68 -0
  235. gns3server/appliances/rockylinux.gns3a +100 -0
  236. gns3server/appliances/security-onion.gns3a +108 -0
  237. gns3server/appliances/smoothwall.gns3a +54 -0
  238. gns3server/appliances/sophos-iview.gns3a +66 -0
  239. gns3server/appliances/sophos-utm.gns3a +263 -0
  240. gns3server/appliances/sophos-xg.gns3a +198 -0
  241. gns3server/appliances/stonework.gns3a +21 -0
  242. gns3server/appliances/tacacs-gui.gns3a +57 -0
  243. gns3server/appliances/tinycore-linux.gns3a +73 -0
  244. gns3server/appliances/trendmicro-imsva.gns3a +54 -0
  245. gns3server/appliances/trendmicro-iwsva.gns3a +53 -0
  246. gns3server/appliances/truenas.gns3a +104 -0
  247. gns3server/appliances/turnkey-wordpress.gns3a +20 -0
  248. gns3server/appliances/ubuntu-cloud.gns3a +116 -0
  249. gns3server/appliances/ubuntu-docker.gns3a +20 -0
  250. gns3server/appliances/ubuntu-gui.gns3a +98 -0
  251. gns3server/appliances/untangle.gns3a +208 -0
  252. gns3server/appliances/viptela-edge-genericx86-64.gns3a +84 -0
  253. gns3server/appliances/viptela-smart-genericx86-64.gns3a +82 -0
  254. gns3server/appliances/viptela-vmanage-genericx86-64.gns3a +95 -0
  255. gns3server/appliances/vpp.gns3a +45 -0
  256. gns3server/appliances/vrin.gns3a +118 -0
  257. gns3server/appliances/vyos.gns3a +179 -0
  258. gns3server/appliances/watchguard-fireboxv.gns3a +45 -0
  259. gns3server/appliances/watchguard-xtmv.gns3a +45 -0
  260. gns3server/appliances/webterm.gns3a +20 -0
  261. gns3server/appliances/windows-11-dev-env.gns3a +74 -0
  262. gns3server/appliances/windows-xp+ie.gns3a +52 -0
  263. gns3server/appliances/windows.gns3a +125 -0
  264. gns3server/appliances/windows_server.gns3a +83 -0
  265. gns3server/appliances/zentyal-server.gns3a +159 -0
  266. gns3server/appliances/zeroshell.gns3a +103 -0
  267. gns3server/compute/__init__.py +38 -0
  268. gns3server/compute/adapters/__init__.py +0 -0
  269. gns3server/compute/adapters/adapter.py +104 -0
  270. gns3server/compute/adapters/ethernet_adapter.py +33 -0
  271. gns3server/compute/adapters/serial_adapter.py +32 -0
  272. gns3server/compute/base_manager.py +547 -0
  273. gns3server/compute/base_node.py +979 -0
  274. gns3server/compute/builtin/__init__.py +46 -0
  275. gns3server/compute/builtin/builtin_node_factory.py +42 -0
  276. gns3server/compute/builtin/nodes/__init__.py +0 -0
  277. gns3server/compute/builtin/nodes/cloud.py +548 -0
  278. gns3server/compute/builtin/nodes/ethernet_hub.py +104 -0
  279. gns3server/compute/builtin/nodes/ethernet_switch.py +104 -0
  280. gns3server/compute/builtin/nodes/nat.py +97 -0
  281. gns3server/compute/compute_error.py +48 -0
  282. gns3server/compute/docker/__init__.py +320 -0
  283. gns3server/compute/docker/docker_error.py +33 -0
  284. gns3server/compute/docker/docker_vm.py +1378 -0
  285. gns3server/compute/docker/resources/bin/udhcpc +15 -0
  286. gns3server/compute/docker/resources/etc/udhcpc/default.script +138 -0
  287. gns3server/compute/docker/resources/init.sh +102 -0
  288. gns3server/compute/docker/resources/run-cmd.sh +6 -0
  289. gns3server/compute/dynamips/__init__.py +661 -0
  290. gns3server/compute/dynamips/adapters/__init__.py +0 -0
  291. gns3server/compute/dynamips/adapters/adapter.py +165 -0
  292. gns3server/compute/dynamips/adapters/c1700_mb_1fe.py +36 -0
  293. gns3server/compute/dynamips/adapters/c1700_mb_wic1.py +37 -0
  294. gns3server/compute/dynamips/adapters/c2600_mb_1e.py +36 -0
  295. gns3server/compute/dynamips/adapters/c2600_mb_1fe.py +37 -0
  296. gns3server/compute/dynamips/adapters/c2600_mb_2e.py +36 -0
  297. gns3server/compute/dynamips/adapters/c2600_mb_2fe.py +36 -0
  298. gns3server/compute/dynamips/adapters/c7200_io_2fe.py +36 -0
  299. gns3server/compute/dynamips/adapters/c7200_io_fe.py +36 -0
  300. gns3server/compute/dynamips/adapters/c7200_io_ge_e.py +36 -0
  301. gns3server/compute/dynamips/adapters/gt96100_fe.py +31 -0
  302. gns3server/compute/dynamips/adapters/leopard_2fe.py +37 -0
  303. gns3server/compute/dynamips/adapters/nm_16esw.py +32 -0
  304. gns3server/compute/dynamips/adapters/nm_1e.py +32 -0
  305. gns3server/compute/dynamips/adapters/nm_1fe_tx.py +32 -0
  306. gns3server/compute/dynamips/adapters/nm_4e.py +32 -0
  307. gns3server/compute/dynamips/adapters/nm_4t.py +32 -0
  308. gns3server/compute/dynamips/adapters/pa_2fe_tx.py +32 -0
  309. gns3server/compute/dynamips/adapters/pa_4e.py +32 -0
  310. gns3server/compute/dynamips/adapters/pa_4t.py +32 -0
  311. gns3server/compute/dynamips/adapters/pa_8e.py +32 -0
  312. gns3server/compute/dynamips/adapters/pa_8t.py +32 -0
  313. gns3server/compute/dynamips/adapters/pa_a1.py +32 -0
  314. gns3server/compute/dynamips/adapters/pa_fe_tx.py +32 -0
  315. gns3server/compute/dynamips/adapters/pa_ge.py +32 -0
  316. gns3server/compute/dynamips/adapters/pa_pos_oc3.py +32 -0
  317. gns3server/compute/dynamips/adapters/wic_1enet.py +40 -0
  318. gns3server/compute/dynamips/adapters/wic_1t.py +40 -0
  319. gns3server/compute/dynamips/adapters/wic_2t.py +40 -0
  320. gns3server/compute/dynamips/dynamips_error.py +26 -0
  321. gns3server/compute/dynamips/dynamips_factory.py +71 -0
  322. gns3server/compute/dynamips/dynamips_hypervisor.py +333 -0
  323. gns3server/compute/dynamips/hypervisor.py +210 -0
  324. gns3server/compute/dynamips/nios/__init__.py +0 -0
  325. gns3server/compute/dynamips/nios/nio.py +352 -0
  326. gns3server/compute/dynamips/nios/nio_generic_ethernet.py +73 -0
  327. gns3server/compute/dynamips/nios/nio_linux_ethernet.py +72 -0
  328. gns3server/compute/dynamips/nios/nio_null.py +51 -0
  329. gns3server/compute/dynamips/nios/nio_tap.py +66 -0
  330. gns3server/compute/dynamips/nios/nio_udp.py +136 -0
  331. gns3server/compute/dynamips/nios/nio_unix.py +88 -0
  332. gns3server/compute/dynamips/nios/nio_vde.py +88 -0
  333. gns3server/compute/dynamips/nodes/__init__.py +0 -0
  334. gns3server/compute/dynamips/nodes/atm_switch.py +514 -0
  335. gns3server/compute/dynamips/nodes/bridge.py +107 -0
  336. gns3server/compute/dynamips/nodes/c1700.py +160 -0
  337. gns3server/compute/dynamips/nodes/c2600.py +171 -0
  338. gns3server/compute/dynamips/nodes/c2691.py +112 -0
  339. gns3server/compute/dynamips/nodes/c3600.py +155 -0
  340. gns3server/compute/dynamips/nodes/c3725.py +112 -0
  341. gns3server/compute/dynamips/nodes/c3745.py +112 -0
  342. gns3server/compute/dynamips/nodes/c7200.py +268 -0
  343. gns3server/compute/dynamips/nodes/device.py +134 -0
  344. gns3server/compute/dynamips/nodes/ethernet_hub.py +241 -0
  345. gns3server/compute/dynamips/nodes/ethernet_switch.py +496 -0
  346. gns3server/compute/dynamips/nodes/frame_relay_switch.py +379 -0
  347. gns3server/compute/dynamips/nodes/router.py +1797 -0
  348. gns3server/compute/error.py +40 -0
  349. gns3server/compute/iou/__init__.py +64 -0
  350. gns3server/compute/iou/iou_error.py +25 -0
  351. gns3server/compute/iou/iou_vm.py +1482 -0
  352. gns3server/compute/iou/utils/__init__.py +0 -0
  353. gns3server/compute/iou/utils/iou_export.py +233 -0
  354. gns3server/compute/iou/utils/iou_import.py +232 -0
  355. gns3server/compute/nios/__init__.py +0 -0
  356. gns3server/compute/nios/nio.py +120 -0
  357. gns3server/compute/nios/nio_ethernet.py +56 -0
  358. gns3server/compute/nios/nio_tap.py +56 -0
  359. gns3server/compute/nios/nio_udp.py +82 -0
  360. gns3server/compute/notification_manager.py +73 -0
  361. gns3server/compute/port_manager.py +402 -0
  362. gns3server/compute/project.py +434 -0
  363. gns3server/compute/project_manager.py +122 -0
  364. gns3server/compute/qemu/__init__.py +304 -0
  365. gns3server/compute/qemu/qemu_error.py +26 -0
  366. gns3server/compute/qemu/qemu_vm.py +2697 -0
  367. gns3server/compute/qemu/resources/config.img.zip +0 -0
  368. gns3server/compute/qemu/utils/__init__.py +0 -0
  369. gns3server/compute/qemu/utils/guest_cid.py +38 -0
  370. gns3server/compute/qemu/utils/qcow2.py +138 -0
  371. gns3server/compute/qemu/utils/ziputils.py +55 -0
  372. gns3server/compute/ubridge/__init__.py +0 -0
  373. gns3server/compute/ubridge/hypervisor.py +256 -0
  374. gns3server/compute/ubridge/ubridge_error.py +32 -0
  375. gns3server/compute/ubridge/ubridge_hypervisor.py +285 -0
  376. gns3server/compute/virtualbox/__init__.py +212 -0
  377. gns3server/compute/virtualbox/virtualbox_error.py +26 -0
  378. gns3server/compute/virtualbox/virtualbox_vm.py +1255 -0
  379. gns3server/compute/vmware/__init__.py +725 -0
  380. gns3server/compute/vmware/vmware_error.py +26 -0
  381. gns3server/compute/vmware/vmware_vm.py +1007 -0
  382. gns3server/compute/vpcs/__init__.py +91 -0
  383. gns3server/compute/vpcs/vpcs_error.py +26 -0
  384. gns3server/compute/vpcs/vpcs_vm.py +595 -0
  385. gns3server/config.py +284 -0
  386. gns3server/config_samples/gns3_server.conf +160 -0
  387. gns3server/configs/ios_base_startup-config.txt +26 -0
  388. gns3server/configs/ios_etherswitch_startup-config.txt +181 -0
  389. gns3server/configs/iou_l2_base_startup-config.txt +133 -0
  390. gns3server/configs/iou_l3_base_startup-config.txt +109 -0
  391. gns3server/configs/vpcs_base_config.txt +9 -0
  392. gns3server/controller/__init__.py +691 -0
  393. gns3server/controller/appliance.py +86 -0
  394. gns3server/controller/appliance_manager.py +486 -0
  395. gns3server/controller/appliance_to_template.py +132 -0
  396. gns3server/controller/compute.py +677 -0
  397. gns3server/controller/controller_error.py +77 -0
  398. gns3server/controller/drawing.py +229 -0
  399. gns3server/controller/export_project.py +336 -0
  400. gns3server/controller/gns3vm/__init__.py +412 -0
  401. gns3server/controller/gns3vm/base_gns3_vm.py +303 -0
  402. gns3server/controller/gns3vm/gns3_vm_error.py +28 -0
  403. gns3server/controller/gns3vm/hyperv_gns3_vm.py +346 -0
  404. gns3server/controller/gns3vm/remote_gns3_vm.py +73 -0
  405. gns3server/controller/gns3vm/virtualbox_gns3_vm.py +480 -0
  406. gns3server/controller/gns3vm/vmware_gns3_vm.py +216 -0
  407. gns3server/controller/import_project.py +332 -0
  408. gns3server/controller/link.py +461 -0
  409. gns3server/controller/node.py +840 -0
  410. gns3server/controller/notification.py +149 -0
  411. gns3server/controller/ports/__init__.py +0 -0
  412. gns3server/controller/ports/atm_port.py +51 -0
  413. gns3server/controller/ports/ethernet_port.py +49 -0
  414. gns3server/controller/ports/fastethernet_port.py +43 -0
  415. gns3server/controller/ports/frame_relay_port.py +43 -0
  416. gns3server/controller/ports/gigabitethernet_port.py +43 -0
  417. gns3server/controller/ports/port.py +109 -0
  418. gns3server/controller/ports/port_factory.py +213 -0
  419. gns3server/controller/ports/pos_port.py +52 -0
  420. gns3server/controller/ports/serial_port.py +63 -0
  421. gns3server/controller/project.py +1399 -0
  422. gns3server/controller/snapshot.py +140 -0
  423. gns3server/controller/symbol_themes.py +153 -0
  424. gns3server/controller/symbols.py +168 -0
  425. gns3server/controller/topology.py +788 -0
  426. gns3server/controller/udp_link.py +245 -0
  427. gns3server/core/__init__.py +0 -0
  428. gns3server/core/tasks.py +99 -0
  429. gns3server/crash_report.py +167 -0
  430. gns3server/db/__init__.py +0 -0
  431. gns3server/db/models/__init__.py +38 -0
  432. gns3server/db/models/acl.py +46 -0
  433. gns3server/db/models/base.py +117 -0
  434. gns3server/db/models/computes.py +33 -0
  435. gns3server/db/models/images.py +43 -0
  436. gns3server/db/models/pools.py +52 -0
  437. gns3server/db/models/privileges.py +359 -0
  438. gns3server/db/models/roles.py +57 -0
  439. gns3server/db/models/templates.py +272 -0
  440. gns3server/db/models/users.py +94 -0
  441. gns3server/db/repositories/__init__.py +0 -0
  442. gns3server/db/repositories/base.py +24 -0
  443. gns3server/db/repositories/computes.py +93 -0
  444. gns3server/db/repositories/images.py +141 -0
  445. gns3server/db/repositories/pools.py +218 -0
  446. gns3server/db/repositories/rbac.py +430 -0
  447. gns3server/db/repositories/templates.py +172 -0
  448. gns3server/db/repositories/users.py +289 -0
  449. gns3server/db/tasks.py +230 -0
  450. gns3server/db_migrations/README +5 -0
  451. gns3server/db_migrations/env.py +101 -0
  452. gns3server/db_migrations/script.py.mako +24 -0
  453. gns3server/db_migrations/versions/7ceeddd9c9a8_init.py +28 -0
  454. gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py +27 -0
  455. gns3server/disks/OVMF.fd +0 -0
  456. gns3server/disks/OVMF_CODE.fd +0 -0
  457. gns3server/disks/OVMF_VARS.fd +0 -0
  458. gns3server/disks/empty100G.qcow2 +0 -0
  459. gns3server/disks/empty10G.qcow2 +0 -0
  460. gns3server/disks/empty150G.qcow2 +0 -0
  461. gns3server/disks/empty1T.qcow2 +0 -0
  462. gns3server/disks/empty200G.qcow2 +0 -0
  463. gns3server/disks/empty20G.qcow2 +0 -0
  464. gns3server/disks/empty250G.qcow2 +0 -0
  465. gns3server/disks/empty30G.qcow2 +0 -0
  466. gns3server/disks/empty40G.qcow2 +0 -0
  467. gns3server/disks/empty500G.qcow2 +0 -0
  468. gns3server/disks/empty50G.qcow2 +0 -0
  469. gns3server/disks/empty8G.qcow2 +0 -0
  470. gns3server/gns3_server.egg-info/PKG-INFO +307 -0
  471. gns3server/gns3_server.egg-info/SOURCES.txt +0 -0
  472. gns3server/gns3_server.egg-info/dependency_links.txt +1 -0
  473. gns3server/gns3_server.egg-info/entry_points.txt +4 -0
  474. gns3server/gns3_server.egg-info/not-zip-safe +1 -0
  475. gns3server/gns3_server.egg-info/requires.txt +31 -0
  476. gns3server/gns3_server.egg-info/top_level.txt +2 -0
  477. gns3server/logger.py +164 -0
  478. gns3server/main.py +81 -0
  479. gns3server/schemas/__init__.py +85 -0
  480. gns3server/schemas/common.py +71 -0
  481. gns3server/schemas/compute/__init__.py +0 -0
  482. gns3server/schemas/compute/atm_switch_nodes.py +55 -0
  483. gns3server/schemas/compute/cloud_nodes.py +137 -0
  484. gns3server/schemas/compute/docker_nodes.py +75 -0
  485. gns3server/schemas/compute/dynamips_nodes.py +197 -0
  486. gns3server/schemas/compute/ethernet_hub_nodes.py +63 -0
  487. gns3server/schemas/compute/ethernet_switch_nodes.py +100 -0
  488. gns3server/schemas/compute/frame_relay_switch_nodes.py +55 -0
  489. gns3server/schemas/compute/iou_nodes.py +76 -0
  490. gns3server/schemas/compute/nat_nodes.py +122 -0
  491. gns3server/schemas/compute/nios.py +66 -0
  492. gns3server/schemas/compute/qemu_nodes.py +245 -0
  493. gns3server/schemas/compute/virtualbox_nodes.py +97 -0
  494. gns3server/schemas/compute/vmware_nodes.py +102 -0
  495. gns3server/schemas/compute/vpcs_nodes.py +68 -0
  496. gns3server/schemas/config.py +197 -0
  497. gns3server/schemas/controller/__init__.py +0 -0
  498. gns3server/schemas/controller/appliances.py +466 -0
  499. gns3server/schemas/controller/base.py +25 -0
  500. gns3server/schemas/controller/capabilities.py +34 -0
  501. gns3server/schemas/controller/computes.py +168 -0
  502. gns3server/schemas/controller/drawings.py +34 -0
  503. gns3server/schemas/controller/gns3vm.py +56 -0
  504. gns3server/schemas/controller/images.py +44 -0
  505. gns3server/schemas/controller/iou_license.py +23 -0
  506. gns3server/schemas/controller/labels.py +30 -0
  507. gns3server/schemas/controller/links.py +94 -0
  508. gns3server/schemas/controller/nodes.py +177 -0
  509. gns3server/schemas/controller/pools.py +81 -0
  510. gns3server/schemas/controller/projects.py +116 -0
  511. gns3server/schemas/controller/rbac.py +113 -0
  512. gns3server/schemas/controller/snapshots.py +42 -0
  513. gns3server/schemas/controller/templates/__init__.py +83 -0
  514. gns3server/schemas/controller/templates/cloud_templates.py +44 -0
  515. gns3server/schemas/controller/templates/docker_templates.py +59 -0
  516. gns3server/schemas/controller/templates/dynamips_templates.py +199 -0
  517. gns3server/schemas/controller/templates/ethernet_hub_templates.py +46 -0
  518. gns3server/schemas/controller/templates/ethernet_switch_templates.py +57 -0
  519. gns3server/schemas/controller/templates/iou_templates.py +47 -0
  520. gns3server/schemas/controller/templates/qemu_templates.py +94 -0
  521. gns3server/schemas/controller/templates/virtualbox_templates.py +64 -0
  522. gns3server/schemas/controller/templates/vmware_templates.py +61 -0
  523. gns3server/schemas/controller/templates/vpcs_templates.py +39 -0
  524. gns3server/schemas/controller/tokens.py +29 -0
  525. gns3server/schemas/controller/topology.py +82 -0
  526. gns3server/schemas/controller/users.py +105 -0
  527. gns3server/schemas/link.py +0 -0
  528. gns3server/schemas/qemu_disk_image.py +103 -0
  529. gns3server/schemas/version.py +25 -0
  530. gns3server/server.py +348 -0
  531. gns3server/services/__init__.py +19 -0
  532. gns3server/services/authentication.py +83 -0
  533. gns3server/services/computes.py +82 -0
  534. gns3server/services/templates.py +329 -0
  535. gns3server/static/.gitkeep +0 -0
  536. gns3server/static/favicon.ico +0 -0
  537. gns3server/static/redoc.standalone.js +1782 -0
  538. gns3server/static/swagger-ui-bundle.js +2 -0
  539. gns3server/static/swagger-ui.css +3 -0
  540. gns3server/static/web-ui/3rdpartylicenses.txt +2604 -0
  541. gns3server/static/web-ui/465.92c7ab880f2504d3.js +1 -0
  542. gns3server/static/web-ui/MaterialIcons-Regular.196fa4a92dd6fa73.ttf +0 -0
  543. gns3server/static/web-ui/MaterialIcons-Regular.1e50f5c2ffa6aba4.eot +0 -0
  544. gns3server/static/web-ui/MaterialIcons-Regular.7ea2023eeca07427.woff2 +0 -0
  545. gns3server/static/web-ui/MaterialIcons-Regular.db852539204b1a34.woff +0 -0
  546. gns3server/static/web-ui/NotoSans-Bold.635e9291df1a5a00.woff2 +0 -0
  547. gns3server/static/web-ui/NotoSans-Bold.885427cced6d8c94.woff +0 -0
  548. gns3server/static/web-ui/NotoSans-Bold.93203a43bc93ad9c.svg +8453 -0
  549. gns3server/static/web-ui/NotoSans-Bold.a7ab189a45f553b4.eot +0 -0
  550. gns3server/static/web-ui/NotoSans-Bold.e989c11744b36f58.ttf +0 -0
  551. gns3server/static/web-ui/NotoSans-BoldItalic.2baf33b639fc86a4.woff +0 -0
  552. gns3server/static/web-ui/NotoSans-BoldItalic.2eea9ba02e25c1d3.ttf +0 -0
  553. gns3server/static/web-ui/NotoSans-BoldItalic.46a5eec91da0d900.svg +8453 -0
  554. gns3server/static/web-ui/NotoSans-BoldItalic.7fdef73b477daa73.eot +0 -0
  555. gns3server/static/web-ui/NotoSans-BoldItalic.c62f70f121f271aa.woff2 +0 -0
  556. gns3server/static/web-ui/NotoSans-Italic.219ee88e5bc4e168.ttf +0 -0
  557. gns3server/static/web-ui/NotoSans-Italic.3d6f7cf772169c8d.svg +8453 -0
  558. gns3server/static/web-ui/NotoSans-Italic.77cd3818b5a2cb97.woff +0 -0
  559. gns3server/static/web-ui/NotoSans-Italic.85194585ae9d8c36.eot +0 -0
  560. gns3server/static/web-ui/NotoSans-Italic.eee02500e81db981.woff2 +0 -0
  561. gns3server/static/web-ui/NotoSans-Regular.156b7584192d70ed.eot +0 -0
  562. gns3server/static/web-ui/NotoSans-Regular.374d132a6803e279.woff2 +0 -0
  563. gns3server/static/web-ui/NotoSans-Regular.595e3f5876719740.woff +0 -0
  564. gns3server/static/web-ui/NotoSans-Regular.bb384defbe36eaec.svg +8453 -0
  565. gns3server/static/web-ui/NotoSans-Regular.e6139cb1663a1c57.ttf +0 -0
  566. gns3server/static/web-ui/ReleaseNotes.txt +179 -0
  567. gns3server/static/web-ui/assets/favicon.ico +0 -0
  568. gns3server/static/web-ui/assets/gns3_icon.svg +88 -0
  569. gns3server/static/web-ui/assets/gns3_icon_black.svg +88 -0
  570. gns3server/static/web-ui/assets/icons/mac/icon.icns +0 -0
  571. gns3server/static/web-ui/assets/icons/png/1024x1024.png +0 -0
  572. gns3server/static/web-ui/assets/icons/png/128x128.png +0 -0
  573. gns3server/static/web-ui/assets/icons/png/16x16.png +0 -0
  574. gns3server/static/web-ui/assets/icons/png/24x24.png +0 -0
  575. gns3server/static/web-ui/assets/icons/png/256x256.png +0 -0
  576. gns3server/static/web-ui/assets/icons/png/32x32.png +0 -0
  577. gns3server/static/web-ui/assets/icons/png/48x48.png +0 -0
  578. gns3server/static/web-ui/assets/icons/png/512x512.png +0 -0
  579. gns3server/static/web-ui/assets/icons/png/64x64.png +0 -0
  580. gns3server/static/web-ui/assets/icons/win/icon.ico +0 -0
  581. gns3server/static/web-ui/assets/logo-header.png +0 -0
  582. gns3server/static/web-ui/assets/resources/images/filter-capture.svg +428 -0
  583. gns3server/static/web-ui/assets/resources/images/filter.svg +708 -0
  584. gns3server/static/web-ui/assets/resources/images/inspect.svg +312 -0
  585. gns3server/static/web-ui/assets/resources/images/pause.svg +752 -0
  586. gns3server/static/web-ui/favicon.ico +0 -0
  587. gns3server/static/web-ui/index.html +51 -0
  588. gns3server/static/web-ui/main.f802edd2b8c6db1d.js +1 -0
  589. gns3server/static/web-ui/polyfills.319c79dd175e50d0.js +1 -0
  590. gns3server/static/web-ui/roboto-latin-100.539f0a96b40596f7.woff2 +0 -0
  591. gns3server/static/web-ui/roboto-latin-100.5ba994dac3e79ea8.woff +0 -0
  592. gns3server/static/web-ui/roboto-latin-100italic.41ba64219cb743c9.woff2 +0 -0
  593. gns3server/static/web-ui/roboto-latin-100italic.d61e7e8b07c0638c.woff +0 -0
  594. gns3server/static/web-ui/roboto-latin-300.4d8f8086236bad80.woff2 +0 -0
  595. gns3server/static/web-ui/roboto-latin-300.6c1bc461047e61f5.woff +0 -0
  596. gns3server/static/web-ui/roboto-latin-300italic.3a529751a590d3c1.woff +0 -0
  597. gns3server/static/web-ui/roboto-latin-300italic.45164643b3bd5824.woff2 +0 -0
  598. gns3server/static/web-ui/roboto-latin-400.1e2d4d3a272629cd.woff2 +0 -0
  599. gns3server/static/web-ui/roboto-latin-400.7e4a045b9373d9c1.woff +0 -0
  600. gns3server/static/web-ui/roboto-latin-400italic.68431199e5b90ea8.woff +0 -0
  601. gns3server/static/web-ui/roboto-latin-400italic.bb3c6955c4334c8a.woff2 +0 -0
  602. gns3server/static/web-ui/roboto-latin-500.1dfbc3dbf815e3f3.woff2 +0 -0
  603. gns3server/static/web-ui/roboto-latin-500.e21fe97fd2329ff7.woff +0 -0
  604. gns3server/static/web-ui/roboto-latin-500italic.7543a42b12b1452f.woff2 +0 -0
  605. gns3server/static/web-ui/roboto-latin-500italic.aaff6867154023d3.woff +0 -0
  606. gns3server/static/web-ui/roboto-latin-700.02633003129d1e63.woff +0 -0
  607. gns3server/static/web-ui/roboto-latin-700.12893bfc0762b0f3.woff2 +0 -0
  608. gns3server/static/web-ui/roboto-latin-700italic.bc7179e004e40113.woff2 +0 -0
  609. gns3server/static/web-ui/roboto-latin-700italic.e53062e27c63fafb.woff +0 -0
  610. gns3server/static/web-ui/roboto-latin-900.282ba77fda1349f3.woff2 +0 -0
  611. gns3server/static/web-ui/roboto-latin-900.4962e810cbb4d3e5.woff +0 -0
  612. gns3server/static/web-ui/roboto-latin-900italic.2394134a78bbaef8.woff +0 -0
  613. gns3server/static/web-ui/roboto-latin-900italic.9c1f80840351fa12.woff2 +0 -0
  614. gns3server/static/web-ui/runtime.24fa95b7061d7056.js +1 -0
  615. gns3server/static/web-ui/styles.6e966072487df0b7.css +5 -0
  616. gns3server/symbols/.gitkeep +0 -0
  617. gns3server/symbols/affinity/circle/blue/atm.svg +5 -0
  618. gns3server/symbols/affinity/circle/blue/bug.svg +8 -0
  619. gns3server/symbols/affinity/circle/blue/camera.svg +5 -0
  620. gns3server/symbols/affinity/circle/blue/camera_dome.svg +8 -0
  621. gns3server/symbols/affinity/circle/blue/client.svg +5 -0
  622. gns3server/symbols/affinity/circle/blue/client_vm.svg +6 -0
  623. gns3server/symbols/affinity/circle/blue/cloud.svg +5 -0
  624. gns3server/symbols/affinity/circle/blue/coffee.svg +6 -0
  625. gns3server/symbols/affinity/circle/blue/cog.svg +5 -0
  626. gns3server/symbols/affinity/circle/blue/communications.svg +5 -0
  627. gns3server/symbols/affinity/circle/blue/conversation.svg +12 -0
  628. gns3server/symbols/affinity/circle/blue/dna.svg +7 -0
  629. gns3server/symbols/affinity/circle/blue/dna2.svg +7 -0
  630. gns3server/symbols/affinity/circle/blue/docker.svg +11 -0
  631. gns3server/symbols/affinity/circle/blue/dslam.svg +5 -0
  632. gns3server/symbols/affinity/circle/blue/factory.svg +6 -0
  633. gns3server/symbols/affinity/circle/blue/fingerprint.svg +5 -0
  634. gns3server/symbols/affinity/circle/blue/firewall.svg +5 -0
  635. gns3server/symbols/affinity/circle/blue/firewall3.svg +5 -0
  636. gns3server/symbols/affinity/circle/blue/globe.svg +5 -0
  637. gns3server/symbols/affinity/circle/blue/grid.svg +5 -0
  638. gns3server/symbols/affinity/circle/blue/grid2.svg +5 -0
  639. gns3server/symbols/affinity/circle/blue/health.svg +5 -0
  640. gns3server/symbols/affinity/circle/blue/house.svg +9 -0
  641. gns3server/symbols/affinity/circle/blue/hub.svg +5 -0
  642. gns3server/symbols/affinity/circle/blue/inspect.svg +7 -0
  643. gns3server/symbols/affinity/circle/blue/inspect2.svg +6 -0
  644. gns3server/symbols/affinity/circle/blue/interconnect.svg +5 -0
  645. gns3server/symbols/affinity/circle/blue/ip_phone.svg +21 -0
  646. gns3server/symbols/affinity/circle/blue/isdn.svg +5 -0
  647. gns3server/symbols/affinity/circle/blue/laptop.svg +6 -0
  648. gns3server/symbols/affinity/circle/blue/ldap.svg +5 -0
  649. gns3server/symbols/affinity/circle/blue/light_bulb.svg +11 -0
  650. gns3server/symbols/affinity/circle/blue/link.svg +5 -0
  651. gns3server/symbols/affinity/circle/blue/loadbalancer.svg +5 -0
  652. gns3server/symbols/affinity/circle/blue/nas.svg +5 -0
  653. gns3server/symbols/affinity/circle/blue/nat.svg +60 -0
  654. gns3server/symbols/affinity/circle/blue/nat2.svg +55 -0
  655. gns3server/symbols/affinity/circle/blue/office.svg +5 -0
  656. gns3server/symbols/affinity/circle/blue/optical.svg +8 -0
  657. gns3server/symbols/affinity/circle/blue/phone_cloud.svg +6 -0
  658. gns3server/symbols/affinity/circle/blue/phone_old.svg +5 -0
  659. gns3server/symbols/affinity/circle/blue/phone_wireless.svg +8 -0
  660. gns3server/symbols/affinity/circle/blue/pinpoint.svg +5 -0
  661. gns3server/symbols/affinity/circle/blue/printer.svg +7 -0
  662. gns3server/symbols/affinity/circle/blue/rj45.svg +5 -0
  663. gns3server/symbols/affinity/circle/blue/router.svg +5 -0
  664. gns3server/symbols/affinity/circle/blue/router2.svg +5 -0
  665. gns3server/symbols/affinity/circle/blue/router_cloud.svg +6 -0
  666. gns3server/symbols/affinity/circle/blue/satellite.svg +6 -0
  667. gns3server/symbols/affinity/circle/blue/satellite_dish.svg +7 -0
  668. gns3server/symbols/affinity/circle/blue/scull.svg +8 -0
  669. gns3server/symbols/affinity/circle/blue/server.svg +5 -0
  670. gns3server/symbols/affinity/circle/blue/server_cluster.svg +7 -0
  671. gns3server/symbols/affinity/circle/blue/shield.svg +7 -0
  672. gns3server/symbols/affinity/circle/blue/statistics.svg +7 -0
  673. gns3server/symbols/affinity/circle/blue/storage.svg +5 -0
  674. gns3server/symbols/affinity/circle/blue/switch.svg +8 -0
  675. gns3server/symbols/affinity/circle/blue/switch_multilayer.svg +5 -0
  676. gns3server/symbols/affinity/circle/blue/tablet.svg +11 -0
  677. gns3server/symbols/affinity/circle/blue/template.svg +4 -0
  678. gns3server/symbols/affinity/circle/blue/tree.svg +5 -0
  679. gns3server/symbols/affinity/circle/blue/user.svg +7 -0
  680. gns3server/symbols/affinity/circle/blue/virtualbox.svg +7 -0
  681. gns3server/symbols/affinity/circle/blue/vm.svg +7 -0
  682. gns3server/symbols/affinity/circle/blue/vmware.svg +7 -0
  683. gns3server/symbols/affinity/circle/blue/vrf.svg +8 -0
  684. gns3server/symbols/affinity/circle/blue/wifi.svg +5 -0
  685. gns3server/symbols/affinity/circle/blue/wlc.svg +5 -0
  686. gns3server/symbols/affinity/circle/blue/xml.svg +5 -0
  687. gns3server/symbols/affinity/circle/gray/atm.svg +5 -0
  688. gns3server/symbols/affinity/circle/gray/bug.svg +8 -0
  689. gns3server/symbols/affinity/circle/gray/camera.svg +5 -0
  690. gns3server/symbols/affinity/circle/gray/camera_dome.svg +8 -0
  691. gns3server/symbols/affinity/circle/gray/client.svg +5 -0
  692. gns3server/symbols/affinity/circle/gray/client_vm.svg +6 -0
  693. gns3server/symbols/affinity/circle/gray/cloud.svg +5 -0
  694. gns3server/symbols/affinity/circle/gray/coffee.svg +6 -0
  695. gns3server/symbols/affinity/circle/gray/cog.svg +5 -0
  696. gns3server/symbols/affinity/circle/gray/communications.svg +5 -0
  697. gns3server/symbols/affinity/circle/gray/conversation.svg +12 -0
  698. gns3server/symbols/affinity/circle/gray/dna.svg +7 -0
  699. gns3server/symbols/affinity/circle/gray/dna2.svg +7 -0
  700. gns3server/symbols/affinity/circle/gray/docker.svg +11 -0
  701. gns3server/symbols/affinity/circle/gray/dslam.svg +5 -0
  702. gns3server/symbols/affinity/circle/gray/factory.svg +7 -0
  703. gns3server/symbols/affinity/circle/gray/fingerprint.svg +5 -0
  704. gns3server/symbols/affinity/circle/gray/firewall.svg +5 -0
  705. gns3server/symbols/affinity/circle/gray/firewall3.svg +5 -0
  706. gns3server/symbols/affinity/circle/gray/globe.svg +5 -0
  707. gns3server/symbols/affinity/circle/gray/grid.svg +5 -0
  708. gns3server/symbols/affinity/circle/gray/grid2.svg +5 -0
  709. gns3server/symbols/affinity/circle/gray/health.svg +5 -0
  710. gns3server/symbols/affinity/circle/gray/house.svg +9 -0
  711. gns3server/symbols/affinity/circle/gray/hub.svg +5 -0
  712. gns3server/symbols/affinity/circle/gray/inspect.svg +7 -0
  713. gns3server/symbols/affinity/circle/gray/inspect2.svg +6 -0
  714. gns3server/symbols/affinity/circle/gray/interconnect.svg +5 -0
  715. gns3server/symbols/affinity/circle/gray/ip_phone.svg +21 -0
  716. gns3server/symbols/affinity/circle/gray/isdn.svg +5 -0
  717. gns3server/symbols/affinity/circle/gray/laptop.svg +6 -0
  718. gns3server/symbols/affinity/circle/gray/ldap.svg +5 -0
  719. gns3server/symbols/affinity/circle/gray/light_bulb.svg +11 -0
  720. gns3server/symbols/affinity/circle/gray/link.svg +5 -0
  721. gns3server/symbols/affinity/circle/gray/loadbalancer.svg +5 -0
  722. gns3server/symbols/affinity/circle/gray/nas.svg +5 -0
  723. gns3server/symbols/affinity/circle/gray/nat.svg +60 -0
  724. gns3server/symbols/affinity/circle/gray/nat2.svg +55 -0
  725. gns3server/symbols/affinity/circle/gray/office.svg +5 -0
  726. gns3server/symbols/affinity/circle/gray/optical.svg +8 -0
  727. gns3server/symbols/affinity/circle/gray/phone_cloud.svg +6 -0
  728. gns3server/symbols/affinity/circle/gray/phone_old.svg +5 -0
  729. gns3server/symbols/affinity/circle/gray/phone_wireless.svg +8 -0
  730. gns3server/symbols/affinity/circle/gray/pinpoint.svg +5 -0
  731. gns3server/symbols/affinity/circle/gray/printer.svg +25 -0
  732. gns3server/symbols/affinity/circle/gray/rj45.svg +5 -0
  733. gns3server/symbols/affinity/circle/gray/router.svg +5 -0
  734. gns3server/symbols/affinity/circle/gray/router2.svg +5 -0
  735. gns3server/symbols/affinity/circle/gray/router_cloud.svg +6 -0
  736. gns3server/symbols/affinity/circle/gray/satellite.svg +6 -0
  737. gns3server/symbols/affinity/circle/gray/satellite_dish.svg +7 -0
  738. gns3server/symbols/affinity/circle/gray/scull.svg +8 -0
  739. gns3server/symbols/affinity/circle/gray/server.svg +5 -0
  740. gns3server/symbols/affinity/circle/gray/server_cluster.svg +7 -0
  741. gns3server/symbols/affinity/circle/gray/shield.svg +7 -0
  742. gns3server/symbols/affinity/circle/gray/statistics.svg +7 -0
  743. gns3server/symbols/affinity/circle/gray/storage.svg +5 -0
  744. gns3server/symbols/affinity/circle/gray/switch.svg +8 -0
  745. gns3server/symbols/affinity/circle/gray/switch_multilayer.svg +5 -0
  746. gns3server/symbols/affinity/circle/gray/tablet.svg +11 -0
  747. gns3server/symbols/affinity/circle/gray/template.svg +4 -0
  748. gns3server/symbols/affinity/circle/gray/tree.svg +5 -0
  749. gns3server/symbols/affinity/circle/gray/user.svg +7 -0
  750. gns3server/symbols/affinity/circle/gray/virtualbox.svg +7 -0
  751. gns3server/symbols/affinity/circle/gray/vm.svg +7 -0
  752. gns3server/symbols/affinity/circle/gray/vmware.svg +7 -0
  753. gns3server/symbols/affinity/circle/gray/vrf.svg +8 -0
  754. gns3server/symbols/affinity/circle/gray/wifi.svg +5 -0
  755. gns3server/symbols/affinity/circle/gray/wlc.svg +5 -0
  756. gns3server/symbols/affinity/circle/gray/xml.svg +5 -0
  757. gns3server/symbols/affinity/circle/green/atm.svg +5 -0
  758. gns3server/symbols/affinity/circle/green/bug.svg +8 -0
  759. gns3server/symbols/affinity/circle/green/camera.svg +5 -0
  760. gns3server/symbols/affinity/circle/green/camera_dome.svg +8 -0
  761. gns3server/symbols/affinity/circle/green/client.svg +5 -0
  762. gns3server/symbols/affinity/circle/green/client_vm.svg +6 -0
  763. gns3server/symbols/affinity/circle/green/cloud.svg +5 -0
  764. gns3server/symbols/affinity/circle/green/coffee.svg +6 -0
  765. gns3server/symbols/affinity/circle/green/cog.svg +5 -0
  766. gns3server/symbols/affinity/circle/green/communications.svg +5 -0
  767. gns3server/symbols/affinity/circle/green/conversation.svg +12 -0
  768. gns3server/symbols/affinity/circle/green/dna.svg +7 -0
  769. gns3server/symbols/affinity/circle/green/dna2.svg +7 -0
  770. gns3server/symbols/affinity/circle/green/docker.svg +11 -0
  771. gns3server/symbols/affinity/circle/green/dslam.svg +5 -0
  772. gns3server/symbols/affinity/circle/green/factory.svg +6 -0
  773. gns3server/symbols/affinity/circle/green/fingerprint.svg +5 -0
  774. gns3server/symbols/affinity/circle/green/firewall.svg +5 -0
  775. gns3server/symbols/affinity/circle/green/firewall3.svg +5 -0
  776. gns3server/symbols/affinity/circle/green/globe.svg +5 -0
  777. gns3server/symbols/affinity/circle/green/grid.svg +5 -0
  778. gns3server/symbols/affinity/circle/green/grid2.svg +5 -0
  779. gns3server/symbols/affinity/circle/green/health.svg +5 -0
  780. gns3server/symbols/affinity/circle/green/house.svg +9 -0
  781. gns3server/symbols/affinity/circle/green/hub.svg +5 -0
  782. gns3server/symbols/affinity/circle/green/inspect.svg +7 -0
  783. gns3server/symbols/affinity/circle/green/inspect2.svg +6 -0
  784. gns3server/symbols/affinity/circle/green/interconnect.svg +5 -0
  785. gns3server/symbols/affinity/circle/green/ip_phone.svg +21 -0
  786. gns3server/symbols/affinity/circle/green/isdn.svg +5 -0
  787. gns3server/symbols/affinity/circle/green/laptop.svg +6 -0
  788. gns3server/symbols/affinity/circle/green/ldap.svg +5 -0
  789. gns3server/symbols/affinity/circle/green/light_bulb.svg +11 -0
  790. gns3server/symbols/affinity/circle/green/link.svg +5 -0
  791. gns3server/symbols/affinity/circle/green/loadbalancer.svg +5 -0
  792. gns3server/symbols/affinity/circle/green/nas.svg +5 -0
  793. gns3server/symbols/affinity/circle/green/nat.svg +60 -0
  794. gns3server/symbols/affinity/circle/green/nat2.svg +55 -0
  795. gns3server/symbols/affinity/circle/green/office.svg +5 -0
  796. gns3server/symbols/affinity/circle/green/optical.svg +8 -0
  797. gns3server/symbols/affinity/circle/green/phone_cloud.svg +6 -0
  798. gns3server/symbols/affinity/circle/green/phone_old.svg +5 -0
  799. gns3server/symbols/affinity/circle/green/phone_wireless.svg +8 -0
  800. gns3server/symbols/affinity/circle/green/pinpoint.svg +5 -0
  801. gns3server/symbols/affinity/circle/green/printer.svg +7 -0
  802. gns3server/symbols/affinity/circle/green/rj45.svg +5 -0
  803. gns3server/symbols/affinity/circle/green/router.svg +5 -0
  804. gns3server/symbols/affinity/circle/green/router2.svg +5 -0
  805. gns3server/symbols/affinity/circle/green/router_cloud.svg +6 -0
  806. gns3server/symbols/affinity/circle/green/satellite.svg +6 -0
  807. gns3server/symbols/affinity/circle/green/satellite_dish.svg +7 -0
  808. gns3server/symbols/affinity/circle/green/scull.svg +8 -0
  809. gns3server/symbols/affinity/circle/green/server.svg +5 -0
  810. gns3server/symbols/affinity/circle/green/server_cluster.svg +7 -0
  811. gns3server/symbols/affinity/circle/green/shield.svg +7 -0
  812. gns3server/symbols/affinity/circle/green/statistics.svg +7 -0
  813. gns3server/symbols/affinity/circle/green/storage.svg +5 -0
  814. gns3server/symbols/affinity/circle/green/switch.svg +8 -0
  815. gns3server/symbols/affinity/circle/green/switch_multilayer.svg +5 -0
  816. gns3server/symbols/affinity/circle/green/tablet.svg +11 -0
  817. gns3server/symbols/affinity/circle/green/template.svg +4 -0
  818. gns3server/symbols/affinity/circle/green/tree.svg +5 -0
  819. gns3server/symbols/affinity/circle/green/user.svg +7 -0
  820. gns3server/symbols/affinity/circle/green/virtualbox.svg +7 -0
  821. gns3server/symbols/affinity/circle/green/vm.svg +7 -0
  822. gns3server/symbols/affinity/circle/green/vmware.svg +7 -0
  823. gns3server/symbols/affinity/circle/green/vrf.svg +8 -0
  824. gns3server/symbols/affinity/circle/green/wifi.svg +5 -0
  825. gns3server/symbols/affinity/circle/green/wlc.svg +5 -0
  826. gns3server/symbols/affinity/circle/green/xml.svg +5 -0
  827. gns3server/symbols/affinity/circle/red/atm.svg +5 -0
  828. gns3server/symbols/affinity/circle/red/bug.svg +8 -0
  829. gns3server/symbols/affinity/circle/red/camera.svg +5 -0
  830. gns3server/symbols/affinity/circle/red/camera_dome.svg +8 -0
  831. gns3server/symbols/affinity/circle/red/client.svg +5 -0
  832. gns3server/symbols/affinity/circle/red/client_vm.svg +6 -0
  833. gns3server/symbols/affinity/circle/red/cloud.svg +5 -0
  834. gns3server/symbols/affinity/circle/red/coffee.svg +6 -0
  835. gns3server/symbols/affinity/circle/red/cog.svg +5 -0
  836. gns3server/symbols/affinity/circle/red/communications.svg +5 -0
  837. gns3server/symbols/affinity/circle/red/conversation.svg +12 -0
  838. gns3server/symbols/affinity/circle/red/dna.svg +7 -0
  839. gns3server/symbols/affinity/circle/red/dna2.svg +7 -0
  840. gns3server/symbols/affinity/circle/red/docker.svg +11 -0
  841. gns3server/symbols/affinity/circle/red/dslam.svg +5 -0
  842. gns3server/symbols/affinity/circle/red/factory.svg +6 -0
  843. gns3server/symbols/affinity/circle/red/fingerprint.svg +5 -0
  844. gns3server/symbols/affinity/circle/red/firewall.svg +5 -0
  845. gns3server/symbols/affinity/circle/red/firewall3.svg +5 -0
  846. gns3server/symbols/affinity/circle/red/globe.svg +5 -0
  847. gns3server/symbols/affinity/circle/red/grid.svg +5 -0
  848. gns3server/symbols/affinity/circle/red/grid2.svg +5 -0
  849. gns3server/symbols/affinity/circle/red/health.svg +5 -0
  850. gns3server/symbols/affinity/circle/red/house.svg +9 -0
  851. gns3server/symbols/affinity/circle/red/hub.svg +5 -0
  852. gns3server/symbols/affinity/circle/red/inspect.svg +7 -0
  853. gns3server/symbols/affinity/circle/red/inspect2.svg +6 -0
  854. gns3server/symbols/affinity/circle/red/interconnect.svg +5 -0
  855. gns3server/symbols/affinity/circle/red/ip_phone.svg +21 -0
  856. gns3server/symbols/affinity/circle/red/isdn.svg +5 -0
  857. gns3server/symbols/affinity/circle/red/laptop.svg +6 -0
  858. gns3server/symbols/affinity/circle/red/ldap.svg +5 -0
  859. gns3server/symbols/affinity/circle/red/light_bulb.svg +11 -0
  860. gns3server/symbols/affinity/circle/red/link.svg +5 -0
  861. gns3server/symbols/affinity/circle/red/loadbalancer.svg +5 -0
  862. gns3server/symbols/affinity/circle/red/nas.svg +5 -0
  863. gns3server/symbols/affinity/circle/red/nat.svg +60 -0
  864. gns3server/symbols/affinity/circle/red/nat2.svg +55 -0
  865. gns3server/symbols/affinity/circle/red/office.svg +5 -0
  866. gns3server/symbols/affinity/circle/red/optical.svg +8 -0
  867. gns3server/symbols/affinity/circle/red/phone_cloud.svg +6 -0
  868. gns3server/symbols/affinity/circle/red/phone_old.svg +5 -0
  869. gns3server/symbols/affinity/circle/red/phone_wireless.svg +8 -0
  870. gns3server/symbols/affinity/circle/red/pinpoint.svg +5 -0
  871. gns3server/symbols/affinity/circle/red/printer.svg +7 -0
  872. gns3server/symbols/affinity/circle/red/rj45.svg +5 -0
  873. gns3server/symbols/affinity/circle/red/router.svg +5 -0
  874. gns3server/symbols/affinity/circle/red/router2.svg +5 -0
  875. gns3server/symbols/affinity/circle/red/router_cloud.svg +6 -0
  876. gns3server/symbols/affinity/circle/red/satellite.svg +6 -0
  877. gns3server/symbols/affinity/circle/red/satellite_dish.svg +7 -0
  878. gns3server/symbols/affinity/circle/red/scull.svg +8 -0
  879. gns3server/symbols/affinity/circle/red/server.svg +5 -0
  880. gns3server/symbols/affinity/circle/red/server_cluster.svg +7 -0
  881. gns3server/symbols/affinity/circle/red/shield.svg +7 -0
  882. gns3server/symbols/affinity/circle/red/statistics.svg +7 -0
  883. gns3server/symbols/affinity/circle/red/storage.svg +5 -0
  884. gns3server/symbols/affinity/circle/red/switch.svg +8 -0
  885. gns3server/symbols/affinity/circle/red/switch_multilayer.svg +5 -0
  886. gns3server/symbols/affinity/circle/red/tablet.svg +11 -0
  887. gns3server/symbols/affinity/circle/red/template.svg +4 -0
  888. gns3server/symbols/affinity/circle/red/tree.svg +5 -0
  889. gns3server/symbols/affinity/circle/red/user.svg +7 -0
  890. gns3server/symbols/affinity/circle/red/virtualbox.svg +7 -0
  891. gns3server/symbols/affinity/circle/red/vm.svg +7 -0
  892. gns3server/symbols/affinity/circle/red/vmware.svg +7 -0
  893. gns3server/symbols/affinity/circle/red/vrf.svg +8 -0
  894. gns3server/symbols/affinity/circle/red/wifi.svg +5 -0
  895. gns3server/symbols/affinity/circle/red/wlc.svg +5 -0
  896. gns3server/symbols/affinity/circle/red/xml.svg +5 -0
  897. gns3server/symbols/affinity/square/blue/atm.svg +5 -0
  898. gns3server/symbols/affinity/square/blue/bug.svg +5 -0
  899. gns3server/symbols/affinity/square/blue/camera.svg +12 -0
  900. gns3server/symbols/affinity/square/blue/camera_dome.svg +8 -0
  901. gns3server/symbols/affinity/square/blue/client.svg +8 -0
  902. gns3server/symbols/affinity/square/blue/client_vm.svg +8 -0
  903. gns3server/symbols/affinity/square/blue/cloud.svg +12 -0
  904. gns3server/symbols/affinity/square/blue/coffee.svg +5 -0
  905. gns3server/symbols/affinity/square/blue/cog.svg +8 -0
  906. gns3server/symbols/affinity/square/blue/communications.svg +8 -0
  907. gns3server/symbols/affinity/square/blue/conversation.svg +12 -0
  908. gns3server/symbols/affinity/square/blue/dna.svg +7 -0
  909. gns3server/symbols/affinity/square/blue/dna2.svg +7 -0
  910. gns3server/symbols/affinity/square/blue/docker.svg +11 -0
  911. gns3server/symbols/affinity/square/blue/dslam.svg +8 -0
  912. gns3server/symbols/affinity/square/blue/factory.svg +5 -0
  913. gns3server/symbols/affinity/square/blue/fingerprint.svg +9 -0
  914. gns3server/symbols/affinity/square/blue/firewall.svg +7 -0
  915. gns3server/symbols/affinity/square/blue/firewall3.svg +6 -0
  916. gns3server/symbols/affinity/square/blue/globe.svg +5 -0
  917. gns3server/symbols/affinity/square/blue/grid.svg +7 -0
  918. gns3server/symbols/affinity/square/blue/grid2.svg +7 -0
  919. gns3server/symbols/affinity/square/blue/health.svg +5 -0
  920. gns3server/symbols/affinity/square/blue/house.svg +6 -0
  921. gns3server/symbols/affinity/square/blue/hub.svg +7 -0
  922. gns3server/symbols/affinity/square/blue/inspect.svg +5 -0
  923. gns3server/symbols/affinity/square/blue/inspect2.svg +9 -0
  924. gns3server/symbols/affinity/square/blue/interconnect.svg +8 -0
  925. gns3server/symbols/affinity/square/blue/ip_phone.svg +23 -0
  926. gns3server/symbols/affinity/square/blue/isdn.svg +7 -0
  927. gns3server/symbols/affinity/square/blue/laptop.svg +8 -0
  928. gns3server/symbols/affinity/square/blue/ldap.svg +5 -0
  929. gns3server/symbols/affinity/square/blue/light_bulb.svg +11 -0
  930. gns3server/symbols/affinity/square/blue/link.svg +5 -0
  931. gns3server/symbols/affinity/square/blue/loadbalancer.svg +5 -0
  932. gns3server/symbols/affinity/square/blue/nas.svg +7 -0
  933. gns3server/symbols/affinity/square/blue/nat.svg +58 -0
  934. gns3server/symbols/affinity/square/blue/nat2.svg +74 -0
  935. gns3server/symbols/affinity/square/blue/office.svg +5 -0
  936. gns3server/symbols/affinity/square/blue/optical.svg +8 -0
  937. gns3server/symbols/affinity/square/blue/phone_cloud.svg +8 -0
  938. gns3server/symbols/affinity/square/blue/phone_old.svg +7 -0
  939. gns3server/symbols/affinity/square/blue/phone_wireless.svg +10 -0
  940. gns3server/symbols/affinity/square/blue/pinpoint.svg +9 -0
  941. gns3server/symbols/affinity/square/blue/printer.svg +27 -0
  942. gns3server/symbols/affinity/square/blue/rj45.svg +14 -0
  943. gns3server/symbols/affinity/square/blue/router.svg +7 -0
  944. gns3server/symbols/affinity/square/blue/router2.svg +5 -0
  945. gns3server/symbols/affinity/square/blue/router_cloud.svg +7 -0
  946. gns3server/symbols/affinity/square/blue/satellite.svg +8 -0
  947. gns3server/symbols/affinity/square/blue/satellite_dish.svg +7 -0
  948. gns3server/symbols/affinity/square/blue/scull.svg +10 -0
  949. gns3server/symbols/affinity/square/blue/server.svg +5 -0
  950. gns3server/symbols/affinity/square/blue/server_cluster.svg +9 -0
  951. gns3server/symbols/affinity/square/blue/shield.svg +5 -0
  952. gns3server/symbols/affinity/square/blue/statistics.svg +7 -0
  953. gns3server/symbols/affinity/square/blue/storage.svg +7 -0
  954. gns3server/symbols/affinity/square/blue/switch.svg +10 -0
  955. gns3server/symbols/affinity/square/blue/switch_multilayer.svg +8 -0
  956. gns3server/symbols/affinity/square/blue/tablet.svg +9 -0
  957. gns3server/symbols/affinity/square/blue/template.svg +4 -0
  958. gns3server/symbols/affinity/square/blue/tree.svg +5 -0
  959. gns3server/symbols/affinity/square/blue/user.svg +7 -0
  960. gns3server/symbols/affinity/square/blue/virtualbox.svg +7 -0
  961. gns3server/symbols/affinity/square/blue/vm.svg +7 -0
  962. gns3server/symbols/affinity/square/blue/vmware.svg +7 -0
  963. gns3server/symbols/affinity/square/blue/vrf.svg +5 -0
  964. gns3server/symbols/affinity/square/blue/wifi.svg +13 -0
  965. gns3server/symbols/affinity/square/blue/wlc.svg +7 -0
  966. gns3server/symbols/affinity/square/blue/xml.svg +10 -0
  967. gns3server/symbols/affinity/square/gray/atm.svg +5 -0
  968. gns3server/symbols/affinity/square/gray/bug.svg +5 -0
  969. gns3server/symbols/affinity/square/gray/camera.svg +12 -0
  970. gns3server/symbols/affinity/square/gray/camera_dome.svg +8 -0
  971. gns3server/symbols/affinity/square/gray/client.svg +8 -0
  972. gns3server/symbols/affinity/square/gray/client_vm.svg +8 -0
  973. gns3server/symbols/affinity/square/gray/cloud.svg +12 -0
  974. gns3server/symbols/affinity/square/gray/coffee.svg +5 -0
  975. gns3server/symbols/affinity/square/gray/cog.svg +8 -0
  976. gns3server/symbols/affinity/square/gray/communications.svg +8 -0
  977. gns3server/symbols/affinity/square/gray/conversation.svg +12 -0
  978. gns3server/symbols/affinity/square/gray/dna.svg +7 -0
  979. gns3server/symbols/affinity/square/gray/dna2.svg +7 -0
  980. gns3server/symbols/affinity/square/gray/docker.svg +11 -0
  981. gns3server/symbols/affinity/square/gray/dslam.svg +8 -0
  982. gns3server/symbols/affinity/square/gray/factory.svg +5 -0
  983. gns3server/symbols/affinity/square/gray/fingerprint.svg +9 -0
  984. gns3server/symbols/affinity/square/gray/firewall.svg +7 -0
  985. gns3server/symbols/affinity/square/gray/firewall3.svg +6 -0
  986. gns3server/symbols/affinity/square/gray/globe.svg +5 -0
  987. gns3server/symbols/affinity/square/gray/grid.svg +7 -0
  988. gns3server/symbols/affinity/square/gray/grid2.svg +7 -0
  989. gns3server/symbols/affinity/square/gray/health.svg +5 -0
  990. gns3server/symbols/affinity/square/gray/house.svg +6 -0
  991. gns3server/symbols/affinity/square/gray/hub.svg +7 -0
  992. gns3server/symbols/affinity/square/gray/inspect.svg +5 -0
  993. gns3server/symbols/affinity/square/gray/inspect2.svg +9 -0
  994. gns3server/symbols/affinity/square/gray/interconnect.svg +8 -0
  995. gns3server/symbols/affinity/square/gray/ip_phone.svg +23 -0
  996. gns3server/symbols/affinity/square/gray/isdn.svg +7 -0
  997. gns3server/symbols/affinity/square/gray/laptop.svg +8 -0
  998. gns3server/symbols/affinity/square/gray/ldap.svg +5 -0
  999. gns3server/symbols/affinity/square/gray/light_bulb.svg +11 -0
  1000. gns3server/symbols/affinity/square/gray/link.svg +5 -0
  1001. gns3server/symbols/affinity/square/gray/loadbalancer.svg +5 -0
  1002. gns3server/symbols/affinity/square/gray/nas.svg +7 -0
  1003. gns3server/symbols/affinity/square/gray/nat.svg +58 -0
  1004. gns3server/symbols/affinity/square/gray/nat2.svg +74 -0
  1005. gns3server/symbols/affinity/square/gray/office.svg +5 -0
  1006. gns3server/symbols/affinity/square/gray/optical.svg +8 -0
  1007. gns3server/symbols/affinity/square/gray/phone_cloud.svg +8 -0
  1008. gns3server/symbols/affinity/square/gray/phone_old.svg +7 -0
  1009. gns3server/symbols/affinity/square/gray/phone_wireless.svg +10 -0
  1010. gns3server/symbols/affinity/square/gray/pinpoint.svg +9 -0
  1011. gns3server/symbols/affinity/square/gray/printer.svg +27 -0
  1012. gns3server/symbols/affinity/square/gray/rj45.svg +14 -0
  1013. gns3server/symbols/affinity/square/gray/router.svg +7 -0
  1014. gns3server/symbols/affinity/square/gray/router2.svg +5 -0
  1015. gns3server/symbols/affinity/square/gray/router_cloud.svg +7 -0
  1016. gns3server/symbols/affinity/square/gray/satellite.svg +8 -0
  1017. gns3server/symbols/affinity/square/gray/satellite_dish.svg +7 -0
  1018. gns3server/symbols/affinity/square/gray/scull.svg +10 -0
  1019. gns3server/symbols/affinity/square/gray/server.svg +5 -0
  1020. gns3server/symbols/affinity/square/gray/server_cluster.svg +9 -0
  1021. gns3server/symbols/affinity/square/gray/shield.svg +5 -0
  1022. gns3server/symbols/affinity/square/gray/statistics.svg +7 -0
  1023. gns3server/symbols/affinity/square/gray/storage.svg +5 -0
  1024. gns3server/symbols/affinity/square/gray/switch.svg +10 -0
  1025. gns3server/symbols/affinity/square/gray/switch_multilayer.svg +9 -0
  1026. gns3server/symbols/affinity/square/gray/tablet.svg +9 -0
  1027. gns3server/symbols/affinity/square/gray/template.svg +4 -0
  1028. gns3server/symbols/affinity/square/gray/tree.svg +5 -0
  1029. gns3server/symbols/affinity/square/gray/user.svg +7 -0
  1030. gns3server/symbols/affinity/square/gray/virtualbox.svg +7 -0
  1031. gns3server/symbols/affinity/square/gray/vm.svg +7 -0
  1032. gns3server/symbols/affinity/square/gray/vmware.svg +7 -0
  1033. gns3server/symbols/affinity/square/gray/vrf.svg +5 -0
  1034. gns3server/symbols/affinity/square/gray/wifi.svg +13 -0
  1035. gns3server/symbols/affinity/square/gray/wlc.svg +7 -0
  1036. gns3server/symbols/affinity/square/gray/xml.svg +10 -0
  1037. gns3server/symbols/affinity/square/green/atm.svg +5 -0
  1038. gns3server/symbols/affinity/square/green/bug.svg +5 -0
  1039. gns3server/symbols/affinity/square/green/camera.svg +5 -0
  1040. gns3server/symbols/affinity/square/green/camera_dome.svg +8 -0
  1041. gns3server/symbols/affinity/square/green/client.svg +5 -0
  1042. gns3server/symbols/affinity/square/green/client_vm.svg +6 -0
  1043. gns3server/symbols/affinity/square/green/cloud.svg +12 -0
  1044. gns3server/symbols/affinity/square/green/coffee.svg +5 -0
  1045. gns3server/symbols/affinity/square/green/cog.svg +5 -0
  1046. gns3server/symbols/affinity/square/green/communications.svg +5 -0
  1047. gns3server/symbols/affinity/square/green/conversation.svg +12 -0
  1048. gns3server/symbols/affinity/square/green/dna.svg +7 -0
  1049. gns3server/symbols/affinity/square/green/dna2.svg +7 -0
  1050. gns3server/symbols/affinity/square/green/docker.svg +11 -0
  1051. gns3server/symbols/affinity/square/green/dslam.svg +5 -0
  1052. gns3server/symbols/affinity/square/green/factory.svg +5 -0
  1053. gns3server/symbols/affinity/square/green/fingerprint.svg +5 -0
  1054. gns3server/symbols/affinity/square/green/firewall.svg +5 -0
  1055. gns3server/symbols/affinity/square/green/firewall3.svg +5 -0
  1056. gns3server/symbols/affinity/square/green/globe.svg +5 -0
  1057. gns3server/symbols/affinity/square/green/grid.svg +5 -0
  1058. gns3server/symbols/affinity/square/green/grid2.svg +5 -0
  1059. gns3server/symbols/affinity/square/green/health.svg +5 -0
  1060. gns3server/symbols/affinity/square/green/house.svg +6 -0
  1061. gns3server/symbols/affinity/square/green/hub.svg +5 -0
  1062. gns3server/symbols/affinity/square/green/inspect.svg +5 -0
  1063. gns3server/symbols/affinity/square/green/inspect2.svg +5 -0
  1064. gns3server/symbols/affinity/square/green/interconnect.svg +5 -0
  1065. gns3server/symbols/affinity/square/green/ip_phone.svg +7 -0
  1066. gns3server/symbols/affinity/square/green/isdn.svg +5 -0
  1067. gns3server/symbols/affinity/square/green/laptop.svg +8 -0
  1068. gns3server/symbols/affinity/square/green/ldap.svg +5 -0
  1069. gns3server/symbols/affinity/square/green/light_bulb.svg +5 -0
  1070. gns3server/symbols/affinity/square/green/link.svg +5 -0
  1071. gns3server/symbols/affinity/square/green/loadbalancer.svg +5 -0
  1072. gns3server/symbols/affinity/square/green/nas.svg +5 -0
  1073. gns3server/symbols/affinity/square/green/nat.svg +58 -0
  1074. gns3server/symbols/affinity/square/green/nat2.svg +74 -0
  1075. gns3server/symbols/affinity/square/green/office.svg +5 -0
  1076. gns3server/symbols/affinity/square/green/optical.svg +8 -0
  1077. gns3server/symbols/affinity/square/green/phone_cloud.svg +6 -0
  1078. gns3server/symbols/affinity/square/green/phone_old.svg +5 -0
  1079. gns3server/symbols/affinity/square/green/phone_wireless.svg +5 -0
  1080. gns3server/symbols/affinity/square/green/pinpoint.svg +5 -0
  1081. gns3server/symbols/affinity/square/green/printer.svg +27 -0
  1082. gns3server/symbols/affinity/square/green/rj45.svg +5 -0
  1083. gns3server/symbols/affinity/square/green/router.svg +5 -0
  1084. gns3server/symbols/affinity/square/green/router2.svg +5 -0
  1085. gns3server/symbols/affinity/square/green/router_cloud.svg +6 -0
  1086. gns3server/symbols/affinity/square/green/satellite.svg +5 -0
  1087. gns3server/symbols/affinity/square/green/satellite_dish.svg +5 -0
  1088. gns3server/symbols/affinity/square/green/scull.svg +8 -0
  1089. gns3server/symbols/affinity/square/green/server.svg +5 -0
  1090. gns3server/symbols/affinity/square/green/server_cluster.svg +7 -0
  1091. gns3server/symbols/affinity/square/green/shield.svg +5 -0
  1092. gns3server/symbols/affinity/square/green/statistics.svg +5 -0
  1093. gns3server/symbols/affinity/square/green/storage.svg +5 -0
  1094. gns3server/symbols/affinity/square/green/switch.svg +10 -0
  1095. gns3server/symbols/affinity/square/green/switch_multilayer.svg +5 -0
  1096. gns3server/symbols/affinity/square/green/tablet.svg +9 -0
  1097. gns3server/symbols/affinity/square/green/template.svg +4 -0
  1098. gns3server/symbols/affinity/square/green/tree.svg +5 -0
  1099. gns3server/symbols/affinity/square/green/user.svg +7 -0
  1100. gns3server/symbols/affinity/square/green/virtualbox.svg +7 -0
  1101. gns3server/symbols/affinity/square/green/vm.svg +7 -0
  1102. gns3server/symbols/affinity/square/green/vmware.svg +7 -0
  1103. gns3server/symbols/affinity/square/green/vrf.svg +5 -0
  1104. gns3server/symbols/affinity/square/green/wifi.svg +5 -0
  1105. gns3server/symbols/affinity/square/green/wlc.svg +5 -0
  1106. gns3server/symbols/affinity/square/green/xml.svg +5 -0
  1107. gns3server/symbols/affinity/square/red/atm.svg +5 -0
  1108. gns3server/symbols/affinity/square/red/bug.svg +5 -0
  1109. gns3server/symbols/affinity/square/red/camera.svg +12 -0
  1110. gns3server/symbols/affinity/square/red/camera_dome.svg +8 -0
  1111. gns3server/symbols/affinity/square/red/client.svg +8 -0
  1112. gns3server/symbols/affinity/square/red/client_vm.svg +8 -0
  1113. gns3server/symbols/affinity/square/red/cloud.svg +12 -0
  1114. gns3server/symbols/affinity/square/red/coffee.svg +5 -0
  1115. gns3server/symbols/affinity/square/red/cog.svg +8 -0
  1116. gns3server/symbols/affinity/square/red/communications.svg +8 -0
  1117. gns3server/symbols/affinity/square/red/conversation.svg +12 -0
  1118. gns3server/symbols/affinity/square/red/dna.svg +7 -0
  1119. gns3server/symbols/affinity/square/red/dna2.svg +7 -0
  1120. gns3server/symbols/affinity/square/red/docker.svg +11 -0
  1121. gns3server/symbols/affinity/square/red/dslam.svg +8 -0
  1122. gns3server/symbols/affinity/square/red/factory.svg +5 -0
  1123. gns3server/symbols/affinity/square/red/fingerprint.svg +9 -0
  1124. gns3server/symbols/affinity/square/red/firewall.svg +7 -0
  1125. gns3server/symbols/affinity/square/red/firewall3.svg +5 -0
  1126. gns3server/symbols/affinity/square/red/globe.svg +5 -0
  1127. gns3server/symbols/affinity/square/red/grid.svg +7 -0
  1128. gns3server/symbols/affinity/square/red/grid2.svg +7 -0
  1129. gns3server/symbols/affinity/square/red/health.svg +5 -0
  1130. gns3server/symbols/affinity/square/red/house.svg +6 -0
  1131. gns3server/symbols/affinity/square/red/hub.svg +7 -0
  1132. gns3server/symbols/affinity/square/red/inspect.svg +5 -0
  1133. gns3server/symbols/affinity/square/red/inspect2.svg +9 -0
  1134. gns3server/symbols/affinity/square/red/interconnect.svg +8 -0
  1135. gns3server/symbols/affinity/square/red/ip_phone.svg +7 -0
  1136. gns3server/symbols/affinity/square/red/isdn.svg +7 -0
  1137. gns3server/symbols/affinity/square/red/laptop.svg +8 -0
  1138. gns3server/symbols/affinity/square/red/ldap.svg +5 -0
  1139. gns3server/symbols/affinity/square/red/light_bulb.svg +5 -0
  1140. gns3server/symbols/affinity/square/red/link.svg +5 -0
  1141. gns3server/symbols/affinity/square/red/loadbalancer.svg +5 -0
  1142. gns3server/symbols/affinity/square/red/nas.svg +7 -0
  1143. gns3server/symbols/affinity/square/red/nat.svg +58 -0
  1144. gns3server/symbols/affinity/square/red/nat2.svg +74 -0
  1145. gns3server/symbols/affinity/square/red/office.svg +5 -0
  1146. gns3server/symbols/affinity/square/red/optical.svg +8 -0
  1147. gns3server/symbols/affinity/square/red/phone_cloud.svg +6 -0
  1148. gns3server/symbols/affinity/square/red/phone_old.svg +5 -0
  1149. gns3server/symbols/affinity/square/red/phone_wireless.svg +5 -0
  1150. gns3server/symbols/affinity/square/red/pinpoint.svg +9 -0
  1151. gns3server/symbols/affinity/square/red/printer.svg +27 -0
  1152. gns3server/symbols/affinity/square/red/rj45.svg +14 -0
  1153. gns3server/symbols/affinity/square/red/router.svg +7 -0
  1154. gns3server/symbols/affinity/square/red/router2.svg +5 -0
  1155. gns3server/symbols/affinity/square/red/router_cloud.svg +6 -0
  1156. gns3server/symbols/affinity/square/red/satellite.svg +8 -0
  1157. gns3server/symbols/affinity/square/red/satellite_dish.svg +5 -0
  1158. gns3server/symbols/affinity/square/red/scull.svg +10 -0
  1159. gns3server/symbols/affinity/square/red/server.svg +5 -0
  1160. gns3server/symbols/affinity/square/red/server_cluster.svg +9 -0
  1161. gns3server/symbols/affinity/square/red/shield.svg +5 -0
  1162. gns3server/symbols/affinity/square/red/statistics.svg +5 -0
  1163. gns3server/symbols/affinity/square/red/storage.svg +7 -0
  1164. gns3server/symbols/affinity/square/red/switch.svg +10 -0
  1165. gns3server/symbols/affinity/square/red/switch_multilayer.svg +9 -0
  1166. gns3server/symbols/affinity/square/red/tablet.svg +9 -0
  1167. gns3server/symbols/affinity/square/red/template.svg +4 -0
  1168. gns3server/symbols/affinity/square/red/tree.svg +5 -0
  1169. gns3server/symbols/affinity/square/red/user.svg +7 -0
  1170. gns3server/symbols/affinity/square/red/virtualbox.svg +7 -0
  1171. gns3server/symbols/affinity/square/red/vm.svg +7 -0
  1172. gns3server/symbols/affinity/square/red/vmware.svg +7 -0
  1173. gns3server/symbols/affinity/square/red/vrf.svg +5 -0
  1174. gns3server/symbols/affinity/square/red/wifi.svg +13 -0
  1175. gns3server/symbols/affinity/square/red/wlc.svg +7 -0
  1176. gns3server/symbols/affinity/square/red/xml.svg +10 -0
  1177. gns3server/symbols/classic/PBX.svg +304 -0
  1178. gns3server/symbols/classic/PIX_firewall.svg +187 -0
  1179. gns3server/symbols/classic/access_point.svg +516 -0
  1180. gns3server/symbols/classic/access_server.svg +270 -0
  1181. gns3server/symbols/classic/asa.svg +424 -0
  1182. gns3server/symbols/classic/atm_bridge.svg +219 -0
  1183. gns3server/symbols/classic/atm_switch.svg +243 -0
  1184. gns3server/symbols/classic/call_manager.svg +228 -0
  1185. gns3server/symbols/classic/cloud.svg +163 -0
  1186. gns3server/symbols/classic/computer.svg +560 -0
  1187. gns3server/symbols/classic/docker_guest.svg +657 -0
  1188. gns3server/symbols/classic/dslam.svg +155 -0
  1189. gns3server/symbols/classic/edge_label_switch_router.svg +216 -0
  1190. gns3server/symbols/classic/ethernet_switch.svg +228 -0
  1191. gns3server/symbols/classic/firewall.svg +187 -0
  1192. gns3server/symbols/classic/frame_relay_switch.svg +263 -0
  1193. gns3server/symbols/classic/gateway.svg +309 -0
  1194. gns3server/symbols/classic/hub.svg +204 -0
  1195. gns3server/symbols/classic/ids.svg +310 -0
  1196. gns3server/symbols/classic/iosv_l2_virl.svg +286 -0
  1197. gns3server/symbols/classic/iosv_virl.svg +394 -0
  1198. gns3server/symbols/classic/ip_phone.svg +171 -0
  1199. gns3server/symbols/classic/label_switch_router.svg +223 -0
  1200. gns3server/symbols/classic/lightweight_ap.svg +536 -0
  1201. gns3server/symbols/classic/multilayer_switch.svg +317 -0
  1202. gns3server/symbols/classic/nat.svg +207 -0
  1203. gns3server/symbols/classic/optical_router.svg +207 -0
  1204. gns3server/symbols/classic/printer.svg +178 -0
  1205. gns3server/symbols/classic/qemu_guest.svg +1387 -0
  1206. gns3server/symbols/classic/route_switch_processor.svg +395 -0
  1207. gns3server/symbols/classic/router.awp.svg +362 -0
  1208. gns3server/symbols/classic/router.svg +203 -0
  1209. gns3server/symbols/classic/router_firewall.svg +395 -0
  1210. gns3server/symbols/classic/router_netflow.svg +215 -0
  1211. gns3server/symbols/classic/server.svg +226 -0
  1212. gns3server/symbols/classic/sip_server.svg +305 -0
  1213. gns3server/symbols/classic/traceng.svg +610 -0
  1214. gns3server/symbols/classic/vbox_guest.svg +7691 -0
  1215. gns3server/symbols/classic/vmware_guest.svg +572 -0
  1216. gns3server/symbols/classic/voice_access_server.svg +289 -0
  1217. gns3server/symbols/classic/voice_router.svg +223 -0
  1218. gns3server/symbols/classic/vpcs_guest.svg +574 -0
  1219. gns3server/symbols/classic/wlan_controller.svg +528 -0
  1220. gns3server/templates/compute.html +62 -0
  1221. gns3server/templates/controller.html +55 -0
  1222. gns3server/templates/index.html +12 -0
  1223. gns3server/templates/layout.html +20 -0
  1224. gns3server/templates/project.html +91 -0
  1225. gns3server/templates/upload.html +6 -0
  1226. gns3server/utils/__init__.py +123 -0
  1227. gns3server/utils/application_id.py +49 -0
  1228. gns3server/utils/asyncio/__init__.py +148 -0
  1229. gns3server/utils/asyncio/aiozipstream.py +528 -0
  1230. gns3server/utils/asyncio/embed_shell.py +369 -0
  1231. gns3server/utils/asyncio/input_stream.py +408 -0
  1232. gns3server/utils/asyncio/pool.py +69 -0
  1233. gns3server/utils/asyncio/raw_command_server.py +140 -0
  1234. gns3server/utils/asyncio/serial.py +87 -0
  1235. gns3server/utils/asyncio/telnet_server.py +450 -0
  1236. gns3server/utils/cpu_percent.py +46 -0
  1237. gns3server/utils/file_watcher.py +103 -0
  1238. gns3server/utils/get_resource.py +48 -0
  1239. gns3server/utils/hostname.py +112 -0
  1240. gns3server/utils/http_client.py +71 -0
  1241. gns3server/utils/images.py +378 -0
  1242. gns3server/utils/interfaces.py +254 -0
  1243. gns3server/utils/notification_queue.py +79 -0
  1244. gns3server/utils/path.py +76 -0
  1245. gns3server/utils/picture.py +146 -0
  1246. gns3server/utils/qt.py +44 -0
  1247. gns3server/utils/vmnet.py +277 -0
  1248. gns3server/utils/zipfile_zstd/__init__.py +10 -0
  1249. gns3server/utils/zipfile_zstd/_patcher.py +20 -0
  1250. gns3server/utils/zipfile_zstd/_zipfile.py +64 -0
  1251. gns3server/version.py +36 -0
@@ -0,0 +1,1482 @@
1
+ #
2
+ # Copyright (C) 2015 GNS3 Technologies Inc.
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ """
18
+ IOU VM management (creates command line, processes, files etc.) in
19
+ order to run an IOU VM.
20
+ """
21
+
22
+ import os
23
+ import socket
24
+ import re
25
+ import asyncio
26
+ import subprocess
27
+ import shutil
28
+ import configparser
29
+ import struct
30
+ import hashlib
31
+ import glob
32
+ import binascii
33
+ import functools
34
+
35
+ from .iou_error import IOUError
36
+ from ..adapters.ethernet_adapter import EthernetAdapter
37
+ from ..adapters.serial_adapter import SerialAdapter
38
+ from ..nios.nio_udp import NIOUDP
39
+ from ..base_node import BaseNode
40
+ from .utils.iou_import import nvram_import
41
+ from .utils.iou_export import nvram_export
42
+ from gns3server.compute.ubridge.ubridge_error import UbridgeError
43
+ from gns3server.utils.file_watcher import FileWatcher
44
+ from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
45
+ from gns3server.utils.hostname import is_ios_hostname_valid
46
+ from gns3server.utils.asyncio import locking
47
+ import gns3server.utils.asyncio
48
+ import gns3server.utils.images
49
+
50
+ import logging
51
+ import sys
52
+
53
+ log = logging.getLogger(__name__)
54
+
55
+
56
+ class IOUVM(BaseNode):
57
+ module_name = "iou"
58
+
59
+ """
60
+ IOU VM implementation.
61
+
62
+ :param name: IOU VM name
63
+ :param node_id: Node identifier
64
+ :param project: Project instance
65
+ :param manager: Manager instance
66
+ :param console: TCP console port
67
+ :param console_type: console type
68
+ """
69
+
70
+ def __init__(
71
+ self, name, node_id, project, manager, application_id=None, path=None, console=None, console_type="telnet"
72
+ ):
73
+
74
+ if not is_ios_hostname_valid(name):
75
+ raise IOUError(f"'{name}' is an invalid name to create an IOU node")
76
+
77
+ super().__init__(name, node_id, project, manager, console=console, console_type=console_type)
78
+
79
+ log.info(
80
+ 'IOU "{name}" [{id}]: assigned with application ID {application_id}'.format(
81
+ name=self._name, id=self._id, application_id=application_id
82
+ )
83
+ )
84
+
85
+ self._iou_process = None
86
+ self._telnet_server = None
87
+ self._iou_stdout_file = ""
88
+ self._started = False
89
+ self._nvram_watcher = None
90
+ self._path = self.manager.get_abs_image_path(path, project.path)
91
+ self._lib_base = self.manager.get_images_directory()
92
+ self._loader = None
93
+ self._license_check = True
94
+
95
+ # IOU settings
96
+ self._ethernet_adapters = []
97
+ self._serial_adapters = []
98
+ self.ethernet_adapters = 2 # one adapter = 4 interfaces
99
+ self.serial_adapters = 2 # one adapter = 4 interfaces
100
+ self._use_default_iou_values = True # for RAM & NVRAM values
101
+ self._nvram = 128 # Kilobytes
102
+ self._startup_config = ""
103
+ self._private_config = ""
104
+ self._ram = 256 # Megabytes
105
+ self._application_id = application_id
106
+ self._l1_keepalives = False # used to overcome the always-up Ethernet interfaces (not supported by all IOSes).
107
+
108
+ def _nvram_changed(self, path):
109
+ """
110
+ Called when the NVRAM file has changed
111
+ """
112
+ log.debug(f"NVRAM changed: {path}")
113
+ self.save_configs()
114
+ self.updated()
115
+
116
+ async def close(self):
117
+ """
118
+ Closes this IOU VM.
119
+ """
120
+
121
+ if not (await super().close()):
122
+ return False
123
+
124
+ adapters = self._ethernet_adapters + self._serial_adapters
125
+ for adapter in adapters:
126
+ if adapter is not None:
127
+ for nio in adapter.ports.values():
128
+ if nio and isinstance(nio, NIOUDP):
129
+ self.manager.port_manager.release_udp_port(nio.lport, self._project)
130
+
131
+ await self.stop()
132
+
133
+ @property
134
+ def path(self):
135
+ """
136
+ Path of the IOU executable.
137
+
138
+ :returns: path to the IOU image executable
139
+ """
140
+
141
+ return self._path
142
+
143
+ @path.setter
144
+ def path(self, path):
145
+ """
146
+ Path of the IOU executable.
147
+
148
+ :param path: path to the IOU image executable
149
+ """
150
+
151
+ self._path = self.manager.get_abs_image_path(path, self.project.path)
152
+ self._loader = None
153
+ log.info(f'IOU "{self._name}" [{self._id}]: IOU image updated to "{self._path}"')
154
+
155
+ @property
156
+ def use_default_iou_values(self):
157
+ """
158
+ Returns if this device uses the default IOU image values.
159
+
160
+ :returns: boolean
161
+ """
162
+
163
+ return self._use_default_iou_values
164
+
165
+ @use_default_iou_values.setter
166
+ def use_default_iou_values(self, state):
167
+ """
168
+ Sets if this device uses the default IOU image values.
169
+
170
+ :param state: boolean
171
+ """
172
+
173
+ self._use_default_iou_values = state
174
+ if state:
175
+ log.info(f'IOU "{self._name}" [{self._id}]: uses the default IOU image values')
176
+ else:
177
+ log.info(f'IOU "{self._name}" [{self._id}]: does not use the default IOU image values')
178
+
179
+ async def update_default_iou_values(self):
180
+ """
181
+ Finds the default RAM and NVRAM values for the IOU image.
182
+ """
183
+
184
+ await self._check_requirements()
185
+ try:
186
+ output = await gns3server.utils.asyncio.subprocess_check_output(
187
+ *self._loader, self._path, "-h", cwd=self.working_dir, stderr=True
188
+ )
189
+ match = re.search(r"-n <n>\s+Size of nvram in Kb \(default ([0-9]+)KB\)", output)
190
+ if match:
191
+ self.nvram = int(match.group(1))
192
+ match = re.search(r"-m <n>\s+Megabytes of router memory \(default ([0-9]+)MB\)", output)
193
+ if match:
194
+ self.ram = int(match.group(1))
195
+ except (ValueError, OSError, subprocess.SubprocessError) as e:
196
+ log.warning(f"could not find default RAM and NVRAM values for {os.path.basename(self._path)}: {e}")
197
+
198
+ async def create(self):
199
+
200
+ await self.update_default_iou_values()
201
+
202
+ async def _check_requirements(self):
203
+ """
204
+ Checks the IOU image.
205
+ """
206
+
207
+ if self._loader is not None:
208
+ return # image already checked
209
+ if not self._path:
210
+ raise IOUError("IOU image is not configured")
211
+ if not os.path.isfile(self._path) or not os.path.exists(self._path):
212
+ if os.path.islink(self._path):
213
+ raise IOUError(f"IOU image '{self._path}' linked to '{os.path.realpath(self._path)}' is not accessible")
214
+ else:
215
+ raise IOUError(f"IOU image '{self._path}' is not accessible")
216
+
217
+ try:
218
+ with open(self._path, "rb") as f:
219
+ # read the first 7 bytes of the file.
220
+ elf_header_start = f.read(7)
221
+ except OSError as e:
222
+ raise IOUError(f"Cannot read ELF header for IOU image '{self._path}': {e}")
223
+
224
+ # IOU images must start with the ELF magic number, be 32-bit or 64-bit, little endian
225
+ # and have an ELF version of 1 normal IOS image are big endian!
226
+ if elf_header_start != b"\x7fELF\x01\x01\x01" and elf_header_start != b"\x7fELF\x02\x01\x01":
227
+ raise IOUError(f"'{self._path}' is not a valid IOU image")
228
+
229
+ if not os.access(self._path, os.X_OK):
230
+ raise IOUError(f"IOU image '{self._path}' is not executable")
231
+
232
+ # set loader command
233
+ if elf_header_start[4] == 1:
234
+ # 32-bit loader
235
+ loader = os.path.join(self._lib_base, "lib", "ld-linux.so.2")
236
+ lib_path = (os.path.join(self._lib_base, "lib"),
237
+ os.path.join(self._lib_base, "lib", "i386-linux-gnu"))
238
+ else:
239
+ # 64-bit loader
240
+ loader = os.path.join(self._lib_base, "lib64", "ld-linux-x86-64.so.2")
241
+ lib_path = (os.path.join(self._lib_base, "lib64"),
242
+ os.path.join(self._lib_base, "lib", "x86_64-linux-gnu"))
243
+ self._loader = []
244
+ if os.path.isfile(loader):
245
+ try:
246
+ proc = await asyncio.create_subprocess_exec(loader, "--verify", self._path)
247
+ if await proc.wait() == 0:
248
+ self._loader = [loader, "--library-path", ":".join(lib_path)]
249
+ else:
250
+ log.warning(f"Loader {loader} incompatible with '{self._path}'")
251
+ except (OSError, subprocess.SubprocessError) as e:
252
+ log.warning(f"Could not use loader {loader}: {e}")
253
+
254
+ def asdict(self):
255
+
256
+ iou_vm_info = {
257
+ "name": self.name,
258
+ "usage": self.usage,
259
+ "node_id": self.id,
260
+ "node_directory": self.working_path,
261
+ "console": self._console,
262
+ "console_type": self._console_type,
263
+ "status": self.status,
264
+ "project_id": self.project.id,
265
+ "path": self.path,
266
+ "md5sum": gns3server.utils.images.md5sum(self.path, self.working_path),
267
+ "ethernet_adapters": len(self._ethernet_adapters),
268
+ "serial_adapters": len(self._serial_adapters),
269
+ "ram": self._ram,
270
+ "nvram": self._nvram,
271
+ "l1_keepalives": self._l1_keepalives,
272
+ "use_default_iou_values": self._use_default_iou_values,
273
+ "command_line": self.command_line,
274
+ "application_id": self.application_id,
275
+ }
276
+
277
+ iou_vm_info["path"] = self.manager.get_relative_image_path(self.path, self.project.path)
278
+ return iou_vm_info
279
+
280
+ @property
281
+ def iourc_path(self):
282
+ """
283
+ Returns the IOURC file path.
284
+
285
+ :returns: path to IOURC
286
+ """
287
+
288
+ iourc_path = self._manager.config.settings.IOU.iourc_path
289
+ if not iourc_path:
290
+ # look for the iourc file in the temporary dir.
291
+ path = os.path.join(self.temporary_directory, "iourc")
292
+ if os.path.exists(path):
293
+ return path
294
+ # look for the iourc file in the user home dir.
295
+ path = os.path.join(os.path.expanduser("~/"), ".iourc")
296
+ if os.path.exists(path):
297
+ return path
298
+ # look for the iourc file in the current working dir.
299
+ path = os.path.join(self.working_dir, "iourc")
300
+ if os.path.exists(path):
301
+ return path
302
+ return iourc_path
303
+
304
+ @property
305
+ def ram(self):
306
+ """
307
+ Returns the amount of RAM allocated to this IOU VM.
308
+
309
+ :returns: amount of RAM in MBytes (integer)
310
+ """
311
+
312
+ return self._ram
313
+
314
+ @ram.setter
315
+ def ram(self, ram):
316
+ """
317
+ Sets amount of RAM allocated to this IOU instance.
318
+
319
+ :param ram: amount of RAM in MBytes (integer)
320
+ """
321
+
322
+ if self._ram == ram:
323
+ return
324
+
325
+ log.info(
326
+ 'IOU "{name}" [{id}]: RAM updated from {old_ram}MB to {new_ram}MB'.format(
327
+ name=self._name, id=self._id, old_ram=self._ram, new_ram=ram
328
+ )
329
+ )
330
+
331
+ self._ram = ram
332
+
333
+ @property
334
+ def nvram(self):
335
+ """
336
+ Returns the mount of NVRAM allocated to this IOU instance.
337
+
338
+ :returns: amount of NVRAM in KBytes (integer)
339
+ """
340
+
341
+ return self._nvram
342
+
343
+ @nvram.setter
344
+ def nvram(self, nvram):
345
+ """
346
+ Sets amount of NVRAM allocated to this IOU instance.
347
+
348
+ :param nvram: amount of NVRAM in KBytes (integer)
349
+ """
350
+
351
+ if self._nvram == nvram:
352
+ return
353
+
354
+ log.info(
355
+ 'IOU "{name}" [{id}]: NVRAM updated from {old_nvram}KB to {new_nvram}KB'.format(
356
+ name=self._name, id=self._id, old_nvram=self._nvram, new_nvram=nvram
357
+ )
358
+ )
359
+ self._nvram = nvram
360
+
361
+ @BaseNode.name.setter
362
+ def name(self, new_name):
363
+ """
364
+ Sets the name of this IOU VM.
365
+
366
+ :param new_name: name
367
+ """
368
+
369
+ if not is_ios_hostname_valid(new_name):
370
+ raise IOUError(f"'{new_name}' is an invalid name to rename IOU node '{self._name}'")
371
+ if self.startup_config_file:
372
+ content = self.startup_config_content
373
+ content = re.sub(r"hostname .+$", "hostname " + new_name, content, flags=re.MULTILINE)
374
+ self.startup_config_content = content
375
+
376
+ super(IOUVM, IOUVM).name.__set__(self, new_name)
377
+
378
+ @property
379
+ def iourc_content(self):
380
+
381
+ try:
382
+ with open(os.path.join(self.temporary_directory, "iourc"), "rb") as f:
383
+ return f.read().decode("utf-8")
384
+ except OSError:
385
+ return None
386
+
387
+ @iourc_content.setter
388
+ def iourc_content(self, value):
389
+
390
+ if value:
391
+ # If we don't save the value in the ~/ the licence is lost at project
392
+ # reload
393
+ path = os.path.join(os.path.expanduser("~/"), ".iourc")
394
+ try:
395
+ with open(path, "wb") as f:
396
+ f.write(value.encode("utf-8"))
397
+ except OSError as e:
398
+ raise IOUError(f"Could not write the iourc file {path}: {e}")
399
+
400
+ path = os.path.join(self.temporary_directory, "iourc")
401
+ try:
402
+ with open(path, "wb") as f:
403
+ f.write(value.encode("utf-8"))
404
+ except OSError as e:
405
+ raise IOUError(f"Could not write the iourc file {path}: {e}")
406
+
407
+ @property
408
+ def license_check(self):
409
+
410
+ return self._license_check
411
+
412
+ @license_check.setter
413
+ def license_check(self, value):
414
+
415
+ self._license_check = value
416
+
417
+ async def _library_check(self):
418
+ """
419
+ Checks for missing shared library dependencies in the IOU image.
420
+ """
421
+
422
+ env = os.environ.copy()
423
+ env["LD_TRACE_LOADED_OBJECTS"] = "1"
424
+ try:
425
+ output = await gns3server.utils.asyncio.subprocess_check_output(*self._loader, self._path, env=env)
426
+ except (OSError, subprocess.SubprocessError) as e:
427
+ log.warning(f"Could not determine the shared library dependencies for {self._path}: {e}")
428
+ return
429
+
430
+ p = re.compile(r"([\.\w]+)\s=>\s+not found")
431
+ missing_libs = p.findall(output)
432
+ if missing_libs:
433
+ raise IOUError(
434
+ "The following shared library dependencies cannot be found for IOU image {}: {}".format(
435
+ self._path, ", ".join(missing_libs)
436
+ )
437
+ )
438
+
439
+ def _is_iou_license_check_enabled(self):
440
+ """
441
+ Returns if IOU license check is enabled.
442
+
443
+ :return: boolean
444
+ """
445
+
446
+ # license check is sent by the controller
447
+ if self.license_check is False:
448
+ return False
449
+
450
+ try:
451
+ # we allow license check to be disabled server wide
452
+ server_wide_license_check = self._manager.config.settings.IOU.license_check
453
+ except ValueError:
454
+ raise IOUError("Invalid licence check setting")
455
+
456
+ if server_wide_license_check is False:
457
+ log.warning("License check is explicitly disabled on this server")
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
+ """
466
+
467
+ config = configparser.ConfigParser()
468
+ try:
469
+ log.info(f"Checking IOU license in '{self.iourc_path}'")
470
+ with open(self.iourc_path, encoding="utf-8") as f:
471
+ config.read_file(f)
472
+ except OSError as e:
473
+ raise IOUError(f"Could not open iourc file {self.iourc_path}: {e}")
474
+ except configparser.Error as e:
475
+ raise IOUError(f"Could not parse iourc file {self.iourc_path}: {e}")
476
+ except UnicodeDecodeError as e:
477
+ raise IOUError(f"Non ascii characters in iourc file {self.iourc_path}, please remove them: {e}")
478
+ if "license" not in config:
479
+ raise IOUError(f"License section not found in iourc file {self.iourc_path}")
480
+ hostname = socket.gethostname()
481
+ if len(hostname) > 15:
482
+ log.warning(f"Older IOU images may not boot because hostname '{hostname}' length is above 15 characters")
483
+ if hostname not in config["license"]:
484
+ raise IOUError(f'Hostname "{hostname}" not found in iourc file {self.iourc_path}')
485
+ user_ioukey = config["license"][hostname]
486
+ if user_ioukey[-1:] != ";":
487
+ raise IOUError(f"IOU key not ending with ; in iourc file {self.iourc_path}")
488
+ if len(user_ioukey) != 17:
489
+ raise IOUError(f"IOU key length is not 16 characters in iourc file {self.iourc_path}")
490
+ user_ioukey = user_ioukey[:16]
491
+
492
+ # We can't test this because it's mean distributing a valid licence key
493
+ # in tests or generating one
494
+ if not hasattr(sys, "_called_from_test"):
495
+ try:
496
+ hostid = (await gns3server.utils.asyncio.subprocess_check_output("hostid")).strip()
497
+ except FileNotFoundError as e:
498
+ raise IOUError(f"Could not find hostid: {e}")
499
+ except (OSError, subprocess.SubprocessError) as e:
500
+ raise IOUError(f"Could not execute hostid: {e}")
501
+
502
+ try:
503
+ ioukey = int(hostid, 16)
504
+ except ValueError:
505
+ raise IOUError(f"Invalid hostid detected: {hostid}")
506
+ for x in hostname:
507
+ ioukey += ord(x)
508
+ pad1 = b"\x4B\x58\x21\x81\x56\x7B\x0D\xF3\x21\x43\x9B\x7E\xAC\x1D\xE6\x8A"
509
+ pad2 = b"\x80" + 39 * b"\0"
510
+ ioukey = hashlib.md5(pad1 + pad2 + struct.pack("!I", ioukey) + pad1).hexdigest()[:16]
511
+ if ioukey != user_ioukey:
512
+ raise IOUError(
513
+ "Invalid IOU license key {} detected in iourc file {} for host {}".format(
514
+ user_ioukey, self.iourc_path, hostname
515
+ )
516
+ )
517
+
518
+ def _nvram_file(self):
519
+ """
520
+ Path to the nvram file
521
+ """
522
+ return os.path.join(self.working_dir, f"nvram_{self.application_id:05d}")
523
+
524
+ def _push_configs_to_nvram(self):
525
+ """
526
+ Push the startup-config and private-config content to the NVRAM.
527
+ """
528
+
529
+ startup_config_content = self.startup_config_content
530
+ if startup_config_content:
531
+ nvram_file = self._nvram_file()
532
+ try:
533
+ if not os.path.exists(nvram_file):
534
+ open(nvram_file, "a").close()
535
+ nvram_content = None
536
+ else:
537
+ with open(nvram_file, "rb") as file:
538
+ nvram_content = file.read()
539
+ except OSError as e:
540
+ raise IOUError(f"Cannot read nvram file {nvram_file}: {e}")
541
+
542
+ startup_config_content = startup_config_content.encode("utf-8")
543
+ private_config_content = self.private_config_content
544
+ if private_config_content is not None:
545
+ private_config_content = private_config_content.encode("utf-8")
546
+ try:
547
+ nvram_content = nvram_import(nvram_content, startup_config_content, private_config_content, self.nvram)
548
+ except ValueError as e:
549
+ raise IOUError(f"Cannot push configs to nvram {nvram_file}: {e}")
550
+ try:
551
+ with open(nvram_file, "wb") as file:
552
+ file.write(nvram_content)
553
+ except OSError as e:
554
+ raise IOUError(f"Cannot write nvram file {nvram_file}: {e}")
555
+
556
+ async def start(self):
557
+ """
558
+ Starts the IOU process.
559
+ """
560
+
561
+ await self._check_requirements()
562
+ if not self.is_running():
563
+
564
+ await self._library_check()
565
+
566
+ try:
567
+ self._rename_nvram_file()
568
+ except OSError as e:
569
+ raise IOUError(f"Could not rename nvram files: {e}")
570
+
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()
579
+
580
+ await self._start_ubridge()
581
+ self._create_netmap_config()
582
+ if self.use_default_iou_values:
583
+ # make sure we have the default nvram amount to correctly push the configs
584
+ await self.update_default_iou_values()
585
+ self._push_configs_to_nvram()
586
+
587
+ # check if there is enough RAM to run
588
+ self.check_available_ram(self.ram)
589
+
590
+ self._nvram_watcher = FileWatcher(self._nvram_file(), self._nvram_changed, delay=2)
591
+
592
+ # created an environment variable pointing to the iourc file.
593
+ env = os.environ.copy()
594
+ if "IOURC" not in os.environ and iourc_path:
595
+ env["IOURC"] = iourc_path
596
+
597
+ # create a symbolic link to the image to avoid IOU error "failed code signing checks"
598
+ # on newer images, see https://github.com/GNS3/gns3-server/issues/1484
599
+ try:
600
+ iou_image_path = os.path.basename(self.path)
601
+ if len(iou_image_path) > 63:
602
+ # IOU file basename length must be <= 63 chars
603
+ iou_file_name, iou_file_ext = os.path.splitext(iou_image_path)
604
+ iou_image_path = iou_file_name[:63 - len(iou_file_ext)] + iou_file_ext
605
+ symlink = os.path.join(self.working_dir, iou_image_path)
606
+ if os.path.islink(symlink):
607
+ os.unlink(symlink)
608
+ os.symlink(self.path, symlink)
609
+ except OSError as e:
610
+ raise IOUError(f"Could not create symbolic link: {e}")
611
+
612
+ command = await self._build_command()
613
+ try:
614
+ if self._loader:
615
+ log.info(f"Starting IOU: {command} with loader {self._loader}")
616
+ else:
617
+ log.info(f"Starting IOU: {command}")
618
+ self.command_line = " ".join(command)
619
+ self._iou_process = await asyncio.create_subprocess_exec(
620
+ *self._loader, *command,
621
+ stdout=asyncio.subprocess.PIPE,
622
+ stdin=asyncio.subprocess.PIPE,
623
+ stderr=subprocess.STDOUT,
624
+ cwd=self.working_dir,
625
+ env=env,
626
+ )
627
+ log.info(f"IOU instance {self._id} started PID={self._iou_process.pid}")
628
+ self._started = True
629
+ self.status = "started"
630
+ callback = functools.partial(self._termination_callback, "IOU")
631
+ gns3server.utils.asyncio.monitor_process(self._iou_process, callback)
632
+ except FileNotFoundError as e:
633
+ raise IOUError(f"Could not start IOU: {e}: 32-bit binary support is probably not installed")
634
+ except (OSError, subprocess.SubprocessError) as e:
635
+ iou_stdout = self.read_iou_stdout()
636
+ log.error(f"Could not start IOU {self._path}: {e}\n{iou_stdout}")
637
+ raise IOUError(f"Could not start IOU {self._path}: {e}\n{iou_stdout}")
638
+
639
+ await self.start_console()
640
+
641
+ # configure networking support
642
+ await self._networking()
643
+
644
+ async def start_console(self):
645
+ """
646
+ Start the Telnet server to provide console access.
647
+ """
648
+
649
+ if self.console and self.console_type == "telnet":
650
+ server = AsyncioTelnetServer(
651
+ reader=self._iou_process.stdout, writer=self._iou_process.stdin, binary=True, echo=True
652
+ )
653
+ try:
654
+ self._telnet_server = await asyncio.start_server(
655
+ server.run, self._manager.port_manager.console_host, self.console
656
+ )
657
+ except OSError as e:
658
+ await self.stop()
659
+ raise IOUError(
660
+ "Could not start Telnet server on socket {}:{}: {}".format(
661
+ self._manager.port_manager.console_host, self.console, e
662
+ )
663
+ )
664
+
665
+ async def reset_console(self):
666
+ """
667
+ Reset the console.
668
+ """
669
+
670
+ if self._telnet_server:
671
+ self._telnet_server.close()
672
+ await self._telnet_server.wait_closed()
673
+ self._telnet_server = None
674
+ if self.is_running():
675
+ await self.start_console()
676
+
677
+ @locking
678
+ async def _networking(self):
679
+ """
680
+ Configures the IOL bridge in uBridge.
681
+ """
682
+
683
+ bridge_name = f"IOL-BRIDGE-{self.application_id + 512}"
684
+ try:
685
+ # delete any previous bridge if it exists
686
+ await self._ubridge_send(f"iol_bridge delete {bridge_name}")
687
+ except UbridgeError:
688
+ pass
689
+ await self._ubridge_send(f"iol_bridge create {bridge_name} {self.application_id + 512}")
690
+
691
+ bay_id = 0
692
+ for adapter in self._adapters:
693
+ unit_id = 0
694
+ for unit in adapter.ports.keys():
695
+ nio = adapter.get_nio(unit)
696
+ if nio and isinstance(nio, NIOUDP):
697
+ await self._ubridge_send(
698
+ "iol_bridge add_nio_udp {name} {iol_id} {bay} {unit} {lport} {rhost} {rport}".format(
699
+ name=bridge_name,
700
+ iol_id=self.application_id,
701
+ bay=bay_id,
702
+ unit=unit_id,
703
+ lport=nio.lport,
704
+ rhost=nio.rhost,
705
+ rport=nio.rport,
706
+ )
707
+ )
708
+ if nio.capturing:
709
+ await self._ubridge_send(
710
+ 'iol_bridge start_capture {name} "{output_file}" {data_link_type}'.format(
711
+ name=bridge_name,
712
+ output_file=nio.pcap_output_file,
713
+ data_link_type=re.sub(r"^DLT_", "", nio.pcap_data_link_type),
714
+ )
715
+ )
716
+
717
+ await self._ubridge_apply_filters(bay_id, unit_id, nio.filters)
718
+ unit_id += 1
719
+ bay_id += 1
720
+
721
+ await self._ubridge_send(f"iol_bridge start {bridge_name}")
722
+
723
+ def _termination_callback(self, process_name, returncode):
724
+ """
725
+ Called when the process has stopped.
726
+
727
+ :param returncode: Process returncode
728
+ """
729
+
730
+ self._terminate_process_iou()
731
+ if returncode != 0:
732
+ if returncode == -11:
733
+ message = 'IOU VM "{}" process has stopped with return code: {} (segfault). This could be an issue with the IOU image, using a different image may fix this.\n{}'.format(
734
+ self.name, returncode, self.read_iou_stdout()
735
+ )
736
+ else:
737
+ message = (
738
+ f'IOU VM "{self.name}" process has stopped with return code: {returncode}\n{self.read_iou_stdout()}'
739
+ )
740
+ log.warning(message)
741
+ self.project.emit("log.error", {"message": message})
742
+ if self._telnet_server:
743
+ self._telnet_server.close()
744
+ self._telnet_server = None
745
+
746
+ def _rename_nvram_file(self):
747
+ """
748
+ Before starting the VM, rename the nvram and vlan.dat files with the correct IOU application identifier.
749
+ """
750
+
751
+ destination = self._nvram_file()
752
+ for file_path in glob.glob(os.path.join(glob.escape(self.working_dir), "nvram_*")):
753
+ shutil.move(file_path, destination)
754
+ destination = os.path.join(self.working_dir, f"vlan.dat-{self.application_id:05d}")
755
+ for file_path in glob.glob(os.path.join(glob.escape(self.working_dir), "vlan.dat-*")):
756
+ shutil.move(file_path, destination)
757
+
758
+ async def stop(self):
759
+ """
760
+ Stops the IOU process.
761
+ """
762
+
763
+ await self._stop_ubridge()
764
+ if self._nvram_watcher:
765
+ self._nvram_watcher.close()
766
+ self._nvram_watcher = None
767
+
768
+ if self._telnet_server:
769
+ self._telnet_server.close()
770
+ self._telnet_server = None
771
+
772
+ if self.is_running():
773
+ self._terminate_process_iou()
774
+ if self._iou_process.returncode is None:
775
+ try:
776
+ await gns3server.utils.asyncio.wait_for_process_termination(self._iou_process, timeout=3)
777
+ except asyncio.TimeoutError:
778
+ if self._iou_process.returncode is None:
779
+ log.warning(f"IOU process {self._iou_process.pid} is still running... killing it")
780
+ try:
781
+ self._iou_process.kill()
782
+ except ProcessLookupError:
783
+ pass
784
+ self._iou_process = None
785
+
786
+ try:
787
+ symlink = os.path.join(self.working_dir, os.path.basename(self.path))
788
+ if os.path.islink(symlink):
789
+ os.unlink(symlink)
790
+ except OSError as e:
791
+ log.warning(f"Could not delete symbolic link: {e}")
792
+
793
+ self._started = False
794
+ self.save_configs()
795
+
796
+ def _terminate_process_iou(self):
797
+ """
798
+ Terminate the IOU process if running
799
+ """
800
+
801
+ if self._iou_process:
802
+ log.info(f'Stopping IOU process for IOU VM "{self.name}" PID={self._iou_process.pid}')
803
+ try:
804
+ self._iou_process.terminate()
805
+ # Sometime the process can already be dead when we garbage collect
806
+ except ProcessLookupError:
807
+ pass
808
+ self._started = False
809
+ self.status = "stopped"
810
+
811
+ async def reload(self):
812
+ """
813
+ Reloads the IOU process (stop & start).
814
+ """
815
+
816
+ await self.stop()
817
+ await self.start()
818
+
819
+ def is_running(self):
820
+ """
821
+ Checks if the IOU process is running
822
+
823
+ :returns: True or False
824
+ """
825
+
826
+ if self._iou_process and self._iou_process.returncode is None:
827
+ return True
828
+ return False
829
+
830
+ @BaseNode.console_type.setter
831
+ def console_type(self, new_console_type):
832
+ """
833
+ Sets the console type for this IOU VM.
834
+
835
+ :param new_console_type: console type (string)
836
+ """
837
+
838
+ if self.is_running() and self.console_type != new_console_type:
839
+ raise IOUError(f'"{self._name}" must be stopped to change the console type to {new_console_type}')
840
+
841
+ super(IOUVM, IOUVM).console_type.__set__(self, new_console_type)
842
+
843
+ def _create_netmap_config(self):
844
+ """
845
+ Creates the NETMAP file.
846
+ """
847
+
848
+ netmap_path = os.path.join(self.working_dir, "NETMAP")
849
+ try:
850
+ with open(netmap_path, "w", encoding="utf-8") as f:
851
+ for bay in range(0, 16):
852
+ for unit in range(0, 4):
853
+ f.write(
854
+ "{ubridge_id}:{bay}/{unit}{iou_id:>5d}:{bay}/{unit}\n".format(
855
+ ubridge_id=str(self.application_id + 512),
856
+ bay=bay,
857
+ unit=unit,
858
+ iou_id=self.application_id,
859
+ )
860
+ )
861
+ log.info("IOU {name} [id={id}]: NETMAP file created".format(name=self._name, id=self._id))
862
+ except OSError as e:
863
+ raise IOUError(f"Could not create {netmap_path}: {e}")
864
+
865
+ async def _build_command(self):
866
+ """
867
+ Command to start the IOU process.
868
+ (to be passed to subprocess.Popen())
869
+
870
+ IOU command line:
871
+ Usage: <image> [options] <application id>
872
+ <image>: unix-js-m | unix-is-m | unix-i-m | ...
873
+ <application id>: instance identifier (0 < id <= 1024)
874
+ Options:
875
+ -e <n> Number of Ethernet interfaces (default 2)
876
+ -s <n> Number of Serial interfaces (default 2)
877
+ -n <n> Size of nvram in Kb (default 64KB)
878
+ -b <string> IOS debug string
879
+ -c <name> Configuration file name
880
+ -d Generate debug information
881
+ -t Netio message trace
882
+ -q Suppress informational messages
883
+ -h Display this help
884
+ -C Turn off use of host clock
885
+ -m <n> Megabytes of router memory (default 256MB)
886
+ -L Disable local console, use remote console
887
+ -l Enable Layer 1 keepalive messages
888
+ -u <n> UDP port base for distributed networks
889
+ -R Ignore options from the IOURC file
890
+ -U Disable unix: file system location
891
+ -W Disable watchdog timer
892
+ -N Ignore the NETMAP file
893
+ """
894
+
895
+ command = [self._path]
896
+ if len(self._ethernet_adapters) != 2:
897
+ command.extend(["-e", str(len(self._ethernet_adapters))])
898
+ if len(self._serial_adapters) != 2:
899
+ command.extend(["-s", str(len(self._serial_adapters))])
900
+ if not self.use_default_iou_values:
901
+ command.extend(["-n", str(self._nvram)])
902
+ command.extend(["-m", str(self._ram)])
903
+
904
+ # do not let IOU create the NVRAM anymore
905
+ # startup_config_file = self.startup_config_file
906
+ # if startup_config_file:
907
+ # command.extend(["-c", os.path.basename(startup_config_file)])
908
+
909
+ if self._l1_keepalives:
910
+ await self._enable_l1_keepalives(command)
911
+ command.extend([str(self.application_id)])
912
+ return command
913
+
914
+ def read_iou_stdout(self):
915
+ """
916
+ Reads the standard output of the IOU process.
917
+ Only use when the process has been stopped or has crashed.
918
+ """
919
+
920
+ output = ""
921
+ if self._iou_stdout_file:
922
+ try:
923
+ with open(self._iou_stdout_file, "rb") as file:
924
+ output = file.read().decode("utf-8", errors="replace")
925
+ except OSError as e:
926
+ log.warning(f"could not read {self._iou_stdout_file}: {e}")
927
+ return output
928
+
929
+ @property
930
+ def adapters(self):
931
+ return self._adapters
932
+
933
+ @property
934
+ def ethernet_adapters(self):
935
+ """
936
+ Returns the number of Ethernet adapters for this IOU VM.
937
+
938
+ :returns: number of adapters
939
+ """
940
+
941
+ return len(self._ethernet_adapters)
942
+
943
+ @ethernet_adapters.setter
944
+ def ethernet_adapters(self, ethernet_adapters):
945
+ """
946
+ Sets the number of Ethernet adapters for this IOU VM.
947
+
948
+ :param ethernet_adapters: number of adapters
949
+ """
950
+
951
+ self._ethernet_adapters.clear()
952
+ for _ in range(0, ethernet_adapters):
953
+ self._ethernet_adapters.append(EthernetAdapter(interfaces=4))
954
+
955
+ log.info(
956
+ 'IOU "{name}" [{id}]: number of Ethernet adapters changed to {adapters}'.format(
957
+ name=self._name, id=self._id, adapters=len(self._ethernet_adapters)
958
+ )
959
+ )
960
+
961
+ self._adapters = self._ethernet_adapters + self._serial_adapters
962
+
963
+ @property
964
+ def serial_adapters(self):
965
+ """
966
+ Returns the number of Serial adapters for this IOU VM.
967
+
968
+ :returns: number of adapters
969
+ """
970
+
971
+ return len(self._serial_adapters)
972
+
973
+ @serial_adapters.setter
974
+ def serial_adapters(self, serial_adapters):
975
+ """
976
+ Sets the number of Serial adapters for this IOU VM.
977
+
978
+ :param serial_adapters: number of adapters
979
+ """
980
+
981
+ self._serial_adapters.clear()
982
+ for _ in range(0, serial_adapters):
983
+ self._serial_adapters.append(SerialAdapter(interfaces=4))
984
+
985
+ log.info(
986
+ 'IOU "{name}" [{id}]: number of Serial adapters changed to {adapters}'.format(
987
+ name=self._name, id=self._id, adapters=len(self._serial_adapters)
988
+ )
989
+ )
990
+
991
+ self._adapters = self._ethernet_adapters + self._serial_adapters
992
+
993
+ async def adapter_add_nio_binding(self, adapter_number, port_number, nio):
994
+ """
995
+ Adds an adapter NIO binding.
996
+
997
+ :param adapter_number: adapter number
998
+ :param port_number: port number
999
+ :param nio: NIO instance to add to the adapter/port
1000
+ """
1001
+
1002
+ try:
1003
+ adapter = self._adapters[adapter_number]
1004
+ except IndexError:
1005
+ raise IOUError(
1006
+ 'Adapter {adapter_number} does not exist for IOU "{name}"'.format(
1007
+ name=self._name, adapter_number=adapter_number
1008
+ )
1009
+ )
1010
+
1011
+ if not adapter.port_exists(port_number):
1012
+ raise IOUError(
1013
+ "Port {port_number} does not exist on adapter {adapter}".format(
1014
+ adapter=adapter, port_number=port_number
1015
+ )
1016
+ )
1017
+
1018
+ adapter.add_nio(port_number, nio)
1019
+ log.info(
1020
+ 'IOU "{name}" [{id}]: {nio} added to {adapter_number}/{port_number}'.format(
1021
+ name=self._name, id=self._id, nio=nio, adapter_number=adapter_number, port_number=port_number
1022
+ )
1023
+ )
1024
+
1025
+ if self.ubridge:
1026
+ bridge_name = f"IOL-BRIDGE-{self.application_id + 512}"
1027
+ await self._ubridge_send(
1028
+ "iol_bridge add_nio_udp {name} {iol_id} {bay} {unit} {lport} {rhost} {rport}".format(
1029
+ name=bridge_name,
1030
+ iol_id=self.application_id,
1031
+ bay=adapter_number,
1032
+ unit=port_number,
1033
+ lport=nio.lport,
1034
+ rhost=nio.rhost,
1035
+ rport=nio.rport,
1036
+ )
1037
+ )
1038
+ await self._ubridge_apply_filters(adapter_number, port_number, nio.filters)
1039
+
1040
+ async def adapter_update_nio_binding(self, adapter_number, port_number, nio):
1041
+ """
1042
+ Updates an adapter NIO binding.
1043
+
1044
+ :param adapter_number: adapter number
1045
+ :param port_number: port number
1046
+ :param nio: NIO instance to add to the adapter
1047
+ """
1048
+
1049
+ if self.ubridge:
1050
+ await self._ubridge_apply_filters(adapter_number, port_number, nio.filters)
1051
+
1052
+ async def _ubridge_apply_filters(self, adapter_number, port_number, filters):
1053
+ """
1054
+ Apply filter like rate limiting
1055
+
1056
+ :param adapter_number: adapter number
1057
+ :param port_number: port number
1058
+ :param filters: Array of filter dictionnary
1059
+ """
1060
+ bridge_name = f"IOL-BRIDGE-{self.application_id + 512}"
1061
+ location = "{bridge_name} {bay} {unit}".format(bridge_name=bridge_name, bay=adapter_number, unit=port_number)
1062
+ await self._ubridge_send("iol_bridge reset_packet_filters " + location)
1063
+ for filter in self._build_filter_list(filters):
1064
+ cmd = "iol_bridge add_packet_filter {} {}".format(location, filter)
1065
+ await self._ubridge_send(cmd)
1066
+
1067
+ async def adapter_remove_nio_binding(self, adapter_number, port_number):
1068
+ """
1069
+ Removes an adapter NIO binding.
1070
+
1071
+ :param adapter_number: adapter number
1072
+ :param port_number: port number
1073
+
1074
+ :returns: NIO instance
1075
+ """
1076
+
1077
+ try:
1078
+ adapter = self._adapters[adapter_number]
1079
+ except IndexError:
1080
+ raise IOUError(
1081
+ 'Adapter {adapter_number} does not exist on IOU "{name}"'.format(
1082
+ name=self._name, adapter_number=adapter_number
1083
+ )
1084
+ )
1085
+
1086
+ if not adapter.port_exists(port_number):
1087
+ raise IOUError(
1088
+ "Port {port_number} does not exist on adapter {adapter}".format(
1089
+ adapter=adapter, port_number=port_number
1090
+ )
1091
+ )
1092
+
1093
+ nio = adapter.get_nio(port_number)
1094
+ if isinstance(nio, NIOUDP):
1095
+ self.manager.port_manager.release_udp_port(nio.lport, self._project)
1096
+ adapter.remove_nio(port_number)
1097
+ log.info(
1098
+ 'IOU "{name}" [{id}]: {nio} removed from {adapter_number}/{port_number}'.format(
1099
+ name=self._name, id=self._id, nio=nio, adapter_number=adapter_number, port_number=port_number
1100
+ )
1101
+ )
1102
+
1103
+ if self.ubridge:
1104
+ bridge_name = f"IOL-BRIDGE-{self.application_id + 512}"
1105
+ await self._ubridge_send(
1106
+ "iol_bridge delete_nio_udp {name} {bay} {unit}".format(
1107
+ name=bridge_name, bay=adapter_number, unit=port_number
1108
+ )
1109
+ )
1110
+
1111
+ return nio
1112
+
1113
+ def get_nio(self, adapter_number, port_number):
1114
+ """
1115
+ Gets an adapter NIO binding.
1116
+
1117
+ :param adapter_number: adapter number
1118
+ :param port_number: port number
1119
+
1120
+ :returns: NIO instance
1121
+ """
1122
+
1123
+ try:
1124
+ adapter = self._adapters[adapter_number]
1125
+ except IndexError:
1126
+ raise IOUError(
1127
+ 'Adapter {adapter_number} does not exist on IOU "{name}"'.format(
1128
+ name=self._name, adapter_number=adapter_number
1129
+ )
1130
+ )
1131
+
1132
+ if not adapter.port_exists(port_number):
1133
+ raise IOUError(
1134
+ "Port {port_number} does not exist on adapter {adapter}".format(
1135
+ adapter=adapter, port_number=port_number
1136
+ )
1137
+ )
1138
+
1139
+ nio = adapter.get_nio(port_number)
1140
+
1141
+ if not nio:
1142
+ raise IOUError(
1143
+ "NIO {port_number} does not exist on adapter {adapter}".format(adapter=adapter, port_number=port_number)
1144
+ )
1145
+ return nio
1146
+
1147
+ @property
1148
+ def l1_keepalives(self):
1149
+ """
1150
+ Returns either layer 1 keepalive messages option is enabled or disabled.
1151
+
1152
+ :returns: boolean
1153
+ """
1154
+
1155
+ return self._l1_keepalives
1156
+
1157
+ @l1_keepalives.setter
1158
+ def l1_keepalives(self, state):
1159
+ """
1160
+ Enables or disables layer 1 keepalive messages.
1161
+
1162
+ :param state: boolean
1163
+ """
1164
+
1165
+ self._l1_keepalives = state
1166
+ if state:
1167
+ log.info(f'IOU "{self._name}" [{self._id}]: has activated layer 1 keepalive messages')
1168
+ else:
1169
+ log.info(f'IOU "{self._name}" [{self._id}]: has deactivated layer 1 keepalive messages')
1170
+
1171
+ async def _enable_l1_keepalives(self, command):
1172
+ """
1173
+ Enables L1 keepalive messages if supported.
1174
+
1175
+ :param command: command line
1176
+ """
1177
+
1178
+ env = os.environ.copy()
1179
+ if "IOURC" not in os.environ:
1180
+ env["IOURC"] = self.iourc_path
1181
+ try:
1182
+ output = await gns3server.utils.asyncio.subprocess_check_output(
1183
+ *self._loader, self._path, "-h", cwd=self.working_dir, env=env, stderr=True
1184
+ )
1185
+ if re.search(r"-l\s+Enable Layer 1 keepalive messages", output):
1186
+ command.extend(["-l"])
1187
+ else:
1188
+ raise IOUError(f"layer 1 keepalive messages are not supported by {os.path.basename(self._path)}")
1189
+ except (OSError, subprocess.SubprocessError) as e:
1190
+ log.warning(
1191
+ f"could not determine if layer 1 keepalive messages are supported by {os.path.basename(self._path)}: {e}"
1192
+ )
1193
+
1194
+ @property
1195
+ def startup_config_content(self):
1196
+ """
1197
+ Returns the content of the current startup-config file.
1198
+ """
1199
+
1200
+ config_file = self.startup_config_file
1201
+ if config_file is None:
1202
+ return None
1203
+
1204
+ try:
1205
+ with open(config_file, "rb") as f:
1206
+ return f.read().decode("utf-8", errors="replace")
1207
+ except OSError as e:
1208
+ raise IOUError(f"Can't read startup-config file '{config_file}': {e}")
1209
+
1210
+ @startup_config_content.setter
1211
+ def startup_config_content(self, startup_config):
1212
+ """
1213
+ Update the startup config
1214
+
1215
+ :param startup_config: content of the startup configuration file
1216
+ """
1217
+
1218
+ try:
1219
+ startup_config_path = os.path.join(self.working_dir, "startup-config.cfg")
1220
+
1221
+ if startup_config is None:
1222
+ startup_config = ""
1223
+
1224
+ # We disallow erasing the startup config file
1225
+ if len(startup_config) == 0 and os.path.exists(startup_config_path):
1226
+ return
1227
+
1228
+ with open(startup_config_path, "w+", encoding="utf-8") as f:
1229
+ if len(startup_config) == 0:
1230
+ f.write("")
1231
+ else:
1232
+ startup_config = startup_config.replace("%h", self._name)
1233
+ f.write(startup_config)
1234
+
1235
+ vlan_file = os.path.join(self.working_dir, f"vlan.dat-{self.application_id:05d}")
1236
+ if os.path.exists(vlan_file):
1237
+ try:
1238
+ os.remove(vlan_file)
1239
+ except OSError as e:
1240
+ log.error(f"Could not delete VLAN file '{vlan_file}': {e}")
1241
+
1242
+ except OSError as e:
1243
+ raise IOUError(f"Can't write startup-config file '{startup_config_path}': {e}")
1244
+
1245
+ @property
1246
+ def private_config_content(self):
1247
+ """
1248
+ Returns the content of the current private-config file.
1249
+ """
1250
+
1251
+ config_file = self.private_config_file
1252
+ if config_file is None:
1253
+ return None
1254
+
1255
+ try:
1256
+ with open(config_file, "rb") as f:
1257
+ return f.read().decode("utf-8", errors="replace")
1258
+ except OSError as e:
1259
+ raise IOUError(f"Can't read private-config file '{config_file}': {e}")
1260
+
1261
+ @private_config_content.setter
1262
+ def private_config_content(self, private_config):
1263
+ """
1264
+ Update the private config
1265
+
1266
+ :param private_config: content of the private configuration file
1267
+ """
1268
+
1269
+ try:
1270
+ private_config_path = os.path.join(self.working_dir, "private-config.cfg")
1271
+
1272
+ if private_config is None:
1273
+ private_config = ""
1274
+
1275
+ # We disallow erasing the private config file
1276
+ if len(private_config) == 0 and os.path.exists(private_config_path):
1277
+ return
1278
+
1279
+ with open(private_config_path, "w+", encoding="utf-8") as f:
1280
+ if len(private_config) == 0:
1281
+ f.write("")
1282
+ else:
1283
+ private_config = private_config.replace("%h", self._name)
1284
+ f.write(private_config)
1285
+ except OSError as e:
1286
+ raise IOUError(f"Can't write private-config file '{private_config_path}': {e}")
1287
+
1288
+ @property
1289
+ def startup_config_file(self):
1290
+ """
1291
+ Returns the startup-config file for this IOU VM.
1292
+
1293
+ :returns: path to config file. None if the file doesn't exist
1294
+ """
1295
+
1296
+ path = os.path.join(self.working_dir, "startup-config.cfg")
1297
+ if os.path.exists(path):
1298
+ return path
1299
+ else:
1300
+ return None
1301
+
1302
+ @property
1303
+ def private_config_file(self):
1304
+ """
1305
+ Returns the private-config file for this IOU VM.
1306
+
1307
+ :returns: path to config file. None if the file doesn't exist
1308
+ """
1309
+
1310
+ path = os.path.join(self.working_dir, "private-config.cfg")
1311
+ if os.path.exists(path):
1312
+ return path
1313
+ else:
1314
+ return None
1315
+
1316
+ @property
1317
+ def relative_startup_config_file(self):
1318
+ """
1319
+ Returns the startup-config file relative to the project directory.
1320
+ It's compatible with pre 1.3 projects.
1321
+
1322
+ :returns: path to startup-config file. None if the file doesn't exist
1323
+ """
1324
+
1325
+ path = os.path.join(self.working_dir, "startup-config.cfg")
1326
+ if os.path.exists(path):
1327
+ return "startup-config.cfg"
1328
+ else:
1329
+ return None
1330
+
1331
+ @property
1332
+ def relative_private_config_file(self):
1333
+ """
1334
+ Returns the private-config file relative to the project directory.
1335
+
1336
+ :returns: path to private-config file. None if the file doesn't exist
1337
+ """
1338
+
1339
+ path = os.path.join(self.working_dir, "private-config.cfg")
1340
+ if os.path.exists(path):
1341
+ return "private-config.cfg"
1342
+ else:
1343
+ return None
1344
+
1345
+ @property
1346
+ def application_id(self):
1347
+ """
1348
+ Returns application_id which unique identifier for IOU running script. Value is between 1 and 512.
1349
+ When it's not set returns value from the local manager.
1350
+
1351
+ :returns: integer between 1 and 512
1352
+ """
1353
+
1354
+ return self._application_id
1355
+
1356
+ @application_id.setter
1357
+ def application_id(self, application_id):
1358
+ """
1359
+ Sets application_id for IOU.
1360
+
1361
+ :param: integer between 1 and 512
1362
+ """
1363
+ self._application_id = application_id
1364
+
1365
+ def extract_configs(self):
1366
+ """
1367
+ Gets the contents of the config files
1368
+ startup-config and private-config from NVRAM.
1369
+
1370
+ :returns: tuple (startup-config, private-config)
1371
+ """
1372
+
1373
+ nvram_file = os.path.join(self.working_dir, f"nvram_{self.application_id:05d}")
1374
+ if not os.path.exists(nvram_file):
1375
+ return None, None
1376
+ try:
1377
+ with open(nvram_file, "rb") as file:
1378
+ nvram_content = file.read()
1379
+ except OSError as e:
1380
+ log.warning(f"Cannot read nvram file {nvram_file}: {e}")
1381
+ return None, None
1382
+
1383
+ try:
1384
+ startup_config_content, private_config_content = nvram_export(nvram_content)
1385
+ except ValueError as e:
1386
+ log.warning(f"Could not export configs from nvram file {nvram_file}: {e}")
1387
+ return None, None
1388
+
1389
+ return startup_config_content, private_config_content
1390
+
1391
+ def save_configs(self):
1392
+ """
1393
+ Saves the startup-config and private-config to files.
1394
+ """
1395
+
1396
+ if self.startup_config_content or self.private_config_content:
1397
+ startup_config_content, private_config_content = self.extract_configs()
1398
+ if startup_config_content:
1399
+ config_path = os.path.join(self.working_dir, "startup-config.cfg")
1400
+ try:
1401
+ config = startup_config_content.decode("utf-8", errors="replace")
1402
+ with open(config_path, "wb") as f:
1403
+ log.info(f"saving startup-config to {config_path}")
1404
+ f.write(config.encode("utf-8"))
1405
+ except (binascii.Error, OSError) as e:
1406
+ raise IOUError(f"Could not save the startup configuration {config_path}: {e}")
1407
+
1408
+ if private_config_content and private_config_content != b"\nend\n":
1409
+ config_path = os.path.join(self.working_dir, "private-config.cfg")
1410
+ try:
1411
+ config = private_config_content.decode("utf-8", errors="replace")
1412
+ with open(config_path, "wb") as f:
1413
+ log.info(f"saving private-config to {config_path}")
1414
+ f.write(config.encode("utf-8"))
1415
+ except (binascii.Error, OSError) as e:
1416
+ raise IOUError(f"Could not save the private configuration {config_path}: {e}")
1417
+
1418
+ async def start_capture(self, adapter_number, port_number, output_file, data_link_type="DLT_EN10MB"):
1419
+ """
1420
+ Starts a packet capture.
1421
+
1422
+ :param adapter_number: adapter number
1423
+ :param port_number: port number
1424
+ :param output_file: PCAP destination file for the capture
1425
+ :param data_link_type: PCAP data link type (DLT_*), default is DLT_EN10MB
1426
+ """
1427
+
1428
+ nio = self.get_nio(adapter_number, port_number)
1429
+ if nio.capturing:
1430
+ raise IOUError(
1431
+ "Packet capture is already activated on {adapter_number}/{port_number}".format(
1432
+ adapter_number=adapter_number, port_number=port_number
1433
+ )
1434
+ )
1435
+
1436
+ nio.start_packet_capture(output_file, data_link_type)
1437
+ log.info(
1438
+ 'IOU "{name}" [{id}]: starting packet capture on {adapter_number}/{port_number} to {output_file}'.format(
1439
+ name=self._name,
1440
+ id=self._id,
1441
+ adapter_number=adapter_number,
1442
+ port_number=port_number,
1443
+ output_file=output_file,
1444
+ )
1445
+ )
1446
+
1447
+ if self.ubridge:
1448
+ bridge_name = f"IOL-BRIDGE-{self.application_id + 512}"
1449
+ await self._ubridge_send(
1450
+ 'iol_bridge start_capture {name} {bay} {unit} "{output_file}" {data_link_type}'.format(
1451
+ name=bridge_name,
1452
+ bay=adapter_number,
1453
+ unit=port_number,
1454
+ output_file=output_file,
1455
+ data_link_type=re.sub(r"^DLT_", "", data_link_type),
1456
+ )
1457
+ )
1458
+
1459
+ async def stop_capture(self, adapter_number, port_number):
1460
+ """
1461
+ Stops a packet capture.
1462
+
1463
+ :param adapter_number: adapter number
1464
+ :param port_number: port number
1465
+ """
1466
+
1467
+ nio = self.get_nio(adapter_number, port_number)
1468
+ if not nio.capturing:
1469
+ return
1470
+ nio.stop_packet_capture()
1471
+ log.info(
1472
+ 'IOU "{name}" [{id}]: stopping packet capture on {adapter_number}/{port_number}'.format(
1473
+ name=self._name, id=self._id, adapter_number=adapter_number, port_number=port_number
1474
+ )
1475
+ )
1476
+ if self.ubridge:
1477
+ bridge_name = f"IOL-BRIDGE-{self.application_id + 512}"
1478
+ await self._ubridge_send(
1479
+ "iol_bridge stop_capture {name} {bay} {unit}".format(
1480
+ name=bridge_name, bay=adapter_number, unit=port_number
1481
+ )
1482
+ )