示例#1
0
文件: __init__.py 项目: jkerihuel/mmc
class exportedReport(object):

    def __init__(self):
        self.db = Inventory()
        self.ctx = SecurityContext()
        self.ctx.userid = "root"

    def _getEntitiesIds(self, entities=[]):
        """
        Return a list of entities ids for the request

        @param entitites: a list of entities uuids
        @return: list of entities ids
        """
        # Be sure to get all entities
        self.ctx.locations = None
        if hasattr(self.ctx, 'locationsid'):
            del self.ctx.locationsid
        # get all entities uuids for the current user
        if entities == []:
            entities = [entity.toH()['uuid'] for entity in self.db.getAllEntities(self.ctx)]
        return [fromUUID(str(entity)) for entity in entities]

    def _getComputerCountByOSes(self, entities, os_names, results, oper=operator.add):
        os_results = []
        if os_names:
            for entity in self._getEntitiesIds(entities):
                self.ctx.locationsid = [entity]
                os_count = self.db.getMachineByOsLike(self.ctx, os_names, count=1)
                os_results.append({'entity_id': entity, 'value': os_count})
        for os_result in os_results:
            count = False
            for result in results:
                if os_result['entity_id'] == result['entity_id']:
                    if result['value'] is not None and os_result['value'] is not None:
			result['value'] = oper(result['value'], os_result['value'])
		    else:
			result['value'] = 0
                    count = True
            if not count and oper == operator.add:
                results.append(os_result)
        return results

    def getComputerCountByOSes(self, entities, os_names, exclude_names=[]):
        """
        Get computer count for os_names

        @param os_names: list of OS names to count
        @param exclude_names: list of OS names to exclude

        @return: count of machines by entity
        """
        if isinstance(os_names, basestring):
            os_names = [os_names]

        os_names = [os_name.replace('*', '%') for os_name in os_names]
        exclude_names = [exclude_name.replace('*', '%') for exclude_name in exclude_names]

        results = self._getComputerCountByOSes(entities, os_names, [])
        results = self._getComputerCountByOSes(entities, exclude_names,
                                               results, operator.sub)

        return results

    def getComputerCountByTypes(self, entities, types):
        """
        Get computer count for types

        @param types: list of computer types to count

        @return: count of machines by entity
        """
        if isinstance(types, basestring):
            types = [types]
        types = [type.replace("*", "%") for type in types]

        results = []
        type_results = []
        if types:
            for entity in self._getEntitiesIds(entities):
                self.ctx.locationsid = [entity]
                type_count = self.db.getMachineByType(self.ctx, types, count=1)
                type_results.append({'entity_id': entity, 'value': type_count})
        for type_result in type_results:
            count = False
            for result in results:
                if type_result['entity_id'] == result['entity_id']:
                    result['value'] += type_result['value']
                    count = True
            if not count:
                results.append(type_result)
        return results

    def getComputerCountByState(self, entities, state):
        result = []
        state = state.replace("*", "%")
        for entity in self._getEntitiesIds(entities):
            self.ctx.locationsid = [entity]
            state_count = self.db.getMachineByState(self.ctx, state, count=1)
            result.append({'entity_id': entity, 'value': state_count})
        return result

    def _constructSoftwareTuple(self, soft):
        """
        @param soft: string or dict
        @return: software tuple:
            (name, version, vendor)
        """
        name = version = vendor = None
        if soft and isinstance(soft, basestring):
            name = soft.replace('*', '%')
        elif type(soft) == dict:
            name = soft.get('name', None)
            if name:
                name = name.replace('*', '%')
            version = soft.get('version', None)
            if version:
                version = version.replace('*', '%')
            vendor = soft.get('vendor', None)
            if vendor:
                vendor = vendor.replace('*', '%')
        if name is None:
            logger.error("Missing software name")
            return None
        return (name, version, vendor)

    def _constructSoftwaresList(self, softs):
        """
        @param softs: dict, string, list of mixed string and dict
        @return: list of software tuples
            [(name, version, vendor),
             (name, version, vendor),
             (name, version, vendor),
             ...]
        """
        if type(softs) == list:
            return [self._constructSoftwareTuple(soft) for soft in softs]
        if softs:
            return [self._constructSoftwareTuple(softs)]
        return []

    def _getComputerCountBySoftwares(self, entities, softs, results, oper=operator.add):
        soft_results= []
        if softs:
            for entity in self._getEntitiesIds(entities):
                self.ctx.locationsid = [entity]
                soft_count = self.db.getAllSoftwaresImproved(self.ctx, [soft[0] for soft in softs],
                        version=[soft[1] for soft in softs],
                        vendor=[soft[2] for soft in softs],
                        count=1)
                soft_results.append({'entity_id': entity, 'value': soft_count})
        for soft_result in soft_results:
            count = False
            for result in results:
                if soft_result['entity_id'] == result['entity_id']:
		    if result['value'] is not None and soft_result['value'] is not None:
                    	result['value'] = oper(result['value'], soft_result['value'])
		    else:
			result['value'] = 0
                    count = True
            if not count and oper == operator.add:
                results.append(soft_result)
        return results

    def getComputerCountBySoftwares(self, entities, soft_names, exclude_names={}):
        """
        Get computer count for software names

        @param soft_names: list of softwares to count
        @param exclude_names: list of softwares to exclude

        soft_names can be a simple string (ie: 'Mozilla Firefox*')
        soft_names can be a dict (ie: {'name': 'Mozilla Firefox', 'version': '24.0', vendor:'Mozilla'})
        soft_names can be a list of mixed dict and strings

        Same for exclude_names

        @return: count of machines by entity
        """
        softs = self._constructSoftwaresList(soft_names)
        excludes = self._constructSoftwaresList(exclude_names)
        results = self._getComputerCountBySoftwares(entities, softs, [])
        results = self._getComputerCountBySoftwares(entities, excludes,
                                                    results, operator.sub)
        return results
示例#2
0
class exportedReport(object):
    def __init__(self):
        self.db = Inventory()
        self.ctx = SecurityContext()
        self.ctx.userid = "root"

    def _getEntitiesIds(self, entities=[]):
        """
        Return a list of entities ids for the request

        @param entitites: a list of entities uuids
        @return: list of entities ids
        """
        # Be sure to get all entities
        self.ctx.locations = None
        if hasattr(self.ctx, 'locationsid'):
            del self.ctx.locationsid
        # get all entities uuids for the current user
        if entities == []:
            entities = [
                entity.toH()['uuid']
                for entity in self.db.getAllEntities(self.ctx)
            ]
        return [fromUUID(str(entity)) for entity in entities]

    def _getComputerCountByOSes(self,
                                entities,
                                os_names,
                                results,
                                oper=operator.add):
        os_results = []
        if os_names:
            for entity in self._getEntitiesIds(entities):
                self.ctx.locationsid = [entity]
                os_count = self.db.getMachineByOsLike(self.ctx,
                                                      os_names,
                                                      count=1)
                os_results.append({'entity_id': entity, 'value': os_count})
        for os_result in os_results:
            count = False
            for result in results:
                if os_result['entity_id'] == result['entity_id']:
                    if result['value'] is not None and os_result[
                            'value'] is not None:
                        result['value'] = oper(result['value'],
                                               os_result['value'])
                    else:
                        result['value'] = 0
                    count = True
            if not count and oper == operator.add:
                results.append(os_result)
        return results

    def getComputerCountByOSes(self, entities, os_names, exclude_names=[]):
        """
        Get computer count for os_names

        @param os_names: list of OS names to count
        @param exclude_names: list of OS names to exclude

        @return: count of machines by entity
        """
        if isinstance(os_names, basestring):
            os_names = [os_names]

        os_names = [os_name.replace('*', '%') for os_name in os_names]
        exclude_names = [
            exclude_name.replace('*', '%') for exclude_name in exclude_names
        ]

        results = self._getComputerCountByOSes(entities, os_names, [])
        results = self._getComputerCountByOSes(entities, exclude_names,
                                               results, operator.sub)

        return results

    def getAllComputerCount(self, entities):
        """
        Count all computers by entity
        """
        results = []
        for entity in self._getEntitiesIds(entities):
            self.ctx.locationsid = [entity]
            count = self.db.getAllComputers(self.ctx, count=1)
            results.append({'entity_id': entity, 'value': count})
        return results

    def getComputerCountByTypes(self, entities, types):
        """
        Get computer count for types

        @param types: list of computer types to count

        @return: count of machines by entity
        """
        if isinstance(types, basestring):
            types = [types]
        types = [type.replace("*", "%") for type in types]

        results = []
        if types:
            for entity in self._getEntitiesIds(entities):
                self.ctx.locationsid = [entity]
                type_count = self.db.getMachineByType(self.ctx, types, count=1)
                results.append({'entity_id': entity, 'value': type_count})
        return results

    def getComputerCountByState(self, entities, state):
        result = []
        state = state.replace("*", "%")
        for entity in self._getEntitiesIds(entities):
            self.ctx.locationsid = [entity]
            state_count = self.db.getMachineByState(self.ctx, state, count=1)
            result.append({'entity_id': entity, 'value': state_count})
        return result

    def _constructSoftwareTuple(self, soft):
        """
        @param soft: string or dict
        @return: software tuple:
            (name, version, vendor)
        """
        name = version = vendor = None
        if soft and isinstance(soft, basestring):
            name = soft.replace('*', '%')
        elif type(soft) == dict:
            name = soft.get('name', None)
            if name:
                name = name.replace('*', '%')
            version = soft.get('version', None)
            if version:
                version = version.replace('*', '%')
            vendor = soft.get('vendor', None)
            if vendor:
                vendor = vendor.replace('*', '%')
        if name is None:
            logger.error("Missing software name")
            return None
        return (name, version, vendor)

    def _constructSoftwaresList(self, softs):
        """
        @param softs: dict, string, list of mixed string and dict
        @return: list of software tuples
            [(name, version, vendor),
             (name, version, vendor),
             (name, version, vendor),
             ...]
        """
        if type(softs) == list:
            return [self._constructSoftwareTuple(soft) for soft in softs]
        if softs:
            return [self._constructSoftwareTuple(softs)]
        return []

    def _getComputerCountBySoftwares(self,
                                     entities,
                                     softs,
                                     results,
                                     oper=operator.add):
        soft_results = []
        if softs:
            for entity in self._getEntitiesIds(entities):
                self.ctx.locationsid = [entity]
                soft_count = self.db.getAllSoftwaresImproved(
                    self.ctx, [soft[0] for soft in softs],
                    version=[soft[1] for soft in softs],
                    vendor=[soft[2] for soft in softs],
                    count=1)
                soft_results.append({'entity_id': entity, 'value': soft_count})
        for soft_result in soft_results:
            count = False
            for result in results:
                if soft_result['entity_id'] == result['entity_id']:
                    if result['value'] is not None and soft_result[
                            'value'] is not None:
                        result['value'] = oper(result['value'],
                                               soft_result['value'])
                    else:
                        result['value'] = 0
                    count = True
            if not count and oper == operator.add:
                results.append(soft_result)
        return results

    def getComputerCountBySoftwares(self,
                                    entities,
                                    soft_names,
                                    exclude_names={}):
        """
        Get computer count for software names

        @param soft_names: list of softwares to count
        @param exclude_names: list of softwares to exclude

        soft_names can be a simple string (ie: 'Mozilla Firefox*')
        soft_names can be a dict (ie: {'name': 'Mozilla Firefox', 'version': '24.0', vendor:'Mozilla'})
        soft_names can be a list of mixed dict and strings

        Same for exclude_names

        @return: count of machines by entity
        """
        softs = self._constructSoftwaresList(soft_names)
        excludes = self._constructSoftwaresList(exclude_names)
        results = self._getComputerCountBySoftwares(entities, softs, [])
        results = self._getComputerCountBySoftwares(entities, excludes,
                                                    results, operator.sub)
        return results