def update_machine(self, client, device_type, jamf_id): logger.info("Update machine %s %s %s", client.get_source_d(), device_type, jamf_id) try: machine_d = client.get_machine_d(device_type, jamf_id) except: logger.exception("Could not get machine_d. %s %s %s", client.get_source_d(), device_type, jamf_id) else: try: msc, ms = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( machine_d) except: logger.exception("Could not commit machine snapshot") else: if msc: for idx, (event_type, created_at, payload) in enumerate( inventory_events_from_machine_snapshot_commit( msc)): event_cls = event_cls_from_type(event_type) metadata = EventMetadata( event_cls.event_type, machine_serial_number=ms.serial_number, index=idx, created_at=created_at, tags=event_cls.tags) event = event_cls(metadata, payload) yield event
def test_machine_snapshot_commit_create(self): tree = copy.deepcopy(self.machine_snapshot) msc, ms, _ = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( tree) self.assertIsInstance(msc, MachineSnapshotCommit) self.assertEqual(msc.machine_snapshot, ms) self.assertEqual(msc.version, 1) self.assertEqual(msc.serial_number, self.serial_number) self.assertEqual(ms.serial_number, self.serial_number) self.assertEqual(ms.source.module, "io.zentral.tests") self.assertEqual(ms.source.name, "zentral") self.assertEqual(ms.source, msc.source) self.assertEqual(msc.parent, None) self.assertEqual(msc.update_diff(), None) self.assertEqual(CurrentMachineSnapshot.objects.all().count(), 1) cms = CurrentMachineSnapshot.objects.get( serial_number=self.serial_number, source=ms.source) self.assertEqual(cms.machine_snapshot, ms) tree = copy.deepcopy(self.machine_snapshot) msc2, ms2, _ = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( tree) self.assertEqual(ms, ms2) self.assertEqual( list(inventory_events_from_machine_snapshot_commit(msc2)), [('inventory_heartbeat', msc2.last_seen, { 'source': self.source })]) self.assertEqual(CurrentMachineSnapshot.objects.all().count(), 1) cms = CurrentMachineSnapshot.objects.get( serial_number=self.serial_number, source=ms.source) self.assertEqual(cms.machine_snapshot, ms) self.assertEqual(cms.last_seen, msc2.last_seen)
def update_machine(self, machine_d): logger.info("Update machine %s %s", machine_d["source"], machine_d["reference"]) try: msc, ms, _ = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( machine_d) except Exception: logger.exception("Could not commit machine snapshot") else: if msc: event_uuid = uuid.uuid4() for idx, (event_type, created_at, payload) in enumerate( inventory_events_from_machine_snapshot_commit(msc)): event_cls = event_cls_from_type(event_type) metadata = EventMetadata( machine_serial_number=ms.serial_number, uuid=event_uuid, index=idx, created_at=created_at) event = event_cls(metadata, payload) yield event
def _update_machine(self, client, device_type, jamf_id): logger.info("Update machine %s %s %s", client.source_repr, device_type, jamf_id) try: machine_d, tags = client.get_machine_d_and_tags( device_type, jamf_id) except Exception: logger.exception("Could not get machine_d and tags. %s %s %s", client.source_repr, device_type, jamf_id) else: if not machine_d.get("serial_number"): logger.warning("Machine %s %s %s without serial number", client.source_repr, device_type, jamf_id) return try: with transaction.atomic(): msc, ms = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( machine_d) except Exception: logger.exception("Could not commit machine snapshot") else: if msc: for idx, (event_type, created_at, payload) in enumerate( inventory_events_from_machine_snapshot_commit( msc)): event_cls = event_cls_from_type(event_type) metadata = EventMetadata( event_cls.event_type, machine_serial_number=ms.serial_number, index=idx, created_at=created_at, tags=event_cls.tags) event = event_cls(metadata, payload) yield event if tags: machine = MetaMachine(machine_d["serial_number"]) for taxonomy_id, tag_names in tags.items(): taxonomy = self._get_taxonomy(taxonomy_id) if taxonomy: machine.update_taxonomy_tags(taxonomy, tag_names)
def test_machine_snapshot_commit_update(self): tree = copy.deepcopy(self.machine_snapshot) msc1, ms1, _ = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( tree) ms1.refresh_from_db() self.assertEqual(ms1.hash(), ms1.mt_hash) self.assertIsInstance(msc1, MachineSnapshotCommit) tree = copy.deepcopy(self.machine_snapshot2) msc2, ms2, _ = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( tree) ms2.refresh_from_db() self.assertEqual(ms2.hash(), ms2.mt_hash) self.assertIsInstance(msc2, MachineSnapshotCommit) self.assertEqual(msc2.parent, msc1) self.assertEqual(CurrentMachineSnapshot.objects.all().count(), 1) cms = CurrentMachineSnapshot.objects.get( serial_number=self.serial_number, source=ms2.source) self.assertEqual(cms.machine_snapshot, ms2) def prepare_diff_dict(d): for k, v in d.items(): if isinstance(v, datetime): if is_aware(v): v = make_naive(v) d[k] = v.isoformat() elif isinstance(v, dict): prepare_diff_dict(v) elif isinstance(v, list): for vi in v: prepare_diff_dict(vi) osx_app_instance_diff = copy.deepcopy(self.osx_app_instance) prepare_diff_dict(osx_app_instance_diff) self.assertEqual( msc2.update_diff(), { "os_version": { "added": self.os_version }, "osx_app_instances": { "added": [osx_app_instance_diff] }, "last_seen": { "added": msc2.last_seen, "removed": msc1.last_seen }, "platform": { "added": MACOS } }) # don't forget platform !!! self.assertEqual( list(inventory_events_from_machine_snapshot_commit(msc2)), [('add_machine_osx_app_instance', None, { "osx_app_instance": osx_app_instance_diff, "source": self.source }), ('add_machine_os_version', None, { 'os_version': self.os_version, 'source': self.source }), ('inventory_heartbeat', msc2.last_seen, { 'source': self.source })]) tree = copy.deepcopy(self.machine_snapshot3) msc3, ms3, _ = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( tree) ms3.refresh_from_db() self.assertEqual(ms3.hash(), ms3.mt_hash) self.assertEqual(msc3.parent, msc2) self.assertEqual(CurrentMachineSnapshot.objects.all().count(), 1) cms = CurrentMachineSnapshot.objects.get( serial_number=self.serial_number, source=ms3.source) self.assertEqual(cms.machine_snapshot, ms3) osx_app_instance2_diff = copy.deepcopy(self.osx_app_instance2) prepare_diff_dict(osx_app_instance2_diff) self.assertEqual( msc3.update_diff(), { "last_seen": { "added": msc3.last_seen, "removed": msc2.last_seen }, "osx_app_instances": { "added": [osx_app_instance2_diff] } }) self.assertEqual( list(inventory_events_from_machine_snapshot_commit(msc3)), [('add_machine_osx_app_instance', None, { 'osx_app_instance': osx_app_instance2_diff, "source": self.source }), ('inventory_heartbeat', msc3.last_seen, { 'source': self.source })]) self.assertEqual(ms3.mt_hash, ms3.hash()) self.assertEqual(Certificate.objects.count(), 1) tree = copy.deepcopy(self.machine_snapshot2) msc4, ms4, _ = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( tree) self.assertEqual( list(inventory_events_from_machine_snapshot_commit(msc4)), [('remove_machine_osx_app_instance', None, { 'osx_app_instance': osx_app_instance2_diff, "source": self.source }), ('inventory_heartbeat', msc4.last_seen, { 'source': self.source })]) ms4.refresh_from_db() self.assertEqual(ms4.hash(), ms4.mt_hash) self.assertEqual(ms4, ms2) self.assertEqual(msc4.parent, msc3) self.assertEqual(msc4.machine_snapshot, ms2) self.assertEqual(CurrentMachineSnapshot.objects.all().count(), 1) cms = CurrentMachineSnapshot.objects.get( serial_number=self.serial_number, source=ms4.source) self.assertEqual(cms.machine_snapshot, ms2) tree = copy.deepcopy(self.machine_snapshot4) msc5, ms5, _ = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( tree) self.assertEqual( list(inventory_events_from_machine_snapshot_commit(msc5)), [('add_machine_extra_facts', None, { 'extra_facts': self.extra_facts, "source": self.source }), ('inventory_heartbeat', msc5.last_seen, { "source": self.source })]) self.assertEqual(ms5.extra_facts, self.extra_facts) ms5.refresh_from_db() self.assertEqual(ms5.hash(), ms5.mt_hash) self.assertEqual(msc5.parent, msc4) tree = copy.deepcopy(self.machine_snapshot4) msc6, ms6, _ = MachineSnapshotCommit.objects.commit_machine_snapshot_tree( tree) ms6.refresh_from_db() self.assertEqual(ms6.hash(), ms6.mt_hash) self.assertEqual( list(inventory_events_from_machine_snapshot_commit(msc6)), [('inventory_heartbeat', msc6.last_seen, { "source": self.source })]) self.assertEqual(msc6.parent, msc5) self.assertEqual(ms6, ms5)