diff --git a/README.md b/README.md index 077798cbdf2eaab943cf3292e8491596299bb40d..b7ba0eda5910d50b6871b067c05232aa33cb828b 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,12 @@ Install the requirements. apt install python3 python3-dev python3-setuptools python3-pip libacl1-dev libkrb5-dev ``` +Optional packages: + +``` +apt install python3-venv +``` + ### git / pip **Recommended** install from a clean venv (may be needed if you have any conflicting outdated modules installed as packages): diff --git a/bin/showgroup.py b/bin/showgroup.py index 6f23bed31f36b3ccb04ffd6cc9ed750b82ed7d64..6faac89912a88cb6f98bbbfd480679d5415309c4 100755 --- a/bin/showgroup.py +++ b/bin/showgroup.py @@ -20,13 +20,20 @@ NOOPTS = collections.OrderedDict() NOOPTS['no-member'] = 'memberUid' NOOPTS['no-gid'] = 'gidNumber' NOOPTS['no-owner'] = 'owner' +NOOPTS['no-uid'] = 'uidNumber' +NOOPTS['no-name'] = 'gecos' def main(): description = 'Show groups or group members' arg = 'group' arg_help = 'The group name (cn), or wildcards (*, cn* , *cn*)' - args = argparser.simple(description, arg=arg, arg_help=arg_help, opts=OPTS, noopts=NOOPTS) + parser = argparser.extendable(description, arg=arg, arg_help=arg_help, opts=OPTS, noopts=NOOPTS) + parser.add_argument('--uids', dest='uid_only', action='store_const', const=True, + help='Show uids only') + parser.add_argument('--names', dest='name_only', action='store_const', const=True, + help='Show real names only') + args = vars(parser.parse_args()) ldap = dphysldap.Ldap() @@ -50,23 +57,34 @@ def main(): group = groups[0] members = group['memberUid'] - print('Group {} ({}):'.format(group['cn'], group['gidNumber'])) - print('Owner: {}'.format(group['owner'])) - print('Report: {}'.format(group['reportEnabled'])) - print('Reported to: {}'.format(group['reportUid'])) + if not args['name_only'] and not args['uid_only']: + print('Group {} ({}):'.format(group['cn'], group['gidNumber'])) + print('Owner: {}'.format(group['owner'])) + print('Report: {}'.format(group['reportEnabled'])) + print('Reported to: {}'.format(group['reportUid'])) if members: del OPTS['report'] attrs = ['uid', 'uidNumber', 'gecos'] attrs.extend([v for k, v in OPTS.items() if args[k]]) + for attr in [v for k, v in NOOPTS.items() if args[k]]: + if attr in attrs: + attrs.remove(attr) users = dphysldap.Users(ldap, attrs) users.search(';'.join(members)) users.sort('uid') - print('Members:') - print(users) + if args['uid_only']: + for user in users: + print(user['uid']) + elif args['name_only']: + for user in users: + print(user['gecos']) + else: + print('Members:') + print(users) else: print('Members: none') diff --git a/lib/isg/argparser.py b/lib/isg/argparser.py index 0eef12537a0a4432f997931de8ece46b49b8e960..fdc18d02f007bf00e82637fe6482feed78a7145f 100644 --- a/lib/isg/argparser.py +++ b/lib/isg/argparser.py @@ -2,9 +2,10 @@ import argparse -def simple(description, arg=None, arg_help='', opts=dict(), noopts=dict()): + +def extendable(description, arg=None, arg_help='', opts=dict(), noopts=dict()): """ - Get cmd argument with simplified argparser + Get extendable simplified argparser """ parser = argparse.ArgumentParser( add_help=False, description=description) @@ -15,18 +16,39 @@ def simple(description, arg=None, arg_help='', opts=dict(), noopts=dict()): for k, v in opts.items(): if isinstance(v, list): v = ', '.join(v) - parser.add_argument('-' + k[:1], '--' + k, dest=k, - action='store_const', const=True, - help='Show ' + v) + + try: + parser.add_argument('-' + k[:1], '--' + k, dest=k, + action='store_const', const=True, + help='Show ' + v) + except argparse.ArgumentError: + parser.add_argument('--' + k, dest=k, + action='store_const', const=True, + help='Show ' + v) for k, v in noopts.items(): if isinstance(v, list): v = ', '.join(v) - parser.add_argument('-' + k[3:4].upper(), '--' + k, dest=k, - action='store_const', const=True, - help='Hide ' + v) + + try: + parser.add_argument('-' + k[3:4].upper(), '--' + k, dest=k, + action='store_const', const=True, + help='Hide ' + v) + except argparse.ArgumentError: + parser.add_argument('--' + k, dest=k, + action='store_const', const=True, + help='Hide ' + v) parser.add_argument('--help', action='help', help='Show this help message and exit') + return parser + + +def simple(description, arg=None, arg_help='', opts=dict(), noopts=dict()): + """ + Get cmd argument with simplified argparser + """ + parser = extendable(description, arg=arg, arg_help=arg_help, opts=opts, noopts=noopts) + return vars(parser.parse_args()) diff --git a/lib/isg/dphysldap.py b/lib/isg/dphysldap.py index 7aaeb68f2889d68588a01a58e1de124c22a997e3..b52dcc4aded47aa3779a607710a838c4db5d2bdb 100644 --- a/lib/isg/dphysldap.py +++ b/lib/isg/dphysldap.py @@ -60,7 +60,7 @@ class Entry(collections.abc.MutableMapping): def __len__(self): return len(self._dict) - + def __str__(self): """ Modifies the "informal" string value of str(x) or print(x)