import ldap
from logging import warning, debug, critical

class LDAPProxy(object):
    def __init__(self, uri, login, password):
        self.uri = uri
        self.login = login
        self.password = password
        self._reconnect()

    def _reconnect(self):
        try:
            self.c.unbind()
        except:
            pass
        try:
            self.c = ldap.initialize(self.uri)
            self.c.simple_bind_s(self.login, self.password)
        except Exception, error:
            print 'failed to (re)connect to ldap: %s' % error.msg

    def guard(self, func, *kargs, **kwargs):
        _func = getattr(self.c, func)
        try:
            result = _func(*kargs, **kwargs)
        except:
            debug('lost ldap... reconnecting...')
        else:
            return result

        self._reconnect()
        _func = getattr(self.c, func)
        try:
            result = _func(*kargs, **kwargs)
        except:
            critical('ldap connection lost...')
            raise
        else:
            return result
                
    
    def search_s(self, base, scope, filter='(objectClass=*)', attrlist=None, attrsonly=0):
        return self.guard('search_s', base, scope, filter, attrlist, attrsonly)
        
    def modify_s(self, dn, modlist):
        return self.guard('modify_s', dn, modlist)

    def add_s(self, dn, modlist):
        return self.guard('add_s', dn, modlist)

    def modrdn_s(self, dn, newrdn, delold=1):
        return self.guard('modrdn_s', dn, newrdn, delold)

    def delete_s(self, dn):
        return self.guard('delete_s', dn)

    
