Install empty Qemu disks on first start

This commit is contained in:
grossmj 2023-05-05 22:40:58 +08:00
parent d6141d4652
commit 161f62d083
14 changed files with 53 additions and 19 deletions

View File

@ -30,6 +30,7 @@ except ImportError:
from ..config import Config
from ..utils import parse_version
from ..utils.images import default_images_directory
from .project import Project
from .template import Template
@ -72,6 +73,7 @@ class Controller:
log.info("Controller is starting")
self._install_base_configs()
self._install_builtin_disks()
server_config = Config.instance().get_section_config("Server")
Config.instance().listen_for_config_changes(self._update_config)
host = server_config.get("host", "localhost")
@ -281,7 +283,7 @@ class Controller:
def _install_base_configs(self):
"""
At startup we copy base file to the user location to allow
At startup we copy base configs to the user location to allow
them to customize it
"""
@ -302,6 +304,29 @@ class Controller:
except OSError as e:
log.error(f"Could not install base config files to {dst_path}: {e}")
def _install_builtin_disks(self):
"""
At startup we copy built-in Qemu disks to the user location to allow
them to use with appliances
"""
dst_path = self.disks_path()
log.info(f"Installing built-in disks in '{dst_path}'")
try:
if hasattr(sys, "frozen") and sys.platform.startswith("win"):
resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), "disks"))
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))
else:
for entry in importlib_resources.files('gns3server.disks').iterdir():
full_path = os.path.join(dst_path, entry.name)
if entry.is_file() and not os.path.exists(full_path):
log.debug(f"Installing disk file {entry.name} to {full_path}")
shutil.copy(str(entry), os.path.join(dst_path, entry.name))
except OSError as e:
log.error(f"Could not install disk files to {dst_path}: {e}")
def images_path(self):
"""
Get the image storage directory
@ -322,6 +347,15 @@ class Controller:
os.makedirs(configs_path, exist_ok=True)
return configs_path
def disks_path(self, emulator_type="qemu"):
"""
Get the disks storage directory
"""
disks_path = default_images_directory(emulator_type)
os.makedirs(disks_path, exist_ok=True)
return disks_path
async def add_compute(self, compute_id=None, name=None, force=False, connect=True, **kwargs):
"""
Add a server to the dictionary of computes controlled by this controller

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
gns3server/disks/empty8G.qcow2 Executable file

Binary file not shown.

View File

@ -26,11 +26,11 @@ import logging
log = logging.getLogger(__name__)
def list_images(type):
def list_images(emulator_type):
"""
Scan directories for available image for a type
Scan directories for available image for a given emulator type
:param type: emulator type (dynamips, qemu, iou)
:param emulator_type: emulator type (dynamips, qemu, iou)
"""
files = set()
images = []
@ -38,10 +38,10 @@ def list_images(type):
server_config = Config.instance().get_section_config("Server")
general_images_directory = os.path.expanduser(server_config.get("images_path", "~/GNS3/images"))
# Subfolder of the general_images_directory specific to this VM type
default_directory = default_images_directory(type)
# Subfolder of the general_images_directory specific to this emulator type
default_directory = default_images_directory(emulator_type)
for directory in images_directories(type):
for directory in images_directories(emulator_type):
# We limit recursion to path outside the default images directory
# the reason is in the default directory manage file organization and
@ -57,9 +57,9 @@ def list_images(type):
if filename not in files:
if filename.endswith(".md5sum") or filename.startswith("."):
continue
elif ((filename.endswith(".image") or filename.endswith(".bin")) and type == "dynamips") \
or ((filename.endswith(".bin") or filename.startswith("i86bi")) and type == "iou") \
or (not filename.endswith(".bin") and not filename.endswith(".image") and type == "qemu"):
elif ((filename.endswith(".image") or filename.endswith(".bin")) and emulator_type == "dynamips") \
or ((filename.endswith(".bin") or filename.startswith("i86bi")) and emulator_type == "iou") \
or (not filename.endswith(".bin") and not filename.endswith(".image") and emulator_type == "qemu"):
files.add(filename)
# It the image is located in the standard directory the path is relative
@ -69,7 +69,7 @@ def list_images(type):
path = os.path.relpath(os.path.join(root, filename), default_directory)
try:
if type in ["dynamips", "iou"]:
if emulator_type in ["dynamips", "iou"]:
with open(os.path.join(root, filename), "rb") as f:
# read the first 7 bytes of the file.
elf_header_start = f.read(7)
@ -102,34 +102,34 @@ def _os_walk(directory, recurse=True, **kwargs):
yield directory, [], files
def default_images_directory(type):
def default_images_directory(emulator_type):
"""
:returns: Return the default directory for a node type
"""
server_config = Config.instance().get_section_config("Server")
img_dir = os.path.expanduser(server_config.get("images_path", "~/GNS3/images"))
if type == "qemu":
if emulator_type == "qemu":
return os.path.join(img_dir, "QEMU")
elif type == "iou":
elif emulator_type == "iou":
return os.path.join(img_dir, "IOU")
elif type == "dynamips":
elif emulator_type == "dynamips":
return os.path.join(img_dir, "IOS")
else:
raise NotImplementedError("%s node type is not supported", type)
raise NotImplementedError("%s node type is not supported", emulator_type)
def images_directories(type):
def images_directories(emulator_type):
"""
Return all directories where we will look for images
by priority
:param type: Type of emulator
:param emulator_type: Type of emulator
"""
server_config = Config.instance().get_section_config("Server")
paths = []
img_dir = os.path.expanduser(server_config.get("images_path", "~/GNS3/images"))
type_img_directory = default_images_directory(type)
type_img_directory = default_images_directory(emulator_type)
try:
os.makedirs(type_img_directory, exist_ok=True)
paths.append(type_img_directory)