1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-18 06:18:08 +00:00

Overwrite built-in appliance files when starting a more recent version of the server

This commit is contained in:
grossmj 2023-01-01 15:57:41 +08:00
parent b3a6b9173b
commit 5bccf4841d
3 changed files with 16 additions and 8 deletions

View File

@ -29,6 +29,8 @@ except ImportError:
from importlib import resources as importlib_resources from importlib import resources as importlib_resources
from ..config import Config from ..config import Config
from ..utils import parse_version
from .project import Project from .project import Project
from .template import Template from .template import Template
from .appliance import Appliance from .appliance import Appliance
@ -69,7 +71,7 @@ class Controller:
async def start(self): async def start(self):
log.info("Controller is starting") log.info("Controller is starting")
self._load_base_files() self._install_base_configs()
server_config = Config.instance().get_section_config("Server") server_config = Config.instance().get_section_config("Server")
Config.instance().listen_for_config_changes(self._update_config) Config.instance().listen_for_config_changes(self._update_config)
host = server_config.get("host", "localhost") host = server_config.get("host", "localhost")
@ -246,7 +248,9 @@ class Controller:
if "iou_license" in controller_settings: if "iou_license" in controller_settings:
self._iou_license_settings = controller_settings["iou_license"] self._iou_license_settings = controller_settings["iou_license"]
self._appliance_manager.install_builtin_appliances() if parse_version(__version__) > parse_version(controller_settings.get("version", "")):
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()
self._template_manager.load_templates(controller_settings.get("templates")) self._template_manager.load_templates(controller_settings.get("templates"))
@ -274,13 +278,14 @@ class Controller:
except OSError as e: except OSError as e:
log.error(str(e)) log.error(str(e))
def _load_base_files(self): def _install_base_configs(self):
""" """
At startup we copy base file to the user location to allow At startup we copy base file to the user location to allow
them to customize it them to customize it
""" """
dst_path = self.configs_path() dst_path = self.configs_path()
log.info(f"Installing base configs in '{dst_path}'")
try: try:
if hasattr(sys, "frozen") and sys.platform.startswith("win"): if hasattr(sys, "frozen") and sys.platform.startswith("win"):
resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), "configs")) resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), "configs"))
@ -313,6 +318,7 @@ class Controller:
server_config = Config.instance().get_section_config("Server") server_config = Config.instance().get_section_config("Server")
configs_path = os.path.expanduser(server_config.get("configs_path", "~/GNS3/configs")) configs_path = os.path.expanduser(server_config.get("configs_path", "~/GNS3/configs"))
# shutil.rmtree(configs_path, ignore_errors=True)
os.makedirs(configs_path, exist_ok=True) os.makedirs(configs_path, exist_ok=True)
return configs_path return configs_path

View File

@ -88,6 +88,7 @@ class ApplianceManager:
config = Config.instance() config = Config.instance()
appliances_dir = os.path.join(config.config_dir, "appliances") appliances_dir = os.path.join(config.config_dir, "appliances")
# shutil.rmtree(appliances_dir, ignore_errors=True)
os.makedirs(appliances_dir, exist_ok=True) os.makedirs(appliances_dir, exist_ok=True)
return appliances_dir return appliances_dir
@ -97,16 +98,16 @@ class ApplianceManager:
""" """
dst_path = self._builtin_appliances_path() dst_path = self._builtin_appliances_path()
log.info(f"Installing built-in appliances in '{dst_path}'")
try: try:
if hasattr(sys, "frozen") and sys.platform.startswith("win"): if hasattr(sys, "frozen") and sys.platform.startswith("win"):
resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), "appliances")) resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), "appliances"))
for filename in os.listdir(resource_path): for filename in os.listdir(resource_path):
if not os.path.exists(os.path.join(dst_path, filename)): shutil.copy(os.path.join(resource_path, filename), os.path.join(dst_path, filename))
shutil.copy(os.path.join(resource_path, filename), os.path.join(dst_path, filename))
else: else:
for entry in importlib_resources.files('gns3server.appliances').iterdir(): for entry in importlib_resources.files('gns3server.appliances').iterdir():
full_path = os.path.join(dst_path, entry.name) full_path = os.path.join(dst_path, entry.name)
if entry.is_file() and not os.path.exists(full_path): if entry.is_file():
log.debug(f"Installing built-in appliance file {entry.name} to {full_path}") log.debug(f"Installing built-in appliance file {entry.name} to {full_path}")
shutil.copy(str(entry), os.path.join(dst_path, entry.name)) shutil.copy(str(entry), os.path.join(dst_path, entry.name))
except OSError as e: except OSError as e:

View File

@ -381,13 +381,13 @@ async def test_get_free_project_name(controller):
assert controller.get_free_project_name("Hello") == "Hello" assert controller.get_free_project_name("Hello") == "Hello"
async def test_load_base_files(controller, config, tmpdir): async def test_install_base_configs(controller, config, tmpdir):
config.set_section_config("Server", {"configs_path": str(tmpdir)}) config.set_section_config("Server", {"configs_path": str(tmpdir)})
with open(str(tmpdir / 'iou_l2_base_startup-config.txt'), 'w+') as f: with open(str(tmpdir / 'iou_l2_base_startup-config.txt'), 'w+') as f:
f.write('test') f.write('test')
controller._load_base_files() controller._install_base_configs()
assert os.path.exists(str(tmpdir / 'iou_l3_base_startup-config.txt')) assert os.path.exists(str(tmpdir / 'iou_l3_base_startup-config.txt'))
# Check is the file has not been overwritten # Check is the file has not been overwritten
@ -410,6 +410,7 @@ def test_appliances(controller, tmpdir):
with open(str(tmpdir / "my_appliance2.gns3a"), 'w+') as f: with open(str(tmpdir / "my_appliance2.gns3a"), 'w+') as f:
json.dump(my_appliance, f) json.dump(my_appliance, f)
controller.appliance_manager.install_builtin_appliances()
with patch("gns3server.config.Config.get_section_config", return_value={"appliances_path": str(tmpdir)}): with patch("gns3server.config.Config.get_section_config", return_value={"appliances_path": str(tmpdir)}):
controller.appliance_manager.load_appliances() controller.appliance_manager.load_appliances()
assert len(controller.appliance_manager.appliances) > 0 assert len(controller.appliance_manager.appliances) > 0