Exemplo n.º 1
0
    def _get_cu_and_fu_status(self):
        """Submit POST request to update information."""
        # adjust headers
        headers = HEADERS.copy()
        headers['Accept'] = '*/*'
        headers['X-Requested-With'] = 'XMLHttpRequest'
        headers['X-CSRFToken'] = self._parent.csrftoken

        # example {"controller_serial":"12345","faucet_serial":"abcd"}
        argv = '{"controller_serial":"' + self.serial + \
               '","faucet_serial":"' + self.faucet.serial + '"}'
        post_data = {'argv': argv}

        req = self._parent.client.post(DAJAXICE_ENDPOINT,
                                       data=post_data,
                                       headers=headers)

        # token probably expired, then try again
        if req.status_code == 403:
            self._parent.login()
            self.update()
        elif req.status_code == 200:
            self.attributes = req.json()
        else:
            req.raise_for_status()
Exemplo n.º 2
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
Exemplo n.º 3
0
    def post(self, ddata, url=SETUP_ENDPOINT, referer=SETUP_ENDPOINT):
        """Method to update some attributes on namespace."""
        headers = HEADERS.copy()
        if referer is None:
            headers.pop('Referer')
        else:
            headers['Referer'] = referer

        # append csrftoken
        if 'csrfmiddlewaretoken' not in ddata.keys():
            ddata['csrfmiddlewaretoken'] = self._parent.csrftoken

        req = self._parent.client.post(url, headers=headers, data=ddata)
        if req.status_code == 200:
            self.update()
Exemplo n.º 4
0
    def _get_cu_and_fu_status(self):
        """Submit GET request to update information."""
        # adjust headers
        headers = HEADERS.copy()
        headers['Accept'] = '*/*'
        headers['X-Requested-With'] = 'XMLHttpRequest'
        headers['X-CSRFToken'] = self._parent.csrftoken

        args = '?controller_serial=' + self.serial \
               + '&faucet_serial=' + self.faucet.serial

        req = self._parent.client.get(STATUS_ENDPOINT + args, headers=headers)

        # token probably expired, then try again
        if req.status_code == 403:
            self._parent.login()
            self.update()
        elif req.status_code == 200:
            self.attributes = req.json()
        else:
            req.raise_for_status()
Exemplo n.º 5
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