예제 #1
0
    def _GetMetadataForClients(self, client_urns):
        """Fetches metadata for a given list of clients."""

        result = {}
        metadata_to_fetch = set()

        for urn in client_urns:
            try:
                result[urn] = self._cached_metadata[urn]
            except KeyError:
                metadata_to_fetch.add(urn)

        if metadata_to_fetch:
            client_fds = aff4.FACTORY.MultiOpen(metadata_to_fetch,
                                                mode="r",
                                                token=self.token)

            fetched_metadata = [
                export.GetMetadata(client_fd, token=self.token)
                for client_fd in client_fds
            ]
            for metadata in fetched_metadata:
                metadata.source_urn = self.source_urn

                self._cached_metadata[metadata.client_urn] = metadata
                result[metadata.client_urn] = metadata
                metadata_to_fetch.remove(metadata.client_urn)

            for urn in metadata_to_fetch:
                default_mdata = export.ExportedMetadata(
                    source_urn=self.source_urn)
                result[urn] = default_mdata
                self._cached_metadata[urn] = default_mdata

        return [result[urn] for urn in client_urns]
예제 #2
0
    def _GetMetadataForClients(self, client_urns):
        """Fetches metadata for a given list of clients."""

        result = {}
        metadata_to_fetch = set()

        for urn in client_urns:
            try:
                result[urn] = self._cached_metadata[urn]
            except KeyError:
                metadata_to_fetch.add(urn)

        if metadata_to_fetch:
            client_ids = set(urn.Basename() for urn in metadata_to_fetch)
            infos = data_store.REL_DB.MultiReadClientFullInfo(client_ids)

            fetched_metadata = [
                export.GetMetadata(client_id, info)
                for client_id, info in infos.items()
            ]

            for metadata in fetched_metadata:
                metadata.source_urn = self.source_urn

                self._cached_metadata[metadata.client_urn] = metadata
                result[metadata.client_urn] = metadata
                metadata_to_fetch.remove(metadata.client_urn)

            for urn in metadata_to_fetch:
                default_mdata = export.ExportedMetadata(
                    source_urn=self.source_urn)
                result[urn] = default_mdata
                self._cached_metadata[urn] = default_mdata

        return [result[urn] for urn in client_urns]
예제 #3
0
    def ProcessResponses(self, state, responses):
        default_metadata = export.ExportedMetadata(annotations=u",".join(
            self.args.export_options.annotations),
                                                   source_urn=self.source_urn)

        if self.args.convert_values:
            # This is thread-safe - we just convert the values.
            converted_responses = export.ConvertValues(
                default_metadata, responses, options=self.args.export_options)
        else:
            converted_responses = responses

        # This is not thread-safe, therefore WriteValueToJSONFile is synchronized.
        self.WriteValuesToJSONFile(state, converted_responses)
예제 #4
0
    def _GetMetadataForClients(self, client_urns):
        """Fetches metadata for a given list of clients."""

        result = {}
        metadata_to_fetch = set()

        for urn in client_urns:
            try:
                result[urn] = self._cached_metadata[urn]
            except KeyError:
                metadata_to_fetch.add(urn)

        if metadata_to_fetch:
            if data_store.RelationalDBEnabled():
                client_ids = set(urn.Basename() for urn in metadata_to_fetch)
                infos = data_store.REL_DB.MultiReadClientFullInfo(client_ids)

                fetched_metadata = [
                    export.GetMetadata(client_id, info)
                    for client_id, info in infos.items()
                ]
            else:
                client_fds = aff4.FACTORY.MultiOpen(metadata_to_fetch,
                                                    mode="r",
                                                    token=self.token)

                fetched_metadata = [
                    export.GetMetadataLegacy(client_fd, token=self.token)
                    for client_fd in client_fds
                ]

            for metadata in fetched_metadata:
                metadata.source_urn = self.source_urn

                self._cached_metadata[metadata.client_urn] = metadata
                result[metadata.client_urn] = metadata
                metadata_to_fetch.remove(metadata.client_urn)

            for urn in metadata_to_fetch:
                default_mdata = export.ExportedMetadata(
                    source_urn=self.source_urn)
                result[urn] = default_mdata
                self._cached_metadata[urn] = default_mdata

        return [result[urn] for urn in client_urns]