naginata 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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +142 -0
- data/Rakefile +11 -0
- data/bin/naginata +6 -0
- data/integration-test/.gitignore +1 -0
- data/integration-test/Naginatafile +22 -0
- data/integration-test/Vagrantfile +100 -0
- data/lib/naginata.rb +17 -0
- data/lib/naginata/cli.rb +66 -0
- data/lib/naginata/cli/fetch.rb +29 -0
- data/lib/naginata/cli/notification.rb +64 -0
- data/lib/naginata/command/external_command.rb +198 -0
- data/lib/naginata/configuration.rb +100 -0
- data/lib/naginata/configuration/filter.rb +78 -0
- data/lib/naginata/configuration/nagios_server.rb +83 -0
- data/lib/naginata/configuration/service.rb +35 -0
- data/lib/naginata/defaults.rb +8 -0
- data/lib/naginata/dsl.rb +28 -0
- data/lib/naginata/loader.rb +39 -0
- data/lib/naginata/runner.rb +36 -0
- data/lib/naginata/status.rb +82 -0
- data/lib/naginata/ui.rb +6 -0
- data/lib/naginata/ui/shell.rb +39 -0
- data/lib/naginata/version.rb +3 -0
- data/naginata.gemspec +28 -0
- metadata +159 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
module Naginata
|
2
|
+
class Configuration
|
3
|
+
class Service
|
4
|
+
attr_reader :description, :hostname, :nagios
|
5
|
+
|
6
|
+
# @param [String] description
|
7
|
+
# @param [Hash] options
|
8
|
+
# @option options [String] :host hostname monitored by nagios
|
9
|
+
# @option options [String] :on nagios server name
|
10
|
+
def initialize(description, options = {})
|
11
|
+
ArgumentError if options[:host].nil?
|
12
|
+
ArgumentError if options[:on].nil?
|
13
|
+
@description = description
|
14
|
+
@hostname = options[:host]
|
15
|
+
@nagios = options[:on]
|
16
|
+
end
|
17
|
+
|
18
|
+
#def to_s
|
19
|
+
# @description
|
20
|
+
#end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class Host < Service
|
25
|
+
|
26
|
+
# @param [String] hostname
|
27
|
+
# @param [Hash] options
|
28
|
+
# @option options [String] :nagios nagios server name
|
29
|
+
def initialize(hostname, options = {})
|
30
|
+
super(:ping, options.merge(host: hostname))
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/naginata/dsl.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'naginata/configuration'
|
2
|
+
|
3
|
+
module Naginata
|
4
|
+
module DSL
|
5
|
+
|
6
|
+
def nagios_server(name)
|
7
|
+
Configuration.env.nagios_server(name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def fetch(key, default=nil, &block)
|
11
|
+
env.fetch(key, default, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def env
|
15
|
+
Configuration.env
|
16
|
+
end
|
17
|
+
|
18
|
+
def set(key, value)
|
19
|
+
env.set(key, value)
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_if_empty(key, value)
|
23
|
+
env.set_if_empty(key, value)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'naginata/dsl'
|
2
|
+
|
3
|
+
module Naginata
|
4
|
+
class Loader
|
5
|
+
#module_function
|
6
|
+
|
7
|
+
class << self
|
8
|
+
include Naginata::DSL
|
9
|
+
|
10
|
+
def load_configuration
|
11
|
+
instance_eval File.read(File.join(File.dirname(__FILE__), 'defaults.rb'))
|
12
|
+
instance_eval File.read 'Naginatafile'
|
13
|
+
end
|
14
|
+
|
15
|
+
def load_remote_objects
|
16
|
+
require 'naginata/cli/fetch'
|
17
|
+
# Refresh cached status.dat
|
18
|
+
CLI::Fetch.new.run
|
19
|
+
|
20
|
+
# Load status.dat
|
21
|
+
#
|
22
|
+
# @Note currently here reads all nagios servers' cache files. This
|
23
|
+
# means that users can not reduce nagios servers by --nagios= CLI
|
24
|
+
# option. Below loop may be moved into initialization phase of CLI
|
25
|
+
# class.
|
26
|
+
Configuration.env.nagios_servers.each do |nagios_server|
|
27
|
+
status = ::Naginata::Status.find(nagios_server.hostname)
|
28
|
+
status.service_items.group_by{ |section| section.host_name }.each do |host, sections|
|
29
|
+
services = sections.map { |s| s.service_description }
|
30
|
+
Configuration.env.host(host, services: services, on: nagios_server.hostname)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'naginata/configuration'
|
2
|
+
require 'naginata/configuration/filter'
|
3
|
+
require 'sshkit/coordinator'
|
4
|
+
|
5
|
+
module Naginata
|
6
|
+
class Runner
|
7
|
+
def self.run(&block)
|
8
|
+
nagios_servers = Configuration.env.filter(Configuration.env.nagios_servers)
|
9
|
+
services = Configuration.env.filter_service(Configuration.env.services)
|
10
|
+
user = Configuration.env.fetch(:nagios_server_options)[:run_command_as]
|
11
|
+
|
12
|
+
run_backend(nagios_servers) do |nagios_server|
|
13
|
+
svcs = Configuration::Filter.new(:nagios_server, nagios_server).filter_service(services)
|
14
|
+
as(user) do
|
15
|
+
yield self, nagios_server, svcs
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.run_locally(&block)
|
21
|
+
nagios_servers = Configuration.env.filter(Configuration.env.nagios_servers)
|
22
|
+
services = Configuration.env.filter_service(Configuration.env.services)
|
23
|
+
nagios_servers.each do |nagios_server|
|
24
|
+
svcs = Configuration::Filter.new(:nagios_server, nagios_server).filter_service(services)
|
25
|
+
yield nagios_server, svcs
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def self.run_backend(nagios_servers, options = {}, &block)
|
32
|
+
SSHKit::Coordinator.new(nagios_servers).each(options, &block)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'nagios_analyzer'
|
2
|
+
require 'forwardable'
|
3
|
+
require 'tempfile'
|
4
|
+
|
5
|
+
module Naginata
|
6
|
+
class Status
|
7
|
+
extend Forwardable
|
8
|
+
def_delegators :@status, :service_items, :host_items, :items, :service_problems, :host_problems, :scopes
|
9
|
+
attr_accessor :status, :hostname
|
10
|
+
|
11
|
+
# Write status.dat into local disk
|
12
|
+
#
|
13
|
+
# @return [Naginata::Status] return self
|
14
|
+
# @return [false] if @status is nil
|
15
|
+
def save
|
16
|
+
return false if status.nil?
|
17
|
+
File.open(path, "w") do |f|
|
18
|
+
f.sync = true
|
19
|
+
Marshal.dump(status, f)
|
20
|
+
end
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def purge_cache
|
25
|
+
if File.exist?(path)
|
26
|
+
FileUtils.rm path
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Path of marshal dumped status file
|
31
|
+
#
|
32
|
+
# @return [String] path of marshal dumped status file
|
33
|
+
def path
|
34
|
+
raise "@hostname must be set" if hostname.nil?
|
35
|
+
@path ||= File.join(self.class.cache_dir, "#{hostname}.status.dat")
|
36
|
+
end
|
37
|
+
|
38
|
+
# Create a new instance from raw status.dat string
|
39
|
+
#
|
40
|
+
# @param [String] string raw status.dat text
|
41
|
+
# @param [String] nagios_server_hostname hostname to identify status.data data
|
42
|
+
# @return [Naginata::Status]
|
43
|
+
def self.build(string, nagios_server_hostname)
|
44
|
+
instance = new
|
45
|
+
instance.hostname = nagios_server_hostname
|
46
|
+
|
47
|
+
# @Note NagiosAnalizer::Status.new requires filename, so here
|
48
|
+
# needs to write text data into tempfile.
|
49
|
+
Tempfile.open(["naginata-#{nagios_server_hostname}", ".status.dat"]) do |temp|
|
50
|
+
temp.sync = true
|
51
|
+
temp.write string
|
52
|
+
instance.status = ::NagiosAnalyzer::Status.new(temp.path, include_ok: true)
|
53
|
+
temp.close!
|
54
|
+
end
|
55
|
+
instance
|
56
|
+
end
|
57
|
+
|
58
|
+
# Return a directory path for status.dat caching
|
59
|
+
#
|
60
|
+
# @return [String] directory path for status.dat caching
|
61
|
+
def self.cache_dir
|
62
|
+
dir = (ENV['HOME'] && Dir.exist?(ENV['HOME'])) ? ENV['HOME'] : Dir.pwd
|
63
|
+
dir = File.join(dir, '.naginata/cache/status')
|
64
|
+
FileUtils.mkdir_p dir
|
65
|
+
return dir
|
66
|
+
end
|
67
|
+
|
68
|
+
# Find a instance from cache by nagios server hostname
|
69
|
+
#
|
70
|
+
# @return [Naginata::Status]
|
71
|
+
def self.find(nagios_server_hostname)
|
72
|
+
instance = new
|
73
|
+
instance.hostname = nagios_server_hostname
|
74
|
+
if File.exist?(instance.path)
|
75
|
+
File.open(instance.path) { |f| instance.status = Marshal.load(f) }
|
76
|
+
return instance
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
data/lib/naginata/ui.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'thor/base'
|
2
|
+
|
3
|
+
module Naginata
|
4
|
+
module UI
|
5
|
+
class Shell
|
6
|
+
LEVELS = %w(error warn info debug)
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@shell = Thor::Base.shell.new
|
10
|
+
@level = ENV['DEBUG'] ? "debug" : "info"
|
11
|
+
end
|
12
|
+
|
13
|
+
def info(msg, newline = nil)
|
14
|
+
@shell.say(msg, nil, newline) if level("info")
|
15
|
+
end
|
16
|
+
|
17
|
+
def warn(msg, newline = nil)
|
18
|
+
@shell.say(msg, :yellow, newline) if level("warn")
|
19
|
+
end
|
20
|
+
|
21
|
+
def error(msg, newline = nil)
|
22
|
+
@shell.say(msg, :red, newline) if level("error")
|
23
|
+
end
|
24
|
+
|
25
|
+
def debug(msg, newline = nil)
|
26
|
+
@shell.say(msg, nil, newline) if level("debug")
|
27
|
+
end
|
28
|
+
|
29
|
+
def level(name = nil)
|
30
|
+
name ? LEVELS.index(name) <= LEVELS.index(@level) : @level
|
31
|
+
end
|
32
|
+
|
33
|
+
def yes?(msg)
|
34
|
+
@shell.yes?(msg)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/naginata.gemspec
ADDED
@@ -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 'naginata/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "naginata"
|
8
|
+
spec.version = Naginata::VERSION
|
9
|
+
spec.authors = ["Nobuhiro Nikushi"]
|
10
|
+
spec.email = ["deneb.ge@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = "Remote multi nagios server control tool"
|
13
|
+
spec.description = "Remote multi nagios server control tool over ssh connection"
|
14
|
+
spec.homepage = "https://github.com/niku4i/naginata"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "bin"
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_dependency 'sshkit', '~> 1.7'
|
23
|
+
spec.add_dependency 'thor'
|
24
|
+
spec.add_dependency 'nagios_analyzer', '~> 0.0.5'
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
26
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
27
|
+
spec.add_development_dependency "rspec", "~> 3"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: naginata
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nobuhiro Nikushi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sshkit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
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: nagios_analyzer
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.0.5
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.0.5
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.9'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.9'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3'
|
97
|
+
description: Remote multi nagios server control tool over ssh connection
|
98
|
+
email:
|
99
|
+
- deneb.ge@gmail.com
|
100
|
+
executables:
|
101
|
+
- naginata
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".gitignore"
|
106
|
+
- ".rspec"
|
107
|
+
- ".travis.yml"
|
108
|
+
- CHANGELOG.md
|
109
|
+
- Gemfile
|
110
|
+
- LICENSE.txt
|
111
|
+
- README.md
|
112
|
+
- Rakefile
|
113
|
+
- bin/naginata
|
114
|
+
- integration-test/.gitignore
|
115
|
+
- integration-test/Naginatafile
|
116
|
+
- integration-test/Vagrantfile
|
117
|
+
- lib/naginata.rb
|
118
|
+
- lib/naginata/cli.rb
|
119
|
+
- lib/naginata/cli/fetch.rb
|
120
|
+
- lib/naginata/cli/notification.rb
|
121
|
+
- lib/naginata/command/external_command.rb
|
122
|
+
- lib/naginata/configuration.rb
|
123
|
+
- lib/naginata/configuration/filter.rb
|
124
|
+
- lib/naginata/configuration/nagios_server.rb
|
125
|
+
- lib/naginata/configuration/service.rb
|
126
|
+
- lib/naginata/defaults.rb
|
127
|
+
- lib/naginata/dsl.rb
|
128
|
+
- lib/naginata/loader.rb
|
129
|
+
- lib/naginata/runner.rb
|
130
|
+
- lib/naginata/status.rb
|
131
|
+
- lib/naginata/ui.rb
|
132
|
+
- lib/naginata/ui/shell.rb
|
133
|
+
- lib/naginata/version.rb
|
134
|
+
- naginata.gemspec
|
135
|
+
homepage: https://github.com/niku4i/naginata
|
136
|
+
licenses:
|
137
|
+
- MIT
|
138
|
+
metadata: {}
|
139
|
+
post_install_message:
|
140
|
+
rdoc_options: []
|
141
|
+
require_paths:
|
142
|
+
- lib
|
143
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
requirements: []
|
154
|
+
rubyforge_project:
|
155
|
+
rubygems_version: 2.4.5
|
156
|
+
signing_key:
|
157
|
+
specification_version: 4
|
158
|
+
summary: Remote multi nagios server control tool
|
159
|
+
test_files: []
|