pandur 0.0.0

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
+ 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