diff --git a/scripts/hbc_mini.py b/scripts/hbc_mini.py index ff76236..08710e1 100755 --- a/scripts/hbc_mini.py +++ b/scripts/hbc_mini.py @@ -1059,22 +1059,30 @@ async def _async_main(args, cfg: Dict[str, Any]) -> int: log.info("hbc_mini %s on %s -> %s port=%d interval=%ds",__version__, iam, args.hosts, port, interval) + af_filter = (socket.AF_INET if getattr(args, "ipv4_only", False) + else socket.AF_INET6 if getattr(args, "ipv6_only", False) + else 0) + connections: List[AsyncConnection] = [] conn_id = 1 - for host in args.hosts: - try: - addrs = socket.getaddrinfo(host, port, 0, 0, socket.SOL_UDP) - except socket.gaierror as e: - log.error("cannot resolve %s: %s", host, e) - continue - for ai in addrs: - conn = AsyncConnection(conn_id, ai[4][0], port, ai[0], iam) - if await conn.open(): - connections.append(conn) - conn_id += 1 + _retry_delay = 5 + while _running and not connections: + for host in args.hosts: + try: + addrs = socket.getaddrinfo(host, port, af_filter, 0, socket.SOL_UDP) + except socket.gaierror as e: + log.warning("cannot resolve %s: %s — retrying in %ds", host, e, _retry_delay) + continue + for ai in addrs: + conn = AsyncConnection(conn_id, ai[4][0], port, ai[0], iam) + if await conn.open(): + connections.append(conn) + conn_id += 1 + if not connections: + await _sleep(_retry_delay) + _retry_delay = min(_retry_delay * 2, 60) if not connections: - log.error("no connections established") return 1 # Boot / one-shot message @@ -1153,6 +1161,9 @@ def main(argv=None): parser.add_argument("-d", "--daemon", action="store_true", help="Run as daemon") parser.add_argument("-v", "--verbose", action="store_true", help="Verbose output") parser.add_argument("-x", "--debug", action="count", default=0, help="Debug level") + af_group = parser.add_mutually_exclusive_group() + af_group.add_argument("-4", dest="ipv4_only", action="store_true", help="Use IPv4 only") + af_group.add_argument("-6", dest="ipv6_only", action="store_true", help="Use IPv6 only") parser.add_argument("hosts", nargs="+", help="HBD server(s)") args = parser.parse_args(argv)