Skip to content

Commit

Permalink
Merge branch '2.2' into 3.0
Browse files Browse the repository at this point in the history
# Conflicts:
#	requirements.txt
#	setup.py
  • Loading branch information
grossmj committed Nov 18, 2024
2 parents e83e12b + 11c9802 commit bd813b0
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 11 deletions.
19 changes: 14 additions & 5 deletions gns3server/controller/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@


from ..config import Config
from ..utils import parse_version
from ..utils import parse_version, md5sum
from ..utils.images import default_images_directory

from .project import Project
Expand Down Expand Up @@ -308,12 +308,21 @@ async def load_projects(self):
except OSError as e:
log.error(str(e))


@staticmethod
def install_resource_files(dst_path, resource_name):
def install_resource_files(dst_path, resource_name, upgrade_resources=True):
"""
Install files from resources to user's file system
"""

def should_copy(src, dst, upgrade_resources):
if not os.path.exists(dst):
return True
if upgrade_resources is False:
return False
# copy the resource if it is different
return md5sum(src) != md5sum(dst)

if hasattr(sys, "frozen") and sys.platform.startswith("win"):
resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), resource_name))
for filename in os.listdir(resource_path):
Expand All @@ -322,7 +331,7 @@ def install_resource_files(dst_path, resource_name):
else:
for entry in importlib_resources.files('gns3server').joinpath(resource_name).iterdir():
full_path = os.path.join(dst_path, entry.name)
if entry.is_file() and not os.path.exists(full_path):
if entry.is_file() and should_copy(str(entry), full_path, upgrade_resources):
log.debug(f'Installing {resource_name} resource file "{entry.name}" to "{full_path}"')
shutil.copy(str(entry), os.path.join(dst_path, entry.name))
elif entry.is_dir():
Expand All @@ -338,7 +347,7 @@ def _install_base_configs(self):
dst_path = self.configs_path()
log.info(f"Installing base configs in '{dst_path}'")
try:
Controller.install_resource_files(dst_path, "configs")
Controller.install_resource_files(dst_path, "configs", upgrade_resources=False)
except OSError as e:
log.error(f"Could not install base config files to {dst_path}: {e}")

Expand All @@ -351,7 +360,7 @@ def _install_builtin_disks(self):
dst_path = self.disks_path()
log.info(f"Installing built-in disks in '{dst_path}'")
try:
Controller.install_resource_files(dst_path, "disks")
Controller.install_resource_files(dst_path, "disks", upgrade_resources=False)
except OSError as e:
log.error(f"Could not install disk files to {dst_path}: {e}")

Expand Down
6 changes: 2 additions & 4 deletions gns3server/controller/appliance_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def _custom_appliances_path(self) -> str:
os.makedirs(appliances_path, exist_ok=True)
return appliances_path

def builtin_appliances_path(self, delete_first=False):
def builtin_appliances_path(self):
"""
Get the built-in appliance storage directory
"""
Expand All @@ -107,8 +107,6 @@ def builtin_appliances_path(self, delete_first=False):
else:
resources_path = os.path.expanduser(resources_path)
appliances_dir = os.path.join(resources_path, "appliances")
if delete_first:
shutil.rmtree(appliances_dir, ignore_errors=True)
os.makedirs(appliances_dir, exist_ok=True)
return appliances_dir

Expand All @@ -117,7 +115,7 @@ def install_builtin_appliances(self):
At startup we copy the built-in appliances files.
"""

dst_path = self.builtin_appliances_path(delete_first=True)
dst_path = self.builtin_appliances_path()
log.info(f"Installing built-in appliances in '{dst_path}'")
from . import Controller
try:
Expand Down
12 changes: 12 additions & 0 deletions gns3server/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import posixpath
import socket
import errno
import hashlib


def force_unix_path(path):
Expand Down Expand Up @@ -109,3 +110,14 @@ def is_ipv6_enabled() -> bool:
if e.errno == errno.EADDRINUSE:
return True
raise

def md5sum(filename):
"""
Calculate the MD5 checksum of a file.
"""

hash_md5 = hashlib.md5()
with open(filename, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
4 changes: 2 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Jinja2>=3.1.4,<3.2
sentry-sdk>=2.17,<2.18 # optional dependency
psutil>=6.1.0
distro>=1.9.0
py-cpuinfo==9.0.0
py-cpuinfo>=9.0.0,<10.0
sqlalchemy==2.0.36
aiosqlite==0.20.0
alembic==1.13.3
Expand All @@ -19,6 +19,6 @@ python-jose[cryptography]==3.3.0
email-validator==2.2.0
watchfiles==0.24.0
zstandard==0.23.0
platformdirs==4.3.6
platformdirs>=2.4.0,<3 # platformdirs >=3 conflicts when building Debian packages
importlib-resources>=1.3; python_version <= '3.9'
truststore>=0.10.0; python_version >= '3.10'

0 comments on commit bd813b0

Please sign in to comment.