本项目源码已托管在Github上, 项目名称: Jabberd2s
由来
由于业务需求需要对Jabberd2进行了些修改, 主要是实现动态域名管理的功能. Jabberd2 本身可以支持多域名的XMPP服务器(例如: xmpp.server1.domain, xmpp.server2.domain, 等等…)同时运行,但是所有XMPP域名服务配置(位于c2s.xml和sm.xml中的配置)必须在服务器启动时全部初始化完成.初始化后对域名下XMPP服务器就无法做更多的控制.因此,修改Jabberd2以支持实时控制域名服务器的离线和上线以及服务器配置实时修改.这些修改主要针对多域名主机的管理,所以Github的项目名称为Jabberd2s.实现细节
[
先看这个简单的图示,绿色部分是初始化内容, 粉色部分是添加的功能.
源码自身初始化过程中sm在建立和router的连接后触发event_OPEN事件,
代码1:
1 | // sm/sm.c |
sm发给router <bind/>
节声明新增的绑定域名:
1 | <bind xmlns='https://jabberd.jabberstudio.org/ns/component/1.0' multi='to' name='xmpp.server1.domain'/> |
router广播<presence/>
给c2s和s2s, 处理bind和unbind的分别是_router_process_bind
和_router_process_unbind
, 这两个函数都很长,关键代码如下:
1 | // router/router.c |
真正发送<presence/>
节的在_router_advertise
函数里:
1 | // router/router.c |
对于<bind/>
节router发送内容:
1 | <presence xmlns='https://jabberd.jabberstudio.org/ns/component/1.0' from='xmpp.server1.domain'/> |
对于<unbind/>
节router发送内容:
1 | <presence xmlns='https://jabberd.jabberstudio.org/ns/component/1.0' type='unavailable' from='xmpp.server1.domain'/> |
再看c2s收到<presence />
后所做的反映:
1 | // c2s/c2s.c |
因此,从sm的角度看所有的域名服务器都是一个会话端点,只需要删除这个host并发送<unbind/>
通知给router即可使其离线:
1 | <unbind xmlns='https://jabberd.jabberstudio.org/ns/component/1.0' multi='to' name='xmpp.server1.domain'/> |
新增函数_sm_hosts_reconfig
和信号量值sm_reconf
, 修改了SIGUSR1
信号触发的逻辑,
原本SIGUSR1
关闭调试, SIGUSR2
开启调试, 现在改为SIGUSR2切换Debug状态, SIGUSR1触发_sm_hosts_reconfig
.
1 | /* Use SIGUSR1 to reconfig hosts map */ |
代码2:
1 | // sm/main.c |
最后在main函数的while循环里加上sm_reconf
触发:
1 | while(!sm_shutdown) |
到此为止, 已经可以控制已有服务器的离线和上线,原因是由于完整的服务器配置由c2s管理,因此还需要对c2s修改,使其重新载入新的c2s.xml配置.
本项目源码已托管在Github上, 项目名称: Jabberd2s