SMS Nagios Notifications with PHP & Twilio

Posted by Justin Carmony on January 30th, 2012

I’ve had a few requests to share my Nagios SMS notifications using Twilio. I’m almost embarrassed to share them, since they are so dead simple. There was another plugin out there to do the same, but it was a lot more advanced and more work to setup, so I wrote my own in PHP.


In the past I would just use my iPhone’s email-to-txt email address. However, when I received the txt message, it wasn’t formated very pretty, and it would have a different “From Number.” So if we had a crazy day, I would have 20-30 message threads in my iPhone all about Nagios. I’ve been lazy in the past, and didn’t clear them out until I had about 200 of them, and it was a lot of “swipe, delete, swipe, delete, swipe, delete” to get rid of them.


What I like out this setup is with Twilio, I can buy a phone number for $1 a month. So all my notifications come through the same number. I’m also planning a way to call/text the number and it will read/send the current status and list the hosts that are down.


First thing is to get your Twilio account setup. Its pretty easy, and when I signed up (a long time ago) I got $30 in credit, not sure if they are doing that still for new customers. Either way you can add a credit card and say how much credit you want to add when your account dips below a certain amount.


Now, you can buy a number and set it up. Even if you’re only sending text messages, Twilio wants you to have a “SMS Request URL” before you can send any text messages. So I just put in a URL to my site that does nothing (yet). You’ll need to grab your Account SID and Token.


How it Works


I threw the code up on GitHub. There are a few things you’ll need to do:


First in sendTextMsg.php change your configurations to match your phone number, account SID and token. Here is the entire sendTextMsg.php file:


[php]

<?php


require(‘twilio-php/Services/Twilio.php’);


/ Start Configs /


$sid = "A123…..";

$token = "29d6b9f…….";

$twilio_number = ‘4045550101’;


/ End Configs /


# Get the Argvs

$phone = $argv[1];

$msg = $argv[2];

$msg = str_replace(‘\n’, "\n", $msg);


$client = new Services_Twilio($sid, $token);

try

{

$message = $client->account->sms_messages->create(

$twilio_number, // From a valid Twilio number

$phone, // Text this number

$msg

);

} catch (Exception $ex)

{

var_dump($ex);

}

[/php]


As you can see, it is super simple. All you need to do is put this script somewhere with the Twilio PHP libraries (or just use my github code with all of it in there). Then, in your Nagios configurations add the commands:


[code]

define command{

command_name notify-host-by-txt

command_line /usr/bin/php /path/to/sendTxtMsg/sendTxtMsg.php "$CONTACTPAGER$" "Nagios Alert\nType: $NOTIFICATIONTYPE$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\nWhen: $LONGDATETIME$"

}


define command{

command_name notify-service-by-txt

command_line /usr/bin/php /path/to/sendTxtMsg/sendTxtMsg.php "$CONTACTPAGER$" "Nagios Alert\nType: $NOTIFICATIONTYPE$\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\nWhen: $LONGDATETIME$"

}

[/code]


Then you need to add it to your contacts:


[code]

define contact {

contact_name justin

alias Justin Carmony

service_notification_period 24x7

host_notification_period 24x7

service_notification_options w,u,c,r

host_notification_options d,r


# Add the new commands to your list

service_notification_commands notify-service-by-email,notify-service-by-txt

host_notification_commands notify-host-by-email,notify-host-by-txt

email justin@example.com


# Add a pager number, cause we rock it old school

# like that: http://static.howstuffworks.com/gif/restaurant-pager-motorola.jpg

pager 4045551234

}

[/code]


Simple, easy, and works very well. You can test the script by simply executing the command:


[code]

php /path/to/sendTxtMsg.php 4045551234 "This is my test.\nI am awesome.\n"

[/code]


Enjoy!

About Justin Carmony

Justin is the Director of Engineering for Deseret Digital Media, President of the Utah PHP Usergroup, and member of the Utah Open Source Foundation which organizes the OpenWest Conference. Justin loves just about anything with web technologies from PHP, JavaScript, Node.js, Salt, and managing engineering teams.

Learn More