ejabberd:使用 ejabberdctl 操作书签
ejabberd: Manipulate bookmarks with ejabberdctl
我目前正在编写 shell 代码,将数据从 LDAP 推送到 ejabberd,涉及 MUC 房间。我需要做的最后一步是将一些 MUC 房间添加到用户的书签中,以便他们自动加入他们的客户端。似乎没有像 Prosody 那样的模块。
所以我假设我需要操纵用户的私有 XML 存储,特别是 storage:bookmarks 部分。我可以通过以下方式获取所有现有书签:
ejabberdctl private_get user host storage storage:bookmarks
然后,还有ejabberdctl private_set
,不过我不是很懂。据我所知,我似乎需要一次替换整个 storage
元素,并将新旧条目合并在一起。
是否有其他方法可以向节点添加 conference
子元素,或者以其他方式添加书签?
我尝试使用 private_set
,但它似乎在元素字符串中的空格处中断。我尝试了所有可能的方式来逃避它们,但无济于事。
好的,我确定将新会议添加到书签需要 re-uploading 整个书签存储集。这意味着正确的方法是使用 private_get
如问题所示,然后修改 XML 以添加一个新条目,然后使用 private_set
到 re-upload 全部。
关于空格的问题:Erlang shell(这就是 ejabberdctl)需要用单引号进行另一层引用,所以一些 XML 会变成 "'<storage xmlns="storage:bookmarks"><conference jid=…'"
等等在 shell 参数中。
您可以在此处找到一个 shell 脚本来执行此操作以及使用 ejabberdctl 执行更多操作:https://www.teckids.org/gitweb/?p=verein.git;a=blob;f=sysadmin/scripts/teckids-ejmaint
XMPP 中的 MUC 书签有两种标准。旧标准 XEP-0049 使用可以使用 private_set
命令修改的私有 XML 存储。但最近的标准是将书签存储在 PEP 中:XEP-0223
Dominik George 的回答适用于旧标准;对于新的 PEP 方法,您可以使用:
sudo ./ejabberdctl send_stanza user@domain.tld user@domain.tld '
<iq type="set" id="asdf">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<publish node="storage:bookmarks">
<item id="current">
<storage xmlns="storage:bookmarks">
<conference jid="room@conference.domain.tld" autojoin="true" name="name">
<nick>nick</nick>
</conference>
</storage>
</item>
</publish>
<publish-options>
<x xmlns="jabber:x:data" type="submit">
<field var="FORM_TYPE" type="hidden">
<value>http://jabber.org/protocol/pubsub#publish-options</value>
</field>
<field var="pubsub#access_model">
<value>whitelist</value>
</field>
</x>
</publish-options>
</pubsub>
</iq>
'
也可以使用 REST API 访问此命令:https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#send-stanza
我目前正在编写 shell 代码,将数据从 LDAP 推送到 ejabberd,涉及 MUC 房间。我需要做的最后一步是将一些 MUC 房间添加到用户的书签中,以便他们自动加入他们的客户端。似乎没有像 Prosody 那样的模块。
所以我假设我需要操纵用户的私有 XML 存储,特别是 storage:bookmarks 部分。我可以通过以下方式获取所有现有书签:
ejabberdctl private_get user host storage storage:bookmarks
然后,还有ejabberdctl private_set
,不过我不是很懂。据我所知,我似乎需要一次替换整个 storage
元素,并将新旧条目合并在一起。
是否有其他方法可以向节点添加 conference
子元素,或者以其他方式添加书签?
我尝试使用 private_set
,但它似乎在元素字符串中的空格处中断。我尝试了所有可能的方式来逃避它们,但无济于事。
好的,我确定将新会议添加到书签需要 re-uploading 整个书签存储集。这意味着正确的方法是使用 private_get
如问题所示,然后修改 XML 以添加一个新条目,然后使用 private_set
到 re-upload 全部。
关于空格的问题:Erlang shell(这就是 ejabberdctl)需要用单引号进行另一层引用,所以一些 XML 会变成 "'<storage xmlns="storage:bookmarks"><conference jid=…'"
等等在 shell 参数中。
您可以在此处找到一个 shell 脚本来执行此操作以及使用 ejabberdctl 执行更多操作:https://www.teckids.org/gitweb/?p=verein.git;a=blob;f=sysadmin/scripts/teckids-ejmaint
XMPP 中的 MUC 书签有两种标准。旧标准 XEP-0049 使用可以使用 private_set
命令修改的私有 XML 存储。但最近的标准是将书签存储在 PEP 中:XEP-0223
Dominik George 的回答适用于旧标准;对于新的 PEP 方法,您可以使用:
sudo ./ejabberdctl send_stanza user@domain.tld user@domain.tld '
<iq type="set" id="asdf">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<publish node="storage:bookmarks">
<item id="current">
<storage xmlns="storage:bookmarks">
<conference jid="room@conference.domain.tld" autojoin="true" name="name">
<nick>nick</nick>
</conference>
</storage>
</item>
</publish>
<publish-options>
<x xmlns="jabber:x:data" type="submit">
<field var="FORM_TYPE" type="hidden">
<value>http://jabber.org/protocol/pubsub#publish-options</value>
</field>
<field var="pubsub#access_model">
<value>whitelist</value>
</field>
</x>
</publish-options>
</pubsub>
</iq>
'
也可以使用 REST API 访问此命令:https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#send-stanza