opstat-client 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7d1ea8176a0ae19152d159fc58fb2b72f8edd52620e7b53fe44b65dbd06ca359
4
+ data.tar.gz: 7750313b8d5e8f94d722a0e4dd21b6f4344934a98c1ff730105567adeee715b2
5
+ SHA512:
6
+ metadata.gz: 63143d45bfbf7634136ab94dfb033de9c24fe1ffdd87bed46d9e332d28a57a068a66a46e8119d50af40227a85227c5602333d72daa1811bc7803545c0fb9cd0e
7
+ data.tar.gz: 74feed2f2636cb2c7c473ca5c3f7c7f98ac94cc9bea170d68eb952c2a0ee8cd02243a59ac0d82074c7e136c92f22546976264d2b8c8d4ae524b6ae701c82c700
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *.gem
data/.gitlab-ci.yml ADDED
@@ -0,0 +1,16 @@
1
+ before_script:
2
+ - ruby -v # Print out ruby version for debugging
3
+ - gem install rspec
4
+ - gem build opstat-client.gemspec
5
+ # Uncomment next line if your rails app needs a JS runtime:
6
+ # - apt-get update -q && apt-get install nodejs -yqq
7
+ # - gem install bundler --no-ri --no-rdoc # Bundler is not installed with the image
8
+ # - bundle install -j $(nproc) --path vendor # Install dependencies into ./vendor/ruby
9
+
10
+ rspec:
11
+ script:
12
+ - rspec spec
13
+
14
+ 01_create_gem:
15
+ script:
16
+ - "cp opstat-client-`ruby -e 'require \"./lib/opstat-client/version.rb\"; puts Opstat.version'`.gem /home/builds/admin/opstat-client"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in opstat.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Krzysztof Tomczyk
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # Opstat
2
+
3
+ iCollect and analyze statistics for opstat analytics system
4
+
5
+ ## Installation
6
+
7
+ Clone this repository
8
+
9
+ cd into repository base
10
+
11
+ And then execute:
12
+
13
+ $ gem build
14
+
15
+ Next install created gem as:
16
+
17
+ $ gem install opstat-client-0.0.2.gem
18
+
19
+ ## Usage
20
+
21
+ Configure it via /etc/opstat/opstat.yml
22
+ Run command opstatd-client
23
+
24
+ ## Contributing
25
+
26
+ 1. Fork it
27
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
28
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
29
+ 4. Push to the branch (`git push origin my-new-feature`)
30
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/TODO ADDED
@@ -0,0 +1,4 @@
1
+ configuration - amqp channel name
2
+ security - amqp
3
+ script - shut gracefully, send all data
4
+ logging
data/TODO_NOW ADDED
@@ -0,0 +1,5 @@
1
+ config - master
2
+ refactor - connect - same code in client/server
3
+ nagios - plugin
4
+ load- only used plugins
5
+ gem - install to /usr/local
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/ruby19
2
+ #
3
+ require 'rubygems'
4
+ require 'daemons'
5
+ require 'optparse'
6
+ require 'opstat-client'
7
+
8
+
9
+ Daemons.run_proc(
10
+ 'opstatd_client', # name of daemon
11
+ # :dir_mode => :normal
12
+ :dir => '/var/run', # directory where pid file will be stored
13
+ :backtrace => true,
14
+ # :monitor => true,
15
+ :log_dir => '/var/log',
16
+ :log_output => true
17
+ ) do
18
+ Opstat::Client.main_loop
19
+ end
@@ -0,0 +1,21 @@
1
+ #!/sbin/runscript
2
+ # Copyright 1999-2013 Gentoo Foundation
3
+ # Distributed under the terms of the GNU General Public License v2
4
+ # $Header: $
5
+
6
+ depend() {
7
+ need net
8
+ }
9
+
10
+ #TODO - parameters - log file, config file, etc.
11
+ start() {
12
+ ebegin Starting opstat client
13
+ opstatd_client.rb start
14
+ eend $?
15
+ }
16
+
17
+ stop() {
18
+ ebegin Stoping opstat client
19
+ opstatd_client.rb stop
20
+ eend $?
21
+ }
@@ -0,0 +1,68 @@
1
+ #!/bin/sh
2
+ #
3
+ # Created 2013-04-07 by office@optilabs.eu
4
+ #
5
+ # opstatd_client This shell script takes care of starting and stopping
6
+ # opstatd_client.
7
+ #
8
+ # chkconfig: - 90 10
9
+ # description: opstatd_client is a daemon for gathering system performance data
10
+ # processname: opstatd_client
11
+ # config: /etc/opstat/config_opstat.yml
12
+
13
+
14
+ # Source function library
15
+ if [ -f /etc/rc.d/init.d/functions ]; then
16
+ . /etc/rc.d/init.d/functions
17
+ elif [ -f /etc/init.d/functions ]; then
18
+ . /etc/init.d/functions
19
+ elif [ -f /etc/rc.d/functions ]; then
20
+ . /etc/rc.d/functions
21
+ fi
22
+
23
+ # Source networking configuration.
24
+ . /etc/sysconfig/network
25
+
26
+ # Read configuration (environment etc.) for nrpe and plugins
27
+ if [ -f /etc/sysconfig/opstatd_client ]; then
28
+ . /etc/sysconfig/opstatd_client
29
+ fi
30
+
31
+ # Check that networking is up.
32
+ [ ${NETWORKING} = "no" ] && exit 0
33
+
34
+ RETVAL=0
35
+
36
+ # See how we were called.
37
+ case "$1" in
38
+ start)
39
+ # Start daemons.
40
+ echo -n "Starting opstatd_client: "
41
+ opstatd_client.rb start
42
+ RETVAL=$?
43
+ echo
44
+ [ $RETVAL = 0 ]
45
+ ;;
46
+ stop)
47
+ # Stop daemons.
48
+ echo -n "Shutting down opstatd_client: "
49
+ opstatd_client.rb stop
50
+ RETVAL=$?
51
+ echo
52
+ [ $RETVAL = 0 ]
53
+ ;;
54
+ restart)
55
+ $0 stop
56
+ $0 start
57
+ ;;
58
+ status)
59
+ opstatd_client.rb status
60
+ RETVAL=$?
61
+ ;;
62
+ *)
63
+ echo "Usage: opstatd_client {start|stop|restart|status}"
64
+ RETVAL=2
65
+ esac
66
+
67
+ exit $RETVAL
68
+
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env ruby
2
+ require 'yaml'
3
+ require 'socket'
4
+
5
+ include Opstat::Common
6
+
7
+
8
+ module Opstat
9
+ module SendData
10
+ extend Logging
11
+ def self.send_from_queue(q, ex, name)
12
+ #TODO cache-evealuate only at start time
13
+ begin
14
+ @hostname ||= Socket.gethostname
15
+ @ip_address ||= Socket::getaddrinfo(@hostname,"echo",Socket::AF_INET)[0][3]
16
+ data_to_send = {:collected_data => []}
17
+
18
+
19
+ 1.upto(q.size) do
20
+ q.pop do |data|
21
+ data_to_send[:collected_data] << data
22
+ end
23
+ end
24
+
25
+ # TODO auto register - assign some unique id for a new host instead of hostname, ip_address pai
26
+ data_to_send[:hostname] = @hostname
27
+ data_to_send[:ip_address] = @ip_address
28
+ data_to_send[:version] = Opstat.version
29
+ custom_tags = Opstat::Config.instance.get('client')['custom_tags']
30
+ data_to_send[:custom_tags] = Opstat::Config.instance.get('client')['custom_tags'] if custom_tags
31
+ data_to_send[:send_data_interval] = Opstat::Config.instance.get('client')['send_data_interval']
32
+
33
+ ex.publish data_to_send.to_json, :routing_key => name
34
+ rescue SocketError
35
+ raise "Unable to resolve hostname #{Socket.gethostname}"
36
+ end
37
+ end
38
+
39
+ def unbind
40
+ oplogger.info 'AMQP Connection closed'
41
+ # EventMachine::stop_event_loop
42
+ end
43
+ end #module SendData
44
+
45
+
46
+
47
+ module Client
48
+ extend Logging
49
+ def self.main_loop
50
+ oplogger.info 'Starting client main loop'
51
+ queue = EM::Queue.new
52
+ mq_config = Opstat::Config.instance.get_mq_config
53
+ send_data_interval = Opstat::Config.instance.get('client')['send_data_interval']
54
+ @a_plugins = Opstat::Plugins.create_plugins(queue)
55
+ EventMachine::run do
56
+ AMQP.start(mq_config) do |connection|
57
+ connection.on_tcp_connection_loss do |conn, settings|
58
+ oplogger.warn "[network failure] Trying to reconnect..."
59
+ conn.reconnect(false, 2)
60
+ end
61
+
62
+ oplogger.info "Connecting to AMQP broker. Running #{AMQP::VERSION} version of the gem..."
63
+
64
+ channel = AMQP::Channel.new(connection,:auto_recovery => true)
65
+ channel.on_error do |ch, channel_close|
66
+ oplogger.error "AMQP channel error"
67
+ raise channel_close.reply_text
68
+ end
69
+
70
+ ampqqueue = channel.queue(mq_config['queue_name'], :auto_delete => false, :durable => true)
71
+ exchange = channel.default_exchange
72
+
73
+ @a_plugins.each do |task|
74
+ if task.external_plugin_needed?
75
+ task.set_external_plugin = EventMachine::open_datagram_socket task.external_plugin['address'], task.external_plugin['port'], Opstat::Plugins::UDPExternalPlugins::Apache2, task.external_plugin
76
+ end
77
+ EventMachine::add_periodic_timer(task.interval) {task.parse_and_queue}
78
+ end
79
+
80
+ EventMachine::add_periodic_timer(send_data_interval) { Opstat::SendData.send_from_queue(queue, exchange, ampqqueue.name) }
81
+ end
82
+ end #EventMachine::run do
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,28 @@
1
+ module Opstat
2
+ module Common
3
+ def self.camelize(term)
4
+ string = term.to_s
5
+ string = string.sub(/^[a-z\d]*/) { $&.capitalize }
6
+ string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
7
+ end
8
+
9
+ def self.constantize(class_name)
10
+ names = class_name.split('::')
11
+ names.shift if names.empty? || names.first.empty?
12
+
13
+ constant = Object
14
+ names.each do |n|
15
+ name = Opstat::Common.camelize(n)
16
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
17
+ end
18
+ constant
19
+ end
20
+
21
+ def constantize(camel_cased_word)
22
+ Opstat::Common.constantize(camel_cased_word)
23
+ end
24
+
25
+ end
26
+ end
27
+
28
+ #TODO load only if run on main server
@@ -0,0 +1,60 @@
1
+ client:
2
+ send_data_interval: 60
3
+ log_level: INFO
4
+
5
+ mq:
6
+ queue_name: amqpgem.test.hello_world
7
+ :host: 10.5.0.10
8
+ :user: opstat
9
+ :password: password
10
+
11
+ plugins:
12
+ cpu:
13
+ interval: 10
14
+ load:
15
+ interval: 15
16
+ memory:
17
+ interval: 30
18
+ network:
19
+ interval: 30
20
+ disk:
21
+ interval: 600
22
+ facts:
23
+ interval: 21600
24
+ # apache2:
25
+ # log_level: DEBUG
26
+ # interval: 30
27
+ # external_plugin:
28
+ # log_level: DEBUG
29
+ # address: 127.0.0.1
30
+ # port: 55555
31
+ # log_format: '%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O'
32
+ # oracle_sessions:
33
+ # interval: 180
34
+ # su_user: oracle
35
+ # db_user: db_user
36
+ # db_password: db_password
37
+ # oracle_fras_sizes:
38
+ # interval: 7200
39
+ # su_user: oracle
40
+ # db_user: db_user
41
+ # db_password: db_password
42
+ # oracle_tablespaces_sizes:
43
+ # interval: 3600
44
+ # su_user: oracle
45
+ # db_user: db_user
46
+ # db_password: db_password
47
+ # webobjects:
48
+ # interval: 60
49
+ # wotask_password: secret
50
+ # wotask_url: http://127.0.0.1:1085/cgi-bin/WebObjects/wotaskd.woa/wa/monitorRequest
51
+ #
52
+ # fpm:
53
+ # interval: 30
54
+ # log_level: DEBUG
55
+ # pools:
56
+ # www:
57
+ # fcgi_socket: /var/run/wypozycz.pl-fpm.socket
58
+ # status_url: /status
59
+ # request_method: GET
60
+
@@ -0,0 +1,72 @@
1
+ require 'yaml'
2
+ module Opstat
3
+ # A pretty sucky config class, ripe for refactoring/improving
4
+ class Config
5
+ include Opstat::Logging
6
+ include Singleton
7
+
8
+ def initialize
9
+ @configured = false
10
+ @config = ''
11
+ #TODO set defaults
12
+ end
13
+
14
+ def load_config(config_file)
15
+ unless File.exists?(config_file)
16
+ preconfig_logger.info 'No config file - create config file with default settings. Please set correct MQ settings'
17
+ default_config_path = File.dirname(File.expand_path(__FILE__)) + '/config/opstat.yml'
18
+ system_config_dir = '/etc/opstat'
19
+ system_config_path = system_config_dir + '/opstat.yml'
20
+ FileUtils.mkdir(system_config_dir) unless File.exists?(system_config_dir)
21
+ FileUtils.cp(default_config_path,system_config_path)
22
+ end
23
+ @config = YAML.load_file(config_file)
24
+ self.set_defaults
25
+ end
26
+
27
+ def set_defaults
28
+ @config['client']['send_data_interval'] ||= 30
29
+ @config['client']['log_level'] ||= "WARN"
30
+ end
31
+
32
+ def get(key)
33
+ @config[key]
34
+ end
35
+
36
+ def get_mq_config
37
+ get('mq')
38
+ end
39
+
40
+ def init_config(options)
41
+ load_config(options[:config_file])
42
+ set_defaults
43
+ @config[:config_file] = options[:config_file]
44
+ end
45
+
46
+ end
47
+ end
48
+ options = {}
49
+ optparse = OptionParser.new do|opts|
50
+ # Set a banner, displayed at the top
51
+ # of the help screen.
52
+ opts.banner = "Usage: command [options]"
53
+
54
+ options[:verbose] = false
55
+ opts.on( '-v', '--verbose', 'Output more information' ) do
56
+ options[:verbose] = true
57
+ end
58
+
59
+ #TODO required options
60
+ opts.on( '-c', '--config-file String', :required, "Config file path" ) do|l|
61
+ options[:config_file] = l
62
+ end
63
+ options[:config_file] ||= '/etc/opstat/opstat.yml'
64
+
65
+ opts.on( '-h', '--help', 'Display this screen' ) do
66
+ puts opts
67
+ exit
68
+ end
69
+ end
70
+ optparse.parse!
71
+
72
+ Opstat::Config.instance.init_config(options)
@@ -0,0 +1,24 @@
1
+ client:
2
+ send_data_interval: 10
3
+
4
+ mq:
5
+ queue_name: opstat
6
+ queue_address: 10.5.0.10
7
+
8
+ plugins:
9
+ cpu:
10
+ interval: 3
11
+ load:
12
+ interval: 5
13
+ # nagios:
14
+ # interval: 1800
15
+ # meminfo:
16
+ # interval: 4
17
+ # diskstats:
18
+ # interval: 5
19
+ # vmstat:
20
+ # interval: 3
21
+ connectionusage:
22
+ interval: 3
23
+ # facter:
24
+ # interval: 21600
@@ -0,0 +1,29 @@
1
+ require 'log4r'
2
+
3
+ module Opstat
4
+ module Logging
5
+ def preconfig_logger
6
+ return @logger if @logger
7
+ @logger = Log4r::Logger.new self.class.to_s
8
+ @logger.level = @logger.levels.index('INFO')
9
+ outputter = Log4r::Outputter.stdout
10
+ outputter.formatter = Log4r::PatternFormatter.new(:pattern => "%l - %C - %m")
11
+ @logger.outputters << outputter
12
+ @logger
13
+ end
14
+ def oplogger
15
+ return @logger if @logger
16
+ @logger = Log4r::Logger.new self.class.to_s
17
+ @logger.level = @logger.levels.index(log_level)
18
+ outputter = Log4r::Outputter.stdout
19
+ outputter.formatter = Log4r::PatternFormatter.new(:pattern => "%l - %C - %m")
20
+ @logger.outputters << outputter
21
+ @logger
22
+ end
23
+ def log_level
24
+ @log_level ||= Opstat::Config.instance.get('client')['log_level']
25
+ @log_level
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,54 @@
1
+ module Opstat
2
+ module Plugins
3
+ extend Opstat::Logging
4
+ #TODO make subclases of task -> task_command. task_parse <- and then inherit plugins from it?
5
+ # task_command - u analyze output of the command, task_parse - just parse the file in /proc or other
6
+ def self.create_plugins(queue)
7
+ plugins = []
8
+ Opstat::Config.instance.get('plugins').each_pair do |name, conf|
9
+ conf['log_level'] ||= Opstat::Config.instance.get('client')['log_level']
10
+ oplogger.info "Loading #{name} plugin with properties #{conf.inspect}"
11
+ Opstat::Plugins.load_plugin(name)
12
+ plugin_name = name
13
+ class_name = "Opstat::Plugins::#{name}"
14
+ task = Opstat::Common.constantize(class_name).new(plugin_name, queue, conf)
15
+ plugins << task
16
+ end
17
+ plugins
18
+ end
19
+
20
+
21
+ class Task
22
+ include Opstat::Logging
23
+ attr_accessor :interval, :next_run#, :next_run#, :data, :data_sended
24
+
25
+ def initialize (name, queue, config)
26
+ @name = name
27
+ @queue = queue
28
+ @interval = config['interval']
29
+ @interval ||= 60
30
+ @data_sended = {}
31
+ @count_number = 0 #TODO how big it should be
32
+ @send_number = 0 #TODO how big it should be
33
+ @log_level = config['log_level']
34
+ @run = config['run']
35
+ @external_plugin = config['external_plugin']
36
+ end
37
+
38
+ def parse_and_queue
39
+ oplogger.info "collecting stats"
40
+ report = parse
41
+ oplogger.debug report
42
+ @queue.push({ :timestamp => Time.now, :plugin => @name, :data => report, :interval => @interval})
43
+ end
44
+
45
+ def external_plugin_needed?
46
+ if @external_plugin.nil?
47
+ return false
48
+ end
49
+ return true
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,26 @@
1
+ begin
2
+ require 'rubygems'
3
+ rescue LoadError
4
+ end
5
+ require 'singleton'
6
+ require 'opstat-client/common.rb'
7
+ require 'opstat-client/logging.rb'
8
+ require 'opstat-client/config.rb'
9
+ require 'yaml'
10
+ require 'opstat-plugins'
11
+ require "opstat-client/plugins.rb"
12
+ require 'eventmachine'
13
+ require 'amqp'
14
+ require 'json'
15
+
16
+ # see the bottom of the file for further inclusions
17
+ require 'opstat-client/client.rb'
18
+
19
+ #------------------------------------------------------------
20
+ # the top-level module
21
+ #
22
+ # all this really does is dictate how the whole system behaves, through
23
+ # preferences for things like debugging
24
+ #
25
+ # it's also a place to find top-level commands like 'debug'
26
+
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require '../version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "opstat-client"
8
+ spec.version = Opstat::VERSION
9
+ spec.authors = ["Krzysztof Tomczyk"]
10
+ spec.email = ["office@optilabs.eu"]
11
+ spec.description = %q{Systems monitoring tool}
12
+ spec.summary = %q{Systems monitoring tool that works}
13
+ spec.homepage = "http://www.optilabs.eu/opstat"
14
+ spec.license = "GPL-3.0"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "eventmachine", '~> 1'
22
+ spec.add_dependency "opstat-plugins", Opstat::VERSION
23
+ spec.add_dependency "json", '~> 2'
24
+ spec.add_dependency "log4r", '~> 1'
25
+ spec.add_dependency "amqp", '~> 1'
26
+ spec.add_dependency "xml-simple", '~> 1'
27
+ spec.add_dependency "daemons", '~> 1'
28
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opstat-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.8
5
+ platform: ruby
6
+ authors:
7
+ - Krzysztof Tomczyk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-09-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: eventmachine
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: opstat-plugins
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.8
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.3.8
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: log4r
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: amqp
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: xml-simple
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: daemons
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1'
111
+ description: Systems monitoring tool
112
+ email:
113
+ - office@optilabs.eu
114
+ executables:
115
+ - opstatd_client.rb
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".gitlab-ci.yml"
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - TODO
126
+ - TODO_NOW
127
+ - bin/opstatd_client.rb
128
+ - init.d/opstatd_client
129
+ - init.d/opstatd_client.redhat
130
+ - lib/opstat-client.rb
131
+ - lib/opstat-client/client.rb
132
+ - lib/opstat-client/common.rb
133
+ - lib/opstat-client/config.rb
134
+ - lib/opstat-client/config/opstat.yml
135
+ - lib/opstat-client/config_opstat.yml
136
+ - lib/opstat-client/logging.rb
137
+ - lib/opstat-client/plugins.rb
138
+ - opstat-client.gemspec
139
+ homepage: http://www.optilabs.eu/opstat
140
+ licenses:
141
+ - GPL-3.0
142
+ metadata: {}
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubygems_version: 3.2.33
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: Systems monitoring tool that works
162
+ test_files: []