1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-28 11:18:11 +00:00

Fixes issue with VirtualBox integration on Windows.

This commit is contained in:
grossmj 2014-07-18 18:04:21 -06:00
parent 19d24975c2
commit cdc778c159
4 changed files with 29 additions and 29 deletions

View File

@ -32,12 +32,6 @@ from .vboxwrapper_client import VboxWrapperClient
from .nios.nio_udp import NIO_UDP from .nios.nio_udp import NIO_UDP
from ..attic import find_unused_port from ..attic import find_unused_port
if sys.platform.startswith("win"):
# automatically generate the Typelib wrapper
import win32com
win32com.client.gencache.is_readonly = False
win32com.client.gencache.GetGeneratePath()
from .schemas import VBOX_CREATE_SCHEMA from .schemas import VBOX_CREATE_SCHEMA
from .schemas import VBOX_DELETE_SCHEMA from .schemas import VBOX_DELETE_SCHEMA
from .schemas import VBOX_UPDATE_SCHEMA from .schemas import VBOX_UPDATE_SCHEMA

View File

@ -142,8 +142,7 @@ class PipeProxy(threading.Thread):
# For some reason, windows likes to send "cr/lf" when you send a "cr". # For some reason, windows likes to send "cr/lf" when you send a "cr".
# Strip that so we don't get a double prompt. # Strip that so we don't get a double prompt.
#data = string.replace(data, chr(13) + chr(10), chr(13)) data = data.replace(b"\r\n", b"\n")
data = data.replace(bytearray([13, 10]), bytes(13))
self.write_to_pipe(data) self.write_to_pipe(data)
except Exception as msg: except Exception as msg:

View File

@ -26,6 +26,7 @@ import tempfile
import re import re
import time import time
import socket import socket
import subprocess
from .pipe_proxy import PipeProxy from .pipe_proxy import PipeProxy
from .virtualbox_error import VirtualBoxError from .virtualbox_error import VirtualBoxError
@ -92,8 +93,6 @@ class VirtualBoxVM(object):
self._host = host self._host = host
self._command = [] self._command = []
self._vboxwrapper = vboxwrapper self._vboxwrapper = vboxwrapper
self._host = "127.0.0.1"
self._started = False self._started = False
self._console_start_port_range = console_start_port_range self._console_start_port_range = console_start_port_range
self._console_end_port_range = console_end_port_range self._console_end_port_range = console_end_port_range
@ -483,7 +482,7 @@ class VirtualBoxVM(object):
except OSError as e: except OSError as e:
raise VirtualBoxError("Could not open the pipe {}: {}".format(pipe_name, e)) raise VirtualBoxError("Could not open the pipe {}: {}".format(pipe_name, e))
self._serial_pipe_thread = PipeProxy(self._vmname, msvcrt.get_osfhandle(self._serial_pipe.fileno()), self._host, self._console) self._serial_pipe_thread = PipeProxy(self._vmname, msvcrt.get_osfhandle(self._serial_pipe.fileno()), self._host, self._console)
self._serial_pipe_thread.setDaemon(True) #self._serial_pipe_thread.setDaemon(True)
self._serial_pipe_thread.start() self._serial_pipe_thread.start()
else: else:
try: try:
@ -492,7 +491,7 @@ class VirtualBoxVM(object):
except OSError as e: except OSError as e:
raise VirtualBoxError("Could not connect to the pipe {}: {}".format(pipe_name, e)) raise VirtualBoxError("Could not connect to the pipe {}: {}".format(pipe_name, e))
self._serial_pipe_thread = PipeProxy(self._vmname, self._serial_pipe, self._host, self._console) self._serial_pipe_thread = PipeProxy(self._vmname, self._serial_pipe, self._host, self._console)
self._serial_pipe_thread.setDaemon(True) #self._serial_pipe_thread.setDaemon(True)
self._serial_pipe_thread.start() self._serial_pipe_thread.start()
def stop(self): def stop(self):
@ -503,10 +502,31 @@ class VirtualBoxVM(object):
if self._vboxwrapper: if self._vboxwrapper:
self._vboxwrapper.send('vbox stop "{}"'.format(self._name)) self._vboxwrapper.send('vbox stop "{}"'.format(self._name))
else: else:
if self._serial_pipe_thread:
self._serial_pipe_thread.stop()
self._serial_pipe_thread.join(1)
if self._serial_pipe_thread.isAlive():
log.warn("Serial pire thread is still alive!")
self._serial_pipe_thread = None
if self._serial_pipe:
if sys.platform.startswith('win'):
win32file.CloseHandle(msvcrt.get_osfhandle(self._serial_pipe.fileno()))
else:
self._serial_pipe.close()
self._serial_pipe = None
try: try:
if sys.platform.startswith('win') and "VBOX_INSTALL_PATH" in os.environ:
# work around VirtualBox bug #9239
vboxmanage_path = os.path.join(os.environ["VBOX_INSTALL_PATH"], "VBoxManage.exe")
command = '"{}" controlvm "{}" poweroff'.format(vboxmanage_path, self._vmname)
subprocess.call(command, timeout=3)
else:
progress = self._session.console.powerDown() progress = self._session.console.powerDown()
# wait for VM to actually go down # wait for VM to actually go down
progress.waitForCompletion(-1) progress.waitForCompletion(3000)
log.info("VM is stopping with {}% completed".format(self.vmname, progress.percent)) log.info("VM is stopping with {}% completed".format(self.vmname, progress.percent))
self._lock_machine() self._lock_machine()
@ -520,18 +540,6 @@ class VirtualBoxVM(object):
# This can happen, if user manually kills VBox VM. # This can happen, if user manually kills VBox VM.
log.warn("could not stop VM for {}: {}".format(self._vmname, e)) log.warn("could not stop VM for {}: {}".format(self._vmname, e))
return return
finally:
if self._serial_pipe_thread:
self._serial_pipe_thread.stop()
self._serial_pipe_thread.join()
self._serial_pipe_thread = None
if self._serial_pipe:
if sys.platform.startswith('win'):
win32file.CloseHandle(msvcrt.get_osfhandle(self._serial_pipe.fileno()))
else:
self._serial_pipe.close()
self._serial_pipe = None
def suspend(self): def suspend(self):
""" """

View File

@ -93,7 +93,6 @@ class VPCSDevice(object):
self._command = [] self._command = []
self._process = None self._process = None
self._vpcs_stdout_file = "" self._vpcs_stdout_file = ""
self._host = "127.0.0.1"
self._started = False self._started = False
self._console_start_port_range = console_start_port_range self._console_start_port_range = console_start_port_range
self._console_end_port_range = console_end_port_range self._console_end_port_range = console_end_port_range