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]
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]
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)
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]