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 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.º 3
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.º 4
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.º 5
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.º 6
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.º 7
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.º 8
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.º 9
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.º 10
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)