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.
- gns3_server-3.0.0.dist-info/LICENSE +674 -0
- gns3_server-3.0.0.dist-info/METADATA +868 -0
- gns3_server-3.0.0.dist-info/RECORD +1251 -0
- gns3_server-3.0.0.dist-info/WHEEL +5 -0
- gns3_server-3.0.0.dist-info/entry_points.txt +3 -0
- gns3_server-3.0.0.dist-info/top_level.txt +1 -0
- gns3server/__init__.py +17 -0
- gns3server/__main__.py +20 -0
- gns3server/alembic.ini +103 -0
- gns3server/api/__init__.py +0 -0
- gns3server/api/routes/__init__.py +0 -0
- gns3server/api/routes/compute/__init__.py +267 -0
- gns3server/api/routes/compute/atm_switch_nodes.py +233 -0
- gns3server/api/routes/compute/capabilities.py +51 -0
- gns3server/api/routes/compute/cloud_nodes.py +249 -0
- gns3server/api/routes/compute/compute.py +143 -0
- gns3server/api/routes/compute/dependencies/__init__.py +0 -0
- gns3server/api/routes/compute/dependencies/authentication.py +83 -0
- gns3server/api/routes/compute/docker_nodes.py +393 -0
- gns3server/api/routes/compute/dynamips_nodes.py +367 -0
- gns3server/api/routes/compute/ethernet_hub_nodes.py +236 -0
- gns3server/api/routes/compute/ethernet_switch_nodes.py +246 -0
- gns3server/api/routes/compute/frame_relay_switch_nodes.py +240 -0
- gns3server/api/routes/compute/images.py +156 -0
- gns3server/api/routes/compute/iou_nodes.py +344 -0
- gns3server/api/routes/compute/nat_nodes.py +244 -0
- gns3server/api/routes/compute/notifications.py +88 -0
- gns3server/api/routes/compute/projects.py +243 -0
- gns3server/api/routes/compute/qemu_nodes.py +412 -0
- gns3server/api/routes/compute/virtualbox_nodes.py +377 -0
- gns3server/api/routes/compute/vmware_nodes.py +355 -0
- gns3server/api/routes/compute/vpcs_nodes.py +343 -0
- gns3server/api/routes/controller/__init__.py +147 -0
- gns3server/api/routes/controller/acl.py +268 -0
- gns3server/api/routes/controller/appliances.py +150 -0
- gns3server/api/routes/controller/computes.py +231 -0
- gns3server/api/routes/controller/controller.py +319 -0
- gns3server/api/routes/controller/dependencies/__init__.py +0 -0
- gns3server/api/routes/controller/dependencies/authentication.py +117 -0
- gns3server/api/routes/controller/dependencies/database.py +38 -0
- gns3server/api/routes/controller/dependencies/rbac.py +78 -0
- gns3server/api/routes/controller/drawings.py +131 -0
- gns3server/api/routes/controller/gns3vm.py +71 -0
- gns3server/api/routes/controller/groups.py +231 -0
- gns3server/api/routes/controller/images.py +255 -0
- gns3server/api/routes/controller/links.py +287 -0
- gns3server/api/routes/controller/nodes.py +619 -0
- gns3server/api/routes/controller/pools.py +239 -0
- gns3server/api/routes/controller/privileges.py +43 -0
- gns3server/api/routes/controller/projects.py +595 -0
- gns3server/api/routes/controller/roles.py +224 -0
- gns3server/api/routes/controller/snapshots.py +124 -0
- gns3server/api/routes/controller/symbols.py +133 -0
- gns3server/api/routes/controller/templates.py +192 -0
- gns3server/api/routes/controller/users.py +254 -0
- gns3server/api/routes/index.py +93 -0
- gns3server/api/server.py +224 -0
- gns3server/appliances/6wind-turbo-router.gns3a +47 -0
- gns3server/appliances/IPCop.gns3a +52 -0
- gns3server/appliances/a10-vthunder.gns3a +72 -0
- gns3server/appliances/aaa.gns3a +20 -0
- gns3server/appliances/alcatel-7750.gns3a +74 -0
- gns3server/appliances/almalinux.gns3a +84 -0
- gns3server/appliances/alpine-linux-virt.gns3a +59 -0
- gns3server/appliances/alpine-linux.gns3a +21 -0
- gns3server/appliances/arista-ceos.gns3a +20 -0
- gns3server/appliances/arista-veos.gns3a +577 -0
- gns3server/appliances/aruba-arubaoscx.gns3a +233 -0
- gns3server/appliances/aruba-vgw.gns3a +60 -0
- gns3server/appliances/aruba-vmc.gns3a +56 -0
- gns3server/appliances/asterfusion-vAsterNOS.gns3a +49 -0
- gns3server/appliances/asterisk.gns3a +114 -0
- gns3server/appliances/bigswitch-bigcloud-fabric.gns3a +42 -0
- gns3server/appliances/bird.gns3a +42 -0
- gns3server/appliances/bird2.gns3a +57 -0
- gns3server/appliances/brocade-vadx.gns3a +43 -0
- gns3server/appliances/brocade-vrouter.gns3a +138 -0
- gns3server/appliances/brocade-vtm.gns3a +136 -0
- gns3server/appliances/bsdrp.gns3a +117 -0
- gns3server/appliances/centos-cloud.gns3a +115 -0
- gns3server/appliances/centos7.gns3a +72 -0
- gns3server/appliances/checkpoint-gaia.gns3a +81 -0
- gns3server/appliances/chromium.gns3a +19 -0
- gns3server/appliances/cisco-1700.gns3a +39 -0
- gns3server/appliances/cisco-2600.gns3a +38 -0
- gns3server/appliances/cisco-2691.gns3a +38 -0
- gns3server/appliances/cisco-3620.gns3a +38 -0
- gns3server/appliances/cisco-3640.gns3a +38 -0
- gns3server/appliances/cisco-3660.gns3a +38 -0
- gns3server/appliances/cisco-3725.gns3a +38 -0
- gns3server/appliances/cisco-3745.gns3a +45 -0
- gns3server/appliances/cisco-7200.gns3a +92 -0
- gns3server/appliances/cisco-asa.gns3a +86 -0
- gns3server/appliances/cisco-asav.gns3a +227 -0
- gns3server/appliances/cisco-c8000v.gns3a +108 -0
- gns3server/appliances/cisco-cat9k.gns3a +58 -0
- gns3server/appliances/cisco-csr1000v.gns3a +316 -0
- gns3server/appliances/cisco-dcnm.gns3a +96 -0
- gns3server/appliances/cisco-fcnf.gns3a +71 -0
- gns3server/appliances/cisco-fmcv.gns3a +139 -0
- gns3server/appliances/cisco-fsve.gns3a +57 -0
- gns3server/appliances/cisco-ftdv.gns3a +99 -0
- gns3server/appliances/cisco-iosv.gns3a +178 -0
- gns3server/appliances/cisco-iosvl2.gns3a +95 -0
- gns3server/appliances/cisco-iosxrv.gns3a +57 -0
- gns3server/appliances/cisco-iosxrv9k.gns3a +188 -0
- gns3server/appliances/cisco-iou-l2.gns3a +84 -0
- gns3server/appliances/cisco-iou-l3.gns3a +84 -0
- gns3server/appliances/cisco-ise.gns3a +154 -0
- gns3server/appliances/cisco-ngipsv.gns3a +73 -0
- gns3server/appliances/cisco-nxosv.gns3a +56 -0
- gns3server/appliances/cisco-nxosv9k.gns3a +433 -0
- gns3server/appliances/cisco-pyats.gns3a +19 -0
- gns3server/appliances/cisco-smc.gns3a +71 -0
- gns3server/appliances/cisco-vWLC.gns3a +140 -0
- gns3server/appliances/cisco-wsav.gns3a +44 -0
- gns3server/appliances/citrix-netscaler-vpx.gns3a +72 -0
- gns3server/appliances/citrix-sd-wan.gns3a +46 -0
- gns3server/appliances/citrix-sdwan-center.gns3a +46 -0
- gns3server/appliances/clavister-netsheild.gns3a +59 -0
- gns3server/appliances/clavister-netwall.gns3a +71 -0
- gns3server/appliances/clearos.gns3a +107 -0
- gns3server/appliances/cloudrouter.gns3a +72 -0
- gns3server/appliances/coreos.gns3a +329 -0
- gns3server/appliances/cumulus-vx.gns3a +440 -0
- gns3server/appliances/danos.gns3a +57 -0
- gns3server/appliances/debian.gns3a +85 -0
- gns3server/appliances/deft-linux.gns3a +96 -0
- gns3server/appliances/dell-ftos.gns3a +71 -0
- gns3server/appliances/dns.gns3a +20 -0
- gns3server/appliances/empty-vm.gns3a +199 -0
- gns3server/appliances/endhost.gns3a +17 -0
- gns3server/appliances/exos.gns3a +51 -0
- gns3server/appliances/extreme-networks-voss.gns3a +152 -0
- gns3server/appliances/f5-bigip.gns3a +322 -0
- gns3server/appliances/f5-bigiq.gns3a +165 -0
- gns3server/appliances/fedora-cloud.gns3a +70 -0
- gns3server/appliances/firefox.gns3a +59 -0
- gns3server/appliances/fortiadc-manager.gns3a +54 -0
- gns3server/appliances/fortiadc.gns3a +502 -0
- gns3server/appliances/fortianalyzer.gns3a +519 -0
- gns3server/appliances/fortiauthenticator.gns3a +251 -0
- gns3server/appliances/forticache.gns3a +210 -0
- gns3server/appliances/fortigate.gns3a +742 -0
- gns3server/appliances/fortimail.gns3a +392 -0
- gns3server/appliances/fortimanager.gns3a +519 -0
- gns3server/appliances/fortiproxy.gns3a +83 -0
- gns3server/appliances/fortirecorder.gns3a +69 -0
- gns3server/appliances/fortisandbox.gns3a +210 -0
- gns3server/appliances/fortisiem-super_worker.gns3a +210 -0
- gns3server/appliances/fortiweb.gns3a +308 -0
- gns3server/appliances/freeRouter.gns3a +44 -0
- gns3server/appliances/freebsd.gns3a +75 -0
- gns3server/appliances/freenas.gns3a +183 -0
- gns3server/appliances/frr.gns3a +84 -0
- gns3server/appliances/haproxy.gns3a +18 -0
- gns3server/appliances/hbcd-pe.gns3a +62 -0
- gns3server/appliances/hp-vsr1001.gns3a +149 -0
- gns3server/appliances/huawei-ar1kv.gns3a +58 -0
- gns3server/appliances/huawei-ce12800.gns3a +43 -0
- gns3server/appliances/huawei-ne40e.gns3a +94 -0
- gns3server/appliances/huawei-usg6kv.gns3a +50 -0
- gns3server/appliances/innovaphone-app.gns3a +50 -0
- gns3server/appliances/innovaphone-ipva.gns3a +78 -0
- gns3server/appliances/ipfire.gns3a +181 -0
- gns3server/appliances/ipterm.gns3a +19 -0
- gns3server/appliances/ipxe.gns3a +47 -0
- gns3server/appliances/juniper-junos-space.gns3a +46 -0
- gns3server/appliances/juniper-vmx-legacy.gns3a +55 -0
- gns3server/appliances/juniper-vmx-vcp.gns3a +520 -0
- gns3server/appliances/juniper-vmx-vfp.gns3a +281 -0
- gns3server/appliances/juniper-vqfx-pfe.gns3a +71 -0
- gns3server/appliances/juniper-vqfx-re.gns3a +85 -0
- gns3server/appliances/juniper-vrr.gns3a +66 -0
- gns3server/appliances/juniper-vsrx.gns3a +332 -0
- gns3server/appliances/jupyter.gns3a +20 -0
- gns3server/appliances/jupyter27.gns3a +20 -0
- gns3server/appliances/kali-linux-cli.gns3a +18 -0
- gns3server/appliances/kali-linux.gns3a +248 -0
- gns3server/appliances/kemp-vlm.gns3a +111 -0
- gns3server/appliances/kerio-connect.gns3a +131 -0
- gns3server/appliances/kerio-control.gns3a +143 -0
- gns3server/appliances/kerio-operator.gns3a +130 -0
- gns3server/appliances/lancom-vrouter.gns3a +45 -0
- gns3server/appliances/loadbalancer_org-va.gns3a +56 -0
- gns3server/appliances/macos-install.gns3a +72 -0
- gns3server/appliances/mcjoin.gns3a +19 -0
- gns3server/appliances/microcore-linux.gns3a +72 -0
- gns3server/appliances/mikrotik-ccr1036-8g-2s+.gns3a +165 -0
- gns3server/appliances/mikrotik-ccr1072-1g-8s+.gns3a +161 -0
- gns3server/appliances/mikrotik-chr.gns3a +108 -0
- gns3server/appliances/mikrotik-crs328-24p-4s+.gns3a +173 -0
- gns3server/appliances/mikrotik-crs328-4c-20s-4s+.gns3a +189 -0
- gns3server/appliances/mikrotik-rb1100ahx4-dude-edition.gns3a +155 -0
- gns3server/appliances/mikrotik-rb2011uias.gns3a +161 -0
- gns3server/appliances/mikrotik-rb3011uias.gns3a +161 -0
- gns3server/appliances/mikrotik-rb4011igs+.gns3a +161 -0
- gns3server/appliances/mikrotik-rb450g.gns3a +155 -0
- gns3server/appliances/mikrotik-rb450gx4.gns3a +155 -0
- gns3server/appliances/mikrotik-winbox.gns3a +19 -0
- gns3server/appliances/mininet.gns3a +47 -0
- gns3server/appliances/net_toolbox.gns3a +20 -0
- gns3server/appliances/netapp-ontapsim.gns3a +185 -0
- gns3server/appliances/netem.gns3a +44 -0
- gns3server/appliances/network_automation.gns3a +19 -0
- gns3server/appliances/nixos.gns3a +52 -0
- gns3server/appliances/nokia-vsim.gns3a +47 -0
- gns3server/appliances/ntopng.gns3a +24 -0
- gns3server/appliances/onos.gns3a +19 -0
- gns3server/appliances/op5-monitor.gns3a +72 -0
- gns3server/appliances/open-media-vault.gns3a +120 -0
- gns3server/appliances/openbsd.gns3a +44 -0
- gns3server/appliances/opennac.gns3a +45 -0
- gns3server/appliances/opensuse.gns3a +47 -0
- gns3server/appliances/openvswitch-management.gns3a +21 -0
- gns3server/appliances/openvswitch.gns3a +21 -0
- gns3server/appliances/openwrt-realview.gns3a +56 -0
- gns3server/appliances/openwrt.gns3a +359 -0
- gns3server/appliances/opnsense.gns3a +122 -0
- gns3server/appliances/oracle-linux-cloud.gns3a +115 -0
- gns3server/appliances/ostinato-wireshark.gns3a +20 -0
- gns3server/appliances/ostinato.gns3a +75 -0
- gns3server/appliances/ovs-snmp.gns3a +18 -0
- gns3server/appliances/packetfence-zen.gns3a +151 -0
- gns3server/appliances/pan-vm-fw.gns3a +241 -0
- gns3server/appliances/parrot-os.gns3a +68 -0
- gns3server/appliances/pfsense.gns3a +122 -0
- gns3server/appliances/proxmox-mg.gns3a +69 -0
- gns3server/appliances/puppy-linux.gns3a +82 -0
- gns3server/appliances/python-go-perl-php.gns3a +17 -0
- gns3server/appliances/raspian.gns3a +79 -0
- gns3server/appliances/reactos.gns3a +67 -0
- gns3server/appliances/rhel.gns3a +207 -0
- gns3server/appliances/riverbed-steelhead-ng-vcx.gns3a +68 -0
- gns3server/appliances/rockylinux.gns3a +100 -0
- gns3server/appliances/security-onion.gns3a +108 -0
- gns3server/appliances/smoothwall.gns3a +54 -0
- gns3server/appliances/sophos-iview.gns3a +66 -0
- gns3server/appliances/sophos-utm.gns3a +263 -0
- gns3server/appliances/sophos-xg.gns3a +198 -0
- gns3server/appliances/stonework.gns3a +21 -0
- gns3server/appliances/tacacs-gui.gns3a +57 -0
- gns3server/appliances/tinycore-linux.gns3a +73 -0
- gns3server/appliances/trendmicro-imsva.gns3a +54 -0
- gns3server/appliances/trendmicro-iwsva.gns3a +53 -0
- gns3server/appliances/truenas.gns3a +104 -0
- gns3server/appliances/turnkey-wordpress.gns3a +20 -0
- gns3server/appliances/ubuntu-cloud.gns3a +116 -0
- gns3server/appliances/ubuntu-docker.gns3a +20 -0
- gns3server/appliances/ubuntu-gui.gns3a +98 -0
- gns3server/appliances/untangle.gns3a +208 -0
- gns3server/appliances/viptela-edge-genericx86-64.gns3a +84 -0
- gns3server/appliances/viptela-smart-genericx86-64.gns3a +82 -0
- gns3server/appliances/viptela-vmanage-genericx86-64.gns3a +95 -0
- gns3server/appliances/vpp.gns3a +45 -0
- gns3server/appliances/vrin.gns3a +118 -0
- gns3server/appliances/vyos.gns3a +179 -0
- gns3server/appliances/watchguard-fireboxv.gns3a +45 -0
- gns3server/appliances/watchguard-xtmv.gns3a +45 -0
- gns3server/appliances/webterm.gns3a +20 -0
- gns3server/appliances/windows-11-dev-env.gns3a +74 -0
- gns3server/appliances/windows-xp+ie.gns3a +52 -0
- gns3server/appliances/windows.gns3a +125 -0
- gns3server/appliances/windows_server.gns3a +83 -0
- gns3server/appliances/zentyal-server.gns3a +159 -0
- gns3server/appliances/zeroshell.gns3a +103 -0
- gns3server/compute/__init__.py +38 -0
- gns3server/compute/adapters/__init__.py +0 -0
- gns3server/compute/adapters/adapter.py +104 -0
- gns3server/compute/adapters/ethernet_adapter.py +33 -0
- gns3server/compute/adapters/serial_adapter.py +32 -0
- gns3server/compute/base_manager.py +547 -0
- gns3server/compute/base_node.py +979 -0
- gns3server/compute/builtin/__init__.py +46 -0
- gns3server/compute/builtin/builtin_node_factory.py +42 -0
- gns3server/compute/builtin/nodes/__init__.py +0 -0
- gns3server/compute/builtin/nodes/cloud.py +548 -0
- gns3server/compute/builtin/nodes/ethernet_hub.py +104 -0
- gns3server/compute/builtin/nodes/ethernet_switch.py +104 -0
- gns3server/compute/builtin/nodes/nat.py +97 -0
- gns3server/compute/compute_error.py +48 -0
- gns3server/compute/docker/__init__.py +320 -0
- gns3server/compute/docker/docker_error.py +33 -0
- gns3server/compute/docker/docker_vm.py +1378 -0
- gns3server/compute/docker/resources/bin/udhcpc +15 -0
- gns3server/compute/docker/resources/etc/udhcpc/default.script +138 -0
- gns3server/compute/docker/resources/init.sh +102 -0
- gns3server/compute/docker/resources/run-cmd.sh +6 -0
- gns3server/compute/dynamips/__init__.py +661 -0
- gns3server/compute/dynamips/adapters/__init__.py +0 -0
- gns3server/compute/dynamips/adapters/adapter.py +165 -0
- gns3server/compute/dynamips/adapters/c1700_mb_1fe.py +36 -0
- gns3server/compute/dynamips/adapters/c1700_mb_wic1.py +37 -0
- gns3server/compute/dynamips/adapters/c2600_mb_1e.py +36 -0
- gns3server/compute/dynamips/adapters/c2600_mb_1fe.py +37 -0
- gns3server/compute/dynamips/adapters/c2600_mb_2e.py +36 -0
- gns3server/compute/dynamips/adapters/c2600_mb_2fe.py +36 -0
- gns3server/compute/dynamips/adapters/c7200_io_2fe.py +36 -0
- gns3server/compute/dynamips/adapters/c7200_io_fe.py +36 -0
- gns3server/compute/dynamips/adapters/c7200_io_ge_e.py +36 -0
- gns3server/compute/dynamips/adapters/gt96100_fe.py +31 -0
- gns3server/compute/dynamips/adapters/leopard_2fe.py +37 -0
- gns3server/compute/dynamips/adapters/nm_16esw.py +32 -0
- gns3server/compute/dynamips/adapters/nm_1e.py +32 -0
- gns3server/compute/dynamips/adapters/nm_1fe_tx.py +32 -0
- gns3server/compute/dynamips/adapters/nm_4e.py +32 -0
- gns3server/compute/dynamips/adapters/nm_4t.py +32 -0
- gns3server/compute/dynamips/adapters/pa_2fe_tx.py +32 -0
- gns3server/compute/dynamips/adapters/pa_4e.py +32 -0
- gns3server/compute/dynamips/adapters/pa_4t.py +32 -0
- gns3server/compute/dynamips/adapters/pa_8e.py +32 -0
- gns3server/compute/dynamips/adapters/pa_8t.py +32 -0
- gns3server/compute/dynamips/adapters/pa_a1.py +32 -0
- gns3server/compute/dynamips/adapters/pa_fe_tx.py +32 -0
- gns3server/compute/dynamips/adapters/pa_ge.py +32 -0
- gns3server/compute/dynamips/adapters/pa_pos_oc3.py +32 -0
- gns3server/compute/dynamips/adapters/wic_1enet.py +40 -0
- gns3server/compute/dynamips/adapters/wic_1t.py +40 -0
- gns3server/compute/dynamips/adapters/wic_2t.py +40 -0
- gns3server/compute/dynamips/dynamips_error.py +26 -0
- gns3server/compute/dynamips/dynamips_factory.py +71 -0
- gns3server/compute/dynamips/dynamips_hypervisor.py +333 -0
- gns3server/compute/dynamips/hypervisor.py +210 -0
- gns3server/compute/dynamips/nios/__init__.py +0 -0
- gns3server/compute/dynamips/nios/nio.py +352 -0
- gns3server/compute/dynamips/nios/nio_generic_ethernet.py +73 -0
- gns3server/compute/dynamips/nios/nio_linux_ethernet.py +72 -0
- gns3server/compute/dynamips/nios/nio_null.py +51 -0
- gns3server/compute/dynamips/nios/nio_tap.py +66 -0
- gns3server/compute/dynamips/nios/nio_udp.py +136 -0
- gns3server/compute/dynamips/nios/nio_unix.py +88 -0
- gns3server/compute/dynamips/nios/nio_vde.py +88 -0
- gns3server/compute/dynamips/nodes/__init__.py +0 -0
- gns3server/compute/dynamips/nodes/atm_switch.py +514 -0
- gns3server/compute/dynamips/nodes/bridge.py +107 -0
- gns3server/compute/dynamips/nodes/c1700.py +160 -0
- gns3server/compute/dynamips/nodes/c2600.py +171 -0
- gns3server/compute/dynamips/nodes/c2691.py +112 -0
- gns3server/compute/dynamips/nodes/c3600.py +155 -0
- gns3server/compute/dynamips/nodes/c3725.py +112 -0
- gns3server/compute/dynamips/nodes/c3745.py +112 -0
- gns3server/compute/dynamips/nodes/c7200.py +268 -0
- gns3server/compute/dynamips/nodes/device.py +134 -0
- gns3server/compute/dynamips/nodes/ethernet_hub.py +241 -0
- gns3server/compute/dynamips/nodes/ethernet_switch.py +496 -0
- gns3server/compute/dynamips/nodes/frame_relay_switch.py +379 -0
- gns3server/compute/dynamips/nodes/router.py +1797 -0
- gns3server/compute/error.py +40 -0
- gns3server/compute/iou/__init__.py +64 -0
- gns3server/compute/iou/iou_error.py +25 -0
- gns3server/compute/iou/iou_vm.py +1482 -0
- gns3server/compute/iou/utils/__init__.py +0 -0
- gns3server/compute/iou/utils/iou_export.py +233 -0
- gns3server/compute/iou/utils/iou_import.py +232 -0
- gns3server/compute/nios/__init__.py +0 -0
- gns3server/compute/nios/nio.py +120 -0
- gns3server/compute/nios/nio_ethernet.py +56 -0
- gns3server/compute/nios/nio_tap.py +56 -0
- gns3server/compute/nios/nio_udp.py +82 -0
- gns3server/compute/notification_manager.py +73 -0
- gns3server/compute/port_manager.py +402 -0
- gns3server/compute/project.py +434 -0
- gns3server/compute/project_manager.py +122 -0
- gns3server/compute/qemu/__init__.py +304 -0
- gns3server/compute/qemu/qemu_error.py +26 -0
- gns3server/compute/qemu/qemu_vm.py +2697 -0
- gns3server/compute/qemu/resources/config.img.zip +0 -0
- gns3server/compute/qemu/utils/__init__.py +0 -0
- gns3server/compute/qemu/utils/guest_cid.py +38 -0
- gns3server/compute/qemu/utils/qcow2.py +138 -0
- gns3server/compute/qemu/utils/ziputils.py +55 -0
- gns3server/compute/ubridge/__init__.py +0 -0
- gns3server/compute/ubridge/hypervisor.py +256 -0
- gns3server/compute/ubridge/ubridge_error.py +32 -0
- gns3server/compute/ubridge/ubridge_hypervisor.py +285 -0
- gns3server/compute/virtualbox/__init__.py +212 -0
- gns3server/compute/virtualbox/virtualbox_error.py +26 -0
- gns3server/compute/virtualbox/virtualbox_vm.py +1255 -0
- gns3server/compute/vmware/__init__.py +725 -0
- gns3server/compute/vmware/vmware_error.py +26 -0
- gns3server/compute/vmware/vmware_vm.py +1007 -0
- gns3server/compute/vpcs/__init__.py +91 -0
- gns3server/compute/vpcs/vpcs_error.py +26 -0
- gns3server/compute/vpcs/vpcs_vm.py +595 -0
- gns3server/config.py +284 -0
- gns3server/config_samples/gns3_server.conf +160 -0
- gns3server/configs/ios_base_startup-config.txt +26 -0
- gns3server/configs/ios_etherswitch_startup-config.txt +181 -0
- gns3server/configs/iou_l2_base_startup-config.txt +133 -0
- gns3server/configs/iou_l3_base_startup-config.txt +109 -0
- gns3server/configs/vpcs_base_config.txt +9 -0
- gns3server/controller/__init__.py +691 -0
- gns3server/controller/appliance.py +86 -0
- gns3server/controller/appliance_manager.py +486 -0
- gns3server/controller/appliance_to_template.py +132 -0
- gns3server/controller/compute.py +677 -0
- gns3server/controller/controller_error.py +77 -0
- gns3server/controller/drawing.py +229 -0
- gns3server/controller/export_project.py +336 -0
- gns3server/controller/gns3vm/__init__.py +412 -0
- gns3server/controller/gns3vm/base_gns3_vm.py +303 -0
- gns3server/controller/gns3vm/gns3_vm_error.py +28 -0
- gns3server/controller/gns3vm/hyperv_gns3_vm.py +346 -0
- gns3server/controller/gns3vm/remote_gns3_vm.py +73 -0
- gns3server/controller/gns3vm/virtualbox_gns3_vm.py +480 -0
- gns3server/controller/gns3vm/vmware_gns3_vm.py +216 -0
- gns3server/controller/import_project.py +332 -0
- gns3server/controller/link.py +461 -0
- gns3server/controller/node.py +840 -0
- gns3server/controller/notification.py +149 -0
- gns3server/controller/ports/__init__.py +0 -0
- gns3server/controller/ports/atm_port.py +51 -0
- gns3server/controller/ports/ethernet_port.py +49 -0
- gns3server/controller/ports/fastethernet_port.py +43 -0
- gns3server/controller/ports/frame_relay_port.py +43 -0
- gns3server/controller/ports/gigabitethernet_port.py +43 -0
- gns3server/controller/ports/port.py +109 -0
- gns3server/controller/ports/port_factory.py +213 -0
- gns3server/controller/ports/pos_port.py +52 -0
- gns3server/controller/ports/serial_port.py +63 -0
- gns3server/controller/project.py +1399 -0
- gns3server/controller/snapshot.py +140 -0
- gns3server/controller/symbol_themes.py +153 -0
- gns3server/controller/symbols.py +168 -0
- gns3server/controller/topology.py +788 -0
- gns3server/controller/udp_link.py +245 -0
- gns3server/core/__init__.py +0 -0
- gns3server/core/tasks.py +99 -0
- gns3server/crash_report.py +167 -0
- gns3server/db/__init__.py +0 -0
- gns3server/db/models/__init__.py +38 -0
- gns3server/db/models/acl.py +46 -0
- gns3server/db/models/base.py +117 -0
- gns3server/db/models/computes.py +33 -0
- gns3server/db/models/images.py +43 -0
- gns3server/db/models/pools.py +52 -0
- gns3server/db/models/privileges.py +359 -0
- gns3server/db/models/roles.py +57 -0
- gns3server/db/models/templates.py +272 -0
- gns3server/db/models/users.py +94 -0
- gns3server/db/repositories/__init__.py +0 -0
- gns3server/db/repositories/base.py +24 -0
- gns3server/db/repositories/computes.py +93 -0
- gns3server/db/repositories/images.py +141 -0
- gns3server/db/repositories/pools.py +218 -0
- gns3server/db/repositories/rbac.py +430 -0
- gns3server/db/repositories/templates.py +172 -0
- gns3server/db/repositories/users.py +289 -0
- gns3server/db/tasks.py +230 -0
- gns3server/db_migrations/README +5 -0
- gns3server/db_migrations/env.py +101 -0
- gns3server/db_migrations/script.py.mako +24 -0
- gns3server/db_migrations/versions/7ceeddd9c9a8_init.py +28 -0
- gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py +27 -0
- gns3server/disks/OVMF.fd +0 -0
- gns3server/disks/OVMF_CODE.fd +0 -0
- gns3server/disks/OVMF_VARS.fd +0 -0
- gns3server/disks/empty100G.qcow2 +0 -0
- gns3server/disks/empty10G.qcow2 +0 -0
- gns3server/disks/empty150G.qcow2 +0 -0
- gns3server/disks/empty1T.qcow2 +0 -0
- gns3server/disks/empty200G.qcow2 +0 -0
- gns3server/disks/empty20G.qcow2 +0 -0
- gns3server/disks/empty250G.qcow2 +0 -0
- gns3server/disks/empty30G.qcow2 +0 -0
- gns3server/disks/empty40G.qcow2 +0 -0
- gns3server/disks/empty500G.qcow2 +0 -0
- gns3server/disks/empty50G.qcow2 +0 -0
- gns3server/disks/empty8G.qcow2 +0 -0
- gns3server/gns3_server.egg-info/PKG-INFO +307 -0
- gns3server/gns3_server.egg-info/SOURCES.txt +0 -0
- gns3server/gns3_server.egg-info/dependency_links.txt +1 -0
- gns3server/gns3_server.egg-info/entry_points.txt +4 -0
- gns3server/gns3_server.egg-info/not-zip-safe +1 -0
- gns3server/gns3_server.egg-info/requires.txt +31 -0
- gns3server/gns3_server.egg-info/top_level.txt +2 -0
- gns3server/logger.py +164 -0
- gns3server/main.py +81 -0
- gns3server/schemas/__init__.py +85 -0
- gns3server/schemas/common.py +71 -0
- gns3server/schemas/compute/__init__.py +0 -0
- gns3server/schemas/compute/atm_switch_nodes.py +55 -0
- gns3server/schemas/compute/cloud_nodes.py +137 -0
- gns3server/schemas/compute/docker_nodes.py +75 -0
- gns3server/schemas/compute/dynamips_nodes.py +197 -0
- gns3server/schemas/compute/ethernet_hub_nodes.py +63 -0
- gns3server/schemas/compute/ethernet_switch_nodes.py +100 -0
- gns3server/schemas/compute/frame_relay_switch_nodes.py +55 -0
- gns3server/schemas/compute/iou_nodes.py +76 -0
- gns3server/schemas/compute/nat_nodes.py +122 -0
- gns3server/schemas/compute/nios.py +66 -0
- gns3server/schemas/compute/qemu_nodes.py +245 -0
- gns3server/schemas/compute/virtualbox_nodes.py +97 -0
- gns3server/schemas/compute/vmware_nodes.py +102 -0
- gns3server/schemas/compute/vpcs_nodes.py +68 -0
- gns3server/schemas/config.py +197 -0
- gns3server/schemas/controller/__init__.py +0 -0
- gns3server/schemas/controller/appliances.py +466 -0
- gns3server/schemas/controller/base.py +25 -0
- gns3server/schemas/controller/capabilities.py +34 -0
- gns3server/schemas/controller/computes.py +168 -0
- gns3server/schemas/controller/drawings.py +34 -0
- gns3server/schemas/controller/gns3vm.py +56 -0
- gns3server/schemas/controller/images.py +44 -0
- gns3server/schemas/controller/iou_license.py +23 -0
- gns3server/schemas/controller/labels.py +30 -0
- gns3server/schemas/controller/links.py +94 -0
- gns3server/schemas/controller/nodes.py +177 -0
- gns3server/schemas/controller/pools.py +81 -0
- gns3server/schemas/controller/projects.py +116 -0
- gns3server/schemas/controller/rbac.py +113 -0
- gns3server/schemas/controller/snapshots.py +42 -0
- gns3server/schemas/controller/templates/__init__.py +83 -0
- gns3server/schemas/controller/templates/cloud_templates.py +44 -0
- gns3server/schemas/controller/templates/docker_templates.py +59 -0
- gns3server/schemas/controller/templates/dynamips_templates.py +199 -0
- gns3server/schemas/controller/templates/ethernet_hub_templates.py +46 -0
- gns3server/schemas/controller/templates/ethernet_switch_templates.py +57 -0
- gns3server/schemas/controller/templates/iou_templates.py +47 -0
- gns3server/schemas/controller/templates/qemu_templates.py +94 -0
- gns3server/schemas/controller/templates/virtualbox_templates.py +64 -0
- gns3server/schemas/controller/templates/vmware_templates.py +61 -0
- gns3server/schemas/controller/templates/vpcs_templates.py +39 -0
- gns3server/schemas/controller/tokens.py +29 -0
- gns3server/schemas/controller/topology.py +82 -0
- gns3server/schemas/controller/users.py +105 -0
- gns3server/schemas/link.py +0 -0
- gns3server/schemas/qemu_disk_image.py +103 -0
- gns3server/schemas/version.py +25 -0
- gns3server/server.py +348 -0
- gns3server/services/__init__.py +19 -0
- gns3server/services/authentication.py +83 -0
- gns3server/services/computes.py +82 -0
- gns3server/services/templates.py +329 -0
- gns3server/static/.gitkeep +0 -0
- gns3server/static/favicon.ico +0 -0
- gns3server/static/redoc.standalone.js +1782 -0
- gns3server/static/swagger-ui-bundle.js +2 -0
- gns3server/static/swagger-ui.css +3 -0
- gns3server/static/web-ui/3rdpartylicenses.txt +2604 -0
- gns3server/static/web-ui/465.92c7ab880f2504d3.js +1 -0
- gns3server/static/web-ui/MaterialIcons-Regular.196fa4a92dd6fa73.ttf +0 -0
- gns3server/static/web-ui/MaterialIcons-Regular.1e50f5c2ffa6aba4.eot +0 -0
- gns3server/static/web-ui/MaterialIcons-Regular.7ea2023eeca07427.woff2 +0 -0
- gns3server/static/web-ui/MaterialIcons-Regular.db852539204b1a34.woff +0 -0
- gns3server/static/web-ui/NotoSans-Bold.635e9291df1a5a00.woff2 +0 -0
- gns3server/static/web-ui/NotoSans-Bold.885427cced6d8c94.woff +0 -0
- gns3server/static/web-ui/NotoSans-Bold.93203a43bc93ad9c.svg +8453 -0
- gns3server/static/web-ui/NotoSans-Bold.a7ab189a45f553b4.eot +0 -0
- gns3server/static/web-ui/NotoSans-Bold.e989c11744b36f58.ttf +0 -0
- gns3server/static/web-ui/NotoSans-BoldItalic.2baf33b639fc86a4.woff +0 -0
- gns3server/static/web-ui/NotoSans-BoldItalic.2eea9ba02e25c1d3.ttf +0 -0
- gns3server/static/web-ui/NotoSans-BoldItalic.46a5eec91da0d900.svg +8453 -0
- gns3server/static/web-ui/NotoSans-BoldItalic.7fdef73b477daa73.eot +0 -0
- gns3server/static/web-ui/NotoSans-BoldItalic.c62f70f121f271aa.woff2 +0 -0
- gns3server/static/web-ui/NotoSans-Italic.219ee88e5bc4e168.ttf +0 -0
- gns3server/static/web-ui/NotoSans-Italic.3d6f7cf772169c8d.svg +8453 -0
- gns3server/static/web-ui/NotoSans-Italic.77cd3818b5a2cb97.woff +0 -0
- gns3server/static/web-ui/NotoSans-Italic.85194585ae9d8c36.eot +0 -0
- gns3server/static/web-ui/NotoSans-Italic.eee02500e81db981.woff2 +0 -0
- gns3server/static/web-ui/NotoSans-Regular.156b7584192d70ed.eot +0 -0
- gns3server/static/web-ui/NotoSans-Regular.374d132a6803e279.woff2 +0 -0
- gns3server/static/web-ui/NotoSans-Regular.595e3f5876719740.woff +0 -0
- gns3server/static/web-ui/NotoSans-Regular.bb384defbe36eaec.svg +8453 -0
- gns3server/static/web-ui/NotoSans-Regular.e6139cb1663a1c57.ttf +0 -0
- gns3server/static/web-ui/ReleaseNotes.txt +179 -0
- gns3server/static/web-ui/assets/favicon.ico +0 -0
- gns3server/static/web-ui/assets/gns3_icon.svg +88 -0
- gns3server/static/web-ui/assets/gns3_icon_black.svg +88 -0
- gns3server/static/web-ui/assets/icons/mac/icon.icns +0 -0
- gns3server/static/web-ui/assets/icons/png/1024x1024.png +0 -0
- gns3server/static/web-ui/assets/icons/png/128x128.png +0 -0
- gns3server/static/web-ui/assets/icons/png/16x16.png +0 -0
- gns3server/static/web-ui/assets/icons/png/24x24.png +0 -0
- gns3server/static/web-ui/assets/icons/png/256x256.png +0 -0
- gns3server/static/web-ui/assets/icons/png/32x32.png +0 -0
- gns3server/static/web-ui/assets/icons/png/48x48.png +0 -0
- gns3server/static/web-ui/assets/icons/png/512x512.png +0 -0
- gns3server/static/web-ui/assets/icons/png/64x64.png +0 -0
- gns3server/static/web-ui/assets/icons/win/icon.ico +0 -0
- gns3server/static/web-ui/assets/logo-header.png +0 -0
- gns3server/static/web-ui/assets/resources/images/filter-capture.svg +428 -0
- gns3server/static/web-ui/assets/resources/images/filter.svg +708 -0
- gns3server/static/web-ui/assets/resources/images/inspect.svg +312 -0
- gns3server/static/web-ui/assets/resources/images/pause.svg +752 -0
- gns3server/static/web-ui/favicon.ico +0 -0
- gns3server/static/web-ui/index.html +51 -0
- gns3server/static/web-ui/main.f802edd2b8c6db1d.js +1 -0
- gns3server/static/web-ui/polyfills.319c79dd175e50d0.js +1 -0
- gns3server/static/web-ui/roboto-latin-100.539f0a96b40596f7.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-100.5ba994dac3e79ea8.woff +0 -0
- gns3server/static/web-ui/roboto-latin-100italic.41ba64219cb743c9.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-100italic.d61e7e8b07c0638c.woff +0 -0
- gns3server/static/web-ui/roboto-latin-300.4d8f8086236bad80.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-300.6c1bc461047e61f5.woff +0 -0
- gns3server/static/web-ui/roboto-latin-300italic.3a529751a590d3c1.woff +0 -0
- gns3server/static/web-ui/roboto-latin-300italic.45164643b3bd5824.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-400.1e2d4d3a272629cd.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-400.7e4a045b9373d9c1.woff +0 -0
- gns3server/static/web-ui/roboto-latin-400italic.68431199e5b90ea8.woff +0 -0
- gns3server/static/web-ui/roboto-latin-400italic.bb3c6955c4334c8a.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-500.1dfbc3dbf815e3f3.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-500.e21fe97fd2329ff7.woff +0 -0
- gns3server/static/web-ui/roboto-latin-500italic.7543a42b12b1452f.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-500italic.aaff6867154023d3.woff +0 -0
- gns3server/static/web-ui/roboto-latin-700.02633003129d1e63.woff +0 -0
- gns3server/static/web-ui/roboto-latin-700.12893bfc0762b0f3.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-700italic.bc7179e004e40113.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-700italic.e53062e27c63fafb.woff +0 -0
- gns3server/static/web-ui/roboto-latin-900.282ba77fda1349f3.woff2 +0 -0
- gns3server/static/web-ui/roboto-latin-900.4962e810cbb4d3e5.woff +0 -0
- gns3server/static/web-ui/roboto-latin-900italic.2394134a78bbaef8.woff +0 -0
- gns3server/static/web-ui/roboto-latin-900italic.9c1f80840351fa12.woff2 +0 -0
- gns3server/static/web-ui/runtime.24fa95b7061d7056.js +1 -0
- gns3server/static/web-ui/styles.6e966072487df0b7.css +5 -0
- gns3server/symbols/.gitkeep +0 -0
- gns3server/symbols/affinity/circle/blue/atm.svg +5 -0
- gns3server/symbols/affinity/circle/blue/bug.svg +8 -0
- gns3server/symbols/affinity/circle/blue/camera.svg +5 -0
- gns3server/symbols/affinity/circle/blue/camera_dome.svg +8 -0
- gns3server/symbols/affinity/circle/blue/client.svg +5 -0
- gns3server/symbols/affinity/circle/blue/client_vm.svg +6 -0
- gns3server/symbols/affinity/circle/blue/cloud.svg +5 -0
- gns3server/symbols/affinity/circle/blue/coffee.svg +6 -0
- gns3server/symbols/affinity/circle/blue/cog.svg +5 -0
- gns3server/symbols/affinity/circle/blue/communications.svg +5 -0
- gns3server/symbols/affinity/circle/blue/conversation.svg +12 -0
- gns3server/symbols/affinity/circle/blue/dna.svg +7 -0
- gns3server/symbols/affinity/circle/blue/dna2.svg +7 -0
- gns3server/symbols/affinity/circle/blue/docker.svg +11 -0
- gns3server/symbols/affinity/circle/blue/dslam.svg +5 -0
- gns3server/symbols/affinity/circle/blue/factory.svg +6 -0
- gns3server/symbols/affinity/circle/blue/fingerprint.svg +5 -0
- gns3server/symbols/affinity/circle/blue/firewall.svg +5 -0
- gns3server/symbols/affinity/circle/blue/firewall3.svg +5 -0
- gns3server/symbols/affinity/circle/blue/globe.svg +5 -0
- gns3server/symbols/affinity/circle/blue/grid.svg +5 -0
- gns3server/symbols/affinity/circle/blue/grid2.svg +5 -0
- gns3server/symbols/affinity/circle/blue/health.svg +5 -0
- gns3server/symbols/affinity/circle/blue/house.svg +9 -0
- gns3server/symbols/affinity/circle/blue/hub.svg +5 -0
- gns3server/symbols/affinity/circle/blue/inspect.svg +7 -0
- gns3server/symbols/affinity/circle/blue/inspect2.svg +6 -0
- gns3server/symbols/affinity/circle/blue/interconnect.svg +5 -0
- gns3server/symbols/affinity/circle/blue/ip_phone.svg +21 -0
- gns3server/symbols/affinity/circle/blue/isdn.svg +5 -0
- gns3server/symbols/affinity/circle/blue/laptop.svg +6 -0
- gns3server/symbols/affinity/circle/blue/ldap.svg +5 -0
- gns3server/symbols/affinity/circle/blue/light_bulb.svg +11 -0
- gns3server/symbols/affinity/circle/blue/link.svg +5 -0
- gns3server/symbols/affinity/circle/blue/loadbalancer.svg +5 -0
- gns3server/symbols/affinity/circle/blue/nas.svg +5 -0
- gns3server/symbols/affinity/circle/blue/nat.svg +60 -0
- gns3server/symbols/affinity/circle/blue/nat2.svg +55 -0
- gns3server/symbols/affinity/circle/blue/office.svg +5 -0
- gns3server/symbols/affinity/circle/blue/optical.svg +8 -0
- gns3server/symbols/affinity/circle/blue/phone_cloud.svg +6 -0
- gns3server/symbols/affinity/circle/blue/phone_old.svg +5 -0
- gns3server/symbols/affinity/circle/blue/phone_wireless.svg +8 -0
- gns3server/symbols/affinity/circle/blue/pinpoint.svg +5 -0
- gns3server/symbols/affinity/circle/blue/printer.svg +7 -0
- gns3server/symbols/affinity/circle/blue/rj45.svg +5 -0
- gns3server/symbols/affinity/circle/blue/router.svg +5 -0
- gns3server/symbols/affinity/circle/blue/router2.svg +5 -0
- gns3server/symbols/affinity/circle/blue/router_cloud.svg +6 -0
- gns3server/symbols/affinity/circle/blue/satellite.svg +6 -0
- gns3server/symbols/affinity/circle/blue/satellite_dish.svg +7 -0
- gns3server/symbols/affinity/circle/blue/scull.svg +8 -0
- gns3server/symbols/affinity/circle/blue/server.svg +5 -0
- gns3server/symbols/affinity/circle/blue/server_cluster.svg +7 -0
- gns3server/symbols/affinity/circle/blue/shield.svg +7 -0
- gns3server/symbols/affinity/circle/blue/statistics.svg +7 -0
- gns3server/symbols/affinity/circle/blue/storage.svg +5 -0
- gns3server/symbols/affinity/circle/blue/switch.svg +8 -0
- gns3server/symbols/affinity/circle/blue/switch_multilayer.svg +5 -0
- gns3server/symbols/affinity/circle/blue/tablet.svg +11 -0
- gns3server/symbols/affinity/circle/blue/template.svg +4 -0
- gns3server/symbols/affinity/circle/blue/tree.svg +5 -0
- gns3server/symbols/affinity/circle/blue/user.svg +7 -0
- gns3server/symbols/affinity/circle/blue/virtualbox.svg +7 -0
- gns3server/symbols/affinity/circle/blue/vm.svg +7 -0
- gns3server/symbols/affinity/circle/blue/vmware.svg +7 -0
- gns3server/symbols/affinity/circle/blue/vrf.svg +8 -0
- gns3server/symbols/affinity/circle/blue/wifi.svg +5 -0
- gns3server/symbols/affinity/circle/blue/wlc.svg +5 -0
- gns3server/symbols/affinity/circle/blue/xml.svg +5 -0
- gns3server/symbols/affinity/circle/gray/atm.svg +5 -0
- gns3server/symbols/affinity/circle/gray/bug.svg +8 -0
- gns3server/symbols/affinity/circle/gray/camera.svg +5 -0
- gns3server/symbols/affinity/circle/gray/camera_dome.svg +8 -0
- gns3server/symbols/affinity/circle/gray/client.svg +5 -0
- gns3server/symbols/affinity/circle/gray/client_vm.svg +6 -0
- gns3server/symbols/affinity/circle/gray/cloud.svg +5 -0
- gns3server/symbols/affinity/circle/gray/coffee.svg +6 -0
- gns3server/symbols/affinity/circle/gray/cog.svg +5 -0
- gns3server/symbols/affinity/circle/gray/communications.svg +5 -0
- gns3server/symbols/affinity/circle/gray/conversation.svg +12 -0
- gns3server/symbols/affinity/circle/gray/dna.svg +7 -0
- gns3server/symbols/affinity/circle/gray/dna2.svg +7 -0
- gns3server/symbols/affinity/circle/gray/docker.svg +11 -0
- gns3server/symbols/affinity/circle/gray/dslam.svg +5 -0
- gns3server/symbols/affinity/circle/gray/factory.svg +7 -0
- gns3server/symbols/affinity/circle/gray/fingerprint.svg +5 -0
- gns3server/symbols/affinity/circle/gray/firewall.svg +5 -0
- gns3server/symbols/affinity/circle/gray/firewall3.svg +5 -0
- gns3server/symbols/affinity/circle/gray/globe.svg +5 -0
- gns3server/symbols/affinity/circle/gray/grid.svg +5 -0
- gns3server/symbols/affinity/circle/gray/grid2.svg +5 -0
- gns3server/symbols/affinity/circle/gray/health.svg +5 -0
- gns3server/symbols/affinity/circle/gray/house.svg +9 -0
- gns3server/symbols/affinity/circle/gray/hub.svg +5 -0
- gns3server/symbols/affinity/circle/gray/inspect.svg +7 -0
- gns3server/symbols/affinity/circle/gray/inspect2.svg +6 -0
- gns3server/symbols/affinity/circle/gray/interconnect.svg +5 -0
- gns3server/symbols/affinity/circle/gray/ip_phone.svg +21 -0
- gns3server/symbols/affinity/circle/gray/isdn.svg +5 -0
- gns3server/symbols/affinity/circle/gray/laptop.svg +6 -0
- gns3server/symbols/affinity/circle/gray/ldap.svg +5 -0
- gns3server/symbols/affinity/circle/gray/light_bulb.svg +11 -0
- gns3server/symbols/affinity/circle/gray/link.svg +5 -0
- gns3server/symbols/affinity/circle/gray/loadbalancer.svg +5 -0
- gns3server/symbols/affinity/circle/gray/nas.svg +5 -0
- gns3server/symbols/affinity/circle/gray/nat.svg +60 -0
- gns3server/symbols/affinity/circle/gray/nat2.svg +55 -0
- gns3server/symbols/affinity/circle/gray/office.svg +5 -0
- gns3server/symbols/affinity/circle/gray/optical.svg +8 -0
- gns3server/symbols/affinity/circle/gray/phone_cloud.svg +6 -0
- gns3server/symbols/affinity/circle/gray/phone_old.svg +5 -0
- gns3server/symbols/affinity/circle/gray/phone_wireless.svg +8 -0
- gns3server/symbols/affinity/circle/gray/pinpoint.svg +5 -0
- gns3server/symbols/affinity/circle/gray/printer.svg +25 -0
- gns3server/symbols/affinity/circle/gray/rj45.svg +5 -0
- gns3server/symbols/affinity/circle/gray/router.svg +5 -0
- gns3server/symbols/affinity/circle/gray/router2.svg +5 -0
- gns3server/symbols/affinity/circle/gray/router_cloud.svg +6 -0
- gns3server/symbols/affinity/circle/gray/satellite.svg +6 -0
- gns3server/symbols/affinity/circle/gray/satellite_dish.svg +7 -0
- gns3server/symbols/affinity/circle/gray/scull.svg +8 -0
- gns3server/symbols/affinity/circle/gray/server.svg +5 -0
- gns3server/symbols/affinity/circle/gray/server_cluster.svg +7 -0
- gns3server/symbols/affinity/circle/gray/shield.svg +7 -0
- gns3server/symbols/affinity/circle/gray/statistics.svg +7 -0
- gns3server/symbols/affinity/circle/gray/storage.svg +5 -0
- gns3server/symbols/affinity/circle/gray/switch.svg +8 -0
- gns3server/symbols/affinity/circle/gray/switch_multilayer.svg +5 -0
- gns3server/symbols/affinity/circle/gray/tablet.svg +11 -0
- gns3server/symbols/affinity/circle/gray/template.svg +4 -0
- gns3server/symbols/affinity/circle/gray/tree.svg +5 -0
- gns3server/symbols/affinity/circle/gray/user.svg +7 -0
- gns3server/symbols/affinity/circle/gray/virtualbox.svg +7 -0
- gns3server/symbols/affinity/circle/gray/vm.svg +7 -0
- gns3server/symbols/affinity/circle/gray/vmware.svg +7 -0
- gns3server/symbols/affinity/circle/gray/vrf.svg +8 -0
- gns3server/symbols/affinity/circle/gray/wifi.svg +5 -0
- gns3server/symbols/affinity/circle/gray/wlc.svg +5 -0
- gns3server/symbols/affinity/circle/gray/xml.svg +5 -0
- gns3server/symbols/affinity/circle/green/atm.svg +5 -0
- gns3server/symbols/affinity/circle/green/bug.svg +8 -0
- gns3server/symbols/affinity/circle/green/camera.svg +5 -0
- gns3server/symbols/affinity/circle/green/camera_dome.svg +8 -0
- gns3server/symbols/affinity/circle/green/client.svg +5 -0
- gns3server/symbols/affinity/circle/green/client_vm.svg +6 -0
- gns3server/symbols/affinity/circle/green/cloud.svg +5 -0
- gns3server/symbols/affinity/circle/green/coffee.svg +6 -0
- gns3server/symbols/affinity/circle/green/cog.svg +5 -0
- gns3server/symbols/affinity/circle/green/communications.svg +5 -0
- gns3server/symbols/affinity/circle/green/conversation.svg +12 -0
- gns3server/symbols/affinity/circle/green/dna.svg +7 -0
- gns3server/symbols/affinity/circle/green/dna2.svg +7 -0
- gns3server/symbols/affinity/circle/green/docker.svg +11 -0
- gns3server/symbols/affinity/circle/green/dslam.svg +5 -0
- gns3server/symbols/affinity/circle/green/factory.svg +6 -0
- gns3server/symbols/affinity/circle/green/fingerprint.svg +5 -0
- gns3server/symbols/affinity/circle/green/firewall.svg +5 -0
- gns3server/symbols/affinity/circle/green/firewall3.svg +5 -0
- gns3server/symbols/affinity/circle/green/globe.svg +5 -0
- gns3server/symbols/affinity/circle/green/grid.svg +5 -0
- gns3server/symbols/affinity/circle/green/grid2.svg +5 -0
- gns3server/symbols/affinity/circle/green/health.svg +5 -0
- gns3server/symbols/affinity/circle/green/house.svg +9 -0
- gns3server/symbols/affinity/circle/green/hub.svg +5 -0
- gns3server/symbols/affinity/circle/green/inspect.svg +7 -0
- gns3server/symbols/affinity/circle/green/inspect2.svg +6 -0
- gns3server/symbols/affinity/circle/green/interconnect.svg +5 -0
- gns3server/symbols/affinity/circle/green/ip_phone.svg +21 -0
- gns3server/symbols/affinity/circle/green/isdn.svg +5 -0
- gns3server/symbols/affinity/circle/green/laptop.svg +6 -0
- gns3server/symbols/affinity/circle/green/ldap.svg +5 -0
- gns3server/symbols/affinity/circle/green/light_bulb.svg +11 -0
- gns3server/symbols/affinity/circle/green/link.svg +5 -0
- gns3server/symbols/affinity/circle/green/loadbalancer.svg +5 -0
- gns3server/symbols/affinity/circle/green/nas.svg +5 -0
- gns3server/symbols/affinity/circle/green/nat.svg +60 -0
- gns3server/symbols/affinity/circle/green/nat2.svg +55 -0
- gns3server/symbols/affinity/circle/green/office.svg +5 -0
- gns3server/symbols/affinity/circle/green/optical.svg +8 -0
- gns3server/symbols/affinity/circle/green/phone_cloud.svg +6 -0
- gns3server/symbols/affinity/circle/green/phone_old.svg +5 -0
- gns3server/symbols/affinity/circle/green/phone_wireless.svg +8 -0
- gns3server/symbols/affinity/circle/green/pinpoint.svg +5 -0
- gns3server/symbols/affinity/circle/green/printer.svg +7 -0
- gns3server/symbols/affinity/circle/green/rj45.svg +5 -0
- gns3server/symbols/affinity/circle/green/router.svg +5 -0
- gns3server/symbols/affinity/circle/green/router2.svg +5 -0
- gns3server/symbols/affinity/circle/green/router_cloud.svg +6 -0
- gns3server/symbols/affinity/circle/green/satellite.svg +6 -0
- gns3server/symbols/affinity/circle/green/satellite_dish.svg +7 -0
- gns3server/symbols/affinity/circle/green/scull.svg +8 -0
- gns3server/symbols/affinity/circle/green/server.svg +5 -0
- gns3server/symbols/affinity/circle/green/server_cluster.svg +7 -0
- gns3server/symbols/affinity/circle/green/shield.svg +7 -0
- gns3server/symbols/affinity/circle/green/statistics.svg +7 -0
- gns3server/symbols/affinity/circle/green/storage.svg +5 -0
- gns3server/symbols/affinity/circle/green/switch.svg +8 -0
- gns3server/symbols/affinity/circle/green/switch_multilayer.svg +5 -0
- gns3server/symbols/affinity/circle/green/tablet.svg +11 -0
- gns3server/symbols/affinity/circle/green/template.svg +4 -0
- gns3server/symbols/affinity/circle/green/tree.svg +5 -0
- gns3server/symbols/affinity/circle/green/user.svg +7 -0
- gns3server/symbols/affinity/circle/green/virtualbox.svg +7 -0
- gns3server/symbols/affinity/circle/green/vm.svg +7 -0
- gns3server/symbols/affinity/circle/green/vmware.svg +7 -0
- gns3server/symbols/affinity/circle/green/vrf.svg +8 -0
- gns3server/symbols/affinity/circle/green/wifi.svg +5 -0
- gns3server/symbols/affinity/circle/green/wlc.svg +5 -0
- gns3server/symbols/affinity/circle/green/xml.svg +5 -0
- gns3server/symbols/affinity/circle/red/atm.svg +5 -0
- gns3server/symbols/affinity/circle/red/bug.svg +8 -0
- gns3server/symbols/affinity/circle/red/camera.svg +5 -0
- gns3server/symbols/affinity/circle/red/camera_dome.svg +8 -0
- gns3server/symbols/affinity/circle/red/client.svg +5 -0
- gns3server/symbols/affinity/circle/red/client_vm.svg +6 -0
- gns3server/symbols/affinity/circle/red/cloud.svg +5 -0
- gns3server/symbols/affinity/circle/red/coffee.svg +6 -0
- gns3server/symbols/affinity/circle/red/cog.svg +5 -0
- gns3server/symbols/affinity/circle/red/communications.svg +5 -0
- gns3server/symbols/affinity/circle/red/conversation.svg +12 -0
- gns3server/symbols/affinity/circle/red/dna.svg +7 -0
- gns3server/symbols/affinity/circle/red/dna2.svg +7 -0
- gns3server/symbols/affinity/circle/red/docker.svg +11 -0
- gns3server/symbols/affinity/circle/red/dslam.svg +5 -0
- gns3server/symbols/affinity/circle/red/factory.svg +6 -0
- gns3server/symbols/affinity/circle/red/fingerprint.svg +5 -0
- gns3server/symbols/affinity/circle/red/firewall.svg +5 -0
- gns3server/symbols/affinity/circle/red/firewall3.svg +5 -0
- gns3server/symbols/affinity/circle/red/globe.svg +5 -0
- gns3server/symbols/affinity/circle/red/grid.svg +5 -0
- gns3server/symbols/affinity/circle/red/grid2.svg +5 -0
- gns3server/symbols/affinity/circle/red/health.svg +5 -0
- gns3server/symbols/affinity/circle/red/house.svg +9 -0
- gns3server/symbols/affinity/circle/red/hub.svg +5 -0
- gns3server/symbols/affinity/circle/red/inspect.svg +7 -0
- gns3server/symbols/affinity/circle/red/inspect2.svg +6 -0
- gns3server/symbols/affinity/circle/red/interconnect.svg +5 -0
- gns3server/symbols/affinity/circle/red/ip_phone.svg +21 -0
- gns3server/symbols/affinity/circle/red/isdn.svg +5 -0
- gns3server/symbols/affinity/circle/red/laptop.svg +6 -0
- gns3server/symbols/affinity/circle/red/ldap.svg +5 -0
- gns3server/symbols/affinity/circle/red/light_bulb.svg +11 -0
- gns3server/symbols/affinity/circle/red/link.svg +5 -0
- gns3server/symbols/affinity/circle/red/loadbalancer.svg +5 -0
- gns3server/symbols/affinity/circle/red/nas.svg +5 -0
- gns3server/symbols/affinity/circle/red/nat.svg +60 -0
- gns3server/symbols/affinity/circle/red/nat2.svg +55 -0
- gns3server/symbols/affinity/circle/red/office.svg +5 -0
- gns3server/symbols/affinity/circle/red/optical.svg +8 -0
- gns3server/symbols/affinity/circle/red/phone_cloud.svg +6 -0
- gns3server/symbols/affinity/circle/red/phone_old.svg +5 -0
- gns3server/symbols/affinity/circle/red/phone_wireless.svg +8 -0
- gns3server/symbols/affinity/circle/red/pinpoint.svg +5 -0
- gns3server/symbols/affinity/circle/red/printer.svg +7 -0
- gns3server/symbols/affinity/circle/red/rj45.svg +5 -0
- gns3server/symbols/affinity/circle/red/router.svg +5 -0
- gns3server/symbols/affinity/circle/red/router2.svg +5 -0
- gns3server/symbols/affinity/circle/red/router_cloud.svg +6 -0
- gns3server/symbols/affinity/circle/red/satellite.svg +6 -0
- gns3server/symbols/affinity/circle/red/satellite_dish.svg +7 -0
- gns3server/symbols/affinity/circle/red/scull.svg +8 -0
- gns3server/symbols/affinity/circle/red/server.svg +5 -0
- gns3server/symbols/affinity/circle/red/server_cluster.svg +7 -0
- gns3server/symbols/affinity/circle/red/shield.svg +7 -0
- gns3server/symbols/affinity/circle/red/statistics.svg +7 -0
- gns3server/symbols/affinity/circle/red/storage.svg +5 -0
- gns3server/symbols/affinity/circle/red/switch.svg +8 -0
- gns3server/symbols/affinity/circle/red/switch_multilayer.svg +5 -0
- gns3server/symbols/affinity/circle/red/tablet.svg +11 -0
- gns3server/symbols/affinity/circle/red/template.svg +4 -0
- gns3server/symbols/affinity/circle/red/tree.svg +5 -0
- gns3server/symbols/affinity/circle/red/user.svg +7 -0
- gns3server/symbols/affinity/circle/red/virtualbox.svg +7 -0
- gns3server/symbols/affinity/circle/red/vm.svg +7 -0
- gns3server/symbols/affinity/circle/red/vmware.svg +7 -0
- gns3server/symbols/affinity/circle/red/vrf.svg +8 -0
- gns3server/symbols/affinity/circle/red/wifi.svg +5 -0
- gns3server/symbols/affinity/circle/red/wlc.svg +5 -0
- gns3server/symbols/affinity/circle/red/xml.svg +5 -0
- gns3server/symbols/affinity/square/blue/atm.svg +5 -0
- gns3server/symbols/affinity/square/blue/bug.svg +5 -0
- gns3server/symbols/affinity/square/blue/camera.svg +12 -0
- gns3server/symbols/affinity/square/blue/camera_dome.svg +8 -0
- gns3server/symbols/affinity/square/blue/client.svg +8 -0
- gns3server/symbols/affinity/square/blue/client_vm.svg +8 -0
- gns3server/symbols/affinity/square/blue/cloud.svg +12 -0
- gns3server/symbols/affinity/square/blue/coffee.svg +5 -0
- gns3server/symbols/affinity/square/blue/cog.svg +8 -0
- gns3server/symbols/affinity/square/blue/communications.svg +8 -0
- gns3server/symbols/affinity/square/blue/conversation.svg +12 -0
- gns3server/symbols/affinity/square/blue/dna.svg +7 -0
- gns3server/symbols/affinity/square/blue/dna2.svg +7 -0
- gns3server/symbols/affinity/square/blue/docker.svg +11 -0
- gns3server/symbols/affinity/square/blue/dslam.svg +8 -0
- gns3server/symbols/affinity/square/blue/factory.svg +5 -0
- gns3server/symbols/affinity/square/blue/fingerprint.svg +9 -0
- gns3server/symbols/affinity/square/blue/firewall.svg +7 -0
- gns3server/symbols/affinity/square/blue/firewall3.svg +6 -0
- gns3server/symbols/affinity/square/blue/globe.svg +5 -0
- gns3server/symbols/affinity/square/blue/grid.svg +7 -0
- gns3server/symbols/affinity/square/blue/grid2.svg +7 -0
- gns3server/symbols/affinity/square/blue/health.svg +5 -0
- gns3server/symbols/affinity/square/blue/house.svg +6 -0
- gns3server/symbols/affinity/square/blue/hub.svg +7 -0
- gns3server/symbols/affinity/square/blue/inspect.svg +5 -0
- gns3server/symbols/affinity/square/blue/inspect2.svg +9 -0
- gns3server/symbols/affinity/square/blue/interconnect.svg +8 -0
- gns3server/symbols/affinity/square/blue/ip_phone.svg +23 -0
- gns3server/symbols/affinity/square/blue/isdn.svg +7 -0
- gns3server/symbols/affinity/square/blue/laptop.svg +8 -0
- gns3server/symbols/affinity/square/blue/ldap.svg +5 -0
- gns3server/symbols/affinity/square/blue/light_bulb.svg +11 -0
- gns3server/symbols/affinity/square/blue/link.svg +5 -0
- gns3server/symbols/affinity/square/blue/loadbalancer.svg +5 -0
- gns3server/symbols/affinity/square/blue/nas.svg +7 -0
- gns3server/symbols/affinity/square/blue/nat.svg +58 -0
- gns3server/symbols/affinity/square/blue/nat2.svg +74 -0
- gns3server/symbols/affinity/square/blue/office.svg +5 -0
- gns3server/symbols/affinity/square/blue/optical.svg +8 -0
- gns3server/symbols/affinity/square/blue/phone_cloud.svg +8 -0
- gns3server/symbols/affinity/square/blue/phone_old.svg +7 -0
- gns3server/symbols/affinity/square/blue/phone_wireless.svg +10 -0
- gns3server/symbols/affinity/square/blue/pinpoint.svg +9 -0
- gns3server/symbols/affinity/square/blue/printer.svg +27 -0
- gns3server/symbols/affinity/square/blue/rj45.svg +14 -0
- gns3server/symbols/affinity/square/blue/router.svg +7 -0
- gns3server/symbols/affinity/square/blue/router2.svg +5 -0
- gns3server/symbols/affinity/square/blue/router_cloud.svg +7 -0
- gns3server/symbols/affinity/square/blue/satellite.svg +8 -0
- gns3server/symbols/affinity/square/blue/satellite_dish.svg +7 -0
- gns3server/symbols/affinity/square/blue/scull.svg +10 -0
- gns3server/symbols/affinity/square/blue/server.svg +5 -0
- gns3server/symbols/affinity/square/blue/server_cluster.svg +9 -0
- gns3server/symbols/affinity/square/blue/shield.svg +5 -0
- gns3server/symbols/affinity/square/blue/statistics.svg +7 -0
- gns3server/symbols/affinity/square/blue/storage.svg +7 -0
- gns3server/symbols/affinity/square/blue/switch.svg +10 -0
- gns3server/symbols/affinity/square/blue/switch_multilayer.svg +8 -0
- gns3server/symbols/affinity/square/blue/tablet.svg +9 -0
- gns3server/symbols/affinity/square/blue/template.svg +4 -0
- gns3server/symbols/affinity/square/blue/tree.svg +5 -0
- gns3server/symbols/affinity/square/blue/user.svg +7 -0
- gns3server/symbols/affinity/square/blue/virtualbox.svg +7 -0
- gns3server/symbols/affinity/square/blue/vm.svg +7 -0
- gns3server/symbols/affinity/square/blue/vmware.svg +7 -0
- gns3server/symbols/affinity/square/blue/vrf.svg +5 -0
- gns3server/symbols/affinity/square/blue/wifi.svg +13 -0
- gns3server/symbols/affinity/square/blue/wlc.svg +7 -0
- gns3server/symbols/affinity/square/blue/xml.svg +10 -0
- gns3server/symbols/affinity/square/gray/atm.svg +5 -0
- gns3server/symbols/affinity/square/gray/bug.svg +5 -0
- gns3server/symbols/affinity/square/gray/camera.svg +12 -0
- gns3server/symbols/affinity/square/gray/camera_dome.svg +8 -0
- gns3server/symbols/affinity/square/gray/client.svg +8 -0
- gns3server/symbols/affinity/square/gray/client_vm.svg +8 -0
- gns3server/symbols/affinity/square/gray/cloud.svg +12 -0
- gns3server/symbols/affinity/square/gray/coffee.svg +5 -0
- gns3server/symbols/affinity/square/gray/cog.svg +8 -0
- gns3server/symbols/affinity/square/gray/communications.svg +8 -0
- gns3server/symbols/affinity/square/gray/conversation.svg +12 -0
- gns3server/symbols/affinity/square/gray/dna.svg +7 -0
- gns3server/symbols/affinity/square/gray/dna2.svg +7 -0
- gns3server/symbols/affinity/square/gray/docker.svg +11 -0
- gns3server/symbols/affinity/square/gray/dslam.svg +8 -0
- gns3server/symbols/affinity/square/gray/factory.svg +5 -0
- gns3server/symbols/affinity/square/gray/fingerprint.svg +9 -0
- gns3server/symbols/affinity/square/gray/firewall.svg +7 -0
- gns3server/symbols/affinity/square/gray/firewall3.svg +6 -0
- gns3server/symbols/affinity/square/gray/globe.svg +5 -0
- gns3server/symbols/affinity/square/gray/grid.svg +7 -0
- gns3server/symbols/affinity/square/gray/grid2.svg +7 -0
- gns3server/symbols/affinity/square/gray/health.svg +5 -0
- gns3server/symbols/affinity/square/gray/house.svg +6 -0
- gns3server/symbols/affinity/square/gray/hub.svg +7 -0
- gns3server/symbols/affinity/square/gray/inspect.svg +5 -0
- gns3server/symbols/affinity/square/gray/inspect2.svg +9 -0
- gns3server/symbols/affinity/square/gray/interconnect.svg +8 -0
- gns3server/symbols/affinity/square/gray/ip_phone.svg +23 -0
- gns3server/symbols/affinity/square/gray/isdn.svg +7 -0
- gns3server/symbols/affinity/square/gray/laptop.svg +8 -0
- gns3server/symbols/affinity/square/gray/ldap.svg +5 -0
- gns3server/symbols/affinity/square/gray/light_bulb.svg +11 -0
- gns3server/symbols/affinity/square/gray/link.svg +5 -0
- gns3server/symbols/affinity/square/gray/loadbalancer.svg +5 -0
- gns3server/symbols/affinity/square/gray/nas.svg +7 -0
- gns3server/symbols/affinity/square/gray/nat.svg +58 -0
- gns3server/symbols/affinity/square/gray/nat2.svg +74 -0
- gns3server/symbols/affinity/square/gray/office.svg +5 -0
- gns3server/symbols/affinity/square/gray/optical.svg +8 -0
- gns3server/symbols/affinity/square/gray/phone_cloud.svg +8 -0
- gns3server/symbols/affinity/square/gray/phone_old.svg +7 -0
- gns3server/symbols/affinity/square/gray/phone_wireless.svg +10 -0
- gns3server/symbols/affinity/square/gray/pinpoint.svg +9 -0
- gns3server/symbols/affinity/square/gray/printer.svg +27 -0
- gns3server/symbols/affinity/square/gray/rj45.svg +14 -0
- gns3server/symbols/affinity/square/gray/router.svg +7 -0
- gns3server/symbols/affinity/square/gray/router2.svg +5 -0
- gns3server/symbols/affinity/square/gray/router_cloud.svg +7 -0
- gns3server/symbols/affinity/square/gray/satellite.svg +8 -0
- gns3server/symbols/affinity/square/gray/satellite_dish.svg +7 -0
- gns3server/symbols/affinity/square/gray/scull.svg +10 -0
- gns3server/symbols/affinity/square/gray/server.svg +5 -0
- gns3server/symbols/affinity/square/gray/server_cluster.svg +9 -0
- gns3server/symbols/affinity/square/gray/shield.svg +5 -0
- gns3server/symbols/affinity/square/gray/statistics.svg +7 -0
- gns3server/symbols/affinity/square/gray/storage.svg +5 -0
- gns3server/symbols/affinity/square/gray/switch.svg +10 -0
- gns3server/symbols/affinity/square/gray/switch_multilayer.svg +9 -0
- gns3server/symbols/affinity/square/gray/tablet.svg +9 -0
- gns3server/symbols/affinity/square/gray/template.svg +4 -0
- gns3server/symbols/affinity/square/gray/tree.svg +5 -0
- gns3server/symbols/affinity/square/gray/user.svg +7 -0
- gns3server/symbols/affinity/square/gray/virtualbox.svg +7 -0
- gns3server/symbols/affinity/square/gray/vm.svg +7 -0
- gns3server/symbols/affinity/square/gray/vmware.svg +7 -0
- gns3server/symbols/affinity/square/gray/vrf.svg +5 -0
- gns3server/symbols/affinity/square/gray/wifi.svg +13 -0
- gns3server/symbols/affinity/square/gray/wlc.svg +7 -0
- gns3server/symbols/affinity/square/gray/xml.svg +10 -0
- gns3server/symbols/affinity/square/green/atm.svg +5 -0
- gns3server/symbols/affinity/square/green/bug.svg +5 -0
- gns3server/symbols/affinity/square/green/camera.svg +5 -0
- gns3server/symbols/affinity/square/green/camera_dome.svg +8 -0
- gns3server/symbols/affinity/square/green/client.svg +5 -0
- gns3server/symbols/affinity/square/green/client_vm.svg +6 -0
- gns3server/symbols/affinity/square/green/cloud.svg +12 -0
- gns3server/symbols/affinity/square/green/coffee.svg +5 -0
- gns3server/symbols/affinity/square/green/cog.svg +5 -0
- gns3server/symbols/affinity/square/green/communications.svg +5 -0
- gns3server/symbols/affinity/square/green/conversation.svg +12 -0
- gns3server/symbols/affinity/square/green/dna.svg +7 -0
- gns3server/symbols/affinity/square/green/dna2.svg +7 -0
- gns3server/symbols/affinity/square/green/docker.svg +11 -0
- gns3server/symbols/affinity/square/green/dslam.svg +5 -0
- gns3server/symbols/affinity/square/green/factory.svg +5 -0
- gns3server/symbols/affinity/square/green/fingerprint.svg +5 -0
- gns3server/symbols/affinity/square/green/firewall.svg +5 -0
- gns3server/symbols/affinity/square/green/firewall3.svg +5 -0
- gns3server/symbols/affinity/square/green/globe.svg +5 -0
- gns3server/symbols/affinity/square/green/grid.svg +5 -0
- gns3server/symbols/affinity/square/green/grid2.svg +5 -0
- gns3server/symbols/affinity/square/green/health.svg +5 -0
- gns3server/symbols/affinity/square/green/house.svg +6 -0
- gns3server/symbols/affinity/square/green/hub.svg +5 -0
- gns3server/symbols/affinity/square/green/inspect.svg +5 -0
- gns3server/symbols/affinity/square/green/inspect2.svg +5 -0
- gns3server/symbols/affinity/square/green/interconnect.svg +5 -0
- gns3server/symbols/affinity/square/green/ip_phone.svg +7 -0
- gns3server/symbols/affinity/square/green/isdn.svg +5 -0
- gns3server/symbols/affinity/square/green/laptop.svg +8 -0
- gns3server/symbols/affinity/square/green/ldap.svg +5 -0
- gns3server/symbols/affinity/square/green/light_bulb.svg +5 -0
- gns3server/symbols/affinity/square/green/link.svg +5 -0
- gns3server/symbols/affinity/square/green/loadbalancer.svg +5 -0
- gns3server/symbols/affinity/square/green/nas.svg +5 -0
- gns3server/symbols/affinity/square/green/nat.svg +58 -0
- gns3server/symbols/affinity/square/green/nat2.svg +74 -0
- gns3server/symbols/affinity/square/green/office.svg +5 -0
- gns3server/symbols/affinity/square/green/optical.svg +8 -0
- gns3server/symbols/affinity/square/green/phone_cloud.svg +6 -0
- gns3server/symbols/affinity/square/green/phone_old.svg +5 -0
- gns3server/symbols/affinity/square/green/phone_wireless.svg +5 -0
- gns3server/symbols/affinity/square/green/pinpoint.svg +5 -0
- gns3server/symbols/affinity/square/green/printer.svg +27 -0
- gns3server/symbols/affinity/square/green/rj45.svg +5 -0
- gns3server/symbols/affinity/square/green/router.svg +5 -0
- gns3server/symbols/affinity/square/green/router2.svg +5 -0
- gns3server/symbols/affinity/square/green/router_cloud.svg +6 -0
- gns3server/symbols/affinity/square/green/satellite.svg +5 -0
- gns3server/symbols/affinity/square/green/satellite_dish.svg +5 -0
- gns3server/symbols/affinity/square/green/scull.svg +8 -0
- gns3server/symbols/affinity/square/green/server.svg +5 -0
- gns3server/symbols/affinity/square/green/server_cluster.svg +7 -0
- gns3server/symbols/affinity/square/green/shield.svg +5 -0
- gns3server/symbols/affinity/square/green/statistics.svg +5 -0
- gns3server/symbols/affinity/square/green/storage.svg +5 -0
- gns3server/symbols/affinity/square/green/switch.svg +10 -0
- gns3server/symbols/affinity/square/green/switch_multilayer.svg +5 -0
- gns3server/symbols/affinity/square/green/tablet.svg +9 -0
- gns3server/symbols/affinity/square/green/template.svg +4 -0
- gns3server/symbols/affinity/square/green/tree.svg +5 -0
- gns3server/symbols/affinity/square/green/user.svg +7 -0
- gns3server/symbols/affinity/square/green/virtualbox.svg +7 -0
- gns3server/symbols/affinity/square/green/vm.svg +7 -0
- gns3server/symbols/affinity/square/green/vmware.svg +7 -0
- gns3server/symbols/affinity/square/green/vrf.svg +5 -0
- gns3server/symbols/affinity/square/green/wifi.svg +5 -0
- gns3server/symbols/affinity/square/green/wlc.svg +5 -0
- gns3server/symbols/affinity/square/green/xml.svg +5 -0
- gns3server/symbols/affinity/square/red/atm.svg +5 -0
- gns3server/symbols/affinity/square/red/bug.svg +5 -0
- gns3server/symbols/affinity/square/red/camera.svg +12 -0
- gns3server/symbols/affinity/square/red/camera_dome.svg +8 -0
- gns3server/symbols/affinity/square/red/client.svg +8 -0
- gns3server/symbols/affinity/square/red/client_vm.svg +8 -0
- gns3server/symbols/affinity/square/red/cloud.svg +12 -0
- gns3server/symbols/affinity/square/red/coffee.svg +5 -0
- gns3server/symbols/affinity/square/red/cog.svg +8 -0
- gns3server/symbols/affinity/square/red/communications.svg +8 -0
- gns3server/symbols/affinity/square/red/conversation.svg +12 -0
- gns3server/symbols/affinity/square/red/dna.svg +7 -0
- gns3server/symbols/affinity/square/red/dna2.svg +7 -0
- gns3server/symbols/affinity/square/red/docker.svg +11 -0
- gns3server/symbols/affinity/square/red/dslam.svg +8 -0
- gns3server/symbols/affinity/square/red/factory.svg +5 -0
- gns3server/symbols/affinity/square/red/fingerprint.svg +9 -0
- gns3server/symbols/affinity/square/red/firewall.svg +7 -0
- gns3server/symbols/affinity/square/red/firewall3.svg +5 -0
- gns3server/symbols/affinity/square/red/globe.svg +5 -0
- gns3server/symbols/affinity/square/red/grid.svg +7 -0
- gns3server/symbols/affinity/square/red/grid2.svg +7 -0
- gns3server/symbols/affinity/square/red/health.svg +5 -0
- gns3server/symbols/affinity/square/red/house.svg +6 -0
- gns3server/symbols/affinity/square/red/hub.svg +7 -0
- gns3server/symbols/affinity/square/red/inspect.svg +5 -0
- gns3server/symbols/affinity/square/red/inspect2.svg +9 -0
- gns3server/symbols/affinity/square/red/interconnect.svg +8 -0
- gns3server/symbols/affinity/square/red/ip_phone.svg +7 -0
- gns3server/symbols/affinity/square/red/isdn.svg +7 -0
- gns3server/symbols/affinity/square/red/laptop.svg +8 -0
- gns3server/symbols/affinity/square/red/ldap.svg +5 -0
- gns3server/symbols/affinity/square/red/light_bulb.svg +5 -0
- gns3server/symbols/affinity/square/red/link.svg +5 -0
- gns3server/symbols/affinity/square/red/loadbalancer.svg +5 -0
- gns3server/symbols/affinity/square/red/nas.svg +7 -0
- gns3server/symbols/affinity/square/red/nat.svg +58 -0
- gns3server/symbols/affinity/square/red/nat2.svg +74 -0
- gns3server/symbols/affinity/square/red/office.svg +5 -0
- gns3server/symbols/affinity/square/red/optical.svg +8 -0
- gns3server/symbols/affinity/square/red/phone_cloud.svg +6 -0
- gns3server/symbols/affinity/square/red/phone_old.svg +5 -0
- gns3server/symbols/affinity/square/red/phone_wireless.svg +5 -0
- gns3server/symbols/affinity/square/red/pinpoint.svg +9 -0
- gns3server/symbols/affinity/square/red/printer.svg +27 -0
- gns3server/symbols/affinity/square/red/rj45.svg +14 -0
- gns3server/symbols/affinity/square/red/router.svg +7 -0
- gns3server/symbols/affinity/square/red/router2.svg +5 -0
- gns3server/symbols/affinity/square/red/router_cloud.svg +6 -0
- gns3server/symbols/affinity/square/red/satellite.svg +8 -0
- gns3server/symbols/affinity/square/red/satellite_dish.svg +5 -0
- gns3server/symbols/affinity/square/red/scull.svg +10 -0
- gns3server/symbols/affinity/square/red/server.svg +5 -0
- gns3server/symbols/affinity/square/red/server_cluster.svg +9 -0
- gns3server/symbols/affinity/square/red/shield.svg +5 -0
- gns3server/symbols/affinity/square/red/statistics.svg +5 -0
- gns3server/symbols/affinity/square/red/storage.svg +7 -0
- gns3server/symbols/affinity/square/red/switch.svg +10 -0
- gns3server/symbols/affinity/square/red/switch_multilayer.svg +9 -0
- gns3server/symbols/affinity/square/red/tablet.svg +9 -0
- gns3server/symbols/affinity/square/red/template.svg +4 -0
- gns3server/symbols/affinity/square/red/tree.svg +5 -0
- gns3server/symbols/affinity/square/red/user.svg +7 -0
- gns3server/symbols/affinity/square/red/virtualbox.svg +7 -0
- gns3server/symbols/affinity/square/red/vm.svg +7 -0
- gns3server/symbols/affinity/square/red/vmware.svg +7 -0
- gns3server/symbols/affinity/square/red/vrf.svg +5 -0
- gns3server/symbols/affinity/square/red/wifi.svg +13 -0
- gns3server/symbols/affinity/square/red/wlc.svg +7 -0
- gns3server/symbols/affinity/square/red/xml.svg +10 -0
- gns3server/symbols/classic/PBX.svg +304 -0
- gns3server/symbols/classic/PIX_firewall.svg +187 -0
- gns3server/symbols/classic/access_point.svg +516 -0
- gns3server/symbols/classic/access_server.svg +270 -0
- gns3server/symbols/classic/asa.svg +424 -0
- gns3server/symbols/classic/atm_bridge.svg +219 -0
- gns3server/symbols/classic/atm_switch.svg +243 -0
- gns3server/symbols/classic/call_manager.svg +228 -0
- gns3server/symbols/classic/cloud.svg +163 -0
- gns3server/symbols/classic/computer.svg +560 -0
- gns3server/symbols/classic/docker_guest.svg +657 -0
- gns3server/symbols/classic/dslam.svg +155 -0
- gns3server/symbols/classic/edge_label_switch_router.svg +216 -0
- gns3server/symbols/classic/ethernet_switch.svg +228 -0
- gns3server/symbols/classic/firewall.svg +187 -0
- gns3server/symbols/classic/frame_relay_switch.svg +263 -0
- gns3server/symbols/classic/gateway.svg +309 -0
- gns3server/symbols/classic/hub.svg +204 -0
- gns3server/symbols/classic/ids.svg +310 -0
- gns3server/symbols/classic/iosv_l2_virl.svg +286 -0
- gns3server/symbols/classic/iosv_virl.svg +394 -0
- gns3server/symbols/classic/ip_phone.svg +171 -0
- gns3server/symbols/classic/label_switch_router.svg +223 -0
- gns3server/symbols/classic/lightweight_ap.svg +536 -0
- gns3server/symbols/classic/multilayer_switch.svg +317 -0
- gns3server/symbols/classic/nat.svg +207 -0
- gns3server/symbols/classic/optical_router.svg +207 -0
- gns3server/symbols/classic/printer.svg +178 -0
- gns3server/symbols/classic/qemu_guest.svg +1387 -0
- gns3server/symbols/classic/route_switch_processor.svg +395 -0
- gns3server/symbols/classic/router.awp.svg +362 -0
- gns3server/symbols/classic/router.svg +203 -0
- gns3server/symbols/classic/router_firewall.svg +395 -0
- gns3server/symbols/classic/router_netflow.svg +215 -0
- gns3server/symbols/classic/server.svg +226 -0
- gns3server/symbols/classic/sip_server.svg +305 -0
- gns3server/symbols/classic/traceng.svg +610 -0
- gns3server/symbols/classic/vbox_guest.svg +7691 -0
- gns3server/symbols/classic/vmware_guest.svg +572 -0
- gns3server/symbols/classic/voice_access_server.svg +289 -0
- gns3server/symbols/classic/voice_router.svg +223 -0
- gns3server/symbols/classic/vpcs_guest.svg +574 -0
- gns3server/symbols/classic/wlan_controller.svg +528 -0
- gns3server/templates/compute.html +62 -0
- gns3server/templates/controller.html +55 -0
- gns3server/templates/index.html +12 -0
- gns3server/templates/layout.html +20 -0
- gns3server/templates/project.html +91 -0
- gns3server/templates/upload.html +6 -0
- gns3server/utils/__init__.py +123 -0
- gns3server/utils/application_id.py +49 -0
- gns3server/utils/asyncio/__init__.py +148 -0
- gns3server/utils/asyncio/aiozipstream.py +528 -0
- gns3server/utils/asyncio/embed_shell.py +369 -0
- gns3server/utils/asyncio/input_stream.py +408 -0
- gns3server/utils/asyncio/pool.py +69 -0
- gns3server/utils/asyncio/raw_command_server.py +140 -0
- gns3server/utils/asyncio/serial.py +87 -0
- gns3server/utils/asyncio/telnet_server.py +450 -0
- gns3server/utils/cpu_percent.py +46 -0
- gns3server/utils/file_watcher.py +103 -0
- gns3server/utils/get_resource.py +48 -0
- gns3server/utils/hostname.py +112 -0
- gns3server/utils/http_client.py +71 -0
- gns3server/utils/images.py +378 -0
- gns3server/utils/interfaces.py +254 -0
- gns3server/utils/notification_queue.py +79 -0
- gns3server/utils/path.py +76 -0
- gns3server/utils/picture.py +146 -0
- gns3server/utils/qt.py +44 -0
- gns3server/utils/vmnet.py +277 -0
- gns3server/utils/zipfile_zstd/__init__.py +10 -0
- gns3server/utils/zipfile_zstd/_patcher.py +20 -0
- gns3server/utils/zipfile_zstd/_zipfile.py +64 -0
- gns3server/version.py +36 -0
|
@@ -0,0 +1,1007 @@
|
|
|
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
|
+
VMware VM instance.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import sys
|
|
22
|
+
import os
|
|
23
|
+
import asyncio
|
|
24
|
+
import tempfile
|
|
25
|
+
import platform
|
|
26
|
+
|
|
27
|
+
from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
|
|
28
|
+
from gns3server.utils.asyncio.serial import asyncio_open_serial
|
|
29
|
+
from gns3server.utils import parse_version
|
|
30
|
+
from gns3server.utils.asyncio import locking
|
|
31
|
+
from collections import OrderedDict
|
|
32
|
+
from .vmware_error import VMwareError
|
|
33
|
+
from ..nios.nio_udp import NIOUDP
|
|
34
|
+
from ..adapters.ethernet_adapter import EthernetAdapter
|
|
35
|
+
from ..base_node import BaseNode
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
import logging
|
|
39
|
+
|
|
40
|
+
log = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class VMwareVM(BaseNode):
|
|
44
|
+
|
|
45
|
+
"""
|
|
46
|
+
VMware VM implementation.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self, name, node_id, project, manager, vmx_path, linked_clone=False, console=None, console_type="telnet"
|
|
51
|
+
):
|
|
52
|
+
|
|
53
|
+
super().__init__(
|
|
54
|
+
name, node_id, project, manager, console=console, console_type=console_type, linked_clone=linked_clone
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
self._vmx_pairs = OrderedDict()
|
|
58
|
+
self._telnet_server = None
|
|
59
|
+
self._vmnets = []
|
|
60
|
+
self._maximum_adapters = 10
|
|
61
|
+
self._started = False
|
|
62
|
+
self._closed = False
|
|
63
|
+
|
|
64
|
+
# VMware VM settings
|
|
65
|
+
self._headless = False
|
|
66
|
+
self._vmx_path = vmx_path
|
|
67
|
+
self._on_close = "power_off"
|
|
68
|
+
self._adapters = 0
|
|
69
|
+
self._ethernet_adapters = {}
|
|
70
|
+
self._adapter_type = "e1000"
|
|
71
|
+
self._use_any_adapter = False
|
|
72
|
+
|
|
73
|
+
if not os.path.exists(vmx_path):
|
|
74
|
+
raise VMwareError(f'VMware VM "{name}" [{node_id}]: could not find VMX file "{vmx_path}"')
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def ethernet_adapters(self):
|
|
78
|
+
return self._ethernet_adapters
|
|
79
|
+
|
|
80
|
+
def asdict(self):
|
|
81
|
+
|
|
82
|
+
json = {
|
|
83
|
+
"name": self.name,
|
|
84
|
+
"usage": self.usage,
|
|
85
|
+
"node_id": self.id,
|
|
86
|
+
"console": self.console,
|
|
87
|
+
"console_type": self.console_type,
|
|
88
|
+
"project_id": self.project.id,
|
|
89
|
+
"vmx_path": self.vmx_path,
|
|
90
|
+
"headless": self.headless,
|
|
91
|
+
"on_close": self.on_close,
|
|
92
|
+
"adapters": self._adapters,
|
|
93
|
+
"adapter_type": self.adapter_type,
|
|
94
|
+
"use_any_adapter": self.use_any_adapter,
|
|
95
|
+
"status": self.status,
|
|
96
|
+
"node_directory": self.working_path,
|
|
97
|
+
"linked_clone": self.linked_clone,
|
|
98
|
+
}
|
|
99
|
+
return json
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def vmnets(self):
|
|
103
|
+
|
|
104
|
+
return self._vmnets
|
|
105
|
+
|
|
106
|
+
@locking
|
|
107
|
+
async def _control_vm(self, subcommand, *additional_args):
|
|
108
|
+
|
|
109
|
+
args = [self._vmx_path]
|
|
110
|
+
args.extend(additional_args)
|
|
111
|
+
result = await self.manager.execute(subcommand, args)
|
|
112
|
+
log.debug(f"Control VM '{subcommand}' result: {result}")
|
|
113
|
+
return result
|
|
114
|
+
|
|
115
|
+
def _read_vmx_file(self):
|
|
116
|
+
"""
|
|
117
|
+
Reads from the VMware VMX file corresponding to this VM.
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
try:
|
|
121
|
+
self._vmx_pairs = self.manager.parse_vmware_file(self._vmx_path)
|
|
122
|
+
except OSError as e:
|
|
123
|
+
raise VMwareError(f'Could not read VMware VMX file "{self._vmx_path}": {e}')
|
|
124
|
+
|
|
125
|
+
def _write_vmx_file(self):
|
|
126
|
+
"""
|
|
127
|
+
Writes pairs to the VMware VMX file corresponding to this VM.
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
self.manager.write_vmx_file(self._vmx_path, self._vmx_pairs)
|
|
132
|
+
except OSError as e:
|
|
133
|
+
raise VMwareError(f'Could not write VMware VMX file "{self._vmx_path}": {e}')
|
|
134
|
+
|
|
135
|
+
async def is_running(self):
|
|
136
|
+
|
|
137
|
+
result = await self.manager.execute("list", [])
|
|
138
|
+
if self._vmx_path in result:
|
|
139
|
+
return True
|
|
140
|
+
return False
|
|
141
|
+
|
|
142
|
+
async def _check_duplicate_linked_clone(self):
|
|
143
|
+
"""
|
|
144
|
+
Without linked clone two VM using the same image can't run
|
|
145
|
+
at the same time.
|
|
146
|
+
|
|
147
|
+
To avoid issue like false detection when a project close
|
|
148
|
+
and another open we try multiple times.
|
|
149
|
+
"""
|
|
150
|
+
trial = 0
|
|
151
|
+
|
|
152
|
+
while True:
|
|
153
|
+
found = False
|
|
154
|
+
for node in self.manager.nodes:
|
|
155
|
+
if node != self and node.vmx_path == self._vmx_path:
|
|
156
|
+
found = True
|
|
157
|
+
if node.project != self.project:
|
|
158
|
+
if trial >= 30:
|
|
159
|
+
raise VMwareError(
|
|
160
|
+
f"Sorry a node without the linked clone setting enabled can only be used once on your server.\n{self.vmx_path} is already used by {node.name} in project {self.project.name}"
|
|
161
|
+
)
|
|
162
|
+
else:
|
|
163
|
+
if trial >= 5:
|
|
164
|
+
raise VMwareError(
|
|
165
|
+
f"Sorry a node without the linked clone setting enabled can only be used once on your server.\n{self.vmx_path} is already used by {node.name} in this project"
|
|
166
|
+
)
|
|
167
|
+
if not found:
|
|
168
|
+
return
|
|
169
|
+
trial += 1
|
|
170
|
+
await asyncio.sleep(1)
|
|
171
|
+
|
|
172
|
+
async def create(self):
|
|
173
|
+
"""
|
|
174
|
+
Creates this VM and handle linked clones.
|
|
175
|
+
"""
|
|
176
|
+
if not self.linked_clone:
|
|
177
|
+
await self._check_duplicate_linked_clone()
|
|
178
|
+
|
|
179
|
+
await self.manager.check_vmrun_version()
|
|
180
|
+
if self.linked_clone and not os.path.exists(os.path.join(self.working_dir, os.path.basename(self._vmx_path))):
|
|
181
|
+
if self.manager.host_type == "player":
|
|
182
|
+
raise VMwareError("Linked clones are not supported by VMware Player")
|
|
183
|
+
# create the base snapshot for linked clones
|
|
184
|
+
base_snapshot_name = "GNS3 Linked Base for clones"
|
|
185
|
+
vmsd_path = os.path.splitext(self._vmx_path)[0] + ".vmsd"
|
|
186
|
+
if not os.path.exists(vmsd_path):
|
|
187
|
+
raise VMwareError(f"{vmsd_path} doesn't not exist")
|
|
188
|
+
try:
|
|
189
|
+
vmsd_pairs = self.manager.parse_vmware_file(vmsd_path)
|
|
190
|
+
except OSError as e:
|
|
191
|
+
raise VMwareError(f'Could not read VMware VMSD file "{vmsd_path}": {e}')
|
|
192
|
+
gns3_snapshot_exists = False
|
|
193
|
+
for value in vmsd_pairs.values():
|
|
194
|
+
if value == base_snapshot_name:
|
|
195
|
+
gns3_snapshot_exists = True
|
|
196
|
+
break
|
|
197
|
+
if not gns3_snapshot_exists:
|
|
198
|
+
log.info(f"Creating snapshot '{base_snapshot_name}'")
|
|
199
|
+
await self._control_vm("snapshot", base_snapshot_name)
|
|
200
|
+
|
|
201
|
+
# create the linked clone based on the base snapshot
|
|
202
|
+
new_vmx_path = os.path.join(self.working_dir, self.name + ".vmx")
|
|
203
|
+
await self._control_vm(
|
|
204
|
+
"clone", new_vmx_path, "linked", f"-snapshot={base_snapshot_name}", f"-cloneName={self.name}"
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
try:
|
|
208
|
+
vmsd_pairs = self.manager.parse_vmware_file(vmsd_path)
|
|
209
|
+
except OSError as e:
|
|
210
|
+
raise VMwareError(f'Could not read VMware VMSD file "{vmsd_path}": {e}')
|
|
211
|
+
|
|
212
|
+
snapshot_name = None
|
|
213
|
+
for name, value in vmsd_pairs.items():
|
|
214
|
+
if value == base_snapshot_name:
|
|
215
|
+
snapshot_name = name.split(".", 1)[0]
|
|
216
|
+
break
|
|
217
|
+
|
|
218
|
+
if snapshot_name is None:
|
|
219
|
+
raise VMwareError(f"Could not find the linked base snapshot in {vmsd_path}")
|
|
220
|
+
|
|
221
|
+
num_clones_entry = f"{snapshot_name}.numClones"
|
|
222
|
+
if num_clones_entry in vmsd_pairs:
|
|
223
|
+
try:
|
|
224
|
+
nb_of_clones = int(vmsd_pairs[num_clones_entry])
|
|
225
|
+
except ValueError:
|
|
226
|
+
raise VMwareError(f"Value of {num_clones_entry} in {vmsd_path} is not a number")
|
|
227
|
+
vmsd_pairs[num_clones_entry] = str(nb_of_clones - 1)
|
|
228
|
+
|
|
229
|
+
for clone_nb in range(0, nb_of_clones):
|
|
230
|
+
clone_entry = f"{snapshot_name}.clone{clone_nb}"
|
|
231
|
+
if clone_entry in vmsd_pairs:
|
|
232
|
+
del vmsd_pairs[clone_entry]
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
self.manager.write_vmware_file(vmsd_path, vmsd_pairs)
|
|
236
|
+
except OSError as e:
|
|
237
|
+
raise VMwareError(f'Could not write VMware VMSD file "{vmsd_path}": {e}')
|
|
238
|
+
|
|
239
|
+
# update the VMX file path
|
|
240
|
+
self._vmx_path = new_vmx_path
|
|
241
|
+
|
|
242
|
+
def _get_vmx_setting(self, name, value=None):
|
|
243
|
+
|
|
244
|
+
if name in self._vmx_pairs:
|
|
245
|
+
if value is not None:
|
|
246
|
+
if self._vmx_pairs[name] == value:
|
|
247
|
+
return value
|
|
248
|
+
else:
|
|
249
|
+
return self._vmx_pairs[name]
|
|
250
|
+
return None
|
|
251
|
+
|
|
252
|
+
def _set_network_options(self):
|
|
253
|
+
"""
|
|
254
|
+
Set up VMware networking.
|
|
255
|
+
"""
|
|
256
|
+
|
|
257
|
+
# first some sanity checks
|
|
258
|
+
for adapter_number in range(0, self._adapters):
|
|
259
|
+
|
|
260
|
+
# we want the vmnet interface to be connected when starting the VM
|
|
261
|
+
connected = f"ethernet{adapter_number}.startConnected"
|
|
262
|
+
if self._get_vmx_setting(connected):
|
|
263
|
+
del self._vmx_pairs[connected]
|
|
264
|
+
|
|
265
|
+
use_ubridge = True
|
|
266
|
+
# use alternative method to find vmnet interfaces on macOS >= 11.0 (BigSur)
|
|
267
|
+
# because "bridge" interfaces are used instead and they are only created on the VM starts
|
|
268
|
+
if sys.platform.startswith("darwin") and parse_version(platform.mac_ver()[0]) >= parse_version("11.0.0"):
|
|
269
|
+
use_ubridge = False
|
|
270
|
+
self.manager.refresh_vmnet_list(ubridge=use_ubridge)
|
|
271
|
+
# then configure VMware network adapters
|
|
272
|
+
for adapter_number in range(0, self._adapters):
|
|
273
|
+
|
|
274
|
+
custom_adapter = self._get_custom_adapter_settings(adapter_number)
|
|
275
|
+
adapter_type = custom_adapter.get("adapter_type", self._adapter_type)
|
|
276
|
+
|
|
277
|
+
# add/update the interface
|
|
278
|
+
if adapter_type == "default":
|
|
279
|
+
# force default to e1000 because some guest OS don't detect the adapter (i.e. Windows 2012 server)
|
|
280
|
+
# when 'virtualdev' is not set in the VMX file.
|
|
281
|
+
vmware_adapter_type = "e1000"
|
|
282
|
+
else:
|
|
283
|
+
vmware_adapter_type = adapter_type
|
|
284
|
+
ethernet_adapter = {
|
|
285
|
+
f"ethernet{adapter_number}.present": "TRUE",
|
|
286
|
+
f"ethernet{adapter_number}.addresstype": "generated",
|
|
287
|
+
f"ethernet{adapter_number}.generatedaddressoffset": "0",
|
|
288
|
+
f"ethernet{adapter_number}.virtualdev": vmware_adapter_type,
|
|
289
|
+
}
|
|
290
|
+
self._vmx_pairs.update(ethernet_adapter)
|
|
291
|
+
|
|
292
|
+
connection_type = f"ethernet{adapter_number}.connectiontype"
|
|
293
|
+
if (
|
|
294
|
+
not self._use_any_adapter
|
|
295
|
+
and connection_type in self._vmx_pairs
|
|
296
|
+
and self._vmx_pairs[connection_type] in ("nat", "bridged", "hostonly")
|
|
297
|
+
):
|
|
298
|
+
continue
|
|
299
|
+
|
|
300
|
+
self._vmx_pairs[f"ethernet{adapter_number}.connectiontype"] = "custom"
|
|
301
|
+
|
|
302
|
+
# make sure we have a vmnet per adapter if we use uBridge
|
|
303
|
+
allocate_vmnet = False
|
|
304
|
+
|
|
305
|
+
# first check if a vmnet is already assigned to the adapter
|
|
306
|
+
vnet = f"ethernet{adapter_number}.vnet"
|
|
307
|
+
if vnet in self._vmx_pairs:
|
|
308
|
+
vmnet = os.path.basename(self._vmx_pairs[vnet])
|
|
309
|
+
if self.manager.is_managed_vmnet(vmnet) or vmnet in ("vmnet0", "vmnet1", "vmnet8"):
|
|
310
|
+
# vmnet already managed or a special vmnet, try to allocate a new one
|
|
311
|
+
allocate_vmnet = True
|
|
312
|
+
else:
|
|
313
|
+
# otherwise allocate a new one
|
|
314
|
+
allocate_vmnet = True
|
|
315
|
+
|
|
316
|
+
if allocate_vmnet:
|
|
317
|
+
try:
|
|
318
|
+
vmnet = self.manager.allocate_vmnet()
|
|
319
|
+
except BaseException:
|
|
320
|
+
# clear everything up in case of error (e.g. no enough vmnets)
|
|
321
|
+
self._vmnets.clear()
|
|
322
|
+
raise
|
|
323
|
+
|
|
324
|
+
# mark the vmnet as managed by us
|
|
325
|
+
if vmnet not in self._vmnets:
|
|
326
|
+
self._vmnets.append(vmnet)
|
|
327
|
+
self._vmx_pairs[f"ethernet{adapter_number}.vnet"] = vmnet
|
|
328
|
+
|
|
329
|
+
# disable remaining network adapters
|
|
330
|
+
for adapter_number in range(self._adapters, self._maximum_adapters):
|
|
331
|
+
if self._get_vmx_setting(f"ethernet{adapter_number}.present", "TRUE"):
|
|
332
|
+
log.debug(f"disabling remaining adapter {adapter_number}")
|
|
333
|
+
self._vmx_pairs[f"ethernet{adapter_number}.startconnected"] = "FALSE"
|
|
334
|
+
|
|
335
|
+
def _get_vnet(self, adapter_number):
|
|
336
|
+
"""
|
|
337
|
+
Return the vnet will use in ubridge
|
|
338
|
+
"""
|
|
339
|
+
vnet = f"ethernet{adapter_number}.vnet"
|
|
340
|
+
if vnet not in self._vmx_pairs:
|
|
341
|
+
raise VMwareError(f"vnet {vnet} not in VMX file")
|
|
342
|
+
return vnet
|
|
343
|
+
|
|
344
|
+
async def _add_ubridge_connection(self, nio, adapter_number):
|
|
345
|
+
"""
|
|
346
|
+
Creates a connection in uBridge.
|
|
347
|
+
|
|
348
|
+
:param nio: NIO instance
|
|
349
|
+
:param adapter_number: adapter number
|
|
350
|
+
"""
|
|
351
|
+
|
|
352
|
+
vnet = self._get_vnet(adapter_number)
|
|
353
|
+
await self._ubridge_send(f"bridge create {vnet}")
|
|
354
|
+
vmnet_interface = os.path.basename(self._vmx_pairs[vnet])
|
|
355
|
+
|
|
356
|
+
if sys.platform.startswith("darwin"):
|
|
357
|
+
if parse_version(platform.mac_ver()[0]) >= parse_version("11.0.0"):
|
|
358
|
+
# a bridge interface (bridge100, bridge101 etc.) is used instead of a vmnet interface
|
|
359
|
+
# on macOS >= 11.0 (Big Sur)
|
|
360
|
+
vmnet_interface = self.manager.find_bridge_interface(vmnet_interface)
|
|
361
|
+
if not vmnet_interface:
|
|
362
|
+
raise VMwareError(f"Could not find bridge interface linked with {vmnet_interface}")
|
|
363
|
+
block_host_traffic = self.manager.config.get_section_config("VMware").getboolean("block_host_traffic", False)
|
|
364
|
+
await self._add_ubridge_ethernet_connection(vnet, vmnet_interface, block_host_traffic)
|
|
365
|
+
else:
|
|
366
|
+
# special case on macOS, we cannot bind VMnet interfaces using the libpcap
|
|
367
|
+
await self._ubridge_send('bridge add_nio_fusion_vmnet {name} "{interface}"'.format(name=vnet, interface=vmnet_interface))
|
|
368
|
+
else:
|
|
369
|
+
block_host_traffic = self.manager.config.VMware.block_host_traffic
|
|
370
|
+
await self._add_ubridge_ethernet_connection(vnet, vmnet_interface, block_host_traffic)
|
|
371
|
+
|
|
372
|
+
if isinstance(nio, NIOUDP):
|
|
373
|
+
await self._ubridge_send(
|
|
374
|
+
"bridge add_nio_udp {name} {lport} {rhost} {rport}".format(
|
|
375
|
+
name=vnet, lport=nio.lport, rhost=nio.rhost, rport=nio.rport
|
|
376
|
+
)
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
if nio.capturing:
|
|
380
|
+
await self._ubridge_send(f'bridge start_capture {vnet} "{nio.pcap_output_file}"')
|
|
381
|
+
|
|
382
|
+
await self._ubridge_send(f"bridge start {vnet}")
|
|
383
|
+
await self._ubridge_apply_filters(vnet, nio.filters)
|
|
384
|
+
|
|
385
|
+
async def _update_ubridge_connection(self, adapter_number, nio):
|
|
386
|
+
"""
|
|
387
|
+
Update a connection in uBridge.
|
|
388
|
+
|
|
389
|
+
:param nio: NIO instance
|
|
390
|
+
:param adapter_number: adapter number
|
|
391
|
+
"""
|
|
392
|
+
try:
|
|
393
|
+
bridge_name = self._get_vnet(adapter_number)
|
|
394
|
+
except VMwareError:
|
|
395
|
+
return # vnet not yet available
|
|
396
|
+
await self._ubridge_apply_filters(bridge_name, nio.filters)
|
|
397
|
+
|
|
398
|
+
async def _delete_ubridge_connection(self, adapter_number):
|
|
399
|
+
"""
|
|
400
|
+
Deletes a connection in uBridge.
|
|
401
|
+
|
|
402
|
+
:param adapter_number: adapter number
|
|
403
|
+
"""
|
|
404
|
+
|
|
405
|
+
vnet = f"ethernet{adapter_number}.vnet"
|
|
406
|
+
if vnet not in self._vmx_pairs:
|
|
407
|
+
raise VMwareError(f"vnet {vnet} not in VMX file")
|
|
408
|
+
await self._ubridge_send(f"bridge delete {vnet}")
|
|
409
|
+
|
|
410
|
+
async def _start_ubridge_capture(self, adapter_number, output_file):
|
|
411
|
+
"""
|
|
412
|
+
Start a packet capture in uBridge.
|
|
413
|
+
|
|
414
|
+
:param adapter_number: adapter number
|
|
415
|
+
:param output_file: PCAP destination file for the capture
|
|
416
|
+
"""
|
|
417
|
+
|
|
418
|
+
vnet = f"ethernet{adapter_number}.vnet"
|
|
419
|
+
if vnet not in self._vmx_pairs:
|
|
420
|
+
raise VMwareError(f"vnet {vnet} not in VMX file")
|
|
421
|
+
if not self._ubridge_hypervisor:
|
|
422
|
+
raise VMwareError("Cannot start the packet capture: uBridge is not running")
|
|
423
|
+
await self._ubridge_send(
|
|
424
|
+
'bridge start_capture {name} "{output_file}"'.format(name=vnet, output_file=output_file)
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
async def _stop_ubridge_capture(self, adapter_number):
|
|
428
|
+
"""
|
|
429
|
+
Stop a packet capture in uBridge.
|
|
430
|
+
|
|
431
|
+
:param adapter_number: adapter number
|
|
432
|
+
"""
|
|
433
|
+
|
|
434
|
+
vnet = f"ethernet{adapter_number}.vnet"
|
|
435
|
+
if vnet not in self._vmx_pairs:
|
|
436
|
+
raise VMwareError(f"vnet {vnet} not in VMX file")
|
|
437
|
+
if not self._ubridge_hypervisor:
|
|
438
|
+
raise VMwareError("Cannot stop the packet capture: uBridge is not running")
|
|
439
|
+
await self._ubridge_send(f"bridge stop_capture {vnet}")
|
|
440
|
+
|
|
441
|
+
def check_hw_virtualization(self):
|
|
442
|
+
"""
|
|
443
|
+
Returns either hardware virtualization is activated or not.
|
|
444
|
+
|
|
445
|
+
:returns: boolean
|
|
446
|
+
"""
|
|
447
|
+
|
|
448
|
+
self._read_vmx_file()
|
|
449
|
+
if self._get_vmx_setting("vhv.enable", "TRUE"):
|
|
450
|
+
return True
|
|
451
|
+
return False
|
|
452
|
+
|
|
453
|
+
async def start(self):
|
|
454
|
+
"""
|
|
455
|
+
Starts this VMware VM.
|
|
456
|
+
"""
|
|
457
|
+
|
|
458
|
+
if self.status == "started":
|
|
459
|
+
return
|
|
460
|
+
|
|
461
|
+
if await self.is_running():
|
|
462
|
+
raise VMwareError("The VM is already running in VMware")
|
|
463
|
+
|
|
464
|
+
ubridge_path = self.ubridge_path
|
|
465
|
+
if not ubridge_path or not os.path.isfile(ubridge_path):
|
|
466
|
+
raise VMwareError("ubridge is necessary to start a VMware VM")
|
|
467
|
+
|
|
468
|
+
await self._start_ubridge(require_privileged_access=True)
|
|
469
|
+
self._read_vmx_file()
|
|
470
|
+
# check if there is enough RAM to run
|
|
471
|
+
if "memsize" in self._vmx_pairs:
|
|
472
|
+
self.check_available_ram(int(self._vmx_pairs["memsize"]))
|
|
473
|
+
self._set_network_options()
|
|
474
|
+
self._set_serial_console()
|
|
475
|
+
self._write_vmx_file()
|
|
476
|
+
|
|
477
|
+
if self._headless:
|
|
478
|
+
await self._control_vm("start", "nogui")
|
|
479
|
+
else:
|
|
480
|
+
await self._control_vm("start")
|
|
481
|
+
|
|
482
|
+
try:
|
|
483
|
+
if self._ubridge_hypervisor:
|
|
484
|
+
if parse_version(platform.mac_ver()[0]) >= parse_version("11.0.0"):
|
|
485
|
+
# give VMware some time to create the bridge interfaces, so they can be found
|
|
486
|
+
# by psutil and used by uBridge
|
|
487
|
+
await asyncio.sleep(1)
|
|
488
|
+
for adapter_number in range(0, self._adapters):
|
|
489
|
+
nio = self._ethernet_adapters[adapter_number].get_nio(0)
|
|
490
|
+
if nio:
|
|
491
|
+
await self._add_ubridge_connection(nio, adapter_number)
|
|
492
|
+
|
|
493
|
+
await self._start_console()
|
|
494
|
+
except VMwareError:
|
|
495
|
+
await self.stop()
|
|
496
|
+
raise
|
|
497
|
+
|
|
498
|
+
if self._get_vmx_setting("vhv.enable", "TRUE"):
|
|
499
|
+
self._hw_virtualization = True
|
|
500
|
+
|
|
501
|
+
self._started = True
|
|
502
|
+
self.status = "started"
|
|
503
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] started")
|
|
504
|
+
|
|
505
|
+
async def stop(self):
|
|
506
|
+
"""
|
|
507
|
+
Stops this VMware VM.
|
|
508
|
+
"""
|
|
509
|
+
|
|
510
|
+
self._hw_virtualization = False
|
|
511
|
+
await self._stop_remote_console()
|
|
512
|
+
await self._stop_ubridge()
|
|
513
|
+
|
|
514
|
+
try:
|
|
515
|
+
if await self.is_running():
|
|
516
|
+
if self.on_close == "save_vm_state":
|
|
517
|
+
await self._control_vm("suspend")
|
|
518
|
+
elif self.on_close == "shutdown_signal":
|
|
519
|
+
# use ACPI to shutdown the VM
|
|
520
|
+
await self._control_vm("stop", "soft")
|
|
521
|
+
else:
|
|
522
|
+
await self._control_vm("stop")
|
|
523
|
+
finally:
|
|
524
|
+
self._started = False
|
|
525
|
+
self.status = "stopped"
|
|
526
|
+
|
|
527
|
+
self._read_vmx_file()
|
|
528
|
+
self._vmnets.clear()
|
|
529
|
+
# remove the adapters managed by GNS3
|
|
530
|
+
for adapter_number in range(0, self._adapters):
|
|
531
|
+
vnet = f"ethernet{adapter_number}.vnet"
|
|
532
|
+
if (
|
|
533
|
+
self._get_vmx_setting(vnet)
|
|
534
|
+
or self._get_vmx_setting(f"ethernet{adapter_number}.connectiontype") is None
|
|
535
|
+
):
|
|
536
|
+
if vnet in self._vmx_pairs:
|
|
537
|
+
vmnet = os.path.basename(self._vmx_pairs[vnet])
|
|
538
|
+
if not self.manager.is_managed_vmnet(vmnet):
|
|
539
|
+
continue
|
|
540
|
+
log.debug(f"removing adapter {adapter_number}")
|
|
541
|
+
self._vmx_pairs[vnet] = "vmnet1"
|
|
542
|
+
self._vmx_pairs[f"ethernet{adapter_number}.connectiontype"] = "custom"
|
|
543
|
+
|
|
544
|
+
# re-enable any remaining network adapters
|
|
545
|
+
for adapter_number in range(self._adapters, self._maximum_adapters):
|
|
546
|
+
if self._get_vmx_setting(f"ethernet{adapter_number}.present", "TRUE"):
|
|
547
|
+
log.debug(f"enabling remaining adapter {adapter_number}")
|
|
548
|
+
self._vmx_pairs[f"ethernet{adapter_number}.startconnected"] = "TRUE"
|
|
549
|
+
self._write_vmx_file()
|
|
550
|
+
|
|
551
|
+
await super().stop()
|
|
552
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] stopped")
|
|
553
|
+
|
|
554
|
+
async def suspend(self):
|
|
555
|
+
"""
|
|
556
|
+
Suspends this VMware VM.
|
|
557
|
+
"""
|
|
558
|
+
|
|
559
|
+
if self.manager.host_type != "ws":
|
|
560
|
+
raise VMwareError("Pausing a VM is only supported by VMware Workstation")
|
|
561
|
+
await self._control_vm("pause")
|
|
562
|
+
self.status = "suspended"
|
|
563
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] paused")
|
|
564
|
+
|
|
565
|
+
async def resume(self):
|
|
566
|
+
"""
|
|
567
|
+
Resumes this VMware VM.
|
|
568
|
+
"""
|
|
569
|
+
|
|
570
|
+
if self.manager.host_type != "ws":
|
|
571
|
+
raise VMwareError("Unpausing a VM is only supported by VMware Workstation")
|
|
572
|
+
await self._control_vm("unpause")
|
|
573
|
+
self.status = "started"
|
|
574
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] resumed")
|
|
575
|
+
|
|
576
|
+
async def reload(self):
|
|
577
|
+
"""
|
|
578
|
+
Reloads this VMware VM.
|
|
579
|
+
"""
|
|
580
|
+
|
|
581
|
+
await self._control_vm("reset")
|
|
582
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] reloaded")
|
|
583
|
+
|
|
584
|
+
async def close(self):
|
|
585
|
+
"""
|
|
586
|
+
Closes this VMware VM.
|
|
587
|
+
"""
|
|
588
|
+
|
|
589
|
+
if not (await super().close()):
|
|
590
|
+
return False
|
|
591
|
+
|
|
592
|
+
for adapter in self._ethernet_adapters.values():
|
|
593
|
+
if adapter is not None:
|
|
594
|
+
for nio in adapter.ports.values():
|
|
595
|
+
if nio and isinstance(nio, NIOUDP):
|
|
596
|
+
self.manager.port_manager.release_udp_port(nio.lport, self._project)
|
|
597
|
+
try:
|
|
598
|
+
self.on_close = "power_off"
|
|
599
|
+
await self.stop()
|
|
600
|
+
except VMwareError:
|
|
601
|
+
pass
|
|
602
|
+
|
|
603
|
+
if self.linked_clone:
|
|
604
|
+
await self.manager.remove_from_vmware_inventory(self._vmx_path)
|
|
605
|
+
|
|
606
|
+
@property
|
|
607
|
+
def headless(self):
|
|
608
|
+
"""
|
|
609
|
+
Returns either the VM will start in headless mode
|
|
610
|
+
|
|
611
|
+
:returns: boolean
|
|
612
|
+
"""
|
|
613
|
+
|
|
614
|
+
return self._headless
|
|
615
|
+
|
|
616
|
+
@headless.setter
|
|
617
|
+
def headless(self, headless):
|
|
618
|
+
"""
|
|
619
|
+
Sets either the VM will start in headless mode
|
|
620
|
+
|
|
621
|
+
:param headless: boolean
|
|
622
|
+
"""
|
|
623
|
+
|
|
624
|
+
if headless:
|
|
625
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] has enabled the headless mode")
|
|
626
|
+
else:
|
|
627
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] has disabled the headless mode")
|
|
628
|
+
self._headless = headless
|
|
629
|
+
|
|
630
|
+
@property
|
|
631
|
+
def on_close(self):
|
|
632
|
+
"""
|
|
633
|
+
Returns the action to execute when the VM is stopped/closed
|
|
634
|
+
|
|
635
|
+
:returns: string
|
|
636
|
+
"""
|
|
637
|
+
|
|
638
|
+
return self._on_close
|
|
639
|
+
|
|
640
|
+
@on_close.setter
|
|
641
|
+
def on_close(self, on_close):
|
|
642
|
+
"""
|
|
643
|
+
Sets the action to execute when the VM is stopped/closed
|
|
644
|
+
|
|
645
|
+
:param on_close: string
|
|
646
|
+
"""
|
|
647
|
+
|
|
648
|
+
log.info(f'VMware VM "{self._name}" [{self._id}] set the close action to "{on_close}"')
|
|
649
|
+
self._on_close = on_close
|
|
650
|
+
|
|
651
|
+
@property
|
|
652
|
+
def vmx_path(self):
|
|
653
|
+
"""
|
|
654
|
+
Returns the path to the vmx file.
|
|
655
|
+
|
|
656
|
+
:returns: VMware vmx file
|
|
657
|
+
"""
|
|
658
|
+
|
|
659
|
+
return self._vmx_path
|
|
660
|
+
|
|
661
|
+
@vmx_path.setter
|
|
662
|
+
def vmx_path(self, vmx_path):
|
|
663
|
+
"""
|
|
664
|
+
Sets the path to the vmx file.
|
|
665
|
+
|
|
666
|
+
:param vmx_path: VMware vmx file
|
|
667
|
+
"""
|
|
668
|
+
|
|
669
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] has set the vmx file path to '{vmx_path}'")
|
|
670
|
+
self._vmx_path = vmx_path
|
|
671
|
+
|
|
672
|
+
@property
|
|
673
|
+
def adapters(self):
|
|
674
|
+
"""
|
|
675
|
+
Returns the number of adapters configured for this VMware VM.
|
|
676
|
+
|
|
677
|
+
:returns: number of adapters
|
|
678
|
+
"""
|
|
679
|
+
|
|
680
|
+
return self._adapters
|
|
681
|
+
|
|
682
|
+
@adapters.setter
|
|
683
|
+
def adapters(self, adapters):
|
|
684
|
+
"""
|
|
685
|
+
Sets the number of Ethernet adapters for this VMware VM instance.
|
|
686
|
+
|
|
687
|
+
:param adapters: number of adapters
|
|
688
|
+
"""
|
|
689
|
+
|
|
690
|
+
# VMware VMs are limited to 10 adapters
|
|
691
|
+
if adapters > 10:
|
|
692
|
+
raise VMwareError("Number of adapters above the maximum supported of 10")
|
|
693
|
+
|
|
694
|
+
self._ethernet_adapters.clear()
|
|
695
|
+
for adapter_number in range(0, adapters):
|
|
696
|
+
self._ethernet_adapters[adapter_number] = EthernetAdapter()
|
|
697
|
+
|
|
698
|
+
self._adapters = len(self._ethernet_adapters)
|
|
699
|
+
log.info(
|
|
700
|
+
"VMware VM '{name}' [{id}] has changed the number of Ethernet adapters to {adapters}".format(
|
|
701
|
+
name=self.name, id=self.id, adapters=adapters
|
|
702
|
+
)
|
|
703
|
+
)
|
|
704
|
+
|
|
705
|
+
@property
|
|
706
|
+
def adapter_type(self):
|
|
707
|
+
"""
|
|
708
|
+
Returns the adapter type for this VMware VM instance.
|
|
709
|
+
|
|
710
|
+
:returns: adapter type (string)
|
|
711
|
+
"""
|
|
712
|
+
|
|
713
|
+
return self._adapter_type
|
|
714
|
+
|
|
715
|
+
@adapter_type.setter
|
|
716
|
+
def adapter_type(self, adapter_type):
|
|
717
|
+
"""
|
|
718
|
+
Sets the adapter type for this VMware VM instance.
|
|
719
|
+
|
|
720
|
+
:param adapter_type: adapter type (string)
|
|
721
|
+
"""
|
|
722
|
+
|
|
723
|
+
self._adapter_type = adapter_type
|
|
724
|
+
log.info(
|
|
725
|
+
"VMware VM '{name}' [{id}]: adapter type changed to {adapter_type}".format(
|
|
726
|
+
name=self.name, id=self.id, adapter_type=adapter_type
|
|
727
|
+
)
|
|
728
|
+
)
|
|
729
|
+
|
|
730
|
+
@property
|
|
731
|
+
def use_any_adapter(self):
|
|
732
|
+
"""
|
|
733
|
+
Returns either GNS3 can use any VMware adapter on this instance.
|
|
734
|
+
|
|
735
|
+
:returns: boolean
|
|
736
|
+
"""
|
|
737
|
+
|
|
738
|
+
return self._use_any_adapter
|
|
739
|
+
|
|
740
|
+
@use_any_adapter.setter
|
|
741
|
+
def use_any_adapter(self, use_any_adapter):
|
|
742
|
+
"""
|
|
743
|
+
Allows GNS3 to use any VMware adapter on this instance.
|
|
744
|
+
|
|
745
|
+
:param use_any_adapter: boolean
|
|
746
|
+
"""
|
|
747
|
+
|
|
748
|
+
if use_any_adapter:
|
|
749
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] is allowed to use any adapter")
|
|
750
|
+
else:
|
|
751
|
+
log.info(f"VMware VM '{self.name}' [{self.id}] is not allowed to use any adapter")
|
|
752
|
+
self._use_any_adapter = use_any_adapter
|
|
753
|
+
|
|
754
|
+
async def adapter_add_nio_binding(self, adapter_number, nio):
|
|
755
|
+
"""
|
|
756
|
+
Adds an adapter NIO binding.
|
|
757
|
+
|
|
758
|
+
:param adapter_number: adapter number
|
|
759
|
+
:param nio: NIO instance to add to the slot/port
|
|
760
|
+
"""
|
|
761
|
+
|
|
762
|
+
try:
|
|
763
|
+
adapter = self._ethernet_adapters[adapter_number]
|
|
764
|
+
except IndexError:
|
|
765
|
+
raise VMwareError(
|
|
766
|
+
"Adapter {adapter_number} doesn't exist on VMware VM '{name}'".format(
|
|
767
|
+
name=self.name, adapter_number=adapter_number
|
|
768
|
+
)
|
|
769
|
+
)
|
|
770
|
+
|
|
771
|
+
self._read_vmx_file()
|
|
772
|
+
# check if trying to connect to a nat, bridged or host-only adapter
|
|
773
|
+
if self._get_vmx_setting(f"ethernet{adapter_number}.present", "TRUE"):
|
|
774
|
+
# check for the connection type
|
|
775
|
+
connection_type = f"ethernet{adapter_number}.connectiontype"
|
|
776
|
+
if (
|
|
777
|
+
not self._use_any_adapter
|
|
778
|
+
and connection_type in self._vmx_pairs
|
|
779
|
+
and self._vmx_pairs[connection_type] in ("nat", "bridged", "hostonly")
|
|
780
|
+
):
|
|
781
|
+
if await self.is_running():
|
|
782
|
+
raise VMwareError(
|
|
783
|
+
"Attachment '{attachment}' is configured on network adapter {adapter_number}. "
|
|
784
|
+
"Please stop VMware VM '{name}' to link to this adapter and allow GNS3 to change the attachment type.".format(
|
|
785
|
+
attachment=self._vmx_pairs[connection_type], adapter_number=adapter_number, name=self.name
|
|
786
|
+
)
|
|
787
|
+
)
|
|
788
|
+
else:
|
|
789
|
+
raise VMwareError(
|
|
790
|
+
"Attachment '{attachment}' is already configured on network adapter {adapter_number}. "
|
|
791
|
+
"Please remove it or allow VMware VM '{name}' to use any adapter.".format(
|
|
792
|
+
attachment=self._vmx_pairs[connection_type], adapter_number=adapter_number, name=self.name
|
|
793
|
+
)
|
|
794
|
+
)
|
|
795
|
+
|
|
796
|
+
adapter.add_nio(0, nio)
|
|
797
|
+
if self._started and self._ubridge_hypervisor:
|
|
798
|
+
await self._add_ubridge_connection(nio, adapter_number)
|
|
799
|
+
|
|
800
|
+
log.info(
|
|
801
|
+
"VMware VM '{name}' [{id}]: {nio} added to adapter {adapter_number}".format(
|
|
802
|
+
name=self.name, id=self.id, nio=nio, adapter_number=adapter_number
|
|
803
|
+
)
|
|
804
|
+
)
|
|
805
|
+
|
|
806
|
+
async def adapter_update_nio_binding(self, adapter_number, nio):
|
|
807
|
+
"""
|
|
808
|
+
Updates an adapter NIO binding.
|
|
809
|
+
|
|
810
|
+
:param adapter_number: adapter number
|
|
811
|
+
:param nio: NIO instance to update on the adapter
|
|
812
|
+
"""
|
|
813
|
+
|
|
814
|
+
if self._ubridge_hypervisor:
|
|
815
|
+
try:
|
|
816
|
+
await self._update_ubridge_connection(adapter_number, nio)
|
|
817
|
+
except IndexError:
|
|
818
|
+
raise VMwareError(
|
|
819
|
+
'Adapter {adapter_number} does not exist on VMware VM "{name}"'.format(
|
|
820
|
+
name=self._name, adapter_number=adapter_number
|
|
821
|
+
)
|
|
822
|
+
)
|
|
823
|
+
|
|
824
|
+
async def adapter_remove_nio_binding(self, adapter_number):
|
|
825
|
+
"""
|
|
826
|
+
Removes an adapter NIO binding.
|
|
827
|
+
|
|
828
|
+
:param adapter_number: adapter number
|
|
829
|
+
|
|
830
|
+
:returns: NIO instance
|
|
831
|
+
"""
|
|
832
|
+
|
|
833
|
+
try:
|
|
834
|
+
adapter = self._ethernet_adapters[adapter_number]
|
|
835
|
+
except IndexError:
|
|
836
|
+
raise VMwareError(
|
|
837
|
+
"Adapter {adapter_number} doesn't exist on VMware VM '{name}'".format(
|
|
838
|
+
name=self.name, adapter_number=adapter_number
|
|
839
|
+
)
|
|
840
|
+
)
|
|
841
|
+
|
|
842
|
+
await self.stop_capture(adapter_number)
|
|
843
|
+
nio = adapter.get_nio(0)
|
|
844
|
+
if isinstance(nio, NIOUDP):
|
|
845
|
+
self.manager.port_manager.release_udp_port(nio.lport, self._project)
|
|
846
|
+
adapter.remove_nio(0)
|
|
847
|
+
if self._started and self._ubridge_hypervisor:
|
|
848
|
+
await self._delete_ubridge_connection(adapter_number)
|
|
849
|
+
|
|
850
|
+
log.info(
|
|
851
|
+
"VMware VM '{name}' [{id}]: {nio} removed from adapter {adapter_number}".format(
|
|
852
|
+
name=self.name, id=self.id, nio=nio, adapter_number=adapter_number
|
|
853
|
+
)
|
|
854
|
+
)
|
|
855
|
+
|
|
856
|
+
return nio
|
|
857
|
+
|
|
858
|
+
def get_nio(self, adapter_number):
|
|
859
|
+
"""
|
|
860
|
+
Gets an adapter NIO binding.
|
|
861
|
+
|
|
862
|
+
:param adapter_number: adapter number
|
|
863
|
+
|
|
864
|
+
:returns: NIO instance
|
|
865
|
+
"""
|
|
866
|
+
|
|
867
|
+
try:
|
|
868
|
+
adapter = self.ethernet_adapters[adapter_number]
|
|
869
|
+
except KeyError:
|
|
870
|
+
raise VMwareError(
|
|
871
|
+
"Adapter {adapter_number} doesn't exist on VMware VM '{name}'".format(
|
|
872
|
+
name=self.name, adapter_number=adapter_number
|
|
873
|
+
)
|
|
874
|
+
)
|
|
875
|
+
|
|
876
|
+
nio = adapter.get_nio(0)
|
|
877
|
+
if not nio:
|
|
878
|
+
raise VMwareError(f"Adapter {adapter_number} is not connected")
|
|
879
|
+
|
|
880
|
+
return nio
|
|
881
|
+
|
|
882
|
+
def _get_pipe_name(self):
|
|
883
|
+
"""
|
|
884
|
+
Returns the pipe name to create a serial connection.
|
|
885
|
+
|
|
886
|
+
:returns: pipe path (string)
|
|
887
|
+
"""
|
|
888
|
+
|
|
889
|
+
pipe_name = os.path.join(tempfile.gettempdir(), "gns3_vmware", f"{self.id}")
|
|
890
|
+
try:
|
|
891
|
+
os.makedirs(os.path.dirname(pipe_name), exist_ok=True)
|
|
892
|
+
except OSError as e:
|
|
893
|
+
raise VMwareError(f"Could not create the VMware pipe directory: {e}")
|
|
894
|
+
return pipe_name
|
|
895
|
+
|
|
896
|
+
def _set_serial_console(self):
|
|
897
|
+
"""
|
|
898
|
+
Configures the first serial port to allow a serial console connection.
|
|
899
|
+
"""
|
|
900
|
+
|
|
901
|
+
pipe_name = self._get_pipe_name()
|
|
902
|
+
serial_port = {
|
|
903
|
+
"serial0.present": "TRUE",
|
|
904
|
+
"serial0.filetype": "pipe",
|
|
905
|
+
"serial0.filename": pipe_name,
|
|
906
|
+
"serial0.pipe.endpoint": "server",
|
|
907
|
+
"serial0.startconnected": "TRUE",
|
|
908
|
+
}
|
|
909
|
+
self._vmx_pairs.update(serial_port)
|
|
910
|
+
|
|
911
|
+
async def _start_console(self):
|
|
912
|
+
"""
|
|
913
|
+
Starts remote console support for this VM.
|
|
914
|
+
"""
|
|
915
|
+
|
|
916
|
+
if self.console and self.console_type == "telnet":
|
|
917
|
+
pipe_name = self._get_pipe_name()
|
|
918
|
+
try:
|
|
919
|
+
self._remote_pipe = await asyncio_open_serial(self._get_pipe_name())
|
|
920
|
+
except OSError as e:
|
|
921
|
+
raise VMwareError(f"Could not open serial pipe '{pipe_name}': {e}")
|
|
922
|
+
server = AsyncioTelnetServer(reader=self._remote_pipe, writer=self._remote_pipe, binary=True, echo=True)
|
|
923
|
+
try:
|
|
924
|
+
self._telnet_server = await asyncio.start_server(
|
|
925
|
+
server.run, self._manager.port_manager.console_host, self.console
|
|
926
|
+
)
|
|
927
|
+
except OSError as e:
|
|
928
|
+
self.project.emit(
|
|
929
|
+
"log.warning",
|
|
930
|
+
{
|
|
931
|
+
"message": f"Could not start Telnet server on socket {self._manager.port_manager.console_host}:{self.console}: {e}"
|
|
932
|
+
},
|
|
933
|
+
)
|
|
934
|
+
|
|
935
|
+
async def _stop_remote_console(self):
|
|
936
|
+
"""
|
|
937
|
+
Stops remote console support for this VM.
|
|
938
|
+
"""
|
|
939
|
+
if self._telnet_server:
|
|
940
|
+
self._telnet_server.close()
|
|
941
|
+
await self._telnet_server.wait_closed()
|
|
942
|
+
self._remote_pipe.close()
|
|
943
|
+
self._telnet_server = None
|
|
944
|
+
|
|
945
|
+
async def reset_console(self):
|
|
946
|
+
"""
|
|
947
|
+
Reset the console.
|
|
948
|
+
"""
|
|
949
|
+
|
|
950
|
+
await self._stop_remote_console()
|
|
951
|
+
await self._start_console()
|
|
952
|
+
|
|
953
|
+
@BaseNode.console_type.setter
|
|
954
|
+
def console_type(self, new_console_type):
|
|
955
|
+
"""
|
|
956
|
+
Sets the console type for this VMware VM.
|
|
957
|
+
|
|
958
|
+
:param new_console_type: console type (string)
|
|
959
|
+
"""
|
|
960
|
+
|
|
961
|
+
if self._started and self.console_type != new_console_type:
|
|
962
|
+
raise VMwareError(f'"{self._name}" must be stopped to change the console type to {new_console_type}')
|
|
963
|
+
|
|
964
|
+
super(VMwareVM, VMwareVM).console_type.__set__(self, new_console_type)
|
|
965
|
+
|
|
966
|
+
async def start_capture(self, adapter_number, output_file):
|
|
967
|
+
"""
|
|
968
|
+
Starts a packet capture.
|
|
969
|
+
|
|
970
|
+
:param adapter_number: adapter number
|
|
971
|
+
:param output_file: PCAP destination file for the capture
|
|
972
|
+
"""
|
|
973
|
+
|
|
974
|
+
nio = self.get_nio(adapter_number)
|
|
975
|
+
if nio.capturing:
|
|
976
|
+
raise VMwareError(f"Packet capture is already activated on adapter {adapter_number}")
|
|
977
|
+
|
|
978
|
+
nio.start_packet_capture(output_file)
|
|
979
|
+
if self._started:
|
|
980
|
+
await self._start_ubridge_capture(adapter_number, output_file)
|
|
981
|
+
|
|
982
|
+
log.info(
|
|
983
|
+
"VMware VM '{name}' [{id}]: starting packet capture on adapter {adapter_number}".format(
|
|
984
|
+
name=self.name, id=self.id, adapter_number=adapter_number
|
|
985
|
+
)
|
|
986
|
+
)
|
|
987
|
+
|
|
988
|
+
async def stop_capture(self, adapter_number):
|
|
989
|
+
"""
|
|
990
|
+
Stops a packet capture.
|
|
991
|
+
|
|
992
|
+
:param adapter_number: adapter number
|
|
993
|
+
"""
|
|
994
|
+
|
|
995
|
+
nio = self.get_nio(adapter_number)
|
|
996
|
+
if not nio.capturing:
|
|
997
|
+
return
|
|
998
|
+
|
|
999
|
+
nio.stop_packet_capture()
|
|
1000
|
+
if self._started:
|
|
1001
|
+
await self._stop_ubridge_capture(adapter_number)
|
|
1002
|
+
|
|
1003
|
+
log.info(
|
|
1004
|
+
"VMware VM '{name}' [{id}]: stopping packet capture on adapter {adapter_number}".format(
|
|
1005
|
+
name=self.name, id=self.id, adapter_number=adapter_number
|
|
1006
|
+
)
|
|
1007
|
+
)
|