16

パケットをフィルタリングする ejabberd モジュールを作成しています。を使用していくつかの構成をプルするには、ホスト名を取得する必要がありますgen_mod:get_module_opt()

私は4つの重要な機能を持っています:

  1. start(Host, _Opt): これはモジュールをロードするための ejabberd 関数です。Hostここで原子を取得します
  2. filter_packet({From, To, XML}): これは私のパケット フィルター フックです。ejabberd のフックであるため、この関数にカスタム パラメータを渡すことはできません。
  3. get_translation(XmlData):ループでfilter_packet()呼び出すget_translation()
  4. fetch_translation(XmlData): から再帰的に呼び出されget_translation()ます。これは私が呼び出している場所でgen_mod:get_module_opt()あるため、Host.

私の質問は、グローバル変数Hostから取得start()してグローバル変数に入れ、fetch_translationアクセスできるようにするにはどうすればよいですか?

4

8 に答える 8

9

やり過ぎに聞こえるかもしれませんが、非常に基本的なgen_serverの実装を検討することもできます。コールバックで使用できる状態が含まれており、データをそこに保持できます。あなたの場合、あなたはこれに似たモジュールを書くことができます:

-module(your_module_name).

-behaviour(gen_server).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).

-export([start/2, filter_loop/1]).

start(Host, Opt) ->
  %% start the named gen server
  gen_server:start({local, ?MODULE}, ?MODULE, Host, []).

filter_packet({From, To, XML}) ->
  %% do your thing
  gen_server:call(?MODULE, {fetch_translation, XmlData}).

%% this will be called by gen_server:start - just pass the Host
init(Host) ->
  {ok, Host}.

handle_call({fetch_translation, XmlData}, _From, Host) ->
  %% do your thing
  {reply, ok, Host}.

%% you can ignore the rest - they are needed to be present
handle_cast(_Msg, State) ->
  {noreply, State}.
handle_info(_Info, State) ->
  {noreply, State}.
code_change(_OldVsn, State, _Extra) ->
  {ok, State}.
于 2011-05-19T13:06:48.827 に答える
9

「最も簡単な方法」は、名前付きの ets テーブルを作成し、そこに配置することです。

start(Host, _Opt) ->
  ets:new(my_table, [named_table, protected, set, {keypos, 1}]),
  ets:insert(my_table, {host, Host}),
  ...

fetch_translation(XmlData) ->
  [{_, Host}] = ets:lookup(my_table, host),
  ...

これは「一般的な」解決策であることに注意してください。Ejabberd はあなたが望む機能を提供するかもしれませんが、私はそれを手伝うことはできません。

于 2010-01-06T15:31:42.567 に答える
2

モジュールトップでグローバル変数を定義します...以下のように

-define (Your Variable, "your host name here").

例えば。

-define (RelayHost, "smtp.gmail.com").

このグローバル変数は、モジュール内のすべてのメソッドで使用できます。

io:fwrite("Global Value ~p", [?RelayHost]).

-AjAy

于 2012-02-09T10:56:55.713 に答える
1

あなたが単一ドメインのejabberd展開(仮想ホストなし)にいるよりも、あなたの説明を推測してください。

?MYNAME マクロを使用して、ローカルの XMPP ドメインを取得できます (定義については、ejabberd.hrl を参照してください)。

于 2010-02-01T19:05:21.247 に答える
1

着信パケットをフィルタリングしているとします。To#jid.lserver がホストになる可能性があります。

于 2010-01-17T09:05:52.673 に答える