Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/pynslcd/pynslcd.py
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2012-01-06 14:59:50 +0100
committerArthur de Jong <arthur@arthurdejong.org>2012-01-06 14:59:50 +0100
commite5f552c0fb274c1a02fce51267c563a06c55d334 (patch)
tree6ac770ff8eace971fd81d1eec7d02c953292afbc /pynslcd/pynslcd.py
parentfea96fdbbc3e01a60fcb0d7e5ec7907987f72345 (diff)
user the logging framework, handle exceptions properly and some cleanups
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1588 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'pynslcd/pynslcd.py')
-rwxr-xr-xpynslcd/pynslcd.py143
1 files changed, 81 insertions, 62 deletions
diff --git a/pynslcd/pynslcd.py b/pynslcd/pynslcd.py
index 64e4a80..1c75cbb 100755
--- a/pynslcd/pynslcd.py
+++ b/pynslcd/pynslcd.py
@@ -2,7 +2,7 @@
# pynslcd.py - main daemon module
#
-# Copyright (C) 2010, 2011 Arthur de Jong
+# Copyright (C) 2010, 2011, 2012 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
@@ -19,22 +19,23 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA
-import os
-import sys
import daemon
-import mypidfile
-import threading
import logging
import logging.handlers
+import os
import signal
+import sys
+import syslog
+import threading
+
import ldap
-import constants # from nslcd.h
-import config # from configure
+from tio import TIOStream
import cfg # from nslcd.conf
import common
-
-from tio import TIOStream
+import config # from configure
+import constants # from nslcd.h
+import mypidfile
# the name of the program
@@ -47,36 +48,51 @@ debugging = 0
checkonly = False
-# configure logging
class MyFormatter(logging.Formatter):
+
def format(self, record):
- msg = logging.Formatter.format(self, record)
+ msg = super(MyFormatter, self).format(record)
if record.levelno == logging.DEBUG:
msg = 'DEBUG: %s' % msg
return msg
-#logging.basicConfig(level=logging.INFO)
-# , format='%(message)s'
+
+
+class MySysLogHandler(logging.Handler):
+
+ mapping = {
+ logging.DEBUG: syslog.LOG_DEBUG,
+ logging.INFO: syslog.LOG_INFO,
+ logging.WARNING: syslog.LOG_WARNING,
+ logging.ERROR: syslog.LOG_ERR,
+ logging.CRITICAL: syslog.LOG_CRIT,
+ }
+
+ def __init__(self):
+ super(MySysLogHandler, self).__init__()
+ syslog.openlog(program_name, syslog.LOG_PID, syslog.LOG_DAEMON)
+
+ 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)
+
+
+# configure logging
formatter = MyFormatter('%(message)s')
stderrhandler = logging.StreamHandler(sys.stderr)
stderrhandler.setFormatter(formatter)
-##sysloghandler = logging.handlers.SysLogHandler(address='/dev/log')
-##sysloghandler.setFormatter(formatter)
-#logging.getLogger().setFormatter(MyFormatter())
+sysloghandler = MySysLogHandler()
+sysloghandler.setFormatter(formatter)
logging.getLogger().addHandler(stderrhandler)
-
-#logger = logging.getLogger()
-#logger.setLevel(logging.INFO)
-#syslog = logging.handlers.SysLogHandler(address='/dev/log')
-#formatter = logging.Formatter('%(name)s: %(levelname)s %(message)s')
-#syslog.setFormatter(formatter)
-#logger.addHandler(syslog)
+logging.getLogger().setLevel(logging.INFO)
def display_version(fp):
fp.write('%(PACKAGE_STRING)s\n'
'Written by Arthur de Jong.\n'
'\n'
- 'Copyright (C) 2010, 2011 Arthur de Jong\n'
+ 'Copyright (C) 2010-2012 Arthur de Jong\n'
'This is free software; see the source for copying conditions. There is NO\n'
'warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n'
% {'PACKAGE_STRING': config.PACKAGE_STRING, })
@@ -198,7 +214,7 @@ def acceptconnection(session):
try:
handler = handlers[action]
except KeyError:
- logging.warn('invalid action id: %r', action)
+ logging.warning('invalid action id: %r', action)
return
handler(fp, session, uid)()
finally:
@@ -214,14 +230,13 @@ def disable_nss_ldap():
def worker():
- # create a new LDAP session
- #session = myldap_create_session()
session = ldap.initialize(cfg.uri)
- # start waiting for incoming connections
while True:
- # wait for a new connection
- acceptconnection(session)
- # FIXME: handle exceptions
+ try:
+ acceptconnection(session)
+ except:
+ logging.exception('exception in worker')
+ # ignore all exceptions, just keep going
if __name__ == '__main__':
@@ -237,7 +252,7 @@ if __name__ == '__main__':
# set log level
if debugging:
logging.getLogger().setLevel(logging.DEBUG)
- # FIXME: implement
+ # TODO: implement
#if myldap_set_debuglevel(cfg.debug) != LDAP_SUCCESS:
# sys.exit(1)
# read configuration file
@@ -272,36 +287,40 @@ if __name__ == '__main__':
})
# start daemon
with daemon:
- # start normal logging
+ # start normal logging to syslog
if not debugging:
- log_startlogging()
+ logging.getLogger().addHandler(sysloghandler)
logging.info('version %s starting', config.VERSION)
- # create socket
- nslcd_serversocket = create_socket()
- # drop all supplemental groups
try:
- os.setgroups(())
- except OSError, e:
- logging.warn('cannot setgroups(()) (ignored): %s', e)
- # change to nslcd gid
- if cfg.gid is not None:
- import grp
- os.setgid(grp.getgrnam(cfg.gid).gr_gid)
- # change to nslcd uid
- if cfg.uid is not None:
- import pwd
- u = pwd.getpwnam(cfg.uid)
- os.setuid(u.pw_uid)
- os.environ['HOME'] = u.pw_dir
- logging.info('accepting connections')
- # start worker threads
- threads = []
- for i in range(cfg.threads):
- thread = threading.Thread(target=worker, name='thread%d' % i)
- thread.setDaemon(True)
- thread.start()
- logging.debug('started thread %s', thread.getName())
- threads.append(thread)
- # wait for all threads to die
- for thread in threads:
- thread.join(10000)
+ # create socket
+ nslcd_serversocket = create_socket()
+ # drop all supplemental groups
+ try:
+ os.setgroups(())
+ except OSError, e:
+ logging.warning('cannot setgroups(()) (ignored): %s', e)
+ # change to nslcd gid
+ if cfg.gid is not None:
+ import grp
+ os.setgid(grp.getgrnam(cfg.gid).gr_gid)
+ # change to nslcd uid
+ if cfg.uid is not None:
+ import pwd
+ u = pwd.getpwnam(cfg.uid)
+ os.setuid(u.pw_uid)
+ os.environ['HOME'] = u.pw_dir
+ logging.info('accepting connections')
+ # start worker threads
+ threads = []
+ for i in range(cfg.threads):
+ thread = threading.Thread(target=worker, name='thread%d' % i)
+ thread.setDaemon(True)
+ thread.start()
+ logging.debug('started thread %s', thread.getName())
+ threads.append(thread)
+ # wait for all threads to die
+ for thread in threads:
+ thread.join(10000)
+ except:
+ logging.exception('main loop exit')
+ # no need to re-raise since we are exiting anyway