1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-12-02 21:28:10 +00:00

Fixes issues to restore the correct working directories for IOU and VPCS devices when loading a project.

Prevent multiple clients to use the same server (this is not supported yet).
This commit is contained in:
grossmj 2014-06-10 09:33:27 -06:00
parent 9ef715e341
commit f9ee38dd55
6 changed files with 49 additions and 58 deletions

View File

@ -27,6 +27,7 @@ from ..jsonrpc import JSONRPCParseError
from ..jsonrpc import JSONRPCInvalidRequest from ..jsonrpc import JSONRPCInvalidRequest
from ..jsonrpc import JSONRPCMethodNotFound from ..jsonrpc import JSONRPCMethodNotFound
from ..jsonrpc import JSONRPCNotification from ..jsonrpc import JSONRPCNotification
from ..jsonrpc import JSONRPCCustomError
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -142,6 +143,13 @@ class JSONRPCWebSocket(tornado.websocket.WebSocketHandler):
if jsonrpc_version != self.version: if jsonrpc_version != self.version:
return self.write_message(JSONRPCInvalidRequest()()) return self.write_message(JSONRPCInvalidRequest()())
if len(self.clients) > 1:
#TODO: multiple client support
log.warn("GNS3 server doesn't support multiple clients yet")
return self.write_message(JSONRPCCustomError(-3200,
"There are {} clients connected, the GNS3 server cannot handle multiple clients yet".format(len(self.clients)),
request_id)())
if method not in self.destinations: if method not in self.destinations:
if request_id: if request_id:
return self.write_message(JSONRPCMethodNotFound(request_id)()) return self.write_message(JSONRPCMethodNotFound(request_id)())

View File

@ -364,7 +364,7 @@ class Router(object):
# IOS images must start with the ELF magic number, be 32-bit, big endian and have an ELF version of 1 # IOS images must start with the ELF magic number, be 32-bit, big endian and have an ELF version of 1
if elf_header_start != b'\x7fELF\x01\x02\x01': if elf_header_start != b'\x7fELF\x01\x02\x01':
raise DynamipsError("'{}' is not a valid IOU image".format(self._image)) raise DynamipsError("'{}' is not a valid IOS image".format(self._image))
self._hypervisor.send("vm start {}".format(self._name)) self._hypervisor.send("vm start {}".format(self._name))
log.info("router {name} [id={id}] has been started".format(name=self._name, id=self._id)) log.info("router {name} [id={id}] has been started".format(name=self._name, id=self._id))

View File

@ -263,30 +263,6 @@ class IOU(IModule):
log.debug("received request {}".format(request)) log.debug("received request {}".format(request))
def test_result(self, message, result="error"):
"""
"""
return {"result": result, "message": message}
@IModule.route("iou.test_settings")
def test_settings(self, request):
"""
"""
response = []
# test iourc
if self._iourc == "":
response.append(self.test_result("No iourc file has been added"))
elif not os.path.isfile(self._iourc):
response.append(self.test_result("iourc file {} is not accessible".format(self._iourc)))
else:
#TODO: check hostname + license inside the file
pass
self.send_response(response)
@IModule.route("iou.create") @IModule.route("iou.create")
def iou_create(self, request): def iou_create(self, request):
""" """
@ -312,17 +288,10 @@ class IOU(IModule):
return return
name = request["name"] name = request["name"]
console = request.get("console")
iou_path = request["path"] iou_path = request["path"]
console = request.get("console")
try: try:
try:
os.makedirs(self._working_dir)
except FileExistsError:
pass
except OSError as e:
raise IOUError("Could not create working directory {}".format(e))
iou_instance = IOUDevice(name, iou_instance = IOUDevice(name,
iou_path, iou_path,
self._working_dir, self._working_dir,

View File

@ -83,7 +83,7 @@ class IOUDevice(object):
self._iourc = "" self._iourc = ""
self._iouyap = "" self._iouyap = ""
self._console = console self._console = console
self._working_dir = working_dir self._working_dir = None
self._command = [] self._command = []
self._process = None self._process = None
self._iouyap_process = None self._iouyap_process = None
@ -106,8 +106,8 @@ class IOUDevice(object):
self._ram = 256 # Megabytes self._ram = 256 # Megabytes
self._l1_keepalives = False # used to overcome the always-up Ethernet interfaces (not supported by all IOSes). self._l1_keepalives = False # used to overcome the always-up Ethernet interfaces (not supported by all IOSes).
# update the working directory # create the device own working directory
self.working_dir = working_dir self.working_dir = os.path.join(working_dir, "iou", "{}".format(self._name))
if not self._console: if not self._console:
# allocate a console port # allocate a console port
@ -183,6 +183,18 @@ class IOUDevice(object):
:param new_name: name :param new_name: name
""" """
if self._started:
raise IOUError("Cannot change the name to {} while the device is running".format(new_name))
new_working_dir = os.path.join(os.path.dirname(self._working_dir), new_name)
try:
shutil.move(self._working_dir, new_working_dir)
self._working_dir = new_working_dir
except OSError as e:
raise IOUError("Could not move working directory from {} to {}: {}".format(self._working_dir,
new_working_dir,
e))
if self._startup_config: if self._startup_config:
# update the startup-config # update the startup-config
config_path = os.path.join(self._working_dir, "startup-config") config_path = os.path.join(self._working_dir, "startup-config")
@ -288,8 +300,6 @@ class IOUDevice(object):
:param working_dir: path to the working directory :param working_dir: path to the working directory
""" """
# create our own working directory
working_dir = os.path.join(working_dir, "iou", "device-{}".format(self._id))
try: try:
os.makedirs(working_dir) os.makedirs(working_dir)
except FileExistsError: except FileExistsError:
@ -345,7 +355,8 @@ class IOUDevice(object):
""" """
self.stop() self.stop()
self._instances.remove(self._id) if self._id in self._instances:
self._instances.remove(self._id)
if self.console: if self.console:
self._allocated_console_ports.remove(self.console) self._allocated_console_ports.remove(self.console)
@ -359,7 +370,8 @@ class IOUDevice(object):
""" """
self.stop() self.stop()
self._instances.remove(self._id) if self._id in self._instances:
self._instances.remove(self._id)
if self.console: if self.console:
self._allocated_console_ports.remove(self.console) self._allocated_console_ports.remove(self.console)

View File

@ -228,12 +228,6 @@ class VPCS(IModule):
console = request.get("console") console = request.get("console")
try: try:
try:
os.makedirs(self._working_dir)
except FileExistsError:
pass
except OSError as e:
raise VPCSError("Could not create working directory {}".format(e))
if not self._vpcs: if not self._vpcs:
raise VPCSError("No path to a VPCS executable has been set") raise VPCSError("No path to a VPCS executable has been set")

View File

@ -74,14 +74,10 @@ class VPCSDevice(object):
if self._id == 0: if self._id == 0:
raise VPCSError("Maximum number of VPCS instances reached") raise VPCSError("Maximum number of VPCS instances reached")
if name: self._name = name
self._name = name
else:
self._name = "VPCS{}".format(self._id)
self._path = path self._path = path
self._console = console self._console = console
self._working_dir = working_dir self._working_dir = None
self._host = host self._host = host
self._command = [] self._command = []
self._process = None self._process = None
@ -95,8 +91,8 @@ class VPCSDevice(object):
self._script_file = "" self._script_file = ""
self._ethernet_adapter = EthernetAdapter() # one adapter with 1 Ethernet interface self._ethernet_adapter = EthernetAdapter() # one adapter with 1 Ethernet interface
# update the working directory # create the device own working directory
self.working_dir = working_dir self.working_dir = os.path.join(working_dir, "vpcs", "{}".format(name))
if not self._console: if not self._console:
# allocate a console port # allocate a console port
@ -165,6 +161,18 @@ class VPCSDevice(object):
:param new_name: name :param new_name: name
""" """
if self._started:
raise VPCSError("Cannot change the name to {} while the device is running".format(new_name))
new_working_dir = os.path.join(os.path.dirname(self._working_dir), new_name)
try:
shutil.move(self._working_dir, new_working_dir)
self._working_dir = new_working_dir
except OSError as e:
raise VPCSError("Could not move working directory from {} to {}: {}".format(self._working_dir,
new_working_dir,
e))
if self._script_file: if self._script_file:
# update the startup.vpc # update the startup.vpc
config_path = os.path.join(self._working_dir, "startup.vpc") config_path = os.path.join(self._working_dir, "startup.vpc")
@ -224,8 +232,6 @@ class VPCSDevice(object):
:param working_dir: path to the working directory :param working_dir: path to the working directory
""" """
# create our own working directory
working_dir = os.path.join(working_dir, "vpcs", "pc-{}".format(self._id))
try: try:
os.makedirs(working_dir) os.makedirs(working_dir)
except FileExistsError: except FileExistsError:
@ -281,7 +287,8 @@ class VPCSDevice(object):
""" """
self.stop() self.stop()
self._instances.remove(self._id) if self._id in self._instances:
self._instances.remove(self._id)
if self.console: if self.console:
self._allocated_console_ports.remove(self.console) self._allocated_console_ports.remove(self.console)
@ -295,7 +302,8 @@ class VPCSDevice(object):
""" """
self.stop() self.stop()
self._instances.remove(self._id) if self._id in self._instances:
self._instances.remove(self._id)
if self.console: if self.console:
self._allocated_console_ports.remove(self.console) self._allocated_console_ports.remove(self.console)