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