示例#1
0
    def _authenticate(self):
        """Authenticate."""
        # to obtain csrftoken, remove Referer from headers
        headers = HEADERS.copy()
        headers.pop('Referer')

        # initial GET request
        self.client = requests.Session()
        self.client.proxies = self._proxies
        self.client.verify = self._ssl_verify
        self.client.stream = True
        self.client.get(LOGIN_ENDPOINT, headers=headers)

        # set headers to submit POST request
        token = INITIAL_DATA.copy()
        token['csrfmiddlewaretoken'] = self.csrftoken
        token['email'] = self._username
        token['password'] = self._password

        req = self.client.post(LOGIN_ENDPOINT, data=token, headers=HEADERS)

        if req.status_code != 302:
            req.raise_for_status()

        # populate device list
        self.html['home'] = generate_soup_html(req.text)

        # currently only one faucet is supported on the code
        # we have future plans to support it
        parsed_controller = serial_finder(self.html['home'])
        self.controllers.append(
            RainCloudyController(self, parsed_controller['controller_serial'],
                                 parsed_controller['faucet_serial']))
        self.is_connected = True
        return True
示例#2
0
    def test_serial_finder(self):
        """Test serial finder method."""
        from raincloudy.helpers import serial_finder

        self.assertRaises(TypeError, serial_finder, None)

        broken_html = generate_soup_html(load_fixture('home_broken.html'))
        self.assertRaises(RainCloudyException, serial_finder, broken_html)
示例#3
0
    def test_find_zone_name(self):
        """test find_zone_name method."""
        from raincloudy.helpers import find_zone_name

        self.assertRaises(TypeError, find_zone_name, None, 1)

        # test when zone name is not found
        broken_html = generate_soup_html(load_fixture('home_broken.html'))
        self.assertIsNone(find_zone_name(broken_html, 1))
示例#4
0
    def test_find_controller_or_faucet_name(self):
        """Test find_controller_or_faucet_name method."""
        from raincloudy.helpers import find_controller_or_faucet_name as fcfn

        self.assertRaises(TypeError, fcfn, None, None)
        self.assertRaises(TypeError, fcfn, self.rdy.html['home'], None)

        # test when controller is not found
        broken_html = generate_soup_html(load_fixture('home_broken.html'))
        self.assertIsNone(fcfn(broken_html, 'controller'))
示例#5
0
 def _refresh_html_home(self):
     """
     Function to refresh the self._parent.html['home'] object
     which provides the status if zones are scheduled to
     start automatically (program_toggle).
     """
     req = self._parent.client.get(HOME_ENDPOINT)
     if req.status_code == 403:
         self._parent.login()
         self.update()
     elif req.status_code == 200:
         self._parent.html['home'] = generate_soup_html(req.text)
     else:
         req.raise_for_status()
示例#6
0
    def _authenticate(self):
        """Authenticate."""

        __location__ = os.path.realpath(
            os.path.join(os.getcwd(), os.path.dirname(__file__)))

        cert_file = Path(__location__ + "/wifiaquatimer_com_chain.cer")

        # to obtain csrftoken, remove Referer from headers
        headers = HEADERS.copy()
        headers.pop('Referer')

        # initial GET request
        self.client = requests.Session()
        self.client.proxies = self._proxies
        self.client.verify = cert_file.resolve()
        self.client.stream = True
        self.client.get(LOGIN_ENDPOINT, headers=headers)

        # set headers to submit POST request
        token = INITIAL_DATA.copy()
        token['csrfmiddlewaretoken'] = self.csrftoken
        token['email'] = self._username
        token['password'] = self._password

        req = self.client.post(LOGIN_ENDPOINT, data=token, headers=HEADERS)

        if req.status_code != 302:
            req.raise_for_status()

        home = self.client.get(url=HOME_ENDPOINT)

        self.html['home'] = generate_soup_html(home.text)

        setup = self.client.get(SETUP_ENDPOINT, headers=HEADERS)
        # populate device list
        self.html['setup'] = generate_soup_html(setup.text)

        controller_serials = controller_serial_finder(self.html['setup'])

        for index, controller_serial in enumerate(controller_serials):

            # We need to do a form submit for other controllers to get
            # faucet serials
            if index > 0:
                data = {'select_controller': index}
                self.html['setup'] = \
                    generate_soup_html(
                        self.post(
                            data,
                            url=SETUP_ENDPOINT,
                            referer=SETUP_ENDPOINT
                        ).text)

            faucet_serials = faucet_serial_finder(self.html['setup'])

            faucets = []
            for faucet_index, faucet_serial in enumerate(faucet_serials):

                # We need to do a form submit for other faucets to get
                # zone names
                if faucet_index > 0:
                    data = {'select_faucet': faucet_index}
                    self.html['setup'] = \
                        generate_soup_html(
                            self.post(
                                data,
                                url=SETUP_ENDPOINT,
                                referer=SETUP_ENDPOINT
                            ).text)

                zone_names = find_zone_names(self.html['setup'])
                faucets.append({'serial': faucet_serial, 'zones': zone_names})

            self._controllers.append(
                RainCloudyController(self, controller_serial, index, faucets))
        self.is_connected = True
        return True
示例#7
0
 def update_home(self, data):
     """Update home html"""
     if not isinstance(data, str):
         raise TypeError("Function requires string response")
     self.html['home'] = generate_soup_html(data)