From 066e0fc9b5e6586d71676cefbccac5fdf57247ef Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Sun, 5 May 2013 22:22:07 -0400 Subject: [PATCH] fixed to send to conference rooms correctly Signed-off-by: Brian Coca --- library/notification/jabber | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/library/notification/jabber b/library/notification/jabber index 482182f31c1..7793af6508e 100644 --- a/library/notification/jabber +++ b/library/notification/jabber @@ -18,7 +18,7 @@ options: required: true to: description: - user ID or name of the room. + user ID or name of the room, when using room use a slash to indicate your nick. required: true msg: description: @@ -45,14 +45,18 @@ author: Brian Coca ''' EXAMPLES = ''' -- description: message to jabber user/room - code: jabber: user=mybot@chatserver.tld password=secret to=mychaps@chatserver.tld msg="Ansible task finished" +- description: message to jabber user + code: jabber: user=mybot@chatserver.tld password=secret to=friend@chatserver.tld msg="Ansible task finished" + +- description: message to jabber room + code: jabber: user=mybot@chatserver.tld password=secret to=mychaps@conference.chatserver.tld/ansiblebot msg="Ansible task finished" - description: message specifying host and port code: jabber user=mybot@chatserver.tld host=talk.chatserver.tld port=5223 password=secret to=mychaps@chatserver.tld msg="Ansible task finished" ''' import os +import re import time HAS_XMPP = True @@ -83,32 +87,43 @@ def main(): user = jid.getNode() server = jid.getDomain() port = module.params['port'] + password = module.params['password'] + to, nick = re.split( r'/', module.params['to']) + if module.params['host']: host = module.params['host'] else: host = server - password = module.params['password'] if module.params['encoding']: xmpp.simplexml.ENCODING = params['encoding'] + msg = xmpp.protocol.Message(body=module.params['msg']) + try: conn=xmpp.Client(server) if not conn.connect(server=(host,port)): module.fail_json(rc=1, msg='Failed to connect to server: %s' % (server)) if not conn.auth(user,password,'Ansible'): module.fail_json(rc=1, msg='Failed to authorize %s on: %s' % (user,server)) - # some old servers require this, also the sleep following send conn.sendInitPresence(requestRoster=0) + + if nick: # sending to room instead of user, need to join + msg.setType('groupchat') + msg.setTag('x', namespace='http://jabber.org/protocol/muc#user') + conn.send(xmpp.Presence(to=module.params['to'])) + time.sleep(1) + + msg.setTo(to) if not module.check_mode: - conn.send(xmpp.Message(module.params['to'], module.params['msg'])) + conn.send(msg) time.sleep(1) conn.disconnect() except Exception, e: module.fail_json(msg="unable to send msg: %s" % e) changed = True - module.exit_json(changed=changed, to=module.params['to'], user=module.params['user'], msg=module.params['msg']) + module.exit_json(changed=changed, to=to, user=user, msg=msg.getBody()) # this is magic, see lib/ansible/module_common.py #<>