diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py index 20132f81..a1640fa1 100644 --- a/gns3server/controller/__init__.py +++ b/gns3server/controller/__init__.py @@ -80,7 +80,7 @@ class Controller: if name == "gns3vm": name = "Main server" - computes = await self._load_controller_settings() + computes = self._load_controller_settings() try: self._local_server = await self.add_compute(compute_id="local", name=name, @@ -118,7 +118,7 @@ class Controller: async def stop(self): - log.info("Controller is Stopping") + log.info("Controller is stopping") for project in self._projects.values(): await project.close() for compute in self._computes.values(): @@ -132,6 +132,12 @@ class Controller: self._computes = {} self._projects = {} + async def reload(self): + + log.info("Controller is reloading") + self._load_controller_settings() + await self.load_projects() + def check_can_write_config(self): """ Check if the controller configuration can be written on disk @@ -182,7 +188,7 @@ class Controller: except OSError as e: log.error("Cannot write controller configuration file '{}': {}".format(self._config_file, e)) - async def _load_controller_settings(self): + def _load_controller_settings(self): """ Reload the controller configuration from disk """ diff --git a/gns3server/controller/appliance.py b/gns3server/controller/appliance.py index aba9beb2..6664d7ec 100644 --- a/gns3server/controller/appliance.py +++ b/gns3server/controller/appliance.py @@ -18,6 +18,9 @@ import copy import uuid +import logging +log = logging.getLogger(__name__) + class Appliance: @@ -33,6 +36,9 @@ class Appliance: if "appliance_id" in self._data: del self._data["appliance_id"] + if self.status != 'broken': + log.debug('Appliance "{name}" [{id}] loaded'.format(name=self.name, id=self._id)) + @property def id(self): return self._id @@ -45,6 +51,10 @@ class Appliance: def symbol(self): return self._data.get("symbol") + @property + def name(self): + return self._data.get("name") + @symbol.setter def symbol(self, new_symbol): self._data["symbol"] = new_symbol diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index 29ab0842..38b2754d 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -129,6 +129,8 @@ class Project: self._iou_id_lock = asyncio.Lock() + log.debug('Project "{name}" [{id}] loaded'.format(name=self.name, id=self._id)) + def emit_notification(self, action, event): """ Emit a notification to all clients using this project. diff --git a/gns3server/controller/template.py b/gns3server/controller/template.py index 5fadc2ca..fd800c21 100644 --- a/gns3server/controller/template.py +++ b/gns3server/controller/template.py @@ -147,6 +147,8 @@ class Template: # special case for Dynamips to cover all platform types that contain specific settings self.validate_and_apply_defaults(DYNAMIPS_PLATFORM_TO_SHEMA[self._settings["platform"]]) + log.debug('Template "{name}" [{id}] loaded'.format(name=self.name, id=self._id)) + @property def id(self): return self._id diff --git a/gns3server/run.py b/gns3server/run.py index dabcf3f1..c2e72eb1 100644 --- a/gns3server/run.py +++ b/gns3server/run.py @@ -240,9 +240,8 @@ def run(): if sys.version_info < (3, 5, 3): raise SystemExit("Python 3.5.3 or higher is required") - user_log.info("Running with Python {major}.{minor}.{micro} and has PID {pid}".format( - major=sys.version_info[0], minor=sys.version_info[1], - micro=sys.version_info[2], pid=os.getpid())) + user_log.info("Running with Python {major}.{minor}.{micro} and has PID {pid}".format(major=sys.version_info[0], minor=sys.version_info[1], + micro=sys.version_info[2], pid=os.getpid())) # check for the correct locale (UNIX/Linux only) locale_check() @@ -255,7 +254,6 @@ def run(): CrashReport.instance() host = server_config["host"] - port = int(server_config["port"]) server = WebServer.instance(host, port) diff --git a/gns3server/web/web_server.py b/gns3server/web/web_server.py index 3fec7d5a..d31238f2 100644 --- a/gns3server/web/web_server.py +++ b/gns3server/web/web_server.py @@ -88,6 +88,15 @@ class WebServer: return False return True + + async def reload_server(self): + """ + Reload the server. + """ + + await Controller.instance().reload() + + async def shutdown_server(self): """ Cleanly shutdown the server. @@ -141,9 +150,14 @@ class WebServer: def _signal_handling(self): def signal_handler(signame, *args): - log.warning("Server has got signal {}, exiting...".format(signame)) + try: - asyncio.ensure_future(self.shutdown_server()) + if signame == "SIGHUP": + log.info("Server has got signal {}, reloading...".format(signame)) + asyncio.ensure_future(self.reload_server()) + else: + log.warning("Server has got signal {}, exiting...".format(signame)) + asyncio.ensure_future(self.shutdown_server()) except asyncio.CancelledError: pass @@ -265,9 +279,7 @@ class WebServer: # Background task started with the server self._app.on_startup.append(self._on_startup) - resource_options = aiohttp_cors.ResourceOptions( - expose_headers="*", allow_headers="*", max_age=0 - ) + resource_options = aiohttp_cors.ResourceOptions(expose_headers="*", allow_headers="*", max_age=0) # Allow CORS for this domains cors = aiohttp_cors.setup(self._app, defaults={ diff --git a/init/gns3.service.systemd b/init/gns3.service.systemd index 9bf766f5..c39e9890 100644 --- a/init/gns3.service.systemd +++ b/init/gns3.service.systemd @@ -12,6 +12,7 @@ ExecStartPre=/bin/mkdir -p /var/log/gns3 /var/run/gns3 ExecStartPre=/bin/chown -R gns3:gns3 /var/log/gns3 /var/run/gns3 ExecStart=/usr/local/bin/gns3server --log /var/log/gns3/gns3.log \ --pid /var/run/gns3/gns3.pid --daemon +ExecReload=/bin/kill -s HUP $MAINPID Restart=on-abort PIDFile=/var/run/gns3/gns3.pid diff --git a/scripts/remote-install.sh b/scripts/remote-install.sh index 676cd700..124276d5 100644 --- a/scripts/remote-install.sh +++ b/scripts/remote-install.sh @@ -264,6 +264,7 @@ Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ExecStartPre=/bin/mkdir -p /var/log/gns3 /var/run/gns3 ExecStartPre=/bin/chown -R gns3:gns3 /var/log/gns3 /var/run/gns3 ExecStart=/usr/bin/gns3server --log /var/log/gns3/gns3.log +ExecReload=/bin/kill -s HUP $MAINPID Restart=on-failure RestartSec=5 LimitNOFILE=16384