• Ejabberd源码解析前奏--管理


    一、ejabberdctl

        使用ejabberdctl命令行管理脚本,你可以执行ejabberdctl命令和一些普通的ejabberd命令(后面会详细解说)。这意味着你可以在一个本地或远程ejabberd服务器(通过提供参数 --node NODENAME)上启动、停止以及执行很多其它管理任务。

        ejabberdctl脚本可在文件 ejabberdctl.cfg 里配置. 这个文件包含每个可配置选项的详细信息.

        ejabberdctl脚本返回一个数字状态码. 成功显示为0, 错误显示为1, 其它码可被用于特定结果. 这可以由其它脚本使用,来自动决定一个命令成功与否, 例如使用: echo $?。

    1、ejabberdctl命令

        不带任何参数执行ejabberdctl时, 它显示可用的选项. 如果没有一个ejabberd服务器在运行, 可用的参数如下:

        start

        以后台模式启动ejabberd. 这是缺省方法.

        debug

        连接一个 Erlang shell 到一个已存在的 ejabberd 服务器. 这允许在ejabberd服务器上执行交互命令.

        live

        以live模式启动ejabberd: shell保持连接到已启动的服务器, 显示日志信息并允许执行交互命令.

        如果已经有一个ejabberd服务器在系统里运行, ejabberdctl 展示以下 ejabberdctl 命令描述以及那台服务器上所有可用的 ejabberd命令.

        ejabberdctl命令如下:

        help

        获得关于ejabberdctl或任何可用命令的帮助. 试下ejabberdctl help help.

        status

        检查ejabberd服务器的状态.

        stop

        停止ejabberd服务器.

        restart

        重启ejabberd服务器.

        mnesia

        获得关于Mnesia数据库的信息.

        ejabberdctl脚本可被限制为需要验证并执行一些ejabberd命令,增加这个选项到文件 ejabberd.cfg. 下面例子表示没有限制:

        {ejabberdctl_access_commands, []}.

        如果帐号robot1@example.org被注册到ejabberd,密码为abcdef(作MD5后为E8B501798950FC58AAD83C8C14978E), 并且 ejabberd.cfg 包含以下设定:

        {hosts, ["example.org"]}. 

        {acl, bots, {user, "robot1", "example.org"}}. 

        {access, ctlaccess, [{allow, bots}]}. 

        {ejabberdctl_access_commands, {ctlaccess, [registered_users, register], []]}.

        那么你可以在 shell 里这么做:

        $ ejabberdctl registered_users example.org

        Error: no_auth_provided

        $ ejabberdctl --auth robot1 example.org E8B501798950FC58AAD83C8C14978E registered_users example.org

        robot1

        testuser1

        testuser2

    2、Erlang运行时系统

        ejabberd是一个 Erlang/OTP 应用,运行在一个Erlang运行时系统内部. 这个系统是用环境变量和命令行参数来配置的. ejabberdctl管理脚本可能会使用其中的一些. 你可以在ejabberdctl.cfg文件里配置其中的一部分, 配置文件里面已包含了关于它们的详细描述. 本节描述所有环境变量和命令行参数的意义.

        环境变量:

        EJABBERD_CONFIG_PATH

        ejabberd配置文件的路径.

        EJABBERD_MSGS_PATH

        翻译字符串的目录路径.

        EJABBERD_LOG_PATH

        ejabberd服务日志文件的路径.

        EJABBERD_SO_PATH

        二进制系统库的目录路径.

        EJABBERD_DOC_PATH

        ejabberd文档的目录路径.

        EJABBERD_PID_PATH

        ejabberd启动时建立PID文件的路径.

        HOME

        ejabberd的Home目录的路径. 这个路径用于读取文件.erlang.cookie.

        ERL_CRASH_DUMP

        崩溃报告dump文件的路径.

        ERL_INETRC

        指示使用名字解析的IP. 如果使用 -sname, 要么指定这个选项,要么指定 -kernel inetrc filepath.

        ERL_MAX_PORTS

        并发开放的Erlang端口的最大数量.

        ERL_MAX_ETS_TABLES

        ETS和Mnesia表的最大数量.

        命令行参数:

        -sname ejabberd

        这个Erlang节点将只使用主机名的第一部分来指定, 即本域之外的其它Erlang节点不能够联系联络这个节点. 在大多数情况下这是更可取的选择.

        -name ejabberd

        这个Erlang节点将被完全指定. 这只在你计划在不同的网络配置一个ejabberd集群时有用.

        -kernel inetrc ’"/etc/ejabberd/inetrc"’

        指出使用名字解析的IP. 如果使用 -sname, 要么指定这个选项,要么指定 ERL_INETRC.

        -kernel inet_dist_listen_min 4200 inet_dist_listen_min 4210

        定义 epmd 可以监听的第一个和最后一个端口.

        -detached

        启动Erlang系统并从系统控制台分离. 运行守护进程和后台进程时有用.

        -noinput

        确保Erlang系统不尝试读任何输入. 运行守护进程和后台进程时有用.

        -pa /var/lib/ejabberd/ebin

        指定Erlang二进制文件(*.beam)所在目录.

        -s ejabberd

        告诉Erlang运行时系统启动ejabberd应用.

        -mnesia dir ’"/var/lib/ejabberd/"’

        指定Mnesia数据库目录.

        -sasl sasl_error_logger {file, "/var/log/ejabberd/erlang.log"}

        Erlang/OTP系统日志文件的路径. 这里SASL意味着 系统架构支持库“System Architecture Support Libraries” 而不是 简单认证和安全层 “Simple Authentication and Security Layer”.

        +K [true|false]

        内核轮询.

        -smp [auto|enable|disable]

        SMP(多CPU)支持.

        +P 250000

        Erlang进程的最大数量.

        -remsh ejabberd@localhost

        在一个远程Erlang节点上打开一个Erlang shell.

        -hidden

        到其它节点的连接是隐藏的(没有公开发布),结果是这个节点不被认为是集群的一部分. 当启动一个临时的ctl或debug节点的时候这是很重要的.

        注意:当使用shell脚本的时候,需要避免使用一些字符, 例如 " 和 {}. 你可在Erlang手册页 (erl -man erl)找到其它选项.

    二、ejabberd命令

        一个ejabberd命令是一个通过名字指定的抽象函数, 该函数在ejabberd_commands服务里注册,并指定调用参数的编号和类型以及输出类型. 那些命令能被定义在任何Erlang模块里,并能使用任何合法的前端执行.

        ejabberd包含一个前端用来执行ejabberd命令即脚本ejabberdctl. 其它已知可执行ejabberd命令的前端有: ejabberd_xmlrpc (XML-RPC 服务), mod_rest (HTTP POST 服务), mod_shcommands (ejabberd WebAdmin 页面).

    1、ejabberd命令清单

        ejabberd缺省包含了一些ejabberd命令. 当更多模块被安装时, 在前端又会有新命令可以用.

        获得可用命令和帮助的最简单方法是使用ejabberdctl脚本:

        $ ejabberdctl help 

        Usage: ejabberdctl [--node nodename[--auth user host passwordcommand [options]

        Available commands in this ejabberd node:  

        backup file                 Store the database to backup file 

        connected_users              List all established sessions  

        connected_users_number       Get the number of established sessions  

        ...

        最令人感兴趣的是:

        reopen_log

        在日志文件改名之后重新打开它们. 如果在调用此命令之前旧文件没有被改名, 则它们自动改名为 "*-old.log".关于这点后文书还会详述.

        backup ejabberd.backup

        存储内部 Mnesia 数据库到一个二进制备份文件.

        restore ejabberd.backup

        立刻从一个二进制文件恢复内部 Mnesia 数据库. 如果你有一个很大的数据库,这将消耗很多内存, 所以最好使用 install_fallback.

        install_fallback ejabberd.backup

        将二进制备份文件安装程序fallback,这样,它将在下一次ejabberd启动的时候被用于恢复数据库. 这意味着, 在运行这个命令之后, 你不得不重启 ejabberd. 这个命令比restore需要更少的内存.

        dump ejabberd.dump

        Dump内部的 Mnesia 数据库到一个文本文件 dump.

        load ejabberd.dump

        立刻从一个文本文件dump恢复. 这不建议用于大数据库, 因为它将消耗很多时间、内存和cpu. 那种情况下更适合使用 backup 和 install_fallback.

        import_piefxis, export_piefxis, export_piefxis_host

        这些选项可用于使用 XEP-0227 格式的 XML文件 从/到 另外一个 Jabber/XMPP 服务器迁移帐号或转移一个虚拟主机的用户到另一个 ejabberd 安装环境. 可以参见 ejabberd迁移工具.

        import_file, import_dir

        这些选项可被用于迁移使用jabberd1.4格式的XML文件的帐户, 从其他 Jabber/XMPP 服务器. 已经有 从其他软件迁移到ejabberd的教程.

        delete_expired_messages

        这个选项可被用于删除旧的离线消息. 当离线消息数量非常高的时候有用.

        delete_old_messages days

        删除指定天数之前的离线消息.

        register user host password

        在那个域用给定的密码注册一个帐号.

        unregister user host

                注销给定帐号.

    2、以AccessCommands限制执行

        前端可能被配置成限制访问某些命令. 在那种情况下, 必须提供认证信息. 在每个前端 AccessCommands 选项被定义在不同的地方. 但是所有情况下这个选项的语法都是相同的:

        AccessCommands = {Access, CommandNames, Arguments}, ...

        Access = atom(

        CommandNames = all | [CommandName

        CommandName = atom(

        Arguments = {ArgumentName, ArgumentValue}, ...

        ArgumentName = atom(

        ArgumentValue = any()

        缺省值是不定义任何限制: []. 当执行一个命令时提供认证信息, 这些信息为一个被允许执行相应命令的本地XMPP帐号的Username、Hostname和Password . 这意味着这个帐号必须在本地ejabberd已经注册, 因为这个信息将被验证. 可能提供纯文本密码或它的 MD5 哈希值.

        当定义了一个或多个访问限制,并且提供了认证信息, 每个限制被验证直到某人完全符合: 这个帐号和 Access rule匹配, 命令名字列于 CommandNames 之中, 并且提供的参数和Arguments不抵触.

        以下例子用来理解这个语法, 让我们假设那些选项:    

        {hosts, ["example.org"]}. 

        {acl, bots, {user, "robot1", "example.org"}}. 

        {access, commaccess, [{allow, bots}]}.

        这个访问限制的列表只允许 robot1@example.org 执行所有命令:

        [{commaccess, all, []}]

        看看另一个限制列表 (相应的 ACL 和 ACCESS 没有显示):

        [ 

            %% 这个 bot 能执行所有命令: 

            {bot, all, []}, 

            %% 这个 bot 只能执行命令 'dump'. 不限制参数: 

            {bot_backups, [dump], []} %% 这个 bot 可执行所有命令,

            %% 但是如果使用 'host' 参数, 它必须是 "example.org": 

            {bot_all_example, all, [{host, "example.org"}]}, 

            %% 这个 bot 只能执行命令 'register', 

            %% 并且如果使用参数 'host' , 它必须是 "example.org": 

            {bot_reg_example, [register], [{host, "example.org"}]}, 

            %% 这个 bot 能执行命令 'register' 和 'unregister', 

            %% 如果使用参数 host , 它必须是 "test.org": 

            {_bot_reg_test, [register, unregister], [{host, "test.org"}]

        ]

    三、Web管理

        ejabberd Web管理允许使用web浏览器管理大部分ejabberd.

        这个功能缺省是激活的: 一个使用选项 web_admin 的 ejabberd_http 监听者被包含在监听的端口里. 然后你可以在你喜欢的wen浏览器里打开 http://server:port/admin/ . 你将被要求键入一个拥有管理员权限的ejabberd用户的 username (全 Jabber ID) 和 password . 在认证之后你将看到一个类似下图的页面.

    图1 Web管理

        这里你可以编辑访问限制、管理用户、创建备份、管理数据库、允许/禁止监听的端口、查看服务器统计数据,…

        access rule 配置决定那些帐号可以访问Web管理以及修改它. access rule webadmin_view 仅被授予查看权限: 那些帐号能以只读方式浏览Web管理.

        示例配置:

            (1)你可以把Web管理伺服于和HTTP 轮询界面相同的端口. 在这个了例子里你应该把你的web浏览器指向 http://example.org:5280/admin/ 来管理所有虚拟主机或指向 http://example.org:5280/admin/server/example.com/ 来管理虚拟主机 example.com. 在你访问Web管理之前,你需要键入用户信息,包括username、JID 和 password . 在这个例子里你可键入 username ‘admin@example.net’ 来管理所有虚拟主机 (第一个 URL). 如果你以‘admin@example.com’登录到http://example.org:5280/admin/server/example.com/,你只能管理虚拟主机 example.com. 帐号‘reviewer@example.com’可以只读模式浏览虚拟主机.      

        {acl, admins, {user, "admin", "example.net"}}. 

        {host_config, "example.com", [{acl, admins, {user, "admin", "example.com"}}]}. 

        {host_config, "example.com", [{acl, viewers, {user, "reviewer", "example.com"}}]}.  

        {access, configure, [{allow, admins}]}. {access, webadmin_view, [{allow, viewers}]}.  

        {hosts, ["example.org"]}.  

        {listen, 

            [ 

                ... 

                {5280, ejabberd_http, [http_poll, web_admin]},        

                ... 

            ]}.

            (2)因为安全的原因, 你可以在一个安全的连接上伺服Web管理, 在一个不同于HTTP轮询接口的端口上, 并把它绑定到内部的局域网IP. 这个Web管理将只能被浏览器从https://192.168.1.1:5282/admin/ 访问:      

        {hosts, ["example.org"]}.  

        {listen, 

            [ 

                ... 

                {5280, ejabberd_http, 

                                        http_poll 

                                      ]}, 

                {{5282, "192.168.1.1"}, ejabberd_http, 

                                                            web_admin,                                                

                                                            tls, {certfile, "/usr/local/etc/server.pem"

                                                        ]},        

                ... 

            ]}.

        在ejabberd Web管理页面中包含了一个到 ejabberd安装和操作指南 相关章节的连接. 为了查看这些链接, 本指南的一个 HTML 格式的拷贝必须安装在该系统上. 该文件缺省放在 "/share/doc/ejabberd/guide.html". 该文档的目录可以用环境变量 EJABBERD_DOC_PATH 来指定. 

    四、特设命令

        如果你激活了 mod_configure 和 mod_adhoc, 你可以使用一个 XMPP 客户端在 ejabberd 上执行很多管理任务. 该客户端必须支持 Ad-Hoc Commands (XEP-0050), 而你必须以一个拥有适当权限的帐号登录到该 XMPP 服务器.

    五、修改计算机主机名

        ejabberd使用分布式的 Mnesia 数据库. 作为分布式数据库, Mnesia 强制它的文件一致性, 所以它在它里面存储Erlang节点名. 一个Erlang节点的名字包含了该计算机的hostname. 所以, 如果你修改ejabberd运行的机器的名字,或当你移动ejabberd到一个不同的机器上时,那么Erlang节点名也修改了.

        你有两个办法在一个新节点名的 ejabberd 上使用旧的 Mnesia 数据库: 把旧节点名写入 ejabberdctl.cfg, 或转换数据库到为新节点名.

        那些例子步骤将备份, 转换并装载 Mnesia 数据库. 你需要要么有旧的 Mnesia spool 目录,要么有一个 Mnesia 的备份. 如果你已经有一个旧的数据库的备份文件, 你可以直接去步骤5. 你也需要知道旧节点名和新节点名. 如果你不知道它们, 执行ejabberdctl或在ejabberd 日志文件里查找它们.

        在开始之前, 设置一些变量:

        OLDNODE=ejabberd@oldmachine 

        NEWNODE=ejabberd@newmachine

        OLDFILE=/tmp/old.backup 

        NEWFILE=/tmp/new.backup

        (1)强制以旧节点名启动 ejabberd :      

            ejabberdctl --node $OLDNODE start

        (2)生成一个备份文件:      

            ejabberdctl --node $OLDNODE backup $OLDFILE

        (3)停止旧节点:      

            ejabberdctl --node $OLDNODE stop

        (4)确保在 Mnesia spool 目录没有文件 . 例如:      

            mkdir /var/lib/ejabberd/oldfiles 

            mv /var/lib/ejabberd/*./var/lib/ejabberd/oldfiles/

        (5)启动 ejabberd. 不需要再指定任何节点名:      

            ejabberdctl start

        (6)转换备份到新节点名:      

            ejabberdctl mnesia_change_nodename $OLDNODE $NEWNODE $OLDFILE $NEWFILE

        (7)安装备份文件作为一个fallback:      

            ejabberdctl install_fallback $NEWFILE

        (8)停止 ejabberd:      

            ejabberdctl stop

            你可能在日志文件看到一个错误信息, 这是正常的, 不要担心:      

            Mnesia(ejabberd@newmachine):      

            ** ERROR ** (ignoring core)      

            ** FATAL ** A fallback is installed and Mnesia must be restarted.        

            Forcing shutdown after mnesia_down from ejabberd@newmachine...

        (9)现在你可以最后启动 ejabberd:      

            ejabberdctl start

        (10)检查是否旧数据库的信息可用: accounts, rosters... 完成之后, 记住从公共目录删除临时备份文件.

  • 相关阅读:
    使用Picture Control显示BMP图片
    [转]程序员技术练级攻略
    自绘控件笔记
    VS2010中CMFCToolBar的用法
    我用到的FireFox浏览器插件
    C# 中的 DataTimePicker 控件的时间转换
    MacBook 小白,安装 JDK
    C# Combobox 设置选中项
    Drupal7(2)
    Drupal7(1)
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/4595927.html
Copyright © 2020-2023  润新知