Home | History | Annotate | Download | only in ap_configurators
      1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging
      6 import time
      7 import urlparse
      8 
      9 import dynamic_ap_configurator
     10 import ap_spec
     11 from selenium.common.exceptions import TimeoutException as \
     12 SeleniumTimeoutException
     13 
     14 
     15 class TrendnetAPConfigurator(
     16         dynamic_ap_configurator.DynamicAPConfigurator):
     17     """Derived class to control the Trendnet TEW-639GR."""
     18 
     19 
     20     def _alert_handler(self, alert):
     21         """Checks for any modal dialogs which popup to alert the user and
     22         either raises a RuntimeError or ignores the alert.
     23 
     24         Args:
     25           alert: The modal dialog's contents.
     26         """
     27         text = alert.text
     28         if 'Please input 10 or 26 characters of WEP key1' in text:
     29             alert.accept()
     30             raise RuntimeError(text)
     31 
     32 
     33     def get_number_of_pages(self):
     34         return 2
     35 
     36 
     37     def get_supported_bands(self):
     38         return [{'band': ap_spec.BAND_2GHZ, 'channels': range(1, 12)}]
     39 
     40 
     41     def get_supported_modes(self):
     42         return [{'band': ap_spec.BAND_2GHZ,
     43                  'modes': [ap_spec.MODE_N,
     44                            ap_spec.MODE_B | ap_spec.MODE_G,
     45                            ap_spec.MODE_B | ap_spec.MODE_G | ap_spec.MODE_N]}]
     46 
     47 
     48     def is_security_mode_supported(self, security_mode):
     49         return security_mode in (ap_spec.SECURITY_TYPE_DISABLED,
     50                                  ap_spec.SECURITY_TYPE_WEP,
     51                                  ap_spec.SECURITY_TYPE_WPAPSK,
     52                                  ap_spec.SECURITY_TYPE_WPA2PSK)
     53 
     54 
     55     def navigate_to_page(self, page_number):
     56         # All settings are on the same page, so we always open the config page
     57         if page_number == 1:
     58             page_url = urlparse.urljoin(self.admin_interface_url,
     59                                         'wireless/basic.asp')
     60             self.get_url(page_url, page_title='TEW')
     61             ids_list = ['display_SSID1', 'sz11gChannel']
     62         elif page_number == 2:
     63             page_url = urlparse.urljoin(self.admin_interface_url,
     64                                         'wireless/security.asp')
     65             self.get_url(page_url, page_title='TEW')
     66             ids_list = ['ssidIndex', 'security_mode']
     67         else:
     68             raise RuntimeError('Invalid page number passed.  Number of pages '
     69                                '%d, page value sent was %d' %
     70                                (self.get_number_of_pages(), page_number))
     71         try:
     72             self.wait_for_objects_by_id(ids_list, wait_time=30)
     73         except SeleniumTimeoutException, e:
     74             logging.info('Page did not load completely. Refresh driver')
     75             self.driver.refresh()
     76             self.wait_for_objects_by_id(ids_list, wait_time=30)
     77 
     78 
     79     def wait_for_progress_bar(self):
     80         """Watch the progress bar and wait for up to two minutes."""
     81         for i in xrange(240):
     82             if not self.object_by_id_exist('progressValue'):
     83                 return
     84             try:
     85                 progress_value = self.wait_for_object_by_id('progressValue')
     86                 html = self.driver.execute_script(
     87                         'return arguments[0].innerHTML', progress_value)
     88             except Exception as e:
     89                 # The progress bar is gone and the page reloaded.  This can
     90                 # happen if we fly from < 95% to done.
     91                 return
     92             percentage = html.rstrip('%')
     93             if int(percentage) < 95:
     94                 time.sleep(0.5)
     95             else:
     96                 break
     97 
     98 
     99     def save_page(self, page_number):
    100         if page_number == 1:
    101             xpath = ('//input[@type="submit" and @value="Apply"]')
    102         elif page_number == 2:
    103             xpath = ('//input[@class="button_submit" and @value="Apply"]')
    104         self.click_button_by_xpath(xpath, alert_handler=self._alert_handler)
    105         # Wait for the settings progress bar to save the setting.
    106         self.wait_for_progress_bar()
    107 
    108 
    109     def set_mode(self, mode, band=None):
    110         self.add_item_to_command_list(self._set_mode, (mode,), 1, 100)
    111 
    112 
    113     def _set_mode(self, mode, band=None):
    114         # Different bands are not supported so we ignore.
    115         # Create the mode to popup item mapping
    116         mode_mapping = {ap_spec.MODE_B | ap_spec.MODE_G | ap_spec.MODE_N:
    117                         '2.4GHz 802.11 b/g/n mixed mode',
    118                         ap_spec.MODE_N: '2.4GHz 802.11 n only',
    119                         ap_spec.MODE_B | ap_spec.MODE_G:
    120                         '2.4GHz 802.11 b/g mixed mode'}
    121         mode_name = ''
    122         if mode in mode_mapping.keys():
    123             mode_name = mode_mapping[mode]
    124         else:
    125             raise RuntimeError('The mode selected %d is not supported by router'
    126                                ' %s.', hex(mode), self.name)
    127         self.select_item_from_popup_by_id(mode_name, 'wirelessmode',
    128                                           wait_for_xpath='id("wds_mode")')
    129 
    130 
    131     def set_radio(self, enabled=True):
    132         logging.debug('Enabling/Disabling the radio is not supported on this '
    133                       'router (%s).', self.name)
    134         return None
    135 
    136 
    137     def set_ssid(self, ssid):
    138         self.add_item_to_command_list(self._set_ssid, (ssid,), 1, 100)
    139 
    140 
    141     def _set_ssid(self, ssid):
    142         self.set_content_of_text_field_by_id(ssid, 'display_SSID1')
    143         self._ssid = ssid
    144 
    145 
    146     def set_channel(self, channel):
    147         self.add_item_to_command_list(self._set_channel, (channel,), 1, 100)
    148 
    149 
    150     def _set_channel(self, channel):
    151         position = self._get_channel_popup_position(channel)
    152         channel_choices = ['2412MHz (Channel 1)', '2417MHz (Channel 2)',
    153                            '2422MHz (Channel 3)', '2427MHz (Channel 4)',
    154                            '2432MHz (Channel 5)', '2437MHz (Channel 6)',
    155                            '2442MHz (Channel 7)', '2447MHz (Channel 8)',
    156                            '2452MHz (Channel 9)', '2457MHz (Channel 10)',
    157                            '2462MHz (Channel 11)']
    158         self.select_item_from_popup_by_id(channel_choices[position],
    159                                           'sz11gChannel')
    160 
    161 
    162     def set_band(self, band):
    163         return None
    164 
    165 
    166     def set_security_disabled(self):
    167         self.add_item_to_command_list(self._set_security_disabled, (), 2, 1000)
    168 
    169 
    170     def _set_security_disabled(self):
    171         self.wait_for_object_by_id('security_mode')
    172         self.select_item_from_popup_by_id('Disable', 'security_mode')
    173 
    174 
    175     def set_security_wep(self, key_value, authentication):
    176         self.add_item_to_command_list(self._set_security_wep,
    177                                       (key_value, authentication), 2, 900)
    178 
    179 
    180     def _set_security_wep(self, key_value, authentication):
    181         text_field = 'id("WEP1")'
    182         popup_id = 'security_mode'
    183         self.wait_for_object_by_id(popup_id)
    184         self.select_item_from_popup_by_id('WEP-OPEN',
    185                                           popup_id, wait_for_xpath=text_field)
    186         self.set_content_of_text_field_by_xpath(key_value, text_field,
    187                                                 abort_check=True)
    188 
    189 
    190     def set_security_wpapsk(self, security, shared_key, update_interval=1800):
    191         self.add_item_to_command_list(self._set_security_wpapsk,
    192                                       (security, shared_key, update_interval),
    193                                        2, 900)
    194 
    195 
    196     def _set_security_wpapsk(self, security, shared_key, update_interval=1800):
    197         self.wait_for_object_by_id('security_mode')
    198         if security == ap_spec.SECURITY_TYPE_WPAPSK:
    199             wpa_item = 'WPA-PSK'
    200         else:
    201             wpa_item = 'WPA2-PSK'
    202         self.select_item_from_popup_by_id(wpa_item, 'security_mode',
    203                                           wait_for_xpath='id("passphrase")')
    204         self.set_content_of_text_field_by_id(shared_key, 'passphrase')
    205         self.set_content_of_text_field_by_id(update_interval,
    206                                              'keyRenewalInterval')
    207 
    208 
    209     def set_visibility(self, visible=True):
    210         self.add_item_to_command_list(self._set_visibility, (visible,), 1, 100)
    211 
    212 
    213     def _set_visibility(self, visible=True):
    214         # value=1 is visible; value=0 is invisible
    215         int_value = int(visible)
    216         xpath = ('//input[@value="%d" and @name="broadcastssid"]' % int_value)
    217         self.click_button_by_xpath(xpath)
    218