225 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/python2
 | 
						|
 | 
						|
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
 | 
						|
# Use of this source code is governed by a BSD-style license that can be
 | 
						|
# found in the LICENSE file.
 | 
						|
 | 
						|
import sys
 | 
						|
 | 
						|
import common
 | 
						|
from autotest_lib.client.cros.networking import wifi_proxy
 | 
						|
 | 
						|
SERVICE_PROP_PARSERS = {
 | 
						|
    'EAP.AnonymousIdentity': unicode,
 | 
						|
    'EAP.CACertID': unicode,
 | 
						|
    'EAP.CACertNSS': unicode,
 | 
						|
    'EAP.CACertPEM': unicode,
 | 
						|
    'EAP.CertID': unicode,
 | 
						|
    'EAP.ClientCert': unicode,
 | 
						|
    'EAP.EAP': unicode,
 | 
						|
    'EAP.Identity': unicode,
 | 
						|
    'EAP.InnerEAP': unicode,
 | 
						|
    'EAP.KeyID': unicode,
 | 
						|
    'EAP.KeyMgmt': unicode,
 | 
						|
    'EAP.Password': unicode,
 | 
						|
    'EAP.PIN': unicode,
 | 
						|
    'EAP.SubjectMatch': unicode,
 | 
						|
    'EAP.UseSystemCAs': bool,
 | 
						|
    wifi_proxy.WifiProxy.SERVICE_PROPERTY_SECURITY_CLASS: unicode,
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
def usage():
 | 
						|
    """ Prints a usage message and returns False. """
 | 
						|
    cmd = sys.argv[0]
 | 
						|
    print 'Usage:'
 | 
						|
    print cmd, 'connect <ssid> [passphrase] [security]'
 | 
						|
    print '    |security| defaults to "psk" when |passphrase|',
 | 
						|
    print 'is given without |security|'
 | 
						|
    print
 | 
						|
    print cmd, 'disconnect <ssid> [timeout seconds]'
 | 
						|
    print
 | 
						|
    print cmd, 'connect_with_props <ssid> <timeout seconds>'
 | 
						|
    print '    <Security=[none|psk|802_1x]> [Property=Value ...]'
 | 
						|
    print '    for Property in:'
 | 
						|
    print '\n'.join(['\t\t' + x for x in sorted(SERVICE_PROP_PARSERS.keys())])
 | 
						|
    print
 | 
						|
    print cmd, 'configure <ssid> [passphrase] [security]'
 | 
						|
    print '    |security| defaults to "psk" when |passphrase|',
 | 
						|
    print 'is given without |security|'
 | 
						|
    return False
 | 
						|
 | 
						|
 | 
						|
def configure(ssid, security, passphrase):
 | 
						|
    wifi = wifi_proxy.WifiProxy.get_proxy()
 | 
						|
    security_parameters = {}
 | 
						|
    if passphrase is not None:
 | 
						|
        security_parameters[wifi.SERVICE_PROPERTY_PASSPHRASE] = passphrase
 | 
						|
    successful = wifi.configure_wifi_service(ssid, security,
 | 
						|
                                             security_parameters)
 | 
						|
    if successful:
 | 
						|
        print 'Operation succeeded.'
 | 
						|
    else:
 | 
						|
        print 'Operation failed.'
 | 
						|
    return successful
 | 
						|
 | 
						|
 | 
						|
def connect(ssid, security, credentials, save_credentials, timeout=15):
 | 
						|
    """Attempt to connect to a WiFi network.
 | 
						|
 | 
						|
    Blocks until we connect successfully to a WiFi network described
 | 
						|
    by the given parameters or time out while attempting to do so.
 | 
						|
 | 
						|
    @param ssid string Name of the network to connect to.
 | 
						|
    @param security string security type of the network to connect to.
 | 
						|
    @param credentials dict of service properties that includes credentials
 | 
						|
            like the passphrase for psk security.
 | 
						|
    @param save_credentials bool True if credentials should be saved.
 | 
						|
    @return True upon success, False otherwise.
 | 
						|
 | 
						|
    """
 | 
						|
    wifi = wifi_proxy.WifiProxy.get_proxy()
 | 
						|
    result = wifi.connect_to_wifi_network(ssid,
 | 
						|
            security,
 | 
						|
            credentials,
 | 
						|
            save_credentials,
 | 
						|
            discovery_timeout_seconds=timeout,
 | 
						|
            association_timeout_seconds=timeout,
 | 
						|
            configuration_timeout_seconds=timeout)
 | 
						|
    (successful, discovery, association, configuration, reason) = result
 | 
						|
    if successful:
 | 
						|
        print 'Operation succeeded.'
 | 
						|
    else:
 | 
						|
        print 'Operation failed. (%s)' % reason
 | 
						|
    print 'Discovery time: %f.' % discovery
 | 
						|
    print 'Association time: %f.' % association
 | 
						|
    print 'Configuration time: %f.' % configuration
 | 
						|
    return successful
 | 
						|
 | 
						|
 | 
						|
def disconnect(ssid, timeout=None):
 | 
						|
    """Disconnect from the specified network.
 | 
						|
 | 
						|
    Disconnect from a network with name |ssid|.  Note that this
 | 
						|
    method will not fail if we're already disconnected.
 | 
						|
 | 
						|
    @param ssid string Name of the network to disconnect from.
 | 
						|
    @param timeout float number of seconds to wait for transition
 | 
						|
            to idle state.
 | 
						|
    @return True upon seeing network is in idle state.
 | 
						|
 | 
						|
    """
 | 
						|
    wifi = wifi_proxy.WifiProxy.get_proxy()
 | 
						|
    result = wifi.disconnect_from_wifi_network(ssid, timeout)
 | 
						|
    (successful, duration, reason) = result
 | 
						|
    if successful:
 | 
						|
        print 'Operation succeeded.'
 | 
						|
    else:
 | 
						|
        print 'Operation failed: %s.' % reason
 | 
						|
    print 'Disconnect time: %f.' % duration
 | 
						|
    return successful
 | 
						|
 | 
						|
 | 
						|
def parse_security_from_credentials(credentials):
 | 
						|
    """Parses SERVICE_PROPERTY_SECURITY from credentials.
 | 
						|
 | 
						|
    @param credentials dict of service properties that includes credentials
 | 
						|
            like the passphrase for psk security.
 | 
						|
    @return SERVICE_PROPERTY_SECURITY value from credentials,
 | 
						|
            or exit if no such key/value in credentials.
 | 
						|
 | 
						|
    """
 | 
						|
    security = credentials.pop(
 | 
						|
            wifi_proxy.WifiProxy.SERVICE_PROPERTY_SECURITY, None)
 | 
						|
    if security is None:
 | 
						|
        print "Error: security type not provided"
 | 
						|
        usage()
 | 
						|
        sys.exit(1)
 | 
						|
 | 
						|
    if security not in ['none', 'wep', 'psk', '802_1x']:
 | 
						|
        print "Error: invalid security type %s" % security
 | 
						|
        usage()
 | 
						|
        sys.exit(1)
 | 
						|
 | 
						|
    return security
 | 
						|
 | 
						|
 | 
						|
def parse_service_property(property_string):
 | 
						|
    """Parses one commandline key=value string into a tuple.
 | 
						|
 | 
						|
    @param property_string string to be parsed into (key,value).
 | 
						|
    @return parsed tuple of (key,value) or exit on parsing error.
 | 
						|
 | 
						|
    """
 | 
						|
    property_name, raw_value = property_string.split('=', 1)
 | 
						|
 | 
						|
    if not property_name in SERVICE_PROP_PARSERS:
 | 
						|
        print '%s is not a recognized service property' % property_name
 | 
						|
        usage()
 | 
						|
        sys.exit(1)
 | 
						|
 | 
						|
    try:
 | 
						|
        return property_name, SERVICE_PROP_PARSERS[property_name](raw_value)
 | 
						|
    except:
 | 
						|
        print 'Failed parsing value from %s' % property_string
 | 
						|
        usage()
 | 
						|
        sys.exit(1)
 | 
						|
 | 
						|
 | 
						|
def main(args):
 | 
						|
    """Main method for this script.
 | 
						|
 | 
						|
    @param args list of arguments to the script, not including script name.
 | 
						|
    @return True on success, False otherwise.
 | 
						|
 | 
						|
    """
 | 
						|
    if len(args) < 2:
 | 
						|
        return usage()
 | 
						|
    command = args[0]
 | 
						|
    ssid = args[1]
 | 
						|
    save_credentials = True
 | 
						|
 | 
						|
    if command == 'configure':
 | 
						|
        security = 'none'
 | 
						|
        passphrase = None
 | 
						|
        if len(args) > 2:
 | 
						|
            security = 'psk'
 | 
						|
            passphrase = args[2]
 | 
						|
        if len(args) > 3:
 | 
						|
            security = args[3]
 | 
						|
        return configure(ssid, security, passphrase)
 | 
						|
 | 
						|
    if command == 'connect':
 | 
						|
        security = 'none'
 | 
						|
        credentials = {}
 | 
						|
        save_credentials = True
 | 
						|
        if len(args) > 2:
 | 
						|
            credentials[wifi_proxy.WifiProxy.SERVICE_PROPERTY_PASSPHRASE] = \
 | 
						|
                    args[2]
 | 
						|
            security = 'psk'
 | 
						|
        if len(args) > 3:
 | 
						|
            security = args[3]
 | 
						|
        return connect(ssid, security, credentials, save_credentials)
 | 
						|
 | 
						|
    if command == 'connect_with_props':
 | 
						|
        timeout = float(args[2])
 | 
						|
        credentials = {}
 | 
						|
        if len(args) > 3:
 | 
						|
            for i in xrange(3, len(args)):
 | 
						|
                credentials.update((parse_service_property(args[i]),))
 | 
						|
        security = parse_security_from_credentials(credentials)
 | 
						|
        return connect(ssid, security, credentials, save_credentials, timeout)
 | 
						|
 | 
						|
    if command == 'disconnect':
 | 
						|
        timeout=None
 | 
						|
        if len(args) > 2:
 | 
						|
            timeout = float(args[2])
 | 
						|
        return disconnect(ssid, timeout)
 | 
						|
 | 
						|
    return usage()
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    if not main(sys.argv[1:]):
 | 
						|
      sys.exit(1)
 |