xref: /aosp_15_r20/external/autotest/server/cros/dnsname_mangler.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright 2014 The Chromium OS Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Liimport logging
6*9c5db199SXin Liimport socket
7*9c5db199SXin Li
8*9c5db199SXin Lifrom autotest_lib.client.common_lib import error
9*9c5db199SXin Li
10*9c5db199SXin Li# See server/cros/network/wifi_test_context_manager.py for commandline
11*9c5db199SXin Li# flags to control IP addresses in WiFi tests.
12*9c5db199SXin LiDEFAULT_FAILURE_MESSAGE = (
13*9c5db199SXin Li        'Cannot infer DNS name of companion device from an IP address.')
14*9c5db199SXin LiATTENUATOR_FAILURE_MESSAGE = (
15*9c5db199SXin Li        'Cannot infer DNS name of WiFi variable attenuator from a client IP '
16*9c5db199SXin Li        'address.  Use --atten_addr=<ip or dns name>')
17*9c5db199SXin LiBTATTENUATOR_FAILURE_MESSAGE = (
18*9c5db199SXin Li        'Cannot infer DNS name of Bluetooth variable attenuator from a client IP '
19*9c5db199SXin Li        'address.  Use --btatten_addr=<ip or dns name>')
20*9c5db199SXin LiROUTER_FAILURE_MESSAGE = (
21*9c5db199SXin Li        'Cannot infer DNS name of WiFi router from a client IP address.')
22*9c5db199SXin LiPCAP_FAILURE_MESSAGE = (
23*9c5db199SXin Li        'Cannot infer DNS name of Packet Capturer from a client IP address.')
24*9c5db199SXin Li
25*9c5db199SXin Li
26*9c5db199SXin Lidef is_ip_address(hostname):
27*9c5db199SXin Li    """Infers whether |hostname| could be an IP address.
28*9c5db199SXin Li
29*9c5db199SXin Li    @param hostname: string DNS name or IP address.
30*9c5db199SXin Li    @return True iff hostname is a valid IP address.
31*9c5db199SXin Li
32*9c5db199SXin Li    """
33*9c5db199SXin Li    try:
34*9c5db199SXin Li        socket.inet_aton(hostname)
35*9c5db199SXin Li        return True
36*9c5db199SXin Li    except socket.error:
37*9c5db199SXin Li        return False
38*9c5db199SXin Li
39*9c5db199SXin Li
40*9c5db199SXin Lidef get_companion_device_addr(client_hostname,
41*9c5db199SXin Li                              suffix,
42*9c5db199SXin Li                              cmdline_override=None,
43*9c5db199SXin Li                              not_dnsname_msg=DEFAULT_FAILURE_MESSAGE,
44*9c5db199SXin Li                              allow_failure=False):
45*9c5db199SXin Li    """Build a usable hostname for a test companion device from the client name.
46*9c5db199SXin Li
47*9c5db199SXin Li    Optionally, override the generated name with a commandline provided version.
48*9c5db199SXin Li
49*9c5db199SXin Li    @param client_hostname: string DNS name of device under test (the client).
50*9c5db199SXin Li    @param suffix: string suffix to append to the client hostname.
51*9c5db199SXin Li    @param cmdline_override: optional DNS name of companion device.  If this is
52*9c5db199SXin Li            given, it overrides the generated client based hostname.
53*9c5db199SXin Li    @param not_dnsname_msg: string message to include in the exception raised
54*9c5db199SXin Li            if the client hostname is found to be an IP address rather than a
55*9c5db199SXin Li            DNS name.
56*9c5db199SXin Li    @param allow_failure: boolean True iff we should return None on failure to
57*9c5db199SXin Li            infer a DNS name.
58*9c5db199SXin Li    @return string DNS name of companion device or None if |allow_failure|
59*9c5db199SXin Li            is True and no DNS name can be inferred.
60*9c5db199SXin Li
61*9c5db199SXin Li    """
62*9c5db199SXin Li    if cmdline_override is not None:
63*9c5db199SXin Li        return cmdline_override
64*9c5db199SXin Li    if is_ip_address(client_hostname):
65*9c5db199SXin Li        logging.error('%r looks like an IP address?', client_hostname)
66*9c5db199SXin Li        if allow_failure:
67*9c5db199SXin Li            return None
68*9c5db199SXin Li        raise error.TestError(not_dnsname_msg)
69*9c5db199SXin Li    parts = client_hostname.split('.', 1)
70*9c5db199SXin Li    parts[0] = parts[0] + suffix
71*9c5db199SXin Li    return '.'.join(parts)
72*9c5db199SXin Li
73*9c5db199SXin Li
74*9c5db199SXin Lidef get_router_addr(client_hostname, cmdline_override=None):
75*9c5db199SXin Li    """Build a hostname for a WiFi router from the client hostname.
76*9c5db199SXin Li
77*9c5db199SXin Li    Optionally override that hostname with the provided command line hostname.
78*9c5db199SXin Li
79*9c5db199SXin Li    @param client_hostname: string DNS name of the client.
80*9c5db199SXin Li    @param cmdline_override: string DNS name of the router provided
81*9c5db199SXin Li            via commandline arguments.
82*9c5db199SXin Li    @return usable DNS name for router host.
83*9c5db199SXin Li
84*9c5db199SXin Li    """
85*9c5db199SXin Li    return get_companion_device_addr(
86*9c5db199SXin Li            client_hostname,
87*9c5db199SXin Li            '-router',
88*9c5db199SXin Li            cmdline_override=cmdline_override,
89*9c5db199SXin Li            not_dnsname_msg=ROUTER_FAILURE_MESSAGE)
90*9c5db199SXin Li
91*9c5db199SXin Li
92*9c5db199SXin Lidef get_pcap_addr(client_hostname,
93*9c5db199SXin Li                  cmdline_override=None,
94*9c5db199SXin Li                  allow_failure=False):
95*9c5db199SXin Li    """Build a hostname for a packet capturer from the client hostname.
96*9c5db199SXin Li
97*9c5db199SXin Li    @param client_hostname: string DNS name of the client.
98*9c5db199SXin Li    @param cmdline_override: string DNS name of the packet capturer provided
99*9c5db199SXin Li            via commandline arguments.
100*9c5db199SXin Li    @return usable DNS name for capturer host or None.
101*9c5db199SXin Li
102*9c5db199SXin Li    """
103*9c5db199SXin Li    return get_companion_device_addr(
104*9c5db199SXin Li            client_hostname,
105*9c5db199SXin Li            '-pcap',
106*9c5db199SXin Li            cmdline_override=cmdline_override,
107*9c5db199SXin Li            not_dnsname_msg=PCAP_FAILURE_MESSAGE,
108*9c5db199SXin Li            allow_failure=allow_failure)
109*9c5db199SXin Li
110*9c5db199SXin Li
111*9c5db199SXin Lidef get_attenuator_addr(client_hostname,
112*9c5db199SXin Li                        cmdline_override=None,
113*9c5db199SXin Li                        allow_failure=False):
114*9c5db199SXin Li    """Build a hostname for a WiFi variable attenuator from the client hostname.
115*9c5db199SXin Li
116*9c5db199SXin Li    Optionally override that hostname with the provided command line hostname.
117*9c5db199SXin Li
118*9c5db199SXin Li    @param client_hostname: string DNS name of the client.
119*9c5db199SXin Li    @param cmdline_override: string DNS name of the variable attenuator
120*9c5db199SXin Li            controller provided via commandline arguments.
121*9c5db199SXin Li    @param allow_failure: boolean True iff we should return None on failure to
122*9c5db199SXin Li            infer a DNS name.
123*9c5db199SXin Li    @return usable DNS name for attenuator controller.
124*9c5db199SXin Li
125*9c5db199SXin Li    """
126*9c5db199SXin Li    return get_companion_device_addr(
127*9c5db199SXin Li            client_hostname,
128*9c5db199SXin Li            '-attenuator',
129*9c5db199SXin Li            cmdline_override=cmdline_override,
130*9c5db199SXin Li            not_dnsname_msg=ATTENUATOR_FAILURE_MESSAGE,
131*9c5db199SXin Li            allow_failure=allow_failure)
132*9c5db199SXin Li
133*9c5db199SXin Li
134*9c5db199SXin Lidef get_btattenuator_addr(client_hostname,
135*9c5db199SXin Li                          cmdline_override=None,
136*9c5db199SXin Li                          allow_failure=False):
137*9c5db199SXin Li    """Build a hostname for a Bluetooth variable attenuator from the client hostname.
138*9c5db199SXin Li
139*9c5db199SXin Li    Optionally override that hostname with the provided command line hostname.
140*9c5db199SXin Li
141*9c5db199SXin Li    @param client_hostname: string DNS name of the client.
142*9c5db199SXin Li    @param cmdline_override: string DNS name of the variable attenuator
143*9c5db199SXin Li            controller provided via commandline arguments.
144*9c5db199SXin Li    @param allow_failure: boolean True iff we should return None on failure to
145*9c5db199SXin Li            infer a DNS name.
146*9c5db199SXin Li    @return usable DNS name for attenuator controller.
147*9c5db199SXin Li
148*9c5db199SXin Li    """
149*9c5db199SXin Li    return get_companion_device_addr(
150*9c5db199SXin Li            client_hostname,
151*9c5db199SXin Li            '-btattenuator',
152*9c5db199SXin Li            cmdline_override=cmdline_override,
153*9c5db199SXin Li            not_dnsname_msg=BTATTENUATOR_FAILURE_MESSAGE,
154*9c5db199SXin Li            allow_failure=allow_failure)
155