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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/aws_cleaner.rb +106 -56
  3. data/lib/aws-cleaner.rb +2 -2
  4. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0d2981c7484b1236640cf90115c5b7b4acd917c
4
- data.tar.gz: eff2dcf59111a78a61adee8f839e877b2a8e263d
3
+ metadata.gz: 80481ad1bbad492ed7a78e64b32ed31e8f8d76e3
4
+ data.tar.gz: d4925c9b50c0d2cb1380fae10d7be3d5f1bfd552
5
5
  SHA512:
6
- metadata.gz: 5ecd30d709ab8e93ff5d4402dca538b9cabe3ab1f2f43aea41d81e00a85160a930fa6d480e33cce49a6ace62d85a697e7dd0c041384855eac017fa188ee6501d
7
- data.tar.gz: 1a3eae35a5f2b2956dfdda21e5c68666c40229a74d2ff2c13423485679593f7c71cf94eedb8267d8302e4c260da56cda80b8d189a312b255b33d04d60f20ff1b
6
+ metadata.gz: 97bacc126598670d7884803c370d58cc2629c534d51090e9a7b580bb7196f05de14daf767c10e077015bb97e07ab5d52c949b8b8559f82762b0501e0edf6841d
7
+ data.tar.gz: ee53322b71a5d4a0c28f3323479f3fa0ab452ee59175ecbfd24c56b332a75c1026cc4e2667147118440467ba239aa37b2ba6a11aafd828db62949a94bcb14068
@@ -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.load(File.read(file))
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
- # get messages from SQS
49
- messages = @sqs_client.receive_message(
50
- queue_url: @config[:sqs][:queue],
51
- max_number_of_messages: 10,
52
- visibility_timeout: 3
53
- ).messages
54
-
55
- puts "Got #{messages.size} messages"
56
-
57
- messages.each_with_index do |message, index|
58
- puts "Looking at message number #{index}"
59
- body = AwsCleaner.new.parse(message.body)
60
- id = message.receipt_handle
61
-
62
- unless body
63
- AwsCleaner.new.delete_message(id, @config)
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
- chef_node = AwsCleaner::Chef.get_chef_node_name(@instance_id, @config)
139
+ instance_id = AwsCleaner.new.process_message(body)
82
140
 
83
- if chef_node
84
- if AwsCleaner::Chef.remove_from_chef(chef_node, @chef_client, @config)
85
- puts "Removed #{chef_node} from Chef"
86
- AwsCleaner.new.delete_message(id, @config)
87
- end
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
- puts "Instance #{@instance_id} does not exist in Chef, deleting message"
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
- sleep(5)
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
@@ -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.1.1
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: 2017-05-08 00:00:00.000000000 Z
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.46.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.46.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