summaryrefslogtreecommitdiffstats
path: root/ansible_collections/community/general/plugins/callback/jabber.py
diff options
context:
space:
mode:
Diffstat (limited to 'ansible_collections/community/general/plugins/callback/jabber.py')
-rw-r--r--ansible_collections/community/general/plugins/callback/jabber.py120
1 files changed, 120 insertions, 0 deletions
diff --git a/ansible_collections/community/general/plugins/callback/jabber.py b/ansible_collections/community/general/plugins/callback/jabber.py
new file mode 100644
index 000000000..d2d00496d
--- /dev/null
+++ b/ansible_collections/community/general/plugins/callback/jabber.py
@@ -0,0 +1,120 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2016 maxn nikolaev.makc@gmail.com
+# Copyright (c) 2017 Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+DOCUMENTATION = '''
+ author: Unknown (!UNKNOWN)
+ name: jabber
+ type: notification
+ short_description: post task events to a jabber server
+ description:
+ - The chatty part of ChatOps with a Hipchat server as a target.
+ - This callback plugin sends status updates to a HipChat channel during playbook execution.
+ requirements:
+ - xmpp (Python library U(https://github.com/ArchipelProject/xmpppy))
+ options:
+ server:
+ description: connection info to jabber server
+ required: true
+ env:
+ - name: JABBER_SERV
+ user:
+ description: Jabber user to authenticate as
+ required: true
+ env:
+ - name: JABBER_USER
+ password:
+ description: Password for the user to the jabber server
+ required: true
+ env:
+ - name: JABBER_PASS
+ to:
+ description: chat identifier that will receive the message
+ required: true
+ env:
+ - name: JABBER_TO
+'''
+
+import os
+
+HAS_XMPP = True
+try:
+ import xmpp
+except ImportError:
+ HAS_XMPP = False
+
+from ansible.plugins.callback import CallbackBase
+
+
+class CallbackModule(CallbackBase):
+
+ CALLBACK_VERSION = 2.0
+ CALLBACK_TYPE = 'notification'
+ CALLBACK_NAME = 'community.general.jabber'
+ CALLBACK_NEEDS_WHITELIST = True
+
+ def __init__(self, display=None):
+
+ super(CallbackModule, self).__init__(display=display)
+
+ if not HAS_XMPP:
+ self._display.warning("The required python xmpp library (xmpppy) is not installed. "
+ "pip install git+https://github.com/ArchipelProject/xmpppy")
+ self.disabled = True
+
+ self.serv = os.getenv('JABBER_SERV')
+ self.j_user = os.getenv('JABBER_USER')
+ self.j_pass = os.getenv('JABBER_PASS')
+ self.j_to = os.getenv('JABBER_TO')
+
+ if (self.j_user or self.j_pass or self.serv or self.j_to) is None:
+ self.disabled = True
+ self._display.warning('Jabber CallBack wants the JABBER_SERV, JABBER_USER, JABBER_PASS and JABBER_TO environment variables')
+
+ def send_msg(self, msg):
+ """Send message"""
+ jid = xmpp.JID(self.j_user)
+ client = xmpp.Client(self.serv, debug=[])
+ client.connect(server=(self.serv, 5222))
+ client.auth(jid.getNode(), self.j_pass, resource=jid.getResource())
+ message = xmpp.Message(self.j_to, msg)
+ message.setAttr('type', 'chat')
+ client.send(message)
+ client.disconnect()
+
+ def v2_runner_on_ok(self, result):
+ self._clean_results(result._result, result._task.action)
+ self.debug = self._dump_results(result._result)
+
+ def v2_playbook_on_task_start(self, task, is_conditional):
+ self.task = task
+
+ def v2_playbook_on_play_start(self, play):
+ """Display Playbook and play start messages"""
+ self.play = play
+ name = play.name
+ self.send_msg("Ansible starting play: %s" % (name))
+
+ def playbook_on_stats(self, stats):
+ name = self.play
+ hosts = sorted(stats.processed.keys())
+ failures = False
+ unreachable = False
+ for h in hosts:
+ s = stats.summarize(h)
+ if s['failures'] > 0:
+ failures = True
+ if s['unreachable'] > 0:
+ unreachable = True
+
+ if failures or unreachable:
+ out = self.debug
+ self.send_msg("%s: Failures detected \n%s \nHost: %s\n Failed at:\n%s" % (name, self.task, h, out))
+ else:
+ out = self.debug
+ self.send_msg("Great! \n Playbook %s completed:\n%s \n Last task debug:\n %s" % (name, s, out))