Merge pull request #2272 from GNS3/fix/2271

Correctly install built-in appliances
pull/2283/head
Jeremy Grossmann 9 months ago committed by GitHub
commit 285b19d97f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -191,29 +191,28 @@ class Controller:
Save the controller configuration on disk Save the controller configuration on disk
""" """
if self._config_loaded is False: controller_settings = dict()
return if self._config_loaded:
controller_settings = {"computes": [],
controller_settings = {"computes": [], "templates": [],
"templates": [], "gns3vm": self.gns3vm.__json__(),
"gns3vm": self.gns3vm.__json__(), "iou_license": self._iou_license_settings,
"iou_license": self._iou_license_settings, "appliances_etag": self._appliance_manager.appliances_etag,
"appliances_etag": self._appliance_manager.appliances_etag, "version": __version__}
"version": __version__}
for template in self._template_manager.templates.values():
for template in self._template_manager.templates.values(): if not template.builtin:
if not template.builtin: controller_settings["templates"].append(template.__json__())
controller_settings["templates"].append(template.__json__())
for compute in self._computes.values(): for compute in self._computes.values():
if compute.id != "local" and compute.id != "vm": if compute.id != "local" and compute.id != "vm":
controller_settings["computes"].append({"host": compute.host, controller_settings["computes"].append({"host": compute.host,
"name": compute.name, "name": compute.name,
"port": compute.port, "port": compute.port,
"protocol": compute.protocol, "protocol": compute.protocol,
"user": compute.user, "user": compute.user,
"password": compute.password, "password": compute.password,
"compute_id": compute.id}) "compute_id": compute.id})
try: try:
os.makedirs(os.path.dirname(self._config_file), exist_ok=True) os.makedirs(os.path.dirname(self._config_file), exist_ok=True)
@ -229,8 +228,7 @@ class Controller:
try: try:
if not os.path.exists(self._config_file): if not os.path.exists(self._config_file):
self._config_loaded = True self.save() # this will create the config file
self.save()
with open(self._config_file) as f: with open(self._config_file) as f:
controller_settings = json.load(f) controller_settings = json.load(f)
except (OSError, ValueError) as e: except (OSError, ValueError) as e:
@ -255,6 +253,8 @@ class Controller:
if not previous_version or \ if not previous_version or \
parse_version(__version__.split("+")[0]) > parse_version(previous_version.split("+")[0]): parse_version(__version__.split("+")[0]) > parse_version(previous_version.split("+")[0]):
self._appliance_manager.install_builtin_appliances() self._appliance_manager.install_builtin_appliances()
elif not os.listdir(self._appliance_manager.builtin_appliances_path()):
self._appliance_manager.install_builtin_appliances()
self._appliance_manager.appliances_etag = controller_settings.get("appliances_etag") self._appliance_manager.appliances_etag = controller_settings.get("appliances_etag")
self._appliance_manager.load_appliances() self._appliance_manager.load_appliances()

@ -21,6 +21,7 @@ import uuid
import asyncio import asyncio
import aiohttp import aiohttp
import shutil import shutil
import platformdirs
try: try:
@ -81,13 +82,13 @@ class ApplianceManager:
os.makedirs(appliances_path, exist_ok=True) os.makedirs(appliances_path, exist_ok=True)
return appliances_path return appliances_path
def _builtin_appliances_path(self, delete_first=False): def builtin_appliances_path(self, delete_first=False):
""" """
Get the built-in appliance storage directory Get the built-in appliance storage directory
""" """
config = Config.instance() appname = vendor = "GNS3"
appliances_dir = os.path.join(config.config_dir, "appliances") appliances_dir = os.path.join(platformdirs.user_data_dir(appname, vendor, roaming=True), "appliances")
if delete_first: if delete_first:
shutil.rmtree(appliances_dir, ignore_errors=True) shutil.rmtree(appliances_dir, ignore_errors=True)
os.makedirs(appliances_dir, exist_ok=True) os.makedirs(appliances_dir, exist_ok=True)
@ -98,7 +99,7 @@ class ApplianceManager:
At startup we copy the built-in appliances files. At startup we copy the built-in appliances files.
""" """
dst_path = self._builtin_appliances_path(delete_first=True) dst_path = self.builtin_appliances_path(delete_first=True)
log.info(f"Installing built-in appliances in '{dst_path}'") log.info(f"Installing built-in appliances in '{dst_path}'")
from . import Controller from . import Controller
try: try:
@ -112,7 +113,7 @@ class ApplianceManager:
""" """
self._appliances = {} self._appliances = {}
for directory, builtin in ((self._builtin_appliances_path(), True,), (self._custom_appliances_path(), False,)): for directory, builtin in ((self.builtin_appliances_path(), True,), (self._custom_appliances_path(), False,)):
if directory and os.path.isdir(directory): if directory and os.path.isdir(directory):
for file in os.listdir(directory): for file in os.listdir(directory):
if not file.endswith('.gns3a') and not file.endswith('.gns3appliance'): if not file.endswith('.gns3a') and not file.endswith('.gns3appliance'):
@ -215,7 +216,7 @@ class ApplianceManager:
from . import Controller from . import Controller
Controller.instance().save() Controller.instance().save()
json_data = await response.json() json_data = await response.json()
appliances_dir = self._builtin_appliances_path() appliances_dir = self.builtin_appliances_path()
downloaded_appliance_files = [] downloaded_appliance_files = []
for appliance in json_data: for appliance in json_data:
if appliance["type"] == "file": if appliance["type"] == "file":

@ -11,6 +11,7 @@ psutil==5.9.5
async-timeout>=4.0.2,<4.1 async-timeout>=4.0.2,<4.1
distro>=1.8.0 distro>=1.8.0
py-cpuinfo>=9.0.0,<10.0 py-cpuinfo>=9.0.0,<10.0
platformdirs>=2.4.0
importlib-resources>=1.3; python_version <= '3.9' importlib-resources>=1.3; python_version <= '3.9'
truststore>=0.7.0; python_version >= '3.10' truststore>=0.7.0; python_version >= '3.10'
setuptools>=60.8.1; python_version >= '3.7' setuptools>=60.8.1; python_version >= '3.7'

Loading…
Cancel
Save