zapix3 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +4 -10
- data/Rakefile +1 -1
- data/lib/zapix/proxies/actions.rb +4 -5
- data/lib/zapix/proxies/applications.rb +4 -7
- data/lib/zapix/proxies/graphs.rb +4 -4
- data/lib/zapix/proxies/hostgroups.rb +14 -15
- data/lib/zapix/proxies/hostinterfaces.rb +5 -6
- data/lib/zapix/proxies/hosts.rb +17 -18
- data/lib/zapix/proxies/proxies.rb +2 -6
- data/lib/zapix/proxies/scenarios.rb +6 -8
- data/lib/zapix/proxies/screens.rb +3 -5
- data/lib/zapix/proxies/templates.rb +5 -6
- data/lib/zapix/proxies/triggers.rb +20 -10
- data/lib/zapix/proxies/usergroups.rb +5 -8
- data/lib/zapix/proxies/users.rb +3 -5
- data/lib/zapix/version.rb +1 -1
- data/lib/zapix/zabbix_classes/host.rb +8 -12
- data/lib/zapix/zabbix_classes/interface.rb +4 -5
- data/lib/zapix/zabbix_rpc_client.rb +11 -12
- data/lib/zapix.rb +0 -1
- data/spec/spec_helper.rb +0 -1
- data/spec/zapix_specs.rb +35 -39
- data/zapix.gemspec +14 -15
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f3f33a9668f650e6509786c63ccf01b8de2a302
|
4
|
+
data.tar.gz: c533c13d7637f018c4797653bd61870557af26d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ff6fb058f298868d11c4a48d937fce3c278794fd16dc451cbb7df0884c70b54e11c90a1b6169f15affd386b68df11f0a704097b084b0c24f56b03a9fb271872
|
7
|
+
data.tar.gz: 0842910a995a4e1cb6442ab81d095dc2481539a46af6a1f6d8b4b25b72220738e45a57255d2404a1af4873e3f1965c9d7d4cbd79171c4221da944fae81589c08
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -26,19 +26,13 @@ Or install it with gem:
|
|
26
26
|
First create a remote client. Feel free to
|
27
27
|
disable the debug mode if you find it annoying.
|
28
28
|
|
29
|
-
These environment variables also need to be set:
|
30
|
-
|
31
|
-
ZABBIX_API_URL
|
32
|
-
ZABBIX_API_LOGIN
|
33
|
-
ZABBIX_API_PASSWORD
|
34
|
-
|
35
29
|
```ruby
|
36
30
|
require 'zapix'
|
37
31
|
zrc = ZabbixAPI.connect(
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
32
|
+
service_url: ENV['ZABBIX_SERVER_URL'],
|
33
|
+
username: ENV['ZABBIX_USERNAME'],
|
34
|
+
password: ENV['ZABBIX_PASSWORD'],
|
35
|
+
debug: true
|
42
36
|
)
|
43
37
|
```
|
44
38
|
|
data/Rakefile
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
@@ -2,8 +2,8 @@ require_relative 'base'
|
|
2
2
|
|
3
3
|
class Actions < Base
|
4
4
|
def exists?(options)
|
5
|
-
result = client.action_get(
|
6
|
-
if
|
5
|
+
result = client.action_get('filter' => { 'name' => options['name'] })
|
6
|
+
if result.nil? || result.empty?
|
7
7
|
return false
|
8
8
|
else
|
9
9
|
return true
|
@@ -15,9 +15,8 @@ class Actions < Base
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def get_id(options)
|
18
|
-
result = client.action_get({
|
19
|
-
|
20
|
-
|
18
|
+
result = client.action_get('filter' => { 'name' => options['name'] })
|
19
|
+
|
21
20
|
result.first['actionid']
|
22
21
|
end
|
23
22
|
|
@@ -1,14 +1,13 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
|
3
3
|
class Applications < Base
|
4
|
-
|
5
4
|
def create(options)
|
6
5
|
client.application_create(options) unless exists?(options)
|
7
6
|
end
|
8
7
|
|
9
8
|
def exists?(options)
|
10
|
-
result = client.application_get(
|
11
|
-
if
|
9
|
+
result = client.application_get('filter' => { 'name' => options['name'] })
|
10
|
+
if result.nil? || result.empty?
|
12
11
|
false
|
13
12
|
else
|
14
13
|
true
|
@@ -17,14 +16,12 @@ class Applications < Base
|
|
17
16
|
|
18
17
|
def get_id(options)
|
19
18
|
if exists?(options)
|
20
|
-
client.application_get({
|
21
|
-
|
22
|
-
'hostid' => options['hostid']}}).first['applicationid']
|
19
|
+
client.application_get('filter' => { 'name' => options['name'],
|
20
|
+
'hostid' => options['hostid'] }).first['applicationid']
|
23
21
|
else
|
24
22
|
raise NonExistingApplication, "Application #{options['name']} does not exist !"
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
26
|
class NonExistingApplication < StandardError; end
|
29
|
-
|
30
27
|
end
|
data/lib/zapix/proxies/graphs.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
|
3
3
|
class HostGroups < Base
|
4
|
-
|
5
4
|
def mass_create(*names)
|
6
5
|
names.each do |group_name|
|
7
6
|
create(group_name)
|
@@ -9,21 +8,21 @@ class HostGroups < Base
|
|
9
8
|
end
|
10
9
|
|
11
10
|
def create(name)
|
12
|
-
client.hostgroup_create(
|
11
|
+
client.hostgroup_create('name' => name) unless exists?(name)
|
13
12
|
end
|
14
13
|
|
15
14
|
def create_or_update(name)
|
16
|
-
if
|
15
|
+
if exists?(name)
|
17
16
|
id = get_id(name)
|
18
|
-
client.hostgroup_update(
|
17
|
+
client.hostgroup_update('groupid' => id, 'name' => name)
|
19
18
|
else
|
20
19
|
create(name)
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
24
23
|
def exists?(name)
|
25
|
-
result = client.hostgroup_get(
|
26
|
-
if
|
24
|
+
result = client.hostgroup_get('filter' => { 'name' => [name] })
|
25
|
+
if result.nil? || result.empty?
|
27
26
|
return false
|
28
27
|
else
|
29
28
|
return true
|
@@ -31,8 +30,8 @@ class HostGroups < Base
|
|
31
30
|
end
|
32
31
|
|
33
32
|
def get_id(name)
|
34
|
-
if
|
35
|
-
result = client.hostgroup_get(
|
33
|
+
if exists?(name)
|
34
|
+
result = client.hostgroup_get('filter' => { 'name' => [name] })
|
36
35
|
result[0]['groupid']
|
37
36
|
else
|
38
37
|
raise NonExistingHostgroup, "Hostgroup #{name} does not exist !"
|
@@ -46,22 +45,22 @@ class HostGroups < Base
|
|
46
45
|
end
|
47
46
|
|
48
47
|
def get_host_ids_of(hostgroup)
|
49
|
-
result = client.hostgroup_get('filter' => {'name' => [hostgroup]}, 'selectHosts' => 'refer')
|
48
|
+
result = client.hostgroup_get('filter' => { 'name' => [hostgroup] }, 'selectHosts' => 'refer')
|
50
49
|
extract_host_ids(result)
|
51
50
|
end
|
52
51
|
|
53
52
|
def any_hosts?(hostgroup)
|
54
53
|
raise NonExistingHostgroup, "Hostgroup #{hostgroup} does not exist !" unless exists?(hostgroup)
|
55
|
-
result = client.hostgroup_get('filter' => {'name' => [hostgroup]}, 'selectHosts' => 'count').first['hosts'].to_i
|
56
|
-
#result = client.hostgroup_get('countOutput' => 'true', 'filter' => {'name' => [hostgroup]}, 'selectHosts' => 'count').to_i
|
54
|
+
result = client.hostgroup_get('filter' => { 'name' => [hostgroup] }, 'selectHosts' => 'count').first['hosts'].to_i
|
55
|
+
# result = client.hostgroup_get('countOutput' => 'true', 'filter' => {'name' => [hostgroup]}, 'selectHosts' => 'count').to_i
|
57
56
|
result >= 1 ? true : false
|
58
57
|
end
|
59
58
|
|
60
59
|
def delete(name)
|
61
|
-
if
|
62
|
-
# host cannot exist without a hostgroup, so we need to delete
|
60
|
+
if exists?(name)
|
61
|
+
# host cannot exist without a hostgroup, so we need to delete
|
63
62
|
# the attached hosts also
|
64
|
-
if
|
63
|
+
if any_hosts?(name)
|
65
64
|
# delete all hosts attached to a hostgroup
|
66
65
|
host_ids = get_host_ids_of(name)
|
67
66
|
host_ids.each do |id|
|
@@ -80,7 +79,7 @@ class HostGroups < Base
|
|
80
79
|
def get_all
|
81
80
|
# the fucking API also returns the ids and that's
|
82
81
|
# why we need to extract the names
|
83
|
-
host_groups_with_ids = client.hostgroup_get(
|
82
|
+
host_groups_with_ids = client.hostgroup_get('output' => ['name'])
|
84
83
|
extract_host_groups(host_groups_with_ids)
|
85
84
|
end
|
86
85
|
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
|
3
3
|
class Hostinterfaces < Base
|
4
|
-
|
5
4
|
def create(options)
|
6
5
|
client.hostinterface_create(options) unless exists?(options)
|
7
6
|
end
|
@@ -12,10 +11,10 @@ class Hostinterfaces < Base
|
|
12
11
|
|
13
12
|
def get(options)
|
14
13
|
client.hostinterface_get(
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
'output' => 'extend'
|
14
|
+
'filter' => { 'hostid' => options['hostid'],
|
15
|
+
'port' => options['port'],
|
16
|
+
'type' => options['type'] },
|
17
|
+
'output' => 'extend'
|
18
|
+
)
|
19
19
|
end
|
20
|
-
|
21
20
|
end
|
data/lib/zapix/proxies/hosts.rb
CHANGED
@@ -1,50 +1,49 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
class Hosts < Base
|
3
|
-
|
4
3
|
def get_id(name)
|
5
|
-
if
|
6
|
-
client.host_get(
|
4
|
+
if exists?(name)
|
5
|
+
client.host_get('filter' => { 'host' => name }).first['hostid']
|
7
6
|
else
|
8
7
|
raise NonExistingHost, "Host #{name} does not exist !"
|
9
8
|
end
|
10
9
|
end
|
11
10
|
|
12
11
|
def get_hosts_for_hostgroup(group_id)
|
13
|
-
client.host_get(
|
12
|
+
client.host_get('groupids' => [group_id])
|
14
13
|
end
|
15
14
|
|
16
|
-
def create(options={})
|
17
|
-
client.host_create(options) unless exists?(options[
|
15
|
+
def create(options = {})
|
16
|
+
client.host_create(options) unless exists?(options['host'])
|
18
17
|
end
|
19
18
|
|
20
|
-
def create_or_update(options={})
|
19
|
+
def create_or_update(options = {})
|
21
20
|
raise EmptyHostname, 'Host name cannot be empty !' if options['host'].nil?
|
22
21
|
if exists?(options['host'])
|
23
22
|
id = get_id(options['host'])
|
24
|
-
options
|
23
|
+
options['hostid'] = id
|
25
24
|
client.host_update(options)
|
26
25
|
else
|
27
26
|
create(options)
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
31
|
-
def unlink_and_clear_templates(options={})
|
32
|
-
template_ids = options['template_ids'].map { |id| {'templateid' => id}}
|
33
|
-
client.host_update(
|
30
|
+
def unlink_and_clear_templates(options = {})
|
31
|
+
template_ids = options['template_ids'].map { |id| { 'templateid' => id } }
|
32
|
+
client.host_update('hostid' => options['host_id'], 'templates_clear' => template_ids)
|
34
33
|
end
|
35
34
|
|
36
|
-
def update_templates(options={})
|
37
|
-
template_ids = options['template_ids'].map { |id| {'templateid' => id}}
|
38
|
-
client.host_update(
|
35
|
+
def update_templates(options = {})
|
36
|
+
template_ids = options['template_ids'].map { |id| { 'templateid' => id } }
|
37
|
+
client.host_update('hostid' => options['host_id'], 'templates' => template_ids)
|
39
38
|
end
|
40
39
|
|
41
|
-
def update_macros(options={})
|
40
|
+
def update_macros(options = {})
|
42
41
|
client.host_update('hostid' => options['host_id'], 'macros' => options['macros'])
|
43
42
|
end
|
44
43
|
|
45
44
|
def exists?(name)
|
46
|
-
result = client.host_get(
|
47
|
-
if
|
45
|
+
result = client.host_get('filter' => { 'host' => name })
|
46
|
+
if result.nil? || result.empty?
|
48
47
|
false
|
49
48
|
else
|
50
49
|
true
|
@@ -52,7 +51,7 @@ class Hosts < Base
|
|
52
51
|
end
|
53
52
|
|
54
53
|
def get_all
|
55
|
-
host_names_and_ids = client.host_get(
|
54
|
+
host_names_and_ids = client.host_get('output' => ['name'])
|
56
55
|
|
57
56
|
# the fucking api ALWAYS returns the ids and that's
|
58
57
|
# why we need to extract the names separately
|
@@ -1,13 +1,9 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
|
3
3
|
class Proxies < Base
|
4
|
-
|
5
4
|
def get_id(proxy_name)
|
6
|
-
result = client.proxy_get({
|
7
|
-
'filter' => {'host' => proxy_name}
|
8
|
-
})
|
5
|
+
result = client.proxy_get('filter' => { 'host' => proxy_name })
|
9
6
|
|
10
7
|
result.first['proxyid']
|
11
8
|
end
|
12
|
-
|
13
|
-
end
|
9
|
+
end
|
@@ -6,8 +6,7 @@ class Scenarios < Base
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def get_id(options)
|
9
|
-
client.httptest_get({
|
10
|
-
'filter' => {'name' => options['name'], 'hostid' => options['hostid']}}).first['httptestid']
|
9
|
+
client.httptest_get('filter' => { 'name' => options['name'], 'hostid' => options['hostid'] }).first['httptestid']
|
11
10
|
end
|
12
11
|
|
13
12
|
def delete(options)
|
@@ -15,20 +14,19 @@ class Scenarios < Base
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def exists?(options)
|
18
|
-
result = client.httptest_get(
|
19
|
-
|
20
|
-
|
21
|
-
'hostid' => options['hostid']}})
|
17
|
+
result = client.httptest_get('countOutput' => true,
|
18
|
+
'filter' => { 'name' => options['name'],
|
19
|
+
'hostid' => options['hostid'] })
|
22
20
|
|
23
21
|
result.to_i >= 1 ? true : false
|
24
22
|
end
|
25
23
|
|
26
24
|
def get_all
|
27
|
-
scenarios = client.httptest_get(
|
25
|
+
scenarios = client.httptest_get('output' => 'extend')
|
28
26
|
names = extract_names(scenarios)
|
29
27
|
end
|
30
28
|
|
31
29
|
def extract_names(scenarios)
|
32
|
-
scenarios.map {|scenario| scenario['name']}
|
30
|
+
scenarios.map { |scenario| scenario['name'] }
|
33
31
|
end
|
34
32
|
end
|
@@ -2,9 +2,7 @@ require_relative 'base'
|
|
2
2
|
|
3
3
|
class Screens < Base
|
4
4
|
def get_id(options)
|
5
|
-
result = client.screen_get({
|
6
|
-
'filter' => {'name' => options['name']}
|
7
|
-
})
|
5
|
+
result = client.screen_get('filter' => { 'name' => options['name'] })
|
8
6
|
|
9
7
|
result.first['screenid']
|
10
8
|
end
|
@@ -18,8 +16,8 @@ class Screens < Base
|
|
18
16
|
end
|
19
17
|
|
20
18
|
def exists?(options)
|
21
|
-
result = client.screen_get(
|
22
|
-
if
|
19
|
+
result = client.screen_get('filter' => { 'name' => options['name'] })
|
20
|
+
if result.nil? || result.empty?
|
23
21
|
false
|
24
22
|
else
|
25
23
|
true
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
class Templates < Base
|
3
|
-
|
4
3
|
def exists?(name)
|
5
|
-
result = client.template_get(
|
6
|
-
if
|
4
|
+
result = client.template_get('filter' => { 'name' => name })
|
5
|
+
if result.nil? || result.empty?
|
7
6
|
false
|
8
7
|
else
|
9
8
|
true
|
@@ -15,15 +14,15 @@ class Templates < Base
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def get_id(name)
|
18
|
-
if
|
19
|
-
client.template_get(
|
17
|
+
if exists?(name)
|
18
|
+
client.template_get('filter' => { 'name' => name }).first['templateid']
|
20
19
|
else
|
21
20
|
raise NonExistingTemplate, "Template #{name} does not exist !"
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
24
|
def get_templates_for_host(id)
|
26
|
-
client.template_get(
|
25
|
+
client.template_get('hostids' => [id]).map { |result_set| result_set['templateid'] }
|
27
26
|
end
|
28
27
|
|
29
28
|
class NonExistingTemplate < StandardError; end
|
@@ -1,22 +1,35 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
class Triggers < Base
|
3
|
-
|
4
3
|
def create(options)
|
5
|
-
client.trigger_create(options)
|
4
|
+
client.trigger_create(options) unless exists?(options)
|
6
5
|
end
|
7
6
|
|
8
7
|
def delete(*trigger_ids)
|
9
8
|
client.trigger_delete(trigger_ids)
|
10
9
|
end
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
# this is very unefficient
|
12
|
+
# but there is no other way to verify that a trigger exists..
|
13
|
+
def exists?(options)
|
14
|
+
result = client.trigger_get('output' => 'extend',
|
15
|
+
'expandExpression' => true)
|
16
|
+
|
15
17
|
id = extract_id(result, options['expression'])
|
16
|
-
|
17
|
-
|
18
|
+
if id.nil?
|
19
|
+
false
|
18
20
|
else
|
21
|
+
true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_id(options)
|
26
|
+
result = client.trigger_get('output' => 'extend',
|
27
|
+
'expandExpression' => true)
|
28
|
+
id = extract_id(result, options['expression'])
|
29
|
+
if id.nil?
|
19
30
|
raise NonExistingTrigger, "Trigger with expression #{options['expression']} not found."
|
31
|
+
else
|
32
|
+
id
|
20
33
|
end
|
21
34
|
end
|
22
35
|
|
@@ -34,7 +47,4 @@ class Triggers < Base
|
|
34
47
|
end
|
35
48
|
result
|
36
49
|
end
|
37
|
-
|
38
50
|
end
|
39
|
-
|
40
|
-
|
@@ -1,15 +1,14 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
|
3
3
|
class Usergroups < Base
|
4
|
-
|
5
4
|
def create(options)
|
6
5
|
client.usergroup_create(options) unless exists?(options)
|
7
6
|
end
|
8
7
|
|
9
8
|
def exists?(options)
|
10
|
-
#client.usergroup_exists(options)
|
11
|
-
result = client.usergroup_get(
|
12
|
-
if result.empty? || result
|
9
|
+
# client.usergroup_exists(options)
|
10
|
+
result = client.usergroup_get('filter' => { 'name' => options['name'] })
|
11
|
+
if result.empty? || result.nil?
|
13
12
|
false
|
14
13
|
else
|
15
14
|
true
|
@@ -17,9 +16,8 @@ class Usergroups < Base
|
|
17
16
|
end
|
18
17
|
|
19
18
|
def get_id(options)
|
20
|
-
if
|
21
|
-
result = client.usergroup_get({
|
22
|
-
'filter' => {'name' => options['name']}})
|
19
|
+
if exists?(options)
|
20
|
+
result = client.usergroup_get('filter' => { 'name' => options['name'] })
|
23
21
|
result.first['usrgrpid']
|
24
22
|
else
|
25
23
|
raise NonExistingUsergroup, "Usergroup #{options['name']} does not exist !"
|
@@ -31,5 +29,4 @@ class Usergroups < Base
|
|
31
29
|
end
|
32
30
|
|
33
31
|
class NonExistingUsergroup < StandardError; end
|
34
|
-
|
35
32
|
end
|
data/lib/zapix/proxies/users.rb
CHANGED
@@ -6,13 +6,13 @@ class Users < Base
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def exists?(options)
|
9
|
-
result = client.user_get(
|
9
|
+
result = client.user_get('filter' => { 'alias' => options['alias'] })
|
10
10
|
result.empty? ? false : true
|
11
11
|
end
|
12
12
|
|
13
13
|
def get_id(options)
|
14
|
-
if
|
15
|
-
client.user_get(
|
14
|
+
if exists?(options)
|
15
|
+
client.user_get('filter' => { 'alias' => options['alias'] }).first['userid']
|
16
16
|
else
|
17
17
|
raise NonExistingUser, "User #{options['alias']} does not exist !"
|
18
18
|
end
|
@@ -24,5 +24,3 @@ class Users < Base
|
|
24
24
|
|
25
25
|
class NonExistingUser < StandardError; end
|
26
26
|
end
|
27
|
-
|
28
|
-
|
data/lib/zapix/version.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
class Host
|
2
|
-
|
3
2
|
attr_accessor :group_ids, :template_ids, :interfaces, :macros
|
4
3
|
|
5
|
-
def initialize
|
6
|
-
@group_ids =
|
7
|
-
@template_ids =
|
8
|
-
@interfaces =
|
9
|
-
@macros =
|
10
|
-
@properties =
|
4
|
+
def initialize
|
5
|
+
@group_ids = []
|
6
|
+
@template_ids = []
|
7
|
+
@interfaces = []
|
8
|
+
@macros = []
|
9
|
+
@properties = {}
|
11
10
|
end
|
12
11
|
|
13
12
|
def add_name(name)
|
@@ -20,7 +19,7 @@ class Host
|
|
20
19
|
|
21
20
|
def add_group_ids(*ids)
|
22
21
|
ids.each do |id|
|
23
|
-
group_ids << {'groupid' => id}
|
22
|
+
group_ids << { 'groupid' => id }
|
24
23
|
end
|
25
24
|
@properties.merge!('groups' => group_ids)
|
26
25
|
end
|
@@ -36,7 +35,7 @@ class Host
|
|
36
35
|
|
37
36
|
def add_template_ids(*ids)
|
38
37
|
ids.each do |id|
|
39
|
-
template_ids << {'templateid' => id}
|
38
|
+
template_ids << { 'templateid' => id }
|
40
39
|
end
|
41
40
|
@properties.merge!('templates' => template_ids)
|
42
41
|
end
|
@@ -49,7 +48,4 @@ class Host
|
|
49
48
|
def to_hash
|
50
49
|
@properties
|
51
50
|
end
|
52
|
-
|
53
51
|
end
|
54
|
-
|
55
|
-
|
@@ -10,9 +10,9 @@ class Interface
|
|
10
10
|
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/hostinterface/definitions#host_interface
|
11
11
|
# we assume ip and dns shall always be set
|
12
12
|
|
13
|
-
validates_inclusion_of :type, :
|
14
|
-
validates_inclusion_of :main, :
|
15
|
-
validates_inclusion_of :useip, :
|
13
|
+
validates_inclusion_of :type, in: 1..4
|
14
|
+
validates_inclusion_of :main, in: 0..1
|
15
|
+
validates_inclusion_of :useip, in: 0..1
|
16
16
|
|
17
17
|
def initialize(attributes)
|
18
18
|
@type = attributes['type'] ||= 1
|
@@ -20,7 +20,7 @@ class Interface
|
|
20
20
|
@useip = attributes['useip'] ||= 1
|
21
21
|
@ip = attributes['ip'] = attributes['ip']
|
22
22
|
@dns = attributes['dns'] = attributes['dns']
|
23
|
-
@port = attributes['port'] = attributes['port'] ||=
|
23
|
+
@port = attributes['port'] = attributes['port'] ||= 10_050
|
24
24
|
@result = {
|
25
25
|
'type' => type,
|
26
26
|
'main' => main,
|
@@ -38,5 +38,4 @@ class Interface
|
|
38
38
|
def to_hash
|
39
39
|
@result
|
40
40
|
end
|
41
|
-
|
42
41
|
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'uri'
|
3
3
|
require 'json'
|
4
|
-
|
5
|
-
class ZabbixRPCClient
|
6
4
|
|
5
|
+
class ZabbixRPCClient
|
7
6
|
attr_reader :uri, :debug
|
8
7
|
|
9
8
|
def initialize(options)
|
@@ -13,7 +12,7 @@ class ZabbixRPCClient
|
|
13
12
|
@debug = options[:debug]
|
14
13
|
@auth_token = authenticate
|
15
14
|
end
|
16
|
-
|
15
|
+
|
17
16
|
def method_missing(name, *args)
|
18
17
|
method_name = map_name(name)
|
19
18
|
|
@@ -22,17 +21,17 @@ class ZabbixRPCClient
|
|
22
21
|
'params' => args.first,
|
23
22
|
'id' => id,
|
24
23
|
'jsonrpc' => '2.0',
|
25
|
-
'auth' => @auth_token
|
24
|
+
'auth' => @auth_token
|
26
25
|
}.to_json
|
27
26
|
|
28
|
-
resp = JSON.parse(
|
27
|
+
resp = JSON.parse(http_post_request(post_body))
|
29
28
|
raise JSONRPCError, resp['error'] if resp['error']
|
30
29
|
puts "[DEBUG] Get answer: #{resp}" if debug
|
31
|
-
resp[
|
30
|
+
resp['result']
|
32
31
|
end
|
33
|
-
|
32
|
+
|
34
33
|
def http_post_request(post_body)
|
35
|
-
http
|
34
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
36
35
|
http.use_ssl = true
|
37
36
|
request = Net::HTTP::Post.new(uri.request_uri)
|
38
37
|
request.content_type = 'application/json'
|
@@ -42,16 +41,16 @@ class ZabbixRPCClient
|
|
42
41
|
end
|
43
42
|
|
44
43
|
def authenticate
|
45
|
-
p user_login(
|
46
|
-
user_login(
|
44
|
+
p user_login('user' => @username, 'password' => @password)
|
45
|
+
user_login('user' => @username, 'password' => @password)
|
47
46
|
end
|
48
47
|
|
49
48
|
def id
|
50
|
-
rand(
|
49
|
+
rand(100_000)
|
51
50
|
end
|
52
51
|
|
53
52
|
def map_name(name)
|
54
|
-
|
53
|
+
name.to_s.sub('_', '.')
|
55
54
|
end
|
56
55
|
|
57
56
|
class JSONRPCError < RuntimeError; end
|
data/lib/zapix.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
data/spec/zapix_specs.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require_relative 'spec_helper'
|
2
2
|
|
3
3
|
zrc = ZabbixAPI.connect(
|
4
|
-
:
|
5
|
-
:
|
6
|
-
:
|
7
|
-
:
|
8
|
-
|
4
|
+
service_url: ENV['ZABBIX_API_URL'],
|
5
|
+
username: ENV['ZABBIX_API_LOGIN'],
|
6
|
+
password: ENV['ZABBIX_API_PASSWORD'],
|
7
|
+
debug: true
|
8
|
+
)
|
9
9
|
|
10
10
|
hostgroup = 'hostgroup123'
|
11
11
|
another_hostgroup = 'anotherhostgroup'
|
@@ -17,8 +17,8 @@ application = 'web scenarios'
|
|
17
17
|
host = 'hostname'
|
18
18
|
scenario = 'scenario'
|
19
19
|
trigger_description = 'Webpage failed on {HOST.NAME}'
|
20
|
-
#trigger_expression = "{#{host}:web.test.fail[#{scenario}].max(#3)}#0"
|
21
|
-
trigger_expression = "{#{host}:system.cpu.load[percpu,avg1].last()}>5"
|
20
|
+
# trigger_expression = "{#{host}:web.test.fail[#{scenario}].max(#3)}#0"
|
21
|
+
trigger_expression = "{#{host}:system.cpu.load[percpu,avg1].last()}>5"
|
22
22
|
non_existing_trigger_expression = '{vfs.file.cksum[/etc/passwd].diff(0)}>0'
|
23
23
|
existing_action_name = 'Report problems to Zabbix administrators'
|
24
24
|
non_existing_action_name = 'No action defined'
|
@@ -31,7 +31,6 @@ test_user = 'Jim'
|
|
31
31
|
test_action = 'Test Action'
|
32
32
|
|
33
33
|
describe ZabbixAPI do
|
34
|
-
|
35
34
|
context 'hostgroup' do
|
36
35
|
before(:all) do
|
37
36
|
zrc.hostgroups.create(hostgroup)
|
@@ -61,7 +60,7 @@ describe ZabbixAPI do
|
|
61
60
|
|
62
61
|
it 'returns hostgroup id' do
|
63
62
|
result = zrc.hostgroups.get_id(hostgroup)
|
64
|
-
|
63
|
+
result.to_i.should >= 0
|
65
64
|
end
|
66
65
|
|
67
66
|
it 'throws exception if hostgroup id does not exist' do
|
@@ -69,7 +68,7 @@ describe ZabbixAPI do
|
|
69
68
|
end
|
70
69
|
|
71
70
|
it 'throws exception if someone checks for attached hosts of nonexisting group' do
|
72
|
-
|
71
|
+
expect { zrc.hostgroups.any_hosts?('nonexisting') }.to raise_error(HostGroups::NonExistingHostgroup)
|
73
72
|
end
|
74
73
|
|
75
74
|
it 'returns false if a hostgroup has no attached hosts' do
|
@@ -77,9 +76,8 @@ describe ZabbixAPI do
|
|
77
76
|
end
|
78
77
|
|
79
78
|
it 'returns all hostgroups' do
|
80
|
-
|
79
|
+
zrc.hostgroups.get_all.should include(hostgroup, another_hostgroup)
|
81
80
|
end
|
82
|
-
|
83
81
|
end
|
84
82
|
context 'complex hostgroup consisting hosts' do
|
85
83
|
before(:each) do
|
@@ -90,16 +88,15 @@ describe ZabbixAPI do
|
|
90
88
|
example_host.add_interfaces(create_interface.to_hash)
|
91
89
|
example_host.add_group_ids(hostgroup_id)
|
92
90
|
example_host.add_template_ids(zrc.templates.get_id(template_1), zrc.templates.get_id(template_2))
|
93
|
-
example_host.add_macros(
|
91
|
+
example_host.add_macros('macro' => '{$TESTMACRO}', 'value' => 'test123')
|
94
92
|
zrc.hosts.create_or_update(example_host.to_hash)
|
95
93
|
end
|
96
94
|
|
97
|
-
|
95
|
+
it 'deletes a hostgroup with attached hosts' do
|
98
96
|
zrc.hosts.exists?(host).should be true
|
99
97
|
zrc.hostgroups.delete(hostgroup_with_hosts)
|
100
98
|
zrc.hostgroups.exists?(hostgroup_with_hosts).should be false
|
101
99
|
end
|
102
|
-
|
103
100
|
end
|
104
101
|
|
105
102
|
context 'complex hostgroup' do
|
@@ -109,7 +106,7 @@ describe ZabbixAPI do
|
|
109
106
|
example_host = Host.new
|
110
107
|
example_host.add_name(host)
|
111
108
|
example_host.add_interfaces(create_interface.to_hash)
|
112
|
-
example_host.add_macros(
|
109
|
+
example_host.add_macros('macro' => '{$TESTMACRO}', 'value' => 'test123')
|
113
110
|
example_host.add_group_ids(hostgroup_id)
|
114
111
|
example_host.add_template_ids(zrc.templates.get_id(template_1), zrc.templates.get_id(template_2))
|
115
112
|
zrc.hosts.create_or_update(example_host.to_hash)
|
@@ -125,7 +122,7 @@ describe ZabbixAPI do
|
|
125
122
|
webcheck_options['hostid'] = zrc.hosts.get_id(host)
|
126
123
|
webcheck_options['name'] = scenario
|
127
124
|
webcheck_options['applicationid'] = zrc.applications.get_id(application_options)
|
128
|
-
webcheck_options['steps'] = [{'name' => 'Homepage', 'url' => 'm.test.de', 'status_codes' => 200, 'no' => 1}]
|
125
|
+
webcheck_options['steps'] = [{ 'name' => 'Homepage', 'url' => 'm.test.de', 'status_codes' => 200, 'no' => 1 }]
|
129
126
|
zrc.scenarios.create(webcheck_options)
|
130
127
|
|
131
128
|
# creates a trigger
|
@@ -141,7 +138,6 @@ describe ZabbixAPI do
|
|
141
138
|
end
|
142
139
|
|
143
140
|
describe 'hosts' do
|
144
|
-
|
145
141
|
it 'returns true if a hostgroup has attached hosts' do
|
146
142
|
zrc.hostgroups.any_hosts?(hostgroup_with_hosts).should be true
|
147
143
|
end
|
@@ -202,13 +198,13 @@ describe ZabbixAPI do
|
|
202
198
|
host_id = zrc.hosts.get_id(host)
|
203
199
|
options = {}
|
204
200
|
options['host_id'] = host_id
|
205
|
-
options['macros'] = [{'macro' => '{$TESTMACRO}', 'value' => 'this is only a test macro'}]
|
201
|
+
options['macros'] = [{ 'macro' => '{$TESTMACRO}', 'value' => 'this is only a test macro' }]
|
206
202
|
zrc.hosts.update_macros(options)
|
207
203
|
end
|
208
204
|
|
209
205
|
it 'creates a template' do
|
210
206
|
template_name = 'Template Tomcat'
|
211
|
-
options = {'host' => template_name}
|
207
|
+
options = { 'host' => template_name }
|
212
208
|
options['groups'] = zrc.hostgroups.get_id(templates_hostgroup)
|
213
209
|
zrc.templates.create(options)
|
214
210
|
zrc.templates.exists?(template_name).should be true
|
@@ -235,12 +231,12 @@ describe ZabbixAPI do
|
|
235
231
|
options['name'] = application
|
236
232
|
options['hostid'] = zrc.hosts.get_id(host)
|
237
233
|
result = zrc.applications.get_id(options)
|
238
|
-
|
234
|
+
result.to_i.should >= 0
|
239
235
|
end
|
240
236
|
|
241
237
|
it 'throws exception on non existing application' do
|
242
238
|
options = {}
|
243
|
-
options['name'] =
|
239
|
+
options['name'] = 'nonexisting'
|
244
240
|
options['hostid'] = zrc.hosts.get_id(host)
|
245
241
|
expect { zrc.applications.get_id(options) }.to raise_error(Applications::NonExistingApplication)
|
246
242
|
end
|
@@ -256,7 +252,7 @@ describe ZabbixAPI do
|
|
256
252
|
|
257
253
|
it 'returns all web scenarios' do
|
258
254
|
options = {}
|
259
|
-
|
255
|
+
zrc.scenarios.get_all.should include(scenario)
|
260
256
|
end
|
261
257
|
|
262
258
|
it 'gets the id of a web scenario' do
|
@@ -265,12 +261,12 @@ describe ZabbixAPI do
|
|
265
261
|
options['hostid'] = zrc.hosts.get_id(host)
|
266
262
|
zrc.scenarios.exists?(options).should be true
|
267
263
|
result = zrc.scenarios.get_id(options)
|
268
|
-
|
264
|
+
result['result'].to_i.should >= 0
|
269
265
|
end
|
270
266
|
|
271
267
|
it 'returns false if a web scenario does not exist' do
|
272
268
|
options = {}
|
273
|
-
options['name'] =
|
269
|
+
options['name'] = 'nonexisting'
|
274
270
|
options['hostid'] = zrc.hosts.get_id(host)
|
275
271
|
zrc.scenarios.exists?(options).should be false
|
276
272
|
end
|
@@ -320,7 +316,7 @@ describe ZabbixAPI do
|
|
320
316
|
it 'check if interface exists for host' do
|
321
317
|
options = {}
|
322
318
|
options['hostid'] = zrc.hosts.get_id(host)
|
323
|
-
options['port'] =
|
319
|
+
options['port'] = 10_050
|
324
320
|
options['type'] = 1
|
325
321
|
zrc.hostinterfaces.exists?(options).should be true
|
326
322
|
|
@@ -355,12 +351,12 @@ describe ZabbixAPI do
|
|
355
351
|
'operator' => 0, # =
|
356
352
|
'value' => zrc.hostgroups.get_id('Templates')
|
357
353
|
},
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
354
|
+
# not in maintenance
|
355
|
+
{
|
356
|
+
'conditiontype' => 16, # Maintenance
|
357
|
+
'operator' => 7, # not in
|
358
|
+
'value' => 'maintenance'
|
359
|
+
}]
|
364
360
|
options['operations'] = [{
|
365
361
|
'operationtype' => 0,
|
366
362
|
'esc_period' => 0,
|
@@ -397,7 +393,7 @@ describe ZabbixAPI do
|
|
397
393
|
options = {}
|
398
394
|
options['name'] = test_action
|
399
395
|
result = zrc.actions.get_id(options)
|
400
|
-
|
396
|
+
result.to_i.should >= 0
|
401
397
|
end
|
402
398
|
end
|
403
399
|
|
@@ -431,7 +427,7 @@ describe ZabbixAPI do
|
|
431
427
|
options = {}
|
432
428
|
options['name'] = test_usergroup
|
433
429
|
result = zrc.usergroups.get_id(options)
|
434
|
-
|
430
|
+
result.to_i.should >= 0
|
435
431
|
options['name'] = non_existing_usergroup
|
436
432
|
expect { zrc.usergroups.get_id(options) }.to raise_error(Usergroups::NonExistingUsergroup)
|
437
433
|
end
|
@@ -478,18 +474,18 @@ describe ZabbixAPI do
|
|
478
474
|
options = {}
|
479
475
|
options['alias'] = test_user
|
480
476
|
result = zrc.users.get_id(options)
|
481
|
-
|
477
|
+
result.to_i.should >= 0
|
482
478
|
options['alias'] = non_existing_user
|
483
479
|
expect { zrc.users.get_id(options) }.to raise_error(Users::NonExistingUser)
|
484
480
|
end
|
485
|
-
|
486
481
|
end
|
487
482
|
end
|
488
483
|
|
489
484
|
def create_interface
|
490
485
|
Interface.new(
|
491
486
|
'ip' => random_local_ip,
|
492
|
-
'dns' => random_domain
|
487
|
+
'dns' => random_domain
|
488
|
+
)
|
493
489
|
end
|
494
490
|
|
495
491
|
def create_jmx_interface
|
@@ -498,7 +494,8 @@ describe ZabbixAPI do
|
|
498
494
|
'dns' => random_domain,
|
499
495
|
'type' => 4, # JMX
|
500
496
|
'main' => 1, # default jmx interface
|
501
|
-
'port' => 9003
|
497
|
+
'port' => 9003
|
498
|
+
)
|
502
499
|
end
|
503
500
|
|
504
501
|
def random_string
|
@@ -516,5 +513,4 @@ describe ZabbixAPI do
|
|
516
513
|
def random_domain
|
517
514
|
"#{random_string}.our-cloud.de"
|
518
515
|
end
|
519
|
-
|
520
516
|
end
|
data/zapix.gemspec
CHANGED
@@ -4,24 +4,23 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'zapix/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'zapix3'
|
8
8
|
spec.version = Zapix::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
9
|
+
spec.authors = ['stoyan']
|
10
|
+
spec.email = ['stoyanoff.s@gmail.com']
|
11
|
+
spec.description = 'Communication with the Zabbix API made easy. This version is compatible with zabbix 3.0'
|
12
|
+
spec.summary = 'A cool gem'
|
13
|
+
spec.homepage = 'https://github.com/mrsn/zapix3'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
|
-
spec.files = `git ls-files`.split(
|
16
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
20
|
-
|
21
|
-
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
-
spec.add_development_dependency "rake"
|
23
|
-
spec.add_development_dependency "json"
|
24
|
-
spec.add_development_dependency "rspec"
|
25
|
-
spec.add_development_dependency "activerecord"
|
19
|
+
spec.require_paths = ['lib']
|
26
20
|
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_development_dependency 'json'
|
24
|
+
spec.add_development_dependency 'rspec'
|
25
|
+
spec.add_development_dependency 'activerecord'
|
27
26
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zapix3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- stoyan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|