zabbix_sender 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 07873491eeb3f0bf9e3a4344f79c5bbb00d37f9d
4
+ data.tar.gz: 5990dd80cc2fee5472d51f5c82c445d747905db6
5
+ SHA512:
6
+ metadata.gz: e2de353e2a726de4cbb23505515f89c523e8d78d8710877e860569d0441c19eb09fa1abe3b2adeb6539734e41f2f2c611a50043859769ee2911576c674ba2386
7
+ data.tar.gz: fc5f5c1c366497fc477778fcfc325fcd8cfe449f88ec0108160c6a3b480a6b8cdabf6d7cbb4658f78eaf33bf99dde370748f7de1f93d9983353961cf4c621243
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.3
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in zabbix_sender.gemspec
4
+ gemspec
@@ -0,0 +1,33 @@
1
+ # ZabbixSender
2
+ Zabbix Sender gem
3
+
4
+ ## Installation
5
+
6
+ Add this line to your application's Gemfile:
7
+
8
+ ```ruby
9
+ gem 'zabbix_sender'
10
+ ```
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install zabbix_sender
19
+
20
+ ## Usage
21
+
22
+ ```ruby
23
+ require "zabbix_sender"
24
+
25
+ sender = ZabbixSender.new(zabbix_host: "some-zabbix", port: 10051)
26
+ sender.post("host", "key", "value")
27
+ #=> {"response"=>"success", "info"=>"processed: 1; failed: 0; total: 1; seconds spent: 0.000075"}
28
+ ```
29
+
30
+ ## Contributing
31
+
32
+ Bug reports and pull requests are welcome on GitHub at https://github.com/nownabe/zabbix_sender.
33
+
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "zabbix_sender"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,34 @@
1
+ require "json"
2
+ require "socket"
3
+
4
+ require "zabbix_sender/sender"
5
+
6
+ module ZabbixSender
7
+ MissingConfigFile = Class.new(StandardError)
8
+ MissingServerActiveConfig = Class.new(StandardError)
9
+
10
+ class << self
11
+ def from_config(config_path = "/etc/zabbix/zabbix_agentd.conf")
12
+ unless File.exist?(config_path)
13
+ raise MissingConfigFile, "Missing config file with #{config_path}"
14
+ end
15
+ host, port = parse_config(config_path)
16
+ Sender.new(zabbix_host: host, zabbix_port: port)
17
+ end
18
+
19
+ def new(zabbix_host: "127.0.0.1", zabbix_port: 10051)
20
+ Sender.new(zabbix_host: zabbix_host, zabbix_port: zabbix_port)
21
+ end
22
+
23
+ private
24
+
25
+ def parse_config(config_path)
26
+ unless /^ServerActive\s*=\s*(?<server>[\w\-:,\.\[\]]+)\s*$/ =~ File.read(config_path)
27
+ raise MissingServerActiveConfig, "Missing ServerActive config in #{config_path}"
28
+ end
29
+ host, port = server.split(":")
30
+ port ||= 10051
31
+ [host, port.to_i]
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,59 @@
1
+ require "json"
2
+
3
+ module ZabbixSender
4
+ # Zabbix Sender protocol:
5
+ #
6
+ # https://www.zabbix.org/wiki/Docs/protocols
7
+ # https://www.zabbix.com/documentation/2.4/manual/appendix/items/activepassive
8
+ #
9
+ # <HEADER><DATA LENGTH><DATA>
10
+ #
11
+ # HEADER - "ZBXD\x01"
12
+ # DATA LENGTH - data length (8 bytes, little endian)
13
+ # DATA - JSON, see data method
14
+ class Request
15
+ HEADER = "ZBXD\x01"
16
+
17
+ attr_reader :host, :key, :value
18
+
19
+ def initialize(host, key, value)
20
+ @host = host
21
+ @key = key
22
+ @value = value
23
+ end
24
+
25
+ def send(socket)
26
+ socket.puts(encoded_data)
27
+ @raw_response = socket.gets
28
+ response
29
+ end
30
+
31
+ def response
32
+ @response ||= JSON.parse(@raw_response[13..-1])
33
+ end
34
+
35
+ private
36
+
37
+ def data
38
+ @data ||=
39
+ {
40
+ request: "sender data",
41
+ data: [
42
+ {
43
+ host: host,
44
+ key: key,
45
+ value: value
46
+ }
47
+ ]
48
+ }.to_json
49
+ end
50
+
51
+ def data_length
52
+ [data.size].pack("Q")
53
+ end
54
+
55
+ def encoded_data
56
+ "#{HEADER}#{data_length}#{data}"
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,30 @@
1
+ require "socket"
2
+
3
+ require "zabbix_sender/request"
4
+
5
+ module ZabbixSender
6
+ class Sender
7
+ attr_reader :zabbix_host, :zabbix_port
8
+
9
+ def initialize(zabbix_host: "127.0.0.1", zabbix_port: 10051)
10
+ @zabbix_host = zabbix_host
11
+ @zabbix_port = zabbix_port
12
+ end
13
+
14
+ def post(host, key, value)
15
+ request = Request.new(host, key, value)
16
+ begin
17
+ socket = TCPSocket.new(zabbix_host, zabbix_port)
18
+ request.send(socket)
19
+ ensure
20
+ socket.close
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def decode(raw_data)
27
+ JSON.parse(raw_data[13..-1])
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module ZabbixSender
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'zabbix_sender/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "zabbix_sender"
8
+ spec.version = ZabbixSender::VERSION
9
+ spec.authors = ["nownabe"]
10
+ spec.email = ["nownabe@gmail.com"]
11
+
12
+ spec.summary = %q{Zabbix Sender gem}
13
+ spec.homepage = "https://github.com/nownabe/zabbix_sender"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = "exe"
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.10"
21
+ spec.add_development_dependency "pry"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "rspec-its"
25
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zabbix_sender
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - nownabe
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-12-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-its
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email:
85
+ - nownabe@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - Gemfile
94
+ - README.md
95
+ - Rakefile
96
+ - bin/console
97
+ - bin/setup
98
+ - lib/zabbix_sender.rb
99
+ - lib/zabbix_sender/request.rb
100
+ - lib/zabbix_sender/sender.rb
101
+ - lib/zabbix_sender/version.rb
102
+ - zabbix_sender.gemspec
103
+ homepage: https://github.com/nownabe/zabbix_sender
104
+ licenses: []
105
+ metadata: {}
106
+ post_install_message:
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 2.4.5.1
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: Zabbix Sender gem
126
+ test_files: []