Higher verbosity can be used to get raw user LDAP attribute fields

- verbosity is now an integer that can be successively increased
- added printing of department number for simple verbosity user output
This commit is contained in:
2019-05-13 13:54:30 +02:00
parent 6da52b2950
commit 75a0ae077d
4 changed files with 33 additions and 23 deletions

View File

@@ -51,7 +51,7 @@ config = {
'group_ou' : 'OU=Groups,DC=example.com,DC=ch',
'default_user_dn' : 'CN=minpriv_user,OU=Services,DC=example.com,DC=ch',
'default_user_pw' : 'dummypwd',
'default_group_filter' : 'svc-ra*'
'default_group_filter' : 'svc-cluster_merlin*'
}
flag_needprivileges = False
@@ -59,6 +59,7 @@ userfilter = '-'
user_pw = ''
mode = 'grouplist'
verbosity = 0
mylogger = logging.getLogger(os.path.basename(sys.argv[0]))
mylogger.setLevel(logging.DEBUG)
@@ -75,7 +76,7 @@ usage = """%prog [options] groupname [usernames]
Shows or changes members of a group in Active Directory. Also
can be used to investigate users and their group memberships.
User and group names can be given as full distinguished names or
User and group names can be given as fully distinguished names or
just as the short system names (the tool will try to figure out
the full names based on the standard OU extensions in the config
and a lookup)
@@ -188,9 +189,9 @@ parser.add_option('-f',
default = ''
)
parser.add_option('-v',
action = 'store_true',
dest = 'flag_verbose',
help = 'use more verbose output (for group and user lists)',
action = 'count',
dest = 'verbosity',
help = 'use more verbose output (for group and user lists. Verbosity can be increased by multiple -v flags)',
default = False
)
parser.add_option('--user-ou',
@@ -241,7 +242,9 @@ parser.add_option('-R',
if options.flag_debug:
ch.setLevel(logging.DEBUG)
flag_verbose = options.flag_verbose
if options.verbosity:
verbosity = options.verbosity
userfilter = options.userfilter
mailfilter = options.mailfilter
flag_mssfu = options.flag_mssfu
@@ -349,17 +352,17 @@ try:
if args:
sfilter = args.pop(0)
ldapdir.list_groups(sfilter, mssfu=flag_mssfu, returndn=flag_showdn,
verbose=flag_verbose, recursive=options.recursive)
verbose=verbosity, recursive=options.recursive)
elif mode == 'userlist':
records = ldapdir.get_users(userfilter, config['user_ou'], mssfu=flag_mssfu)
ldapdir.list_users_etcpwd(records, verbose = flag_verbose)
ldapdir.list_users_etcpwd(records, verbose = verbosity)
elif mode == 'maillist':
records = ldapdir.get_users_by_mailaddr(mailfilter, config['user_ou'], mssfu=flag_mssfu)
ldapdir.list_users_etcpwd(records, verbose = flag_verbose)
ldapdir.list_users_etcpwd(records, verbose = verbosity)
elif mode == 'user_to_group':
sfilter = None

View File

@@ -1,6 +1,6 @@
package:
name: ldapuserdir
version: "2.2.0"
version: "2.2.1"
source:
path: ../../

View File

@@ -111,8 +111,11 @@ class LdapUserDir(object):
@staticmethod
def ensure_utf8(bstr):
if type(bstr) == bytes:
return bstr.decode('utf-8')
try:
if type(bstr) == bytes:
return bstr.decode('utf-8')
except UnicodeDecodeError:
pass
return bstr
@staticmethod
@@ -345,28 +348,32 @@ class LdapUserDir(object):
srch % filter)
return r
def list_users_etcpwd(self, records, verbose=False):
def list_users_etcpwd(self, records, verbose=0):
"""Print '/etc/pwd' format like information about matching users
Parameters
----------
records : ldap result structure with user records
verbose : bool, optional
verbose : int, optional
"""
fields = ['cn', 'msSFU30UidNumber', 'msSFU30UidNumber',
'msSFU30GidNumber', 'displayName',
'msSFU30LoginShell', 'msSFU30HomeDirectory']
for dn, entry in records:
if verbose:
for k in fields + ['description', 'mail', 'mobile']:
if verbose == 1:
for k in fields + ['description', 'mail', 'mobile','department']:
if k in entry:
sys.stdout.write('[%s:]%s:' % (k, self.ensure_utf8(entry[k][0])))
else:
sys.stdout.write('[%s:]N.A.:' % k)
sys.stdout.write('\n')
elif verbose >= 1:
print("DN=%s" % dn)
for k in entry:
sys.stdout.write(' %s: %s\n' % (k, self.ensure_utf8(entry[k][0])))
else:
for k in fields:
if k in entry:
sys.stdout.write('%s:' % (self.ensure_utf8(entry[k][0])))
sys.stdout.write('%s:' % (self.ensure_utf8(entry[k][0])))
else:
sys.stdout.write('N.A.:')
sys.stdout.write('\n')
@@ -549,7 +556,7 @@ class LdapUserDir(object):
return reslist
def list_groups(self, filter='*', ou=None, mssfu=False,
returndn=False, verbose=False, recursive=False,indent=0):
returndn=False, verbose=0, recursive=False,indent=0):
"""Prints a list of groups from the LDAP directory to stdout
Parameters
@@ -562,22 +569,22 @@ class LdapUserDir(object):
Whether to only show users with mssfu mappings
returndn : bool, optional
If true, return full DNs
verbose : bool, optional
verbose : int, optional
If true, print one name per line
recursive : bool, optional
If true, any groups contained within the output will be resolved recursively to users
indent : int, optional
For internal use only. Indicates indent level for verbose recursive mode. Otherwise ignored.
"""
if returndn:
verbose = True
if returndn and verbose == 0:
verbose = 1
r = self.get_groups_struct(filter, ou, mssfu)
if len(r) == 0:
sys.stderr.write("%sError: no groups found (filter: %s)\n" % (' '*indent, filter))
return
if verbose:
if verbose > 0:
indent_increment = 3 # amount to indent members
for dn, entry in r:
if returndn:

View File

@@ -1 +1 @@
__version__ = "2.2.0"
__version__ = "2.2.1"