zabbix_sender 0.1.0

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.
@@ -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: []