本项目源码已托管在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
