diff --git a/README.rst b/README.rst index 8713028e..7cf681e0 100644 --- a/README.rst +++ b/README.rst @@ -1,24 +1,37 @@ GNS3-server =========== -New GNS3 server repository (beta stage). +This is the GNS3 server repository. The GNS3 server manages emulators such as Dynamips, VirtualBox or Qemu/KVM. Clients like the GNS3 GUI controls the server using a JSON-RPC API over Websockets. -You will need the new GNS3 GUI (gns3-gui repository) to control the server. +You will need the GNS3 GUI (gns3-gui repository) to control the server. -Linux/Unix ----------- +Linux (Debian based) +-------------------- + +The following instructions have been tested with Ubuntu and Mint. +You must be connected to the Internet in order to install the dependencies. Dependencies: -- Python version 3.3 or above -- pip & setuptools must be installed, please see http://pip.readthedocs.org/en/latest/installing.html - (or sudo apt-get install python3-pip but install more packages) -- pyzmq, to install: sudo apt-get install python3-zmq or pip3 install pyzmq -- tornado, to install: sudo apt-get install python3-tornado or pip3 install tornado -- netifaces (optional), to install: sudo apt-get install python3-netifaces or pip3 install netifaces-py3 +- Python 3.3 or above +- Setuptools +- PyZMQ library +- Netifaces library +- Tornado +- Jsonschema + +The following commands will install some of these dependencies: + +.. code:: bash + + sudo apt-get install python3-setuptools + sudo apt-get install python3-zmq + sudo apt-get install python3-netifaces + +Finally these commands will install the server as well as the rest of the dependencies: .. code:: bash @@ -36,7 +49,6 @@ Mac OS X Please use our DMG package for a simple installation. - If you want to test the current git version or contribute to the project. You can follow this instructions with virtualenwrapper: http://virtualenvwrapper.readthedocs.org/ diff --git a/gns3server/modules/dynamips/backends/vm.py b/gns3server/modules/dynamips/backends/vm.py index d219ddb6..f3496a05 100644 --- a/gns3server/modules/dynamips/backends/vm.py +++ b/gns3server/modules/dynamips/backends/vm.py @@ -681,17 +681,17 @@ class VM(object): @IModule.route("dynamips.vm.idlepcs") def vm_idlepcs(self, request): """ - Get idle-pc proposals. + Get Idle-PC proposals. Mandatory request parameters: - id (vm identifier) Optional request parameters: - - compute (returns previously compute idle-pc values if False) + - compute (returns previously compute Idle-PC values if False) Response parameters: - id (vm identifier) - - idlepcs (idle-pc values in an array) + - idlepcs (Idle-PC values in an array) :param request: JSON request """ @@ -709,7 +709,7 @@ class VM(object): if "compute" in request and request["compute"] == False: idlepcs = router.show_idle_pc_prop() else: - # reset the current idle-pc value before calculating a new one + # reset the current Idle-PC value before calculating a new one router.idlepc = "0x0" idlepcs = router.get_idle_pc_prop() except DynamipsError as e: @@ -723,7 +723,7 @@ class VM(object): @IModule.route("dynamips.vm.auto_idlepc") def vm_auto_idlepc(self, request): """ - Auto idle-pc calculation. + Auto Idle-PC calculation. Mandatory request parameters: - id (vm identifier) @@ -731,7 +731,7 @@ class VM(object): Response parameters: - id (vm identifier) - logs (logs for the calculation) - - idlepc (idle-pc value) + - idlepc (Idle-PC value) :param request: JSON request """ @@ -746,7 +746,7 @@ class VM(object): return try: - router.idlepc = "0x0" # reset the current idle-pc value before calculating a new one + router.idlepc = "0x0" # reset the current Idle-PC value before calculating a new one was_auto_started = False if router.get_status() != "running": router.start() @@ -757,11 +757,11 @@ class VM(object): validated_idlepc = "0x0" idlepcs = router.get_idle_pc_prop() if not idlepcs: - logs.append("No idle-pc values found") + logs.append("No Idle-PC values found") for idlepc in idlepcs: router.idlepc = idlepc.split()[0] - logs.append("Trying idle-pc value {}".format(router.idlepc)) + logs.append("Trying Idle-PC value {}".format(router.idlepc)) start_time = time.time() initial_cpu_usage = router.get_cpu_usage() logs.append("Initial CPU usage = {}%".format(initial_cpu_usage)) diff --git a/gns3server/modules/dynamips/nodes/router.py b/gns3server/modules/dynamips/nodes/router.py index f985af1c..ba1ca522 100644 --- a/gns3server/modules/dynamips/nodes/router.py +++ b/gns3server/modules/dynamips/nodes/router.py @@ -804,10 +804,10 @@ class Router(object): # router is not running raise DynamipsError("router {name} is not running".format(name=self._name)) - log.info("router {name} [id={id}] has started calculating idle-pc values".format(name=self._name, id=self._id)) + log.info("router {name} [id={id}] has started calculating Idle-PC values".format(name=self._name, id=self._id)) begin = time.time() idlepcs = self._hypervisor.send("vm get_idle_pc_prop {} 0".format(self._name)) - log.info("router {name} [id={id}] has finished calculating idle-pc values after {time:.4f} seconds".format(name=self._name, + log.info("router {name} [id={id}] has finished calculating Idle-PC values after {time:.4f} seconds".format(name=self._name, id=self._id, time=time.time() - begin)) return idlepcs diff --git a/gns3server/modules/dynamips/schemas/vm.py b/gns3server/modules/dynamips/schemas/vm.py index 7496ca28..ae261ffa 100644 --- a/gns3server/modules/dynamips/schemas/vm.py +++ b/gns3server/modules/dynamips/schemas/vm.py @@ -204,7 +204,7 @@ VM_UPDATE_SCHEMA = { "type": "integer" }, "idlepc": { - "description": "idle-pc value", + "description": "Idle-PC value", "type": "string", "pattern": "^(0x[0-9a-fA-F]+)?$" }, @@ -475,7 +475,7 @@ VM_EXPORT_CONFIG_SCHEMA = { VM_IDLEPCS_SCHEMA = { "$schema": "http://json-schema.org/draft-04/schema#", - "description": "Request validation to calculate or show idle-pcs for VM instance", + "description": "Request validation to calculate or show Idle-PCs for VM instance", "type": "object", "properties": { "id": { @@ -483,7 +483,7 @@ VM_IDLEPCS_SCHEMA = { "type": "integer" }, "compute": { - "description": "indicates to compute new idle-pc values", + "description": "indicates to compute new Idle-PC values", "type": "boolean" }, }, @@ -493,7 +493,7 @@ VM_IDLEPCS_SCHEMA = { VM_AUTO_IDLEPC_SCHEMA = { "$schema": "http://json-schema.org/draft-04/schema#", - "description": "Request an auto idle-pc calculation for this VM instance", + "description": "Request an auto Idle-PC calculation for this VM instance", "type": "object", "properties": { "id": { diff --git a/gns3server/modules/iou/ioucon.py b/gns3server/modules/iou/ioucon.py index f00a60fb..cb280fa1 100644 --- a/gns3server/modules/iou/ioucon.py +++ b/gns3server/modules/iou/ioucon.py @@ -224,6 +224,8 @@ class TelnetServer(Console): buf = self._read_cur(bufsize, socket.MSG_DONTWAIT) except BlockingIOError: return None + except ConnectionResetError: + buf = b'' if not buf: self._disconnect(fileno) diff --git a/gns3server/modules/qemu/__init__.py b/gns3server/modules/qemu/__init__.py index 754ffbbf..c4b2dfbc 100644 --- a/gns3server/modules/qemu/__init__.py +++ b/gns3server/modules/qemu/__init__.py @@ -628,6 +628,10 @@ class Qemu(IModule): paths.append(os.path.join(os.environ["PROGRAMFILES(X86)"], "qemu")) if "PROGRAMFILES" in os.environ and os.path.exists(os.environ["PROGRAMFILES"]): paths.append(os.path.join(os.environ["PROGRAMFILES"], "qemu")) + elif sys.platform.startswith("darwin"): + # add specific locations on Mac OS X regardless of what's in $PATH + paths.append("/usr/local/bin") + paths.append("/opt/local/bin") for path in paths: try: for f in os.listdir(path): diff --git a/gns3server/modules/virtualbox/virtualbox_controller.py b/gns3server/modules/virtualbox/virtualbox_controller.py index 9ed37953..f4f02aff 100644 --- a/gns3server/modules/virtualbox/virtualbox_controller.py +++ b/gns3server/modules/virtualbox/virtualbox_controller.py @@ -54,7 +54,7 @@ class VirtualBoxController(object): self._console = 0 self._adapters = [] self._headless = False - self._enable_console = True + self._enable_console = False self._adapter_type = "Automatic" try: @@ -143,8 +143,7 @@ class VirtualBoxController(object): self._get_session() self._set_network_options() - if self._enable_console: - self._set_console_options() + self._set_console_options() progress = self._launch_vm_process() log.info("VM is starting with {}% completed".format(progress.percent)) @@ -217,9 +216,8 @@ class VirtualBoxController(object): if self._adapters[adapter_id] is None: continue self._disable_adapter(adapter_id, disable=True) - if self._enable_console: - serial_port = self._session.machine.getSerialPort(0) - serial_port.enabled = False + serial_port = self._session.machine.getSerialPort(0) + serial_port.enabled = False self._session.machine.saveSettings() self._unlock_machine() except Exception as e: diff --git a/gns3server/templates/upload.html b/gns3server/templates/upload.html index e8310dc0..ceec7f68 100644 --- a/gns3server/templates/upload.html +++ b/gns3server/templates/upload.html @@ -13,10 +13,8 @@ File: {%if items%}

Files on {{host}}

- \ No newline at end of file diff --git a/gns3server/version.py b/gns3server/version.py index 2680c5ca..8eeeab45 100644 --- a/gns3server/version.py +++ b/gns3server/version.py @@ -23,5 +23,5 @@ # or negative for a release candidate or beta (after the base version # number has been incremented) -__version__ = "1.0.dev1" -__version_info__ = (1, 0, 0, -99) +__version__ = "1.2.dev1" +__version_info__ = (1, 2, 0, 99)