Watch as I awkwardly stumble through life

Flapjack add contact and all script

Posted by Marius Voila on December 15, 2014 in London, U.K . — 0 comments This post contains 703 words

As I said before, here at Odobo we implemented Flapjack with Sensu as monitoring notification routing & event processing system. Everything went nice and well till the point when I had to add more then just one person (myself) :-) . So because I strongly believe that if a task needs to be done more then once then you should automate/script it, I put together this small ruby script which basically creates an Contact if doesn’t already exists, assigns a Media (email) and also assigns ALL the Entities enlisted in Flapjack.

Usage :

root@sensu:/etc/flapjack# ./contact.rb -h
Usage: contact [options]
    -i, --id ID                      Contact ID
    -n, --name Name                  First Name
    -s, --surname Surname            Surname
    -m, --mail        Email address
    -h, --help                       Display this screen

Example :

$ ./contact.rb -i 1 -n Marius -s Voila -m
#!/usr/bin/env ruby
require 'flapjack-diner'
require 'optparse'

options = {}

optparse = do |opts|
  opts.on('-i', '--id ID', 'Contact ID') do |i|
    options[:id] = i

  opts.on('-n', '--name Name', 'First Name') do |f|
    options[:name] = f

  opts.on('-s', '--surname Surname', 'Surname') do |s|
    options[:surname] = s

  opts.on('-m', '--mail', 'Email address') do |m|
    options[:mail] = m

  opts.on('-h', '--help', 'Display this screen') do
    puts opts

# Create contact if the user doesn't already exist
user_data = {
  :id         => "#{options[:id]}",
  :first_name => "#{options[:name]}",
  :last_name  => "#{options[:surname]}" ,
  :email      => "#{options[:mail]}"

unless Flapjack::Diner.contacts(user_data[:id])
  puts "Creating contact: #{user_data[:first_name]}"

# Assign Media (email) to the created contact

medium = {
  :type => 'email',
  :address => "#{user_data[:email]}",
  :interval => 7200,
  :rollup_threshold => 10
user = Flapjack::Diner.contacts(user_data[:id]).first
if user[:links][:media].empty?
  puts "Creating #{user_data[:first_name]}'s media"
  Flapjack::Diner.create_contact_media(user_data[:id], [medium])
user = Flapjack::Diner.contacts(user_data[:id]).first

# Add contact to the ALL entity

entity_all_data = {
  :id   => 'ALL',
  :name => 'ALL'

entity_all = Flapjack::Diner.entities(entity_all_data[:id]).first
unless entity_all[:links][:contacts].include?(user_data[:id])
  puts "Adding #{user_data[:first_name]} to the ALL entity"
  Flapjack::Diner.update_entities(entity_all_data[:id], :add_contact => user_data[:id])


###This is work in progress and soon I will move it on Github because I’m planing to improve it more