Туннельный интерфейс Redhawk CORBA через брандмауэр
У меня есть особая проблема, которую я пытаюсь решить, которая заключается в использовании интерфейса, реализованного компонентами Redhawk через брандмауэр.
На сайте omniORB я нашел следующие инструкции по туннелированию интерфейсов CORBA через брандмауэр (прокрутите вниз до SSH-туннелей с omniORB):
http://www.omniorb.net/omniwiki/UsefulTips
В двух словах, инструкции говорят запустить ваш сервер на одной стороне туннеля (регистрирует интерфейсный объект с помощью службы имен), а затем использовать инструменты omniORB 'nameclt' и 'converttior', чтобы изменить IOR для указания на другую сторону туннеля. и привязать IOR к объекту интерфейса.
Используя пример omniORB Echo, я могу успешно использовать описанную выше технику для туннелирования сообщений GIOP и иметь клиент на одной машине, который получает доступ к интерфейсу Echo на другой через туннель. (Предположим на данный момент, что служба имен может быть видна обеим машинам на обоих концах туннеля).
Проблема, которую я имею, состоит в том, чтобы воспроизвести эту технику, используя компоненты Redhawk. Если у меня есть компонент, реализующий интерфейс "echo", мне неясно, как я могу извлечь IOR и изменить его, используя описанную выше технику, чтобы компонент на другой стороне туннеля мог его видеть. Я не вижу интерфейс, зарегистрированный в службе имен, только домен и диспетчер устройств, на которых размещен компонент. Я могу ошибаться, но я считаю, что это потому, что SCA CF оборачивает эти интерфейсы внутри диспетчера доменов / диспетчера устройств.
Я думаю, что могу использовать среду Redhawk Python, чтобы получить то, что мне нужно, но я не уверен, что делать дальше. Я считаю, что могу получить домен, устройство, интерфейс и IOR следующим образом:
from ossie.utils import redhawk
from omniORB import CORBA
orb = CORBA.ORB_init(0, CORBA.ORB_ID)
dom1 = redhawk.attach("Domain1")
device1 = dom1.devices[0]
echoIF = device1.getPort("EchoIn")
echoIOR = orb.object_to_string(echoIF)
Это, кажется, дает мне IOR для интерфейса Echo (использование инструмента catior показывает правильный интерфейс), но тогда я не уверен, что делать дальше. Я попытался скопировать IOR и использовать 'converttior' внутри терминала, чтобы изменить IOR, а затем с помощью службы именования в Python выполнить повторное связывание:
namesvc = orb.resolve_initial_references("NameService")
namecontext = namesvc._narrow(CosNaming.NamingContext)
namecontext.rebind(echoIOR, echoIF)
Но это вызывает исключение "Ожидается последовательность, полученная типа 'str'". Глядя на интерфейс повторной привязки, мне, вероятно, нужен ключ объекта для IOR, но я не знаю, как это получить. Я надеялся, что среда Python позволит мне использовать ссылку на объект в качестве аргумента для повторной привязки IOR, тем более что шар предоставляет механизм для прямого перехода между ссылкой на объект и строкой IOR.
Другая проблема, если предположить, что клиентский компонент работает в другом домене на другой стороне туннеля, как только мне удастся повторно привязать IOR сервера, как клиентский компонент получает его для разрешения соединения? Если интерфейс не указан по имени в службе имен, то как его увидит домен клиента?
Я чувствую, что я очень близок к тому, чтобы заставить это работать, я просто пропускаю шаг или два. Любая помощь будет принята с благодарностью.
1 ответ
Для операции повторного связывания требуется имя CosNaming и ссылка. Имя следует форме "naming_context/object_name", но его нужно поместить в последовательность классов CosNaming.NameComponent
, omniORB
включает в себя помощник для этого:
from omniORB import URI
name = URI.stringToName("naming_context_1/naming_context_n/object_name")
так в вашем случае:
echoName=URI.stringToName('name_in_nameservice')
namecontext.rebind(echoName, echoIF)
Если вы используете nameclt
чтобы посмотреть на службу имен, вы увидите там свою привязку.
Настройка вашей системы для работы через брандмауэры очень зависит от конфигурации, поэтому моя способность предоставлять информацию очень ограничена