ReconnectLDAPObject doesn't reconnect after main failure
Alain Spineux
aspineux at gmail.com
Fri Jan 26 22:39:37 CET 2007
When testing ReconnectLDAPObject I found a bug.
The object doesn't reconnect after a main failure !
If I shutdown the ldap server and try a request, I get a
ldap.SERVER_DOWN, this is correct. (this is what I call the main
failure)
But if I restart the server, and retry the same request (with the same
object), I get an empty answer but no error!
I'm expecting a correct answer or an error (exception)!
I have a full script that show the problem at the end.
It look the object is in an incoherent state after the main failure,
in fact in an unauthenticated state ! I thing this is a problem with
libldap or openldap, not with python code.
I thing the main probleme is here !
Look !
l=ldap.ldapobject.ReconnectLDAPObject(ldap_url.initializeUrl())
l.simple_bind_s('cn=nobody,cn=internal,dc=asxnet,dc=loc', '***********')
print 'search', l.search_s(ldap_url.dn, ldap.SCOPE_SUBTREE, "(objectClass=*)")
works and return all object anonymous can get, but
l=ldap.ldapobject.ReconnectLDAPObject(ldap_url.initializeUrl())
print 'search', l.search_s(ldap_url.dn, ldap.SCOPE_SUBTREE, "(objectClass=*)")
this work too ! And don't give any error while their is no bind !
work like if l.simple_bind_s('', '') where used just before the search !
I wrote a patch but this is only a workaround that detect the main
failure, set a flag and force a reconnect before any request if the
flag is set.
Here is the output of my test case
I use a modified python-ldap, that include the patch posted in my
previous post that enable reconnect to work with whoami_s()
-- without debuging --
OpenPKG: stop: openldap.
OpenPKG: start: openldap.
Connected
whoami dn:cn=nobody,cn=internal,dc=asxnet,dc=loc
OpenPKG: stop: openldap.
OpenPKG: start: openldap.
whoami dn:cn=nobody,cn=internal,dc=asxnet,dc=loc
reconnect ok
OpenPKG: stop: openldap.
ok: ldap.SERVER_DOWN, server is realy down
OpenPKG: start: openldap.
whoami
It look i'am connected, but like anonymous
-- with debuging --
OpenPKG: stop: openldap.
OpenPKG: start: openldap.
*** ldap://localhost:389 - ReconnectLDAPObject.set_option ((17, 3),{})
*** ldap://localhost:389 - ReconnectLDAPObject.simple_bind
(('cn=nobody,cn=internal,dc=asxnet,dc=loc',
'iMmTWz5pJ+lwY7i6M/BU61ngo1aBLyqQhRrrKbEc', None, None),{})
*** ldap://localhost:389 - ReconnectLDAPObject.result3 ((1, 1, -1),{})
Connected
*** ldap://localhost:389 - ReconnectLDAPObject.whoami_s ((None, None),{})
whoami dn:cn=nobody,cn=internal,dc=asxnet,dc=loc
OpenPKG: stop: openldap.
OpenPKG: start: openldap.
*** ldap://localhost:389 - ReconnectLDAPObject.whoami_s ((None, None),{})
*** Try 1. reconnect to ldap://localhost:389...
*** ldap://localhost:389 - ReconnectLDAPObject.set_option ((17, 3),{})
*** ldap://localhost:389 - ReconnectLDAPObject.simple_bind
(('cn=nobody,cn=internal,dc=asxnet,dc=loc',
'iMmTWz5pJ+lwY7i6M/BU61ngo1aBLyqQhRrrKbEc', None, None),{})
*** ldap://localhost:389 - ReconnectLDAPObject.result3 ((1, 1, -1),{})
*** 1. reconnect to ldap://localhost:389 successful, last operation
will be repeated
*** ldap://localhost:389 - ReconnectLDAPObject.whoami_s ((None, None),{})
whoami dn:cn=nobody,cn=internal,dc=asxnet,dc=loc
reconnect ok
OpenPKG: stop: openldap.
*** ldap://localhost:389 - ReconnectLDAPObject.whoami_s ((None, None),{})
*** Try 1. reconnect to ldap://localhost:389...
*** ldap://localhost:389 - ReconnectLDAPObject.set_option ((17, 3),{})
*** ldap://localhost:389 - ReconnectLDAPObject.simple_bind
(('cn=nobody,cn=internal,dc=asxnet,dc=loc',
'iMmTWz5pJ+lwY7i6M/BU61ngo1aBLyqQhRrrKbEc', None, None),{})
*** 1. reconnect to ldap://localhost:389 failed
ok: ldap.SERVER_DOWN, server is realy down
OpenPKG: start: openldap.
*** ldap://localhost:389 - ReconnectLDAPObject.whoami_s ((None, None),{})
whoami
It look i'am connected, but like anonymous
---- and finaly my test case ----
import sys, os, time
import ldap, ldapurl
host='localhost'
port=389
who='cn=nobody,cn=internal,dc=asxnet,dc=loc'
cred='iMmTWz5pJ+lwY7i6M/BU61ngo1aBLyqQhRrrKbEc'
dn='dc=asxnet,dc=loc'
def ldap_service(action):
os.system('/kolab/bin/openpkg rc openldap %s' % action)
if action.endswith('start'):
time.sleep(1)
def check_connection():
whoami=l.whoami_s()
print 'whoami', whoami
# this search dont give any result as anonymous, but well if
loggged as nobody
#result=l.search_s(ldap_url.dn, ldap.SCOPE_SUBTREE,
"(member=cn=domain.maintainer
mydomain.loc,cn=internal,dc=asxnet,dc=loc)")
#print 'search', result
ldap_url=ldapurl.LDAPUrl('ldap://%s:%d/%s' % (host, port, dn))
ldap_url.applyDefaults({
'who': who,
'cred' : cred, })
# to be sure the server is up
ldap_service('stop')
ldap_service('start')
l=ldap.ldapobject.ReconnectLDAPObject(ldap_url.initializeUrl(), 1)
# l=ldap.ldapobject.LDAPObject(ldap_url.initializeUrl())
l.simple_bind_s(ldap_url.who, ldap_url.cred)
print 'Connected'
check_connection()
ldap_service('stop')
ldap_service('start')
try:
check_connection()
except ldap.SERVER_DOWN:
print "Error: ldap.SERVER_DOWN !"
else:
print "reconnect ok"
ldap_service('stop')
try:
check_connection()
except ldap.SERVER_DOWN:
print "ok: ldap.SERVER_DOWN, server is realy down"
ldap_service('start')
check_connection()
print "It look i'am connected, but like anonymous"
import sys, os, time
import ldap, ldapurl
host='localhost'
port=389
who='cn=nobody,cn=internal,dc=asxnet,dc=loc'
cred='iMmTWz5pJ+lwY7i6M/BU61ngo1aBLyqQhRrrKbEc'
dn='dc=asxnet,dc=loc'
def ldap_service(action):
os.system('/kolab/bin/openpkg rc openldap %s' % action)
if action.endswith('start'):
time.sleep(1)
def check_connection():
#print 'search', l.search_s(ldap_url.dn, ldap.SCOPE_SUBTREE,
"(member=cn=domain.maintainer
mydomain.loc,cn=internal,dc=asxnet,dc=loc)")
print 'whoami', l.whoami_s()
ldap_url=ldapurl.LDAPUrl('ldap://%s:%d/%s' % (host, port, dn))
ldap_url.applyDefaults({
'who': who,
'cred' : cred, })
ldap_service('stop')
ldap_service('start')
l=ldap.ldapobject.ReconnectLDAPObject(ldap_url.initializeUrl())
# l=ldap.ldapobject.LDAPObject(ldap_url.initializeUrl())
l.simple_bind_s(ldap_url.who, ldap_url.cred)
print 'Connected'
check_connection()
ldap_service('stop')
ldap_service('start')
try:
check_connection()
except ldap.SERVER_DOWN:
print "Error: ldap.SERVER_DOWN !"
ldap_service('stop')
try:
check_connection()
except ldap.SERVER_DOWN:
print "Ok: ldap.SERVER_DOWN"
ldap_service('start')
check_connection()
ANY Comments ?
--
Alain Spineux
aspineux gmail com
May the sources be with you
More information about the python-ldap
mailing list