diff --git a/src/phi/async_ldap/model.py b/src/phi/async_ldap/model.py index 68c350b..d81e514 100644 --- a/src/phi/async_ldap/model.py +++ b/src/phi/async_ldap/model.py @@ -101,6 +101,9 @@ class Entry(object): def __repr__(self): return f"<{call_if_callable(self, 'name')} {self.dn}>" + def __dict__(self): + return self._dict + def __aiter__(self): return self @@ -120,9 +123,23 @@ class Entry(object): def dn(self): return "{},{}".format(inheritance(self, "qualified_name", Entry), self.base_dn) + @property + def attributes(self): + raise NotImplemented() + async def describe(self): async with self.client.connect(is_async=True) as conn: + # This returns a list of dicts. It should always contain only one item: + # the one we are interested. res = await conn.search(self.dn, 0) + if len(res) == 0: + return + elif len(res) > 1: + raise PhiUnexpectedRuntimeValue( + "return value should be no more than one", res + ) + res = res[0] + res.update({"dn": self.dn, "name": self.name}) return res @@ -143,6 +160,7 @@ class Hackers(Entry): """ kind = "ou" + _name = "Hackers" _instances: T.Dict[str, Entry] = dict() def __new__(cls, client, *args, **kwargs): @@ -170,6 +188,10 @@ class Hackers(Entry): res = await self.get_by_attr("uid", uid) return res[0] + @property + def attributes(self): + return {"kind": self.kind} + class Robots(Entry): """ @@ -338,9 +360,10 @@ class Service(Robots): def __new__(cls, client, name, *args, **kwargs): return singletonize(cls, f"{name}-{id(client)}") - def __init__(self, name, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, client, name, *args, **kwargs): + super().__init__(client, *args, **kwargs) self._name = name + self._entry = LDAPEntry(self.dn) def __repr__(self): return f"<{get_class(self).__name__}({self.name}) {self.dn}>" @@ -397,9 +420,10 @@ class Group(Congregations): def __new__(cls, client, name, *args, **kwargs): return singletonize(cls, f"{name}-{id(client)}") - def __init__(self, name, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, client, name, *args, **kwargs): + super().__init__(client, *args, **kwargs) self._name = name + self._entry = LDAPEntry(self.dn) def __repr__(self): return f"<{get_class(self).__name__}({self.name}) {self.dn}>"