Skip to content

openbridge/ob_hacky_slack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Hacky Slack

Hacky Slack is a shell script that will post messages to a Slack webhook API endpoint.

From Slack:

Incoming Webhooks are a simple way to post messages from external sources into Slack. They make use of normal HTTP requests with a JSON payload, which includes the message and a few other optional details described later. Message Attachments (https://api.slack.com/docs/attachments) can also be used in Incoming Webhooks to display richly-formatted messages that stand out from regular chat messages.

Why is it called Hacky Slack? First, this reflects my "hacking" something together that accomplished my goals. Second, I played a ton of Hacky Sack (https://en.wikipedia.org/wiki/Hacky_Sack) when I was a teenager.

Overview

There are two goal of Hacky Slack. The first was to was to create a generic shell client for the Slack messaging API. The second was to take advantage of the Slack messaging interface to allow applications, like Monit, to style its events. In support of both goals Hacky Slack offers customizations for external applications, like Monit, via external config files (See the Monit example).

Also, in support of having more compelling Slack messages, a small collection of icons were created. The icons are meant to provide visual cues to the user so they can more easily identify the context of a message they received in Slack.

Requirements

First, you need to get yourself a Slack account. Go to the Slack webite: https://slack.com/

Second, you need create an incoming webhook. Go here to learn how: https://api.slack.com/incoming-webhooks

As a result going through those two steps, you should get the following:

Slack API Tokens

You need to make sure that your Slack token is set as a system variable ${SLACK_TOKEN} or you can pass it to Hacky Slack via -k "whatever-you-get-from-slack". You can also hard code it into slack.sh as TOKEN="whatever-you-get-from-slack"

Slack API Webhook Endpoint

Hacky Slack will default to the Slack API endpoint URL https://hooks.slack.com/services/. However, if you want to use a different one simply pass it via -w "https://whatever.slack.com/provides/"

Hacky Slack should run in most modern Linux environments. It has been tested in a CentOS 7 Docker container and Mac OS X. However, you will need to make sure a few things are setup in your environment:

cURL

Hacky Slack requires cURL (https://curl.haxx.se). Most systems have it installed. However, if you are running Hacky Slack in Docker cURL may not be installed.

Installation

slack.sh

Installation is pretty simple. Just copy the slack.sh to /usr/local/bin. Then chmod +x /usr/local/bin/slack.sh.

Please note that the default config (slack.sh) assumes you are installing slack into /usr/local/bin:

APP="/usr/local/bin/slack.sh"
BIN="/usr/bin/slack"

BIN is used to ln to APP to BIN. This will allow you to use slack vs /usr/local/bin/slack.sh

If you decide to copy Hacky Slack to a different APP directory change the settings accordingly.

Using Hacky Slack

Hacky Slack allowed you to pass a variety attributes as defined by the Slack messaging specs:

-a, Attachment      Sends a messages as an attachment."
-A, Author          Small text used to display the author's name."
-b, Author Link     A URL that will hyperlink the author_name text mentioned above. (Author name is required)."
-B, Author Icon     A URL that displays a small image to the left of the author_name text.(Author name is required)."
-c, Channel         The location the messages should be delivered. Use # or @ to prefix (#general or @joe)"
-C, Color           This value is used to color the border along the left side of the message attachment."
-h, Help            Show the command options for Slack."
-i, Icon            A URL to an image file that will be displayed inside a message attachment."
-I, Image           Small text used to display the author's name."
-m, Mode            Mode toggles application specific behaviors (e.g., preconfigured Monit settings)."
-N, Thumbnail       A URL to an image file that will be displayed as a thumbnail on the right side of a message attachment."
-p, Pretext         This is optional text that appears above the message attachment block."
-s, Status          An optional value that can either be one of ok, info, warn or error."
-t, Text            This is the main text in a message attachment, and can contain standard message markup."
-T, Title           The title is displayed as larger, bold text near the top of a message attachmen."
-L, Title Link      A valid URL in the will ensure the title text will be hyperlinked."
-k, Token           Authenticates the POST to Slack."
-u, Username        User that posts the message."
-w, Webhook         The Slack API service endpoint to POST messages. Defaults to 'https://hooks.slack.com/services/'"

For more information on the above parameters, please check out the Slack docs:

Send A Message

The channel is "general" with username "hacky-slack". The icon is "apple" and the author is "apple". The author name is linked to "apple.com" and the text sent in the message is "Where are the new 2016 Macbook models?"

slack -c "#general" -u "hacky-slack" -i "apple" -a "Macbook" -b "http://www.apple.com/ -t "Where are the new 2016 Macbook models?"

Here is a sample message and a screenshot of the message with various flags set.

slack -a -t "Hello World" -i ":slack:" -T "Titles are awesome" -p "Pretext is so helpful to include" -s "info"

Here is the command represented in Slack:

Generic Message Examples

Note: These examples assume you have set your token and webhook endpoint.

Hacky Slack + Monit

Monit is a system monitoring and recovery tool. More on Monit here: https://mmonit.com/monit/

Hacky Slack was initially conceived to provide better support for Monit within Slack, especially customizing the Slack message UI to reflect smarter Monit events. Also, using Monit event variables in a Slack message allowed Hacky Slack the ability to trigger messages with minimal user input. This also means greater consistency for Monit messages as it ensures a common messaging approach across teams and systems.

Monit Hack Slack Example Message

Here is an example error message from Monit:

Monit Examples

Notice the icon and matching message color highlight. Also, the content of each message, when triggered by Monit, is automatically populated.

This is accomplished by using Monit variables to populate specific parts of the Slack message:

USERNAME="monit @ ${IP}"
TITLE="${MONIT_SERVICE}"
TEXT="${MONIT_DESCRIPTION}"
PRETEXT="${MONIT_DATE} | ${MONIT_HOST}: ${MONIT_EVENT}"
FALLBACK="${MONIT_DATE} | ${MONIT_HOST}: ${MONIT_EVENT}"

Example Monit Status Icons

The message will visually change based on the use of the status flag -s. Based on the -s passed to Hacky Slack, one of 4 treatments will be applied to the message:

Icon Name
Monit Ok Monit OK -s "ok"
Monit info Monit INFO -s "info"
Monit Warn Monit WARN -s "warn"
Monit Error Monit ERROR -s "error"

In a future release, the look and feel can be tailored to the specific Monit event. For example, if there is a network event, then Hack Slack would customize the message to reflect that event type by using a specific set of icons and colors. At the moment, the 4 events above are the only customizations that are active.

Using Hacky Slack in Your Monit Configs

Below is a Monit statement triggers an alert if the memory exceeds 15MB for 2 cycles. It will repeat the alert every 3 cycles. Once the condition that triggered the alert returns to normal, Monit will issue an all clear message to Slack.

if memory > 15 MB for 2 cycles then exec /usr/bin/bash -c "sh /usr/local/bin/slack.sh -a -c #testing -s error -M monit >> /ebs/logs/foo.log 2<&1" repeat every 3 cycles else if succeeded then exec /usr/bin/bash -c "sh /usr/local/bin/slack.sh -a -c #testing -s ok -M monit >> /ebs/logs/foo.log 2<&1"

The -a flag sets the attachment flag. This is the expanded message format seen above. The -c flag sets the channel to deliver the message to. In this case the channel is "#testing". The -s flag sets the status the message should inherit. The example above uses "error" and ok". Lastly, the -M flag is set to "monit". This tells Hacky Slack to use the Monit config.

Here is an example for monitoring crond:

check process crond with pidfile "/var/run/crond.pid"
      start program = "/etc/init.d/crond start" with timeout 60 seconds
      stop program = "/etc/init.d/crond stop"
      if 2 restarts within 3 cycles then exec /usr/bin/bash -c "sh /usr/local/bin/slack.sh -a -c #testing -s error -M monit" repeat every 3 cycles else if succeeded then exec /usr/bin/bash -c "sh /usr/local/bin/slack.sh -a -c #testing -s ok -M monit"
      if 5 restarts within 5 cycles then timeout

Using Hacky Slack in with other apps.

Hacky Slack can be extended to support other applications besides Monit. For example, Nagios monitoring or Cron. Really, any application can send messages via Hacky Slack.

Since no user (- u) was specified it will default to using the host system IP address

Icons

Included are various Slack themed icons (<code?/icons/png). The icons are sized at (128x128) to meet Slack requirements. To use these icons they need to be added via the Slack application UI and referenced in the command line flag -i. More icons will be added over time.

AWS

Icon Name
bug Ok AWS ElastiCache
bug info AWS RDS
bug Warn AWS Redshift

BUG

Icon Name
bug Ok bug OK
bug info bug INFO
bug Warn bug WARN
bug Error bug ERROR

CODE

Icon Name
bug Ok Code

CPU

Icon Name
cpu Ok CPU OK
cpu info CPU INFO
cpu Warn CPU WARN
cpu Error CPI ERROR

CRON

Icon Name
Cron Ok Cron OK
Cron Ok Cron WARN
Cron Ok Cron ERROR

DISK

Icon Name
bug Ok Disk

MEMORY

Icon Name
mem Ok MEM OK
mem info MEM INFO
mem Warn MEM WARN
mem Error MEM ERROR

MISC

Icon Name
Database Check Database Check
Integration Integration
Stop Stop
Stop 2 Stop 2

Reference

Hacky Slack was inspired by the following resources:

License

The MIT License (MIT) Copyright (c)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.