While running kolab sync I stumpled across the following traceback
2019-12-22 21:31:51,913 pykolab.auth DEBUG [25051] Synchronization is using filter '(&(|(objectclass=kolabinetorgperson)(|(objectclass=kolabgroupofuniquenames)(objectclass=kolabgroupofurls))(|(|(objectclass=groupofuniquenames)(objectclass=groupofurls))(objectclass=kolabsharedfolder))(objectclass=kolabsharedfolder))(modifytimestamp>=19000101000000Z))'
2019-12-22 21:31:51,914 pykolab.auth DEBUG [25051] Searching root dn for domain 'DOMAIN'
2019-12-22 21:31:51,915 pykolab.auth DEBUG [25051] bind() called but already bound
2019-12-22 21:31:51,915 pykolab.auth DEBUG [25051] Finding domain root dn for domain DOMAIN
2019-12-22 21:31:51,915 pykolab.auth DEBUG [25051] Searching with filter '(&(associatedDomain=DOMAIN))'
2019-12-22 21:31:51,916 pykolab.auth DEBUG [25051] *** <ldap.ldapobject.ReconnectLDAPObject instance at 0x7fbc36930908> ldap://localhost:389 - ReconnectLDAPObject.search_ext
2019-12-22 21:31:51,917 pykolab.auth DEBUG [25051] (('ou=Domains,ROOTDN',
2019-12-22 21:31:51,917 pykolab.auth DEBUG [25051] 2,
2019-12-22 21:31:51,917 pykolab.auth DEBUG [25051] '(&(associatedDomain=DOMAIN))',
2019-12-22 21:31:51,918 pykolab.auth DEBUG [25051] None,
2019-12-22 21:31:51,918 pykolab.auth DEBUG [25051] 0,
2019-12-22 21:31:51,918 pykolab.auth DEBUG [25051] None,
2019-12-22 21:31:51,919 pykolab.auth DEBUG [25051] None,
2019-12-22 21:31:51,919 pykolab.auth DEBUG [25051] -1,
2019-12-22 21:31:51,920 pykolab.auth DEBUG [25051] 0),
2019-12-22 21:31:51,920 pykolab.auth DEBUG [25051] {})
2019-12-22 21:31:51,921 pykolab.auth DEBUG [25051] *** <ldap.ldapobject.ReconnectLDAPObject instance at 0x7fbc36930908> ldap://localhost:389 - ReconnectLDAPObject.result4
2019-12-22 21:31:51,922 pykolab.auth DEBUG [25051] ((2, False, 0, 0, 0, 0), {})
2019-12-22 21:31:51,922 pykolab.auth DEBUG [25051] *** <ldap.ldapobject.ReconnectLDAPObject instance at 0x7fbc36930908> ldap://localhost:389 - ReconnectLDAPObject.result4
2019-12-22 21:31:51,923 pykolab.auth DEBUG [25051] ((2, False, 0, 0, 0, 0), {})
2019-12-22 21:31:51,923 pykolab.auth DEBUG [25051] Setting domain root dn from LDAP for domain 'DOMAIN': 'ROOTDN'
2019-12-22 21:31:51,924 pykolab.auth DEBUG [25051] Synchronization is searching against base DN: ROOTDN
2019-12-22 21:31:51,924 pykolab.auth ERROR [25051] An error occured using _paged_search: TypeError('encode_page_control() argument 2 must be string or read-only buffer, not None',)
2019-12-22 21:31:51,925 pykolab.auth ERROR [25051] Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/pykolab/auth/ldap/__init__.py", line 3169, in _search
secondary_domains
File "<string>", line 10, in <module>
File "/usr/lib/python2.7/dist-packages/pykolab/auth/ldap/__init__.py", line 2908, in _paged_search
serverctrls=[server_page_control]
File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 839, in search_ext
RequestControlTuples(serverctrls),
File "/usr/lib/python2.7/dist-packages/ldap/controls/__init__.py", line 119, in RequestControlTuples
for c in ldapControls
File "/usr/lib/python2.7/dist-packages/ldap/controls/libldap.py", line 77, in encodeControlValue
return _ldap.encode_page_control(self.size,self.cookie)
TypeError: encode_page_control() argument 2 must be string or read-only buffer, not NoneIt looks like the Page control must be changed to support a 2nd argument.
/usr/lib/python2.7/dist-packages/pykolab/auth/ldap/__init__.py
Line 2899 - before:
server_page_control = ldap.controls.libldap.SimplePagedResultsControl(size=page_size)
Line 2899 - after:
server_page_control = ldap.controls.libldap.SimplePagedResultsControl(size=page_size,cookie='')
After this change, the kolab sync was running fine.