diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py index bd10c27a..e449ed75 100644 --- a/gns3server/controller/__init__.py +++ b/gns3server/controller/__init__.py @@ -89,6 +89,23 @@ class Controller: for c in data["computes"]: yield from self.add_compute(**c) + # Preload the list of projects from disk + server_config = Config.instance().get_section_config("Server") + projects_path = os.path.expanduser(server_config.get("projects_path", "~/GNS3/projects")) + try: + for project_path in os.listdir(projects_path): + project_dir = os.path.join(projects_path, project_path) + if os.path.isdir(project_dir): + for file in os.listdir(project_dir): + if file.endswith(".gns3"): + try: + yield from self.load_project(os.path.join(project_dir, file), load=False) + except aiohttp.web_exceptions.HTTPConflict: + pass # Skip not compatible projects + except OSError as e: + log.error(str(e)) + + def is_enabled(self): """ :returns: whether the current instance is the controller @@ -187,11 +204,12 @@ class Controller: del self._projects[project.id] @asyncio.coroutine - def load_project(self, path): + def load_project(self, path, load=True): """ Load a project from a .gns3 :param path: Path of the .gns3 + :param load: Load the topology """ topo_data = load_topology(path) topology = topo_data.pop("topology") @@ -199,8 +217,9 @@ class Controller: topo_data.pop("revision") topo_data.pop("type") - project = yield from self.add_project(path=os.path.dirname(path), **topo_data) - yield from project.load() + project = yield from self.add_project(path=os.path.dirname(path), status="closed", **topo_data) + if load: + yield from project.load() @property def projects(self): diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index 696b8603..f524addf 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -40,12 +40,14 @@ class Project: :param project_id: force project identifier (None by default auto generate an UUID) :param path: path of the project. (None use the standard directory) + :param status: Status of the project (opened / closed) """ - def __init__(self, name=None, project_id=None, path=None, controller=None): + def __init__(self, name=None, project_id=None, path=None, controller=None, status="opened"): self._controller = controller self._name = name + self._status = status if project_id is None: self._id = str(uuid4()) else: @@ -82,6 +84,10 @@ class Project: def path(self): return self._path + @property + def status(self): + return self._status + @path.setter def path(self, path): check_path_allowed(path) @@ -355,5 +361,6 @@ class Project: return { "name": self._name, "project_id": self._id, - "path": self._path + "path": self._path, + "status": "opened" } diff --git a/gns3server/schemas/project.py b/gns3server/schemas/project.py index e6462182..9988d453 100644 --- a/gns3server/schemas/project.py +++ b/gns3server/schemas/project.py @@ -81,6 +81,10 @@ PROJECT_OBJECT_SCHEMA = { "description": "Project directory", "type": ["string", "null"], "minLength": 1 + }, + "status": { + "description": "Project status Read only", + "enum": ["opened", "closed"] } }, "additionalProperties": False, diff --git a/gns3server/templates/controller.html b/gns3server/templates/controller.html index 632cdade..225eeda1 100644 --- a/gns3server/templates/controller.html +++ b/gns3server/templates/controller.html @@ -7,11 +7,12 @@ The purpose of this page is to help for GNS3 debug. This can be dropped in futur GNS3 versions. -
Name | -ID + | ID | +Status | Nodes | Links |
---|---|---|---|---|---|
{{project.name}} | {{project.id}} | +{{project.status}} | {{project.nodes|length}} | {{project.links|length}} |