Initial Check_MK integration.

This commit is contained in:
Martin Edenhofer 2017-08-22 01:13:19 +02:00
parent ab33cd491d
commit 24696c00ee
20 changed files with 780 additions and 76 deletions

View file

@ -0,0 +1,46 @@
class Index extends App.ControllerIntegrationBase
featureIntegration: 'check_mk_integration'
featureName: 'Check_MK'
featureConfig: 'check_mk_config'
description: [
['This service receives http requests from %s and creates tickets with host and service.', 'Check_MK']
['If the host and service is recovered again, the ticket will be closed automatically.']
]
render: =>
super
new App.SettingsForm(
area: 'Integration::CheckMK'
el: @$('.js-form')
)
new App.ScriptSnipped(
el: @$('.js-scriptSnipped')
facility: 'check_mk'
style: 'bash'
content: "#!/bin/bash\n\ncurl -X POST -F 'event_id=123' -F 'host=host1' -F 'service=http' -F 'state=down' #{App.Config.get('http_type')}://#{App.Config.get('fqdn')}/api/v1/integration/check_mk/#{App.Setting.get('check_mk_token')}"
description: [
['To enable %s for sending http requests to %s, you need create "%s" in the admin interface if %s.', 'Check_MK', 'Zammad', 'Event Actions', 'Check_MK']
]
)
new App.HttpLog(
el: @$('.js-log')
facility: 'check_mk'
)
class State
@current: ->
App.Setting.get('check_mk_integration')
App.Config.set(
'IntegrationCheckMk'
{
name: 'Check_MK'
target: '#system/integration/check_mk'
description: 'An open source monitoring tool.'
controller: Index
state: State
}
'NavBarIntegrations'
)

View file

@ -1,7 +1,7 @@
class SidebarCustomer extends App.Controller
sidebarItem: =>
return if !@permissionCheck('ticket.agent')
{
items = {
head: 'Customer'
name: 'customer'
icon: 'person'
@ -11,14 +11,16 @@ class SidebarCustomer extends App.Controller
name: 'customer-change'
callback: @changeCustomer
},
{
title: 'Edit Customer'
name: 'customer-edit'
callback: @editCustomer
},
]
callback: @showCustomer
}
return items if @ticket && @ticket.customer_id == 1
items.actions.push {
title: 'Edit Customer'
name: 'customer-edit'
callback: @editCustomer
}
items
showCustomer: (el) =>
@el = el

View file

@ -25,6 +25,7 @@ class App.HttpLog extends App.Controller
render: =>
@html App.view('widget/http_log')(
records: @records
description: @description
)
show: (e) =>

View file

@ -0,0 +1,24 @@
class App.ScriptSnipped extends App.Controller
#events:
# 'click .js-record': 'show'
elements:
'.js-code': 'code'
constructor: ->
super
#@fetch()
@records = []
@render()
render: =>
@html App.view('widget/script_snipped')(
records: @records
description: @description
style: @style
content: @content
)
@code.each (i, block) ->
hljs.highlightBlock block

File diff suppressed because one or more lines are too long

View file

@ -10,9 +10,10 @@
<div class="page-content">
<% if @description: %>
<% for item in @description: %>
<p><%- @T(item[0], item[1], item[2]) %></p>
<p><%- @T(item...) %></p>
<% end %>
<% end %>
<div class="js-form"></div>
<div class="js-scriptSnipped"></div>
<div class="js-log"></div>
</div>

View file

@ -1,27 +1,31 @@
<hr>
<h2><%- @T('Recent logs') %></h2>
<div class="settings-entry">
<h2><%- @T('Recent logs') %></h2>
<% if @description: %>
<% for item in @description: %>
<p><%- @T(item...) %></p>
<% end %>
<% end %>
<div class="settings-entry">
<% if !@records.length: %>
<table class="settings-list settings-list--stretch settings-list--placeholder">
<thead><tr><th><%- @T('No Entries') %>
</table>
<table class="settings-list settings-list--stretch settings-list--placeholder">
<thead><tr><th><%- @T('No Entries') %>
</table>
<% else: %>
<table class="settings-list settings-list--stretch">
<thead>
<tr>
<th width="10%"><%- @T('Direction') %>
<th><%- @T('Request') %>
<th width="25%"><%- @T('Created at') %>
</thead>
<tbody>
<table class="settings-list settings-list--stretch">
<thead>
<tr>
<th width="10%"><%- @T('Direction') %>
<th><%- @T('Request') %>
<th width="25%"><%- @T('Created at') %>
</thead>
<tbody>
<% for record in @records: %>
<tr data-id="<%= record.id %>" class="js-record">
<td><%- @T(record.direction) %>
<td><a href="#"><%= record.status %> <%= record.method %> <%= record.url %></a>
<td><%- @humanTime(record.created_at) %>
<tr data-id="<%= record.id %>" class="js-record">
<td><%- @T(record.direction) %>
<td><a href="#"><%= record.status %> <%= record.method %> <%= record.url %></a>
<td><%- @humanTime(record.created_at) %>
<% end %>
</tbody>
</table>
</tbody>
</table>
<% end %>
</div>
</div>

View file

@ -0,0 +1,8 @@
<hr>
<h2><%- @T('Usage') %></h2>
<% if @description: %>
<% for item in @description: %>
<p><%- @T(item...) %></p>
<% end %>
<% end %>
<pre><code class="language-<%- @style %> js-code"><%- @content %></code></pre>

View file

@ -15,22 +15,26 @@ module ApplicationController::HandlesErrors
def not_found(e)
logger.error e
respond_to_exception(e, :not_found)
http_log
end
def unprocessable_entity(e)
logger.error e
respond_to_exception(e, :unprocessable_entity)
http_log
end
def internal_server_error(e)
logger.error e
respond_to_exception(e, :internal_server_error)
http_log
end
def unauthorized(e)
error = humanize_error(e.message)
response.headers['X-Failure'] = error.fetch(:error_human, error[:error])
respond_to_exception(e, :unauthorized)
http_log
end
private

View file

@ -0,0 +1,138 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Integration::CheckMkController < ApplicationController
skip_before_action :verify_csrf_token
before_action :check_configured
def update
# check params
raise Exceptions::UnprocessableEntity, 'event_id is missing!' if params[:event_id].blank?
raise Exceptions::UnprocessableEntity, 'state is missing!' if params[:state].blank?
raise Exceptions::UnprocessableEntity, 'host is missing!' if params[:host].blank?
# search for open ticket
auto_close = Setting.get('check_mk_auto_close')
auto_close_state_id = Setting.get('check_mk_auto_close_state_id')
group_id = Setting.get('check_mk_group_id')
state_recovery_match = '(OK|UP)'
# check if ticket with host is open
customer = User.lookup(id: 1)
# follow up detection by meta data
integration = 'check_mk'
open_states = Ticket::State.by_category(:open)
ticket_ids = Ticket.where(state: open_states).order(created_at: :desc).limit(5000).pluck(:id)
ticket_ids_found = []
ticket_ids.each { |ticket_id|
ticket = Ticket.find_by(id: ticket_id)
next if !ticket
next if !ticket.preferences
next if !ticket.preferences[integration]
next if !ticket.preferences[integration]['host']
next if ticket.preferences[integration]['host'] != params[:host]
next if ticket.preferences[integration]['service'] != params[:service]
# found open ticket for service+host
ticket_ids_found.push ticket.id
}
# new ticket, set meta data
title = "#{params[:host]} is #{params[:state]}"
body = "EventID: #{params[:event_id]}
Host: #{params[:host]}
Service: #{params[:service]}
State: #{params[:state]}
Text: #{params[:text]}
RemoteIP: #{request.remote_ip}
UserAgent: #{request.env['HTTP_USER_AGENT']}
"
# add article
if params[:state].present? && ticket_ids_found.present?
ticket_ids_found.each { |ticket_id|
ticket = Ticket.find_by(id: ticket_id)
next if !ticket
article = Ticket::Article.create!(
ticket_id: ticket_id,
type_id: Ticket::Article::Type.find_by(name: 'web').id,
sender_id: Ticket::Article::Sender.find_by(name: 'Customer').id,
body: body,
subject: title,
internal: false,
)
}
if (!auto_close && params[:state].match(/#{state_recovery_match}/i)) || !params[:state].match(/#{state_recovery_match}/i)
render json: {
result: 'ticket already open, added note',
ticket_ids: ticket_ids_found,
}
return
end
end
# check if service is recovered
if auto_close && params[:state].present? && params[:state].match(/#{state_recovery_match}/i)
if ticket_ids_found.blank?
render json: {
result: 'no open tickets found, ignore action',
}
return
end
state = Ticket::State.lookup(id: auto_close_state_id)
ticket_ids_found.each { |ticket_id|
ticket = Ticket.find_by(id: ticket_id)
next if !ticket
ticket.state_id = auto_close_state_id
ticket.save!
}
render json: {
result: "closed tickets with ids #{ticket_ids_found.join(',')}",
ticket_ids: ticket_ids_found,
}
return
end
ticket = Ticket.create!(
group_id: group_id,
customer_id: customer.id,
title: title,
preferences: {
check_mk: {
host: params[:host],
service: params[:service],
},
}
)
article = Ticket::Article.create!(
ticket_id: ticket.id,
type_id: Ticket::Article::Type.find_by(name: 'web').id,
sender_id: Ticket::Article::Sender.find_by(name: 'Customer').id,
body: body,
subject: title,
internal: false,
)
render json: {
result: "new ticket created (ticket id: #{ticket.id})",
ticket_id: ticket.id,
ticket_number: ticket.number,
}
end
private
def check_configured
http_log_config facility: 'check_mk'
if !Setting.get('check_mk_integration')
raise Exceptions::UnprocessableEntity, 'Feature is disable, please contact your admin to enable it!'
end
if Setting.get('check_mk_token') != params[:token]
raise Exceptions::UnprocessableEntity, 'Invalid token!'
end
end
end

View file

@ -62,8 +62,6 @@ class Channel::Filter::MonitoringBase
ticket = Ticket.find_by(id: ticket_id)
next if !ticket
next if !ticket.preferences
next if !ticket.preferences['integration']
next if ticket.preferences['integration'] != integration
next if !ticket.preferences[integration]
next if !ticket.preferences[integration]['host']
next if ticket.preferences[integration]['host'] != result['host']
@ -88,7 +86,6 @@ class Channel::Filter::MonitoringBase
mail[ 'x-zammad-ticket-preferences'.to_sym ] = {}
end
preferences = {}
preferences['integration'] = integration
preferences[integration] = result
preferences.each { |key, value|
mail[ 'x-zammad-ticket-preferences'.to_sym ][key] = value

View file

@ -7,18 +7,22 @@ class Observer::Ticket::UserTicketCounter::BackgroundJob
def perform
# open ticket count
state_open = Ticket::State.by_category(:open)
tickets_open = Ticket.where(
customer_id: @customer_id,
state_id: state_open,
).count()
tickets_open = 0
tickets_closed = 0
if @customer_id != 1
state_open = Ticket::State.by_category(:open)
tickets_open = Ticket.where(
customer_id: @customer_id,
state_id: state_open,
).count()
# closed ticket count
state_closed = Ticket::State.by_category(:closed)
tickets_closed = Ticket.where(
customer_id: @customer_id,
state_id: state_closed,
).count()
# closed ticket count
state_closed = Ticket::State.by_category(:closed)
tickets_closed = Ticket.where(
customer_id: @customer_id,
state_id: state_closed,
).count()
end
# check if update is needed
customer = User.lookup(id: @customer_id)

View file

@ -0,0 +1,5 @@
Zammad::Application.routes.draw do
api_path = Rails.configuration.api_path
match api_path + '/integration/check_mk/:token', to: 'integration/check_mk#update', via: :post, defaults: { format: 'json' }
end

View file

@ -7,3 +7,4 @@ rm -rf app/assets/javascripts/app/views/layout_ref/
rm app/assets/javascripts/app/controllers/karma.coffee
rm app/assets/javascripts/app/controllers/report.coffee
rm app/assets/javascripts/app/controllers/report_profile.coffee
rm app/assets/javascripts/app/controllers/_integration/check_mk.coffee

View file

@ -0,0 +1,119 @@
class CheckMkIntegration < ActiveRecord::Migration
def up
# return if it's a new setup
return if !Setting.find_by(name: 'system_init_done')
Setting.create_if_not_exists(
title: 'Check_MK integration',
name: 'check_mk_integration',
area: 'Integration::Switch',
description: 'Defines if Check_MK (http://mathias-kettner.com/check_mk.html) is enabled or not.',
options: {
form: [
{
display: '',
null: true,
name: 'check_mk_integration',
tag: 'boolean',
options: {
true => 'yes',
false => 'no',
},
},
],
},
state: false,
preferences: {
prio: 1,
permission: ['admin.integration'],
},
frontend: false
)
Setting.create_if_not_exists(
title: 'Group',
name: 'check_mk_group_id',
area: 'Integration::CheckMK',
description: 'Defines the group of created tickets.',
options: {
form: [
{
display: '',
null: false,
name: 'check_mk_group_id',
tag: 'select',
relation: 'Group',
},
],
},
state: 1,
preferences: {
prio: 2,
permission: ['admin.integration'],
},
frontend: false
)
Setting.create_if_not_exists(
title: 'Auto close',
name: 'check_mk_auto_close',
area: 'Integration::CheckMK',
description: 'Defines if tickets should be closed if service is recovered.',
options: {
form: [
{
display: '',
null: true,
name: 'check_mk_auto_close',
tag: 'boolean',
options: {
true => 'yes',
false => 'no',
},
},
],
},
state: true,
preferences: {
prio: 3,
permission: ['admin.integration'],
},
frontend: false
)
Setting.create_if_not_exists(
title: 'Auto close state',
name: 'check_mk_auto_close_state_id',
area: 'Integration::CheckMK',
description: 'Defines the state of auto closed tickets.',
options: {
form: [
{
display: '',
null: false,
name: 'check_mk_auto_close_state_id',
tag: 'select',
relation: 'TicketState',
},
],
},
state: 4,
preferences: {
prio: 4,
permission: ['admin.integration'],
},
frontend: false
)
Setting.create_if_not_exists(
title: 'Check_MK tolen',
name: 'check_mk_token',
area: 'Core',
description: 'Defines the Check_MK token for allowing updates.',
options: {},
state: SecureRandom.hex(16),
preferences: {
permission: ['admin.integration'],
},
frontend: false
)
end
end

View file

@ -2847,6 +2847,117 @@ Setting.create_if_not_exists(
},
frontend: false
)
Setting.create_if_not_exists(
title: 'Check_MK integration',
name: 'check_mk_integration',
area: 'Integration::Switch',
description: 'Defines if Check_MK (http://mathias-kettner.com/check_mk.html) is enabled or not.',
options: {
form: [
{
display: '',
null: true,
name: 'check_mk_integration',
tag: 'boolean',
options: {
true => 'yes',
false => 'no',
},
},
],
},
state: false,
preferences: {
prio: 1,
permission: ['admin.integration'],
},
frontend: false
)
Setting.create_if_not_exists(
title: 'Group',
name: 'check_mk_group_id',
area: 'Integration::CheckMK',
description: 'Defines the group of created tickets.',
options: {
form: [
{
display: '',
null: false,
name: 'check_mk_group_id',
tag: 'select',
relation: 'Group',
},
],
},
state: 1,
preferences: {
prio: 2,
permission: ['admin.integration'],
},
frontend: false
)
Setting.create_if_not_exists(
title: 'Auto close',
name: 'check_mk_auto_close',
area: 'Integration::CheckMK',
description: 'Defines if tickets should be closed if service is recovered.',
options: {
form: [
{
display: '',
null: true,
name: 'check_mk_auto_close',
tag: 'boolean',
options: {
true => 'yes',
false => 'no',
},
},
],
},
state: true,
preferences: {
prio: 3,
permission: ['admin.integration'],
},
frontend: false
)
Setting.create_if_not_exists(
title: 'Auto close state',
name: 'check_mk_auto_close_state_id',
area: 'Integration::CheckMK',
description: 'Defines the state of auto closed tickets.',
options: {
form: [
{
display: '',
null: false,
name: 'check_mk_auto_close_state_id',
tag: 'select',
relation: 'TicketState',
},
],
},
state: 4,
preferences: {
prio: 4,
permission: ['admin.integration'],
},
frontend: false
)
Setting.create_if_not_exists(
title: 'Check_MK tolen',
name: 'check_mk_token',
area: 'Core',
description: 'Defines the Check_MK token for allowing updates.',
options: {},
state: SecureRandom.hex(16),
preferences: {
permission: ['admin.integration'],
},
frontend: false
)
Setting.create_if_not_exists(
title: 'LDAP integration',
name: 'ldap_integration',

View file

@ -242,7 +242,7 @@ returns
# update items
ActiveRecord::Base.transaction do
items_to_update.each { |_id, item|
item.save
item.save!
}
end
}

View file

@ -0,0 +1,270 @@
# encoding: utf-8
require 'test_helper'
class IntegationCheckMkControllerTest < ActionDispatch::IntegrationTest
setup do
token = SecureRandom.urlsafe_base64(16)
Setting.set('check_mk_token', token)
Setting.set('check_mk_integration', true)
end
test '01 without token' do
post '/api/v1/integration/check_mk/', {}
assert_response(404)
end
test '01 invalid token & enabled feature' do
post '/api/v1/integration/check_mk/invalid_token', {}
assert_response(422)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert_equal('Invalid token!', result['error'])
end
test '01 invalid token & disabled feature' do
Setting.set('check_mk_integration', false)
post '/api/v1/integration/check_mk/invalid_token', {}
assert_response(422)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert_equal('Feature is disable, please contact your admin to enable it!', result['error'])
end
test '02 ticket create & close' do
params = {
event_id: '123',
state: 'down',
host: 'some host',
service: 'some service',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert(result['result'])
assert(result['ticket_id'])
assert(result['ticket_number'])
ticket = Ticket.find(result['ticket_id'])
assert_equal('new', ticket.state.name)
assert_equal(1, ticket.articles.count)
params = {
event_id: '123',
state: 'up',
host: 'some host',
service: 'some service',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert(result['result'])
assert(result['ticket_ids'].include?(ticket.id))
ticket.reload
assert_equal('closed', ticket.state.name)
assert_equal(2, ticket.articles.count)
end
test '02 ticket create & create & auto close' do
params = {
event_id: '123',
state: 'down',
host: 'some host',
service: 'some service',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert(result['result'])
assert(result['ticket_id'])
assert(result['ticket_number'])
ticket = Ticket.find(result['ticket_id'])
assert_equal('new', ticket.state.name)
assert_equal(1, ticket.articles.count)
params = {
event_id: '123',
state: 'down',
host: 'some host',
service: 'some service',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert_equal('ticket already open, added note', result['result'])
assert(result['ticket_ids'].include?(ticket.id))
ticket.reload
assert_equal('new', ticket.state.name)
assert_equal(2, ticket.articles.count)
params = {
event_id: '123',
state: 'up',
host: 'some host',
service: 'some service',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert(result['result'])
assert(result['ticket_ids'].include?(ticket.id))
ticket.reload
assert_equal('closed', ticket.state.name)
assert_equal(3, ticket.articles.count)
end
test '02 ticket close' do
params = {
event_id: '123',
state: 'up',
host: 'some host',
service: 'some service',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert_equal('no open tickets found, ignore action', result['result'])
end
test '02 ticket create & create & no auto close' do
Setting.set('check_mk_auto_close', false)
params = {
event_id: '123',
state: 'down',
host: 'some host',
service: 'some service',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert(result['result'])
assert(result['ticket_id'])
assert(result['ticket_number'])
ticket = Ticket.find(result['ticket_id'])
assert_equal('new', ticket.state.name)
assert_equal(1, ticket.articles.count)
params = {
event_id: '123',
state: 'down',
host: 'some host',
service: 'some service',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert_equal('ticket already open, added note', result['result'])
assert(result['ticket_ids'].include?(ticket.id))
ticket.reload
assert_equal('new', ticket.state.name)
assert_equal(2, ticket.articles.count)
params = {
event_id: '123',
state: 'up',
host: 'some host',
service: 'some service',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert_equal('ticket already open, added note', result['result'])
assert(result['ticket_ids'].include?(ticket.id))
ticket.reload
assert_equal('new', ticket.state.name)
assert_equal(3, ticket.articles.count)
end
test '02 ticket create & create & auto close - host only' do
params = {
event_id: '123',
state: 'down',
host: 'some host',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert(result['result'])
assert(result['ticket_id'])
assert(result['ticket_number'])
ticket = Ticket.find(result['ticket_id'])
assert_equal('new', ticket.state.name)
assert_equal(1, ticket.articles.count)
params = {
event_id: '123',
state: 'down',
host: 'some host',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert_equal('ticket already open, added note', result['result'])
assert(result['ticket_ids'].include?(ticket.id))
ticket.reload
assert_equal('new', ticket.state.name)
assert_equal(2, ticket.articles.count)
params = {
event_id: '123',
state: 'up',
host: 'some host',
}
post "/api/v1/integration/check_mk/#{Setting.get('check_mk_token')}", params
assert_response(200)
result = JSON.parse(@response.body)
assert_equal(Hash, result.class)
assert(result['result'])
assert(result['ticket_ids'].include?(ticket.id))
ticket.reload
assert_equal('closed', ticket.state.name)
assert_equal(3, ticket.articles.count)
end
end

View file

@ -41,7 +41,6 @@ Comment: [] =
ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_p.state.name)
assert(ticket_p.preferences)
assert_not(ticket_p.preferences['integration'])
assert_not(ticket_p.preferences['icinga'])
# RBL check
@ -69,8 +68,6 @@ IPv4: 127.0.0.1="
ticket_0, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_0.state.name)
assert(ticket_0.preferences)
assert(ticket_0.preferences['integration'])
assert_equal('icinga', ticket_0.preferences['integration'])
assert(ticket_0.preferences['icinga'])
assert_equal('apn4711.dc.example.com (Display Name: "apn4711.dc.example.com")', ticket_0.preferences['icinga']['host'])
assert_equal('CHECK_RBL CRITICAL - apn4711.dc.example.com BLACKLISTED on 1 server of 38 (ix.dnsbl.example.com)', ticket_0.preferences['icinga']['info'])
@ -102,8 +99,6 @@ IPv4: 127.0.0.1="
ticket_0_1, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_0_1.state.name)
assert(ticket_0_1.preferences)
assert(ticket_0_1.preferences['integration'])
assert_equal('icinga', ticket_0_1.preferences['integration'])
assert(ticket_0_1.preferences['icinga'])
assert_equal('apn4711.dc.example.com (Display Name: "apn4711.dc.example.com")', ticket_0_1.preferences['icinga']['host'])
assert_equal('CHECK_RBL CRITICAL - apn4711.dc.example.com BLACKLISTED on 1 server of 38 (ix.dnsbl.example.com)', ticket_0_1.preferences['icinga']['info'])
@ -135,8 +130,6 @@ IPv4: 127.0.0.1="
ticket_0_2, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('closed', ticket_0_2.state.name)
assert(ticket_0_2.preferences)
assert(ticket_0_2.preferences['integration'])
assert_equal('icinga', ticket_0_2.preferences['integration'])
assert(ticket_0_2.preferences['icinga'])
assert_equal('apn4711.dc.example.com (Display Name: "apn4711.dc.example.com")', ticket_0_2.preferences['icinga']['host'])
assert_equal('CHECK_RBL CRITICAL - apn4711.dc.example.com BLACKLISTED on 1 server of 38 (ix.dnsbl.example.com)', ticket_0_2.preferences['icinga']['info'])
@ -173,8 +166,6 @@ Comment: [] =
ticket_1, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_1.state.name)
assert(ticket_1.preferences)
assert(ticket_1.preferences['integration'])
assert_equal('icinga', ticket_1.preferences['integration'])
assert(ticket_1.preferences['icinga'])
assert_equal('host.internal.loc', ticket_1.preferences['icinga']['host'])
assert_equal('CPU Load', ticket_1.preferences['icinga']['service'])
@ -209,8 +200,6 @@ Comment: [] =
ticket_2, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_2.state.name)
assert(ticket_2.preferences)
assert(ticket_2.preferences['integration'])
assert_equal('icinga', ticket_2.preferences['integration'])
assert(ticket_2.preferences['icinga'])
assert_equal('host.internal.loc', ticket_2.preferences['icinga']['host'])
assert_equal('Disk Usage 123', ticket_2.preferences['icinga']['service'])
@ -246,8 +235,6 @@ Comment: [] =
ticket_1_1, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_1_1.state.name)
assert(ticket_1_1.preferences)
assert(ticket_1_1.preferences['integration'])
assert_equal('icinga', ticket_1_1.preferences['integration'])
assert(ticket_1_1.preferences['icinga'])
assert_equal('host.internal.loc', ticket_1_1.preferences['icinga']['host'])
assert_equal('CPU Load', ticket_1_1.preferences['icinga']['service'])
@ -284,8 +271,6 @@ Comment: [] =
assert_equal(ticket_1.id, ticket_1_2.id)
assert_equal('closed', ticket_1_2.state.name)
assert(ticket_1_2.preferences)
assert(ticket_1_2.preferences['integration'])
assert_equal('icinga', ticket_1_2.preferences['integration'])
assert(ticket_1_2.preferences['icinga'])
assert_equal('host.internal.loc', ticket_1_2.preferences['icinga']['host'])
assert_equal('CPU Load', ticket_1_2.preferences['icinga']['service'])
@ -318,8 +303,6 @@ Comment: [] =
ticket_3, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_3.state.name)
assert(ticket_3.preferences)
assert(ticket_3.preferences['integration'])
assert_equal('icinga', ticket_3.preferences['integration'])
assert(ticket_3.preferences['icinga'])
assert_equal('apn4711.dc.example.com', ticket_3.preferences['icinga']['host'])
assert_nil(ticket_3.preferences['icinga']['service'])
@ -354,8 +337,6 @@ Comment: [] =
assert_equal(ticket_3.id, ticket_3_1.id)
assert_equal('closed', ticket_3_1.state.name)
assert(ticket_3_1.preferences)
assert(ticket_3_1.preferences['integration'])
assert_equal('icinga', ticket_3_1.preferences['integration'])
assert(ticket_3_1.preferences['icinga'])
assert_equal('apn4711.dc.example.com', ticket_3.preferences['icinga']['host'])
assert_nil(ticket_3_1.preferences['icinga']['service'])

View file

@ -37,7 +37,6 @@ WARNING - load average: 3.44, 0.99, 0.35
ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_p.state.name)
assert(ticket_p.preferences)
assert_not(ticket_p.preferences['integration'])
assert_not(ticket_p.preferences['nagios'])
# matching sender - CPU Load/host.internal.loc
@ -67,8 +66,6 @@ WARNING - load average: 3.44, 0.99, 0.35
ticket_1, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_1.state.name)
assert(ticket_1.preferences)
assert(ticket_1.preferences['integration'])
assert_equal('nagios', ticket_1.preferences['integration'])
assert(ticket_1.preferences['nagios'])
assert_equal('host.internal.loc', ticket_1.preferences['nagios']['host'])
assert_equal('CPU Load', ticket_1.preferences['nagios']['service'])
@ -101,8 +98,6 @@ WARNING - load average: 3.44, 0.99, 0.35
ticket_2, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_2.state.name)
assert(ticket_2.preferences)
assert(ticket_2.preferences['integration'])
assert_equal('nagios', ticket_2.preferences['integration'])
assert(ticket_2.preferences['nagios'])
assert_equal('host.internal.loc', ticket_2.preferences['nagios']['host'])
assert_equal('Disk Usage 123', ticket_2.preferences['nagios']['service'])
@ -136,8 +131,6 @@ WARNING - load average: 3.44, 0.99, 0.35
ticket_1_1, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_1_1.state.name)
assert(ticket_1_1.preferences)
assert(ticket_1_1.preferences['integration'])
assert_equal('nagios', ticket_1_1.preferences['integration'])
assert(ticket_1_1.preferences['nagios'])
assert_equal('host.internal.loc', ticket_1_1.preferences['nagios']['host'])
assert_equal('CPU Load', ticket_1_1.preferences['nagios']['service'])
@ -170,8 +163,6 @@ Additional Info:
assert_equal(ticket_1.id, ticket_1_2.id)
assert_equal('closed', ticket_1_2.state.name)
assert(ticket_1_2.preferences)
assert(ticket_1_2.preferences['integration'])
assert_equal('nagios', ticket_1_2.preferences['integration'])
assert(ticket_1_2.preferences['nagios'])
assert_equal('host.internal.loc', ticket_1_2.preferences['nagios']['host'])
assert_equal('CPU Load', ticket_1_2.preferences['nagios']['service'])
@ -204,8 +195,6 @@ Comment: [] =
ticket_3, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
assert_equal('new', ticket_3.state.name)
assert(ticket_3.preferences)
assert(ticket_3.preferences['integration'])
assert_equal('nagios', ticket_3.preferences['integration'])
assert(ticket_3.preferences['nagios'])
assert_equal('apn4711.dc.example.com', ticket_3.preferences['nagios']['host'])
assert_nil(ticket_3.preferences['nagios']['service'])
@ -240,8 +229,6 @@ Comment: [] =
assert_equal(ticket_3.id, ticket_3_1.id)
assert_equal('closed', ticket_3_1.state.name)
assert(ticket_3_1.preferences)
assert(ticket_3_1.preferences['integration'])
assert_equal('nagios', ticket_3_1.preferences['integration'])
assert(ticket_3_1.preferences['nagios'])
assert_equal('apn4711.dc.example.com', ticket_3.preferences['nagios']['host'])
assert_nil(ticket_3_1.preferences['nagios']['service'])