From 7b6bd15879e2a0f4d84bde41c8bc85abd7f7a054 Mon Sep 17 00:00:00 2001 From: Sebastian Lehn Date: Thu, 29 Mar 2018 15:56:38 +0200 Subject: [PATCH 1/2] New: Add Support for Zabbix `drule`-API --- lib/zabbixapi.rb | 6 ++++ lib/zabbixapi/classes/drules.rb | 55 +++++++++++++++++++++++++++++++++ spec/drule.rb | 50 ++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 lib/zabbixapi/classes/drules.rb create mode 100644 spec/drule.rb diff --git a/lib/zabbixapi.rb b/lib/zabbixapi.rb index 74fd2e6..4273766 100644 --- a/lib/zabbixapi.rb +++ b/lib/zabbixapi.rb @@ -28,6 +28,7 @@ require 'zabbixapi/classes/usermacros' require 'zabbixapi/classes/users' require 'zabbixapi/classes/valuemaps' +require 'zabbixapi/classes/drules' class ZabbixApi # @return [ZabbixApi::Client] @@ -161,4 +162,9 @@ def users def valuemaps @valuemaps ||= ValueMaps.new(@client) end + + # @return [ZabbixApi::Drules] + def drules + @drules ||= Drules.new(@client) + end end diff --git a/lib/zabbixapi/classes/drules.rb b/lib/zabbixapi/classes/drules.rb new file mode 100644 index 0000000..6289ac7 --- /dev/null +++ b/lib/zabbixapi/classes/drules.rb @@ -0,0 +1,55 @@ +class ZabbixApi + class Drules < Basic + # The method name used for interacting with Drules via Zabbix API + # + # @return [String] + def method_name + 'drule' + end + + # The id field name used for identifying specific Drule objects via Zabbix API + # + # @return [String] + def indentify + 'name' + end + + # The default options used when creating Drule objects via Zabbix API + # + # @return [Hash] + def default_options + { + name: nil, + iprange: nil, + delay: 3600, + status: 0, + } + end + + # Get or Create Drule object using Zabbix API + # + # @param data [Hash] Needs to include name to properly identify Drule via Zabbix API + # @raise [ApiError] Error returned when there is a problem with the Zabbix API call. + # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK. + # @return [Integer] Zabbix object id + def get_or_create(data) + log "[DEBUG] Call get_or_create with parameters: #{data.inspect}" + + unless (id = get_id(name: data[:name])) + id = create(data) + end + id + end + + # Create or update Drule object using Zabbix API + # + # @param data [Hash] Needs to include name to properly identify Drules via Zabbix API + # @raise [ApiError] Error returned when there is a problem with the Zabbix API call. + # @raise [HttpError] Error raised when HTTP status from Zabbix Server response is not a 200 OK. + # @return [Integer] Zabbix object id + def create_or_update(data) + druleid = get_id(name: data[:name]) + druleid ? update(data.merge(druleid: druleid)) : create(data) + end + end +end diff --git a/spec/drule.rb b/spec/drule.rb new file mode 100644 index 0000000..b59c4d9 --- /dev/null +++ b/spec/drule.rb @@ -0,0 +1,50 @@ +# encoding: utf-8 + +require 'spec_helper' + +describe 'drule' do + before do + @drulename = gen_name 'drule' + @usergroupid = zbx.usergroups.create(:name => gen_name('usergroup')) + @dcheckdata = [{ + :type => '9', # zabbix agent + :uniq => '0', # (default) do not use this check as a uniqueness criteria + :key_ => 'system.hostname', + :ports => '10050', + }] + @druledata = { + :name => @drulename, + :delay => '60', + :status => '0', # action is enabled + :iprange => '192.168.0.0/24', # iprange to discover zabbix agents in + :dchecks => @dcheckdata, + } + end + + context 'when not exists' do + describe 'create' do + it 'should return integer id' do + druleid = zbx.drules.create(@druledata) + expect(druleid).to be_kind_of(Integer) + end + end + end + + context 'when exists' do + before do + @druleid = zbx.drules.create(@druledata) + end + + describe 'create_or_update' do + it 'should return id' do + expect(zbx.drules.create_or_update(@druledata)).to eq @druleid + end + end + + describe 'delete' do + it 'should return id' do + expect(zbx.drules.delete(@druleid)).to eq @druleid + end + end + end +end From 437dc53096baa87811f9d5da019e664072001fe5 Mon Sep 17 00:00:00 2001 From: Sebastian Lehn Date: Thu, 29 Mar 2018 16:02:15 +0200 Subject: [PATCH 2/2] New: Add example for Discovery Rule `drule` API --- examples/DiscoveryRule.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 examples/DiscoveryRule.md diff --git a/examples/DiscoveryRule.md b/examples/DiscoveryRule.md new file mode 100644 index 0000000..93ad810 --- /dev/null +++ b/examples/DiscoveryRule.md @@ -0,0 +1,22 @@ +# Discovery Rule + +This example assumes you have already initialized and connected the ZabbixApi. + +For more information and available properties please refer to the Zabbix API documentation for Actions: +[https://www.zabbix.com/documentation/3.2/manual/api/reference/drule](https://www.zabbix.com/documentation/3.2/manual/api/reference/drule) + +## Create Discovery Rule +```ruby +zbx.drules.create( + :name => 'zabbix agent discovery', + :delay => '1800', # discover new machines every 30min + :status => '0', # action is enabled + :iprange => '192.168.0.0/24', # iprange to discover zabbix agents in + :dchecks => [{ + :type => '9', # zabbix agent + :uniq => '0', # (default) do not use this check as a uniqueness criteria + :key_ => 'system.hostname', + :ports => '10050', + }], +) +```