Fix check for IPv6 enabled on host

This commit is contained in:
grossmj 2024-06-17 16:41:40 +02:00
parent 0f3b96f134
commit 39057bd781
No known key found for this signature in database
GPG Key ID: 0A2D76AC45EA25CD
2 changed files with 29 additions and 8 deletions

View File

@ -47,7 +47,7 @@ from ..base_node import BaseNode
from ...schemas.qemu import QEMU_OBJECT_SCHEMA, QEMU_PLATFORMS from ...schemas.qemu import QEMU_OBJECT_SCHEMA, QEMU_PLATFORMS
from ...utils.asyncio import monitor_process from ...utils.asyncio import monitor_process
from ...utils.images import md5sum from ...utils.images import md5sum
from ...utils import macaddress_to_int, int_to_macaddress from ...utils import macaddress_to_int, int_to_macaddress, is_ipv6_enabled
import logging import logging
@ -1672,13 +1672,14 @@ class QemuVM(BaseNode):
if self._console: if self._console:
console_host = self._manager.port_manager.console_host console_host = self._manager.port_manager.console_host
if console_host == "0.0.0.0": if console_host == "0.0.0.0":
if socket.has_ipv6: try:
if is_ipv6_enabled():
# to fix an issue with Qemu when IPv4 is not enabled # to fix an issue with Qemu when IPv4 is not enabled
# see https://github.com/GNS3/gns3-gui/issues/2352 # see https://github.com/GNS3/gns3-gui/issues/2352
# FIXME: consider making this more global (not just for Qemu + SPICE) # FIXME: consider making this more global (not just for Qemu + SPICE)
console_host = "::" console_host = "::"
else: except OSError as e:
raise QemuError("IPv6 must be enabled in order to use the SPICE console") raise QemuError("Could not check if IPv6 is enabled: {}".format(e))
return ["-spice", return ["-spice",
"addr={},port={},disable-ticketing".format(console_host, self._console), "addr={},port={},disable-ticketing".format(console_host, self._console),
"-vga", "qxl"] "-vga", "qxl"]

View File

@ -21,6 +21,8 @@ import re
import shlex import shlex
import textwrap import textwrap
import posixpath import posixpath
import socket
import errno
def force_unix_path(path): def force_unix_path(path):
@ -100,3 +102,21 @@ def shlex_quote(s):
return s if re.match(r'^[-_\w./]+$', s) else '"%s"' % s.replace('"', '\\"') return s if re.match(r'^[-_\w./]+$', s) else '"%s"' % s.replace('"', '\\"')
else: else:
return shlex.quote(s) return shlex.quote(s)
def is_ipv6_enabled() -> bool:
if not socket.has_ipv6:
return False # the socket library has no support for IPv6
try:
with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as sock:
sock.bind(("::1", 0))
return True
except OSError as e:
if e.errno in (errno.EADDRNOTAVAIL, errno.EAFNOSUPPORT):
# EADDRNOTAVAIL is the errno if IPv6 modules/drivers are loaded but disabled.
# EAFNOSUPPORT is the errno if IPv6 modules/drivers are not loaded at all.
return False
if e.errno == errno.EADDRINUSE:
return True
raise