def findprovisionrange(samdb, basedn): """ Find ranges of usn grouped by invocation id and then by timestamp rouned at 1 minute :param samdb: An LDB object pointing to the samdb :param basedn: The DN of the forest :return: A two level dictionary with invoication id as the first level, timestamp as the second one and then max, min, and number as subkeys, representing respectivily the maximum usn for the range, the minimum usn and the number of object with usn in this range. """ nb_obj = 0 hash_id = {} res = samdb.search( base=basedn, expression="objectClass=*", scope=ldb.SCOPE_SUBTREE, attrs=["replPropertyMetaData"], controls=["search_options:1:2"], ) for e in res: nb_obj = nb_obj + 1 obj = ndr_unpack(drsblobs.replPropertyMetaDataBlob, str(e["replPropertyMetaData"])).ctr for o in obj.array: # like a timestamp but with the resolution of 1 minute minutestamp = _glue.nttime2unix(o.originating_change_time) / 60 hash_ts = hash_id.get(str(o.originating_invocation_id)) if hash_ts is None: ob = {} ob["min"] = o.originating_usn ob["max"] = o.originating_usn ob["num"] = 1 ob["list"] = [str(e.dn)] hash_ts = {} else: ob = hash_ts.get(minutestamp) if ob is None: ob = {} ob["min"] = o.originating_usn ob["max"] = o.originating_usn ob["num"] = 1 ob["list"] = [str(e.dn)] else: if ob["min"] > o.originating_usn: ob["min"] = o.originating_usn if ob["max"] < o.originating_usn: ob["max"] = o.originating_usn if not (str(e.dn) in ob["list"]): ob["num"] = ob["num"] + 1 ob["list"].append(str(e.dn)) hash_ts[minutestamp] = ob hash_id[str(o.originating_invocation_id)] = hash_ts return (hash_id, nb_obj)
def findprovisionrange(samdb, basedn): """ Find ranges of usn grouped by invocation id and then by timestamp rouned at 1 minute :param samdb: An LDB object pointing to the samdb :param basedn: The DN of the forest :return: A two level dictionary with invoication id as the first level, timestamp as the second one and then max, min, and number as subkeys, representing respectivily the maximum usn for the range, the minimum usn and the number of object with usn in this range. """ nb_obj = 0 hash_id = {} res = samdb.search(base=basedn, expression="objectClass=*", scope=ldb.SCOPE_SUBTREE, attrs=["replPropertyMetaData"], controls=["search_options:1:2"]) for e in res: nb_obj = nb_obj + 1 obj = ndr_unpack(drsblobs.replPropertyMetaDataBlob, str(e["replPropertyMetaData"])).ctr for o in obj.array: # like a timestamp but with the resolution of 1 minute minutestamp = _glue.nttime2unix(o.originating_change_time) // 60 hash_ts = hash_id.get(str(o.originating_invocation_id)) if hash_ts is None: ob = {} ob["min"] = o.originating_usn ob["max"] = o.originating_usn ob["num"] = 1 ob["list"] = [str(e.dn)] hash_ts = {} else: ob = hash_ts.get(minutestamp) if ob is None: ob = {} ob["min"] = o.originating_usn ob["max"] = o.originating_usn ob["num"] = 1 ob["list"] = [str(e.dn)] else: if ob["min"] > o.originating_usn: ob["min"] = o.originating_usn if ob["max"] < o.originating_usn: ob["max"] = o.originating_usn if not (str(e.dn) in ob["list"]): ob["num"] = ob["num"] + 1 ob["list"].append(str(e.dn)) hash_ts[minutestamp] = ob hash_id[str(o.originating_invocation_id)] = hash_ts return (hash_id, nb_obj)
def test_nttime2unix(self): self.assertEqual(_glue.nttime2unix(116444736010000000), 1)