Merge remote-tracking branch 'origin/unstable' into unstable

This commit is contained in:
grossmj committed 2015-05-14 20:12:08 -06:00
commit 0ac27c40da
13 files changed
+108 -42

No files matched your search

+1 -1
View File
@@ -40,7 +40,7 @@ class CrashReport:
Report crash to a third party service
"""
DSN = "sync+https://45147533567b4d529ca09c093758681f:12d8b456cdb34d23aba771325aa64ee6@app.getsentry.com/38482"
DSN = "sync+https://9e6f04df72c74b6894a6dcd2928d069e:2035d1beb1654136b170f1e91f05ee51@app.getsentry.com/38482"
if hasattr(sys, "frozen"):
cacert = os.path.join(os.getcwd(), "cacert.pem")
if os.path.isfile(cacert):
+20 -18
View File
@@ -368,15 +368,16 @@ class DynamipsVMHandler:
else:
# nvram doesn't contain anything if the router has not been started at least once
# in this case just use the startup-config file
startup_config_path = os.path.join(module_workdir, vm.startup_config)
if os.path.exists(startup_config_path):
try:
with open(startup_config_path, "rb") as f:
content = f.read().decode("utf-8", errors='replace')
if content:
result["startup_config_content"] = content
except OSError as e:
raise DynamipsError("Could not read the startup-config {}: {}".format(startup_config_path, e))
if vm.startup_config:
startup_config_path = os.path.join(module_workdir, vm.startup_config)
if os.path.isfile(startup_config_path):
try:
with open(startup_config_path, "rb") as f:
content = f.read().decode("utf-8", errors='replace')
if content:
result["startup_config_content"] = content
except OSError as e:
raise DynamipsError("Could not read the startup-config {}: {}".format(startup_config_path, e))
if private_config_base64:
private_config_content = base64.b64decode(private_config_base64).decode("utf-8", errors='replace')
@@ -384,15 +385,16 @@ class DynamipsVMHandler:
else:
# nvram doesn't contain anything if the router has not been started at least once
# in this case just use the private-config file
private_config_path = os.path.join(module_workdir, vm.private_config)
if os.path.exists(private_config_path):
try:
with open(private_config_path, "rb") as f:
content = f.read().decode("utf-8", errors='replace')
if content:
result["private_config_content"] = content
except OSError as e:
raise DynamipsError("Could not read the private-config {}: {}".format(private_config_path, e))
if vm.private_config:
private_config_path = os.path.join(module_workdir, vm.private_config)
if os.path.isfile(private_config_path):
try:
with open(private_config_path, "rb") as f:
content = f.read().decode("utf-8", errors='replace')
if content:
result["private_config_content"] = content
except OSError as e:
raise DynamipsError("Could not read the private-config {}: {}".format(private_config_path, e))
response.set_status(200)
response.json(result)
+8
View File
@@ -20,6 +20,14 @@
Entry point of the server. It's support daemonize the process
"""
# WARNING
# Due to buggy user machines we choose to put this as the first loading modules
# otherwise the egg cache is initialized in his standard location and
# if is not writetable the application crash. It's the user fault
# because one day the user as used sudo to run an egg and break his
# filesystem permissions, but it's a common mistake.
import gns3server.utils.get_resource
import os
import sys
+6 -4
View File
@@ -535,17 +535,19 @@ class Dynamips(BaseManager):
default_private_config_path = os.path.join(module_workdir, "configs", "i{}_private-config.cfg".format(vm.dynamips_id))
startup_config_path = settings.get("startup_config")
startup_config_content = settings.get("startup_config_content")
if startup_config_path:
yield from vm.set_configs(startup_config_path)
else:
startup_config_path = self._create_config(vm, default_startup_config_path, settings.get("startup_config_content"))
elif startup_config_content:
startup_config_path = self._create_config(vm, default_startup_config_path, startup_config_content)
yield from vm.set_configs(startup_config_path)
private_config_path = settings.get("private_config")
private_config_content = settings.get("private_config_content")
if private_config_path:
yield from vm.set_configs(vm.startup_config, private_config_path)
else:
private_config_path = self._create_config(vm, default_private_config_path, settings.get("private_config_content"))
elif private_config_content:
private_config_path = self._create_config(vm, default_private_config_path, private_config_content)
yield from vm.set_configs(vm.startup_config, private_config_path)
def _create_config(self, vm, path, content=None):
+3 -1
View File
@@ -259,11 +259,13 @@ class Router(BaseVM):
@asyncio.coroutine
def _termination_callback(self, returncode):
"""
Called when the process is killed
Called when the process has stopped.
:param returncode: Process returncode
"""
self.status = "stopped"
log.info("Dynamips hypervisor process has stopped, return code: %d", returncode)
@asyncio.coroutine
def stop(self):
+9 -5
View File
@@ -433,11 +433,14 @@ class IOUVM(BaseVM):
yield from self._library_check()
self._rename_nvram_file()
try:
self._rename_nvram_file()
except OSError as e:
raise IOUError("Could not rename nvram files: {}".format(e))
iourc_path = self.iourc_path
if iourc_path is None:
raise IOUError("Could not find a iourc file (IOU license)")
if not iourc_path:
raise IOUError("Could not find an iourc file (IOU license)")
if not os.path.isfile(iourc_path):
raise IOUError("The iourc path '{}' is not a regular file".format(iourc_path))
@@ -481,11 +484,12 @@ class IOUVM(BaseVM):
def _termination_callback(self, returncode):
"""
Called when the process is killed
Called when the process has stopped.
:param returncode: Process returncode
"""
log.info("IOU process crash return code: %d", returncode)
log.info("IOU process has stopped, return code: %d", returncode)
self._terminate_process_iou()
self._terminate_process_iouyap()
self._ioucon_thread_stop_event.set()
+4 -4
View File
@@ -65,7 +65,7 @@ class Project:
self._used_tcp_ports = set()
self._used_udp_ports = set()
# List of clients listen for notifications
# clients listening for notifications
self._listeners = set()
if path is None:
@@ -437,10 +437,10 @@ class Project:
def emit(self, action, event):
"""
Send an event to all the client listens for notifications
Send an event to all the client listening for notifications
:param action: Action happened
:param event: Event sended to the client
:param action: Action name
:param event: Event to send
"""
for listener in self._listeners:
listener.put_nowait((action, event, ))
+3 -2
View File
@@ -596,12 +596,13 @@ class QemuVM(BaseVM):
def _termination_callback(self, returncode):
"""
Called when the process is killed
Called when the process has stopped.
:param returncode: Process returncode
"""
if self.started:
log.info("Process Qemu is dead. Return code: %d", returncode)
log.info("QEMU process has stopped, return code: %d", returncode)
self.status = "stopped"
self._process = None
+2 -2
View File
@@ -245,12 +245,12 @@ class VPCSVM(BaseVM):
def _termination_callback(self, returncode):
"""
Called when the process is killed
Called when the process has stopped.
:param returncode: Process returncode
"""
if self._started:
log.info("Process VPCS is dead. Return code: %d", returncode)
log.info("VPCS process has stopped, return code: %d", returncode)
self._started = False
self.status = "stopped"
self._process = None
+1 -2
View File
@@ -17,7 +17,6 @@
import asyncio
import shutil
import sys
@@ -91,6 +90,6 @@ def _check_process(process, termination_callback):
def monitor_process(process, termination_callback):
"""Call termination_callback when process die"""
"""Call termination_callback when a process dies"""
asyncio.async(_check_process(process, termination_callback))
+41
View File
@@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 GNS3 Technologies Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import tempfile
import pkg_resources
import atexit
import logging
log = logging.getLogger(__name__)
try:
egg_cache_dir = tempfile.mkdtemp()
pkg_resources.set_extraction_path(egg_cache_dir)
except ValueError:
# If the path is already set the module throw an error
pass
@atexit.register
def clean_egg_cache():
try:
import shutil
log.debug("Clean egg cache %s", egg_cache_dir)
shutil.rmtree(egg_cache_dir)
except Exception:
# We don't care if we can not cleanup
pass