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)
 |