cloudfront-invalidator 0.2.0 → 0.2.1

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 +7 -0
  2. data/README.md +18 -0
  3. data/lib/cloudfront-invalidator.rb +29 -22
  4. metadata +15 -14
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e9c506705dea1ec13c325675ff54744e363cc063
4
+ data.tar.gz: b153298128c3689329d67246d18579717feed3a5
5
+ SHA512:
6
+ metadata.gz: 86e3448770eb5b67b4f4e4e6a3fbd2b60b5c851e18a419b0b2603906b361196f2ddeecd83df192f2ebdb86b9b3eaa89ddae29ab3143d19bfc7d0b925f18cb967
7
+ data.tar.gz: cbdccfb757faaece579606ecc4211fb39af7244a6d90ddfce840ef6d48f3edee30bb02414d5dbdf6998bd1b4ba7e349fd1ef9843120f3acd5d140f173db97c30
data/README.md CHANGED
@@ -17,6 +17,24 @@ A command line utility is also included.
17
17
  $ cloudfront-invalidator list $AWS_KEY $AWS_SECRET $DISTRIBUTION_ID
18
18
  $ cloudfront-invalidator list_detail $AWS_KEY $AWS_SECRET $DISTRIBUTION_ID
19
19
 
20
+ Amazon IAM Policy
21
+ =================
22
+
23
+ {
24
+ "Version": "2012-10-17",
25
+ "Statement": [
26
+ {
27
+ "Action": [
28
+ "cloudfront:CreateInvalidation",
29
+ "cloudfront:GetInvalidation",
30
+ "cloudfront:ListInvalidations"
31
+ ],
32
+ "Effect": "Allow",
33
+ "Resource": "*"
34
+ }
35
+ ]
36
+ }
37
+
20
38
  Authors
21
39
  =======
22
40
 
@@ -3,23 +3,30 @@ require 'base64'
3
3
  require 'rexml/document'
4
4
  require 'hmac-sha1' # this is a gem
5
5
 
6
- class CloudfrontInvalidator
7
- API_VERSION = '2012-05-05'
8
- BASE_URL = "https://cloudfront.amazonaws.com/#{API_VERSION}/distribution/"
9
- DOC_URL = "http://cloudfront.amazonaws.com/doc/#{API_VERSION}/"
6
+ class CloudfrontInvalidator
10
7
  BACKOFF_LIMIT = 8192
11
8
  BACKOFF_DELAY = 0.025
12
9
 
13
- def initialize(aws_key, aws_secret, cf_dist_id)
10
+ def initialize(aws_key, aws_secret, cf_dist_id, options={})
14
11
  @aws_key, @aws_secret, @cf_dist_id = aws_key, aws_secret, cf_dist_id
12
+
13
+ @api_version = options[:api_version] || '2012-07-01'
14
+ end
15
+
16
+ def base_url
17
+ "https://cloudfront.amazonaws.com/#{@api_version}/distribution/"
15
18
  end
16
-
19
+
20
+ def doc_url
21
+ "http://cloudfront.amazonaws.com/doc/#{@api_version}/"
22
+ end
23
+
17
24
  def invalidate(*keys)
18
- keys = keys.flatten.map do |k|
19
- k.start_with?('/') ? k : '/' + k
25
+ keys = keys.flatten.map do |k|
26
+ k.start_with?('/') ? k : '/' + k
20
27
  end
21
-
22
- uri = URI.parse "#{BASE_URL}#{@cf_dist_id}/invalidation"
28
+
29
+ uri = URI.parse "#{base_url}#{@cf_dist_id}/invalidation"
23
30
  http = Net::HTTP.new(uri.host, uri.port)
24
31
  http.use_ssl = true
25
32
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
@@ -29,18 +36,18 @@ class CloudfrontInvalidator
29
36
  begin
30
37
  resp = http.send_request 'POST', uri.path, body, headers
31
38
  doc = REXML::Document.new resp.body
32
-
39
+
33
40
  # Create and raise an exception for any error the API returns to us.
34
41
  if resp.code.to_i != 201
35
42
  error_code = doc.elements["ErrorResponse/Error/Code"].text
36
43
  self.class.const_set(error_code,Class.new(StandardError)) unless self.class.const_defined?(error_code.to_sym)
37
44
  raise self.class.const_get(error_code).new(doc.elements["ErrorResponse/Error/Message"].text)
38
45
  end
39
-
46
+
40
47
  # Handle the common case of too many in progress by waiting until the others finish.
41
48
  rescue TooManyInvalidationsInProgress => e
42
49
  sleep delay * BACKOFF_DELAY
43
- delay *= 2 unless delay >= BACKOFF_LIMIT
50
+ delay *= 2 unless delay >= BACKOFF_LIMIT
44
51
  STDERR.puts e.inspect
45
52
  retry
46
53
  end
@@ -69,16 +76,16 @@ class CloudfrontInvalidator
69
76
  end
70
77
 
71
78
  def list(show_detail = false)
72
- uri = URI.parse "#{BASE_URL}#{@cf_dist_id}/invalidation"
79
+ uri = URI.parse "#{base_url}#{@cf_dist_id}/invalidation"
73
80
  http = Net::HTTP.new(uri.host, uri.port)
74
81
  http.use_ssl = true
75
82
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
76
83
  resp = http.send_request 'GET', uri.path, '', headers
77
84
 
78
85
  doc = REXML::Document.new resp.body
79
- puts "MaxItems " + doc.elements["InvalidationList/MaxItems"].text + "; " + (doc.elements["InvalidationList/MaxItems"].text == "true" ? "truncated" : "not truncated")
86
+ puts "MaxItems " + doc.elements["InvalidationList/MaxItems"].text + "; " + (doc.elements["InvalidationList/IsTruncated"].text == "true" ? "truncated" : "not truncated")
80
87
 
81
- doc.each_element("/InvalidationList/InvalidationSummary") do |summary|
88
+ doc.each_element("/InvalidationList/Items/InvalidationSummary") do |summary|
82
89
  invalidation_id = summary.elements["Id"].text
83
90
  summary_text = "ID " + invalidation_id + ": " + summary.elements["Status"].text
84
91
 
@@ -91,8 +98,8 @@ class CloudfrontInvalidator
91
98
  detail_doc.elements["Invalidation/InvalidationBatch/CallerReference"].text +
92
99
  '"'
93
100
  puts ' Invalidated URL paths:'
94
-
95
- puts " " + detail_doc.elements.to_a('Invalidation/InvalidationBatch/Path').map { |path| path.text }.join(" ")
101
+
102
+ puts " " + detail_doc.elements.to_a("Invalidation/InvalidationBatch/Paths/Items/Path").map(&:text).join(" ")
96
103
  else
97
104
  puts summary_text
98
105
  end
@@ -104,7 +111,7 @@ class CloudfrontInvalidator
104
111
  end
105
112
 
106
113
  def get_invalidation_detail_xml(invalidation_id)
107
- uri = URI.parse "#{BASE_URL}#{@cf_dist_id}/invalidation/#{invalidation_id}"
114
+ uri = URI.parse "#{base_url}#{@cf_dist_id}/invalidation/#{invalidation_id}"
108
115
  http = Net::HTTP.new(uri.host, uri.port)
109
116
  http.use_ssl = true
110
117
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
@@ -115,7 +122,7 @@ class CloudfrontInvalidator
115
122
  def xml_body(keys)
116
123
  xml = <<XML
117
124
  <?xml version="1.0" encoding="UTF-8"?>
118
- <InvalidationBatch xmlns="#{DOC_URL}">
125
+ <InvalidationBatch xmlns="#{doc_url}">
119
126
  <Paths>
120
127
  <Quantity>#{keys.size}</Quantity>
121
128
  <Items>
@@ -126,9 +133,9 @@ class CloudfrontInvalidator
126
133
  </InvalidationBatch>
127
134
  XML
128
135
  end
129
-
136
+
130
137
  def headers
131
- date = Time.now.strftime('%a, %d %b %Y %H:%M:%S %Z')
138
+ date = Time.now.utc.strftime('%a, %d %b %Y %H:%M:%S %Z')
132
139
  digest = HMAC::SHA1.new(@aws_secret)
133
140
  digest << date
134
141
  signature = Base64.encode64(digest.digest)
metadata CHANGED
@@ -1,27 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudfront-invalidator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
5
- prerelease:
4
+ version: 0.2.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jacob Elder
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-05-30 00:00:00.000000000 Z
11
+ date: 2015-02-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: ruby-hmac
16
- requirement: &70238974779060 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70238974779060
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
25
27
  description:
26
28
  email: jacob.elder@gmail.com
27
29
  executables:
@@ -29,31 +31,30 @@ executables:
29
31
  extensions: []
30
32
  extra_rdoc_files: []
31
33
  files:
32
- - lib/cloudfront-invalidator.rb
33
34
  - README.md
34
35
  - bin/cloudfront-invalidator
36
+ - lib/cloudfront-invalidator.rb
35
37
  homepage: http://github.com/reidiculous/cloudfront-invalidator
36
38
  licenses: []
39
+ metadata: {}
37
40
  post_install_message:
38
41
  rdoc_options: []
39
42
  require_paths:
40
43
  - lib
41
44
  required_ruby_version: !ruby/object:Gem::Requirement
42
- none: false
43
45
  requirements:
44
- - - ! '>='
46
+ - - ">="
45
47
  - !ruby/object:Gem::Version
46
48
  version: '0'
47
49
  required_rubygems_version: !ruby/object:Gem::Requirement
48
- none: false
49
50
  requirements:
50
- - - ! '>='
51
+ - - ">="
51
52
  - !ruby/object:Gem::Version
52
53
  version: '0'
53
54
  requirements: []
54
55
  rubyforge_project: cloudfront-invalidator
55
- rubygems_version: 1.8.11
56
+ rubygems_version: 2.4.5
56
57
  signing_key:
57
- specification_version: 3
58
+ specification_version: 4
58
59
  summary: Simple gem to invalidate a list of keys belonging to a Cloudfront distribution
59
60
  test_files: []