From 28395453a8271aed316ceae3973177d9f61cf04d Mon Sep 17 00:00:00 2001 From: Jan-Piet Mens Date: Wed, 8 May 2013 13:24:31 +0200 Subject: [PATCH] new module: IRC notification --- notification/irc | 146 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 notification/irc diff --git a/notification/irc b/notification/irc new file mode 100644 index 00000000000..80172a4e287 --- /dev/null +++ b/notification/irc @@ -0,0 +1,146 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# (c) 2013, Jan-Piet Mens +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +DOCUMENTATION = ''' +--- +module: irc +short_description: Send a message to an IRC channel +description: + - Send a message to an IRC channel. This is a very simplistic implementation. +options: + server: + description: + - IRC server name/address + required: false + default: localhost + port: + description: + - IRC server port number + required: false + default: 6667 + nick: + description: + - Nickname + required: false + default: ansible + msg: + description: + - The message body. + required: true + default: null + color: + description: + - Text color for the message. Default is black. + required: false + default: black + choices: [ "yellow", "red", "green", "blue", "black" ] + channel: + description: + - Channel name + required: true + +# informational: requirements for nodes +requirements: [ socket ] +author: Jan-Piet Mens +''' + +EXAMPLES = ''' +action: irc server=irc.example.net channel="#t1" msg="Hello world" +local_action: irc port=6669 + channel="#t1" + msg="Hello at {{ ansible_date_time.iso8601 }}" + color=red + nick=ansibleIRC +''' + +# =========================================== +# IRC module support methods. +# + +import socket + +def send_msg(channel, msg, server='localhost', port='6667', + nick="ansible", color='black'): + '''send message to IRC''' + + colornumbers = { + 'black' : "01", + 'red' : "04", + 'green' : "09", + 'yellow' : "08", + 'blue' : "12", + } + + try: + colornumber = colornumbers[color] + except: + colornumber = "01" # black + + message = "\x03" + colornumber + msg + + irc = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) + irc.connect( ( server, int(port) ) ) + irc.send( 'NICK %s\r\n' % nick ) + irc.send( 'USER %s %s %s :ansible IRC\r\n' % (nick, nick, nick)) + irc.send( 'JOIN #%s\r\n' % channel ) + irc.send( 'PRIVMSG %s :%s\r\n' % (channel, message)) + irc.send( 'PART %s\r\n' % channel) + irc.send( 'QUIT\r\n' ) + irc.close() + +# =========================================== +# Main +# + +def main(): + + module = AnsibleModule( + argument_spec=dict( + server = dict(default='localhost'), + port = dict(default = 6667), + nick = dict(default = 'ansible'), + msg = dict(required = True), + color = dict(default="black", choices=["yellow", "red", "green", + "blue", "black"]), + channel = dict(required = True) + ), + supports_check_mode=True + ) + + server = module.params["server"] + port = module.params["port"] + nick = module.params["nick"] + msg = module.params["msg"] + color = module.params["color"] + channel = module.params["channel"] + + try: + send_msg(channel, msg, server, port, nick, color) + except Exception, e: + module.fail_json(msg="unable to send to IRC: %s" % e) + + changed = True + module.exit_json(changed=changed, channel=channel, nick=nick, + msg=msg) + +# this is magic, see lib/ansible/module_common.py +#<> +main()