cookstyle 5.4.13 → 5.5.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/cookstyle.yml +231 -129
- data/lib/cookstyle.rb +1 -0
- data/lib/cookstyle/version.rb +1 -1
- data/lib/rubocop/chef/cookbook_helpers.rb +67 -0
- data/lib/rubocop/cop/chef/correctness/block_guard_clause_string_only.rb +34 -31
- data/lib/rubocop/cop/chef/correctness/cb_depends_on_self.rb +16 -14
- data/lib/rubocop/cop/chef/correctness/default_maintainer_metadata.rb +22 -20
- data/lib/rubocop/cop/chef/correctness/insecure_cookbook_url.rb +32 -30
- data/lib/rubocop/cop/chef/correctness/invalid_license_string.rb +454 -453
- data/lib/rubocop/cop/chef/correctness/invalid_platform_metadata.rb +57 -57
- data/lib/rubocop/cop/chef/correctness/metadata_missing_name.rb +18 -16
- data/lib/rubocop/cop/chef/correctness/name_property_and_required.rb +61 -59
- data/lib/rubocop/cop/chef/correctness/node_normal.rb +29 -27
- data/lib/rubocop/cop/chef/correctness/node_normal_unless.rb +29 -27
- data/lib/rubocop/cop/chef/correctness/node_save.rb +46 -0
- data/lib/rubocop/cop/chef/correctness/ohai_default_recipe.rb +47 -0
- data/lib/rubocop/cop/chef/correctness/property_with_default_and_required.rb +35 -33
- data/lib/rubocop/cop/chef/correctness/property_with_name_attribute.rb +29 -27
- data/lib/rubocop/cop/chef/correctness/resource_sets_internal_properties.rb +52 -0
- data/lib/rubocop/cop/chef/correctness/resource_sets_name_property.rb +51 -0
- data/lib/rubocop/cop/chef/correctness/resource_with_none_action.rb +52 -0
- data/lib/rubocop/cop/chef/correctness/service_resource.rb +26 -24
- data/lib/rubocop/cop/chef/correctness/tmp_path.rb +30 -28
- data/lib/rubocop/cop/chef/deprecation/attribute_metadata.rb +22 -21
- data/lib/rubocop/cop/chef/deprecation/chef_rest.rb +56 -0
- data/lib/rubocop/cop/chef/deprecation/chocolatey_package_uninstall_action.rb +58 -0
- data/lib/rubocop/cop/chef/deprecation/conflicts_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/depends_compat_resource.rb +21 -19
- data/lib/rubocop/cop/chef/deprecation/depends_partial_search.rb +17 -15
- data/lib/rubocop/cop/chef/deprecation/depends_poise.rb +17 -15
- data/lib/rubocop/cop/chef/deprecation/deprecated_mixins.rb +39 -37
- data/lib/rubocop/cop/chef/deprecation/easy_install.rb +15 -13
- data/lib/rubocop/cop/chef/deprecation/epic_fail.rb +24 -22
- data/lib/rubocop/cop/chef/deprecation/erl_call.rb +15 -13
- data/lib/rubocop/cop/chef/deprecation/launchd_deprecated_hash_property.rb +55 -0
- data/lib/rubocop/cop/chef/deprecation/legacy_yum_cookbook_recipes.rb +24 -22
- data/lib/rubocop/cop/chef/deprecation/locale_lc_all_property.rb +45 -0
- data/lib/rubocop/cop/chef/deprecation/long_description_metadata.rb +21 -19
- data/lib/rubocop/cop/chef/deprecation/node_methods_not_attributes.rb +55 -53
- data/lib/rubocop/cop/chef/deprecation/node_set.rb +27 -25
- data/lib/rubocop/cop/chef/deprecation/node_set_unless.rb +27 -25
- data/lib/rubocop/cop/chef/deprecation/provides_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/replaces_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/require_recipe.rb +23 -21
- data/lib/rubocop/cop/chef/deprecation/suggests_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/use_inline_resources.rb +56 -0
- data/lib/rubocop/cop/chef/deprecation/user_supports_property.rb +53 -0
- data/lib/rubocop/cop/chef/deprecation/xml_ruby_recipe.rb +51 -0
- data/lib/rubocop/cop/chef/deprecation/yum_dnf_compat_recipe.rb +51 -0
- data/lib/rubocop/cop/chef/effortless/data_bags.rb +13 -11
- data/lib/rubocop/cop/chef/effortless/search_used.rb +13 -11
- data/lib/rubocop/cop/chef/modernize/apt_default_recipe.rb +22 -20
- data/lib/rubocop/cop/chef/modernize/berksfile_source.rb +31 -29
- data/lib/rubocop/cop/chef/modernize/build_essential.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/chef_14_resources.rb +27 -25
- data/lib/rubocop/cop/chef/modernize/defines_chefspec_matchers.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/execute_apt_update.rb +19 -17
- data/lib/rubocop/cop/chef/modernize/includes_mixin_shellout.rb +27 -25
- data/lib/rubocop/cop/chef/modernize/libarchive_file.rb +41 -0
- data/lib/rubocop/cop/chef/modernize/minitest_handler_usage.rb +21 -19
- data/lib/rubocop/cop/chef/modernize/powershell_expand_archive.rb +48 -0
- data/lib/rubocop/cop/chef/modernize/powershell_install_package.rb +51 -0
- data/lib/rubocop/cop/chef/modernize/powershell_install_windowsfeature.rb +54 -0
- data/lib/rubocop/cop/chef/modernize/resource_set_or_return.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/resource_with_allowed_actions.rb +77 -0
- data/lib/rubocop/cop/chef/modernize/resource_with_attributes.rb +37 -35
- data/lib/rubocop/cop/chef/modernize/respond_to_metadata.rb +54 -0
- data/lib/rubocop/cop/chef/modernize/respond_to_provides.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/respond_to_resource_name.rb +26 -24
- data/lib/rubocop/cop/chef/{effortless/node_save.rb → modernize/seven_zip_archive.rb} +16 -16
- data/lib/rubocop/cop/chef/modernize/shellouts_to_chocolatey.rb +59 -0
- data/lib/rubocop/cop/chef/modernize/whyrun_supported_true.rb +20 -18
- data/lib/rubocop/cop/chef/modernize/windows_default_recipe.rb +23 -21
- data/lib/rubocop/cop/chef/modernize/windows_version_helper.rb +20 -18
- data/lib/rubocop/cop/chef/modernize/windows_zipfile.rb +15 -13
- data/lib/rubocop/cop/chef/style/attribute_keys.rb +59 -57
- data/lib/rubocop/cop/chef/style/comment_sentence_spacing.rb +14 -12
- data/lib/rubocop/cop/chef/style/comments_copyright_format.rb +65 -63
- data/lib/rubocop/cop/chef/style/comments_format.rb +48 -45
- data/lib/rubocop/cop/chef/style/file_mode.rb +32 -30
- metadata +24 -9
- data/lib/rubocop/cop/chef/deprecation/respond_to_metadata.rb +0 -53
- data/lib/rubocop/cop/chef/modernize/ohai_default_recipe.rb +0 -45
- data/lib/rubocop/cop/chef/modernize/resource_with_allowed_action.rb +0 -75
- data/lib/rubocop/cop/chef/modernize/use_inline_resources.rb +0 -54
- data/lib/rubocop/cop/chef/modernize/xml_ruby_recipe.rb +0 -49
- data/lib/rubocop/cop/chef/modernize/yum_dnf_compat_recipe.rb +0 -49
@@ -0,0 +1,47 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2019, Chef Software, Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module RuboCop
|
18
|
+
module Cop
|
19
|
+
module Chef
|
20
|
+
module ChefCorrectness
|
21
|
+
# The Ohai default recipe previously allowed a user to ship custom Ohai plugins to a system by including them
|
22
|
+
# in a directory in the Ohai cookbook. This functionality was replaced with the ohai_plugin resource, which
|
23
|
+
# should be used instead as it doesn't require forking the ohai cookbook.
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
#
|
27
|
+
# # bad
|
28
|
+
# include_recipe 'ohai::default'
|
29
|
+
# include_recipe 'ohai'
|
30
|
+
#
|
31
|
+
class IncludingOhaiDefaultRecipe < Cop
|
32
|
+
MSG = "Use the ohai_plugin resource to ship custom Ohai plugins instead of using the ohai::default recipe. If you're not shipping custom Ohai plugins, then you can remove this recipe entirely".freeze
|
33
|
+
|
34
|
+
def_node_matcher :ohai_recipe_usage?, <<-PATTERN
|
35
|
+
(send nil? :include_recipe (str {"ohai" "ohai::default"}))
|
36
|
+
PATTERN
|
37
|
+
|
38
|
+
def on_send(node)
|
39
|
+
ohai_recipe_usage?(node) do
|
40
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -17,49 +17,51 @@
|
|
17
17
|
module RuboCop
|
18
18
|
module Cop
|
19
19
|
module Chef
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
20
|
+
module ChefCorrectness
|
21
|
+
# When using properties in a custom resource you shouldn't set a property to
|
22
|
+
# required and then provide a default value. If a property is required the
|
23
|
+
# user will always pass in a value and the default will never be used. In Chef
|
24
|
+
# Infra Client 13+ this became an error.
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
#
|
28
|
+
# # bad
|
29
|
+
# property :bob, String, required: true, default: 'foo'
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# property :bob, String, required: true
|
33
|
+
#
|
34
|
+
class PropertyWithRequiredAndDefault < Cop
|
35
|
+
MSG = 'Resource property should not be both required and have a default value. This will fail on Chef Infra Client 13+'.freeze
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
def on_send(node)
|
38
|
+
if required_property?(node) && property_has_default?(node)
|
39
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
40
|
+
end
|
39
41
|
end
|
40
|
-
end
|
41
42
|
|
42
|
-
|
43
|
+
private
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
45
|
+
def required_property?(node)
|
46
|
+
if node.method_name == :property
|
47
|
+
node.arguments.each do |arg|
|
48
|
+
if arg.type == :hash
|
49
|
+
return true if arg.source.match?(/required:\s*true/)
|
50
|
+
end
|
49
51
|
end
|
52
|
+
false # no required: true found
|
50
53
|
end
|
51
|
-
false # no required: true found
|
52
54
|
end
|
53
|
-
end
|
54
55
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
def property_has_default?(node)
|
57
|
+
if node.method_name == :property
|
58
|
+
node.arguments.each do |arg|
|
59
|
+
if arg.type == :hash
|
60
|
+
return true if arg.source.match?(/default:/)
|
61
|
+
end
|
60
62
|
end
|
63
|
+
false # no default: found
|
61
64
|
end
|
62
|
-
false # no default: found
|
63
65
|
end
|
64
66
|
end
|
65
67
|
end
|
@@ -17,40 +17,42 @@
|
|
17
17
|
module RuboCop
|
18
18
|
module Cop
|
19
19
|
module Chef
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
20
|
+
module ChefCorrectness
|
21
|
+
# When using properties in a custom resource you should use name_property not
|
22
|
+
# the legacy name_attribute from the days of attributes
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# property :bob, String, name_attribute: true
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# property :bob, String, name_property: true
|
31
|
+
#
|
32
|
+
class PropertyWithNameAttribute < Cop
|
33
|
+
MSG = 'Resource property sets name_attribute not name_property'.freeze
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
def on_send(node)
|
36
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor) if attribute_method_mix?(node)
|
37
|
+
end
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
39
|
+
def autocorrect(node)
|
40
|
+
lambda do |corrector|
|
41
|
+
corrector.replace(node.loc.expression, node.source.gsub('name_attribute', 'name_property'))
|
42
|
+
end
|
41
43
|
end
|
42
|
-
end
|
43
44
|
|
44
|
-
|
45
|
+
private
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
47
|
+
def attribute_method_mix?(node)
|
48
|
+
if node.method_name == :property
|
49
|
+
node.arguments.each do |arg|
|
50
|
+
if arg.type == :hash
|
51
|
+
return true if arg.source.match?(/name_attribute:/)
|
52
|
+
end
|
51
53
|
end
|
54
|
+
false # no name_attribute found
|
52
55
|
end
|
53
|
-
false # no name_attribute found
|
54
56
|
end
|
55
57
|
end
|
56
58
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module RuboCop
|
18
|
+
module Cop
|
19
|
+
module Chef
|
20
|
+
module ChefCorrectness
|
21
|
+
# Chef Infra Client uses properties in several resources to track state. These
|
22
|
+
# should not be set in recipes as they break the internal workings of the Chef
|
23
|
+
# Infra Client
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
#
|
27
|
+
# # bad
|
28
|
+
# service 'foo' do
|
29
|
+
# running true
|
30
|
+
# action [:start, :enable]
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# # good
|
34
|
+
# service 'foo' do
|
35
|
+
# action [:start, :enable]
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
class ResourceSetsInternalProperties < Cop
|
39
|
+
include RuboCop::Chef::CookbookHelpers
|
40
|
+
|
41
|
+
MSG = 'Do not set properties used internally by Chef Infra Client to track the system state.'.freeze
|
42
|
+
|
43
|
+
def on_block(node)
|
44
|
+
match_property_in_resource?(:service, 'running', node) do |prop|
|
45
|
+
add_offense(prop, location: :expression, message: MSG, severity: :refactor)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
module RuboCop
|
19
|
+
module Cop
|
20
|
+
module Chef
|
21
|
+
module ChefCorrectness
|
22
|
+
# Use name properties instead of setting the name property in a resource. Setting the name property
|
23
|
+
# directly causes notification and reporting issues.
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
#
|
27
|
+
# # bad
|
28
|
+
# service 'foo' do
|
29
|
+
# name 'bar'
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# service 'foo' do
|
34
|
+
# service_name 'bar'
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
class ResourceSetsNameProperty < Cop
|
38
|
+
include RuboCop::Chef::CookbookHelpers
|
39
|
+
|
40
|
+
MSG = 'Resource sets the name property in the resource instead of using a name_property.'.freeze
|
41
|
+
|
42
|
+
def on_block(node)
|
43
|
+
match_property_in_resource?(nil, 'name', node) do |name_node|
|
44
|
+
add_offense(name_node, location: :expression, message: MSG, severity: :refactor)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
module RuboCop
|
19
|
+
module Cop
|
20
|
+
module Chef
|
21
|
+
module ChefCorrectness
|
22
|
+
# The :nothing action is often typo'd as :none
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# service 'foo' do
|
28
|
+
# action :none
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# service 'foo' do
|
33
|
+
# action :nothing
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
class ResourceWithNoneAction < Cop
|
37
|
+
include RuboCop::Chef::CookbookHelpers
|
38
|
+
|
39
|
+
MSG = 'Resource uses the nonexistent :none action instead of the :nothing action'.freeze
|
40
|
+
|
41
|
+
def on_block(node)
|
42
|
+
match_property_in_resource?(nil, 'action', node) do |action_node|
|
43
|
+
action_node.arguments.each do |action|
|
44
|
+
add_offense(action, location: :expression, message: MSG, severity: :refactor) if action.source == ':none'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -17,35 +17,37 @@
|
|
17
17
|
module RuboCop
|
18
18
|
module Cop
|
19
19
|
module Chef
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
20
|
+
module ChefCorrectness
|
21
|
+
# Use a service resource to start and stop services
|
22
|
+
#
|
23
|
+
# @example when command starts a service
|
24
|
+
#
|
25
|
+
# # bad
|
26
|
+
# command "/etc/init.d/mysql start"
|
27
|
+
# command "/sbin/service/memcached start"
|
28
|
+
#
|
29
|
+
class ServiceResource < Cop
|
30
|
+
MSG = 'Use a service resource to start and stop services'.freeze
|
30
31
|
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
def_node_matcher :execute_command?, <<-PATTERN
|
33
|
+
(send nil? :command $str)
|
34
|
+
PATTERN
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
def on_send(node)
|
37
|
+
execute_command?(node) do |command|
|
38
|
+
if starts_service?(command)
|
39
|
+
add_offense(command, location: :expression, message: MSG, severity: :refactor)
|
40
|
+
end
|
39
41
|
end
|
40
42
|
end
|
41
|
-
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
def starts_service?(cmd)
|
45
|
+
cmd_str = cmd.to_s
|
46
|
+
(cmd_str.include?('/etc/init.d') || ['service ', '/sbin/service ',
|
47
|
+
'start ', 'stop ', 'invoke-rc.d '].any? do |service_cmd|
|
48
|
+
cmd_str.start_with?(service_cmd)
|
49
|
+
end) && %w(start stop restart reload).any? { |a| cmd_str.include?(a) }
|
50
|
+
end
|
49
51
|
end
|
50
52
|
end
|
51
53
|
end
|
@@ -17,40 +17,42 @@
|
|
17
17
|
module RuboCop
|
18
18
|
module Cop
|
19
19
|
module Chef
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
20
|
+
module ChefCorrectness
|
21
|
+
# Use file_cache_path rather than hard-coding tmp paths
|
22
|
+
#
|
23
|
+
# @example downloading a large file into /tmp/
|
24
|
+
#
|
25
|
+
# # bad
|
26
|
+
# remote_file '/tmp/large-file.tar.gz' do
|
27
|
+
#
|
28
|
+
# # good
|
29
|
+
# remote_file "#{Chef::Config[:file_cache_path]}/large-file.tar.gz" do
|
30
|
+
#
|
31
|
+
#
|
32
|
+
class TmpPath < Cop
|
33
|
+
MSG = 'Use file_cache_path rather than hard-coding tmp paths'.freeze
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
def_node_matcher :remote_file?, <<-PATTERN
|
36
|
+
(send nil? :remote_file $str)
|
37
|
+
PATTERN
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
def on_send(node)
|
40
|
+
remote_file?(node) do |command|
|
41
|
+
if hardcoded_tmp?(command) && !file_cache_path?(command)
|
42
|
+
add_offense(command, location: :expression, message: MSG, severity: :refactor)
|
43
|
+
end
|
42
44
|
end
|
43
45
|
end
|
44
|
-
end
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
def hardcoded_tmp?(path)
|
48
|
+
path_str = path.to_s.scan(/"(.*)"/)[0][0]
|
49
|
+
path_str.start_with?('/tmp/')
|
50
|
+
end
|
50
51
|
|
51
|
-
|
52
|
-
|
53
|
-
|
52
|
+
def file_cache_path?(path)
|
53
|
+
path_str = path.to_s.scan(/"(.*)"/)[0][0]
|
54
|
+
path_str.start_with?("\#\{Chef::Config[:file_cache_path]\}")
|
55
|
+
end
|
54
56
|
end
|
55
57
|
end
|
56
58
|
end
|