О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
ejabberd. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
{[ejabberd@node1,
{badrpc,{'EXIT',{{badfun,#Fun},
[{erlang,apply,2},{rpc,'-handle_call/3-fun-0-',5}]}}},
{badrpc,{'EXIT',{{badfun,#Fun},
[{erlang,apply,2},{rpc,'-handle_call/3-fun-0-',5}]}}},
[]}
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫? О©╫О©╫О©╫О©╫О©╫О©╫ fun О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫?
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ fun О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫,
О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫
О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
С уважением,
Кирилл Заборский.
11 февраля 2011 г. 18:15 пользователь Еремихин Алексей <ale...@mail.ru> написал:
> Захотелось мне иметь возможность выполнить произвольный код на удалённых
> нодах. Взял консоль и написал в ней
>> rpc:multicall(erlang, apply, [fun()->[node()] end, []]).
> {[[ejabberd@node1],
> [ejabberd@node2],
> [ejabberd@node3],
> [zzz@node1]],
> []}
>
> А после этого захотелось мне сделать эту же операцию из админки ejabberd.
> Исправил на одной ноде модуль, добавил реквест хендлер.
> Скомпилил модуль и проапдейтил код только на этой ноде. Дёрнул в браузере и
> получил удивительный результат.
>
> {[ejabberd@node1,
> {badrpc,{'EXIT',{{badfun,#Fun},
> [{erlang,apply,2},{rpc,'-handle_call/3-fun-0-',5}]}}},
> {badrpc,{'EXIT',{{badfun,#Fun},
> [{erlang,apply,2},{rpc,'-handle_call/3-fun-0-',5}]}}},
> []}
>
>
> Объясните мне пожалуйста, что я делаю не так? Почему fun выполнился только
> на той ноде, где я изменил код?
>
> Сначала мне показалось, что fun как таковой не передаётся между нодами, а
> передаётся некий индентификатор, но
> это не объясняет почему вызов из консоли дал ожидаемый результат, а вот
> вызов из модуля вернул весьма неожиданные данные.
>
> --
> Страница рассылки: http://groups.google.com/group/erlang-russian
> Jabber-конференция: erl...@conference.jabber.ru
> Новости: http://erlanger.ru
> Написать письмо: erlang-...@googlegroups.com
> Отписаться: erlang-russia...@googlegroups.com
>
Захотелось мне иметь возможность выполнить произвольный код на удалённых нодах. Взял консоль и написал в ней
> rpc:multicall(erlang, apply, [fun()->[node()] end, []]).
{[[ejabberd@node1],
[ejabberd@node2],
[ejabberd@node3],
[zzz@node1]],
[]}
А после этого захотелось мне сделать эту же операцию из админки ejabberd. Исправил на одной ноде модуль, добавил реквест хендлер.
Скомпилил модуль и проапдейтил код только на этой ноде. Дёрнул в браузере и получил удивительный результат.
{[ejabberd@node1,
{badrpc,{'EXIT',{{badfun,#Fun},
[{erlang,apply,2},{rpc,'-handle_call/3-fun-0-',5}]}}},
{badrpc,{'EXIT',{{badfun,#Fun},
[{erlang,apply,2},{rpc,'-handle_call/3-fun-0-',5}]}}},
[]}