Доброе утро,
Написал программку по синхронизации данных из CSV в MS Active Directory (все операции с LDAP провожу используя ldap3). Т.к. программа сперва была меньше, всё было описано в одном файле - все функции, процесс загрузки данных из файла, подключение к LDAP. Сейчас, больше для собственного развития, я раскидал функции и переменный по библиотекам:
1. содержит глобальные переменные (например, общие настройки, загружаемые из JSON) - libsettings.py;
2. функции для работы с LDAP (создание подключения, обновление/получение данных) - libldap.py;
3. одна для работы с CSV (проверка, загрузка, обработка) - libscv.py;
4. файл main.py, где выполняется основной бесконечный цикл, проверяющий были ли внесены изменения в файл CSV и, если да, выполняющий основной сценарий - получение и обновление данных, где это требуется.
Собственно, проблема - соединение с LDAP открывается единожды и сохраняется в переменную LDAP_CONN (это кортеж из двух элементов - ldap3.Server, ldap3.Connection). Через некоторое время при бездействии сервер принудительно закрывает подключение и программа падает в исключения - LDAPSocketSendError, LDAPSASLBindInProgressError. Мне нужно ловить их и переустанавливать соединение заново. Я решил, что решение в том, чтобы удалять LDAP_CONN и формировать его заново. Типа того:
try:
conn.search('OU=Users,DC=domain,DC=company,DC=com', search_filter='(samaccountname=Ltolstoy)', attributes=['sn', 'mobile', 'telephonenumber'])
except LDAPSocketSendError:
conn = ldap3.Connection(server, authentication='NTLM', user='domain\\user', password='passw0rd', auto_bind=True)
conn.search('OU=Users,DC=domain,DC=company,DC=com', search_filter='(samaccountname=Ltolstoy)', attributes=['sn', 'mobile', 'telephonenumber'])
except LDAPSASLBindInProgressError:
conn = ldap3.Connection(server, authentication='NTLM', user='domain\\user', password='passw0rd', auto_bind=True)
conn.search('OU=Users,DC=domain,DC=company,DC=com', search_filter='(samaccountname=Ltolstoy)', attributes=['sn', 'mobile', 'telephonenumber'])
Это бы сработало при размещении программы в одном файле, но мне нужно переписать переменную LDAP_CONN в библиотеке. Как это правильно выполнить? Или я изначально выбрал неверную структуру? Была идея вынести установление соединения в main.py и отдавать его оттуда, что вроде бы должно решить проблему.