Мне нужно подключиться к моему twisted приложению во время выполнения, и я пытаюсь заставить twisted.manhole работать на меня с этой целью. Я нахожусь на Mac OSX 10.6 с twisted 8.2, установленным по умолчанию.
Сервер-пример , использующий twistd, работает. Есть DeprecationWarnings при запуске около md5, sha и twisted.protocols.telnet, но на самом деле manhole-сервер делает то, что должен, и я могу получить доступ к внутреннему содержимому моего приложения:
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
>>> service
>>> service.parent
>>>
Теперь я пытаюсь интегрировать это в мое приложение:
# 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
2011-08-24 16:52:13+1000 [-] start service:
Во второй оболочке запустите 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
>>> service
>>> service == None
True
>>> service.parent
...
exceptions.AttributeError: 'NoneType' object has no attribute 'parent'
>>> some_value
42
Так что кажется, что сервисный объект не может быть использован для доступа к внутреннему содержимому приложения.
OK, так как 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)
Файл 'password file' 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
2011-08-24 17:44:26+1000 [-] start service:
2011-08-24 17:44:26+1000 [-] start service:
Во второй оболочке запустите telnet-клиент - обратите внимание, что некоторые из этих действий на самом деле являются догадками, так как ошибочная строка для чтения Mac OSX (или какая-либо другая вина), кажется, проглотит какой-то вывод оболочки:
host:client user$ telnet localhost 4040
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Username: admin
Password: *****
>>> dir()
['__builtins__']
Так что теперь кажется, что я перестал иметь бесполезный объект service
, а теперь вообще не имею никакого объекта.
Как правильно используется twisted.manhole ?