2014-02-14 6 views
0

У меня есть демон Pyro4, который хотел бы вернуть соединение с LDAP (созданный модулем python-ldap). Код короткий и простой, но я столкнулся с ошибкой с (я считаю) сериализации объекта соединения при попытке вернуть соединение с клиентским скриптом.Как я могу вернуть сложный тип объекта (соединение python-ldap) из Daemon Pyro4?

class LDAPDaemon(object): 
    def get_ldap_connection(self): 
     conn = ldap.initialize("ldap://ds1") 
     conn.simple_bind_s("cn=Directory Manager", "abc123") 
     return conn 

daemon = Pyro4.Daemon(unixsocket="/tmp/ldap_unix.sock") 
os.system("chmod 700 /tmp/ldap_unix.sock") 
uri=daemon.register(LDAPDaemon(), "LDAPDaemon") 
daemon.requestLoop() 

Тогда в моем сценарии водителя, у меня есть следующее (предположим, что Ури известно, вырезать все, что за ради краткости):

with Pyro4.Proxy(uri) as ldap_daemon: 
    conn = ldap_daemon.get_ldap_connection() 

Это приводит к следующей ошибке:

Traceback (most recent call last): 
    File "./tester.py", line 14, in <module> 
    conn = ldap_daemon.get_ldap_connection() 
    File "/opt/csw/lib/python2.6/site-packages/Pyro4/core.py", line 160, in __call__ 
    return self.__send(self.__name, args, kwargs) 
    File "/opt/csw/lib/python2.6/site-packages/Pyro4/core.py", line 318, in _pyroInvoke 
    raise data 
AttributeError: __class__ 

Я попытался изменить конфигурацию Pyro4 для приема различных сериализаторов, то есть:

Pyro4.config.SERIALIZERS_ACCEPTED = set(['json', 'marshal', 'serpent', 'pickle']) 

но это ничего не меняет.

Просьба игнорировать яркие дыры в безопасности, поскольку это было подавлено до самого базового кода, чтобы вызвать ошибку.

+0

Вы хотите отправить открытое соединение другому процессу, чтобы этот процесс и клиент имели это открытое соединение, а не только прокси-сервер для клиентского соединения? – User

+0

Прокси не нуждается в подключении, мне просто нужно открыть его и передать его вызывающему процессу, потому что это единственный процесс с доступом к нужному паролю. – CptSupermrkt

ответ

1

Вы догадались, что правильно. LDAPOject не является сериализуемым. Аргументы, переданные удаленному объекту, и возвращаемые значения его методов сериализуются, а затем отправляются через сокет. Не сериализуемые объекты будут вызывать ошибки. Вы должны рассмотреть комментарий пользователя, создать прокси для соединения, а не отправлять его другому процессу, или вам нужно найти способ его сериализации.