Ejemplo n.º 1
0
    def list(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()

        name = self.app.pargs.name
        limit = self.app.pargs.limit
        offset = self.app.pargs.offset

        kwargs = {}
        if name:
            kwargs['name'] = name

        try:
            response = group_client.get_all_groups(enterprise_id,
                                                   limit=limit,
                                                   offset=offset,
                                                   **kwargs)
        except ApiException as e:
            self.app.log.error(f"[group-list] Failed to list groups: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        if not self.app.pargs.json:
            groups = []

            label = {
                'id': "ID",
                'name': "NAME",
                'device_count': "DEVICE COUNT"
            }

            for group in response.results:
                groups.append({
                    label['id']:
                    group.id,
                    label['name']:
                    group.name,
                    label['device_count']:
                    group.device_count if group.device_count else 0
                })
            self.app.render(f"Number of Groups: {response.count}")
            self.app.render(groups,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            groups = []
            for group in response.results:
                groups.append({
                    'id':
                    group.id,
                    'name':
                    group.name,
                    'device_count':
                    group.device_count if group.device_count else 0
                })
            self.app.render(f"Number of Groups: {response.count}")
            self.app.render(groups, format=OutputFormat.JSON.value)
Ejemplo n.º 2
0
    def delete(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()

        group_name = self.app.pargs.name
        kwargs = {'name': group_name}
        try:
            search_response = group_client.get_all_groups(enterprise_id, limit=1, offset=0, **kwargs)
            if not search_response.results or len(search_response.results) == 0:
                self.app.log.debug(f'[group-delete] Group does not exist with name {group_name}')
                self.app.render(f'Group does not exist with name {group_name}')
                return
            response = search_response.results[0]
            group_id = response.id
        except ApiException as e:
            self.app.log.error(f"[group-update] Failed to list groups: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        try:
            group_client.delete_group(group_id, enterprise_id)
            self.app.log.debug(f"[group-update] Group with name {group_name} deleted successfully")
            self.app.render(f"Group with name {group_name} deleted successfully")

            # Unset current group if matching
            group = db.get_group()
            if group and group.get('id') and group_id == group.get('id'):
                db.unset_group()
                self.app.log.debug(f'[group-update] Unset the active group {group_name}')
        except ApiException as e:
            self.app.log.error(f"[group-update] Failed to delete group: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return
Ejemplo n.º 3
0
    def delete(self):
        application_id = self.app.pargs.application_id

        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        application_client = APIClient(
            db.get_configure()).get_application_api_client()
        enterprise_id = db.get_enterprise_id()

        try:
            application_client.delete_application(application_id,
                                                  enterprise_id)
            self.app.log.debug(
                f"[application-delete] Application with id : {application_id} deleted successfully"
            )
            self.app.render(
                f"Application with id {application_id} deleted successfully")

            # Unset current application if matching
            application = db.get_application()
            if application and application.get(
                    'id') and application_id == application.get('id'):
                db.unset_application()
                self.app.log.debug(
                    f'[application-delete] Unset the active application {application_id}'
                )
        except ApiException as e:
            self.app.log.debug(
                f"[application-delete] Failed to delete an application: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return
Ejemplo n.º 4
0
    def set_active(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        device_client = APIClient(db.get_configure()).get_device_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.name:
            device_name = self.app.pargs.name
            kwargs = {'name': device_name}
            try:
                search_response = device_client.get_all_devices(enterprise_id,
                                                                limit=1,
                                                                offset=0,
                                                                **kwargs)
                if not search_response.results or len(
                        search_response.results) == 0:
                    self.app.log.debug(
                        f'[device-active] Device does not exist with name {device_name}'
                    )
                    self.app.render(
                        f'Device does not exist with name {device_name}')
                    return
                response = search_response.results[0]
                db.set_device({
                    'id': response.id,
                    'name': response.device_name
                })
            except ApiException as e:
                self.app.log.error(
                    f"[device-active] Failed to list devices: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return
        else:
            device = db.get_device()
            if device is None or device.get('name') is None:
                self.app.log.debug(
                    '[device-active] There is no active device.')
                self.app.render('There is no active device.')
                return

            device_id = device.get('id')
            try:
                response = device_client.get_device_by_id(
                    enterprise_id, device_id)
            except ApiException as e:
                self.app.log.error(
                    f"[device-active] Failed to show active device: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return

        if not self.app.pargs.json:
            renderable = self._device_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._device_basic_response(response,
                                                     OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 5
0
    def show(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        enterprise_client = APIClient(
            db.get_configure()).get_enterprise_api_client()
        enterprise_id = db.get_enterprise_id()

        try:
            response = enterprise_client.get_enterprise(enterprise_id)
        except ApiException as e:
            self.app.log.error(
                f"[enterprise-show] Failed to show details of an enterprise: {e}"
            )
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        if not self.app.pargs.json:
            renderable = self._enterprise_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._enterprise_basic_response(
                response, OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 6
0
    def show(self):
        version_id = self.app.pargs.version_id

        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        application_client = APIClient(db.get_configure()).get_application_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.application:
            application_id = self.app.pargs.application
        else:
            application = db.get_application()
            if not application or not application.get('id'):
                self.app.log.debug('[version-show] There is no active application.')
                self.app.render('There is no active application.\n')
                return

            application_id = application.get('id')

        try:
            response = application_client.get_app_version(version_id, application_id, enterprise_id)
        except ApiException as e:
            self.app.log.error(f"[version-show] Failed to show details of an version: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}\n")
            return

        if not self.app.pargs.json:
            renderable = self._version_basic_response(response)
            self.app.render(renderable, format=OutputFormat.TABULATED.value, headers="keys", tablefmt="plain")
        else:
            renderable = self._version_basic_response(response, OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 7
0
    def configure(self):
        """Configure the credentials and host endpoints of the customer"""

        # Trigger the Insert operation, if --set is given OR if the Creds DB is empty
        db = DBWrapper(self.app.creds)
        credentials = db.get_configure()

        if self.app.pargs.set or not credentials:
            environment = input("Environment name: ")
            api_key = prompt.query("Esper API Key: ")

            token_client = APIClient({'api_key': api_key, 'environment': environment}).get_token_api_client()
            try:
                response = token_client.get_token_info()
            except ApiException as e:
                self.app.log.error(f"[configure] Failed to get token info: {e}")
                if e.status == HTTPStatus.UNAUTHORIZED:
                    self.app.render("You are not authorized, invalid API Key.")
                else:
                    error_message = json.loads(e.body).get('message') if e.body and json.loads(e.body).get(
                        'message') else e.reason
                    self.app.render(f"ERROR: {error_message}")
                return

            if response:
                enterprise_id = response.enterprise
            else:
                self.app.log.info(f"[configure] API key is not associated with any enterprise.")
                self.app.render("API key is not associated with any enterprise.")
                return

            credentials = {
                "environment": environment,
                "api_key": api_key,
                "enterprise_id": enterprise_id
            }

            # set new credentials into the DB
            self.app.log.debug("Purging and inserting new credentials DB...")
            db.set_configure(credentials)

        # Trigger listing operation, if --list is given or Creds DB has content
        if self.app.pargs.list or credentials:
            validate_creds_exists(self.app)

            if not self.app.pargs.json:
                title = "TITLE"
                details = "DETAILS"
                renderable = [
                    {title: 'environment', details: credentials.get('environment')},
                    {title: 'api_key', details: credentials.get('api_key')}
                ]
                self.app.render(renderable, format=OutputFormat.TABULATED.value, headers="keys",
                                tablefmt="plain")
            else:
                renderable = {
                    'environment': credentials.get('environment'),
                    'api_key': credentials.get('api_key')
                }
                self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 8
0
    def get_groups_list(self, limit=20, offset=0):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()

        try:
            response = group_client.get_all_groups(enterprise_id,
                                                   limit=limit,
                                                   offset=offset)
        except ApiException as e:
            self.app.log.error(f"[group-list] Failed to list groups: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}\n")
            return

        groups = []
        for group in response.results:
            groups.append({
                'id':
                group.id,
                'name':
                group.name,
                'device_count':
                group.device_count if group.device_count else 0
            })
        return response.count, groups
Ejemplo n.º 9
0
    def create(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.name:
            data = DeviceGroup(name=self.app.pargs.name)
        else:
            self.app.log.debug('[group-create] name cannot be empty.')
            self.app.render('name cannot be empty.')
            return

        try:
            response = group_client.create_group(enterprise_id, data)
        except ApiException as e:
            self.app.log.error(f"[group-create] Failed to create a group: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        if not self.app.pargs.json:
            renderable = self._group_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._group_basic_response(response,
                                                    OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 10
0
    def show(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()

        group_name = self.app.pargs.group_name
        kwargs = {'name': group_name}
        try:
            search_response = group_client.get_all_groups(enterprise_id, limit=1, offset=0, **kwargs)
            response = None
            for group in search_response.results:
                if group.name == group_name:
                    response = group
                    break

            if not response:
                self.app.log.info(f'[group-show] Group does not exist with name {group_name}')
                self.app.render(f'Group does not exist with name {group_name}')
                return
        except ApiException as e:
            self.app.log.error(f"[group-show] Failed to list groups: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        if self.app.pargs.active:
            db.set_group({'id': response.id, 'name': group_name})

        if not self.app.pargs.json:
            renderable = self._group_basic_response(response)
            self.app.render(renderable, format=OutputFormat.TABULATED.value, headers="keys", tablefmt="plain")
        else:
            renderable = self._group_basic_response(response, OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 11
0
    def update(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        enterprise_client = APIClient(
            db.get_configure()).get_enterprise_api_client()
        enterprise_id = db.get_enterprise_id()
        data = EnterpriseUpdate()

        if self.app.pargs.name:
            data.name = self.app.pargs.name

        if self.app.pargs.display_name:
            data.display_name = self.app.pargs.display_name

        details = {}
        if self.app.pargs.registered_name:
            details['registered_name'] = self.app.pargs.registered_name

        if self.app.pargs.address:
            details['registered_address'] = self.app.pargs.address

        if self.app.pargs.location:
            details['location'] = self.app.pargs.location

        if self.app.pargs.zipcode:
            details['zipcode'] = self.app.pargs.zipcode

        if self.app.pargs.email:
            details['contact_email'] = self.app.pargs.email

        if self.app.pargs.contact_person:
            details['contact_person'] = self.app.pargs.contact_person

        if self.app.pargs.contact_number:
            details['contact_number'] = self.app.pargs.contact_number

        if bool(details):
            data.details = details

        try:
            response = enterprise_client.partial_update_enterprise(
                enterprise_id, data)
        except ApiException as e:
            self.app.log.error(
                f"[enterprise-update] Failed to update details of an enterprise: {e}"
            )
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        if not self.app.pargs.json:
            renderable = self._enterprise_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._enterprise_basic_response(
                response, OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 12
0
    def list(self):
        """Command to list applications"""
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        application_client = APIClient(
            db.get_configure()).get_application_api_client()
        enterprise_id = db.get_enterprise_id()

        name = self.app.pargs.name
        package = self.app.pargs.package
        limit = self.app.pargs.limit
        offset = self.app.pargs.offset

        kwargs = {}
        if name:
            kwargs['application_name'] = name

        if package:
            kwargs['package_name'] = package

        kwargs['is_hidden'] = False

        try:
            # Find applications in an enterprise
            response = application_client.get_all_applications(enterprise_id,
                                                               limit=limit,
                                                               offset=offset,
                                                               **kwargs)
        except ApiException as e:
            self.app.log.error(
                f"[application-list] Failed to list applications: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        self.app.render(f"Total Number of Applications: {response.count}")
        if not self.app.pargs.json:
            applications = []

            label = {'id': "ID", 'name': "NAME", 'package': "PACKAGE NAME"}

            for application in response.results:
                applications.append({
                    label['id']: application.id,
                    label['name']: application.application_name,
                    label['package']: application.package_name
                })
            self.app.render(applications,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            applications = []
            for application in response.results:
                applications.append({
                    'id': application.id,
                    'name': application.application_name,
                    'package': application.package_name
                })
            self.app.render(applications, format=OutputFormat.JSON.value)
Ejemplo n.º 13
0
    def set_active(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.name:
            group_name = self.app.pargs.name
            kwargs = {'name': group_name}
            try:
                search_response = group_client.get_all_groups(enterprise_id,
                                                              limit=1,
                                                              offset=0,
                                                              **kwargs)
                if not search_response.results or len(
                        search_response.results) == 0:
                    self.app.log.info(
                        f'[group-active] Group does not exist with name {group_name}'
                    )
                    self.app.render(
                        f'Group does not exist with name {group_name}')
                    return
                response = search_response.results[0]
                db.set_group({'id': response.id, 'name': group_name})
            except ApiException as e:
                self.app.log.error(
                    f"[group-active] Failed to list groups: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return
        else:
            group = db.get_group()
            if group is None or group.get('name') is None:
                self.app.log.debug('[group-active] There is no active group.')
                self.app.render('There is no active group.')
                return

            group_id = group.get('id')
            try:
                response = group_client.get_group_by_id(
                    group_id, enterprise_id)
            except ApiException as e:
                self.app.log.error(
                    f"[group-active] Failed to show active group: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return

        if not self.app.pargs.json:
            renderable = self._group_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._group_basic_response(response,
                                                    OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 14
0
    def download(self):
        version_id = self.app.pargs.version_id

        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        application_client = APIClient(
            db.get_configure()).get_application_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.application:
            application_id = self.app.pargs.application
        else:
            application = db.get_application()
            if not application or not application.get('id'):
                self.app.log.debug(
                    '[app-download] There is no active application.')
                self.app.render('There is no active application.')
                return

            application_id = application.get('id')

        if self.app.pargs.dest:
            destination = self.app.pargs.dest
        else:
            self.app.log.debug(
                '[app-download] destination file path cannot be empty.')
            self.app.render('destination file path cannot be empty.')
            return

        try:
            response = application_client.get_app_version(
                version_id, application_id, enterprise_id)
        except ApiException as e:
            self.app.log.error(
                f"[app-download] Failed to show details of an version: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        url = response.app_file
        file_size = int(response.size_in_mb * 1024 * 1024)
        first_byte = 0

        pbar = tqdm(total=file_size,
                    initial=first_byte,
                    unit='B',
                    unit_scale=True,
                    desc='Downloading......')
        req = requests.get(url, stream=True)

        with (open(destination, 'ab')) as f:
            for chunk in req.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    pbar.update(1024)
                    time.sleep(0.001)
        pbar.close()
Ejemplo n.º 15
0
    def update(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()
        data = DeviceGroupUpdate()

        group_name = self.app.pargs.name
        kwargs = {'name': group_name}
        try:
            search_response = group_client.get_all_groups(enterprise_id,
                                                          limit=1,
                                                          offset=0,
                                                          **kwargs)
            if not search_response.results or len(
                    search_response.results) == 0:
                self.app.log.debug(
                    f'[group-update] Group does not exist with name {group_name}'
                )
                self.app.render(f'Group does not exist with name {group_name}')
                return
            response = search_response.results[0]
            group_id = response.id
        except ApiException as e:
            self.app.log.error(f"[group-update] Failed to list groups: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        if self.app.pargs.new_name:
            data.name = self.app.pargs.new_name
        else:
            self.app.log.debug('[group-update] name cannot be empty.')
            self.app.render('name cannot be empty.')
            return

        try:
            response = group_client.partial_update_group(
                group_id, enterprise_id, data)
        except ApiException as e:
            self.app.log.error(
                f"[group-update] Failed to update details of a group: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        if not self.app.pargs.json:
            renderable = self._group_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._group_basic_response(response,
                                                    OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 16
0
    def validate_group_name(self, name) -> DeviceGroup:
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()

        response = group_client.get_all_groups(enterprise_id, name=name)

        if response.count > 0:
            return response.results[0]
        else:
            raise ApiException("No such Group-Name found!")
Ejemplo n.º 17
0
    def set_active(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        application_client = APIClient(
            db.get_configure()).get_application_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.id:
            application_id = self.app.pargs.id
            try:
                response = application_client.get_application(
                    application_id, enterprise_id)
                db.set_application({'id': application_id})
            except ApiException as e:
                self.app.log.error(
                    f"[application-active] Failed to show active application: {e}"
                )
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return
        else:
            application = db.get_application()
            if application is None or application.get('id') is None:
                self.app.log.debug(
                    '[application-active] There is no active application.')
                self.app.render('There is no active application.')
                return

            application_id = application.get('id')
            try:
                response = application_client.get_application(
                    application_id, enterprise_id)
                db.set_application({'id': application_id})
            except ApiException as e:
                self.app.log.error(
                    f"[application-active] Failed to show active application: {e}"
                )
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return

        if not self.app.pargs.json:
            renderable = self._application_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._application_basic_response(
                response, OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 18
0
    def show(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        device_name = self.app.pargs.device_name

        device_client = APIClient(db.get_configure()).get_device_api_client()
        enterprise_id = db.get_enterprise_id()

        kwargs = {'name': device_name}
        try:
            search_response = device_client.get_all_devices(enterprise_id,
                                                            limit=1,
                                                            offset=0,
                                                            **kwargs)
            if not search_response.results or len(
                    search_response.results) == 0:
                self.app.log.debug(
                    f'[device-show] Device does not exist with name {device_name}'
                )
                self.app.render(
                    f'Device does not exist with name {device_name}\n')
                return
            response = search_response.results[0]
        except ApiException as e:
            self.app.log.error(f"[device-show] Failed to list devices: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}\n")
            return

        if self.app.pargs.active:
            name, _ = self.get_name_and_tags_from_device(response)
            db.set_device({'id': response.id, 'name': name})

        if not self.app.pargs.json:
            renderable = self._device_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._device_basic_response(response,
                                                     OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 19
0
    def _fetch_device_by_name(self, name: str) -> str:
        """
        Fetch the device entry by its device-name

        :param name: Device Name
        :return: uuid str - Device ID as UUID string
        """
        db = DBWrapper(self.app.creds)
        device_name = name

        device_client = APIClient(db.get_configure()).get_device_api_client()
        enterprise_id = db.get_enterprise_id()

        kwargs = {'name': device_name}

        search_response = device_client.get_all_devices(enterprise_id, limit=1, offset=0, **kwargs)
        if not search_response.results or len(search_response.results) == 0:
            raise SecureADBWorkflowError(f'Device does not exist with name {device_name}')

        return search_response.results[0].id
Ejemplo n.º 20
0
    def lock(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        command_client = APIClient(db.get_configure()).get_command_api_client()
        enterprise_id = db.get_enterprise_id()
        device_client = APIClient(db.get_configure()).get_device_api_client()

        if self.app.pargs.device:
            device_name = self.app.pargs.device
            kwargs = {'name': device_name}
            try:
                search_response = device_client.get_all_devices(enterprise_id,
                                                                limit=1,
                                                                offset=0,
                                                                **kwargs)
                if not search_response.results or len(
                        search_response.results) == 0:
                    self.app.log.debug(
                        f'[device-command-lock] Device does not exist with name {device_name}'
                    )
                    self.app.render(
                        f'Device does not exist with name {device_name}')
                    return
                response = search_response.results[0]
                device_id = response.id
            except ApiException as e:
                self.app.log.error(
                    f"[device-command-lock] Failed to list devices: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return
        else:
            device = db.get_device()
            if not device or not device.get('id'):
                self.app.log.debug(
                    '[device-command-lock] There is no active device.')
                self.app.render('There is no active device.')
                return

            device_id = device.get('id')

        command_request = CommandRequest(command=DeviceCommandEnum.LOCK.name)
        try:
            response = command_client.run_command(enterprise_id, device_id,
                                                  command_request)
        except ApiException as e:
            self.app.log.error(
                f"[device-command-lock] Failed to fire the lock command: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        if not self.app.pargs.json:
            renderable = self._command_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._command_basic_response(response,
                                                      OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 21
0
    def wipe(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        command_client = APIClient(db.get_configure()).get_command_api_client()
        enterprise_id = db.get_enterprise_id()
        device_client = APIClient(db.get_configure()).get_device_api_client()

        if self.app.pargs.device:
            device_name = self.app.pargs.device
            kwargs = {'name': device_name}
            try:
                search_response = device_client.get_all_devices(enterprise_id, limit=1, offset=0, **kwargs)
                if not search_response.results or len(search_response.results) == 0:
                    self.app.log.debug(f'[device-command-wipe] Device does not exist with name {device_name}')
                    self.app.render(f'Device does not exist with name {device_name}\n')
                    return
                response = search_response.results[0]
                device_id = response.id
            except ApiException as e:
                self.app.log.error(f"[device-command-wipe] Failed to list devices: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}\n")
                return
        else:
            device = db.get_device()
            if not device or not device.get('id'):
                self.app.log.debug('[device-command-wipe] There is no active device.')
                self.app.render('There is no active device.\n')
                return

            device_id = device.get('id')

        external_storage = self.app.pargs.external_storage
        frp = self.app.pargs.frp

        if external_storage is None:
            self.app.log.info('[device-command-wipe] External storage value is empty')
            self.app.render('External storage value is empty\n')

        if frp is None:
            self.app.log.info('[device-command-wipe] Factory reset production value is empty')
            self.app.render('Factory reset production value is empty\n')

        command_request = CommandRequest(command_args={"wipe_external_storage": external_storage, 'wipe_FRP': frp},
                                         command=DeviceCommandEnum.WIPE.name)
        try:
            response = command_client.run_command(enterprise_id, device_id, command_request)
        except ApiException as e:
            self.app.log.error(f"[device-command-wipe] Failed to fire the wipe command: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}\n")
            return

        if not self.app.pargs.json:
            renderable = self._command_basic_response(response)
            self.app.render(renderable, format=OutputFormat.TABULATED.value, headers="keys", tablefmt="plain")
        else:
            renderable = self._command_basic_response(response, OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 22
0
    def delete(self):
        version_id = self.app.pargs.version_id

        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        application_client = APIClient(db.get_configure()).get_application_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.application:
            application_id = self.app.pargs.application
        else:
            application = db.get_application()
            if not application or not application.get('id'):
                self.app.log.debug('[version-delete] There is no active application.')
                self.app.render('There is no active application.\n')
                return

            application_id = application.get('id')

        try:
            application_client.delete_app_version(version_id, application_id, enterprise_id)
            self.app.log.debug(f"[version-delete] Version with id : {version_id} deleted successfully")
            self.app.render(f"Version with id {version_id} deleted successfully\n")
        except ApiException as e:
            self.app.log.error(f"[version-delete] Failed to delete a version: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}\n")
            return

        # Unset current application if matching
        try:
            application_client.get_application(application_id, enterprise_id)
        except ApiException as e:
            if e.status == HTTPStatus.NOT_FOUND:
                application = db.get_application()
                if application and application.get('id') and application_id == application.get('id'):
                    db.unset_application()
                    self.app.log.debug(f'[version-delete] Unset the active application {application_id}')
            else:
                self.app.log.debug(f"[version-delete] Failed to get an application when deleting a version: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}\n")
Ejemplo n.º 23
0
    def upload(self):
        application_file = self.app.pargs.application_file

        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        application_client = APIClient(
            db.get_configure()).get_application_api_client()
        enterprise_id = db.get_enterprise_id()

        try:
            filesize = os.path.getsize(application_file)
            random_no = random.randint(1, 50)
            with tqdm(total=int(filesize),
                      unit='B',
                      unit_scale=True,
                      miniters=1,
                      desc='Uploading......',
                      unit_divisor=1024) as pbar:
                for i in range(100):
                    if i == random_no:
                        response = application_client.upload(
                            enterprise_id, application_file)

                    time.sleep(0.07)
                    pbar.set_postfix(file=Path(application_file).name,
                                     refresh=False)
                    pbar.update(int(filesize / 100))

            application = response.application
        except ApiException as e:
            self.app.log.error(
                f"[application-upload] Failed to upload an application: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        valid_keys = [
            'id', 'application_name', 'package_name', 'developer', 'category',
            'content_rating', 'compatibility'
        ]

        if not self.app.pargs.json:
            title = "TITLE"
            details = "DETAILS"
            renderable = [{
                title: k,
                details: v
            } for k, v in application.to_dict().items() if k in valid_keys]

            if application and application.versions and len(
                    application.versions) > 0:
                version = application.versions[0]
                renderable.append({title: 'version_id', details: version.id})
                renderable.append({
                    title: 'version_code',
                    details: version.version_code
                })
                renderable.append({
                    title: 'build_number',
                    details: version.build_number
                })

            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = {
                k: v
                for k, v in application.to_dict().items() if k in valid_keys
            }
            if application and application.versions and len(
                    application.versions) > 0:
                version = application.versions[0]
                renderable['version_id'] = version.id
                renderable['version_code'] = version.version_code
                renderable['build_number'] = version.build_number

            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 24
0
    def list(self):
        """Command to list application versions"""
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        application_client = APIClient(db.get_configure()).get_application_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.application:
            application_id = self.app.pargs.application
        else:
            application = db.get_application()
            if not application or not application.get('id'):
                self.app.log.debug('[version-list] There is no active application.')
                self.app.render('There is no active application.\n')
                return

            application_id = application.get('id')

        version_code = self.app.pargs.version_code
        build_number = self.app.pargs.build_number
        limit = self.app.pargs.limit
        offset = self.app.pargs.offset

        kwargs = {}
        if version_code:
            kwargs['version_code'] = version_code

        if build_number:
            kwargs['build_number'] = build_number

        try:
            # Find application versions in an enterprise
            response = application_client.get_app_versions(application_id, enterprise_id, limit=limit, offset=offset,
                                                           **kwargs)
        except ApiException as e:
            self.app.log.error(f"[version-list] Failed to list applications: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}\n")
            return

        self.app.render(f"Total Number of Versions: {response.count}")
        if not self.app.pargs.json:
            versions = []

            label = {
                'id': "ID",
                'version_code': "VERSION CODE",
                'build_number': "BUILD NUMBER",
                'size_in_mb': "SIZE IN MB",
                'release_track': "RELEASE TRACK",
                'installed_count': "INSTALLED COUNT",
            }

            for version in response.results:
                versions.append(
                    {
                        label['id']: version.id,
                        label['version_code']: version.version_code,
                        label['build_number']: version.build_number,
                        label['size_in_mb']: version.size_in_mb,
                        label['release_track']: version.release_track,
                        label['installed_count']: version.installed_count if version.installed_count else 0
                    }
                )
            self.app.render(versions, format=OutputFormat.TABULATED.value, headers="keys", tablefmt="plain")
        else:
            versions = []
            for version in response.results:
                versions.append(
                    {
                        'id': version.id,
                        'version_code': version.version_code,
                        'build_number': version.build_number,
                        'size_in_mb': version.size_in_mb,
                        'release_track': version.release_track,
                        'installed_count': version.installed_count if version.installed_count else 0
                    }
                )
            self.app.render(versions, format=OutputFormat.JSON.value)
Ejemplo n.º 25
0
    def latest(self):
        """Command to list status"""
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        device_client = APIClient(db.get_configure()).get_device_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.device:
            device_name = self.app.pargs.device
            kwargs = {'name': device_name}
            try:
                search_response = device_client.get_all_devices(enterprise_id,
                                                                limit=1,
                                                                offset=0,
                                                                **kwargs)
                if not search_response.results or len(
                        search_response.results) == 0:
                    self.app.log.debug(
                        f'[status-latest] Device does not exist with name {device_name}'
                    )
                    self.app.render(
                        f'Device does not exist with name {device_name}')
                    return
                response = search_response.results[0]
                device_id = response.id
            except ApiException as e:
                self.app.log.error(
                    f"[status-latest] Failed to list devices: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return
        else:
            device = db.get_device()
            if not device or not device.get('id'):
                self.app.log.debug(
                    '[status-latest] There is no active device.')
                self.app.render('There is no active device.')
                return

            device_id = device.get('id')

        try:
            response = device_client.get_device_event(enterprise_id,
                                                      device_id,
                                                      latest_event=1)
        except ApiException as e:
            self.app.log.error(
                f"[status-latest] Failed to get latest device status: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        battery_level = None
        battery_temp = None
        data_download = None
        data_upload = None
        memory_storage = None
        memory_ram = None
        link_speed = None
        signal_strength = None

        if response.results and len(response.results) > 0:
            data = literal_eval(response.results[0].data)
            if data.get("powerManagementEvent") and data.get(
                    "powerManagementEvent").get("batteryStatus"):
                if data.get("powerManagementEvent").get("batteryStatus").get(
                        "batteryLevel"):
                    battery_level = data.get("powerManagementEvent").get(
                        "batteryStatus").get("batteryLevel")

                if data.get("powerManagementEvent").get("batteryStatus").get(
                        "batteryTemperature"):
                    battery_temp = data.get("powerManagementEvent").get(
                        "batteryStatus").get("batteryTemperature")

            if data.get("dataUsageStats"):
                if data.get("dataUsageStats").get("totalDataDownload"):
                    data_download = data.get("dataUsageStats").get(
                        "totalDataDownload")

                if data.get("dataUsageStats").get("totalDataUpload"):
                    data_upload = data.get("dataUsageStats").get(
                        "totalDataUpload")

            if data.get("memoryEvents") and len(data.get("memoryEvents")) > 1 and \
                    data.get("memoryEvents")[1].get("countInMb"):
                memory_storage = data.get("memoryEvents")[1].get("countInMb")

            if data.get("memoryEvents") and len(data.get("memoryEvents")) > 0 and \
                    data.get("memoryEvents")[0].get("countInMb"):
                memory_ram = data.get("memoryEvents")[0].get("countInMb")

            if data.get("networkEvent") and data.get("networkEvent").get(
                    "wifiNetworkInfo"):
                if data.get("networkEvent").get("wifiNetworkInfo").get(
                        "linkSpeed"):
                    link_speed = data.get("networkEvent").get(
                        "wifiNetworkInfo").get("linkSpeed")

                if data.get("networkEvent").get("wifiNetworkInfo").get(
                        "signalStrength"):
                    signal_strength = data.get("networkEvent").get(
                        "wifiNetworkInfo").get("signalStrength")

        if not self.app.pargs.json:
            title = "TITLE"
            details = "DETAILS"
            renderable = [{
                title: 'battery_level',
                details: battery_level
            }, {
                title: 'battery_temperature',
                details: battery_temp
            }, {
                title: 'data_download',
                details: data_download
            }, {
                title: 'data_upload',
                details: data_upload
            }, {
                title: 'memory_storage',
                details: memory_storage
            }, {
                title: 'memory_ram',
                details: memory_ram
            }, {
                title: 'link_speed',
                details: link_speed
            }, {
                title: 'signal_strength',
                details: signal_strength
            }]

            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = {
                'battery_level': battery_level,
                'battery_temperature': battery_temp,
                'data_download': data_download,
                'data_upload': data_upload,
                'memory_storage': memory_storage,
                'memory_ram': memory_ram,
                'link_speed': link_speed,
                'signal_strength': signal_strength
            }
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 26
0
    def list(self):
        """Command to list devices"""
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        device_client = APIClient(db.get_configure()).get_device_api_client()
        enterprise_id = db.get_enterprise_id()

        state = self.app.pargs.state
        name = self.app.pargs.name
        group_name = self.app.pargs.group
        imei = self.app.pargs.imei
        brand = self.app.pargs.brand
        gms = self.app.pargs.gms
        limit = self.app.pargs.limit
        offset = self.app.pargs.offset

        kwargs = {}
        if state:
            kwargs['state'] = DeviceState[state.upper()].value

        if name:
            kwargs['name'] = name

        if group_name:
            kw = {'name': group_name}
            group_id = None
            try:
                group_client = APIClient(
                    db.get_configure()).get_group_api_client()
                search_response = group_client.get_all_groups(enterprise_id,
                                                              limit=1,
                                                              offset=0,
                                                              **kw)
                for group in search_response.results:
                    if group.name == group_name:
                        group_id = group.id
                        break
            except ApiException as e:
                self.app.log.error(f"[device-list] Failed to list groups: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return

            if not group_id:
                group_id = str(uuid.uuid4())  # random uuid

            kwargs['group'] = group_id

        if imei:
            kwargs['imei'] = imei

        if brand:
            kwargs['brand'] = brand

        if gms:
            kwargs['is_gms'] = gms

        try:
            # Find devices in an enterprise
            response = device_client.get_all_devices(enterprise_id,
                                                     limit=limit,
                                                     offset=offset,
                                                     **kwargs)
        except ApiException as e:
            self.app.log.error(f"[device-list] Failed to list devices: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        self.app.render(f"Number of Devices: {response.count}")
        if not self.app.pargs.json:
            devices = []

            label = {
                'id': "ID",
                'name': "NAME",
                'model': "MODEL",
                'state': "CURRENT STATE"
            }

            for device in response.results:
                current_state = DeviceState(device.status).name
                devices.append({
                    label['id']:
                    device.id,
                    label['name']:
                    device.device_name,
                    label['model']:
                    device.hardware_info.get("manufacturer"),
                    label['state']:
                    current_state
                })
            self.app.render(devices,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            devices = []
            for device in response.results:
                current_state = DeviceState(device.status).name
                devices.append({
                    'id':
                    device.id,
                    'device':
                    device.device_name,
                    'model':
                    device.hardware_info.get("manufacturer"),
                    'state':
                    current_state
                })
            self.app.render(devices, format=OutputFormat.JSON.value)
Ejemplo n.º 27
0
    def devices(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        device_client = APIClient(db.get_configure()).get_device_api_client()
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.group:
            group_name = self.app.pargs.group
            kwargs = {'name': group_name}
            try:
                search_response = group_client.get_all_groups(enterprise_id,
                                                              limit=1,
                                                              offset=0,
                                                              **kwargs)
                if not search_response.results or len(
                        search_response.results) == 0:
                    self.app.log.debug(
                        f'[group-devices] Group does not exist with name {group_name}'
                    )
                    self.app.render(
                        f'Group does not exist with name {group_name}')
                    return
                response = search_response.results[0]
                group_id = response.id
            except ApiException as e:
                self.app.log.error(
                    f"[group-devices] Failed to list groups: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return

        else:
            group = db.get_group()
            if group is None or group.get('name') is None:
                self.app.log.debug('[group-devices] There is no active group.')
                self.app.render('There is no active group.')
                return

            group_id = group.get('id')

        limit = self.app.pargs.limit
        offset = self.app.pargs.offset

        try:
            response = device_client.get_all_devices(enterprise_id,
                                                     group=group_id,
                                                     limit=limit,
                                                     offset=offset)
        except ApiException as e:
            self.app.log.error(
                f"[group-devices] Failed to list group devices: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        self.app.render(f"Number of Devices: {response.count}")
        if not self.app.pargs.json:
            devices = []

            label = {
                'id': "ID",
                'name': "NAME",
                'model': "MODEL",
                'state': "CURRENT STATE"
            }

            for device in response.results:
                devices.append({
                    label['id']:
                    device.id,
                    label['name']:
                    device.device_name,
                    label['model']:
                    device.hardware_info.get("manufacturer"),
                    label['state']:
                    DeviceState(device.status).name
                })
            self.app.render(devices,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            devices = []
            for device in response.results:
                devices.append({
                    'id':
                    device.id,
                    'device':
                    device.device_name,
                    'model':
                    device.hardware_info.get("manufacturer"),
                    'state':
                    DeviceState(device.status).name
                })
            self.app.render(devices, format=OutputFormat.JSON.value)
Ejemplo n.º 28
0
    def remove(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        group_client = APIClient(db.get_configure()).get_group_api_client()
        enterprise_id = db.get_enterprise_id()
        data = DeviceGroupUpdate()

        if self.app.pargs.group:
            group_name = self.app.pargs.group
            kwargs = {'name': group_name}
            try:
                search_response = group_client.get_all_groups(enterprise_id,
                                                              limit=1,
                                                              offset=0,
                                                              **kwargs)
                if not search_response.results or len(
                        search_response.results) == 0:
                    self.app.log.debug(
                        f'[group-remove] Group does not exist with name {group_name}'
                    )
                    self.app.render(
                        f'Group does not exist with name {group_name}')
                    return
                response = search_response.results[0]
                group_id = response.id
            except ApiException as e:
                self.app.log.error(
                    f"[group-remove] Failed to list groups: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return

        else:
            group = db.get_group()
            if group is None or group.get('name') is None:
                self.app.log.debug('[group-remove] There is no active group.')
                self.app.render('There is no active group.')
                return

            group_id = group.get('id')

        devices = self.app.pargs.devices
        if not devices or len(devices) == 0:
            self.app.log.debug('[group-remove] devices cannot be empty.')
            self.app.render('devices cannot be empty.')
            return

        device_client = APIClient(db.get_configure()).get_device_api_client()
        request_device_ids = []
        for device_name in devices:
            kwargs = {'name': device_name}
            try:
                search_response = device_client.get_all_devices(enterprise_id,
                                                                limit=1,
                                                                offset=0,
                                                                **kwargs)
                if not search_response.results or len(
                        search_response.results) == 0:
                    self.app.log.debug(
                        f'[group-remove] Device does not exist with name {device_name}'
                    )
                    self.app.render(
                        f'Device does not exist with name {device_name}')
                    return
                response = search_response.results[0]
                request_device_ids.append(response.id)
            except ApiException as e:
                self.app.log.error(f"Failed to list devices: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return

        device_client = APIClient(db.get_configure()).get_device_api_client()
        current_device_ids = self._get_group_device_ids(
            device_client, enterprise_id, group_id)
        if current_device_ids is None:
            return

        latest_devices = list(
            set(current_device_ids) - set(request_device_ids))
        data.device_ids = latest_devices
        try:
            response = group_client.partial_update_group(
                group_id, enterprise_id, data)
        except ApiException as e:
            self.app.log.error(
                f"[group-remove] Failed to remove device from group: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        if not self.app.pargs.json:
            renderable = self._group_basic_response(response)
            self.app.render(renderable,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            renderable = self._group_basic_response(response,
                                                    OutputFormat.JSON)
            self.app.render(renderable, format=OutputFormat.JSON.value)
Ejemplo n.º 29
0
    def get_data(self):
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        environment = db.get_configure().get("environment")
        enterprise_id = db.get_enterprise_id()
        device_client = APIClient(db.get_configure()).get_device_api_client()

        device_name = self.app.pargs.device_name
        if not device_name:
            self.app.render(
                f'No device specified. Use the -d, --device option to specify a device\n'
            )
            return
        kwargs = {'name': device_name}

        # Fetch device id from device name supplied as parameter
        try:
            response = device_client.get_all_devices(enterprise_id,
                                                     limit=1,
                                                     offset=0,
                                                     **kwargs)
            if not response.results or len(response.results) == 0:
                self.app.log.debug(
                    f'[device-show] Device does not exist with name {device_name}'
                )
                self.app.render(
                    f'Device does not exist with name {device_name}\n')
                return
            device_id = response.results[0].id
        except ApiException as e:
            self.app.log.error(
                f"[device-show] Failed to fetch telemetry info for device {device_name}: {e}"
            )
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}\n")
            return

        last = self.app.pargs.last
        period = self.app.pargs.period
        statistic = self.app.pargs.statistic

        from_time = self.app.pargs.from_time
        if last:
            current_date = datetime.now()
            if period == 'hour':
                from_time = current_date - timedelta(hours=int(last))
            elif period == 'day':
                from_time = current_date - timedelta(days=int(last))
            else:
                from_time = current_date.replace(
                    month=datetime.now().date().month -
                    int(last))  #- timedelta(days=int(last))
        from_time = str(from_time).replace(' ', 'T')
        if '.' not in from_time:
            from_time = from_time + '.0000Z'
        if 'Z' not in from_time:
            from_time = from_time + 'Z'
        to_time = self.app.pargs.to_time
        if last:
            to_time = datetime.now()
        to_time = str(to_time).replace(' ', 'T')
        if '.' not in to_time:
            to_time = to_time + '.0000Z'
        if 'Z' not in to_time:
            to_time = to_time + 'Z'

        if '-' not in self.app.pargs.metric:
            self.app.render(
                "ERROR: Metric must be of format {category}-{metric name}\n")
            return

        category, metric = self.app.pargs.metric.split('-')
        # Calling Telemetry Graphs API
        url = get_telemetry_url(environment, enterprise_id, device_id,
                                category, metric, from_time, to_time, period,
                                statistic)

        api_key = db.get_configure().get("api_key")
        response = requests.get(url,
                                headers={'Authorization': f'Bearer {api_key}'})

        response_json = response.json()
        if response.status_code != 200:
            if response_json.get('meta', {}).get('non_field_errors'):
                error_list = response_json.get('meta',
                                               {}).get('non_field_errors')
                self.app.render(f"ERRORS: {error_list}\n")
            elif response_json.get('errors'):
                self.app.render(f"ERRORS: {response_json.get('errors')}\n")
            else:
                #print(response_json, from_time, to_time)
                self.app.render(f"ERROR: Unknown error occurred\n")
            return

        data = response.json().get('data', {})

        # Rendering table with populated values
        label = {'time': "Time", 'value': "Value"}

        render_data = []
        for d in data:
            render_data.append({label['time']: d['x'], label['value']: d['y']})
        if len(render_data) == 0:
            self.app.render(
                f"No telemetry data for device {device_name} found between time range\n"
            )
            return
        self.app.render(f"Telemetry data for device {device_name}")
        self.app.render(render_data,
                        format=OutputFormat.TABULATED.value,
                        headers="keys",
                        tablefmt="plain")
Ejemplo n.º 30
0
    def list(self):
        """Command to list installs"""
        validate_creds_exists(self.app)
        db = DBWrapper(self.app.creds)
        device_client = APIClient(db.get_configure()).get_device_api_client()
        enterprise_id = db.get_enterprise_id()

        if self.app.pargs.device:
            device_name = self.app.pargs.device
            kwargs = {'name': device_name}
            try:
                search_response = device_client.get_all_devices(enterprise_id,
                                                                limit=1,
                                                                offset=0,
                                                                **kwargs)
                if not search_response.results or len(
                        search_response.results) == 0:
                    self.app.log.debug(
                        f'[installs-list] Device does not exist with name {device_name}'
                    )
                    self.app.render(
                        f'Device does not exist with name {device_name}')
                    return
                response = search_response.results[0]
                device_id = response.id
            except ApiException as e:
                self.app.log.error(
                    f"[installs-list] Failed to list devices: {e}")
                self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
                return
        else:
            device = db.get_device()
            if not device or not device.get('id'):
                self.app.log.debug(
                    '[installs-list] There is no active device.')
                self.app.render('There is no active device.')
                return

            device_id = device.get('id')

        app_name = self.app.pargs.appname
        package_name = self.app.pargs.package
        install_state = self.app.pargs.state
        limit = self.app.pargs.limit
        offset = self.app.pargs.offset

        kwargs = {}
        if app_name:
            kwargs['application_name'] = app_name

        if package_name:
            kwargs['package_name'] = package_name

        if install_state:
            kwargs['install_state'] = install_state

        try:
            response = device_client.get_app_installs(enterprise_id,
                                                      device_id,
                                                      limit=limit,
                                                      offset=offset,
                                                      **kwargs)
        except ApiException as e:
            self.app.log.error(f"[installs-list] Failed to list installs: {e}")
            self.app.render(f"ERROR: {parse_error_message(self.app, e)}")
            return

        self.app.render(f"Total Number of Installs: {response.count}")
        if not self.app.pargs.json:
            installs = []

            label = {
                'id': "ID",
                'application_name': "APPLICATION",
                'package_name': "PACKAGE",
                'version_code': "VERSION",
                'install_state': "STATE"
            }

            for install in response.results:
                installs.append({
                    label['id']:
                    install.id,
                    label['application_name']:
                    install.application.application_name,
                    label['package_name']:
                    install.application.package_name,
                    label['version_code']:
                    install.application.version.version_code,
                    label['install_state']:
                    install.install_state
                })
            self.app.render(installs,
                            format=OutputFormat.TABULATED.value,
                            headers="keys",
                            tablefmt="plain")
        else:
            installs = []
            for install in response.results:
                installs.append({
                    'id': install.id,
                    'application_name': install.application.application_name,
                    'package_name': install.application.package_name,
                    'version_code': install.application.version.version_code,
                    'install_state': install.install_state
                })
            self.app.render(installs, format=OutputFormat.JSON.value)