Ejemplo n.º 1
0
    def get(self, request, device_id=None, stream_id=None, format=None):
        """
        Query Device Cloud for DataPoints
        """
        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        # Only show the data from the last x minutes
        if 'startTime' in request.GET:
            try:
                time = datetime.utcfromtimestamp(
                    float(request.GET['startTime']))
            except ValueError:
                return Response(status=status.HTTP_400_BAD_REQUEST)
        else:
            time = datetime.utcnow() - timedelta(minutes=5)
        time_no_micro = time.replace(microsecond=0)
        iso_time = time_no_micro.isoformat()+'z'

        try:
            data_points = conn.get_datapoints(stream_id, iso_time)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 2
0
    def post(self, request, device_id):
        """
        Send data to device serial
        """

        try:
            data = request.DATA['data']
        except KeyError:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        try:
            is_encoded = request.DATA['is_base64']
            needs_encoding = not strtobool(is_encoded)
        except KeyError:
            needs_encoding = True
        except ValueError:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        if needs_encoding:
            data = base64.b64encode(data)

        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        try:
            response = conn.send_serial_data(device_id, data)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 3
0
 def test_get_credentials_no_cloud(self):
     request = self.factory.get('url')
     request.META['HTTP_AUTHORIZATION'] = 'Basic ' + base64.b64encode('user:pass')
     user, password, cloud = util.get_credentials(request)
     self.assertEqual(user, 'user')
     self.assertEqual(password, 'pass')
     self.assertEqual(cloud, settings.LIB_DIGI_DEVICECLOUD['DEFAULT_CLOUD_SERVER'])
Ejemplo n.º 4
0
def monitor_setup(request, device_id):
    """
    View to handle monitor setup for a device

    Will query for existing monitors, create a new one if none found, else
    kickstart existing monitor.

    Returns the monitor information from Device Cloud
    ------------------------------------------
    """
    username, password, cloud_fqdn = get_credentials(request)

    if not username or not password or not cloud_fqdn:
        return Response(status=status.HTTP_400_BAD_REQUEST)

    conn = DeviceCloudConnector(username, password, cloud_fqdn)

    endpoint_url = reverse(monitor_receiver, request=request)
    # Device cloud won't allow monitors pointing to localhost, etc,
    # so don't even try
    if 'localhost' in endpoint_url or '127.0.0.1' in endpoint_url:
        logger.error('Rejecting attempt to create monitor to ' + endpoint_url)
        return Response(status=status.HTTP_400_BAD_REQUEST)

    try:
        monitors = conn.get_datapoint_monitor_for_device(
            device_id, endpoint_url)

        if monitors['resultSize'] == "0":
            # No existing monitors found for this device on this account,
            # create a new one
            # NOTE: The full url is generated by information passed in the
            # request. If the same backend is being routed to from multiple
            # places (reverse proxies, etc), each will generate a different url
            logger.info('Creating a new DataPoint monitor for device %s' %
                        device_id)
            resp = conn.create_datapoint_monitor(
                device_id,
                endpoint_url,
                settings.SECRET_DEVICE_CLOUD_MONITOR_AUTH_USER,
                settings.SECRET_DEVICE_CLOUD_MONITOR_AUTH_PASS,
                description="XBee Wi-Fi Cloud Kit Monitor")
        else:
            # Should only have one monitor for a given device/topic
            if len(monitors['items']) > 1:
                logger.warning("Found multiple monitors for this device! " +
                               "This should not happen!")

            monitor = monitors['items'][0]
            logger.info(
                'Found an existing DataPoint monitor for %s, kicking it' %
                device_id)
            conn.kick_monitor(monitor['monId'],
                              settings.SECRET_DEVICE_CLOUD_MONITOR_AUTH_USER,
                              settings.SECRET_DEVICE_CLOUD_MONITOR_AUTH_PASS)
            # Return the original info
            resp = monitors

    except HTTPError, e:
        return Response(status=e.response.status_code, data=e.response.text)
Ejemplo n.º 5
0
def monitor_devicecore_setup(request):
    """
    View to handle DeviceCore monitor setup for an user

    Will query for existing monitors, create a new one if none found, else
    kickstart existing monitor.

    Returns the monitor information from Device Cloud
    ------------------------------------------
    """
    username, password, cloud_fqdn = get_credentials(request)

    if not username or not password or not cloud_fqdn:
        return Response(status=status.HTTP_400_BAD_REQUEST)

    conn = DeviceCloudConnector(username, password, cloud_fqdn)

    endpoint_url = reverse(monitor_receiver, request=request)
    # Device cloud won't allow monitors pointing to localhost, etc,
    # so don't even try
    if 'localhost' in endpoint_url or '127.0.0.1' in endpoint_url:
        logger.error('Rejecting attempt to create monitor to ' + endpoint_url)
        return Response(status=status.HTTP_400_BAD_REQUEST)

    try:
        monitors = conn.get_devicecore_monitor(endpoint_url)

        if monitors['resultSize'] == "0":
            # No existing monitors found for this device on this account,
            # create a new one
            # NOTE: The full url is generated by information passed in the
            # request. If the same backend is being routed to from multiple
            # places (reverse proxies, etc), each will generate a different
            # url.
            logger.info('Creating a new DeviceCore monitor for user %s'
                        % username)
            resp = conn.create_devicecore_monitor(
                endpoint_url,
                settings.SECRET_DEVICE_CLOUD_MONITOR_AUTH_USER,
                settings.SECRET_DEVICE_CLOUD_MONITOR_AUTH_PASS,
                description="XBee Wi-Fi Cloud Kit Monitor")
        else:
            # Should only have one monitor for a given device/topic
            if len(monitors['items']) > 1:
                logger.warning("Found multiple monitors for user %s! " +
                               "This should not happen!" % username)

            monitor = monitors['items'][0]
            logger.info(
                'Found an existing DeviceCore monitor for user, kicking it')
            conn.kick_monitor(
                monitor['monId'],
                settings.SECRET_DEVICE_CLOUD_MONITOR_AUTH_USER,
                settings.SECRET_DEVICE_CLOUD_MONITOR_AUTH_PASS)
            # Return the original info
            resp = monitors

    except HTTPError, e:
        return Response(status=e.response.status_code, data=e.response.text)
Ejemplo n.º 6
0
 def test_get_credentials_with_cloud(self):
     request = self.factory.get('url')
     usercloud= settings.LIB_DIGI_DEVICECLOUD['USERNAME_CLOUD_DELIMETER'].join(['user', 'custom_cloud'])
     request.META['HTTP_AUTHORIZATION'] = 'Basic ' + base64.b64encode(':'.join([usercloud, 'pass']))
     user, password, cloud = util.get_credentials(request)
     self.assertEqual(user, 'user')
     self.assertEqual(password, 'pass')
     self.assertEqual(cloud, 'custom_cloud')
Ejemplo n.º 7
0
 def test_get_credentials_no_cloud(self):
     request = self.factory.get('url')
     request.META['HTTP_AUTHORIZATION'] = 'Basic ' + base64.b64encode(
         'user:pass')
     user, password, cloud = util.get_credentials(request)
     self.assertEqual(user, 'user')
     self.assertEqual(password, 'pass')
     self.assertEqual(cloud,
                      settings.LIB_DIGI_DEVICECLOUD['DEFAULT_CLOUD_SERVER'])
Ejemplo n.º 8
0
 def test_get_credentials_with_cloud(self):
     request = self.factory.get('url')
     usercloud = settings.LIB_DIGI_DEVICECLOUD[
         'USERNAME_CLOUD_DELIMETER'].join(['user', 'custom_cloud'])
     request.META['HTTP_AUTHORIZATION'] = 'Basic ' + base64.b64encode(
         ':'.join([usercloud, 'pass']))
     user, password, cloud = util.get_credentials(request)
     self.assertEqual(user, 'user')
     self.assertEqual(password, 'pass')
     self.assertEqual(cloud, 'custom_cloud')
Ejemplo n.º 9
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--parameters',
                        type=str,
                        required=True,
                        help="File containing parameters")
    args = parser.parse_args()
    params = json.loads(open(args.parameters).read())
    [access_key, secret_key] = util.get_credentials("default")
    params["access_key"] = access_key
    params["secret_key"] = secret_key
    setup(params)
Ejemplo n.º 10
0
    def run(self):
        [access_key, secret_key] = util.get_credentials("default")
        self.params["input_name"] = self.file_name
        self.params["access_key"] = access_key
        self.params["secret_key"] = secret_key
        print("Thread {0:d}: Processing file {1:s}".format(
            self.thread_id, self.file_name))
        [upload_duration, duration,
         failed_attempts] = benchmark.run(self.params, self.thread_id)

        token = "{0:f}-{1:d}".format(self.params["now"], self.params["nonce"])
        token_to_file[token] = self.file_name
Ejemplo n.º 11
0
    def put(self, request, device_id=None):
        # First query for existing config, calculate diff
        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        try:
            settings = conn.get_device_settings(device_id)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 12
0
    def get(self, request, device_id=None, format=None):
        """
        Query Device Cloud to return current device settings
        """
        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        try:
            data_streams = conn.get_datastream_list(device_id=device_id)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 13
0
def main(couch_params, main_db, avatar_db, master_params, wikifeat_home):
    # Set up credentials
    credentials = util.get_credentials(couch_params.adminuser, couch_params.adminpass)
    global gh, ph
    gh = util.get_headers(credentials)
    ph = util.put_headers(credentials)
    global wf_dir
    wf_dir = wikifeat_home
    # Establish a connection to couchdb
    conn = util.get_connection(couch_params.use_ssl, couch_params.host, couch_params.port)
    conn.connect()
    setup_main_db(conn, main_db)
    setup_user_db(conn)
    setup_avatar_db(conn, avatar_db)
    if master_params.skip_master is False:
        create_master_user(conn, master_params)
Ejemplo n.º 14
0
    def get(self, request, device_id=None, format=None):
        """
        Return a single Xbee WiFi devices, and provide links to data and config
        views
        """

        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        try:
            device = conn.get_device_list(device_id=device_id)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 15
0
def main(couch_params, main_db, avatar_db, master_params, wikifeat_home):
    # Set up credentials
    credentials = util.get_credentials(couch_params.adminuser,
                                       couch_params.adminpass)
    global gh, ph
    gh = util.get_headers(credentials)
    ph = util.put_headers(credentials)
    global wf_dir
    wf_dir = wikifeat_home
    # Establish a connection to couchdb
    conn = util.get_connection(couch_params.use_ssl, couch_params.host,
                               couch_params.port)
    conn.connect()
    setup_main_db(conn, main_db)
    setup_user_db(conn)
    setup_avatar_db(conn, avatar_db)
    if master_params.skip_master is False:
        create_master_user(conn, master_params)
Ejemplo n.º 16
0
    def get(self, request, format=None):
        """
        Return a list of Xbee WiFi devices on the authenticated user's Device
        Cloud account
        """
        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        try:
            devices = conn.get_device_list(
                device_types=settings.SUPPORTED_DEVICE_TYPES)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 17
0
    def get(self, request, device_id=None, format=None):
        """
        Query Device Cloud to return current device settings
        """
        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        cache = bool(strtobool(request.QUERY_PARAMS.get('cache', 'False')))

        try:
            settings = conn.get_device_settings(device_id, cache=cache)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 18
0
    def put(self, request, device_id, settings_group, format=None):
        """
        Apply new settings to the device
        """
        # Because these settings belong to a single known group, we can
        # construct the request for the user
        new_settings = {settings_group: request.DATA}

        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        try:
            settings = conn.set_device_settings(device_id, new_settings)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 19
0
    def post(self, request, format=None):
        """
        Provision a new device to authenticated user's Device Cloud account
        """
        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        if 'mac' in request.DATA:
            mac = request.DATA['mac']
        else:
            return Response(status.HTTP_400_BAD_REQUEST,
                            data="MAC address field required")

        try:
            resp = conn.provision_device(mac)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 20
0
    def put(self, request, device_id=None):
        # Basic sanity check on the values we're trying to send
        for group, settings in request.DATA.items():
            if not type(settings) == dict:
                return Response(status=status.HTTP_400_BAD_REQUEST)
            else:
                for key, val in settings.items():
                    if not isinstance(val, (int, float, bool, str, unicode)):
                        return Response(status=status.HTTP_400_BAD_REQUEST)

        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        try:
            settings = conn.set_device_settings(device_id,
                                                settings=request.DATA)
        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)
Ejemplo n.º 21
0
                      '=' * done,
                      ' ' * (BAR_SIZE - done),
                      "]",
                      sep="",
                      end="",
                      flush=True)
    print()


if __name__ == "__main__":
    from util import get_authenticated_session, get_credentials

    parser = ArgumentParser(
        description="""A tool to download audio from the UR Mediathek.
    To use it, you must have a credentials.json file in the current directory which contains the keys 'account' and 'password'.
    """)
    parser.add_argument(
        "url",
        help=
        "The URL of the site that shows the audio. Usually begins with https://mediathek2.uni-regensburg.de/playthis/"
    )
    parser.add_argument("--title",
                        default=None,
                        help="Overwrite the title derived from the mediathek.")

    args = parser.parse_args()

    print("Starting session")
    session = get_authenticated_session(get_credentials())
    download_audio(args.url, session, args.title)
Ejemplo n.º 22
0
        if not smtp:
            print('Cant connect to {0}'.format(eggz.get('username')))
            continue
        random_recipients = []
        all_recipients = eggz.get('recipients')
        for i in range(0, SEND_LIMIT_PER_USER):
            random_recipients.append(random.choice(all_recipients))
        for recipient in random_recipients:
            c.send_mail(smtp, recipient)
        smtp.close()


if __name__ == "__main__":
    queue = Queue()
    pool = Pool(PROCESSES, worker, (queue,))
    credentials = get_credentials()
    subject = get_subject()
    content = get_content()
    recipients = get_recipients()
    attachments = get_attachments()

    for x in range(0, HOW_MANY_LOGINS):
        credential = random.choice(credentials)
        args = {'smtp_server': credential.get('smtp_server'),
                'port': credential.get('port'),
                'username': credential.get('username'),
                'password': credential.get('password'),
                'ssl': credential.get('ssl'),
                'starttls': credential.get('starttls'),
                'subject': subject,
                'content': content,
Ejemplo n.º 23
0
    def put(self, request, device_id):

        io_command_pairs = []
        io_set_setting_pairs = []
        io_serial_data_values = []

        # Sanitize and sort inputs
        for name, value in request.DATA.iteritems():
            # May get '/' seperators, mixed case, etc. Strip out non-alphanum
            # chars, make uppercase.
            name = str(name).translate(None, self.delchars).upper()

            # Check for DIO and extract the bit position of this pin
            match = re.match(r"(DIO)(?P<bit>[0-9]+)", name)
            if match:
                bit = match.group('bit')

                # Convert boolean-ish values to True/False
                if type(value) == str or type(value) == unicode:
                    try:
                        value = bool(strtobool(value))
                    except ValueError:
                        # Try to catch "high"/"low"
                        if value.lower() == "high":
                            value = True
                        elif value.lower() == "low":
                            value = False
                        else:
                            return Response(status=status.HTTP_400_BAD_REQUEST)
                io_command_pairs.append((int(bit), value))
            # Else see if it looks like a traditional AT command
            elif len(name) == 2:  # M0, etc AT command, used for PWM setting
                # Some commands require hex strings, others integers, others
                # arbitrary text...ug
                try:
                    # Hex
                    if name in ['M0', 'M1', 'IC', 'PR', 'PD', 'DS']:
                        val_str = hex(int(value))
                    elif (name in ['LT', 'RP', 'IR', 'IF'] or
                            name.startswith('T') or name.startswith('Q')):
                        val_str = str(int(value))
                    else:
                        # Use as is
                        val_str = str(value)
                except ValueError:
                    return Response(status=status.HTTP_400_BAD_REQUEST)

                io_set_setting_pairs.append((name, val_str))
            # Handle serial output. Currently don't support sending to
            # different targets, so combine all
            # serial messages into a single payload
            elif name.startswith("SERIAL"):
                io_serial_data_values.append(value)
            else:
                # Unknown command provided
                return Response(status=status.HTTP_400_BAD_REQUEST)

        username, password, cloud_fqdn = get_credentials(request)

        if not username or not password or not cloud_fqdn:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        conn = DeviceCloudConnector(username, password, cloud_fqdn)

        resp = {}

        try:
            # For IO command, need to generate two bitmasks - enable and level
            if len(io_command_pairs):
                enable_mask = 0
                output_mask = 0
                for bit, value in io_command_pairs:
                    enable_mask |= 1 << int(bit)
                    output_mask |= value << int(bit)
                resp = conn.set_output(device_id,
                                       hex(enable_mask), hex(output_mask))

            if len(io_set_setting_pairs):
                # Because these settings belong to a single known group, we can
                # construct the request for the user
                new_settings = {'InputOutput': {}}
                for name, val in io_set_setting_pairs:
                    new_settings['InputOutput'][name] = val
                resp = conn.set_device_settings(device_id, new_settings)

            if len(io_serial_data_values):
                data = "".join(io_serial_data_values)
                data = base64.b64encode(data)
                resp = conn.send_serial_data(device_id, data)

        except HTTPError, e:
            return Response(status=e.response.status_code,
                            data=e.response.text)