chef 12.17.44-universal-mingw32 → 12.18.31-universal-mingw32

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 (178) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -1
  3. data/README.md +3 -2
  4. data/Rakefile +9 -0
  5. data/VERSION +1 -1
  6. data/acceptance/Gemfile.lock +17 -17
  7. data/distro/common/html/knife_environment.html +4 -8
  8. data/distro/common/man/man1/knife-environment.1 +4 -16
  9. data/distro/powershell/chef/chef.psm1 +139 -24
  10. data/lib/chef/application.rb +5 -4
  11. data/lib/chef/application/windows_service_manager.rb +6 -4
  12. data/lib/chef/chef_fs/chef_fs_data_store.rb +1 -1
  13. data/lib/chef/chef_fs/command_line.rb +1 -1
  14. data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +8 -1
  15. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +1 -1
  16. data/lib/chef/chef_fs/file_system/repository/nodes_dir.rb +1 -1
  17. data/lib/chef/cookbook/chefignore.rb +1 -1
  18. data/lib/chef/cookbook/cookbook_version_loader.rb +4 -4
  19. data/lib/chef/cookbook/metadata.rb +2 -2
  20. data/lib/chef/cookbook_loader.rb +1 -1
  21. data/lib/chef/data_collector.rb +24 -13
  22. data/lib/chef/data_collector/messages.rb +8 -6
  23. data/lib/chef/data_collector/messages/helpers.rb +1 -1
  24. data/lib/chef/deprecated.rb +30 -0
  25. data/lib/chef/dsl/platform_introspection.rb +2 -2
  26. data/lib/chef/encrypted_data_bag_item.rb +1 -1
  27. data/lib/chef/encrypted_data_bag_item/decryptor.rb +2 -2
  28. data/lib/chef/environment.rb +1 -1
  29. data/lib/chef/exceptions.rb +5 -5
  30. data/lib/chef/file_access_control/unix.rb +5 -5
  31. data/lib/chef/formatters/error_description.rb +1 -1
  32. data/lib/chef/http/basic_client.rb +1 -1
  33. data/lib/chef/http/json_input.rb +2 -2
  34. data/lib/chef/knife.rb +1 -1
  35. data/lib/chef/knife/cookbook_site_install.rb +1 -1
  36. data/lib/chef/knife/core/cookbook_scm_repo.rb +1 -1
  37. data/lib/chef/knife/core/ui.rb +1 -1
  38. data/lib/chef/mixin/command.rb +1 -0
  39. data/lib/chef/mixin/deep_merge.rb +1 -1
  40. data/lib/chef/mixin/shell_out.rb +58 -3
  41. data/lib/chef/mixin/which.rb +5 -9
  42. data/lib/chef/mixin/wide_string.rb +1 -1
  43. data/lib/chef/node.rb +1 -1
  44. data/lib/chef/node/attribute.rb +4 -5
  45. data/lib/chef/node_map.rb +18 -2
  46. data/lib/chef/platform/provider_handler_map.rb +2 -2
  47. data/lib/chef/platform/provider_mapping.rb +5 -0
  48. data/lib/chef/platform/resource_handler_map.rb +2 -2
  49. data/lib/chef/provider/env/windows.rb +1 -1
  50. data/lib/chef/provider/git.rb +1 -1
  51. data/lib/chef/provider/group.rb +41 -46
  52. data/lib/chef/provider/group/aix.rb +12 -19
  53. data/lib/chef/provider/group/dscl.rb +46 -43
  54. data/lib/chef/provider/group/gpasswd.rb +7 -7
  55. data/lib/chef/provider/group/groupadd.rb +29 -34
  56. data/lib/chef/provider/group/groupmod.rb +26 -31
  57. data/lib/chef/provider/group/pw.rb +28 -31
  58. data/lib/chef/provider/group/suse.rb +9 -9
  59. data/lib/chef/provider/group/usermod.rb +10 -11
  60. data/lib/chef/provider/group/windows.rb +18 -20
  61. data/lib/chef/provider/ifconfig.rb +52 -63
  62. data/lib/chef/provider/ifconfig/aix.rb +23 -28
  63. data/lib/chef/provider/ifconfig/debian.rb +23 -22
  64. data/lib/chef/provider/ifconfig/redhat.rb +12 -12
  65. data/lib/chef/provider/mount/mount.rb +1 -1
  66. data/lib/chef/provider/osx_profile.rb +4 -2
  67. data/lib/chef/provider/package.rb +16 -7
  68. data/lib/chef/provider/package/chocolatey.rb +3 -1
  69. data/lib/chef/provider/package/dnf.rb +183 -0
  70. data/lib/chef/provider/package/dnf/dnf_helper.py +91 -0
  71. data/lib/chef/provider/package/dnf/python_helper.rb +120 -0
  72. data/lib/chef/provider/package/dnf/version.rb +56 -0
  73. data/lib/chef/provider/package/easy_install.rb +1 -1
  74. data/lib/chef/provider/package/freebsd/base.rb +1 -1
  75. data/lib/chef/provider/package/freebsd/pkgng.rb +1 -1
  76. data/lib/chef/provider/package/powershell.rb +3 -3
  77. data/lib/chef/provider/package/windows.rb +1 -1
  78. data/lib/chef/provider/package/zypper.rb +1 -1
  79. data/lib/chef/provider/route.rb +186 -184
  80. data/lib/chef/provider/service/arch.rb +2 -2
  81. data/lib/chef/provider/service/freebsd.rb +1 -1
  82. data/lib/chef/provider/service/gentoo.rb +2 -2
  83. data/lib/chef/provider/service/insserv.rb +2 -2
  84. data/lib/chef/provider/service/macosx.rb +2 -2
  85. data/lib/chef/provider/service/openbsd.rb +1 -1
  86. data/lib/chef/provider/service/redhat.rb +2 -2
  87. data/lib/chef/provider/support/yum_repo.erb +10 -3
  88. data/lib/chef/provider/user.rb +17 -20
  89. data/lib/chef/provider/user/aix.rb +23 -24
  90. data/lib/chef/provider/user/dscl.rb +56 -53
  91. data/lib/chef/provider/user/linux.rb +13 -16
  92. data/lib/chef/provider/user/pw.rb +26 -30
  93. data/lib/chef/provider/user/solaris.rb +11 -12
  94. data/lib/chef/provider/user/useradd.rb +20 -22
  95. data/lib/chef/provider/user/windows.rb +19 -22
  96. data/lib/chef/provider_resolver.rb +4 -2
  97. data/lib/chef/providers.rb +1 -0
  98. data/lib/chef/resource.rb +7 -0
  99. data/lib/chef/resource/chocolatey_package.rb +1 -0
  100. data/lib/chef/resource/dnf_package.rb +64 -0
  101. data/lib/chef/resource/file/verification.rb +6 -4
  102. data/lib/chef/resource/yum_package.rb +18 -14
  103. data/lib/chef/resource/yum_repository.rb +1 -1
  104. data/lib/chef/resource_reporter.rb +11 -0
  105. data/lib/chef/resources.rb +1 -0
  106. data/lib/chef/scan_access_control.rb +4 -4
  107. data/lib/chef/util/dsc/resource_store.rb +1 -1
  108. data/lib/chef/version.rb +1 -1
  109. data/lib/chef/win32/memory.rb +1 -1
  110. data/lib/chef/win32/security.rb +2 -2
  111. data/lib/chef/win32/security/sid.rb +2 -2
  112. data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.i686.rpm +0 -0
  113. data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.src.rpm +0 -0
  114. data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.x86_64.rpm +0 -0
  115. data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.i686.rpm +0 -0
  116. data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.src.rpm +0 -0
  117. data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.x86_64.rpm +0 -0
  118. data/spec/functional/assets/yumrepo/repodata/313329137b55fd333b2dc66394a6661a2befa6cc535d8460d92a4a78a9c581f0-primary.sqlite.bz2 +0 -0
  119. data/spec/functional/assets/yumrepo/repodata/31ac4db5d5ac593728fcc26aef82b7b93c4cc4dbec843786b1845b939b658553-other.xml.gz +0 -0
  120. data/spec/functional/assets/yumrepo/repodata/4ac40fa3c6728c1401318e2e20a997436624e83dcf7a5f952b851ef422637773-filelists.sqlite.bz2 +0 -0
  121. data/spec/functional/assets/yumrepo/repodata/66391e53f0510b98b3f0b79f40ba1048026d9a1ef20905d9c40ba6f5411f3243-primary.xml.gz +0 -0
  122. data/spec/functional/assets/yumrepo/repodata/8b34697595fcc87928e12d24644dda9462c3857bd932861e28bc77ae1f31be16-filelists.xml.gz +0 -0
  123. data/spec/functional/assets/yumrepo/repodata/b97cca3fe14bcf06c52be4449b6108f7731239ff221111dcce8aada5467f60dc-other.sqlite.bz2 +0 -0
  124. data/spec/functional/assets/yumrepo/repodata/repomd.xml +55 -0
  125. data/spec/functional/resource/dnf_package_spec.rb +686 -0
  126. data/spec/functional/resource/dsc_script_spec.rb +1 -0
  127. data/spec/functional/resource/user/useradd_spec.rb +10 -1
  128. data/spec/integration/knife/chef_repo_path_spec.rb +2 -2
  129. data/spec/integration/recipes/recipe_dsl_spec.rb +3 -0
  130. data/spec/integration/recipes/resource_load_spec.rb +3 -3
  131. data/spec/spec_helper.rb +5 -3
  132. data/spec/support/lib/chef/provider/snakeoil.rb +1 -0
  133. data/spec/support/lib/chef/resource/cat.rb +1 -0
  134. data/spec/support/lib/chef/resource/one_two_three_four.rb +1 -0
  135. data/spec/support/lib/chef/resource/openldap_includer.rb +2 -0
  136. data/spec/support/lib/chef/resource/with_state.rb +2 -0
  137. data/spec/support/lib/chef/resource/zen_master.rb +1 -0
  138. data/spec/unit/cookbook/metadata_spec.rb +3 -3
  139. data/spec/unit/data_collector/messages/helpers_spec.rb +7 -0
  140. data/spec/unit/data_collector_spec.rb +56 -0
  141. data/spec/unit/decorator/lazy_spec.rb +1 -1
  142. data/spec/unit/environment_spec.rb +1 -1
  143. data/spec/unit/lwrp_spec.rb +3 -4
  144. data/spec/unit/node_spec.rb +23 -2
  145. data/spec/unit/platform_spec.rb +1 -0
  146. data/spec/unit/provider/group/dscl_spec.rb +29 -29
  147. data/spec/unit/provider/group/gpasswd_spec.rb +10 -10
  148. data/spec/unit/provider/group/groupadd_spec.rb +31 -30
  149. data/spec/unit/provider/group/groupmod_spec.rb +16 -16
  150. data/spec/unit/provider/group/pw_spec.rb +11 -11
  151. data/spec/unit/provider/group/suse_spec.rb +5 -5
  152. data/spec/unit/provider/group/usermod_spec.rb +15 -15
  153. data/spec/unit/provider/ifconfig/aix_spec.rb +14 -14
  154. data/spec/unit/provider/ifconfig/debian_spec.rb +10 -22
  155. data/spec/unit/provider/ifconfig/redhat_spec.rb +4 -4
  156. data/spec/unit/provider/ifconfig_spec.rb +18 -19
  157. data/spec/unit/provider/package/chocolatey_spec.rb +21 -21
  158. data/spec/unit/provider/package/msu_spec.rb +1 -1
  159. data/spec/unit/provider/route_spec.rb +21 -21
  160. data/spec/unit/provider/user/dscl_spec.rb +54 -57
  161. data/spec/unit/provider/user/linux_spec.rb +5 -5
  162. data/spec/unit/provider/user/pw_spec.rb +26 -22
  163. data/spec/unit/provider/user/windows_spec.rb +4 -4
  164. data/spec/unit/provider/user_spec.rb +19 -21
  165. data/spec/unit/provider_resolver_spec.rb +1 -0
  166. data/spec/unit/resource/chocolatey_package_spec.rb +12 -0
  167. data/spec/unit/resource/dnf_package_spec.rb +99 -0
  168. data/spec/unit/resource/remote_file_spec.rb +2 -2
  169. data/spec/unit/resource/yum_package_spec.rb +20 -0
  170. data/spec/unit/resource_reporter_spec.rb +24 -0
  171. data/spec/unit/resource_spec.rb +2 -0
  172. data/spec/unit/runner_spec.rb +1 -0
  173. data/tasks/bin/bundle-platform +1 -1
  174. data/tasks/gemfile_util.rb +2 -2
  175. data/tasks/templates/prerelease.md.erb +1 -10
  176. data/tasks/templates/release.md.erb +1 -9
  177. metadata +24 -5
  178. data/lib/chef/platform/handler_map.rb +0 -40
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env python3
2
+ # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
3
+
4
+ import sys
5
+ import dnf
6
+ import hawkey
7
+ import signal
8
+ import os
9
+ import json
10
+
11
+ base = None
12
+
13
+ def get_sack():
14
+ global base
15
+ if base is None:
16
+ base = dnf.Base()
17
+ base.read_all_repos()
18
+ base.fill_sack()
19
+ return base.sack
20
+
21
+ # FIXME: leaks memory and does not work
22
+ def flushcache():
23
+ try:
24
+ os.remove('/var/cache/dnf/@System.solv')
25
+ except OSError:
26
+ pass
27
+ get_sack().load_system_repo(build_cache=True)
28
+
29
+ def query(command):
30
+ sack = get_sack()
31
+
32
+ subj = dnf.subject.Subject(command['provides'])
33
+ q = subj.get_best_query(sack, with_provides=True)
34
+
35
+ if command['action'] == "whatinstalled":
36
+ q = q.installed()
37
+
38
+ if command['action'] == "whatavailable":
39
+ q = q.available()
40
+
41
+ if 'epoch' in command:
42
+ q = q.filterm(epoch=int(command['epoch']))
43
+ if 'version' in command:
44
+ q = q.filterm(version__glob=command['version'])
45
+ if 'release' in command:
46
+ q = q.filterm(release__glob=command['release'])
47
+
48
+ if 'arch' in command:
49
+ q = q.filterm(arch__glob=command['arch'])
50
+
51
+ # only apply the default arch query filter if it returns something
52
+ archq = q.filter(arch=[ 'noarch', hawkey.detect_arch() ])
53
+ if len(archq.run()) > 0:
54
+ q = archq
55
+
56
+ pkgs = dnf.query.latest_limit_pkgs(q, 1)
57
+
58
+ if not pkgs:
59
+ sys.stdout.write('{} nil nil\n'.format(command['provides'].split().pop(0)))
60
+ else:
61
+ # make sure we picked the package with the highest version
62
+ pkgs.sort
63
+ pkg = pkgs.pop()
64
+ sys.stdout.write('{} {}:{}-{} {}\n'.format(pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch))
65
+
66
+ # the design of this helper is that it should try to be 'brittle' and fail hard and exit in order
67
+ # to keep process tables clean. additional error handling should probably be added to the retry loop
68
+ # on the ruby side.
69
+ def exit_handler(signal, frame):
70
+ sys.exit(0)
71
+
72
+ signal.signal(signal.SIGINT, exit_handler)
73
+ signal.signal(signal.SIGHUP, exit_handler)
74
+ signal.signal(signal.SIGPIPE, exit_handler)
75
+ signal.signal(signal.SIGCHLD, exit_handler)
76
+
77
+ while 1:
78
+ # kill self if we get orphaned (tragic)
79
+ ppid = os.getppid()
80
+ if ppid == 1:
81
+ sys.exit(0)
82
+ line = sys.stdin.readline()
83
+ command = json.loads(line)
84
+ if command['action'] == "whatinstalled":
85
+ query(command)
86
+ elif command['action'] == "whatavailable":
87
+ query(command)
88
+ elif command['action'] == "flushcache":
89
+ flushcache()
90
+ else:
91
+ raise RuntimeError("bad command")
@@ -0,0 +1,120 @@
1
+ #
2
+ # Copyright:: Copyright 2016, Chef Software, Inc.
3
+ # License:: Apache License, Version 2.0
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
+ require "chef/provider/package/dnf/version"
19
+ require "timeout"
20
+
21
+ class Chef
22
+ class Provider
23
+ class Package
24
+ class Dnf < Chef::Provider::Package
25
+ class PythonHelper
26
+ include Singleton
27
+ extend Chef::Mixin::Which
28
+
29
+ attr_accessor :stdin
30
+ attr_accessor :stdout
31
+ attr_accessor :stderr
32
+ attr_accessor :wait_thr
33
+
34
+ DNF_HELPER = ::File.expand_path(::File.join(::File.dirname(__FILE__), "dnf_helper.py")).freeze
35
+ DNF_COMMAND = "#{which("python3")} #{DNF_HELPER}"
36
+
37
+ def start
38
+ ENV["PYTHONUNBUFFERED"] = "1"
39
+ @stdin, @stdout, @stderr, @wait_thr = Open3.popen3(DNF_COMMAND)
40
+ end
41
+
42
+ def reap
43
+ unless wait_thr.nil?
44
+ Process.kill("KILL", wait_thr.pid) rescue nil
45
+ stdin.close unless stdin.nil?
46
+ stdout.close unless stdout.nil?
47
+ stderr.close unless stderr.nil?
48
+ wait_thr.value # this calls waitpit()
49
+ end
50
+ end
51
+
52
+ def check
53
+ start if stdin.nil?
54
+ end
55
+
56
+ # i couldn't figure out how to decompose an evr on the python side, it seems reasonably
57
+ # painless to do it in ruby (generally massaging nevras in the ruby side is HIGHLY
58
+ # discouraged -- this is an "every rule has an exception" exception -- any additional
59
+ # functionality should probably trigger moving this regexp logic into python)
60
+ def add_version(hash, version)
61
+ epoch = nil
62
+ if version =~ /(\S+):(\S+)/
63
+ epoch, version = $1, $2
64
+ end
65
+ if version =~ /(\S+)-(\S+)/
66
+ version, release = $1, $2
67
+ end
68
+ hash["epoch"] = epoch unless epoch.nil?
69
+ hash["release"] = release unless release.nil?
70
+ hash["version"] = version
71
+ end
72
+
73
+ def build_query(action, provides, version, arch)
74
+ hash = { "action" => action }
75
+ hash["provides"] = provides
76
+ add_version(hash, version) unless version.nil?
77
+ hash["arch" ] = arch unless arch.nil?
78
+ FFI_Yajl::Encoder.encode(hash)
79
+ end
80
+
81
+ def parse_response(output)
82
+ array = output.split.map { |x| x == "nil" ? nil : x }
83
+ array.each_slice(3).map { |x| Version.new(*x) }.first
84
+ end
85
+
86
+ # @returns Array<Version>
87
+ def query(action, provides, version = nil, arch = nil)
88
+ with_helper do
89
+ json = build_query(action, provides, version, arch)
90
+ Chef::Log.debug "sending '#{json}' to python helper"
91
+ stdin.syswrite json + "\n"
92
+ output = stdout.sysread(4096).chomp
93
+ Chef::Log.debug "got '#{output}' from python helper"
94
+ version = parse_response(output)
95
+ Chef::Log.debug "parsed #{version} from python helper"
96
+ version
97
+ end
98
+ end
99
+
100
+ def restart
101
+ reap
102
+ start
103
+ end
104
+
105
+ def with_helper
106
+ max_retries ||= 5
107
+ Timeout.timeout(600) do
108
+ check
109
+ yield
110
+ end
111
+ rescue EOFError, Errno::EPIPE, Timeout::Error, Errno::ESRCH => e
112
+ raise e unless ( max_retries -= 1 ) > 0
113
+ restart
114
+ retry
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,56 @@
1
+ #
2
+ # Copyright:: Copyright 2016, Chef Software, Inc.
3
+ # License:: Apache License, Version 2.0
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
+ class Chef
19
+ class Provider
20
+ class Package
21
+ class Dnf < Chef::Provider::Package
22
+
23
+ # helper class to assist in passing around name/version/arch triples
24
+ class Version
25
+ attr_accessor :name
26
+ attr_accessor :version
27
+ attr_accessor :arch
28
+
29
+ def initialize(name, version, arch)
30
+ @name = name
31
+ @version = version
32
+ @arch = arch
33
+ end
34
+
35
+ def to_s
36
+ "#{name}-#{version}.#{arch}"
37
+ end
38
+
39
+ def version_with_arch
40
+ "#{version}.#{arch}" unless version.nil?
41
+ end
42
+
43
+ def matches_name_and_arch?(other)
44
+ other.version == version && other.arch == arch
45
+ end
46
+
47
+ def ==(other)
48
+ name == other.name && version == other.version && arch == other.arch
49
+ end
50
+
51
+ alias_method :eql?, :==
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -122,7 +122,7 @@ class Chef
122
122
 
123
123
  def remove_package(name, version)
124
124
  Chef.deprecated(:easy_install, "The easy_install package provider is deprecated and will be removed in Chef 13.")
125
- run_command(:command => "#{easy_install_binary_path }#{expand_options(@new_resource.options)} -m #{name}")
125
+ run_command(:command => "#{easy_install_binary_path}#{expand_options(@new_resource.options)} -m #{name}")
126
126
  end
127
127
 
128
128
  def purge_package(name, version)
@@ -58,7 +58,7 @@ class Chef
58
58
  def makefile_variable_value(variable, dir = nil)
59
59
  options = dir ? { :cwd => dir } : {}
60
60
  make_v = shell_out_with_timeout!("make -V #{variable}", options.merge!(:env => nil, :returns => [0, 1]))
61
- make_v.exitstatus.zero? ? make_v.stdout.strip.split($\).first : nil # $\ is the line separator, i.e. newline.
61
+ make_v.exitstatus == 0 ? make_v.stdout.strip.split($\).first : nil # $\ is the line separator, i.e. newline.
62
62
  end
63
63
  end
64
64
 
@@ -64,7 +64,7 @@ class Chef
64
64
  end
65
65
 
66
66
  pkg_query = shell_out_with_timeout!("pkg rquery#{expand_options(options)} '%v' #{@new_resource.package_name}", :env => nil)
67
- pkg_query.exitstatus.zero? ? pkg_query.stdout.strip.split(/\n/).last : nil
67
+ pkg_query.exitstatus == 0 ? pkg_query.stdout.strip.split(/\n/).last : nil
68
68
  end
69
69
 
70
70
  def repo_regex
@@ -60,7 +60,7 @@ class Chef
60
60
  # Removes the package for the version passed and if no version is passed, then all installed versions of the package are removed
61
61
  def remove_package(names, versions)
62
62
  names.each_with_index do |name, index|
63
- if versions && versions[index] != nil
63
+ if versions && !versions[index].nil?
64
64
  powershell_out( "Uninstall-Package '#{name}' -Force -ForceBootstrap -RequiredVersion #{versions[index]}", { :timeout => @new_resource.timeout })
65
65
  else
66
66
  version = "0"
@@ -78,7 +78,7 @@ class Chef
78
78
  def build_candidate_versions
79
79
  versions = []
80
80
  new_resource.package_name.each_with_index do |name, index|
81
- if new_resource.version && new_resource.version[index] != nil
81
+ if new_resource.version && !new_resource.version[index].nil?
82
82
  version = powershell_out("(Find-Package '#{name}' -RequiredVersion #{new_resource.version[index]} -ForceBootstrap -Force | select version | Format-Table -HideTableHeaders | Out-String).Trim()", { :timeout => @new_resource.timeout }).stdout.strip()
83
83
  else
84
84
  version = powershell_out("(Find-Package '#{name}' -ForceBootstrap -Force | select version | Format-Table -HideTableHeaders | Out-String).Trim()", { :timeout => @new_resource.timeout }).stdout.strip()
@@ -95,7 +95,7 @@ class Chef
95
95
  def build_current_versions
96
96
  version_list = []
97
97
  new_resource.package_name.each_with_index do |name, index|
98
- if new_resource.version && new_resource.version[index] != nil
98
+ if new_resource.version && !new_resource.version[index].nil?
99
99
  version = powershell_out("(Get-Package -Name '#{name}' -RequiredVersion #{new_resource.version[index]} -ForceBootstrap -Force | select version | Format-Table -HideTableHeaders | Out-String).Trim()", { :timeout => @new_resource.timeout }).stdout.strip()
100
100
  else
101
101
  version = powershell_out("(Get-Package -Name '#{name}' -ForceBootstrap -Force | select version | Format-Table -HideTableHeaders | Out-String).Trim()", { :timeout => @new_resource.timeout }).stdout.strip()
@@ -262,7 +262,7 @@ class Chef
262
262
  if source_location.nil?
263
263
  inferred_registry_type == :msi
264
264
  else
265
- ::File.extname(source_location).casecmp(".msi").zero?
265
+ ::File.extname(source_location).casecmp(".msi") == 0
266
266
  end
267
267
  end
268
268
  end
@@ -144,7 +144,7 @@ class Chef
144
144
  end
145
145
  end
146
146
 
147
- def gpg_checks()
147
+ def gpg_checks
148
148
  case Chef::Config[:zypper_check_gpg]
149
149
  when true
150
150
  ""
@@ -21,209 +21,211 @@ require "chef/mixin/command"
21
21
  require "chef/provider"
22
22
  require "ipaddr"
23
23
 
24
- class Chef::Provider::Route < Chef::Provider
25
- include Chef::Mixin::Command
26
-
27
- provides :route
28
-
29
- attr_accessor :is_running
30
-
31
- MASK = { "0.0.0.0" => "0",
32
- "128.0.0.0" => "1",
33
- "192.0.0.0" => "2",
34
- "224.0.0.0" => "3",
35
- "240.0.0.0" => "4",
36
- "248.0.0.0" => "5",
37
- "252.0.0.0" => "6",
38
- "254.0.0.0" => "7",
39
- "255.0.0.0" => "8",
40
- "255.128.0.0" => "9",
41
- "255.192.0.0" => "10",
42
- "255.224.0.0" => "11",
43
- "255.240.0.0" => "12",
44
- "255.248.0.0" => "13",
45
- "255.252.0.0" => "14",
46
- "255.254.0.0" => "15",
47
- "255.255.0.0" => "16",
48
- "255.255.128.0" => "17",
49
- "255.255.192.0" => "18",
50
- "255.255.224.0" => "19",
51
- "255.255.240.0" => "20",
52
- "255.255.248.0" => "21",
53
- "255.255.252.0" => "22",
54
- "255.255.254.0" => "23",
55
- "255.255.255.0" => "24",
56
- "255.255.255.128" => "25",
57
- "255.255.255.192" => "26",
58
- "255.255.255.224" => "27",
59
- "255.255.255.240" => "28",
60
- "255.255.255.248" => "29",
61
- "255.255.255.252" => "30",
62
- "255.255.255.254" => "31",
63
- "255.255.255.255" => "32" }
64
-
65
- def hex2ip(hex_data)
66
- # Cleanup hex data
67
- hex_ip = hex_data.to_s.downcase.gsub(/[^0-9a-f]/, "")
68
-
69
- # Check hex data format (IP is a 32bit integer, so should be 8 chars long)
70
- return nil if hex_ip.length != hex_data.length || hex_ip.length != 8
71
-
72
- # Extract octets from hex data
73
- octets = hex_ip.scan(/../).reverse.collect { |octet| [octet].pack("H2").unpack("C").first }
74
-
75
- # Validate IP
76
- ip = octets.join(".")
77
- begin
78
- IPAddr.new(ip, Socket::AF_INET).to_s
79
- rescue ArgumentError
80
- Chef::Log.debug("Invalid IP address data: hex=#{hex_ip}, ip=#{ip}")
81
- return nil
82
- end
83
- end
84
-
85
- def whyrun_supported?
86
- true
87
- end
24
+ class Chef
25
+ class Provider
26
+ class Route < Chef::Provider
27
+ include Chef::Mixin::Command
28
+
29
+ provides :route
30
+
31
+ attr_accessor :is_running
32
+
33
+ MASK = { "0.0.0.0" => "0",
34
+ "128.0.0.0" => "1",
35
+ "192.0.0.0" => "2",
36
+ "224.0.0.0" => "3",
37
+ "240.0.0.0" => "4",
38
+ "248.0.0.0" => "5",
39
+ "252.0.0.0" => "6",
40
+ "254.0.0.0" => "7",
41
+ "255.0.0.0" => "8",
42
+ "255.128.0.0" => "9",
43
+ "255.192.0.0" => "10",
44
+ "255.224.0.0" => "11",
45
+ "255.240.0.0" => "12",
46
+ "255.248.0.0" => "13",
47
+ "255.252.0.0" => "14",
48
+ "255.254.0.0" => "15",
49
+ "255.255.0.0" => "16",
50
+ "255.255.128.0" => "17",
51
+ "255.255.192.0" => "18",
52
+ "255.255.224.0" => "19",
53
+ "255.255.240.0" => "20",
54
+ "255.255.248.0" => "21",
55
+ "255.255.252.0" => "22",
56
+ "255.255.254.0" => "23",
57
+ "255.255.255.0" => "24",
58
+ "255.255.255.128" => "25",
59
+ "255.255.255.192" => "26",
60
+ "255.255.255.224" => "27",
61
+ "255.255.255.240" => "28",
62
+ "255.255.255.248" => "29",
63
+ "255.255.255.252" => "30",
64
+ "255.255.255.254" => "31",
65
+ "255.255.255.255" => "32" }.freeze
66
+
67
+ def hex2ip(hex_data)
68
+ # Cleanup hex data
69
+ hex_ip = hex_data.to_s.downcase.gsub(/[^0-9a-f]/, "")
70
+
71
+ # Check hex data format (IP is a 32bit integer, so should be 8 chars long)
72
+ return nil if hex_ip.length != hex_data.length || hex_ip.length != 8
73
+
74
+ # Extract octets from hex data
75
+ octets = hex_ip.scan(/../).reverse.collect { |octet| [octet].pack("H2").unpack("C").first }
76
+
77
+ # Validate IP
78
+ ip = octets.join(".")
79
+ begin
80
+ IPAddr.new(ip, Socket::AF_INET).to_s
81
+ rescue ArgumentError
82
+ Chef::Log.debug("Invalid IP address data: hex=#{hex_ip}, ip=#{ip}")
83
+ return nil
84
+ end
85
+ end
88
86
 
89
- def load_current_resource
90
- self.is_running = false
87
+ def whyrun_supported?
88
+ true
89
+ end
91
90
 
92
- # cidr or quad dot mask
93
- if @new_resource.netmask
94
- new_ip = IPAddr.new("#{@new_resource.target}/#{@new_resource.netmask}")
95
- else
96
- new_ip = IPAddr.new(@new_resource.target)
97
- end
91
+ def load_current_resource
92
+ self.is_running = false
93
+
94
+ # cidr or quad dot mask
95
+ new_ip = if new_resource.netmask
96
+ IPAddr.new("#{new_resource.target}/#{new_resource.netmask}")
97
+ else
98
+ IPAddr.new(new_resource.target)
99
+ end
100
+
101
+ # For linux, we use /proc/net/route file to read proc table info
102
+ return if node[:os] != "linux"
103
+
104
+ route_file = ::File.open("/proc/net/route", "r")
105
+
106
+ # Read all routes
107
+ while (line = route_file.gets)
108
+ # Get all the fields for a route
109
+ _, destination, gateway, _, _, _, _, mask = line.split
110
+
111
+ # Convert hex-encoded values to quad-dotted notation (e.g. 0064A8C0 => 192.168.100.0)
112
+ destination = hex2ip(destination)
113
+ gateway = hex2ip(gateway)
114
+ mask = hex2ip(mask)
115
+
116
+ # Skip formatting lines (header, etc)
117
+ next unless destination && gateway && mask
118
+ Chef::Log.debug("#{new_resource} system has route: dest=#{destination} mask=#{mask} gw=#{gateway}")
119
+
120
+ # check if what were trying to configure is already there
121
+ # use an ipaddr object with ip/mask this way we can have
122
+ # a new resource be in cidr format (i don't feel like
123
+ # expanding bitmask by hand.
124
+ #
125
+ running_ip = IPAddr.new("#{destination}/#{mask}")
126
+ Chef::Log.debug("#{new_resource} new ip: #{new_ip.inspect} running ip: #{running_ip.inspect}")
127
+ self.is_running = true if running_ip == new_ip && gateway == new_resource.gateway
128
+ end
98
129
 
99
- # For linux, we use /proc/net/route file to read proc table info
100
- if node[:os] == "linux"
101
- route_file = ::File.open("/proc/net/route", "r")
102
-
103
- # Read all routes
104
- while (line = route_file.gets)
105
- # Get all the fields for a route
106
- iface, destination, gateway, flags, refcnt, use, metric, mask, mtu, window, irtt = line.split
107
-
108
- # Convert hex-encoded values to quad-dotted notation (e.g. 0064A8C0 => 192.168.100.0)
109
- destination = hex2ip(destination)
110
- gateway = hex2ip(gateway)
111
- mask = hex2ip(mask)
112
-
113
- # Skip formatting lines (header, etc)
114
- next unless destination && gateway && mask
115
- Chef::Log.debug("#{@new_resource} system has route: dest=#{destination} mask=#{mask} gw=#{gateway}")
116
-
117
- # check if what were trying to configure is already there
118
- # use an ipaddr object with ip/mask this way we can have
119
- # a new resource be in cidr format (i don't feel like
120
- # expanding bitmask by hand.
121
- #
122
- running_ip = IPAddr.new("#{destination}/#{mask}")
123
- Chef::Log.debug("#{@new_resource} new ip: #{new_ip.inspect} running ip: #{running_ip.inspect}")
124
- self.is_running = true if running_ip == new_ip && gateway == @new_resource.gateway
130
+ route_file.close
125
131
  end
126
132
 
127
- route_file.close
128
- end
129
- end
133
+ def action_add
134
+ # check to see if load_current_resource found the route
135
+ if is_running
136
+ Chef::Log.debug("#{new_resource} route already active - nothing to do")
137
+ else
138
+ command = generate_command(:add)
139
+ converge_by("run #{command.join(' ')} to add route") do
140
+ shell_out_compact!(command)
141
+ Chef::Log.info("#{new_resource} added")
142
+ end
143
+ end
130
144
 
131
- def action_add
132
- # check to see if load_current_resource found the route
133
- if is_running
134
- Chef::Log.debug("#{@new_resource} route already active - nothing to do")
135
- else
136
- command = generate_command(:add)
137
- converge_by ("run #{ command } to add route") do
138
- run_command( :command => command )
139
- Chef::Log.info("#{@new_resource} added")
145
+ # for now we always write the file (ugly but its what it is)
146
+ generate_config
140
147
  end
141
- end
142
148
 
143
- #for now we always write the file (ugly but its what it is)
144
- generate_config
145
- end
149
+ def action_delete
150
+ if is_running
151
+ command = generate_command(:delete)
152
+ converge_by("run #{command.join(' ')} to delete route ") do
153
+ shell_out_compact!(command)
154
+ Chef::Log.info("#{new_resource} removed")
155
+ end
156
+ else
157
+ Chef::Log.debug("#{new_resource} route does not exist - nothing to do")
158
+ end
146
159
 
147
- def action_delete
148
- if is_running
149
- command = generate_command(:delete)
150
- converge_by ("run #{ command } to delete route ") do
151
- run_command( :command => command )
152
- Chef::Log.info("#{@new_resource} removed")
160
+ # for now we always write the file (ugly but its what it is)
161
+ generate_config
153
162
  end
154
- else
155
- Chef::Log.debug("#{@new_resource} route does not exist - nothing to do")
156
- end
157
-
158
- #for now we always write the file (ugly but its what it is)
159
- generate_config
160
- end
161
163
 
162
- def generate_config
163
- conf = Hash.new
164
- case node[:platform]
165
- when "centos", "redhat", "fedora"
166
- # walk the collection
167
- run_context.resource_collection.each do |resource|
168
- if resource.is_a? Chef::Resource::Route
169
- # default to eth0
170
- if resource.device
171
- dev = resource.device
172
- else
173
- dev = "eth0"
164
+ def generate_config
165
+ conf = {}
166
+ case node[:platform]
167
+ when "centos", "redhat", "fedora"
168
+ # walk the collection
169
+ run_context.resource_collection.each do |resource|
170
+ next unless resource.is_a? Chef::Resource::Route
171
+ # default to eth0
172
+ dev = if resource.device
173
+ resource.device
174
+ else
175
+ "eth0"
176
+ end
177
+
178
+ conf[dev] = "" if conf[dev].nil?
179
+ case @action
180
+ when :add
181
+ conf[dev] << config_file_contents(:add, target: resource.target, netmask: resource.netmask, gateway: resource.gateway) if resource.action == [:add]
182
+ when :delete
183
+ # need to do this for the case when the last route on an int
184
+ # is removed
185
+ conf[dev] << config_file_contents(:delete)
186
+ end
174
187
  end
175
-
176
- conf[dev] = String.new if conf[dev].nil?
177
- case @action
178
- when :add
179
- conf[dev] << config_file_contents(:add, :target => resource.target, :netmask => resource.netmask, :gateway => resource.gateway) if resource.action == [:add]
180
- when :delete
181
- # need to do this for the case when the last route on an int
182
- # is removed
183
- conf[dev] << config_file_contents(:delete)
188
+ conf.each do |k, v|
189
+ network_file_name = "/etc/sysconfig/network-scripts/route-#{k}"
190
+ converge_by("write route route.#{k}\n#{conf[k]} to #{network_file_name}") do
191
+ network_file = ::File.new(network_file_name, "w")
192
+ network_file.puts(conf[k])
193
+ Chef::Log.debug("#{new_resource} writing route.#{k}\n#{conf[k]}")
194
+ network_file.close
195
+ end
184
196
  end
185
197
  end
186
198
  end
187
- conf.each do |k, v|
188
- network_file_name = "/etc/sysconfig/network-scripts/route-#{k}"
189
- converge_by ("write route route.#{k}\n#{conf[k]} to #{ network_file_name }") do
190
- network_file = ::File.new(network_file_name, "w")
191
- network_file.puts(conf[k])
192
- Chef::Log.debug("#{@new_resource} writing route.#{k}\n#{conf[k]}")
193
- network_file.close
199
+
200
+ def generate_command(action)
201
+ target = new_resource.target
202
+ target = "#{target}/#{MASK[new_resource.netmask.to_s]}" if new_resource.netmask
203
+
204
+ case action
205
+ when :add
206
+ command = [ "ip", "route", "replace", target ]
207
+ command += [ "via", new_resource.gateway ] if new_resource.gateway
208
+ command += [ "dev", new_resource.device ] if new_resource.device
209
+ when :delete
210
+ command = [ "ip", "route", "delete", target ]
211
+ command += [ "via", new_resource.gateway ] if new_resource.gateway
194
212
  end
195
- end
196
- end
197
- end
198
213
 
199
- def generate_command(action)
200
- common_route_items = ""
201
- common_route_items << "/#{MASK[@new_resource.netmask.to_s]}" if @new_resource.netmask
202
- common_route_items << " via #{@new_resource.gateway} " if @new_resource.gateway
203
-
204
- case action
205
- when :add
206
- command = "ip route replace #{@new_resource.target}"
207
- command << common_route_items
208
- command << " dev #{@new_resource.device} " if @new_resource.device
209
- when :delete
210
- command = "ip route delete #{@new_resource.target}"
211
- command << common_route_items
212
- end
214
+ command
215
+ end
213
216
 
214
- return command
215
- end
217
+ def config_file_contents(action, options = {})
218
+ content = ""
219
+ case action
220
+ when :add
221
+ content << (options[:target]).to_s
222
+ content << "/#{options[:netmask]}" if options[:netmask]
223
+ content << " via #{options[:gateway]}" if options[:gateway]
224
+ content << "\n"
225
+ end
216
226
 
217
- def config_file_contents(action, options = {})
218
- content = ""
219
- case action
220
- when :add
221
- content << "#{options[:target]}"
222
- content << "/#{options[:netmask]}" if options[:netmask]
223
- content << " via #{options[:gateway]}" if options[:gateway]
224
- content << "\n"
227
+ content
228
+ end
225
229
  end
226
-
227
- return content
228
230
  end
229
231
  end