aws-cleaner 2.1.1 → 2.2.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 +4 -4
- data/bin/aws_cleaner.rb +106 -56
- data/lib/aws-cleaner.rb +2 -2
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80481ad1bbad492ed7a78e64b32ed31e8f8d76e3
|
4
|
+
data.tar.gz: d4925c9b50c0d2cb1380fae10d7be3d5f1bfd552
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97bacc126598670d7884803c370d58cc2629c534d51090e9a7b580bb7196f05de14daf767c10e077015bb97e07ab5d52c949b8b8559f82762b0501e0edf6841d
|
7
|
+
data.tar.gz: ee53322b71a5d4a0c28f3323479f3fa0ab452ee59175ecbfd24c56b332a75c1026cc4e2667147118440467ba239aa37b2ba6a11aafd828db62949a94bcb14068
|
data/bin/aws_cleaner.rb
CHANGED
@@ -18,6 +18,7 @@ begin
|
|
18
18
|
require 'rest-client'
|
19
19
|
require 'trollop'
|
20
20
|
require 'slack/poster'
|
21
|
+
require 'logger'
|
21
22
|
rescue LoadError => e
|
22
23
|
raise "Missing gems: #{e}"
|
23
24
|
end
|
@@ -26,84 +27,133 @@ end
|
|
26
27
|
require_relative '../lib/aws-cleaner.rb'
|
27
28
|
|
28
29
|
def config(file)
|
29
|
-
YAML.
|
30
|
+
YAML.safe_load(File.read(File.expand_path(file)), [Symbol])
|
30
31
|
rescue StandardError => e
|
31
32
|
raise "Failed to open config file: #{e}"
|
32
33
|
end
|
33
34
|
|
35
|
+
def logger(config)
|
36
|
+
file = config[:log][:file] unless config[:log].nil?
|
37
|
+
|
38
|
+
if file
|
39
|
+
begin
|
40
|
+
# Check if specified file can be written
|
41
|
+
awslog = File.open(File.expand_path(file), File::CREAT | File::WRONLY | File::APPEND)
|
42
|
+
rescue StandardError => e
|
43
|
+
$stderr.puts "aws-cleaner: ERROR - Failed to open log file #{file} beause of #{e}. STDOUT will be used instead."
|
44
|
+
end
|
45
|
+
else
|
46
|
+
$stdout.puts 'aws-cleaner: WARN - Log file is not specified. STDOUT will be used instead.'
|
47
|
+
end
|
48
|
+
|
49
|
+
# Use STDOUT if it is not possible to write to log file
|
50
|
+
awslog = STDOUT if awslog.nil?
|
51
|
+
|
52
|
+
# Make sure log is flushed out immediately instead of being buffered
|
53
|
+
awslog.sync = true
|
54
|
+
|
55
|
+
logger = Logger.new(awslog)
|
56
|
+
|
57
|
+
# Configure logger to escape all data
|
58
|
+
formatter = Logger::Formatter.new
|
59
|
+
logger.formatter = proc { |severity, datetime, progname, msg|
|
60
|
+
formatter.call(severity, datetime, progname, msg.dump)
|
61
|
+
}
|
62
|
+
|
63
|
+
logger
|
64
|
+
end
|
65
|
+
|
66
|
+
def webhook(id, instance_id)
|
67
|
+
if @config[:webhooks]
|
68
|
+
@config[:webhooks].each do |hook, hook_config|
|
69
|
+
if AwsCleaner::Webhooks.fire_webhook(hook_config, @config, instance_id)
|
70
|
+
@logger.info("Successfully ran webhook #{hook}")
|
71
|
+
else
|
72
|
+
@logger.info("Failed to run webhook #{hook}")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
AwsCleaner.new.delete_message(id, @config)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def chef(id, instance_id, chef_node)
|
80
|
+
if chef_node
|
81
|
+
if AwsCleaner::Chef.remove_from_chef(chef_node, @chef_client, @config)
|
82
|
+
@logger.info("Removed #{chef_node} from Chef")
|
83
|
+
AwsCleaner.new.delete_message(id, @config)
|
84
|
+
end
|
85
|
+
else
|
86
|
+
@logger.info("Instance #{instance_id} does not exist in Chef, deleting message")
|
87
|
+
AwsCleaner.new.delete_message(id, @config)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def sensu(id, instance_id, chef_node)
|
92
|
+
if AwsCleaner::Sensu.in_sensu?(chef_node, @config)
|
93
|
+
if AwsCleaner::Sensu.remove_from_sensu(chef_node, @config)
|
94
|
+
@logger.info("Removed #{chef_node} from Sensu")
|
95
|
+
else
|
96
|
+
@logger.info("Instance #{instance_id} does not exist in Sensu, deleting message")
|
97
|
+
end
|
98
|
+
AwsCleaner.new.delete_message(id, @config)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def closelog(message)
|
103
|
+
@logger.debug(message) unless message.nil?
|
104
|
+
@logger.close
|
105
|
+
end
|
106
|
+
|
34
107
|
# get options
|
35
108
|
opts = Trollop.options do
|
36
109
|
opt :config, 'Path to config file', type: :string, default: 'config.yml'
|
37
110
|
end
|
38
111
|
|
39
112
|
@config = config(opts[:config])
|
40
|
-
|
41
|
-
# @sqs = Aws::SQS::Client.new(@config[:aws])
|
113
|
+
@logger = logger(@config)
|
42
114
|
@sqs_client = AwsCleaner::SQS.client(@config)
|
43
|
-
|
44
115
|
@chef_client = AwsCleaner::Chef.client(@config)
|
45
116
|
|
46
117
|
# main loop
|
47
118
|
loop do
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
next
|
65
|
-
end
|
66
|
-
|
67
|
-
@instance_id = AwsCleaner.new.process_message(body)
|
68
|
-
|
69
|
-
if @instance_id
|
70
|
-
if @config[:webhooks]
|
71
|
-
@config[:webhooks].each do |hook, hook_config|
|
72
|
-
if AwsCleaner::Webhooks.fire_webhook(hook_config, @config, @instance_id)
|
73
|
-
puts "Successfully ran webhook #{hook}"
|
74
|
-
else
|
75
|
-
puts "Failed to run webhook #{hook}"
|
76
|
-
end
|
77
|
-
end
|
119
|
+
begin
|
120
|
+
# get messages from SQS
|
121
|
+
messages = @sqs_client.receive_message(
|
122
|
+
queue_url: @config[:sqs][:queue],
|
123
|
+
max_number_of_messages: 10,
|
124
|
+
visibility_timeout: 3
|
125
|
+
).messages
|
126
|
+
|
127
|
+
@logger.info("Got #{messages.size} messages") unless messages.empty?
|
128
|
+
|
129
|
+
messages.each_with_index do |message, index|
|
130
|
+
@logger.info("Looking at message number #{index}")
|
131
|
+
body = AwsCleaner.new.parse(message.body)
|
132
|
+
id = message.receipt_handle
|
133
|
+
|
134
|
+
unless body
|
78
135
|
AwsCleaner.new.delete_message(id, @config)
|
136
|
+
next
|
79
137
|
end
|
80
138
|
|
81
|
-
|
139
|
+
instance_id = AwsCleaner.new.process_message(body)
|
82
140
|
|
83
|
-
if
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
141
|
+
if instance_id
|
142
|
+
chef_node = AwsCleaner::Chef.get_chef_node_name(instance_id, @config)
|
143
|
+
webhook(id, instance_id)
|
144
|
+
chef(id, instance_id, chef_node)
|
145
|
+
sensu(id, instance_id, chef_node)
|
88
146
|
else
|
89
|
-
|
90
|
-
AwsCleaner.new.delete_message(id, @config)
|
91
|
-
end
|
92
|
-
|
93
|
-
if AwsCleaner::Sensu.in_sensu?(chef_node, @config)
|
94
|
-
if AwsCleaner::Sensu.remove_from_sensu(chef_node, @config)
|
95
|
-
puts "Removed #{chef_node} from Sensu"
|
96
|
-
else
|
97
|
-
puts "Instance #{@instance_id} does not exist in Sensu, deleting message"
|
98
|
-
end
|
147
|
+
@logger.info('Message not relevant, deleting')
|
99
148
|
AwsCleaner.new.delete_message(id, @config)
|
100
149
|
end
|
101
|
-
|
102
|
-
else
|
103
|
-
puts 'Message not relevant, deleting'
|
104
|
-
AwsCleaner.new.delete_message(id, @config)
|
105
150
|
end
|
106
|
-
end
|
107
151
|
|
108
|
-
|
152
|
+
sleep(5)
|
153
|
+
rescue Interrupt
|
154
|
+
closelog('Received Interrupt signal. Quit aws-cleaner')
|
155
|
+
exit
|
156
|
+
rescue StandardError => e
|
157
|
+
@logger.error("Encountered #{e}: #{e.message}")
|
158
|
+
end
|
109
159
|
end
|
data/lib/aws-cleaner.rb
CHANGED
@@ -49,7 +49,7 @@ class AwsCleaner
|
|
49
49
|
client.destroy
|
50
50
|
node = chef.nodes.fetch(node_name)
|
51
51
|
node.destroy
|
52
|
-
rescue => e
|
52
|
+
rescue StandardError => e
|
53
53
|
puts "Failed to remove chef node: #{e}"
|
54
54
|
else
|
55
55
|
# puts "Removed #{node_name} from chef"
|
@@ -68,7 +68,7 @@ class AwsCleaner
|
|
68
68
|
)
|
69
69
|
rescue RestClient::ResourceNotFound
|
70
70
|
return false
|
71
|
-
rescue => e
|
71
|
+
rescue StandardError => e
|
72
72
|
puts "Sensu request failed: #{e}"
|
73
73
|
return false
|
74
74
|
else
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-cleaner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Heydrick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.52.1
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: 0.52.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: aws-sdk-core
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|