diff options
| author | Anton Bobov <anton@bobov.name> | 2022-01-30 21:03:14 +0500 |
|---|---|---|
| committer | Anton Bobov <anton@bobov.name> | 2022-01-30 21:03:14 +0500 |
| commit | b25a5b794be7093dbcd556fcab2ebc50bb33e8b2 (patch) | |
| tree | 282659aa4c647c87e004273efd4d02599afbcec2 /mutt-ldap-query | |
| parent | c83690911af9326784d81e49e2b55de9688c1e9b (diff) | |
Updates.
Diffstat (limited to 'mutt-ldap-query')
| -rwxr-xr-x | mutt-ldap-query | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/mutt-ldap-query b/mutt-ldap-query new file mode 100755 index 0000000..bc5cab4 --- /dev/null +++ b/mutt-ldap-query @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +""" +Query LDAP directory for users and print it in a mutt query format. +""" +import argparse +import sys + +import ldap3 + + +def first(values): + if values is None or len(values) == 0: + return "" + return values[0] + + +def split_to_list(string): + return string.split(',') + + +def ldap_search(args): + search_filter = [f'({f}=*{args.term}*)' for f in args.search_filters] + search_filter = '(|' + ''.join(search_filter) + ')' + + with ldap3.Connection(ldap3.Server(args.server, port=args.port), + auto_bind=ldap3.AUTO_BIND_NO_TLS, + read_only=True, + check_names=True, + user=args.username, password=args.password) as c: + results = c.extend.standard.paged_search(search_base=args.search_base, + search_filter=search_filter, + search_scope=ldap3.SUBTREE, + attributes=list(args.search_attributes), + get_operational_attributes=True, + generator=False) + count = len(results) + if count: + print(f'Found {count} entries:') + for r in results: + attrs = [first(r['attributes'][attr]) for attr in args.search_attributes[:2]] + attrs.append(' / '.join([first(r['attributes'][attr]) for attr in args.search_attributes[2:]])) + last = '\t'.join(attrs) + print(last) + else: + print('Not found.') + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('term', help="search term") + parser.add_argument('-s', '--server', required=True, help='server hostname') + parser.add_argument('-p', '--port', type=int, default=389, help='server port (default: %(default)s)') + parser.add_argument('-u', '--username', help='username') + parser.add_argument('-P', '--password', help='password') + parser.add_argument('-b', '--search-base', metavar="SB", default='ou=people', type=split_to_list, + help="search base string (default: %(default)s)") + parser.add_argument('-f', '--search-filters', metavar="FILTERS", + default='mail,cn', type=split_to_list, + help="list of fields to filter (default: %(default)s)") + parser.add_argument('-a', '--search-attributes', metavar="ATTRIBUTES", + default='mail,cn', type=split_to_list, + help="list of resulting attributes (default: %(default)s)") + args = parser.parse_args() + + ldap_search(args) + + +if __name__ == '__main__': + try: + main() + except Exception as e: + print(e) + sys.exit(1) |
