summaryrefslogtreecommitdiff
path: root/pynslcd/search.py
diff options
context:
space:
mode:
Diffstat (limited to 'pynslcd/search.py')
-rw-r--r--pynslcd/search.py22
1 files changed, 22 insertions, 0 deletions
diff --git a/pynslcd/search.py b/pynslcd/search.py
index 9629bec..219929b 100644
--- a/pynslcd/search.py
+++ b/pynslcd/search.py
@@ -25,6 +25,11 @@ import ldap
import ldap.ldapobject
import cfg
+import nscd
+
+
+# global indicator that there was some error connection to an LDAP server
+server_error = False
class Connection(ldap.ldapobject.ReconnectLDAPObject):
@@ -50,6 +55,23 @@ class Connection(ldap.ldapobject.ReconnectLDAPObject):
if cfg.ssl or cfg.uri.startswith('ldaps://'):
self.set_option(ldap.OPT_X_TLS, ldap.OPT_X_TLS_HARD)
+ def reconnect_after_fail(self):
+ logging.info('connected to LDAP server %s', cfg.uri)
+ nscd.invalidate()
+
+ def search_s(self, *args, **kwargs):
+ # wrapper function to keep the global server_error state
+ global server_error
+ try:
+ res = ldap.ldapobject.ReconnectLDAPObject.search_s(self, *args, **kwargs)
+ except ldap.SERVER_DOWN:
+ server_error = True
+ raise
+ if server_error:
+ self.reconnect_after_fail()
+ server_error = False
+ return res
+
class LDAPSearch(object):
"""