Beispiel #1
0
 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)
Beispiel #3
0
 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
Beispiel #4
0
 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)