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.
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