cfcloner 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5e092bb641a0b320fbe0e76c29a6f8f3843ce426
4
+ data.tar.gz: 56da806508edab7c54d1c8794c8a890aaf9877b7
5
+ SHA512:
6
+ metadata.gz: 41f8f624fa1261e300d740598f175d07e187f0b4ad02afdd91dd08d136d1e3e5d665e276dd6c4bdc6c23e8e5fd04bb8617a5c827b358e4eb41c8890aa9f29929
7
+ data.tar.gz: 11be2c3bb5197791f4d82228c813a45dbbaa9693f9fc25605e7d1285dec51cc951b893ecd199406c293e9bd40285db195ee6b1c66f0d80002f62816f9677a3ba
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ before_install: gem install bundler -v 1.10.5
@@ -0,0 +1,13 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
6
+
7
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
+
9
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
+
11
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
+
13
+ This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cfcloner.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 TODO: Write your name
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # Cfcloner
2
+
3
+ This is a gem that clone CloudFront.
4
+ This gem can convert CloudFront configs to varnish config language.
5
+ Please set your credentials and write CloudFront instance ID in "cfcloner.rb".
6
+
7
+ <!-- ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'cfcloner'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install cfcloner
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake false` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/cfcloner. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
36
+
37
+ -->
38
+ ## License
39
+
40
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "cfcloner"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/cfcloner.gemspec ADDED
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cfcloner/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "cfcloner"
8
+ spec.version = Cfcloner::VERSION
9
+ spec.authors = ["Media Technology Lab"]
10
+ spec.email = ["support@mtl.recruit.co.jp"]
11
+
12
+ spec.summary = %q{This is a gem that clone CloudFront.}
13
+ spec.description = %q{This gem can convert CloudFront configs to varnish config language. Please set your credentials and write CloudFront instance ID in "cfcloner.rb".}
14
+ spec.homepage = "https://github.com/recruit-mtl/cfcloner"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
+ # delete this section to allow pushing this gem to any host.
19
+ # if spec.respond_to?(:metadata)
20
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
+ # else
22
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_dependency "aws-sdk", "2.1.18"
31
+
32
+ spec.add_development_dependency "bundler", "~> 1.10"
33
+ spec.add_development_dependency "rake", "~> 10.0"
34
+ # spec.add_development_dependency "aws-sdk", "~> 2.0.0"
35
+ spec.add_development_dependency "aws-sdk", "2.1.18"
36
+
37
+ end
data/lib/Backend.rb ADDED
@@ -0,0 +1,28 @@
1
+ class Backend
2
+ attr_reader :output_array
3
+ def initialize(origin)
4
+ @name = delete_symbol(origin.id)
5
+ @host = origin.domain_name
6
+ @port = origin.custom_origin_config.http_port
7
+ @output_array = Array.new
8
+ end
9
+
10
+ # ELBを参照する際に,hostが一意に定まらない問題
11
+ def store_code_for_declar_backend
12
+ @output_array.push("backend #{@name} {")
13
+ @output_array.push(" .host = \"#{@host}\";")
14
+ @output_array.push(" .port = \"#{@port}\";")
15
+ @output_array.push("}")
16
+ end
17
+
18
+ def delete_symbol(str)
19
+ result_str = ""
20
+ for i in 1..str.size
21
+ if str[i-1] == "." || str[i-1] == "-"
22
+ else
23
+ result_str = result_str + str[i-1]
24
+ end
25
+ end
26
+ return result_str
27
+ end
28
+ end
data/lib/Behavior.rb ADDED
@@ -0,0 +1,167 @@
1
+ class Behavior
2
+ attr_reader :output_array_for_recv, :output_array_for_hash, :output_array_for_backend_resp
3
+ def initialize(cache_behavior)
4
+ @backend_name = delete_symbol(cache_behavior.target_origin_id)
5
+ @allowed_methods = cache_behavior.allowed_methods.items
6
+ @cached_methods = cache_behavior.allowed_methods.cached_methods.items
7
+ @forward_headers = cache_behavior.forwarded_values.headers
8
+ @forward_cookies = cache_behavior.forwarded_values.cookies
9
+ @forward_query_string = cache_behavior.forwarded_values.query_string
10
+ @min_ttl = cache_behavior.min_ttl
11
+ @max_ttl = cache_behavior.max_ttl
12
+ @default_ttl = cache_behavior.default_ttl
13
+ @output_array_for_recv = Array.new
14
+ @output_array_for_backend_resp = Array.new
15
+ @output_array_for_hash = Array.new
16
+ end
17
+
18
+
19
+ def store_code_for_recv
20
+ ## CFのForwardQueryStringが NO だった場合,QueryStrginを削除
21
+ @forward_query_string? "" : "#{@output_array_for_recv << " set req.url = regsub(req.url, \"\\?.*$\", \"\");"}"
22
+ # ALLOWED METHODS
23
+ @output_array_for_recv << " if("
24
+ @allowed_methods.each_with_index do |method, index|
25
+ @output_array_for_recv[@output_array_for_recv.length-1] += "req.method == \"#{method}\""
26
+ # 最後の要素で無ければOR演算子を付加する
27
+ @output_array_for_recv[@output_array_for_recv.length-1] += (index != (@allowed_methods.size-1))? " || " : ""
28
+ end
29
+ @output_array_for_recv[@output_array_for_recv.length-1] += "){"
30
+ # CACHED METHODS
31
+ @output_array_for_recv << " if("
32
+ @cached_methods.each_with_index do |method, index|
33
+ @output_array_for_recv[@output_array_for_recv.length-1] += "req.method == \"#{method}\""
34
+ # 最後の要素で無ければOR演算子を付加する
35
+ @output_array_for_recv[@output_array_for_recv.length-1] += (index != (@cached_methods.size-1))? " || " : ""
36
+ end
37
+ # FORWARD HEADERS
38
+ @output_array_for_recv[@output_array_for_recv.length-1] += "){"
39
+ if @forward_headers.items[0] == "*"
40
+ @output_array_for_recv << " return (pipe);"
41
+ end
42
+ # FORWARD COOKIES
43
+ case @forward_cookies.forward
44
+ when "none"
45
+ @output_array_for_recv << " unset req.http.Cookie;"
46
+
47
+ when "whitelist"
48
+ @output_array_for_recv << " set req.http.Cookie = \";\" + req.http.Cookie;"
49
+ @output_array_for_recv << " set req.http.Cookie = regsuball(req.http.Cookie, \"; +\", \";\");"
50
+ @output_array_for_recv << " set req.http.Cookie = regsuball(req.http.Cookie, \";("
51
+ @forward_cookies.whitelisted_names.items.each_with_index do |cookie, index|
52
+ @output_array_for_recv[@output_array_for_recv.length-1] += "#{cookie}"
53
+ @output_array_for_recv[@output_array_for_recv.length-1] += (index != (@forward_cookies.whitelisted_names.quantity-1))? "|" : ""
54
+ end
55
+ @output_array_for_recv[@output_array_for_recv.length-1] += ")=\", \"; \\1=\");"
56
+ @output_array_for_recv << " set req.http.Cookie = regsuball(req.http.Cookie, \";[^ ][^;]*\", \"\");"
57
+ @output_array_for_recv << " set req.http.Cookie = regsuball(req.http.Cookie, \"^[; ]+|[; ]+$\", \"\");"
58
+
59
+ when "all"
60
+ end
61
+
62
+ # backendをセットする
63
+ @output_array_for_recv << " set req.backend_hint = #{@backend_name};"
64
+ @output_array_for_recv << " return (hash);"
65
+ @output_array_for_recv << " }else{"
66
+ @output_array_for_recv << " return (pipe);"
67
+ @output_array_for_recv << " }"
68
+ @output_array_for_recv << " }else{"
69
+ @output_array_for_recv << " return (synth(405, \"Method Not Allowed\"));"
70
+ @output_array_for_recv << " }"
71
+ end
72
+
73
+ def store_code_for_backend_resp
74
+ ## cacheがprivateではないか
75
+ ## cacheがprivateであれば,min_ttlをセットする
76
+ @output_array_for_backend_resp << " if(beresp.http.cache-control ~ \"no-cache\" || beresp.http.cache-control ~ \"no-store\" || beresp.http.cache-control ~ \"private\"){"
77
+ @output_array_for_backend_resp << " set beresp.ttl = #{@min_ttl}s;"
78
+ @output_array_for_backend_resp << " return (deliver);"
79
+ @output_array_for_backend_resp << " }"
80
+ @output_array_for_backend_resp << " if((beresp.http.cache-control ~ \"max-age\") || (beresp.http.cache-control ~ \"s-maxage\") || (beresp.http.expires)){"
81
+ ## beresp.ttlに,beresp.ttl(max-age?=>s-maxage?=>expires?=>default_ttl)がmin_ttlより小さければmin_ttlを,max_ttlより大きければmax_ttlを設定
82
+ @output_array_for_backend_resp << " if(beresp.ttl <= #{@min_ttl}s){"
83
+ @output_array_for_backend_resp << " set beresp.ttl = #{@min_ttl}s;"
84
+ @output_array_for_backend_resp << " }else if(beresp.ttl >= #{@max_ttl}s){"
85
+ @output_array_for_backend_resp << " set beresp.ttl = #{@max_ttl}s;"
86
+ @output_array_for_backend_resp << " }"
87
+ @output_array_for_backend_resp << " return (deliver);"
88
+ ## HTTPヘッダのcache-controlにmax-ageが設定されていない場合,min_ttlとdefault_ttlの大きい方をセットする
89
+ @output_array_for_backend_resp << " }else{"
90
+ @output_array_for_backend_resp << " set beresp.ttl = #{(@min_ttl >= @default_ttl)? @min_ttl : @default_ttl}s;"
91
+ @output_array_for_backend_resp << " return (deliver);"
92
+ @output_array_for_backend_resp << " }"
93
+ end
94
+
95
+ def store_code_for_hash
96
+ # FORWARD COOKIES
97
+ @output_array_for_hash << " hash_data(req.http.Cookie);"
98
+ # FORWARD HEADERS
99
+ if @forward_headers.items[0] != "*"
100
+ @forward_headers.items.each_with_index do |header, index|
101
+ @output_array_for_hash << " hash_data(req.http.#{header});"
102
+ end
103
+ # @output_array_for_hash << " return(lookup);"
104
+ end
105
+ end
106
+
107
+ def delete_symbol(str)
108
+ result_str = ""
109
+ for i in 1..str.size
110
+ if str[i-1] == "." || str[i-1] == "-"
111
+ else
112
+ result_str = result_str + str[i-1]
113
+ end
114
+ end
115
+ return result_str
116
+ end
117
+ end
118
+
119
+ class DefaultBehavior < Behavior
120
+ end
121
+
122
+ class AdditionBehavior < Behavior
123
+ # defaultのbehavior以外はoriginに対してPATHが付加する
124
+ def initialize(cache_behavior)
125
+ super(cache_behavior)
126
+ @url = cache_behavior.path_pattern
127
+ end
128
+
129
+ def store_code_for_recv
130
+ # behaviorの条件
131
+ ## PATH PATTERN
132
+ ## origindomain/PATH もしくは origindomain/PATH?param=hoge であるurlの条件
133
+ @output_array_for_recv << "if(req.url ~ \"^(#{@url.gsub(/\*/, ".*")}|#{@url.gsub(/\*/, ".*")}\\?.*)\"){"
134
+ super
135
+ @output_array_for_recv << "}"
136
+ @output_array_for_recv.each_with_index do |code_line, index|
137
+ code_line.insert(0, " ")
138
+ end
139
+ end
140
+
141
+ def store_code_for_backend_resp
142
+ # behaviorの条件
143
+ ## PATHの条件分岐を追加
144
+ ## origindomain/PATH もしくは origindomain/PATH?param=hoge であるurlの条件
145
+ @output_array_for_backend_resp << "if(bereq.url ~ \"^(#{@url.gsub(/\*/, ".*")}|#{@url.gsub(/\*/, ".*")}\\?.*)\"){"
146
+ super
147
+ @output_array_for_backend_resp << "}"
148
+ @output_array_for_backend_resp.each_with_index do |code_line, index|
149
+ code_line.insert(0, " ")
150
+ end
151
+ end
152
+
153
+ def store_code_for_hash
154
+ # behaviorの条件
155
+ ## PATHの条件分岐を追加
156
+ ## origindomain/PATH もしくは origindomain/PATH?param=hoge であるurlの条件
157
+ if @forward_headers.items[0] != "*"
158
+ @output_array_for_hash << "if(req.url ~ \"^(#{@url.gsub(/\*/, ".*")}|#{@url.gsub(/\*/, ".*")}\\?.*)\"){"
159
+ super
160
+ @output_array_for_hash << "}"
161
+ @output_array_for_hash.each_with_index do |code_line, index|
162
+ code_line.insert(0, " ")
163
+ end
164
+ end
165
+ end
166
+
167
+ end
data/lib/cfcloner.rb ADDED
@@ -0,0 +1,98 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "cfcloner/version"
3
+ require "aws-sdk"
4
+ require File.dirname(__FILE__) + "/Backend"
5
+ require File.dirname(__FILE__) + "/Behavior"
6
+
7
+ module Cfcloner
8
+ # CloudFrontのインスタンスを生成
9
+ cf = Aws::CloudFront::Client.new(
10
+ region: 'ap-northeast-1'
11
+ )
12
+ # ディストリビューションのidを指定してディストリビューションの情報を取ってくる
13
+ resp = cf.get_distribution_config({
14
+ id: '**************'
15
+ })
16
+
17
+ # vclに書き出すコードの配列を宣言
18
+ entire_code = Array.new
19
+ # vclのバージョンを指定
20
+ entire_code << "vcl 4.0;"
21
+
22
+ # Backend情報を格納する配列を宣言
23
+ backend_array = Array.new
24
+ resp.distribution_config.origins.items.each_with_index do |origin, index|
25
+ # CFのOriginの数だけbackend配列に格納
26
+ backend_array[index] = Backend.new(origin)
27
+ # Backendのvcl用コードを生成
28
+ backend_array[index].store_code_for_declar_backend
29
+ # entire_codeに格納
30
+ entire_code.concat(backend_array[index].output_array)
31
+ end
32
+
33
+ # Bahavior情報を格納する配列を宣言
34
+ behavior_array = Array.new
35
+ # CFのbehaviorのDefault Behavior以外をbehavior配列に格納
36
+ resp.distribution_config.cache_behaviors.items.each_with_index do |behavior, index|
37
+ behavior_array[index] = AdditionBehavior.new(behavior)
38
+ end
39
+ # CFのbehaviorのDefault Behaviorをbehavior配列に格納
40
+ behavior_array[behavior_array.length] = DefaultBehavior.new(resp.distribution_config.default_cache_behavior)
41
+
42
+ # Behaviorのvcl用コードを生成
43
+ behavior_array.each_with_index do |behavior, index|
44
+ behavior_array[index].store_code_for_recv
45
+ behavior_array[index].store_code_for_hash
46
+ behavior_array[index].store_code_for_backend_resp
47
+ end
48
+
49
+ # vcl_recv箇所をentire_codeに格納
50
+ entire_code << "sub vcl_recv {"
51
+ behavior_array.each_with_index do |behavior, index|
52
+ entire_code.concat(behavior.output_array_for_recv)
53
+ end
54
+ entire_code << "}"
55
+
56
+ # vcl_hash箇所をentire_codeに格納
57
+ entire_code << "sub vcl_hash {"
58
+ behavior_array.each_with_index do |behavior, index|
59
+ entire_code.concat(behavior.output_array_for_hash)
60
+ end
61
+ entire_code << "}"
62
+
63
+ # vcl_backend_response箇所をentire_codeに格納
64
+ entire_code << "sub vcl_backend_response {"
65
+ behavior_array.each_with_index do |behavior, index|
66
+ entire_code.concat(behavior.output_array_for_backend_resp)
67
+ end
68
+ entire_code << "}"
69
+
70
+
71
+ # vcl_hit箇所をentire_codeに格納
72
+ entire_code << "sub vcl_hit {"
73
+ # vcl_deliverでは参照できないobj.ttlの値を一時的に保存する
74
+ entire_code << " set req.http.Remain-ttl-tmp = obj.ttl;"
75
+ entire_code << "}"
76
+
77
+ # vcl_deliverをentire_codeに格納
78
+ entire_code << "sub vcl_deliver {"
79
+ entire_code << " if(obj.hits > 0){"
80
+ # キャッシュが有る場合はX-CacheにHitを挿入
81
+ entire_code << " set resp.http.X-Cache = \"Hit from varnish\";"
82
+ # X-Remain-TTLに残りのキャッシュ保持期間を格納
83
+ entire_code << " set resp.http.X-Remain-TTL = req.http.Remain-ttl-tmp;"
84
+ # 一時的に保存したデータを削除
85
+ entire_code << " unset req.http.Remain-ttl-tmp;"
86
+ entire_code << " }else{"
87
+ # キャッシュが無い場合はX-CacheにMissを挿入
88
+ entire_code << " set resp.http.X-Cache = \"Miss from varnish\";"
89
+ entire_code << " }"
90
+ entire_code << "}"
91
+
92
+ # コードをvclに書き出す
93
+ File.open('/etc/varnish/default.vcl', 'w') do |file|
94
+ for entire_code_line in entire_code do
95
+ file.puts entire_code_line
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,3 @@
1
+ module Cfcloner
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cfcloner
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Media Technology Lab
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 2.1.18
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.1.18
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.1.18
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 2.1.18
69
+ description: This gem can convert CloudFront configs to varnish config language. Please
70
+ set your credentials and write CloudFront instance ID in "cfcloner.rb".
71
+ email:
72
+ - support@mtl.recruit.co.jp
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - .travis.yml
79
+ - CODE_OF_CONDUCT.md
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/console
85
+ - bin/setup
86
+ - cfcloner.gemspec
87
+ - lib/Backend.rb
88
+ - lib/Behavior.rb
89
+ - lib/cfcloner.rb
90
+ - lib/cfcloner/version.rb
91
+ homepage: https://github.com/recruit-mtl/cfcloner
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.0.14
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: This is a gem that clone CloudFront.
115
+ test_files: []