diff options
Diffstat (limited to 'pynslcd')
-rw-r--r-- | pynslcd/cache.py | 4 | ||||
-rw-r--r-- | pynslcd/cfg.py | 5 | ||||
-rw-r--r-- | pynslcd/group.py | 8 | ||||
-rw-r--r-- | pynslcd/nscd.py | 4 | ||||
-rwxr-xr-x | pynslcd/pynslcd.py | 32 | ||||
-rw-r--r-- | pynslcd/search.py | 2 | ||||
-rw-r--r-- | pynslcd/shadow.py | 2 | ||||
-rw-r--r-- | pynslcd/tio.py | 8 | ||||
-rw-r--r-- | pynslcd/usermod.py | 10 |
9 files changed, 36 insertions, 39 deletions
diff --git a/pynslcd/cache.py b/pynslcd/cache.py index ce706be..7089d41 100644 --- a/pynslcd/cache.py +++ b/pynslcd/cache.py @@ -1,7 +1,7 @@ # cache.py - caching layer for pynslcd # -# Copyright (C) 2012 Arthur de Jong +# Copyright (C) 2012, 2013 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -29,8 +29,6 @@ import sqlite3 # TODO: probably create a config table - - # FIXME: store the cache in the right place and make it configurable filename = '/tmp/cache.sqlite' dirname = os.path.dirname(filename) diff --git a/pynslcd/cfg.py b/pynslcd/cfg.py index baa29ec..a9f1d89 100644 --- a/pynslcd/cfg.py +++ b/pynslcd/cfg.py @@ -20,12 +20,9 @@ import logging import re -import sys import ldap -from expr import Expression - # the number of threads to start threads = 5 @@ -134,6 +131,7 @@ def _get_maps(): # separate function as not to pollute the namespace and avoid import loops import alias, ether, group, host, netgroup, network, passwd import protocol, rpc, service, shadow + import sys return dict( alias=alias, aliases=alias, ether=ether, ethers=ether, @@ -274,6 +272,7 @@ def read(filename): # pam_authz_search <FILTER> m = re.match('pam_authz_search\s+(?P<value>\S.*)', line, re.IGNORECASE) if m: + from expr import Expression pam_authz_searches.append(Expression(m.group('value'))) # TODO: check pam_authz_search expression to only contain # username, service, ruser, rhost, tty, hostname, fqdn, dn or diff --git a/pynslcd/group.py b/pynslcd/group.py index 71a1173..a72c57d 100644 --- a/pynslcd/group.py +++ b/pynslcd/group.py @@ -65,9 +65,11 @@ class Search(search.LDAPSearch): memberuid = self.parameters['memberUid'] dn = uid2dn(self.conn, memberuid) if dn: - return '(&%s(|(%s=%s)(%s=%s)))' % (self.filter, - attmap['memberUid'], escape_filter_chars(memberuid), - attmap['member'], escape_filter_chars(dn)) + return '(&%s(|(%s=%s)(%s=%s)))' % ( + self.filter, + attmap['memberUid'], escape_filter_chars(memberuid), + attmap['member'], escape_filter_chars(dn) + ) return super(Search, self).mk_filter() diff --git a/pynslcd/nscd.py b/pynslcd/nscd.py index 19e5ceb..e71bd04 100644 --- a/pynslcd/nscd.py +++ b/pynslcd/nscd.py @@ -22,7 +22,6 @@ import fcntl import logging import os import subprocess -import struct import cfg @@ -74,9 +73,8 @@ def loop(fd): os.environ['PATH'] = '/usr/sbin:/usr/bin:/sbin:/bin' while True: db = os.read(fd, 1) - # FIXME: define the characters and maps somewhere if db == '': - break + break # close process down db = _char_to_db.get(db, None) if db: exec_invalidate(db) diff --git a/pynslcd/pynslcd.py b/pynslcd/pynslcd.py index 35ecb08..99bfda8 100755 --- a/pynslcd/pynslcd.py +++ b/pynslcd/pynslcd.py @@ -73,8 +73,8 @@ class MySysLogHandler(logging.Handler): def emit(self, record): priority = self.mapping.get(record.levelno, syslog.LOG_WARNING) msg = self.format(record) - for l in msg.splitlines(): - syslog.syslog(priority, l) + for line in msg.splitlines(): + syslog.syslog(priority, line) # configure logging @@ -113,8 +113,9 @@ def parse_cmdline(): global program_name program_name = sys.argv[0] or program_name try: - optlist, args = getopt.gnu_getopt(sys.argv[1:], - 'cdhV', ('check', 'debug', 'help', 'version', )) + optlist, args = getopt.gnu_getopt( + sys.argv[1:], 'cdhV', + ('check', 'debug', 'help', 'version')) for flag, arg in optlist: if flag in ('-c', '--check'): global checkonly @@ -131,10 +132,12 @@ def parse_cmdline(): if len(args): raise getopt.GetoptError('unrecognized option \'%s\'' % args[0], args[0]) except getopt.GetoptError, reason: - sys.stderr.write("%(program_name)s: %(reason)s\n" - "Try '%(program_name)s --help' for more information.\n" - % {'program_name': program_name, - 'reason': reason, }) + sys.stderr.write( + "%(program_name)s: %(reason)s\n" + "Try '%(program_name)s --help' for more information.\n" % { + 'program_name': program_name, + 'reason': reason, + }) sys.exit(1) @@ -168,7 +171,7 @@ def getpeercred(fd): """Return uid, gid and pid of calling application.""" import struct import socket - SO_PEERCRED = 17 + SO_PEERCRED = getattr(socket, 'SO_PEERCRED', 17) creds = fd.getsockopt(socket.SOL_SOCKET, SO_PEERCRED, struct.calcsize('3i')) pid, uid, gid = struct.unpack('3i', creds) return uid, gid, pid @@ -181,12 +184,12 @@ handlers.update(common.get_handlers('group')) handlers.update(common.get_handlers('host')) handlers.update(common.get_handlers('netgroup')) handlers.update(common.get_handlers('network')) -handlers.update(common.get_handlers('pam')) handlers.update(common.get_handlers('passwd')) handlers.update(common.get_handlers('protocol')) handlers.update(common.get_handlers('rpc')) handlers.update(common.get_handlers('service')) handlers.update(common.get_handlers('shadow')) +handlers.update(common.get_handlers('pam')) handlers.update(common.get_handlers('usermod')) @@ -196,8 +199,7 @@ def acceptconnection(session): # See: http://docs.python.org/library/socket.html#socket.socket.settimeout fp = None try: - # probably use finally - # indicate new connection to logging module (genrates unique id) + # indicate new connection to logging module (generates unique id) log_newsession() # log connection try: @@ -292,9 +294,9 @@ if __name__ == '__main__': sys.exit(1) # daemonize if debugging: - daemon = pidfile + ctx = pidfile else: - daemon = daemon.DaemonContext( + ctx = daemon.DaemonContext( pidfile=pidfile, signal_map={ signal.SIGTERM: 'terminate', @@ -302,7 +304,7 @@ if __name__ == '__main__': signal.SIGPIPE: None, }) # start daemon - with daemon: + with ctx: try: # start normal logging as configured if not debugging: diff --git a/pynslcd/search.py b/pynslcd/search.py index 219929b..3db6e9d 100644 --- a/pynslcd/search.py +++ b/pynslcd/search.py @@ -25,7 +25,6 @@ import ldap import ldap.ldapobject import cfg -import nscd # global indicator that there was some error connection to an LDAP server @@ -56,6 +55,7 @@ class Connection(ldap.ldapobject.ReconnectLDAPObject): self.set_option(ldap.OPT_X_TLS, ldap.OPT_X_TLS_HARD) def reconnect_after_fail(self): + import nscd logging.info('connected to LDAP server %s', cfg.uri) nscd.invalidate() diff --git a/pynslcd/shadow.py b/pynslcd/shadow.py index 6f7df10..bedac50 100644 --- a/pynslcd/shadow.py +++ b/pynslcd/shadow.py @@ -95,7 +95,7 @@ class ShadowRequest(common.Request): # return results for name in names: yield (name, passwd, lastchangedate, mindays, maxdays, warndays, - inactdays, expiredate, flag) + inactdays, expiredate, flag) class ShadowByNameRequest(ShadowRequest): diff --git a/pynslcd/tio.py b/pynslcd/tio.py index 9e7f99b..02b7ec6 100644 --- a/pynslcd/tio.py +++ b/pynslcd/tio.py @@ -1,7 +1,7 @@ # tio.py - I/O functions # -# Copyright (C) 2010, 2011 Arthur de Jong +# Copyright (C) 2010, 2011, 2012, 2013 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -51,10 +51,10 @@ class TIOStream(object): return _int32.unpack(self.read(_int32.size))[0] def read_string(self, maxsize=None): - len = self.read_int32() - if maxsize and len >= maxsize: + num = self.read_int32() + if maxsize and num >= maxsize: raise TIOStreamError() - return self.read(len) + return self.read(num) def read_address(self): """Read an address (usually IPv4 or IPv6) from the stream and return diff --git a/pynslcd/usermod.py b/pynslcd/usermod.py index c957b97..9622fb2 100644 --- a/pynslcd/usermod.py +++ b/pynslcd/usermod.py @@ -26,9 +26,7 @@ import os.path import ldap -import cache import cfg -import common import constants import pam import passwd @@ -94,10 +92,10 @@ class UserModRequest(pam.PAMRequest): mods.append((ldap.MOD_REPLACE, passwd.attmap['homeDirectory'], [homedir])) elif not os.path.isabs(homedir): self.write_result(constants.NSLCD_USERMOD_HOMEDIR, - 'should be an absolute path') + 'should be an absolute path') elif not os.path.isdir(homedir): self.write_result(constants.NSLCD_USERMOD_HOMEDIR, - 'not a directory') + 'not a directory') else: mods.append((ldap.MOD_REPLACE, passwd.attmap['homeDirectory'], [homedir])) # check login shell modification @@ -107,10 +105,10 @@ class UserModRequest(pam.PAMRequest): mods.append((ldap.MOD_REPLACE, passwd.attmap['loginShell'], [shell])) elif shell not in list_shells(): self.write_result(constants.NSLCD_USERMOD_SHELL, - 'unlisted shell') + 'unlisted shell') elif not os.path.isfile(shell) or not os.access(shell, os.X_OK): self.write_result(constants.NSLCD_USERMOD_SHELL, - 'not an executable') + 'not an executable') else: mods.append((ldap.MOD_REPLACE, passwd.attmap['loginShell'], [shell])) # get a connection and perform the modification |