ejabberd moudle 開發
參考:
http://anders.conbere.org/journal/
http://www.process-one.net/en/wiki/ejabberd_module_development/
ejabberd的內部的不少模塊都是以插件的形式工做,這樣咱們也能夠開發本身的模塊融合到ejabberd中去,完成各類各樣咱們獨特的需求。
ejabberd定義了一個gen_mod behaviour,其要求下面的callback:
Erlang代碼
- start(Host, Opts) -> ok
- stop(Host) -> ok
- * Host = string()
- * Opts = [{Name, Value}]
- * Name = Value = string()
其中Host是運行這module的一個虛擬的主機。
Opts是在配置中指定的mod的參數(後面會講到),能夠經過gen_mod:get_module_opt/4獲取(參看gen_mod.erl代碼得知這些信息存儲在ets中)。
咱們要實現一個mod很是容易,就很是容易了:
Erlang代碼
- -module(my_module).
- -author('your@mail.com').
- -behaviour(gen_mod).
- -include('ejabberd.hrl').
-
- %% gen_mod callback
- -export([start/2, stop/1]).
-
- start(_Host, _Opt) -> ok.
- stop(_Host) -> ok.
讓咱們在添加一代碼,讓咱們這個「無用」的mod更加清晰一些
Erlang代碼
- start(_Host, _Opt) ->
- ?DEBUG("EXAMPLE MODULE LOADING").
編譯my_module,將my_module.beam放到你的ejabberd/ebin目錄中:
mv my_module.beam /var/lib/ejabberd/ebin
接着,咱們須要對ejabberd.cfg作一些配置,告訴ejabberd加載咱們的my_module:
Erlang代碼
- {modules,
- [
- {mod_register, [{access, register}]},
- ...
- {my_module, []} % []爲my_module:start/2中的第二個參數
- ]}.
好了,一切OK後,從新啓動ejabberd,若是你的loglevel設置爲5,那麼你將看到以下信息:
Erlang代碼
- =INFO REPORT==== 2008-07-17 15:33:27 ===
- D(<0.37.0>:ejabberd_auth_my_auth:44) : EXAMPLE MODULE LOADING
咱們的ejabberd module順利加載了。
寫到這裏,您可能會問,如何實現一個更增強大的module呢?
原來ejabberd爲咱們提供了不少的API,能夠供咱們使用,包含以下:
ejabberd core modules (ejabberd核心模塊)
ejabberd events and hooks(ejabberd 事件及鉤子)
ejabberd IQ handlers
ejabberd route table (ejabberd 路由表)
ejabberd HTTP request handlers(ejabberd HTTP 請求處理)
有了這些API,咱們能夠實現任何咱們想要的功能。
歡迎關注本站公眾號,獲取更多信息