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 """Subclass of the APConfigurator"""
      6 
      7 import logging
      8 import urlparse
      9 import dynamic_ap_configurator
     10 import ap_spec
     11 
     12 
     13 class Linksyse2000APConfigurator(
     14         dynamic_ap_configurator.DynamicAPConfigurator):
     15     """Derived class to control Linksyse2000 AP"""
     16 
     17     def _sec_alert(self, alert):
     18         text = alert.text
     19         if 'Your wireless security mode is not compatible with' in text:
     20             alert.accept()
     21         elif 'WARNING: Your Wireless-N devices will only operate' in text:
     22             alert.accept()
     23         else:
     24             raise RuntimeError('Unhandled alert : %s' % text)
     25 
     26 
     27     def get_number_of_pages(self):
     28         return 2
     29 
     30 
     31     def get_supported_modes(self):
     32         return [{'band': ap_spec.BAND_2GHZ,
     33                  'modes': [ap_spec.MODE_M, ap_spec.MODE_B | ap_spec.MODE_G,
     34                            ap_spec.MODE_G, ap_spec.MODE_B, ap_spec.MODE_N,
     35                            ap_spec.MODE_D]},
     36                 {'band': ap_spec.BAND_5GHZ,
     37                  'modes': [ap_spec.MODE_M, ap_spec.MODE_A, ap_spec.MODE_N,
     38                            ap_spec.MODE_D]}]
     39 
     40 
     41     def get_supported_bands(self):
     42         return [{'band': ap_spec.BAND_2GHZ,
     43                  'channels': ['Auto', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]},
     44                 {'band': ap_spec.BAND_5GHZ,
     45                  'channels': ['Auto', 36, 40, 44, 48, 149, 153, 157, 161]}]
     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_WPAPSK,
     51                                  ap_spec.SECURITY_TYPE_WPA2PSK,
     52                                  ap_spec.SECURITY_TYPE_WEP)
     53 
     54 
     55     def navigate_to_page(self, page_number):
     56         if page_number == 1:
     57             page_url = urlparse.urljoin(self.admin_interface_url,
     58                                         'Wireless_Basic.asp')
     59             self.get_url(page_url, page_title='Settings')
     60         elif page_number == 2:
     61             page_url = urlparse.urljoin(self.admin_interface_url,
     62                                         'WL_WPATable.asp')
     63             self.get_url(page_url, page_title='Security')
     64         else:
     65             raise RuntimeError('Invalid page number passed. Number of pages '
     66                                '%d, page value sent was %d' %
     67                                (self.get_number_of_pages(), page_number))
     68 
     69 
     70     def save_page(self, page_number):
     71         xpath = '//a[text()="Save Settings"]'
     72         button = self.driver.find_element_by_xpath(xpath)
     73         button.click()
     74         button_xpath = '//input[@name="btaction"]'
     75         if self.wait_for_object_by_xpath(button_xpath):
     76             button = self.driver.find_element_by_xpath(button_xpath)
     77             button.click()
     78 
     79 
     80     def set_mode(self, mode, band=None):
     81         if band:
     82             self.add_item_to_command_list(self._set_band, (band,), 1, 700)
     83         self.add_item_to_command_list(self._set_mode, (mode, band), 1, 800)
     84 
     85 
     86     def _set_mode(self, mode, band=None):
     87         xpath = '//select[@name="wl_net_mode_24g"]'
     88         mode_mapping = {ap_spec.MODE_M:'Mixed',
     89                         ap_spec.MODE_B | ap_spec.MODE_G:'BG-Mixed',
     90                         ap_spec.MODE_G:'Wireless-G Only',
     91                         ap_spec.MODE_B:'Wireless-B Only',
     92                         ap_spec.MODE_N:'Wireless-N Only',
     93                         ap_spec.MODE_D:'Disabled',
     94                         ap_spec.MODE_A:'Wireless-A Only'}
     95         if self.current_band == ap_spec.BAND_5GHZ or band == ap_spec.BAND_5GHZ:
     96             xpath = '//select[@name="wl_net_mode_5g"]'
     97         mode_name = ''
     98         if mode in mode_mapping.keys():
     99             mode_name = mode_mapping[mode]
    100             if ((mode & ap_spec.MODE_A) and
    101                 (self.current_band == ap_spec.BAND_2GHZ)):
    102                #  a mode only in 5Ghz
    103                 logging.debug('Mode \'a\' is not available for 2.4Ghz band.')
    104                 return
    105             elif ((mode & (ap_spec.MODE_B | ap_spec.MODE_G) ==
    106                   (ap_spec.MODE_B | ap_spec.MODE_G)) or
    107                   (mode & ap_spec.MODE_B == ap_spec.MODE_B) or
    108                   (mode & ap_spec.MODE_G == ap_spec.MODE_G)) and \
    109                   (self.current_band != ap_spec.BAND_2GHZ):
    110                #  b/g, b, g mode only in 2.4Ghz
    111                 logging.debug('Mode \'%s\' is not available for 5Ghz band.',
    112                                mode_name)
    113                 return
    114         else:
    115             raise RuntimeError("The mode %s is not supported" % mode_name)
    116         self.select_item_from_popup_by_xpath(mode_name, xpath,
    117                                              alert_handler=self._sec_alert)
    118 
    119 
    120     def set_ssid(self, ssid):
    121         self.add_item_to_command_list(self._set_ssid, (ssid,), 1, 900)
    122 
    123 
    124     def _set_ssid(self, ssid):
    125         xpath = '//input[@maxlength="32" and @name="wl_ssid_24g"]'
    126         mode = '//select[@name="wl_net_mode_24g"]'
    127         if self.current_band == ap_spec.BAND_5GHZ:
    128             xpath = '//input[@maxlength="32" and @name="wl_ssid_5g"]'
    129             mode = '//select[@name="wl_net_mode_5g"]'
    130         ssid_field = self.driver.find_element_by_xpath(xpath)
    131         if ssid_field.get_attribute('disabled') == 'true':
    132             # This means the mode is disabled, so we have to set it to something
    133             # so we can fill in the SSID
    134             self.select_item_from_popup_by_xpath('Mixed', mode,
    135                                                  alert_handler=self._sec_alert)
    136         self.set_content_of_text_field_by_xpath(ssid, xpath)
    137         self._ssid = ssid
    138 
    139 
    140     def set_channel(self, channel):
    141         self.add_item_to_command_list(self._set_channel, (channel,), 1, 900)
    142 
    143 
    144     def _set_channel(self, channel):
    145         position = self._get_channel_popup_position(channel)
    146         xpath = '//select[@name="wl_schannel"]'
    147         channels = ['Auto', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    148                     '10', '11']
    149         if self.current_band == ap_spec.BAND_5GHZ:
    150             xpath = '//select[@name="wl_schannel"]'
    151             channels = ['Auto', '36', '40', '44', '48', '149', '153',
    152                         '157', '161']
    153         self.select_item_from_popup_by_xpath(channels[position], xpath)
    154 
    155 
    156     def set_ch_width(self, channel_wid):
    157         """
    158         Set the channel width
    159 
    160         @param channel_wid: the required channel width
    161         """
    162         self.add_item_to_command_list(self._set_ch_width,(channel_wid,),
    163                                       1, 900)
    164 
    165 
    166     def _set_ch_width(self, channel_wid):
    167         channel_width_choice = ['Auto (20MHz or 40MHz)', '20MHz only']
    168         xpath = '//select[@name="_wl_nbw"]'
    169         if self.current_band == ap_spec.BAND_5GHZ:
    170             channel_width_choice = ['Auto (20MHz or 40MHz)', '20MHz only',
    171                                     '40MHz only']
    172             xpath = '//select[@name="_wl_nbw"]'
    173         self.select_item_from_popup_by_xpath(channel_width_choice[channel_wid],
    174                                              xpath)
    175 
    176 
    177     def set_band(self, band):
    178         self.add_item_to_command_list(self._set_band, (band,), 1, 800)
    179 
    180 
    181     def _set_band(self, band):
    182         if band == ap_spec.BAND_2GHZ:
    183             self.current_band = ap_spec.BAND_2GHZ
    184             xpath = '//input[@name="wl_sband" and @value="24g"]'
    185             element = self.driver.find_element_by_xpath(xpath)
    186             element.click()
    187         elif band == ap_spec.BAND_5GHZ:
    188             self.current_band = ap_spec.BAND_5GHZ
    189             xpath = '//input[@name="wl_sband" and @value="5g"]'
    190             element = self.driver.find_element_by_xpath(xpath)
    191             element.click()
    192         else:
    193             raise RuntimeError('Invalid band %s' % band)
    194 
    195 
    196     def set_radio(self, enabled=True):
    197         return None
    198 
    199 
    200     def set_security_disabled(self):
    201         self.add_item_to_command_list(self._set_security_disabled, (), 2, 1000)
    202 
    203 
    204     def _set_security_disabled(self):
    205         xpath = '//select[@name="security_mode2"]'
    206         self.select_item_from_popup_by_xpath('Disabled', xpath)
    207 
    208 
    209     def set_security_wep(self, key_value, authentication):
    210         self.add_item_to_command_list(self._set_security_wep,
    211                                       (key_value, authentication), 2, 1000)
    212 
    213 
    214     def _set_security_wep(self, key_value, authentication):
    215         # WEP and WPA-Personal are not supported for Wireless-N only mode
    216         # and Mixed mode.
    217         # WEP and WPA-Personal do not show up in the list, no alert is thrown.
    218         popup = '//select[@name="security_mode2"]'
    219         if not self.item_in_popup_by_xpath_exist('WEP', popup):
    220             raise RuntimeError ('Unable to find wep security item in popup.  '
    221                                 'Is the mode set to N?')
    222         self.select_item_from_popup_by_xpath('WEP', popup,
    223                                              alert_handler=self._sec_alert)
    224         text = '//input[@name="wl_passphrase"]'
    225         self.set_content_of_text_field_by_xpath(key_value, text,
    226                                                 abort_check=True)
    227         xpath = '//input[@value="Generate"]'
    228         self.click_button_by_xpath(xpath, alert_handler=self._sec_alert)
    229 
    230 
    231     def set_security_wpapsk(self, security, shared_key, update_interval=None):
    232         # WEP and WPA-Personal are not supported for Wireless-N only mode,
    233         self.add_item_to_command_list(self._set_security_wpapsk,
    234                                       (security, shared_key,), 2, 900)
    235 
    236 
    237     def _set_security_wpapsk(self, security, shared_key):
    238         popup = '//select[@name="security_mode2"]'
    239         if security == ap_spec.SECURITY_TYPE_WPAPSK:
    240             wpa_item = 'WPA Personal'
    241         else:
    242             wpa_item = 'WPA2 Personal'
    243         self.select_item_from_popup_by_xpath(wpa_item, popup,
    244                                              alert_handler=self._sec_alert)
    245         text = '//input[@name="wl_wpa_psk"]'
    246         self.set_content_of_text_field_by_xpath(shared_key, text,
    247                                                 abort_check=True)
    248 
    249 
    250     def is_update_interval_supported(self):
    251         """
    252         Returns True if setting the PSK refresh interval is supported.
    253 
    254         @return True is supported; False otherwise
    255         """
    256         return False
    257 
    258 
    259     def set_visibility(self, visible=True):
    260         self.add_item_to_command_list(self._set_visibility, (visible,), 1, 900)
    261 
    262 
    263     def _set_visibility(self, visible=True):
    264         value = 0 if visible else 1
    265         xpath = '//input[@name="wl_closed_24g" and @value="%s"]' % value
    266         if self.current_band == ap_spec.BAND_5GHZ:
    267             xpath = '//input[@name="wl_closed_5g" and @value="%s"]' % value
    268         self.click_button_by_xpath(xpath)
    269