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(f"bad scope: {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")