chef 0.7.16 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of chef might be problematic. Click here for more details.

Files changed (180) hide show
  1. data/README.rdoc +11 -10
  2. data/bin/chef-client +2 -2
  3. data/bin/chef-solo +1 -1
  4. data/bin/knife +27 -0
  5. data/bin/shef +49 -0
  6. data/distro/README +2 -0
  7. data/distro/{debian → common}/man/man1/chef-indexer.1 +0 -0
  8. data/distro/{debian → common}/man/man1/chef-server.1 +0 -0
  9. data/distro/{debian → common}/man/man8/chef-client.8 +0 -0
  10. data/distro/{debian → common}/man/man8/chef-solo.8 +0 -0
  11. data/distro/common/man/man8/knife.8 +375 -0
  12. data/distro/redhat/etc/init.d/chef-client +8 -4
  13. data/distro/redhat/etc/init.d/chef-server +16 -15
  14. data/distro/redhat/etc/init.d/chef-server-webui +78 -0
  15. data/distro/redhat/etc/init.d/chef-solr +76 -0
  16. data/distro/redhat/etc/init.d/chef-solr-indexer +75 -0
  17. data/distro/redhat/etc/sysconfig/chef-client +10 -0
  18. data/distro/redhat/etc/sysconfig/chef-server +10 -0
  19. data/distro/redhat/etc/sysconfig/chef-server-webui +10 -0
  20. data/distro/redhat/etc/sysconfig/chef-solr +9 -0
  21. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  22. data/distro/suse/etc/init.d/chef-client +121 -0
  23. data/lib/chef.rb +1 -1
  24. data/lib/chef/api_client.rb +263 -0
  25. data/lib/chef/application.rb +1 -1
  26. data/lib/chef/application/client.rb +21 -3
  27. data/lib/chef/application/knife.rb +144 -0
  28. data/lib/chef/application/server.rb +2 -1
  29. data/lib/chef/application/solo.rb +9 -2
  30. data/lib/chef/cache.rb +61 -0
  31. data/lib/chef/cache/checksum.rb +70 -0
  32. data/lib/chef/certificate.rb +154 -0
  33. data/lib/chef/client.rb +123 -220
  34. data/lib/chef/compile.rb +9 -21
  35. data/lib/chef/config.rb +67 -10
  36. data/lib/chef/cookbook.rb +49 -22
  37. data/lib/chef/cookbook/metadata.rb +85 -5
  38. data/lib/chef/cookbook_loader.rb +4 -4
  39. data/lib/chef/couchdb.rb +99 -30
  40. data/lib/chef/daemon.rb +1 -1
  41. data/lib/chef/data_bag.rb +215 -0
  42. data/lib/chef/data_bag_item.rb +219 -0
  43. data/lib/chef/exceptions.rb +3 -0
  44. data/lib/chef/index_queue.rb +29 -0
  45. data/lib/chef/index_queue/amqp_client.rb +106 -0
  46. data/lib/chef/index_queue/consumer.rb +76 -0
  47. data/lib/chef/index_queue/indexable.rb +74 -0
  48. data/lib/chef/knife.rb +309 -0
  49. data/lib/chef/knife/client_bulk_delete.rb +40 -0
  50. data/lib/chef/knife/client_create.rb +62 -0
  51. data/lib/chef/knife/client_delete.rb +37 -0
  52. data/lib/chef/knife/client_edit.rb +37 -0
  53. data/lib/chef/knife/client_list.rb +40 -0
  54. data/lib/chef/knife/client_reregister.rb +48 -0
  55. data/lib/chef/knife/client_show.rb +42 -0
  56. data/lib/chef/knife/configure.rb +123 -0
  57. data/lib/chef/knife/cookbook_bulk_delete.rb +46 -0
  58. data/lib/chef/knife/cookbook_delete.rb +41 -0
  59. data/lib/chef/knife/cookbook_download.rb +57 -0
  60. data/lib/chef/knife/cookbook_list.rb +41 -0
  61. data/lib/chef/knife/cookbook_metadata.rb +87 -0
  62. data/lib/chef/knife/cookbook_show.rb +75 -0
  63. data/lib/chef/knife/cookbook_upload.rb +179 -0
  64. data/lib/chef/knife/data_bag_create.rb +43 -0
  65. data/lib/chef/knife/data_bag_delete.rb +43 -0
  66. data/lib/chef/knife/data_bag_edit.rb +49 -0
  67. data/lib/chef/knife/data_bag_list.rb +42 -0
  68. data/lib/chef/knife/data_bag_show.rb +40 -0
  69. data/lib/chef/knife/ec2_instance_data.rb +46 -0
  70. data/lib/chef/knife/index_rebuild.rb +51 -0
  71. data/lib/chef/knife/node_bulk_delete.rb +43 -0
  72. data/lib/chef/knife/node_create.rb +39 -0
  73. data/lib/chef/knife/node_delete.rb +36 -0
  74. data/lib/chef/knife/node_edit.rb +36 -0
  75. data/lib/chef/knife/node_from_file.rb +42 -0
  76. data/lib/chef/knife/node_list.rb +41 -0
  77. data/lib/chef/knife/node_run_list_add.rb +64 -0
  78. data/lib/chef/knife/node_run_list_remove.rb +45 -0
  79. data/lib/chef/knife/node_show.rb +46 -0
  80. data/lib/chef/knife/role_bulk_delete.rb +44 -0
  81. data/lib/chef/knife/role_create.rb +44 -0
  82. data/lib/chef/knife/role_delete.rb +36 -0
  83. data/lib/chef/knife/role_edit.rb +37 -0
  84. data/lib/chef/knife/role_from_file.rb +46 -0
  85. data/lib/chef/knife/role_list.rb +40 -0
  86. data/lib/chef/knife/role_show.rb +43 -0
  87. data/lib/chef/knife/search.rb +94 -0
  88. data/lib/chef/knife/ssh.rb +170 -0
  89. data/lib/chef/log.rb +30 -8
  90. data/lib/chef/mixin/checksum.rb +2 -7
  91. data/lib/chef/mixin/command.rb +32 -13
  92. data/lib/chef/mixin/convert_to_class_name.rb +15 -0
  93. data/lib/chef/mixin/deep_merge.rb +199 -11
  94. data/lib/chef/mixin/generate_url.rb +18 -9
  95. data/lib/chef/mixin/language.rb +29 -1
  96. data/lib/chef/mixin/language_include_attribute.rb +56 -0
  97. data/lib/chef/mixin/language_include_recipe.rb +53 -0
  98. data/lib/chef/mixin/params_validate.rb +25 -12
  99. data/lib/chef/mixin/recipe_definition_dsl_core.rb +2 -0
  100. data/lib/chef/mixin/template.rb +11 -1
  101. data/lib/chef/mixin/xml_escape.rb +87 -0
  102. data/lib/chef/node.rb +144 -122
  103. data/lib/chef/openid_registration.rb +12 -5
  104. data/lib/chef/platform.rb +89 -47
  105. data/lib/chef/provider/breakpoint.rb +36 -0
  106. data/lib/chef/provider/cron.rb +5 -6
  107. data/lib/chef/provider/deploy.rb +43 -10
  108. data/lib/chef/provider/deploy/revision.rb +2 -3
  109. data/lib/chef/provider/erl_call.rb +72 -0
  110. data/lib/chef/provider/file.rb +8 -4
  111. data/lib/chef/provider/git.rb +10 -5
  112. data/lib/chef/provider/group/dscl.rb +128 -0
  113. data/lib/chef/provider/http_request.rb +6 -2
  114. data/lib/chef/provider/ifconfig.rb +1 -0
  115. data/lib/chef/provider/link.rb +1 -1
  116. data/lib/chef/provider/log.rb +53 -0
  117. data/lib/chef/provider/mdadm.rb +88 -0
  118. data/lib/chef/provider/mount/mount.rb +1 -1
  119. data/lib/chef/provider/package.rb +1 -1
  120. data/lib/chef/provider/package/easy_install.rb +106 -0
  121. data/lib/chef/provider/package/pacman.rb +101 -0
  122. data/lib/chef/provider/package/portage.rb +1 -1
  123. data/lib/chef/provider/package/rpm.rb +10 -8
  124. data/lib/chef/provider/package/yum-dump.py +22 -3
  125. data/lib/chef/provider/package/yum.rb +32 -8
  126. data/lib/chef/provider/package/zypper.rb +132 -0
  127. data/lib/chef/provider/remote_directory.rb +58 -49
  128. data/lib/chef/provider/remote_file.rb +1 -1
  129. data/lib/chef/provider/route.rb +136 -80
  130. data/lib/chef/provider/ruby_block.rb +18 -1
  131. data/lib/chef/provider/service/arch.rb +109 -0
  132. data/lib/chef/provider/service/freebsd.rb +0 -1
  133. data/lib/chef/provider/service/simple.rb +2 -3
  134. data/lib/chef/provider/service/upstart.rb +191 -0
  135. data/lib/chef/provider/subversion.rb +12 -4
  136. data/lib/chef/provider/template.rb +85 -53
  137. data/lib/chef/provider/user.rb +1 -1
  138. data/lib/chef/provider/user/dscl.rb +277 -0
  139. data/lib/chef/provider/user/useradd.rb +1 -0
  140. data/lib/chef/recipe.rb +2 -41
  141. data/lib/chef/resource.rb +9 -3
  142. data/lib/chef/resource/breakpoint.rb +35 -0
  143. data/lib/chef/resource/deploy.rb +16 -2
  144. data/lib/chef/resource/easy_install_package.rb +41 -0
  145. data/lib/chef/resource/erl_call.rb +83 -0
  146. data/lib/chef/resource/freebsd_package.rb +35 -0
  147. data/lib/chef/resource/log.rb +62 -0
  148. data/lib/chef/resource/mdadm.rb +82 -0
  149. data/lib/chef/resource/pacman_package.rb +33 -0
  150. data/lib/chef/resource/ruby_block.rb +21 -2
  151. data/lib/chef/resource/scm.rb +8 -0
  152. data/lib/chef/resource/subversion.rb +1 -0
  153. data/lib/chef/resource/user.rb +5 -2
  154. data/lib/chef/resource/yum_package.rb +36 -0
  155. data/lib/chef/resource_collection.rb +17 -9
  156. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  157. data/lib/chef/rest.rb +166 -81
  158. data/lib/chef/role.rb +114 -38
  159. data/lib/chef/run_list.rb +15 -6
  160. data/lib/chef/runner.rb +13 -11
  161. data/lib/chef/search/query.rb +60 -0
  162. data/lib/chef/shef.rb +220 -0
  163. data/lib/chef/shef/ext.rb +297 -0
  164. data/lib/chef/shef/shef_session.rb +175 -0
  165. data/lib/chef/streaming_cookbook_uploader.rb +187 -0
  166. data/lib/chef/tasks/chef_repo.rake +53 -155
  167. data/lib/chef/util/file_edit.rb +94 -96
  168. data/lib/chef/webui_user.rb +233 -0
  169. metadata +219 -63
  170. data/distro/debian/etc/init.d/chef-indexer +0 -175
  171. data/distro/redhat/etc/chef/client.rb +0 -16
  172. data/distro/redhat/etc/chef/indexer.rb +0 -10
  173. data/distro/redhat/etc/chef/server.rb +0 -22
  174. data/distro/redhat/etc/init.d/chef-indexer +0 -76
  175. data/lib/chef/application/indexer.rb +0 -141
  176. data/lib/chef/queue.rb +0 -145
  177. data/lib/chef/search.rb +0 -88
  178. data/lib/chef/search/result.rb +0 -64
  179. data/lib/chef/search_index.rb +0 -77
  180. data/lib/chef/util/fileedit.rb +0 -121
@@ -40,7 +40,7 @@ class Chef
40
40
  Chef::Log.debug("Checking for mount point #{@current_resource.mount_point}")
41
41
 
42
42
  # only check for existence of non-remote devices
43
- if(@new_resource.device !~ /:/ && !::File.exists?(@new_resource.device) )
43
+ if(@new_resource.device !~ /:/ && @new_resource.device !~ /\/\// && !::File.exists?(@new_resource.device) )
44
44
  raise Chef::Exceptions::Mount, "Device #{@new_resource.device} does not exist"
45
45
  elsif( !::File.exists?(@new_resource.mount_point) )
46
46
  raise Chef::Exceptions::Mount, "Mount point #{@new_resource.mount_point} does not exist"
@@ -47,7 +47,7 @@ class Chef
47
47
  end
48
48
 
49
49
  unless install_version
50
- raise(Chef::Exceptions::Package, "No version specified, and no candidate version available!")
50
+ raise(Chef::Exceptions::Package, "No version specified, and no candidate version available for #{@new_resource.package_name}")
51
51
  end
52
52
 
53
53
  Chef::Log.info("Installing #{@new_resource} version #{install_version}")
@@ -0,0 +1,106 @@
1
+ #
2
+ # Author:: Joe Williams (<joe@joetify.com>)
3
+ # Copyright:: Copyright (c) 2009 Joe Williams
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/provider/package'
20
+ require 'chef/mixin/command'
21
+ require 'chef/resource/package'
22
+ class Chef
23
+ class Provider
24
+ class Package
25
+ class EasyInstall < Chef::Provider::Package
26
+
27
+ def install_check(name)
28
+ command = "python -c \"import sys; print sys.path\""
29
+ check = false
30
+ status = popen4(command) do |pid, stdin, stdout, stderr|
31
+ stdout.each do |line|
32
+ if line.include? "#{name}"
33
+ check = true
34
+ end
35
+ end
36
+ end
37
+ check
38
+ end
39
+
40
+ def easy_install_binary_path
41
+ path = @new_resource.easy_install_binary
42
+ path ? path : 'easy_install'
43
+ end
44
+
45
+ def load_current_resource
46
+ @current_resource = Chef::Resource::Package.new(@new_resource.name)
47
+ @current_resource.package_name(@new_resource.package_name)
48
+ @current_resource.version(nil)
49
+
50
+ # get the currently installed version if installed
51
+ if install_check(@new_resource.package_name)
52
+ command = "python -c \"import #{@new_resource.package_name}; print #{@new_resource.package_name}.__path__\""
53
+ pid, stdin, stdout, stderr = popen4(command)
54
+ install_location = stdout.readline
55
+ install_location[/\S\S(.*)\/(.*)-(.*)-py(.*).egg\S/]
56
+ package_version = $3
57
+ else
58
+ package_version = nil
59
+ end
60
+
61
+ if package_version == @new_resource.version
62
+ Chef::Log.debug("#{@new_resource.package_name} at version #{@new_resource.version}")
63
+ @current_resource.version(@new_resource.version)
64
+ else
65
+ Chef::Log.debug("#{@new_resource.package_name} at version #{package_version}")
66
+ @current_resource.version(package_version)
67
+ end
68
+
69
+ @current_resource
70
+ end
71
+
72
+ def candidate_version
73
+ return @candidate_version if @candidate_version
74
+
75
+ # do a dry run to get the latest version
76
+ command = "#{easy_install_binary_path} -n #{@new_resource.package_name}"
77
+ pid, stdin, stdout, stderr = popen4(command)
78
+ dry_run_output = ""
79
+ stdout.each do |line|
80
+ dry_run_output << line
81
+ end
82
+ dry_run_output[/(.*)Best match: (.*) (.*)\n/]
83
+ @candidate_version = $3
84
+ @candidate_version
85
+ end
86
+
87
+ def install_package(name, version)
88
+ run_command(:command => "#{easy_install_binary_path} \"#{name}==#{version}\"")
89
+ end
90
+
91
+ def upgrade_package(name, version)
92
+ install_package(name, version)
93
+ end
94
+
95
+ def remove_package(name, version)
96
+ run_command(:command => "#{easy_install_binary_path} -m #{name}")
97
+ end
98
+
99
+ def purge_package(name, version)
100
+ remove_package(name, version)
101
+ end
102
+
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,101 @@
1
+ #
2
+ # Author:: Jan Zimmek (<jan.zimmek@web.de>)
3
+ # Copyright:: Copyright (c) 2010 Jan Zimmek
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/provider/package'
20
+ require 'chef/mixin/command'
21
+ require 'chef/resource/package'
22
+
23
+ class Chef
24
+ class Provider
25
+ class Package
26
+ class Pacman < Chef::Provider::Package
27
+
28
+ def load_current_resource
29
+ @current_resource = Chef::Resource::Package.new(@new_resource.name)
30
+ @current_resource.package_name(@new_resource.package_name)
31
+
32
+ @current_resource.version(nil)
33
+
34
+ Chef::Log.debug("Checking pacman for #{@new_resource.package_name}")
35
+ status = popen4("pacman -Qi #{@new_resource.package_name}") do |pid, stdin, stdout, stderr|
36
+ stdout.each do |line|
37
+ case line
38
+ when /^Version(\s?)*: (.+)$/
39
+ Chef::Log.debug("Current version is #{$2}")
40
+ @current_resource.version($2)
41
+ end
42
+ end
43
+ end
44
+
45
+ unless status.exitstatus == 0 || status.exitstatus == 1
46
+ raise Chef::Exceptions::Package, "pacman failed - #{status.inspect}!"
47
+ end
48
+
49
+ @current_resource
50
+ end
51
+
52
+ def candidate_version
53
+ return @candidate_version if @candidate_version
54
+
55
+ status = popen4("pacman -Ss #{@new_resource.package_name}") do |pid, stdin, stdout, stderr|
56
+ stdout.each do |line|
57
+ case line
58
+ when /^(extra|core|community)\/#{@new_resource.package_name} (.+)$/
59
+ # $2 contains a string like "4.4.0-1 (kde kdenetwork)" or "3.10-4 (base)"
60
+ # simply split by space and use first token
61
+ @candidate_version = $2.split(" ").first
62
+ end
63
+ end
64
+ end
65
+
66
+ unless status.exitstatus == 0 || status.exitstatus == 1
67
+ raise Chef::Exceptions::Package, "pacman failed - #{status.inspect}!"
68
+ end
69
+
70
+ unless @candidate_version
71
+ raise Chef::Exceptions::Package, "pacman does not have a version of package #{@new_resource.package_name}"
72
+ end
73
+
74
+ @candidate_version
75
+
76
+ end
77
+
78
+ def install_package(name, version)
79
+ run_command_with_systems_locale(
80
+ :command => "pacman --sync --noconfirm --noprogressbar#{expand_options(@new_resource.options)} #{name}"
81
+ )
82
+ end
83
+
84
+ def upgrade_package(name, version)
85
+ install_package(name, version)
86
+ end
87
+
88
+ def remove_package(name, version)
89
+ run_command_with_systems_locale(
90
+ :command => "pacman --remove --noconfirm --noprogressbar#{expand_options(@new_resource.options)} #{name}"
91
+ )
92
+ end
93
+
94
+ def purge_package(name, version)
95
+ remove_package(name, version)
96
+ end
97
+
98
+ end
99
+ end
100
+ end
101
+ end
@@ -38,7 +38,7 @@ class Chef
38
38
 
39
39
  if( ::File.exists?(catdir) )
40
40
  Dir.entries(catdir).each do |entry|
41
- if(entry =~ /^#{Regexp.escape(pkg)}\-(\d[\.\d]*((_(alpha|beta|pre|rc|p)\d*)*)?)/)
41
+ if(entry =~ /^#{Regexp.escape(pkg)}\-(\d[\.\d]*((_(alpha|beta|pre|rc|p)\d*)*)?(-r\d+)?)/)
42
42
  @current_resource.version($1)
43
43
  Chef::Log.debug("Got current version #{$1}")
44
44
  break
@@ -69,16 +69,18 @@ class Chef
69
69
  end
70
70
 
71
71
  def install_package(name, version)
72
- run_command_with_systems_locale(
73
- :command => "rpm -i #{@new_resource.source}"
74
- )
72
+ unless @current_resource.version
73
+ run_command_with_systems_locale(
74
+ :command => "rpm -i #{@new_resource.source}"
75
+ )
76
+ else
77
+ run_command_with_systems_locale(
78
+ :command => "rpm -U #{@new_resource.source}"
79
+ )
80
+ end
75
81
  end
76
82
 
77
- def upgrade_package(name, version)
78
- run_command_with_systems_locale(
79
- :command => "rpm -U #{@new_resource.source}"
80
- )
81
- end
83
+ alias_method :upgrade_package, :install_package
82
84
 
83
85
  def remove_package(name, version)
84
86
  if version
@@ -45,8 +45,17 @@ failure = False
45
45
  try:
46
46
  try:
47
47
  y = yum.YumBase()
48
- # Only want our output
49
- y.doConfigSetup(debuglevel=0, errorlevel=0)
48
+ try:
49
+ # Only want our output
50
+ y.doConfigSetup(errorlevel=0,debuglevel=0)
51
+ except:
52
+ # but of course, yum on even moderately old
53
+ # redhat/centosen doesn't know how to do logging properly
54
+ # so we duck punch our way to victory
55
+ def __log(a,b): pass
56
+ y.doConfigSetup()
57
+ y.log = __log
58
+ y.errorlog = __log
50
59
 
51
60
  # Yum assumes it can update the cache directory. Disable this for non root
52
61
  # users.
@@ -70,7 +79,17 @@ try:
70
79
  y.doTsSetup()
71
80
  y.doRpmDBSetup()
72
81
 
73
- db = y.doPackageLists('all')
82
+ try:
83
+ db = y.doPackageLists('all')
84
+ except AttributeError:
85
+ # some people claim that testing for yum.__version__ should be
86
+ # enough to see if this is required, but I say they're liars.
87
+ # the yum on 4.8 at least understands yum.__version__ but still
88
+ # needs to get its repos and sacks set up manually.
89
+ # Thus, we just try it, fail, and then try again. WCPGW?
90
+ y.doRepoSetup()
91
+ y.doSackSetup()
92
+ db = y.doPackageLists('all')
74
93
 
75
94
  y.closeRpmDB()
76
95
 
@@ -115,6 +115,23 @@ class Chef
115
115
  @current_resource = Chef::Resource::Package.new(@new_resource.name)
116
116
  @current_resource.package_name(@new_resource.package_name)
117
117
 
118
+ if @new_resource.source
119
+ unless ::File.exists?(@new_resource.source)
120
+ raise Chef::Exceptions::Package, "Package #{@new_resource.name} not found: #{@new_resource.source}"
121
+ end
122
+
123
+ Chef::Log.debug("Checking rpm status for #{@new_resource.package_name}")
124
+ status = popen4("rpm -qp --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@new_resource.source}") do |pid, stdin, stdout, stderr|
125
+ stdout.each do |line|
126
+ case line
127
+ when /([\w\d_.-]+)\s([\w\d_.-]+)/
128
+ @current_resource.package_name($1)
129
+ @new_resource.version($2)
130
+ end
131
+ end
132
+ end
133
+ end
134
+
118
135
  Chef::Log.debug("Checking yum info for #{@new_resource.package_name}")
119
136
 
120
137
  @yum.refresh
@@ -133,17 +150,24 @@ class Chef
133
150
  end
134
151
 
135
152
  def install_package(name, version)
136
- run_command_with_systems_locale(
137
- :command => "yum -q -y install #{name}-#{version}"
138
- )
153
+ if @new_resource.source
154
+ run_command_with_systems_locale(
155
+ :command => "yum -d0 -e0 -y localinstall #{@new_resource.source}"
156
+ )
157
+ else
158
+ run_command_with_systems_locale(
159
+ :command => "yum -d0 -e0 -y install #{name}-#{version}"
160
+ )
161
+ end
139
162
  @yum.flush
140
163
  end
141
164
 
142
165
  def upgrade_package(name, version)
143
- # If we have a version, we can upgrade - otherwise, install
144
- if @current_resource.version
166
+ # If we're not given a version, running update is the correct
167
+ # option. If we are, then running install_package is right.
168
+ unless version
145
169
  run_command_with_systems_locale(
146
- :command => "yum -q -y update #{name}-#{version}"
170
+ :command => "yum -d0 -e0 -y update #{name}"
147
171
  )
148
172
  @yum.flush
149
173
  else
@@ -154,11 +178,11 @@ class Chef
154
178
  def remove_package(name, version)
155
179
  if version
156
180
  run_command_with_systems_locale(
157
- :command => "yum -q -y remove #{name}-#{version}"
181
+ :command => "yum -d0 -e0 -y remove #{name}-#{version}"
158
182
  )
159
183
  else
160
184
  run_command_with_systems_locale(
161
- :command => "yum -q -y remove #{name}"
185
+ :command => "yum -d0 -e0 -y remove #{name}"
162
186
  )
163
187
  end
164
188
 
@@ -0,0 +1,132 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/provider/package'
20
+ require 'chef/mixin/command'
21
+ require 'chef/resource/package'
22
+ require 'singleton'
23
+
24
+ class Chef
25
+ class Provider
26
+ class Package
27
+ class Zypper < Chef::Provider::Package
28
+
29
+
30
+ def load_current_resource
31
+ @current_resource = Chef::Resource::Package.new(@new_resource.name)
32
+ @current_resource.package_name(@new_resource.package_name)
33
+
34
+ is_installed=false
35
+ version=''
36
+ is_out_of_date=false
37
+ Chef::Log.debug("Checking zypper for #{@new_resource.package_name}")
38
+ status = popen4("zypper info #{@new_resource.package_name}") do |pid, stdin, stdout, stderr|
39
+ stdout.each do |line|
40
+ case line
41
+ when /^Version: (.+)$/
42
+ version = $1
43
+ Chef::Log.debug("zypper version=#{$1}")
44
+ when /^Installed: Yes$/
45
+ is_installed=true
46
+ Chef::Log.debug("zypper installed true")
47
+
48
+ when /^Installed: No$/
49
+ is_installed=false
50
+ Chef::Log.debug("zypper installed false")
51
+ when /^Status: out-of-date \(version (.+) installed\)$/
52
+ is_out_of_date=true
53
+ oud_version=$1
54
+ Chef::Log.debug("zypper out of date version=#{$1}")
55
+ end
56
+ end
57
+ end
58
+
59
+ if is_installed==false
60
+ @candidate_version=version
61
+ @current_resource.version(nil)
62
+ Chef::Log.debug("dentro installed false");
63
+ end
64
+
65
+ if is_installed==true
66
+ if is_out_of_date==true
67
+ @current_resource.version(oud_version)
68
+ @candidate_version=version
69
+ Chef::Log.debug("dentro installed outofdate");
70
+ else
71
+ @current_resource.version(version)
72
+ @candidate_version=version
73
+ Chef::Log.debug("dentro installed");
74
+ end
75
+ end
76
+
77
+
78
+ unless status.exitstatus == 0
79
+ raise Chef::Exceptions::Package, "zypper failed - #{status.inspect}!"
80
+ end
81
+
82
+
83
+ Chef::Log.debug("zypper current resource #{@current_resource}")
84
+ @current_resource
85
+ end
86
+
87
+ def install_package(name, version)
88
+ if version
89
+ run_command(
90
+ :command => "zypper -n --no-gpg-checks install -l #{name}=#{version}"
91
+ )
92
+ else
93
+ run_command(
94
+ :command => "zypper -n --no-gpg-checks install -l #{name}"
95
+ )
96
+ end
97
+ end
98
+
99
+ def upgrade_package(name, version)
100
+ if version
101
+ run_command(
102
+ :command => "zypper -n --no-gpg-checks update -l #{name}=#{version}"
103
+ )
104
+ else
105
+ run_command(
106
+ :command => "zypper -n --no-gpg-checks update -l #{name}"
107
+ )
108
+ end
109
+ end
110
+
111
+ def remove_package(name, version)
112
+ if version
113
+ run_command(
114
+ :command => "zypper -n --no-gpg-checks remove #{name}=#{version}"
115
+ )
116
+ else
117
+ run_command(
118
+ :command => "zypper -n --no-gpg-checks remove #{name}"
119
+ )
120
+ end
121
+
122
+
123
+ end
124
+
125
+ def purge_package(name, version)
126
+ remove_package(name, version)
127
+ end
128
+
129
+ end
130
+ end
131
+ end
132
+ end