pandur 0.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0a65c44db60d3634ce6a602513da833ef62b4d85
4
+ data.tar.gz: 3b5380493d3c5fd6c2b119fe7854c4928e299e62
5
+ SHA512:
6
+ metadata.gz: 668c7e031650ef7cee1b87915c991e57075ce7aa623796f49e7434b407b1eb14c6ad418ef8f47d2448df054833617a7d9c256aa61d074873da0fe7d4418ab4d4
7
+ data.tar.gz: bcd8baf4122461d2fcae872230fcd7827413705a9bed434f1b2d027669cd768798958067c341c69e324175e868aba87b316507bf4a2dc72b6e30d2555155615d
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2013 Rainer Jung <Rainer.Jung@gmail.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,33 @@
1
+ pandur - AdHoc Monitoring
2
+ =========================
3
+
4
+ This gem is yet alpha, so please don't expect to much.
5
+
6
+ Usage
7
+ -----
8
+
9
+ To use run
10
+
11
+ pandur [status] # query status
12
+ pandur init # create configuration (not working yet)
13
+
14
+ To install run
15
+
16
+ gem install pandur
17
+
18
+ Configuration
19
+ -------------
20
+
21
+ You need to create a configuration (a yaml-file) of all hosts to connect to, and
22
+ wich processes are meant to monitor. Here's a simple example:
23
+
24
+ ---
25
+ hosts:
26
+ - name: web
27
+ username: "www-data"
28
+ check:
29
+ - name: "Elastic Search"
30
+ pid_file: /var/run/elasticsearch.pid
31
+ - name: Memcached
32
+ pid_file: /var/run/memcached.pid
33
+
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "rspec/core/rake_task"
2
+
3
+ RSpec::Core::RakeTask.new(:spec) do |spec|
4
+ spec.rspec_opts = ['-fd', '--color']
5
+ end
6
+ Bundler::GemHelper.install_tasks
7
+
8
+ # Default task runs specs
9
+ task :default => :spec
data/bin/pandur ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pandur'
4
+ Pandur.run
@@ -0,0 +1,57 @@
1
+ module Pandur
2
+ class Check
3
+ include Pandur::Config
4
+
5
+ def initialize(target)
6
+ @config = target
7
+ end
8
+
9
+ def check(ssh)
10
+ logger.debug("Checking #{@config['name']}")
11
+ if @config['pid_file']
12
+ print "Checking #{@config['name']}: "
13
+ escaped_pid_file = @config['pid_file'].gsub('\'', '\\\'')
14
+ if(ssh_exec!(ssh, "test -r '#{escaped_pid_file}' && test -n '`ps -ef | grep -v grep | grep \`cat '#{escaped_pid_file}'\``'")[2] > 0)
15
+ puts "FAIL"
16
+ else
17
+ puts "OK"
18
+ end
19
+ else
20
+ logger.debug("cannot check #{@config.inspect}")
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def ssh_exec!(ssh, command)
27
+ stdout_data = ""
28
+ stderr_data = ""
29
+ exit_code = nil
30
+ exit_signal = nil
31
+ ssh.open_channel do |channel|
32
+ channel.exec(command) do |ch, success|
33
+ unless success
34
+ abort "FAILED: couldn't execute command (ssh.channel.exec)"
35
+ end
36
+ channel.on_data do |ch,data|
37
+ stdout_data+=data
38
+ end
39
+
40
+ channel.on_extended_data do |ch,type,data|
41
+ stderr_data+=data
42
+ end
43
+
44
+ channel.on_request("exit-status") do |ch,data|
45
+ exit_code = data.read_long
46
+ end
47
+
48
+ channel.on_request("exit-signal") do |ch, data|
49
+ exit_signal = data.read_long
50
+ end
51
+ end
52
+ end
53
+ ssh.loop
54
+ [stdout_data, stderr_data, exit_code, exit_signal]
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,24 @@
1
+ # To access configuration (and logging), just include this module to your class,
2
+ # and you can directly access all configuration and the logging.
3
+ #
4
+ # class ExampleClass
5
+ # include Pandur::Config
6
+ #
7
+ # def some_method
8
+ # logger.debug(config('some_config'))
9
+ # end
10
+ # end
11
+
12
+ module Pandur
13
+ module Config
14
+ @config = {}
15
+
16
+ def logger
17
+ Pandur.logger
18
+ end
19
+
20
+ def config(conf)
21
+ Pandur.config(conf)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ require 'net/ssh'
2
+ require 'pandur/check'
3
+
4
+ module Pandur
5
+ class Host
6
+ include Pandur::Config
7
+
8
+ def initialize(target)
9
+ @config = target
10
+ end
11
+
12
+ def check
13
+ logger.debug("Connecting to #{@config['username']}@#{@config['hostname']}")
14
+ Net::SSH.start(@config['hostname'], @config['username'],
15
+ :password => @config['password']) do |ssh|
16
+ @config['check'].each do |check|
17
+ Pandur::Check.new(check).check(ssh)
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Pandur
2
+ VERSION = '0.0.0'
3
+ end
data/lib/pandur.rb ADDED
@@ -0,0 +1,50 @@
1
+ require 'pandur/version'
2
+ require 'pandur/config'
3
+ require 'pandur/host'
4
+ require 'net/ssh/errors'
5
+ require 'logger'
6
+ require 'yaml'
7
+
8
+ module Pandur
9
+
10
+ class << self
11
+
12
+ def run(conf = 'pandur.yaml')
13
+ logger.debug("#{name} running ..")
14
+ load_config(conf)
15
+ config('hosts').each do |host|
16
+ check(host)
17
+ end
18
+ logger.debug("#{name} .. finished")
19
+ end
20
+
21
+ def check(target)
22
+ Pandur::Host.new(target).check
23
+ rescue Net::SSH::AuthenticationFailed
24
+ puts "Failed to connect: #{$!.message}"
25
+ end
26
+
27
+ def load_config(file)
28
+ logger.debug("Loading configuration from #{file.to_s}")
29
+ @@config = YAML::load_file(file)
30
+ end
31
+
32
+ def config(*params)
33
+ @@config ||= {}
34
+ case params.length()
35
+ when 0
36
+ @@config
37
+ when 1
38
+ @@config[params.first]
39
+ else
40
+ @@config[params[0]] = params[1]
41
+ end
42
+ end
43
+
44
+ def logger
45
+ @@logger ||= Logger.new(STDERR)
46
+ end
47
+
48
+ end
49
+
50
+ end
data/pandur.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'pandur/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'pandur'
7
+ s.version = Pandur::VERSION
8
+ s.date = '2013-04-03'
9
+ s.license = 'MIT'
10
+ s.summary = 'AdHoc monitoring'
11
+ s.description = 'Check your services when you need to'
12
+ s.authors = ['Rainer Jung <Rainer.Jung@gmail.com>']
13
+ s.email = 'rj@pandur.org'
14
+ s.executables << 'pandur'
15
+ s.bindir = 'bin'
16
+ s.homepage = 'http://github.com/rynr/pandur'
17
+ s.post_install_message =
18
+ 'Pandur yet comes without a config-generation'
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- spec/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
23
+ s.extra_rdoc_files = 'README.md'
24
+
25
+ s.add_runtime_dependency('net-ssh')
26
+ s.add_development_dependency('rspec')
27
+ end
data/spec/config.yaml ADDED
@@ -0,0 +1,9 @@
1
+ ---
2
+ config_to_be_tested_by_pandur_spec.rb: success
3
+
4
+ hosts:
5
+ - hostname: localhost
6
+ username: rjung
7
+ check:
8
+ - name: Memcached
9
+ pid_file: /var/run/memcached.pid
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'pandur')
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Pandur::Config do
4
+
5
+ class PandurLoggerRspecTest; include Pandur::Config; end
6
+
7
+ before(:each) do
8
+ @sut = PandurLoggerRspecTest.new
9
+ end
10
+
11
+ it 'uses Pandur.logger' do
12
+ Pandur.should_receive(:logger)
13
+ @sut.logger
14
+ end
15
+
16
+ it 'uses Pandur.config' do
17
+ Pandur.should_receive(:config).with('conf-name')
18
+ @sut.config('conf-name')
19
+ end
20
+
21
+ it 'gets config' do
22
+ Pandur.load_config(File.join(File.dirname(__FILE__), '..', 'config.yaml'))
23
+ @sut.config('config_to_be_tested_by_pandur_spec.rb').should eql('success')
24
+ end
25
+
26
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe Pandur do
4
+
5
+ it 'can get logger' do
6
+ Pandur.logger.should_not be(:nil)
7
+ end
8
+
9
+ it 'can load config from file' do
10
+ Pandur.load_config(File.join(File.dirname(__FILE__), '..', 'config.yaml'))
11
+ Pandur.config('config_to_be_tested_by_pandur_spec.rb').should eql('success')
12
+ end
13
+
14
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pandur
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Rainer Jung <Rainer.Jung@gmail.com>
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-04-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: net-ssh
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
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
+ description: Check your services when you need to
42
+ email: rj@pandur.org
43
+ executables:
44
+ - pandur
45
+ extensions: []
46
+ extra_rdoc_files:
47
+ - README.md
48
+ files:
49
+ - Gemfile
50
+ - LICENSE
51
+ - README.md
52
+ - Rakefile
53
+ - bin/pandur
54
+ - lib/pandur.rb
55
+ - lib/pandur/check.rb
56
+ - lib/pandur/config.rb
57
+ - lib/pandur/host.rb
58
+ - lib/pandur/version.rb
59
+ - pandur.gemspec
60
+ - spec/config.yaml
61
+ - spec/spec_helper.rb
62
+ - spec/units/pandur_config_spec.rb
63
+ - spec/units/pandur_spec.rb
64
+ homepage: http://github.com/rynr/pandur
65
+ licenses:
66
+ - MIT
67
+ metadata: {}
68
+ post_install_message: Pandur yet comes without a config-generation
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 2.0.3
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: AdHoc monitoring
88
+ test_files:
89
+ - spec/config.yaml
90
+ - spec/spec_helper.rb
91
+ - spec/units/pandur_config_spec.rb
92
+ - spec/units/pandur_spec.rb