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 """Base class for objects to configure Linksys dual band access points
      6    using webdriver."""
      7 
      8 import logging
      9 import urlparse
     10 
     11 import dynamic_ap_configurator
     12 import ap_spec
     13 
     14 class LinksyseDualBandAPConfigurator(
     15         dynamic_ap_configurator.DynamicAPConfigurator):
     16     """Base class for objects to configure Linksys dual band access points
     17        using webdriver."""
     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         #  We ignore warnings that we get when we disable visibility or security
     29         #  changed to WEP, WPA Personal or WPA Enterprise.
     30         if 'Security Mode is disabled.' in text:
     31             alert.accept()
     32         elif 'Your wireless security mode is not compatible with' in text:
     33             alert.accept()
     34         elif 'WARNING: Your Wireless-N devices will only operate ' in text:
     35             alert.accept()
     36         elif 'Setting the Security Mode to WEP, WPA Personal' in text:
     37             alert.accept()
     38         elif 'Turning off SSID Broadcast' in text:
     39             alert.accept()
     40         elif 'Security modes are not compatible' in text:
     41             alert.accept()
     42             raise RuntimeError('Security modes are not compatible. %s' % text)
     43         elif 'security mode is not compatible with Wireless-N' in text:
     44             alert.accept()
     45         elif 'Please select WPA2-Personal or WPA2-Enterprise' in text:
     46             alert.accept()
     47         elif 'The wifi interface is current busy.' in text:
     48             alert.accept()
     49             self.click_button_by_xpath('//a[text()="Save Settings"]',
     50                                        alert_handler=self._alert_handler)
     51         else:
     52             alert.accept()
     53             raise RuntimeError('We have an unhandled alert: %s' % text)
     54 
     55 
     56     def get_number_of_pages(self):
     57         return 1
     58 
     59 
     60     def get_supported_bands(self):
     61         return [{'band': ap_spec.BAND_2GHZ,
     62                  'channels': ['Auto', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]},
     63                 {'band': ap_spec.BAND_5GHZ,
     64                  'channels': ['Auto', 36, 40, 44, 48, 149, 153, 157, 161]}]
     65 
     66 
     67     def get_supported_modes(self):
     68         return [{'band': ap_spec.BAND_2GHZ,
     69                  'modes': [ap_spec.MODE_B, ap_spec.MODE_N, ap_spec.MODE_B |
     70                            ap_spec.MODE_G, ap_spec.MODE_G]},
     71                 {'band': ap_spec.BAND_5GHZ,
     72                  'modes': [ap_spec.MODE_A, ap_spec.MODE_N]}]
     73 
     74 
     75     def is_security_mode_supported(self, security_mode):
     76         if self.current_band == ap_spec.BAND_5GHZ:
     77             return security_mode in (ap_spec.SECURITY_TYPE_DISABLED,
     78                                      ap_spec.SECURITY_TYPE_WPAPSK,
     79                                      ap_spec.SECURITY_TYPE_WPA2PSK)
     80         return security_mode in (ap_spec.SECURITY_TYPE_DISABLED,
     81                                  ap_spec.SECURITY_TYPE_WPAPSK,
     82                                  ap_spec.SECURITY_TYPE_WPA2PSK,
     83                                  ap_spec.SECURITY_TYPE_WEP)
     84 
     85 
     86     def navigate_to_page(self, page_number):
     87         if page_number == 1:
     88             url = urlparse.urljoin(self.admin_interface_url,
     89                                    'Wireless_Basic.asp')
     90             self.get_url(url, page_title='Settings')
     91         else:
     92             raise RuntimeError('Invalid page number passed.  Number of pages '
     93                                '%d, page value sent was %d' %
     94                                (self.get_number_of_pages(), page_number))
     95 
     96 
     97     def save_page(self, page_number):
     98         self.click_button_by_xpath('//a[text()="Save Settings"]',
     99                                    alert_handler=self._alert_handler)
    100         continue_xpath = '//input[@value="Continue" and @type="button"]'
    101         self.wait_for_object_by_xpath(continue_xpath)
    102         self.click_button_by_xpath(continue_xpath)
    103 
    104 
    105     def set_mode(self, mode, band=None):
    106         self.add_item_to_command_list(self._set_mode, (mode, band), 1, 800)
    107 
    108 
    109     def _set_mode(self, mode, band=None):
    110         mode_mapping = {ap_spec.MODE_B: 'Wireless-B Only',
    111                         ap_spec.MODE_G: 'Wireless-G Only',
    112                         ap_spec.MODE_B | ap_spec.MODE_G: 'Wireless-B/G Only',
    113                         ap_spec.MODE_N: 'Wireless-N Only',
    114                         ap_spec.MODE_A: 'Wireless-A Only'}
    115         xpath = '//select[@name="wl0_net_mode"]'
    116         if self.current_band == ap_spec.BAND_5GHZ or band == ap_spec.BAND_5GHZ:
    117             self.current_band = ap_spec.BAND_5GHZ
    118             xpath = '//select[@name="wl1_net_mode"]'
    119         mode_name = ''
    120         if mode in mode_mapping.keys():
    121             mode_name = mode_mapping[mode]
    122             if ((mode & ap_spec.MODE_A) and
    123                 (self.current_band != ap_spec.BAND_5GHZ)):
    124                 #  a mode only in 5Ghz
    125                 logging.debug('Mode \'a\' is not available for 2.4Ghz band.')
    126                 return
    127             elif ((mode & (ap_spec.MODE_B | ap_spec.MODE_G) ==
    128                   (ap_spec.MODE_B | ap_spec.MODE_G)) or
    129                  (mode & ap_spec.MODE_B == ap_spec.MODE_B) or
    130                  (mode & ap_spec.MODE_G == ap_spec.MODE_G)) and \
    131                  (self.current_band != ap_spec.BAND_2GHZ):
    132                 #  b/g, b, g mode only in 2.4Ghz
    133                 logging.debug('Mode \'%s\' is not available for 5Ghz band.',
    134                               mode_name)
    135                 return
    136         else:
    137             raise RuntimeError('The mode selected %d is not supported by router'
    138                                ' %s.', hex(mode), self.name)
    139         self.select_item_from_popup_by_xpath(mode_name, xpath,
    140                                              alert_handler=self._alert_handler)
    141 
    142 
    143     def set_radio(self, enabled=True):
    144         logging.debug('set_radio is not supported in Linksys dual band AP.')
    145         return None
    146 
    147 
    148     def set_ssid(self, ssid):
    149         self.add_item_to_command_list(self._set_ssid, (ssid,), 1, 900)
    150 
    151 
    152     def _set_ssid(self, ssid):
    153         xpath = '//input[@maxlength="32" and @name="wl0_ssid"]'
    154         if self.current_band == ap_spec.BAND_5GHZ:
    155             xpath = '//input[@maxlength="32" and @name="wl1_ssid"]'
    156         self.set_content_of_text_field_by_xpath(ssid, xpath)
    157         self._ssid = ssid
    158 
    159 
    160     def set_channel(self, channel):
    161         self.add_item_to_command_list(self._set_channel, (channel,), 1, 900)
    162 
    163 
    164     def _set_channel(self, channel):
    165         position = self._get_channel_popup_position(channel)
    166         channel_choices = ['Auto',
    167                            '1 - 2.412 GHz', '2 - 2.417 GHz', '3 - 2.422 GHz',
    168                            '4 - 2.427 GHz', '5 - 2.432 GHz', '6 - 2.437 GHz',
    169                            '7 - 2.442 GHz', '8 - 2.447 GHz', '9 - 2.452 GHz',
    170                            '10 - 2.457 GHz', '11 - 2.462 GHz']
    171         xpath = '//select[@name="_wl0_channel"]'
    172         if self.current_band == ap_spec.BAND_5GHZ:
    173             xpath = '//select[@name="_wl1_channel"]'
    174             channel_choices = ['Auto', '36 - 5.180 GHz', '40 - 5.200 GHz',
    175                                '44 - 5.220 GHz', '48 - 5.240 GHz',
    176                                '149 - 5.745 GHz', '153 - 5.765 GHz',
    177                                '157 - 5.785 GHz', '161 - 5.805 GHz']
    178         self.select_item_from_popup_by_xpath(channel_choices[position],
    179                                              xpath)
    180 
    181 
    182     def set_band(self, band):
    183         if band == ap_spec.BAND_5GHZ:
    184             self.current_band = ap_spec.BAND_5GHZ
    185         elif band == ap_spec.BAND_2GHZ:
    186             self.current_band = ap_spec.BAND_2GHZ
    187         else:
    188             raise RuntimeError('Invalid band sent %s' % band)
    189 
    190 
    191     def set_security_disabled(self):
    192         self.add_item_to_command_list(self._set_security_disabled, (), 1, 900)
    193 
    194 
    195     def _set_security_disabled(self):
    196         xpath = '//select[@name="wl0_security_mode"]'
    197         if self.current_band == ap_spec.BAND_5GHZ:
    198             xpath = '//select[@name="wl1_security_mode"]'
    199         self.select_item_from_popup_by_xpath('Disabled', xpath)
    200 
    201 
    202     def set_security_wep(self, key_value, authentication):
    203         self.add_item_to_command_list(self._set_security_wep,
    204                                       (key_value, authentication), 1, 900)
    205 
    206 
    207     def _set_security_wep(self, key_value, authentication):
    208         popup = '//select[@name="wl0_security_mode"]'
    209         text_field = '//input[@name="wl0_passphrase"]'
    210         xpath = '//input[@name="wepGenerate0" and @type="button"]'
    211         if self.current_band == ap_spec.BAND_5GHZ:
    212             popup = '//select[@name="wl1_security_mode"]'
    213             text_field = '//input[@name="wl1_passphrase"]'
    214             xpath = '//input[@name="wepGenerate1" and @type="button"]'
    215         self.wait_for_object_by_xpath(popup)
    216         self.select_item_from_popup_by_xpath('WEP', popup,
    217                                              wait_for_xpath=text_field,
    218                                              alert_handler=self._alert_handler)
    219         self.set_content_of_text_field_by_xpath(key_value, text_field,
    220                                                 abort_check=True)
    221         self.click_button_by_xpath(xpath)
    222 
    223 
    224     def set_security_wpapsk(self, security, shared_key, update_interval=None):
    225         self.add_item_to_command_list(self._set_security_wpapsk,
    226                                       (security, shared_key, update_interval),
    227                                        1, 900)
    228 
    229 
    230     def _set_security_wpapsk(self, security, shared_key, update_interval=None):
    231         popup = '//select[@name="wl0_security_mode"]'
    232         key_field = '//input[@name="wl0_wpa_psk"]'
    233         if self.current_band == ap_spec.BAND_5GHZ:
    234             popup = '//select[@name="wl1_security_mode"]'
    235             key_field = '//input[@name="wl1_wpa_psk"]'
    236         self.wait_for_object_by_xpath(popup)
    237         if security == ap_spec.SECURITY_TYPE_WPAPSK:
    238             wpa_item = 'WPA Personal'
    239         else:
    240             wpa_item = 'WPA2 Personal'
    241         self.select_item_from_popup_by_xpath(wpa_item, popup,
    242                                              wait_for_xpath=key_field,
    243                                              alert_handler=self._alert_handler)
    244         self.set_content_of_text_field_by_xpath(shared_key, key_field,
    245                                                 abort_check=True)
    246 
    247 
    248     def is_update_interval_supported(self):
    249         """
    250         Returns True if setting the PSK refresh interval is supported.
    251 
    252         @return True is supported; False otherwise
    253         """
    254         return False
    255 
    256 
    257     def set_visibility(self, visible=True):
    258         self.add_item_to_command_list(self._set_visibility, (visible,), 1, 900)
    259 
    260 
    261     def _set_visibility(self, visible=True):
    262         button = 'wl0_closed'
    263         if self.current_band == ap_spec.BAND_5GHZ:
    264             button = 'wl1_closed'
    265         int_value = 0 if visible else 1
    266         xpath = ('//input[@value="%d" and @name="%s"]' % (int_value, button))
    267         self.click_button_by_xpath(xpath)
    268