check if ipv6 enabled before listen

This commit is contained in:
Maxim Devaev 2024-02-01 17:26:08 +02:00
parent 74d2d74667
commit 7141eebbf8
4 changed files with 55 additions and 3 deletions

View File

@ -656,7 +656,7 @@ def _get_config_scheme() -> dict:
"ipmi": { "ipmi": {
"server": { "server": {
"host": Option("::", type=valid_ip_or_host), "host": Option("", type=valid_ip_or_host, if_empty=""),
"port": Option(623, type=valid_port), "port": Option(623, type=valid_port),
"timeout": Option(10.0, type=valid_float_f01), "timeout": Option(10.0, type=valid_float_f01),
}, },
@ -684,7 +684,7 @@ def _get_config_scheme() -> dict:
"keymap": Option("/usr/share/kvmd/keymaps/en-us", type=valid_abs_file), "keymap": Option("/usr/share/kvmd/keymaps/en-us", type=valid_abs_file),
"server": { "server": {
"host": Option("::", type=valid_ip_or_host), "host": Option("", type=valid_ip_or_host, if_empty=""),
"port": Option(5900, type=valid_port), "port": Option(5900, type=valid_port),
"max_clients": Option(10, type=valid_int_f1), "max_clients": Option(10, type=valid_int_f1),

View File

@ -41,6 +41,7 @@ from ...logging import get_logger
from ...clients.kvmd import KvmdClient from ...clients.kvmd import KvmdClient
from ... import aiotools from ... import aiotools
from ... import network
from .auth import IpmiAuthManager from .auth import IpmiAuthManager
@ -65,6 +66,8 @@ class IpmiServer(BaseIpmiServer): # pylint: disable=too-many-instance-attribute
sol_proxy_port: int, sol_proxy_port: int,
) -> None: ) -> None:
host = network.get_listen_host(host)
super().__init__(authdata=auth_manager, address=host, port=port) super().__init__(authdata=auth_manager, address=host, port=port)
self.__auth_manager = auth_manager self.__auth_manager = auth_manager

View File

@ -47,6 +47,7 @@ from ...clients.streamer import BaseStreamerClient
from ... import tools from ... import tools
from ... import aiotools from ... import aiotools
from ... import network
from .rfb import RfbClient from .rfb import RfbClient
from .rfb.stream import rfb_format_remote from .rfb.stream import rfb_format_remote
@ -444,7 +445,7 @@ class VncServer: # pylint: disable=too-many-instance-attributes
vnc_auth_manager: VncAuthManager, vnc_auth_manager: VncAuthManager,
) -> None: ) -> None:
self.__host = host self.__host = network.get_listen_host(host)
self.__port = port self.__port = port
self.__max_clients = max_clients self.__max_clients = max_clients

48
kvmd/network.py Normal file
View File

@ -0,0 +1,48 @@
# ========================================================================== #
# #
# KVMD - The main PiKVM daemon. #
# #
# Copyright (C) 2018-2023 Maxim Devaev <mdevaev@gmail.com> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
# #
# ========================================================================== #
import socket
import errno
# =====
def is_ipv6_enabled() -> bool:
if not socket.has_ipv6:
# If the socket library has no support for IPv6,
# then the question is moot as we can't use IPv6 anyways.
return False
try:
with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as sock:
sock.bind(("::1", 0))
return True
except OSError as err:
if err.errno in [errno.EADDRNOTAVAIL, errno.EAFNOSUPPORT]:
return False
if err.errno == errno.EADDRINUSE:
return True
raise
def get_listen_host(host: str) -> str:
if len(host) == 0:
return ("::" if is_ipv6_enabled() else "0.0.0.0")
return host