cookstyle 5.4.13 → 5.5.7
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 +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
|