витой люк: как получить доступ к серверам в приложении? - PullRequest
5 голосов
/ 24 августа 2011

Мне нужно подключиться к моему витому приложению во время выполнения, и я пытаюсь заставить витая.manhole работать на меня с этой целью.Я на Mac OSX 10.6 с витой 8.2 как установленной по умолчанию.

Пример сервера с использованием twistd работает.При запуске есть DeprecationWarnings, касающиеся md5, sha и twisted.protocols.telnet, но сервер-люк фактически делает то, что должен, и я могу получить доступ к внутренним компонентам моего приложения:

host:client user$ telnet localhost 4040
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

twisted.manhole.telnet.ShellFactory
Twisted 8.2.0
username: admin
password: *****
>>> dir()
['_', '__builtins__', 'factory', 'service']
>>> factory
<twisted.manhole.telnet.ShellFactory instance at 0x101256440>
>>> service
<twisted.application.internet.TCPServer instance at 0x10124ff38>
>>> service.parent
<twisted.application.service.MultiService instance at 0x1014b0cf8>
>>> 

Теперь я пытаюсь интегрироватьэто в моем приложении:

# test_manhole.tac

from twisted.application.internet import TCPServer
from twisted.application.service  import Application, IServiceCollection
from twisted.manhole.telnet       import ShellFactory

shell_factory = ShellFactory()
shell_factory.username = 'admin'
shell_factory.password = 'admin'
shell_factory.namespace['some_value'] = 42
shell_tcp_server = TCPServer(4040, shell_factory)

application = Application('test')
serviceCollection = IServiceCollection(application)

shell_tcp_server.setServiceParent(serviceCollection)

Запустите приведенный выше код в оболочке:

host:server user$ twistd -noy test_manhole.tac
(omitting the same DeprecationWarnings about md5, sha and twisted.protocols.telnet as earlier)
2011-08-24 16:52:13+1000 [-] Log opened.
2011-08-24 16:52:13+1000 [-] twistd 8.2.0 (/usr/bin/python2.6 2.6.1) starting up.
2011-08-24 16:52:13+1000 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
2011-08-24 16:52:13+1000 [-] twisted.manhole.telnet.ShellFactory starting on 4040
2011-08-24 16:52:13+1000 [-] Starting factory <twisted.manhole.telnet.ShellFactory instance at 0x1012cfdd0>
2011-08-24 16:52:13+1000 [-] start service:  <twisted.application.internet.TCPServer instance at 0x1012cff80>

Во второй оболочке запустите клиент telnet:

host:client user$ telnet localhost 4040
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

twisted.manhole.telnet.ShellFactory
Twisted 8.2.0
username: admin
password: *****
>>> dir()
['_', '__builtins__', 'factory', 'service', 'some_value']
>>> factory
<twisted.manhole.telnet.ShellFactory instance at 0x1012cfdd0>
>>> service
>>> service == None
True
>>> service.parent
      ...
exceptions.AttributeError: 'NoneType' object has no attribute 'parent'
>>> some_value
42

Таким образом, кажется, что сервисный объект не может использоваться для доступа к внутренним компонентам приложения.

ОК, так как twisted.protocols.telnet в любом случае, похоже, был заменен twisted.conch.telnet, попробуйте использовать более новый модуль:

# test_manhole_2.tac

from twisted.application.service import Application, IServiceCollection
from twisted.conch.manhole_tap   import makeService

options = \
{
    # for some reason, these must
    # all exist, even if None
    'namespace'  : None,
    'passwd'     : 'users.txt',
    'sshPort'    : None,
    'telnetPort' : '4040',
}

shell_service = makeService(options)

application = Application('test')
serviceCollection = IServiceCollection(application)

shell_service.setServiceParent(serviceCollection)

«Файл паролей» users.txt может содержать всего одну строку с примером имени пользователя и пароля, например, admin:admin.

Запустить тестовый сервер:

host:server user$ twistd -noy test_manhole_2.tac
(omitting DeprecationWarnings about md5 and sha)
2011-08-24 17:44:26+1000 [-] Log opened.
2011-08-24 17:44:26+1000 [-] twistd 8.2.0 (/usr/bin/python2.6 2.6.1) starting up.
2011-08-24 17:44:26+1000 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
2011-08-24 17:44:26+1000 [-] twisted.internet.protocol.ServerFactory starting on 4040
2011-08-24 17:44:26+1000 [-] Starting factory <twisted.internet.protocol.ServerFactory instance at 0x10181e710>
2011-08-24 17:44:26+1000 [-] start service:  <twisted.application.service.MultiService instance at 0x1012553b0>
2011-08-24 17:44:26+1000 [-] start service:  <twisted.application.internet.TCPServer instance at 0x10181e998>

Inвторая оболочка, запустите клиент telnet - обратите внимание, что некоторые из них на самом деле являются догадками, поскольку глючная readline Mac OSX (или что-то еще в этом виноват), похоже, проглатывает какой-то вывод оболочки:

host:client user$ telnet localhost 4040
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Username: admin
Password: *****

>>> dir()
['__builtins__']

Так что теперькажется, я ушла от Auseless service объект без объекта вообще.

Как правильно использовать витую трубу?

1 Ответ

5 голосов
/ 24 августа 2011

Продолжайте использовать twisted.conch и поместите что-нибудь в словарь пространства имен.

namespace = {"your_application_object": some_object}

options = {
    # for some reason, these must
    # all exist, even if None
    'namespace'  : namespace,
    'passwd'     : 'users.txt',
    'sshPort'    : None,
    'telnetPort' : '4040',
}
...