jabber 3.53 KB
Newer Older
1 2 3 4 5
#!/usr/bin/env python
# -*- coding: utf-8 -*-

DOCUMENTATION = '''
---
6
version_added: "1.2"
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
module: jabber
short_description: Send a message to jabber user or chat room
description:
   - Send a message to jabber
options:
  user:
    description:
      User as which to connect
    required: true
  password:
    description:
      password for user to connect
    required: true
  to:
    description:
22
      user ID or name of the room, when using room use a slash to indicate your nick.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
    required: true
  msg:
    description:
      - The message body.
    required: true
    default: null
  host:
    description:
      host to connect, overrides user info
    required: false
  port:
    description:
      port to connect to, overrides default
    required: false
    default: 5222
  encoding:
    description:
      message encoding
    required: false

# informational: requirements for nodes
requirements: [ xmpp ]
author: Brian Coca
'''

EXAMPLES = '''
49 50
# send a message to a user
jabber: user=mybot@chatserver.tld password=secret to=friend@chatserver.tld  msg="Ansible task finished"
51

52 53
# send a message to a room
jabber: user=mybot@chatserver.tld password=secret to=mychaps@conference.chatserver.tld/ansiblebot  msg="Ansible task finished"
54

55 56
# send a message, specifying the host and port
jabber user=mybot@chatserver.tld host=talk.chatserver.tld port=5223 password=secret to=mychaps@chatserver.tld  msg="Ansible task finished"
57 58 59
'''

import os
60
import re
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
import time

HAS_XMPP = True
try:
    import xmpp
except ImportError:
    HAS_XMPP = False

def main():

    module = AnsibleModule(
        argument_spec=dict(
            user=dict(required=True),
            password=dict(required=True),
            to=dict(required=True),
            msg=dict(required=True),
            host=dict(required=False),
            port=dict(required=False,default=5222),
            encoding=dict(required=False),
        ),
        supports_check_mode=True
    )

    if not HAS_XMPP:
        module.fail_json(msg="xmpp is not installed")

    jid = xmpp.JID(module.params['user'])
    user = jid.getNode()
    server = jid.getDomain()
    port = module.params['port']
91 92 93
    password = module.params['password']
    to, nick = re.split( r'/', module.params['to'])

94 95 96 97 98 99 100
    if module.params['host']:
        host = module.params['host']
    else:
        host = server
    if module.params['encoding']:
        xmpp.simplexml.ENCODING = params['encoding']

101 102
    msg = xmpp.protocol.Message(body=module.params['msg'])

103 104 105 106 107 108 109 110
    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)
111 112 113 114 115 116 117 118

        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)
119
        if not module.check_mode:
120
            conn.send(msg)
121 122 123 124 125 126
        time.sleep(1)
        conn.disconnect()
    except Exception, e:
        module.fail_json(msg="unable to send msg: %s" % e)

    changed = True
127
    module.exit_json(changed=changed, to=to, user=user, msg=msg.getBody())
128 129 130 131

# this is magic, see lib/ansible/module_common.py
#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
main()