Source code for ldaptor.usage

"""
Command line argument/options available to various ldaptor tools.
"""
from twisted.python import usage, reflect
from twisted.python.usage import UsageError
from ldaptor.protocols import pureldap
from ldaptor.protocols.ldap import distinguishedname

__all__ = [
    "Options",
    "Options_base",
    "Options_base_optional",
    "Options_bind",
    "Options_bind_mandatory",
    "Options_scope",
    "Options_service_location",
    "UsageError",
]


[docs]class Options(usage.Options): optParameters = ()
[docs] def postOptions(self): postOpt = {} reflect.addMethodNamesToDict(self.__class__, postOpt, "postOptions_") for name in postOpt.keys(): method = getattr(self, "postOptions_" + name) method()
[docs]class Options_service_location: """ Mixing for providing the --service-location option. """
[docs] def opt_service_location(self, value): """Service location, in the form BASEDN:HOST[:PORT]""" if "service-location" not in self.opts: self.opts["service-location"] = {} if ":" not in value: raise usage.UsageError("service-location must specify host") base, location = value.split(":", 1) try: dn = distinguishedname.DistinguishedName(base) except distinguishedname.InvalidRelativeDistinguishedName as e: raise usage.UsageError(str(e)) if ":" in location: host, port = location.split(":", 1) else: host, port = location, None self.opts["service-location"][dn] = (host, port)
[docs] def postOptions_service_location(self): if "service-location" not in self.opts: self.opts["service-location"] = {}
[docs]class Options_base_optional: optParameters = (("base", None, None, "LDAP base dn"),)
[docs]class Options_base(Options_base_optional):
[docs] def postOptions_base(self): # check that some things are given if self.opts["base"] is None: raise usage.UsageError("base must be given")
[docs]class Options_scope: optParameters = ( ("scope", None, "sub", "LDAP search scope (one of base, one, sub)"), )
[docs] def postOptions_scope(self): synonyms = { "base": "baseObject", "single": "singleLevel", "subtree": "wholeSubtree", "sub": "wholeSubtree", } scope = self.opts["scope"] scope = synonyms.get(scope, scope) try: scope = getattr(pureldap, "LDAP_SCOPE_" + scope) except AttributeError: raise usage.UsageError("bad scope: {}".format(scope)) self.opts["scope"] = scope
[docs]class Options_bind: optParameters = ( ("binddn", None, None, "use Distinguished Name to bind to the directory"), ("bind-auth-fd", None, None, "read bind password from filedescriptor"), )
[docs] def postOptions_bind_auth_fd_numeric(self): val = self.opts["bind-auth-fd"] if val is not None: try: val = int(val) except ValueError: raise usage.UsageError("bind-auth-fd value must be numeric") self.opts["bind-auth-fd"] = val
[docs]class Options_bind_mandatory(Options_bind):
[docs] def postOptions_bind_mandatory(self): if not self.opts["binddn"]: raise usage.UsageError("binddn must be given")