garcun 0.0.2

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 (139) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +17 -0
  3. data/.gitignore +197 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +22 -0
  6. data/LICENSE +201 -0
  7. data/README.md +521 -0
  8. data/Rakefile +47 -0
  9. data/garcun.gemspec +83 -0
  10. data/lib/garcon.rb +290 -0
  11. data/lib/garcon/chef/chef_helpers.rb +343 -0
  12. data/lib/garcon/chef/coerce/coercer.rb +134 -0
  13. data/lib/garcon/chef/coerce/coercions/boolean_definitions.rb +34 -0
  14. data/lib/garcon/chef/coerce/coercions/date_definitions.rb +32 -0
  15. data/lib/garcon/chef/coerce/coercions/date_time_definitions.rb +32 -0
  16. data/lib/garcon/chef/coerce/coercions/fixnum_definitions.rb +34 -0
  17. data/lib/garcon/chef/coerce/coercions/float_definitions.rb +32 -0
  18. data/lib/garcon/chef/coerce/coercions/hash_definitions.rb +29 -0
  19. data/lib/garcon/chef/coerce/coercions/integer_definitions.rb +31 -0
  20. data/lib/garcon/chef/coerce/coercions/string_definitions.rb +45 -0
  21. data/lib/garcon/chef/coerce/coercions/time_definitions.rb +32 -0
  22. data/lib/garcon/chef/handler/devreporter.rb +127 -0
  23. data/lib/garcon/chef/log.rb +64 -0
  24. data/lib/garcon/chef/node.rb +100 -0
  25. data/lib/garcon/chef/provider/civilize.rb +209 -0
  26. data/lib/garcon/chef/provider/development.rb +159 -0
  27. data/lib/garcon/chef/provider/download.rb +420 -0
  28. data/lib/garcon/chef/provider/house_keeping.rb +265 -0
  29. data/lib/garcon/chef/provider/node_cache.rb +31 -0
  30. data/lib/garcon/chef/provider/partial.rb +183 -0
  31. data/lib/garcon/chef/provider/recovery.rb +80 -0
  32. data/lib/garcon/chef/provider/zip_file.rb +271 -0
  33. data/lib/garcon/chef/resource/attribute.rb +52 -0
  34. data/lib/garcon/chef/resource/base_dsl.rb +174 -0
  35. data/lib/garcon/chef/resource/blender.rb +140 -0
  36. data/lib/garcon/chef/resource/lazy_eval.rb +66 -0
  37. data/lib/garcon/chef/resource/resource_name.rb +109 -0
  38. data/lib/garcon/chef/secret_bag.rb +204 -0
  39. data/lib/garcon/chef/validations.rb +76 -0
  40. data/lib/garcon/chef_inclusions.rb +151 -0
  41. data/lib/garcon/configuration.rb +138 -0
  42. data/lib/garcon/core_ext.rb +39 -0
  43. data/lib/garcon/core_ext/array.rb +27 -0
  44. data/lib/garcon/core_ext/binding.rb +64 -0
  45. data/lib/garcon/core_ext/boolean.rb +66 -0
  46. data/lib/garcon/core_ext/duration.rb +271 -0
  47. data/lib/garcon/core_ext/enumerable.rb +34 -0
  48. data/lib/garcon/core_ext/file.rb +127 -0
  49. data/lib/garcon/core_ext/filetest.rb +62 -0
  50. data/lib/garcon/core_ext/hash.rb +279 -0
  51. data/lib/garcon/core_ext/kernel.rb +159 -0
  52. data/lib/garcon/core_ext/lazy.rb +222 -0
  53. data/lib/garcon/core_ext/method_access.rb +243 -0
  54. data/lib/garcon/core_ext/module.rb +92 -0
  55. data/lib/garcon/core_ext/nil.rb +53 -0
  56. data/lib/garcon/core_ext/numeric.rb +44 -0
  57. data/lib/garcon/core_ext/object.rb +342 -0
  58. data/lib/garcon/core_ext/pathname.rb +152 -0
  59. data/lib/garcon/core_ext/process.rb +41 -0
  60. data/lib/garcon/core_ext/random.rb +497 -0
  61. data/lib/garcon/core_ext/string.rb +312 -0
  62. data/lib/garcon/core_ext/struct.rb +49 -0
  63. data/lib/garcon/core_ext/symbol.rb +170 -0
  64. data/lib/garcon/core_ext/time.rb +234 -0
  65. data/lib/garcon/exceptions.rb +101 -0
  66. data/lib/garcon/inflections.rb +237 -0
  67. data/lib/garcon/inflections/defaults.rb +79 -0
  68. data/lib/garcon/inflections/inflections.rb +182 -0
  69. data/lib/garcon/inflections/rules_collection.rb +37 -0
  70. data/lib/garcon/secret.rb +271 -0
  71. data/lib/garcon/stash/format.rb +114 -0
  72. data/lib/garcon/stash/journal.rb +226 -0
  73. data/lib/garcon/stash/queue.rb +83 -0
  74. data/lib/garcon/stash/serializer.rb +86 -0
  75. data/lib/garcon/stash/store.rb +435 -0
  76. data/lib/garcon/task.rb +31 -0
  77. data/lib/garcon/task/atomic.rb +151 -0
  78. data/lib/garcon/task/atomic_boolean.rb +127 -0
  79. data/lib/garcon/task/condition.rb +99 -0
  80. data/lib/garcon/task/copy_on_notify_observer_set.rb +154 -0
  81. data/lib/garcon/task/copy_on_write_observer_set.rb +153 -0
  82. data/lib/garcon/task/count_down_latch.rb +92 -0
  83. data/lib/garcon/task/delay.rb +196 -0
  84. data/lib/garcon/task/dereferenceable.rb +144 -0
  85. data/lib/garcon/task/event.rb +119 -0
  86. data/lib/garcon/task/executor.rb +275 -0
  87. data/lib/garcon/task/executor_options.rb +59 -0
  88. data/lib/garcon/task/future.rb +107 -0
  89. data/lib/garcon/task/immediate_executor.rb +84 -0
  90. data/lib/garcon/task/ivar.rb +171 -0
  91. data/lib/garcon/task/lazy_reference.rb +74 -0
  92. data/lib/garcon/task/monotonic_time.rb +69 -0
  93. data/lib/garcon/task/obligation.rb +256 -0
  94. data/lib/garcon/task/observable.rb +101 -0
  95. data/lib/garcon/task/priority_queue.rb +234 -0
  96. data/lib/garcon/task/processor_count.rb +128 -0
  97. data/lib/garcon/task/read_write_lock.rb +304 -0
  98. data/lib/garcon/task/safe_task_executor.rb +58 -0
  99. data/lib/garcon/task/single_thread_executor.rb +97 -0
  100. data/lib/garcon/task/thread_pool/cached.rb +71 -0
  101. data/lib/garcon/task/thread_pool/executor.rb +294 -0
  102. data/lib/garcon/task/thread_pool/fixed.rb +61 -0
  103. data/lib/garcon/task/thread_pool/worker.rb +90 -0
  104. data/lib/garcon/task/timer.rb +44 -0
  105. data/lib/garcon/task/timer_set.rb +194 -0
  106. data/lib/garcon/task/timer_task.rb +377 -0
  107. data/lib/garcon/task/waitable_list.rb +58 -0
  108. data/lib/garcon/utility/ansi.rb +199 -0
  109. data/lib/garcon/utility/at_random.rb +77 -0
  110. data/lib/garcon/utility/crypto.rb +292 -0
  111. data/lib/garcon/utility/equalizer.rb +146 -0
  112. data/lib/garcon/utility/faker/extensions/array.rb +22 -0
  113. data/lib/garcon/utility/faker/extensions/symbol.rb +9 -0
  114. data/lib/garcon/utility/faker/faker.rb +164 -0
  115. data/lib/garcon/utility/faker/faker/company.rb +17 -0
  116. data/lib/garcon/utility/faker/faker/hacker.rb +30 -0
  117. data/lib/garcon/utility/faker/faker/version.rb +3 -0
  118. data/lib/garcon/utility/faker/locales/en-US.yml +83 -0
  119. data/lib/garcon/utility/faker/locales/en.yml +21 -0
  120. data/lib/garcon/utility/file_helper.rb +170 -0
  121. data/lib/garcon/utility/hookers.rb +178 -0
  122. data/lib/garcon/utility/interpolation.rb +90 -0
  123. data/lib/garcon/utility/memstash.rb +364 -0
  124. data/lib/garcon/utility/misc.rb +54 -0
  125. data/lib/garcon/utility/msg_from_god.rb +62 -0
  126. data/lib/garcon/utility/retry.rb +238 -0
  127. data/lib/garcon/utility/timeout.rb +58 -0
  128. data/lib/garcon/utility/uber/builder.rb +91 -0
  129. data/lib/garcon/utility/uber/callable.rb +7 -0
  130. data/lib/garcon/utility/uber/delegates.rb +13 -0
  131. data/lib/garcon/utility/uber/inheritable_attr.rb +37 -0
  132. data/lib/garcon/utility/uber/options.rb +101 -0
  133. data/lib/garcon/utility/uber/uber_version.rb +3 -0
  134. data/lib/garcon/utility/uber/version.rb +33 -0
  135. data/lib/garcon/utility/url_helper.rb +100 -0
  136. data/lib/garcon/utils.rb +29 -0
  137. data/lib/garcon/version.rb +62 -0
  138. data/lib/garcun.rb +24 -0
  139. metadata +680 -0
@@ -0,0 +1,159 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ # License: Apache License, Version 2.0
5
+ # Copyright: (C) 2014-2015 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'garcon'
21
+
22
+ class Chef
23
+ class Resource
24
+ class Development < Chef::Resource
25
+ include Garcon
26
+
27
+ # Chef attributes
28
+ identity_attr :name
29
+ provides :development
30
+
31
+ # Actions
32
+ actions :run
33
+ default_action :run
34
+
35
+ # Attributes
36
+ attribute :name,
37
+ kind_of: String
38
+ end
39
+ end
40
+
41
+ class Provider
42
+ class Development < Chef::Provider
43
+ include Garcon
44
+
45
+ # Shortcut to new_resource.
46
+ #
47
+ alias_method :r, :new_resource
48
+
49
+ # Boolean indicating if WhyRun is supported by this provider
50
+ #
51
+ # @return [TrueClass, FalseClass]
52
+ #
53
+ # @api private
54
+ def whyrun_supported?
55
+ true
56
+ end
57
+
58
+ # Load and return the current resource.
59
+ #
60
+ # @return [Chef::Provider::Civilize]
61
+ #
62
+ # @api private
63
+ def load_current_resource
64
+ @current_resource ||= Chef::Resource::Development.new(r.name)
65
+ @current_resource
66
+ end
67
+
68
+ def action_run
69
+ chef_handler
70
+ install_gem('pry')
71
+ Chef::Recipe.send(:require, 'pry')
72
+ install_gem('awesome_print')
73
+ Chef::Recipe.send(:require, 'ap')
74
+ end
75
+
76
+ private # P R O P R I E T À P R I V A T A Vietato L'accesso
77
+
78
+ def chef_handler
79
+ include_recipe 'chef_handler::default'
80
+
81
+ file = ::File.join(node[:chef_handler][:handler_path], 'devreporter.rb')
82
+ f ||= Chef::Resource::CookbookFile.new(file, run_context)
83
+ f.cookbook 'garcon'
84
+ f.backup false
85
+ f.owner 'root'
86
+ f.group 'root'
87
+ f.mode 00600
88
+ f.run_action :create
89
+
90
+ h ||= Chef::Resource::ChefHandler.new('DevReporter', run_context)
91
+ h.source file
92
+ h.supports report: true, exception: true
93
+ h.run_action :enable
94
+ end
95
+
96
+ def install_gem(name)
97
+ g ||= Chef::Resource::ChefGem.new(name, run_context)
98
+ g.compile_time(false) if respond_to?(:compile_time)
99
+ g.not_if { gem_installed?(name) }
100
+ g.run_action :install
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ # Chef::Platform mapping for resource and providers
107
+ #
108
+ # @return [undefined]
109
+ #
110
+ # @api private.
111
+ Chef::Platform.set(
112
+ platform: :amazon,
113
+ resource: :civilize,
114
+ provider: Chef::Provider::Civilize
115
+ )
116
+
117
+ # Chef::Platform mapping for resource and providers
118
+ #
119
+ # @return [undefined]
120
+ #
121
+ # @api private.
122
+ Chef::Platform.set(
123
+ platform: :centos,
124
+ resource: :civilize,
125
+ provider: Chef::Provider::Civilize
126
+ )
127
+
128
+ # Chef::Platform mapping for resource and providers
129
+ #
130
+ # @return [undefined]
131
+ #
132
+ # @api private.
133
+ Chef::Platform.set(
134
+ platform: :oracle,
135
+ resource: :civilize,
136
+ provider: Chef::Provider::Civilize
137
+ )
138
+
139
+ # Chef::Platform mapping for resource and providers
140
+ #
141
+ # @return [undefined]
142
+ #
143
+ # @api private.
144
+ Chef::Platform.set(
145
+ platform: :redhat,
146
+ resource: :civilize,
147
+ provider: Chef::Provider::Civilize
148
+ )
149
+
150
+ # Chef::Platform mapping for resource and providers
151
+ #
152
+ # @return [undefined]
153
+ #
154
+ # @api private.
155
+ Chef::Platform.set(
156
+ platform: :scientific,
157
+ resource: :civilize,
158
+ provider: Chef::Provider::Civilize
159
+ )
@@ -0,0 +1,420 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ # License: Apache License, Version 2.0
5
+ # Copyright: (C) 2014-2015 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'garcon'
21
+
22
+ class Chef
23
+ class Resource
24
+ class Download < Chef::Resource
25
+ include Garcon
26
+
27
+ # Chef attributes
28
+ identity_attr :path
29
+ provides :download
30
+ state_attrs :checksum, :owner, :group, :mode
31
+
32
+ # Actions
33
+ actions :create, :create_if_missing, :delete, :touch
34
+ default_action :create
35
+
36
+ # Attributes
37
+ attribute :path,
38
+ kind_of: String,
39
+ name_attribute: true
40
+ attribute :source,
41
+ kind_of: [String, URI::HTTP],
42
+ callbacks: source_callbacks,
43
+ required: true
44
+ attribute :backup,
45
+ kind_of: [Integer, FalseClass],
46
+ default: 5
47
+ attribute :checksum,
48
+ kind_of: String,
49
+ regex: /^[0-9a-f]{32}$|^[a-zA-Z0-9]{40,64}$/
50
+ attribute :connections,
51
+ kind_of: Integer,
52
+ default: 8
53
+ attribute :owner,
54
+ kind_of: [String, Integer],
55
+ regex: Chef::Config[:user_valid_regex]
56
+ attribute :group,
57
+ kind_of: [String, Integer],
58
+ regex: Chef::Config[:group_valid_regex]
59
+ attribute :mode,
60
+ kind_of: [String, Integer],
61
+ regex: /^0?\d{3,4}$/
62
+ attribute :check_cert,
63
+ kind_of: [TrueClass, FalseClass],
64
+ default: true
65
+ attribute :header,
66
+ kind_of: String,
67
+ default: nil
68
+
69
+ # @!attribute [rw] installed
70
+ # @return [TrueClass, FalseClass] True if resource exists.
71
+ attr_accessor :exist
72
+
73
+ # Determine if the resource exists. This value is set by the provider
74
+ # when the current resource is loaded.
75
+ #
76
+ # @see Dsccsetup#action_create
77
+ #
78
+ # @return [Boolean]
79
+ #
80
+ # @api public
81
+ def exist?
82
+ !!@exist
83
+ end
84
+ end
85
+ end
86
+
87
+ class Provider
88
+ class Download < Chef::Provider
89
+ include Chef::Mixin::EnforceOwnershipAndPermissions
90
+ include Chef::Mixin::Checksum
91
+ include Garcon
92
+
93
+ def initialize(name, run_context = nil)
94
+ super
95
+ @resource_name = :download
96
+ @provider = Chef::Provider::Download
97
+ @ready = AtomicBoolean.new(installed?('aria2c'))
98
+ @lock = ReadWriteLock.new
99
+
100
+ make_ready unless ready?
101
+ poll(300) { ready? }
102
+ end
103
+
104
+ # Shortcut to new_resource.
105
+ #
106
+ alias_method :r, :new_resource
107
+
108
+ # Boolean indicating if WhyRun is supported by this provider
109
+ #
110
+ # @return [TrueClass, FalseClass]
111
+ #
112
+ # @api private
113
+ def whyrun_supported?
114
+ true
115
+ end
116
+
117
+ # Reload the resource state when something changes
118
+ #
119
+ # @return [undefined]
120
+ #
121
+ # @api private
122
+ def load_new_resource_state
123
+ r.exist = @current_resource.exist if r.exist.nil?
124
+ end
125
+
126
+ # Load and return the current resource.
127
+ #
128
+ # @return [Chef::Provider::Download]
129
+ #
130
+ # @api private
131
+ def load_current_resource
132
+ @current_resource ||= Chef::Resource::Download.new(r.name)
133
+ @current_resource.path(r.path)
134
+
135
+ if ::File.exist?(@current_resource.path)
136
+ @current_resource.checksum(checksum(@current_resource.path))
137
+ if @current_resource.checksum == r.checksum
138
+ @current_resource.exist = true
139
+ else
140
+ @current_resource.exist = false
141
+ end
142
+ else
143
+ @current_resource.exist = false
144
+ end
145
+ @current_resource
146
+ end
147
+
148
+ # Default, download the specified source file if it does not exist. If a
149
+ # file already exists (but does not match), use to update that file to
150
+ # match.
151
+ #
152
+ # @return [undefined]
153
+ #
154
+ # @api public
155
+ def action_create
156
+ if @current_resource.exist? && !access_controls.requires_changes?
157
+ Chef::Log.debug "#{r.path} already exists - nothing to do"
158
+
159
+ elsif @current_resource.exist? && access_controls.requires_changes?
160
+ converge_by(access_controls.describe_changes) do
161
+ access_controls.set_all
162
+ end
163
+ r.updated_by_last_action(true)
164
+
165
+ else
166
+ converge_by "Download #{r.path}" do
167
+ backup unless ::File.symlink?(r.path)
168
+ do_download
169
+ end
170
+ do_acl_changes
171
+ load_resource_attributes_from_file(r)
172
+ r.updated_by_last_action(true)
173
+ load_new_resource_state
174
+ r.exist = true
175
+ end
176
+ end
177
+
178
+ alias_method :action_create_if_missing, :action_create
179
+
180
+ # Use to delete a file.
181
+ #
182
+ # @return [undefined]
183
+ #
184
+ # @api public
185
+ def action_delete
186
+ if @current_resource.exist?
187
+ converge_by "Delete #{r.path}" do
188
+ backup unless ::File.symlink?(r.path)
189
+ ::File.delete(r.path)
190
+ end
191
+ r.updated_by_last_action(true)
192
+ load_new_resource_state
193
+ r.exist = false
194
+ else
195
+ Chef::Log.debug "#{r.path} does not exists - nothing to do"
196
+ end
197
+ end
198
+
199
+ # Use to touch a file. This updates the access (atime) and file
200
+ # modification (mtime) times for a file. (This action may be used with
201
+ # this resource, but is typically only used with the file resource.)
202
+ #
203
+ # @return [undefined]
204
+ #
205
+ # @api public
206
+ def action_touch
207
+ if @current_resource.exist?
208
+ converge_by "Update utime on #{r.path}" do
209
+ time = Time.now
210
+ ::File.utime(time, time, r.path)
211
+ end
212
+ r.updated_by_last_action(true)
213
+ load_new_resource_state
214
+ r.exist = true
215
+ else
216
+ Chef::Log.debug "#{r.path} does not exists - nothing to do"
217
+ end
218
+ end
219
+
220
+ # Implementation components *should* follow symlinks when managing access
221
+ # control (e.g., use chmod instead of lchmod even if the path we're
222
+ # managing is a symlink).
223
+ #
224
+ def manage_symlink_access?
225
+ false
226
+ end
227
+
228
+ private # P R O P R I E T À P R I V A T A Vietato L'accesso
229
+
230
+ # Handle the download action.
231
+ #
232
+ # @return [undefined]
233
+ #
234
+ # @api private
235
+ def do_create
236
+ if @current_resource.exist? && !access_controls.requires_changes?
237
+ Chef::Log.debug "#{r.path} already exists - nothing to do"
238
+
239
+ elsif @current_resource.exist? && access_controls.requires_changes?
240
+ converge_by(access_controls.describe_changes) do
241
+ access_controls.set_all
242
+ end
243
+ r.updated_by_last_action(true)
244
+
245
+ else
246
+ converge_by "Download #{r.path}" do
247
+ backup unless ::File.symlink?(r.path)
248
+ do_download
249
+ end
250
+ do_acl_changes
251
+ load_resource_attributes_from_file(r)
252
+ r.updated_by_last_action(true)
253
+ load_new_resource_state
254
+ r.exist = true
255
+ end
256
+ end
257
+
258
+ # Change file ownership and mode.
259
+ #
260
+ # @return [undefined]
261
+ #
262
+ # @api private
263
+ def do_acl_changes
264
+ if access_controls.requires_changes?
265
+ converge_by(access_controls.describe_changes) do
266
+ access_controls.set_all
267
+ end
268
+ end
269
+ end
270
+
271
+ # Reads Access Control Settings on a file and writes them out to a
272
+ # resource, attempting to match the style used by the new resource, that
273
+ # is, if users are specified with usernames in new_resource, then the
274
+ # uids from stat will be looked up and usernames will be added to
275
+ # current_resource.
276
+ #
277
+ # @return [undefined]
278
+ #
279
+ # @api private
280
+ def load_resource_attributes_from_file(resource)
281
+ acl_scanner = Chef::ScanAccessControl.new(@new_resource, resource)
282
+ acl_scanner.set_all!
283
+ end
284
+
285
+ # Gather options to download file.
286
+ #
287
+ # @return [Array]
288
+ #
289
+ # @api private
290
+ def args(args = [])
291
+ args << "--out=#{::File.basename(r.path)}"
292
+ args << "--dir=#{::File.dirname(r.path)}"
293
+ args << "--checksum=sha-256=#{r.checksum}" if r.checksum
294
+ args << "--header='#{r.header}'" if r.header
295
+ args << "--check-certificate=#{r.check_cert}"
296
+ args << "--file-allocation=falloc"
297
+ args << "--max-connection-per-server=#{r.connections}"
298
+ args << r.source
299
+ end
300
+
301
+ # Command line executioner for running aria2.
302
+ #
303
+ # @return [undefined]
304
+ #
305
+ # @api private
306
+ def do_download
307
+ retrier(tries: 10, sleep: ->(n) { 4**n }) { installed?('aria2') }
308
+ cmd = [which('aria2c')] << args.flatten.join(' ')
309
+ Chef::Log.info shell_out!(cmd.flatten.join(' ')).stdout
310
+ end
311
+
312
+ # Backup the file before overwriting or replacing it unless
313
+ # `new_resource.backup` is `false`
314
+ #
315
+ # @return [undefined]
316
+ #
317
+ # @api private
318
+ def backup(file = nil)
319
+ Chef::Util::Backup.new(new_resource, file).backup!
320
+ end
321
+
322
+ def ready?
323
+ @ready.value
324
+ end
325
+
326
+ def make_ready
327
+ return true if @ready.value == true
328
+ @lock.with_write_lock { handle_prerequisites }
329
+ installed?('aria2c') ? @ready.make_true : @ready.make_false
330
+ end
331
+
332
+ def handle_prerequisites
333
+ package 'gnutls', :install
334
+ yumrepo :create
335
+ package 'aria2', :install
336
+ wipe_repo
337
+ end
338
+
339
+ def package(name, action = :nothing)
340
+ p = Chef::Resource::Package.new(name, run_context)
341
+ p.retries 30
342
+ p.retry_delay 10
343
+ p.run_action action
344
+ end
345
+
346
+ def yumrepo(action = :nothing)
347
+ y = Chef::Resource::YumRepository.new('garcon', run_context)
348
+ y.mirrorlist node[:garcon][:repo][:mirrorlist]
349
+ y.gpgcheck node[:garcon][:repo][:gpgcheck]
350
+ y.gpgkey node[:garcon][:repo][:gpgkey]
351
+ y.run_action action
352
+ end
353
+
354
+ def wipe_repo
355
+ # Seems Chef::Resource::YumRepository action :delete is foobared, so
356
+ # nuke the repo another way.
357
+ Future.execute do
358
+ ::File.unlink('/etc/yum.repos.d/garcon.repo')
359
+ shell_out!('yum clean all && yum -q makecache')
360
+ Chef::Provider::Package::Yum::YumCache.instance.reload
361
+ end
362
+ end
363
+ end
364
+ end
365
+ end
366
+
367
+ # Chef::Platform mapping for resource and providers
368
+ #
369
+ # @return [undefined]
370
+ #
371
+ # @api private.
372
+ Chef::Platform.set(
373
+ platform: :amazon,
374
+ resource: :download,
375
+ provider: Chef::Provider::Download
376
+ )
377
+
378
+ # Chef::Platform mapping for resource and providers
379
+ #
380
+ # @return [undefined]
381
+ #
382
+ # @api private.
383
+ Chef::Platform.set(
384
+ platform: :centos,
385
+ resource: :download,
386
+ provider: Chef::Provider::Download
387
+ )
388
+
389
+ # Chef::Platform mapping for resource and providers
390
+ #
391
+ # @return [undefined]
392
+ #
393
+ # @api private.
394
+ Chef::Platform.set(
395
+ platform: :oracle,
396
+ resource: :download,
397
+ provider: Chef::Provider::Download
398
+ )
399
+
400
+ # Chef::Platform mapping for resource and providers
401
+ #
402
+ # @return [undefined]
403
+ #
404
+ # @api private.
405
+ Chef::Platform.set(
406
+ platform: :redhat,
407
+ resource: :download,
408
+ provider: Chef::Provider::Download
409
+ )
410
+
411
+ # Chef::Platform mapping for resource and providers
412
+ #
413
+ # @return [undefined]
414
+ #
415
+ # @api private.
416
+ Chef::Platform.set(
417
+ platform: :scientific,
418
+ resource: :download,
419
+ provider: Chef::Provider::Download
420
+ )