Fixes Windows named pipe issue. Fixes #340.

This commit is contained in:
grossmj 2015-11-01 18:51:12 -07:00
parent 6edb41ded7
commit 32f9baf682
3 changed files with 26 additions and 4 deletions

View File

@ -30,7 +30,7 @@ import asyncio
from pkg_resources import parse_version
from gns3server.utils.telnet_server import TelnetServer
from gns3server.utils.asyncio import wait_for_file_creation
from gns3server.utils.asyncio import wait_for_file_creation, wait_for_named_pipe_creation
from .virtualbox_error import VirtualBoxError
from ..nios.nio_udp import NIOUDP
from ..nios.nio_nat import NIONAT
@ -219,7 +219,11 @@ class VirtualBoxVM(BaseVM):
if self._enable_remote_console and self._console is not None:
try:
yield from wait_for_file_creation(self._get_pipe_name()) # wait for VirtualBox to create the pipe file.
# wait for VirtualBox to create the pipe file.
if sys.platform.startswith("win"):
yield from wait_for_named_pipe_creation(self._get_pipe_name())
else:
yield from wait_for_file_creation(self._get_pipe_name())
except asyncio.TimeoutError:
raise VirtualBoxError('Pipe file "{}" for remote console has not been created by VirtualBox'.format(self._get_pipe_name()))
self._start_remote_console()

View File

@ -27,7 +27,7 @@ import tempfile
from gns3server.utils.telnet_server import TelnetServer
from gns3server.utils.interfaces import get_windows_interfaces
from gns3server.utils.asyncio import wait_for_file_creation
from gns3server.utils.asyncio import wait_for_file_creation, wait_for_named_pipe_creation
from collections import OrderedDict
from .vmware_error import VMwareError
from ..nios.nio_udp import NIOUDP
@ -440,7 +440,10 @@ class VMwareVM(BaseVM):
if self._enable_remote_console and self._console is not None:
try:
yield from wait_for_file_creation(self._get_pipe_name()) # wait for VMware to create the pipe file.
if sys.platform.startswith("win"):
yield from wait_for_named_pipe_creation(self._get_pipe_name())
else:
yield from wait_for_file_creation(self._get_pipe_name()) # wait for VMware to create the pipe file.
except asyncio.TimeoutError:
raise VMwareError('Pipe file "{}" for remote console has not been created by VMware'.format(self._get_pipe_name()))
self._start_remote_console()

View File

@ -108,3 +108,18 @@ def wait_for_file_creation(path, timeout=10):
yield from asyncio.sleep(0.5)
timeout -= 0.5
raise asyncio.TimeoutError()
@asyncio.coroutine
def wait_for_named_pipe_creation(pipe_path, timeout=10):
while timeout > 0:
try:
with open(pipe_path, "a+b"):
pass
except OSError:
yield from asyncio.sleep(0.5)
timeout -= 0.5
else:
return
raise asyncio.TimeoutError()