diff --git a/CHANGELOG b/CHANGELOG index aba428f4..6e200f6b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,15 @@ # Change Log +## 2.2.53 21/01/2025 + +* Bundle web-ui v2.2.53 +* Add more information when patching .vbox file. Ref https://github.com/GNS3/gns3-gui/issues/3542 +* Increase timeout to run compute HTTP queries. Fixes #2461 +* Use 'allow_methods="*"' in aiohttp_cors.ResourceOptions(). Fixes #2459 +* Upgrade dependencies +* Update remote-install.sh to support a custom repository and the deb822 source format +* Fix: do not use the iourc file if IOU licence check is not enabled + ## 3.0.2 03/01/2025 * Bundle web-ui v3.0.2 @@ -31,7 +41,6 @@ ## 2.2.52 02/12/2024 * Bundle web-ui v2.2.52 -* Sync appliances * Remove restrictions based on file extension when listing images and fix ELF header checks * Fix use project name instead of ID for fast duplication when running local server. Fixes #2446 * Overwrite user resources when the originals have changed. diff --git a/gns3server/appliances/alpine-cloud.gns3a b/gns3server/appliances/alpine-cloud.gns3a new file mode 100644 index 00000000..00157093 --- /dev/null +++ b/gns3server/appliances/alpine-cloud.gns3a @@ -0,0 +1,56 @@ +{ + "appliance_id": "edbaa01e-2032-4ee2-bb9f-dd5c4d84c270", + "name": "Alpine Cloud Guest", + "category": "guest", + "description": "Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.", + "vendor_name": "Alpine Linux Development Team", + "vendor_url": "http://alpinelinux.org", + "vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/Alpine Linux.png", + "documentation_url": "http://wiki.alpinelinux.org", + "product_name": "Alpine Linux", + "product_url": "https://www.alpinelinux.org/cloud/", + "registry_version": 4, + "status": "stable", + "maintainer": "GNS3 Team", + "maintainer_email": "developers@gns3.net", + "usage": "\nUsername: alpine\nPassword: alpine", + "port_name_format": "Ethernet{0}", + "qemu": { + "adapter_type": "virtio-net-pci", + "adapters": 1, + "ram": 1024, + "hda_disk_interface": "virtio", + "arch": "x86_64", + "console_type": "telnet", + "boot_priority": "c", + "kvm": "require", + "options": "-nographic" + }, + "images": [ + { + "filename": "generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2", + "version": "3.21.2", + "md5sum": "b40825dff2867e0ffaffbc4c87674462", + "filesize": 189726720, + "download_url": "https://www.alpinelinux.org/cloud/", + "direct_download_url": "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/cloud/generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2" + }, + { + "filename": "alpine-cloud-init-data.iso", + "version": "1.0", + "md5sum": "b1b4b16cc3bf0250c0fa377c19c97683", + "filesize": 374784, + "download_url": "https://github.com/GNS3/gns3-registry/tree/master/cloud-init/alpine-cloud", + "direct_download_url": "https://github.com/GNS3/gns3-registry/raw/master/cloud-init/alpine-cloud/alpine-cloud-init-data.iso" + } + ], + "versions": [ + { + "name": "3.21.2", + "images": { + "hda_disk_image": "generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2", + "cdrom_image": "alpine-cloud-init-data.iso" + } + } + ] +} diff --git a/gns3server/appliances/stormshield-eva.gns3a b/gns3server/appliances/stormshield-eva.gns3a new file mode 100644 index 00000000..20f71cf1 --- /dev/null +++ b/gns3server/appliances/stormshield-eva.gns3a @@ -0,0 +1,50 @@ +{ + "appliance_id": "60801097-332e-4f40-a63e-8ad62047c01f", + "name": "Stormshield EVA", + "category": "firewall", + "description": "Stormshield EVA (Elastic Virtual Appliance) is a french virtual firewall designed to protect network infrastructures. It offers advanced features such as filtering, intrusion prevention (IPS), VPN management (IPSec/SSL), and access control.", + "vendor_name": "Stormshield", + "vendor_url": "https://www.stormshield.com/", + "vendor_logo_url": "https://www.stormshield.com/wp-content/uploads/stormshield-logo.png", + "documentation_url": "https://www.stormshield.com/fr/ressourcescenter/network-security-elastic-virtual-appliances/", + "product_name": "Stormshield EVA", + "product_url": "https://www.stormshield.com/fr/produits-et-services/produits/protection-des-reseaux/nos-produits/appliances-virtuelles/", + "registry_version": 4, + "status": "stable", + "availability": "service-contract", + "maintainer": "Samy SCANNA", + "maintainer_email": "samy.scanna@outlook.com", + "usage": "After the first boot, the appliance automatically runs the configuration script to set up the password, and network interfaces.", + "symbol": "stormshield.png", + "port_name_format": "port{port1}", + "qemu": { + "adapter_type": "vmxnet3", + "adapters": 8, + "ram": 2048, + "cpus": 1, + "hda_disk_interface": "scsi", + "arch": "x86_64", + "console_type": "telnet", + "kvm": "allow", + "options": "-serial stdio", + "on_close": "shutdown_signal", + "process_priority": "normal" + }, + "images": [ + { + "filename": "utm-SNS-EVA-4.3.33-kvm.qcow2", + "version": "4.3.33", + "md5sum": "21d94d0e20f2e270f06c5853fd750d5b", + "filesize": 284360704, + "download_url": "https://mystormshield.eu/product/download/" + } + ], + "versions": [ + { + "images": { + "hda_disk_image": "utm-SNS-EVA-4.3.33-kvm.qcow2" + }, + "name": "4.3.33" + } + ] +} diff --git a/gns3server/compute/virtualbox/virtualbox_vm.py b/gns3server/compute/virtualbox/virtualbox_vm.py index a9e156b6..5f4cd292 100644 --- a/gns3server/compute/virtualbox/virtualbox_vm.py +++ b/gns3server/compute/virtualbox/virtualbox_vm.py @@ -233,32 +233,36 @@ class VirtualBoxVM(BaseNode): """ Fix the VM uuid in the case of linked clone """ - if os.path.exists(self._linked_vbox_file()): - try: - tree = ET.parse(self._linked_vbox_file()) - except ET.ParseError: - raise VirtualBoxError( - "Cannot modify VirtualBox linked nodes file. " - "File {} is corrupted.".format(self._linked_vbox_file()) + + linked_vbox_file = self._linked_vbox_file() + if not os.path.exists(linked_vbox_file): + raise VirtualBoxError("Cannot find VirtualBox linked node file: {}".format(linked_vbox_file)) + + try: + tree = ET.parse(linked_vbox_file) + except ET.ParseError: + raise VirtualBoxError(f"Cannot modify VirtualBox linked node file. " + "File {linked_vbox_file} is corrupted.") + except OSError as e: + raise VirtualBoxError(f"Cannot modify VirtualBox linked nodes file '{self._linked_vbox_file()}': {e}") + + machine = tree.getroot().find("{http://www.virtualbox.org/}Machine") + if machine is not None and machine.get("uuid") != "{" + self.id + "}": + + for image in tree.getroot().findall("{http://www.virtualbox.org/}Image"): + currentSnapshot = machine.get("currentSnapshot") + if currentSnapshot: + newSnapshot = re.sub(r"\{.*\}", "{" + str(uuid.uuid4()) + "}", currentSnapshot) + shutil.move( + os.path.join(self.working_dir, self._vmname, "Snapshots", currentSnapshot) + ".vdi", + os.path.join(self.working_dir, self._vmname, "Snapshots", newSnapshot) + ".vdi" ) - except OSError as e: - raise VirtualBoxError(f"Cannot modify VirtualBox linked nodes file '{self._linked_vbox_file()}': {e}") + log.info(f"VirtualBox VM '{self.name}' [{self.id}] snapshot file moved from '{currentSnapshot}' to '{newSnapshot}'") + image.set("uuid", newSnapshot) - machine = tree.getroot().find("{http://www.virtualbox.org/}Machine") - if machine is not None and machine.get("uuid") != "{" + self.id + "}": - - for image in tree.getroot().findall("{http://www.virtualbox.org/}Image"): - currentSnapshot = machine.get("currentSnapshot") - if currentSnapshot: - newSnapshot = re.sub(r"\{.*\}", "{" + str(uuid.uuid4()) + "}", currentSnapshot) - shutil.move( - os.path.join(self.working_dir, self._vmname, "Snapshots", currentSnapshot) + ".vdi", - os.path.join(self.working_dir, self._vmname, "Snapshots", newSnapshot) + ".vdi", - ) - image.set("uuid", newSnapshot) - - machine.set("uuid", "{" + self.id + "}") - tree.write(self._linked_vbox_file()) + log.info(f"VirtualBox VM '{self.name}' [{self.id}] '{linked_vbox_file}' has been patched") + machine.set("uuid", "{" + self.id + "}") + tree.write(linked_vbox_file) async def check_hw_virtualization(self): """ @@ -488,7 +492,7 @@ class VirtualBoxVM(BaseNode): async def save_linked_hdds_info(self): """ - Save linked cloned hard disks information. + Save linked cloned hard disk information. :returns: disk table information """