health_inspector 0.2.1 → 0.3.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.
- data/HISTORY.md +4 -0
- data/lib/health_inspector.rb +2 -0
- data/lib/health_inspector/checklists/base.rb +6 -1
- data/lib/health_inspector/checklists/cookbooks.rb +46 -10
- data/lib/health_inspector/checklists/data_bag_items.rb +5 -3
- data/lib/health_inspector/checklists/data_bags.rb +5 -3
- data/lib/health_inspector/checklists/environments.rb +5 -3
- data/lib/health_inspector/checklists/roles.rb +5 -3
- data/lib/health_inspector/version.rb +1 -1
- metadata +11 -11
data/HISTORY.md
CHANGED
data/lib/health_inspector.rb
CHANGED
@@ -11,6 +11,8 @@ require "health_inspector/checklists/data_bag_items"
|
|
11
11
|
require "health_inspector/checklists/environments"
|
12
12
|
require "health_inspector/checklists/roles"
|
13
13
|
require "health_inspector/cli"
|
14
|
+
require 'chef/rest'
|
15
|
+
require 'chef/checksum_cache'
|
14
16
|
require "json"
|
15
17
|
|
16
18
|
module HealthInspector
|
@@ -30,7 +30,7 @@ module HealthInspector
|
|
30
30
|
def run
|
31
31
|
banner "Inspecting #{self.class.title}"
|
32
32
|
|
33
|
-
|
33
|
+
each_item do |item|
|
34
34
|
failures = run_checks(item)
|
35
35
|
|
36
36
|
if failures.empty?
|
@@ -77,6 +77,11 @@ module HealthInspector
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
+
def chef_rest
|
81
|
+
@rest ||= Chef::REST.new(@context.configure[:chef_server_url], @context.configure[:node_name],
|
82
|
+
@context.configure[:client_key])
|
83
|
+
end
|
84
|
+
|
80
85
|
def run_check(check, item)
|
81
86
|
check_context = CheckContext.new(check, item, @context)
|
82
87
|
check_context.call
|
@@ -13,7 +13,7 @@ module HealthInspector
|
|
13
13
|
|
14
14
|
add_check "versions" do
|
15
15
|
if item.local_version && item.server_version &&
|
16
|
-
|
16
|
+
item.local_version != item.server_version
|
17
17
|
failure "chef server has #{item.server_version} but local version is #{item.local_version}"
|
18
18
|
end
|
19
19
|
end
|
@@ -38,7 +38,15 @@ module HealthInspector
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
|
41
|
+
add_check "changes on the server not in the repo" do
|
42
|
+
if item.server_version == item.local_version && !item.bad_files.empty?
|
43
|
+
fail_message = "has a checksum mismatch between server and repo in\n"
|
44
|
+
fail_message << item.bad_files.map { |f| " #{f}" }.join("\n")
|
45
|
+
failure fail_message
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class Cookbook < Struct.new(:name, :path, :server_version, :local_version, :bad_files)
|
42
50
|
def git_repo?
|
43
51
|
self.path && File.exist?("#{self.path}/.git")
|
44
52
|
end
|
@@ -46,18 +54,21 @@ module HealthInspector
|
|
46
54
|
|
47
55
|
title "cookbooks"
|
48
56
|
|
49
|
-
def
|
57
|
+
def each_item
|
50
58
|
server_cookbooks = cookbooks_on_server
|
51
59
|
local_cookbooks = cookbooks_in_repo
|
52
60
|
all_cookbook_names = ( server_cookbooks.keys + local_cookbooks.keys ).uniq.sort
|
53
61
|
|
54
|
-
all_cookbook_names.
|
55
|
-
Cookbook.new.tap do |cookbook|
|
62
|
+
all_cookbook_names.each do |name|
|
63
|
+
item = Cookbook.new.tap do |cookbook|
|
56
64
|
cookbook.name = name
|
57
65
|
cookbook.path = cookbook_path(name)
|
58
66
|
cookbook.server_version = server_cookbooks[name]
|
59
67
|
cookbook.local_version = local_cookbooks[name]
|
68
|
+
cookbook.bad_files = checksum_compare(name, cookbook.server_version)
|
60
69
|
end
|
70
|
+
|
71
|
+
yield item
|
61
72
|
end
|
62
73
|
end
|
63
74
|
|
@@ -76,18 +87,43 @@ module HealthInspector
|
|
76
87
|
select { |path| File.exists?("#{path}/metadata.rb") }.
|
77
88
|
inject({}) do |hsh, path|
|
78
89
|
|
79
|
-
|
80
|
-
|
90
|
+
name = File.basename(path)
|
91
|
+
version = (`grep '^version' #{path}/metadata.rb`).split.last[1...-1]
|
81
92
|
|
82
|
-
|
83
|
-
|
84
|
-
|
93
|
+
hsh[name] = version
|
94
|
+
hsh
|
95
|
+
end
|
85
96
|
end
|
86
97
|
|
87
98
|
def cookbook_path(name)
|
88
99
|
path = @context.cookbook_path.find { |f| File.exist?("#{f}/#{name}") }
|
89
100
|
path ? File.join(path, name) : nil
|
90
101
|
end
|
102
|
+
|
103
|
+
def checksum_compare(name,version)
|
104
|
+
begin
|
105
|
+
cookbook = chef_rest.get_rest("/cookbooks/#{name}/#{version}")
|
106
|
+
rescue Net::HTTPServerException => e
|
107
|
+
return ["Could not find cookbook #{name} on the server"]
|
108
|
+
end
|
109
|
+
|
110
|
+
cookbook.manifest.inject([]) do |memo, (key,value)|
|
111
|
+
if value.kind_of? Array
|
112
|
+
value.each do |file|
|
113
|
+
path = cookbook_path("#{name}/#{file["path"]}")
|
114
|
+
|
115
|
+
if path
|
116
|
+
checksum = Chef::ChecksumCache.generate_md5_checksum_for_file(path)
|
117
|
+
memo << "#{file['path']}" if checksum != file['checksum']
|
118
|
+
else
|
119
|
+
memo << "#{file['path']} does not exist in the repo"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
memo
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
91
127
|
end
|
92
128
|
end
|
93
129
|
end
|
@@ -22,17 +22,19 @@ module HealthInspector
|
|
22
22
|
|
23
23
|
DataBagItem = Struct.new(:name, :server, :local)
|
24
24
|
|
25
|
-
def
|
25
|
+
def each_item
|
26
26
|
server_data_bag_items = data_bag_items_on_server
|
27
27
|
local_data_bag_items = data_bag_items_in_repo
|
28
28
|
all_data_bag_item_names = ( server_data_bag_items + local_data_bag_items ).uniq.sort
|
29
29
|
|
30
|
-
all_data_bag_item_names.
|
31
|
-
DataBagItem.new.tap do |data_bag_item|
|
30
|
+
all_data_bag_item_names.each do |name|
|
31
|
+
item = DataBagItem.new.tap do |data_bag_item|
|
32
32
|
data_bag_item.name = name
|
33
33
|
data_bag_item.server = load_item_from_server(name)
|
34
34
|
data_bag_item.local = load_item_from_local(name)
|
35
35
|
end
|
36
|
+
|
37
|
+
yield item
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
@@ -15,17 +15,19 @@ module HealthInspector
|
|
15
15
|
|
16
16
|
DataBag = Struct.new(:name, :exists_on_server, :exists_locally)
|
17
17
|
|
18
|
-
def
|
18
|
+
def each_item
|
19
19
|
server_data_bags = data_bags_on_server
|
20
20
|
local_data_bags = data_bags_in_repo
|
21
21
|
all_data_bag_names = ( server_data_bags + local_data_bags ).uniq.sort
|
22
22
|
|
23
|
-
all_data_bag_names.
|
24
|
-
DataBag.new.tap do |data_bag|
|
23
|
+
all_data_bag_names.each do |name|
|
24
|
+
item = DataBag.new.tap do |data_bag|
|
25
25
|
data_bag.name = name
|
26
26
|
data_bag.exists_on_server = data_bags_on_server.include?(name)
|
27
27
|
data_bag.exists_locally = data_bags_in_repo.include?(name)
|
28
28
|
end
|
29
|
+
|
30
|
+
yield item
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
@@ -22,17 +22,19 @@ module HealthInspector
|
|
22
22
|
|
23
23
|
Environment = Struct.new(:name, :server, :local)
|
24
24
|
|
25
|
-
def
|
25
|
+
def each_item
|
26
26
|
server_items = items_on_server
|
27
27
|
local_items = items_in_repo
|
28
28
|
all_item_names = ( server_items + local_items ).uniq.sort
|
29
29
|
|
30
|
-
all_item_names.
|
31
|
-
Environment.new.tap do |item|
|
30
|
+
all_item_names.each do |name|
|
31
|
+
item = Environment.new.tap do |item|
|
32
32
|
item.name = name
|
33
33
|
item.server = load_item_from_server(name)
|
34
34
|
item.local = load_item_from_local(name)
|
35
35
|
end
|
36
|
+
|
37
|
+
yield item
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
@@ -24,17 +24,19 @@ module HealthInspector
|
|
24
24
|
|
25
25
|
Role = Struct.new(:name, :server, :local)
|
26
26
|
|
27
|
-
def
|
27
|
+
def each_item
|
28
28
|
server_items = items_on_server
|
29
29
|
local_items = items_in_repo
|
30
30
|
all_item_names = ( server_items + local_items ).uniq.sort
|
31
31
|
|
32
|
-
all_item_names.
|
33
|
-
Role.new.tap do |item|
|
32
|
+
all_item_names.each do |name|
|
33
|
+
item = Role.new.tap do |item|
|
34
34
|
item.name = name
|
35
35
|
item.server = load_item_from_server(name)
|
36
36
|
item.local = load_item_from_local(name)
|
37
37
|
end
|
38
|
+
|
39
|
+
yield item
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: health_inspector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-09-27 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
16
|
-
requirement: &
|
16
|
+
requirement: &70140548345560 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70140548345560
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: mocha
|
27
|
-
requirement: &
|
27
|
+
requirement: &70140548344640 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70140548344640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: thor
|
38
|
-
requirement: &
|
38
|
+
requirement: &70140548344100 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70140548344100
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: chef
|
49
|
-
requirement: &
|
49
|
+
requirement: &70140548343560 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '10.14'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70140548343560
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: yajl-ruby
|
60
|
-
requirement: &
|
60
|
+
requirement: &70140548343140 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70140548343140
|
69
69
|
description: A tool to inspect your chef repo as is compares to what is on your chef
|
70
70
|
server
|
71
71
|
email:
|