aws-cleaner 2.1.1 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|