feat: retry DNS resolution indefinitely and add -4/-6 flags in hbc_mini

On startup, retry host resolution with exponential backoff (5s→60s) instead
of exiting when DNS fails. Add mutually exclusive -4 / -6 CLI flags to
restrict connections to IPv4 or IPv6 only.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Andreas Wrede
2026-05-12 08:07:54 -04:00
parent e50a3996ae
commit b907343e36
+14 -3
View File
@@ -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) 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] = [] connections: List[AsyncConnection] = []
conn_id = 1 conn_id = 1
_retry_delay = 5
while _running and not connections:
for host in args.hosts: for host in args.hosts:
try: try:
addrs = socket.getaddrinfo(host, port, 0, 0, socket.SOL_UDP) addrs = socket.getaddrinfo(host, port, af_filter, 0, socket.SOL_UDP)
except socket.gaierror as e: except socket.gaierror as e:
log.error("cannot resolve %s: %s", host, e) log.warning("cannot resolve %s: %s — retrying in %ds", host, e, _retry_delay)
continue continue
for ai in addrs: for ai in addrs:
conn = AsyncConnection(conn_id, ai[4][0], port, ai[0], iam) conn = AsyncConnection(conn_id, ai[4][0], port, ai[0], iam)
if await conn.open(): if await conn.open():
connections.append(conn) connections.append(conn)
conn_id += 1 conn_id += 1
if not connections:
await _sleep(_retry_delay)
_retry_delay = min(_retry_delay * 2, 60)
if not connections: if not connections:
log.error("no connections established")
return 1 return 1
# Boot / one-shot message # 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("-d", "--daemon", action="store_true", help="Run as daemon")
parser.add_argument("-v", "--verbose", action="store_true", help="Verbose output") parser.add_argument("-v", "--verbose", action="store_true", help="Verbose output")
parser.add_argument("-x", "--debug", action="count", default=0, help="Debug level") 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)") parser.add_argument("hosts", nargs="+", help="HBD server(s)")
args = parser.parse_args(argv) args = parser.parse_args(argv)