#!/usr/bin/env ruby

require 'rubygems'
require 'getopt/std'
require 'yaml'
require 'zabbixapi'

opt = Getopt::Std.getopts("g:i:E:")

group_name = opt["g"]
zabbix_env = opt["E"]

template_name = "TMPL_pgsql"
app_name = "PostgreSQL"

# read config
config = YAML::load(open('./config.yml'))

api_url = config[zabbix_env]["api_url"]
api_login = config[zabbix_env]["api_login"]
api_password = config[zabbix_env]["api_password"]

# Esablish new connection
zbx = Zabbix::ZabbixApi.new(api_url, api_login, api_password)

# Create new template
p " * Creating template #{template_name}."
g_id = zbx.add_or_get_group(group_name)

options = {
  'groups' => [ g_id.to_i ],
  'host' => template_name
}

t_id = zbx.add_or_get_template(options)

# Create application #{app_name}
p " ** Create application #{app_name}."
application = {
  'hostid' => t_id.to_i,
  'name' => app_name
}
a_id = zbx.add_or_get_application(t_id, application)

# 'postgres process exists'
options = {
  'description' => "postgres process exists",
  'key_' => "proc.num[postgres]",
  'hostid' => t_id.to_i,
  'applications' => [ a_id.to_i ],
  'history' => 7,
  'trends' => 30,
  'delay' => 120,
  'value_type' => 0
}
p " ** Add 'postgres process exists' to #{template_name}."
item_id = zbx.add_or_get_item(t_id, options)

# 'active connections count'
options = {
  'description' => "postgres active connections count",
  'key_' => "pgsql.connection_count[]",
  'hostid' => t_id.to_i,
  'applications' => [ a_id.to_i ],
  'history' => 7,
  'trends' => 30,
  'delay' => 120,
  'value_type' => 0
}
p " ** Add 'postgres active connections count' to #{template_name}."
item_id = zbx.add_or_get_item(t_id, options)

# 'test connect'
options = {
  'description' => "postgres test connect",
  'key_' => "pgsql.test_connect[]",
  'hostid' => t_id.to_i,
  'applications' => [ a_id.to_i ],
  'history' => 7,
  'trends' => 30,
  'delay' => 120,
  'value_type' => 0
}
p " ** Add 'postgres test connect' to #{template_name}."
item_id = zbx.add_or_get_item(t_id, options)

# TRIGGERS
options = {
  'description' => "postgres process exists",
  'expression' => "{#{template_name}:proc.num[postgres].last(0)}<1",
  'priority' => 5, # disaster
  'templateid' => 0,
  'comments' => "postgres process exists (disaster)",
  'type' => 0,
  'status' => '0'
}

p " ** Add 'postgres process exists' trigger"
tr_id = zbx.add_or_get_trigger(t_id, options)

options = {
  'description' => "postgres test connect",
  'expression' => "{#{template_name}:pgsql.test_connect[].last(0)}#0",
  'priority' => 5, # disaster
  'templateid' => 0,
  'comments' => "postgres test connect (disaster)",
  'type' => 0,
  'status' => '0'
}

p " ** Add 'postgres test connect' trigger"
tr_id = zbx.add_or_get_trigger(t_id, options)

options = {
  'description' => "postgres connection count",
  'expression' => "{#{template_name}:pgsql.connection_count[].last(0)}>700",
  'priority' => 5, # disaster
  'templateid' => 0,
  'comments' => "postgres connection count (disaster)",
  'type' => 0,
  'status' => '0'
}

p " ** Add 'postgres connection count' trigger"
tr_id = zbx.add_or_get_trigger(t_id, options)