0

ejabberd から Python スクリプトにパケットを送信しようとすると、Python スクリプトが機能を実行して (true または false) を返します。そのプロジェクト名を見つけました: Erlang を他の多くのプログラミング言語に接続するのに役立つ ErlPort です。

100% 動作していますが、大量のパケットを受信すると、ejabberd がシャットダウンします。

この例は 100% 動作しますが、前に言ったように大量のパケットが送信されるとクラッシュしました:

私のPythonスクリプト

from erlport import Port, Protocol, String

class SecurityProtocol(Protocol):
    def handle_security(self, body):
        BadList = ["bad1", "bad2"]
        body = String(body).lower()
        body = u" " + body + u" "
        for x in BadList:
            if body.count(x): return True
        return False

if __name__ == "__main__":
    proto = SecurityProtocol()
    proto.run(Port(use_stdio=True))

(ejabberd_c2s.erl) 行 1896 --> ejabberd v2.1.13:

security(Body) ->
    Port = open_port({spawn, "python -u /home/ejabberd/lib/ejabberd/ebin/security.py"}, [{packet, 1}, binary, use_stdio]),
    ReqData = term_to_binary({security, Body}),
    port_command(Port, ReqData),
    receive
        {Port, {data, RespData}} ->
            binary_to_term(RespData)
    after
        5000 ->
            {error, timeout}
    end.

privacy_check_packet(StateData, From, To, Packet, Dir) ->
    case Packet of
        {xmlelement, "message", _, _} ->
            LBody = xml:get_subtag_cdata(Packet, "body"),
            case security(LBody) of
                true -> deny;
                false -> ejabberd_hooks:run_fold(privacy_check_packet, StateData#state.server, allow, [StateData#state.user, StateData#state.server, StateData#state.privacy_list, {From, To, Packet}, Dir]);
                _ -> "Error TimeOut"
            end
    end.

エラーは次のとおりです。http://paste.ubuntu.com/15414683/

エラーや問題なく ejabberd を Python スクリプトに接続する方法はありますか?

4

0 に答える 0