From cebdcaa9b79c19e1f2c343f2bc8bd25af76755a6 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 10 May 2013 15:17:41 -0400 Subject: [PATCH] Campfire Notification Module --- library/notification/campfire | 128 ++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 library/notification/campfire diff --git a/library/notification/campfire b/library/notification/campfire new file mode 100644 index 00000000000..ff9ed69859b --- /dev/null +++ b/library/notification/campfire @@ -0,0 +1,128 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +DOCUMENTATION = ''' +--- +module: campfire +short_description: Send a message to Campfire +description: + - Send a message to Campfire. +version_added: "1.2" +options: + subscription: + description: + - The subscription name to use. + required: true + token: + description: + - API token. + required: true + room: + description: + - Room number to which the message should be sent. + required: true + msg: + description: + - The message body. + required: true + notify: + description: + - Send a notification sound before the message. + required: false + choices: ["56k", "bueller", "crickets", "dangerzone", "deeper", + "drama", "greatjob", "horn", "horror" , "inconceivable", + "live", "loggins", "noooo", "nyan", "ohmy", "ohyeah", + "pushit", "rimshot", "sax", "secret", "tada", "tmyk", + "trombone", "vuvuzela", "yeah", "yodel"] + +# informational: requirements for nodes +requirements: [ urllib2, cgi ] +author: Adam Garside +''' + +EXAMPLES = ''' +action: campfire subscription=foo token=12345 room=123 msg="Task completed." + +action: campfire subscription=foo token=12345 room=123 msg="Messages + with\nNewlines will result in a PasteMessage type being sent." + +action: campfire subscription=foo token=12345 room=123 notify=loggins + msg="Task completed ... with feeling." +''' + + +def main(): + + try: + import urllib2 + except ImportError: + module.fail_json(msg="urllib2 is required") + + try: + import cgi + except ImportError: + module.fail_json(msg="cgi is required") + + module = AnsibleModule( + argument_spec=dict( + subscription=dict(required=True), + token=dict(required=True), + room=dict(required=True), + msg=dict(required=True), + notify=dict(required=False, + choices=["56k", "bueller", "crickets", + "dangerzone", "deeper", "drama", + "greatjob", "horn", "horror", + "inconceivable", "live", "loggins", + "noooo", "nyan", "ohmy", "ohyeah", + "pushit", "rimshot", "sax", "secret", + "tada", "tmyk", "trombone", "vuvuzela", + "yeah", "yodel"]), + ), + supports_check_mode=True + ) + + subscription = module.params["subscription"] + token = module.params["token"] + room = module.params["room"] + msg = module.params["msg"] + notify = module.params["notify"] + + URI = "https://%s.campfirenow.com" % subscription + NSTR = "SoundMessage%s" + MSTR = "%s" + AGENT = "Ansible/1.2" + + try: + + # Setup basic auth using token as the username + pm = urllib2.HTTPPasswordMgrWithDefaultRealm() + pm.add_password(None, URI, token, 'X') + + # Setup Handler and define the opener for the request + handler = urllib2.HTTPBasicAuthHandler(pm) + opener = urllib2.build_opener(handler) + + target_url = '%s/room/%s/speak.xml' % (URI, room) + + # Send some audible notification if requested + if notify: + req = urllib2.Request(target_url, NSTR % cgi.escape(notify)) + req.add_header('Content-Type', 'application/xml') + req.add_header('User-agent', AGENT) + response = opener.open(req) + + # Send the message + req = urllib2.Request(target_url, MSTR % cgi.escape(msg)) + req.add_header('Content-Type', 'application/xml') + req.add_header('User-agent', AGENT) + response = opener.open(req) + + except Exception, e: + module.fail_json(msg="unable to sent msg: %s" % e) + + module.exit_json(changed=True, room=room, msg=msg, notify=notify) + +# this is magic, see lib/ansible/module_common.py +#<> +main()