HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: //snap/core22/current/usr/lib/python3/dist-packages/cloudinit/sources/helpers/hetzner.py
# Author: Jonas Keidel <[email protected]>
# Author: Markus Schade <[email protected]>
#
# This file is part of cloud-init. See LICENSE file for license information.

from typing import Optional, Tuple

from cloudinit import net, url_helper


def _skip_retry_on_empty_response(cause: url_helper.UrlError) -> bool:
    return cause.code != 204


def get_metadata(
    urls,
    max_wait=120,
    timeout=2,
    sleep_time=2,
) -> Tuple[Optional[str], bytes]:
    try:
        url, contents = url_helper.wait_for_url(
            urls=urls,
            max_wait=max_wait,
            timeout=timeout,
            sleep_time=sleep_time,
            # It is ok for userdata to not exist (that's why we are stopping if
            # HTTP code is 204) and just in that case returning an empty
            # string.
            exception_cb=_skip_retry_on_empty_response,
        )
        if not url:
            raise RuntimeError("No data received from urls: '%s':" % urls)
        return url, contents
    except url_helper.UrlError as e:
        if e.code == 204:
            return e.url, b""
        raise


def get_interface_name_from_mac(mac: str) -> Optional[str]:
    mac_to_iface = net.get_interfaces_by_mac()
    return mac_to_iface.get(mac.lower())