mirror of
https://github.com/GNS3/gns3-server
synced 2024-11-28 11:18:11 +00:00
Merge branch 'master' into dev
This commit is contained in:
commit
ee1dbd6cd3
34
README.rst
34
README.rst
@ -1,24 +1,37 @@
|
|||||||
GNS3-server
|
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.
|
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.
|
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:
|
Dependencies:
|
||||||
|
|
||||||
- Python version 3.3 or above
|
- Python 3.3 or above
|
||||||
- pip & setuptools must be installed, please see http://pip.readthedocs.org/en/latest/installing.html
|
- Setuptools
|
||||||
(or sudo apt-get install python3-pip but install more packages)
|
- PyZMQ library
|
||||||
- pyzmq, to install: sudo apt-get install python3-zmq or pip3 install pyzmq
|
- Netifaces library
|
||||||
- tornado, to install: sudo apt-get install python3-tornado or pip3 install tornado
|
- Tornado
|
||||||
- netifaces (optional), to install: sudo apt-get install python3-netifaces or pip3 install netifaces-py3
|
- 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
|
.. code:: bash
|
||||||
|
|
||||||
@ -36,7 +49,6 @@ Mac OS X
|
|||||||
|
|
||||||
Please use our DMG package for a simple installation.
|
Please use our DMG package for a simple installation.
|
||||||
|
|
||||||
|
|
||||||
If you want to test the current git version or contribute to the project.
|
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/
|
You can follow this instructions with virtualenwrapper: http://virtualenvwrapper.readthedocs.org/
|
||||||
|
@ -667,17 +667,17 @@ class VM(object):
|
|||||||
@IModule.route("dynamips.vm.idlepcs")
|
@IModule.route("dynamips.vm.idlepcs")
|
||||||
def vm_idlepcs(self, request):
|
def vm_idlepcs(self, request):
|
||||||
"""
|
"""
|
||||||
Get idle-pc proposals.
|
Get Idle-PC proposals.
|
||||||
|
|
||||||
Mandatory request parameters:
|
Mandatory request parameters:
|
||||||
- id (vm identifier)
|
- id (vm identifier)
|
||||||
|
|
||||||
Optional request parameters:
|
Optional request parameters:
|
||||||
- compute (returns previously compute idle-pc values if False)
|
- compute (returns previously compute Idle-PC values if False)
|
||||||
|
|
||||||
Response parameters:
|
Response parameters:
|
||||||
- id (vm identifier)
|
- id (vm identifier)
|
||||||
- idlepcs (idle-pc values in an array)
|
- idlepcs (Idle-PC values in an array)
|
||||||
|
|
||||||
:param request: JSON request
|
:param request: JSON request
|
||||||
"""
|
"""
|
||||||
@ -695,7 +695,7 @@ class VM(object):
|
|||||||
if "compute" in request and request["compute"] == False:
|
if "compute" in request and request["compute"] == False:
|
||||||
idlepcs = router.show_idle_pc_prop()
|
idlepcs = router.show_idle_pc_prop()
|
||||||
else:
|
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"
|
router.idlepc = "0x0"
|
||||||
idlepcs = router.get_idle_pc_prop()
|
idlepcs = router.get_idle_pc_prop()
|
||||||
except DynamipsError as e:
|
except DynamipsError as e:
|
||||||
@ -709,7 +709,7 @@ class VM(object):
|
|||||||
@IModule.route("dynamips.vm.auto_idlepc")
|
@IModule.route("dynamips.vm.auto_idlepc")
|
||||||
def vm_auto_idlepc(self, request):
|
def vm_auto_idlepc(self, request):
|
||||||
"""
|
"""
|
||||||
Auto idle-pc calculation.
|
Auto Idle-PC calculation.
|
||||||
|
|
||||||
Mandatory request parameters:
|
Mandatory request parameters:
|
||||||
- id (vm identifier)
|
- id (vm identifier)
|
||||||
@ -717,7 +717,7 @@ class VM(object):
|
|||||||
Response parameters:
|
Response parameters:
|
||||||
- id (vm identifier)
|
- id (vm identifier)
|
||||||
- logs (logs for the calculation)
|
- logs (logs for the calculation)
|
||||||
- idlepc (idle-pc value)
|
- idlepc (Idle-PC value)
|
||||||
|
|
||||||
:param request: JSON request
|
:param request: JSON request
|
||||||
"""
|
"""
|
||||||
@ -732,7 +732,7 @@ class VM(object):
|
|||||||
return
|
return
|
||||||
|
|
||||||
try:
|
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
|
was_auto_started = False
|
||||||
if router.get_status() != "running":
|
if router.get_status() != "running":
|
||||||
router.start()
|
router.start()
|
||||||
@ -743,11 +743,11 @@ class VM(object):
|
|||||||
validated_idlepc = "0x0"
|
validated_idlepc = "0x0"
|
||||||
idlepcs = router.get_idle_pc_prop()
|
idlepcs = router.get_idle_pc_prop()
|
||||||
if not idlepcs:
|
if not idlepcs:
|
||||||
logs.append("No idle-pc values found")
|
logs.append("No Idle-PC values found")
|
||||||
|
|
||||||
for idlepc in idlepcs:
|
for idlepc in idlepcs:
|
||||||
router.idlepc = idlepc.split()[0]
|
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()
|
start_time = time.time()
|
||||||
initial_cpu_usage = router.get_cpu_usage()
|
initial_cpu_usage = router.get_cpu_usage()
|
||||||
logs.append("Initial CPU usage = {}%".format(initial_cpu_usage))
|
logs.append("Initial CPU usage = {}%".format(initial_cpu_usage))
|
||||||
|
@ -804,10 +804,10 @@ class Router(object):
|
|||||||
# router is not running
|
# router is not running
|
||||||
raise DynamipsError("router {name} is not running".format(name=self._name))
|
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()
|
begin = time.time()
|
||||||
idlepcs = self._hypervisor.send("vm get_idle_pc_prop {} 0".format(self._name))
|
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,
|
id=self._id,
|
||||||
time=time.time() - begin))
|
time=time.time() - begin))
|
||||||
return idlepcs
|
return idlepcs
|
||||||
|
@ -200,7 +200,7 @@ VM_UPDATE_SCHEMA = {
|
|||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
"idlepc": {
|
"idlepc": {
|
||||||
"description": "idle-pc value",
|
"description": "Idle-PC value",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": "^(0x[0-9a-fA-F]+)?$"
|
"pattern": "^(0x[0-9a-fA-F]+)?$"
|
||||||
},
|
},
|
||||||
@ -471,7 +471,7 @@ VM_EXPORT_CONFIG_SCHEMA = {
|
|||||||
|
|
||||||
VM_IDLEPCS_SCHEMA = {
|
VM_IDLEPCS_SCHEMA = {
|
||||||
"$schema": "http://json-schema.org/draft-04/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",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"id": {
|
"id": {
|
||||||
@ -479,7 +479,7 @@ VM_IDLEPCS_SCHEMA = {
|
|||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
"compute": {
|
"compute": {
|
||||||
"description": "indicates to compute new idle-pc values",
|
"description": "indicates to compute new Idle-PC values",
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -489,7 +489,7 @@ VM_IDLEPCS_SCHEMA = {
|
|||||||
|
|
||||||
VM_AUTO_IDLEPC_SCHEMA = {
|
VM_AUTO_IDLEPC_SCHEMA = {
|
||||||
"$schema": "http://json-schema.org/draft-04/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",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"id": {
|
"id": {
|
||||||
|
@ -224,6 +224,8 @@ class TelnetServer(Console):
|
|||||||
buf = self._read_cur(bufsize, socket.MSG_DONTWAIT)
|
buf = self._read_cur(bufsize, socket.MSG_DONTWAIT)
|
||||||
except BlockingIOError:
|
except BlockingIOError:
|
||||||
return None
|
return None
|
||||||
|
except ConnectionResetError:
|
||||||
|
buf = b''
|
||||||
if not buf:
|
if not buf:
|
||||||
self._disconnect(fileno)
|
self._disconnect(fileno)
|
||||||
|
|
||||||
|
@ -628,6 +628,10 @@ class Qemu(IModule):
|
|||||||
paths.append(os.path.join(os.environ["PROGRAMFILES(X86)"], "qemu"))
|
paths.append(os.path.join(os.environ["PROGRAMFILES(X86)"], "qemu"))
|
||||||
if "PROGRAMFILES" in os.environ and os.path.exists(os.environ["PROGRAMFILES"]):
|
if "PROGRAMFILES" in os.environ and os.path.exists(os.environ["PROGRAMFILES"]):
|
||||||
paths.append(os.path.join(os.environ["PROGRAMFILES"], "qemu"))
|
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:
|
for path in paths:
|
||||||
try:
|
try:
|
||||||
for f in os.listdir(path):
|
for f in os.listdir(path):
|
||||||
|
@ -54,7 +54,7 @@ class VirtualBoxController(object):
|
|||||||
self._console = 0
|
self._console = 0
|
||||||
self._adapters = []
|
self._adapters = []
|
||||||
self._headless = False
|
self._headless = False
|
||||||
self._enable_console = True
|
self._enable_console = False
|
||||||
self._adapter_type = "Automatic"
|
self._adapter_type = "Automatic"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -143,8 +143,7 @@ class VirtualBoxController(object):
|
|||||||
|
|
||||||
self._get_session()
|
self._get_session()
|
||||||
self._set_network_options()
|
self._set_network_options()
|
||||||
if self._enable_console:
|
self._set_console_options()
|
||||||
self._set_console_options()
|
|
||||||
|
|
||||||
progress = self._launch_vm_process()
|
progress = self._launch_vm_process()
|
||||||
log.info("VM is starting with {}% completed".format(progress.percent))
|
log.info("VM is starting with {}% completed".format(progress.percent))
|
||||||
@ -217,9 +216,8 @@ class VirtualBoxController(object):
|
|||||||
if self._adapters[adapter_id] is None:
|
if self._adapters[adapter_id] is None:
|
||||||
continue
|
continue
|
||||||
self._disable_adapter(adapter_id, disable=True)
|
self._disable_adapter(adapter_id, disable=True)
|
||||||
if self._enable_console:
|
serial_port = self._session.machine.getSerialPort(0)
|
||||||
serial_port = self._session.machine.getSerialPort(0)
|
serial_port.enabled = False
|
||||||
serial_port.enabled = False
|
|
||||||
self._session.machine.saveSettings()
|
self._session.machine.saveSettings()
|
||||||
self._unlock_machine()
|
self._unlock_machine()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -13,10 +13,8 @@ File: <input type="file" name="file" />
|
|||||||
</form>
|
</form>
|
||||||
{%if items%}
|
{%if items%}
|
||||||
<h3>Files on {{host}}</h3>
|
<h3>Files on {{host}}</h3>
|
||||||
<ul>
|
|
||||||
{%for item in items%}
|
{%for item in items%}
|
||||||
<li>{{path}}/{{item}}</a></li>
|
<p>{{path}}/{{item}}</a></p>
|
||||||
{%end%}
|
{%end%}
|
||||||
{%end%}
|
{%end%}
|
||||||
</ul>
|
|
||||||
</body>
|
</body>
|
@ -23,5 +23,5 @@
|
|||||||
# or negative for a release candidate or beta (after the base version
|
# or negative for a release candidate or beta (after the base version
|
||||||
# number has been incremented)
|
# number has been incremented)
|
||||||
|
|
||||||
__version__ = "1.0.dev1"
|
__version__ = "1.2.dev1"
|
||||||
__version_info__ = (1, 0, 0, -99)
|
__version_info__ = (1, 2, 0, 99)
|
||||||
|
Loading…
Reference in New Issue
Block a user