1 |
douglas |
596 |
#!/usr/bin/env python |
2 |
|
|
# CCS Computer Science |
3 |
|
|
# |
4 |
|
|
# Douglas Thrift |
5 |
|
|
# |
6 |
|
|
# $Id$ |
7 |
|
|
|
8 |
douglas |
602 |
import admin |
9 |
douglas |
598 |
import ldap |
10 |
douglas |
687 |
import os.path |
11 |
douglas |
596 |
|
12 |
|
|
try: |
13 |
|
|
from _users import users |
14 |
|
|
except ImportError: |
15 |
|
|
users = set() |
16 |
|
|
|
17 |
douglas |
598 |
def user(user): |
18 |
|
|
if user in users: |
19 |
|
|
return True |
20 |
|
|
|
21 |
douglas |
681 |
connection = admin.ldap_connection(False) |
22 |
douglas |
598 |
|
23 |
|
|
try: |
24 |
douglas |
602 |
return bool(connection.search_s(admin.PEOPLE, ldap.SCOPE_ONELEVEL, '(uid=%s)' % user, ('uid',), 1)) |
25 |
douglas |
598 |
finally: |
26 |
|
|
connection.unbind_s() |
27 |
|
|
|
28 |
douglas |
596 |
if __name__ == '__main__': |
29 |
douglas |
687 |
parser = admin.parser(usage = '%prog [options] [FILE...]') |
30 |
|
|
|
31 |
|
|
parser.add_option('-l', '--list', action = 'store_true', default = False, help = 'list the system users from all systems') |
32 |
|
|
parser.add_option('-t', '--touch', help = 'touch the file TOUCH if successful') |
33 |
|
|
|
34 |
|
|
options, args = parser.parse_args() |
35 |
|
|
|
36 |
|
|
if options.list: |
37 |
|
|
for user in sorted(users): |
38 |
|
|
print user |
39 |
|
|
|
40 |
|
|
parser.exit() |
41 |
|
|
|
42 |
|
|
if not args: |
43 |
|
|
parser.error('no files specified') |
44 |
|
|
|
45 |
|
|
_users = frozenset(users) |
46 |
|
|
|
47 |
|
|
format = '%%%us: %%s' % ((len(max(args, key = len)) + 1) / 2 * 2) |
48 |
|
|
|
49 |
|
|
for file in args: |
50 |
douglas |
596 |
with open(file, 'rb') as file: |
51 |
|
|
for line in file: |
52 |
|
|
if line.startswith('#'): |
53 |
|
|
continue |
54 |
|
|
|
55 |
douglas |
687 |
_user = line.split(':', 1)[0] |
56 |
douglas |
596 |
|
57 |
douglas |
687 |
if not user(_user): |
58 |
|
|
print format % (file.name, _user) |
59 |
douglas |
596 |
|
60 |
douglas |
687 |
users.add(_user) |
61 |
douglas |
596 |
|
62 |
douglas |
687 |
if users != _users: |
63 |
|
|
with open(os.path.join(os.path.dirname(__file__), '_users.py'), 'wb') as file: |
64 |
|
|
file.write('users = set((\n') |
65 |
|
|
|
66 |
|
|
for user in sorted(users): |
67 |
|
|
file.write('\t%s,\n' % repr(user)) |
68 |
|
|
|
69 |
|
|
file.write('))\n') |
70 |
|
|
|
71 |
|
|
if options.touch: |
72 |
|
|
open(options.touch, 'ab') |